/******************************************************************************* * Mission Control Technologies, Copyright (c) 2009-2012, United States Government * as represented by the Administrator of the National Aeronautics and Space * Administration. All rights reserved. * * The MCT platform is licensed under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0. * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. * * MCT includes source code licensed under additional open source licenses. See * the MCT Open Source Licenses file included with this distribution or the About * MCT Licenses dialog available at runtime from the MCT Help menu for additional * information. *******************************************************************************/ package gov.nasa.arc.mct.table.view; import static gov.nasa.arc.mct.table.gui.ConstraintBuilder.hbox; import gov.nasa.arc.mct.table.gui.ConstraintBuilder; import gov.nasa.arc.mct.table.gui.TaggedComponentManager; import gov.nasa.arc.mct.table.model.TableOrientation; import gov.nasa.arc.mct.table.view.BorderState.BorderEdge; import gov.nasa.arc.mct.table.view.TimeFormat.DateFormatItem; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Font; import java.awt.Graphics; import java.awt.GridLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.font.TextAttribute; import java.net.URL; import java.util.Collection; import java.util.Enumeration; //import java.util.HashMap; import java.util.HashSet; //import java.util.Map; import java.util.ResourceBundle; import javax.swing.AbstractButton; import javax.swing.BorderFactory; import javax.swing.BoxLayout; import javax.swing.ButtonGroup; import javax.swing.ComboBoxModel; import javax.swing.DefaultListCellRenderer; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JScrollPane; import javax.swing.JSpinner; import javax.swing.JToggleButton; import javax.swing.ListCellRenderer; //import javax.swing.ListCellRenderer; import javax.swing.SpinnerModel; import javax.swing.SpinnerNumberModel; import javax.swing.border.TitledBorder; import javax.swing.event.AncestorEvent; import javax.swing.event.AncestorListener; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; /** * Implements a dialog box for manipulating the settings of a * table. */ public class TableSettingsControlPanel extends JPanel { private static final long serialVersionUID = 1L; /** The width of am empty border around the control panel. */ private static final int PANEL_BORDER = 5; // private static final int TITLE_BORDER_SPACE = 10; private static final int LABEL_VALUE_SPACE = 5; private static final int COLUMN_SPACE = 20; private static final int THIN_SPACE = 0; // Component tags for hiding/showing controls. private static final String SELECTION_NOT_EMPTY = "selection-not-empty"; private static final String HEADERS_HIDABLE = "headers-hidable"; private static final String SINGLE_CELL_SELECTION = "single-cell-selection"; private static final String ENUMERATION_CONTROLS = "enumeration"; private static final String DECIMAL_CONTROLS = "decimalControls"; private static final String DATE_CONTROLS = "dateFormattingControls"; private static final String DECIMAL_ALIGNMENT_BUTTON = "cellAlignButton"; private static final String TABLE_ORIENTATION = "table-orientation"; private static final String TRANSPOSE = "transpose-table"; private static final String ROW_HEADER_LABEL = "row-header-label"; private static final String COLUMN_HEADER_LABEL = "column-header-label"; private static final String CELL_LABEL = "cell-label"; private static final String COLUMN_IS_NOT_SELECTED = "column-not-selected"; private static final String ROW_IS_NOT_SELECTED = "row-not-selected"; private static final String NOT_FULLY_IMPLEMENTED = "not-fully-implemented"; /** The resource bundle we should use for getting strings. */ private static final ResourceBundle bundle = ResourceBundle.getBundle("TableSettingsControlPanel"); //NOI18N /** A list of all control panels of this type. */ private static Collection<TableSettingsControlPanel> allPanels = new HashSet<TableSettingsControlPanel>(); /** The controller object that mediates interaction between the control panel * and the actual table. */ private TableSettingsController controller; // Row and column formatting controls. private JSpinner rowHeightSpinner; private JSpinner columnWidthSpinner; private JRadioButton tableRowOrientation; private JRadioButton tableColOrientation; private JButton transposeTableButton; private JRadioButton rowHeaderAlignLeft; private JRadioButton rowHeaderAlignCenter; private JRadioButton rowHeaderAlignRight; private ButtonGroup rowHeaderAlignGroup; private JRadioButton columnHeaderAlignLeft; private JRadioButton columnHeaderAlignCenter; private JRadioButton columnHeaderAlignRight; private ButtonGroup columnHeaderAlignGroup; private JCheckBox showRowHeaders; private JCheckBox showColumnHeaders; private JComboBox rowHeaderFontName; private JSpinner rowHeaderFontSize; private JComboBox rowForegroundColorComboBox = null; private JComboBox rowBackgroundColorComboBox = null; private JComboBox rowHeaderBorderColorComboBox = null; private JComboBox columnForegroundColorComboBox = null; private JComboBox columnBackgroundColorComboBox = null; private JComboBox columnHeaderBorderColorComboBox = null; private JToggleButton rowHeaderFontStyleBold; private JToggleButton rowHeaderFontStyleItalic; private JToggleButton rowHeaderFontUnderline; private JComboBox columnHeaderFontName; private JSpinner columnHeaderFontSize; private JToggleButton columnHeaderFontStyleBold; private JToggleButton columnHeaderFontStyleItalic; private JToggleButton columnHeaderFontStyleUnderline; // private JCheckBox showGridCheckbox; // Row header label controls. private JLabel rowHeaderFullLabel; private JPanel rowHeaderAbbreviations; private JLabel rowHeaderAbbreviatedLabel; // Column header label controls. private JLabel columnHeaderFullLabel; private JPanel columnHeaderAbbreviations; private JLabel columnHeaderAbbreviatedLabel; // Cell label controls. private JLabel cellFullLabel; private JPanel cellAbbreviations; private JLabel cellAbbreviatedLabel; // Cell formatting controls. private JComboBox propertyToShow; private JComboBox enumeration; private JComboBox numberOfDecimals; private JComboBox dateFormatChooser; private JComboBox cellFontName; private JSpinner cellFontSize; private JComboBox cellFontColorComboBox; private JComboBox cellBackgroundColorComboBox; private JToggleButton cellFontStyleBold; private JToggleButton cellFontStyleItalic; private JToggleButton cellFontUnderline; private JRadioButton cellAlignLeft; private JRadioButton cellAlignCenter; private JRadioButton cellAlignRight; private JRadioButton cellAlignDecimal; private ButtonGroup cellAlignGroup; /** border controller. */ JToggleButton rowHeaderBorderOnLeft = null; JToggleButton rowHeaderBorderOnTop = null; JToggleButton rowHeaderBorderOnRight = null; JToggleButton rowHeaderBorderOnBottom = null; JToggleButton columnHeaderBorderOnLeft = null; JToggleButton columnHeaderBorderOnTop = null; JToggleButton columnHeaderBorderOnRight = null; JToggleButton columnHeaderBorderOnBottom = null; JToggleButton cellBorderOnLeft = null; JToggleButton cellBorderOnTop = null; JToggleButton cellBorderOnRight = null; JToggleButton cellBorderOnBottom = null; // Component visibility manager, for showing and hiding controls. private TaggedComponentManager mgr = new TaggedComponentManager(); private TitledPanel rowColumnFormattingPanel; private JPanel rowColumnFontFormattingPanel; private TitledPanel columnHeaderLabelPanel; private TitledPanel cellLabelPanel; private TitledPanel rowHeaderLabelPanel; private TitledPanel cellFormattingPanel; private final ChangeListener rowHeightListener; private final ChangeListener columnWidthListener; private final ChangeListener rowHeaderFontSizeListener; private final ChangeListener columnHeaderFontSizeListener; private final ChangeListener cellFontSizeListener; /** * Creates a new control panel, interacting with a designated controller * to get the default settings. All controls will call the controller to * update settings in the table as the user makes changes. * * @param panelController the controller that handles the interactions between the control panel * and the underlying table */ public TableSettingsControlPanel(TableSettingsController panelController) { controller = panelController; SpinnerModel rowDimensionModel = new SpinnerNumberModel(12, 5, 100, 1); rowHeightSpinner = new JSpinner(rowDimensionModel); setAccessibleName(rowHeightSpinner, "ROW_HEIGHT"); rowHeightSpinner.addChangeListener(rowHeightListener = new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { controller.setRowHeight(Integer.class.cast(rowHeightSpinner.getValue()).intValue()); } }); SpinnerModel columnDimensionModel = new SpinnerNumberModel(12, 5, 3000, 1); columnWidthSpinner = new JSpinner(columnDimensionModel); setAccessibleName(columnWidthSpinner, "COLUMN_WIDTH"); columnWidthSpinner.addChangeListener(columnWidthListener = new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { controller.setColumnWidth(Integer.class.cast(columnWidthSpinner.getValue()).intValue()); } }); tableRowOrientation = new JRadioButton(bundle.getString("ROW_MAJOR")); setAccessibleName(tableRowOrientation, "ROW_MAJOR"); tableRowOrientation.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { controller.setTableOrientation(TableOrientation.ROW_MAJOR); settingsChanged(); } }); tableColOrientation = new JRadioButton(bundle.getString("COLUMN_MAJOR")); setAccessibleName(tableColOrientation, "COLUMN_MAJOR"); tableColOrientation.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { controller.setTableOrientation(TableOrientation.COLUMN_MAJOR); settingsChanged(); } }); tableRowOrientation.setSelected(true); groupButtons(tableRowOrientation, tableColOrientation); transposeTableButton = new JButton(bundle.getString("TRANSPOSE_TABLE")); setAccessibleName(transposeTableButton, "TRANSPOSE_TABLE"); transposeTableButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { controller.transposeTable(); } }); rowHeaderFontName = setUpFontControl(); setAccessibleName(rowHeaderFontName, "ROW_FONT"); rowHeaderFontName.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { controller.setRowHeaderFontName((rowHeaderFontName.getModel())); } }); columnHeaderFontName = setUpFontControl(); setAccessibleName(columnHeaderFontName, "COL_FONT"); columnHeaderFontName.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { controller.setColumnHeaderFontName((columnHeaderFontName.getModel())); } }); SpinnerModel rowFontSizeModel = new SpinnerNumberModel(12, 8, 36, 1); rowHeaderFontSize = new JSpinner(rowFontSizeModel); setAccessibleName(rowHeaderFontSize, "ROW_FONT_SIZE"); rowHeaderFontSize.addChangeListener(rowHeaderFontSizeListener = new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { controller.setRowHeaderFontSize(Integer.class.cast(rowHeaderFontSize.getValue()).intValue()); } }); SpinnerModel columnFontSizeModel = new SpinnerNumberModel(12, 8, 36, 1); columnHeaderFontSize = new JSpinner(columnFontSizeModel); setAccessibleName(columnHeaderFontSize, "COL_FONT_SIZE"); columnHeaderFontSize.addChangeListener(columnHeaderFontSizeListener = new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { controller.setColumnHeaderFontSize(Integer.class.cast(columnHeaderFontSize.getValue()).intValue()); } }); SpinnerModel cellFontSizeModel = new SpinnerNumberModel(12, 8, 36, 1); cellFontSize = new JSpinner(cellFontSizeModel); setAccessibleName(cellFontSize, "CELL_FONT_SIZE"); cellFontSize.addChangeListener(cellFontSizeListener = new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { controller.setCellFontSize(Integer.class.cast(cellFontSize.getValue()).intValue()); } }); rowHeaderAlignLeft = getIconRadioButton("textAlignLeft_off.png", "textAlignLeft_on.png", bundle.getString("ROW_HEADER_ALIGN_LEFT")); setAccessibleName(rowHeaderAlignLeft, "ROW_HEADER_ALIGN_LEFT"); Insets buttonInsets = rowHeaderAlignLeft.getInsets(); buttonInsets.set(0, 0, 0, 2); rowHeaderAlignLeft.setMargin(buttonInsets); rowHeaderAlignLeft.setActionCommand(ContentAlignment.LEFT.toString()); rowHeaderAlignCenter = getIconRadioButton("textAlignCenter_off.png", "textAlignCenter_on.png", bundle.getString("ROW_HEADER_ALIGN_CENTER")); rowHeaderAlignCenter.setMargin(buttonInsets); setAccessibleName(rowHeaderAlignCenter, "ROW_HEADER_ALIGN_CENTER"); rowHeaderAlignCenter.setActionCommand(ContentAlignment.CENTER.toString()); rowHeaderAlignRight = getIconRadioButton("textAlignRight_off.png", "textAlignRight_on.png", bundle.getString("ROW_HEADER_ALIGN_RIGHT")); rowHeaderAlignRight.setMargin(buttonInsets); setAccessibleName(rowHeaderAlignRight, "ROW_HEADER_ALIGN_RIGHT"); rowHeaderAlignRight.setActionCommand(ContentAlignment.RIGHT.toString()); rowHeaderAlignLeft.setSelected(true); rowHeaderAlignGroup = groupButtons(rowHeaderAlignLeft, rowHeaderAlignCenter, rowHeaderAlignRight); ActionListener rowHeaderAlignmentListener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { controller.setRowHeaderAlignment(ContentAlignment.valueOf(e.getActionCommand())); } }; rowHeaderAlignLeft.addActionListener(rowHeaderAlignmentListener); rowHeaderAlignCenter.addActionListener(rowHeaderAlignmentListener); rowHeaderAlignRight.addActionListener(rowHeaderAlignmentListener); setUpRowFontStyleButtons(); setUpColumnFontStyleButtons(); setUpCellFontStyleButtons(); setUpHeaderBorderButtons(); columnHeaderAlignLeft = getIconRadioButton("textAlignLeft_off.png", "textAlignLeft_on.png", bundle.getString("COLUMN_HEADER_ALIGN_LEFT")); columnHeaderAlignLeft.setMargin(buttonInsets); setAccessibleName(columnHeaderAlignLeft, "COLUMN_HEADER_ALIGN_LEFT"); columnHeaderAlignLeft.setActionCommand(ContentAlignment.LEFT.toString()); columnHeaderAlignCenter = getIconRadioButton("textAlignCenter_off.png", "textAlignCenter_on.png", bundle.getString("COLUMN_HEADER_ALIGN_CENTER")); columnHeaderAlignCenter.setMargin(buttonInsets); setAccessibleName(columnHeaderAlignCenter, "COLUMN_HEADER_ALIGN_CENTER"); columnHeaderAlignCenter.setActionCommand(ContentAlignment.CENTER.toString()); columnHeaderAlignRight = getIconRadioButton("textAlignRight_off.png", "textAlignRight_on.png", bundle.getString("COLUMN_HEADER_ALIGN_RIGHT")); columnHeaderAlignRight.setMargin(buttonInsets); setAccessibleName(columnHeaderAlignRight, "COLUMN_HEADER_ALIGN_RIGHT"); columnHeaderAlignRight.setActionCommand(ContentAlignment.RIGHT.toString()); columnHeaderAlignLeft.setSelected(true); columnHeaderAlignGroup = groupButtons(columnHeaderAlignLeft, columnHeaderAlignCenter, columnHeaderAlignRight); ActionListener columnHeaderAlignmentListener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { controller.setColumnHeaderAlignment(ContentAlignment.valueOf(e.getActionCommand())); } }; columnHeaderAlignLeft.addActionListener(columnHeaderAlignmentListener); columnHeaderAlignCenter.addActionListener(columnHeaderAlignmentListener); columnHeaderAlignRight.addActionListener(columnHeaderAlignmentListener); showRowHeaders = new JCheckBox(bundle.getString("SHOW_ROW_HEADERS")); setAccessibleName(showRowHeaders, "SHOW_ROW_HEADERS"); showRowHeaders.setSelected(true); showColumnHeaders = new JCheckBox(bundle.getString("SHOW_COLUMN_HEADERS")); setAccessibleName(showColumnHeaders, "SHOW_COLUMN_HEADERS"); showColumnHeaders.setSelected(true); mgr.tagComponents(NOT_FULLY_IMPLEMENTED, showRowHeaders, showColumnHeaders); rowHeaderFullLabel = new JLabel(); setAccessibleName(rowHeaderFullLabel, "ROW_HEADER_FULL_LABEL"); rowHeaderAbbreviations = new JPanel(); setAccessibleName(rowHeaderAbbreviations, "ROW_HEADER_ABBREVIATIONS"); rowHeaderAbbreviatedLabel = new JLabel(); setAccessibleName(rowHeaderAbbreviatedLabel, "ROW_HEADER_ABBREVIATED_LABEL"); columnHeaderFullLabel = new JLabel(); setAccessibleName(columnHeaderFullLabel, "COLUMN_HEADER_FULL_LABEL"); columnHeaderAbbreviations = new JPanel(); setAccessibleName(columnHeaderAbbreviations, "COLUMN_HEADER_ABBREVIATIONS"); columnHeaderAbbreviatedLabel = new JLabel(); setAccessibleName(columnHeaderAbbreviatedLabel, "COLUMN_HEADER_ABBREVIATED_LABEL"); cellFullLabel = new JLabel(); setAccessibleName(cellFullLabel, "CELL_FULL_LABEL"); cellAbbreviations = new JPanel(); setAccessibleName(cellAbbreviations, "CELL_ABBREVIATIONS"); cellAbbreviatedLabel = new JLabel(); setAccessibleName(cellAbbreviatedLabel, "CELL_ABBREVIATED_LABEL"); propertyToShow = new JComboBox(new String[] { "Value" }); setAccessibleName(propertyToShow, "PROPERTY_TO_SHOW"); enumeration = new JComboBox(); setAccessibleName(enumeration, "ENUMERATION"); enumeration.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { controller.setEnumeration(enumeration.getModel()); if (!controller.enumerationIsNone(enumeration.getModel())) { if (!controller.dateIsNone(dateFormatChooser.getModel())) { dateFormatChooser.setSelectedItem(DateFormatItem.None); controller.setDateFormat(dateFormatChooser.getModel()); } mgr.disable(DATE_CONTROLS, true); mgr.disable(DECIMAL_CONTROLS, true); mgr.disable(DECIMAL_ALIGNMENT_BUTTON, true); } else { mgr.enable(DATE_CONTROLS, true); mgr.enable(DECIMAL_CONTROLS, true); mgr.enable(DECIMAL_ALIGNMENT_BUTTON, true); } } }); numberOfDecimals = new JComboBox(new Object[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }); numberOfDecimals.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { controller.setDecimalPlaces(numberOfDecimals.getModel()); } }); setAccessibleName(numberOfDecimals, "NUMBER_OF_DECIMALS"); cellFontName = setUpFontControl(); setAccessibleName(cellFontName, "CELL_FONT"); cellFontName.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { controller.setCellFont(cellFontName.getModel()); } }); dateFormatChooser = new JComboBox(new Object[] {DateFormatItem.None, DateFormatItem.HHMM, DateFormatItem.HHMMSS, DateFormatItem.DDD_HHMM, DateFormatItem.DDD_HHMMSS, DateFormatItem.YYYYDDD_HHMMSS}); DateComboBoxRenderer renderer= new DateComboBoxRenderer(); dateFormatChooser.setRenderer(renderer); dateFormatChooser.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { controller.setDateFormat(dateFormatChooser.getModel()); if (! controller.dateIsNone(dateFormatChooser.getModel())) { mgr.disable(DECIMAL_CONTROLS, true); mgr.disable(DECIMAL_ALIGNMENT_BUTTON, true); } else { mgr.enable(DECIMAL_CONTROLS, true); mgr.enable(DECIMAL_ALIGNMENT_BUTTON, true); } } }); setAccessibleName(dateFormatChooser, "FORMAT_AS_DATE"); /* Border controls are ungrouped toggle buttons with independent state, however, create radio buttons to get smaller button size. */ cellBorderOnLeft = getIconRadioButton("LeftBorder_off.png", "LeftBorder_on.png", bundle.getString("CELL_BORDER_LEFT_DESCRIPTION")); cellBorderOnLeft.setMargin(buttonInsets); setAccessibleName(cellBorderOnLeft, "CELL_BORDER_LEFT"); cellBorderOnTop = getIconRadioButton("TopBorder_off.png", "TopBorder_on.png", bundle.getString("CELL_BORDER_TOP_DESCRIPTION")); setAccessibleName(cellBorderOnTop, "CELL_BORDER_TOP"); cellBorderOnRight = getIconRadioButton("RightBorder_off.png", "RightBorder_on.png", bundle.getString("CELL_BORDER_RIGHT_DESCRIPTION")); setAccessibleName(cellBorderOnRight, "CELL_BORDER_RIGHT"); cellBorderOnBottom = getIconRadioButton("BottomBorder_off.png", "BottomBorder_on.png", bundle.getString("CELL_BORDER_BOTTOM_DESCRIPTION")); setAccessibleName(cellBorderOnBottom, "CELL_BORDER_BOTTOM"); ActionListener cellBorderListener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { BorderState compositeControllerState = new BorderState(cellBorderOnLeft.getModel(),cellBorderOnTop.getModel(), cellBorderOnRight.getModel(), cellBorderOnBottom.getModel()); controller.mergeBorderState(compositeControllerState); } }; cellBorderOnLeft.addActionListener(cellBorderListener); cellBorderOnTop.addActionListener(cellBorderListener); cellBorderOnRight.addActionListener(cellBorderListener); cellBorderOnBottom.addActionListener(cellBorderListener); cellAlignLeft = getIconRadioButton("textAlignLeft_off.png", "textAlignLeft_on.png", bundle.getString("CELL_ALIGN_LEFT")); cellAlignLeft.setMargin(buttonInsets); setAccessibleName(cellAlignLeft, "CELL_ALIGN_LEFT"); cellAlignLeft.setActionCommand(ContentAlignment.LEFT.toString()); cellAlignCenter = getIconRadioButton("textAlignCenter_off.png", "textAlignCenter_on.png", bundle.getString("CELL_ALIGN_CENTER")); setAccessibleName(cellAlignCenter, "CELL_ALIGN_CENTER"); cellAlignCenter.setActionCommand(ContentAlignment.CENTER.toString()); cellAlignRight = getIconRadioButton("textAlignRight_off.png", "textAlignRight_on.png", bundle.getString("CELL_ALIGN_RIGHT")); setAccessibleName(cellAlignRight, "CELL_ALIGN_RIGHT"); cellAlignRight.setActionCommand(ContentAlignment.RIGHT.toString()); cellAlignDecimal = getIconRadioButton("TextAlignDecimal_off.png", "TextAlignDecimal_on.png", bundle.getString("CELL_ALIGN_DECIMAL")); setAccessibleName(cellAlignDecimal, "CELL_ALIGN_DECIMAL"); cellAlignDecimal.setActionCommand(ContentAlignment.DECIMAL.toString()); cellAlignLeft.setSelected(true); cellAlignGroup = groupButtons(cellAlignLeft, cellAlignCenter, cellAlignRight, cellAlignDecimal); ActionListener cellAlignmentListener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { controller.setCellAlignment(ContentAlignment.valueOf(e.getActionCommand())); } }; cellAlignLeft.addActionListener(cellAlignmentListener); cellAlignCenter.addActionListener(cellAlignmentListener); cellAlignRight.addActionListener(cellAlignmentListener); cellAlignDecimal.addActionListener(cellAlignmentListener); JPanel contentPanel = new JPanel(); contentPanel.setLayout(new BoxLayout(contentPanel, BoxLayout.Y_AXIS)); contentPanel.setBorder(BorderFactory.createEmptyBorder(PANEL_BORDER, PANEL_BORDER, PANEL_BORDER, PANEL_BORDER)); JScrollPane scrollPane = new JScrollPane(contentPanel); setLayout(new GridLayout(1,1)); add(scrollPane); ConstraintBuilder builder; rowColumnFormattingPanel = new TitledPanel("ROW_COLUMN_FORMATTING_PANEL"); setAccessibleName(rowColumnFormattingPanel, "ROW_COLUMN_FORMATTING_PANEL"); contentPanel.add(rowColumnFormattingPanel); builder = rowColumnFormattingPanel.getBuilder(); JLabel rowHeightLabel = new JLabel(bundle.getString("ROW_HEIGHT_LABEL")); builder.add(rowHeightLabel); builder.insets(0,LABEL_VALUE_SPACE,0,0); JLabel columnWidthLabel = new JLabel(bundle.getString("COLUMN_WIDTH_LABEL")); builder.add(rowHeightSpinner, hbox(COLUMN_SPACE), columnWidthLabel, hbox(LABEL_VALUE_SPACE), columnWidthSpinner); JLabel tableOrientationLabel = new JLabel(bundle.getString("TABLE_ORIENTATION_LABEL")); builder.nextRow().add(tableOrientationLabel); builder.insets(0,LABEL_VALUE_SPACE,0,0); builder.add(tableRowOrientation, hbox(COLUMN_SPACE), tableColOrientation); mgr.tagComponents(TABLE_ORIENTATION, tableOrientationLabel, tableRowOrientation, tableColOrientation); // builder.nextRow(); // builder.nextColumn().insets(0,LABEL_VALUE_SPACE,0,0).add(transposeTableButton); mgr.tagComponents(TRANSPOSE, transposeTableButton); mgr.tagComponents(NOT_FULLY_IMPLEMENTED, transposeTableButton); setUpColorComboBoxes(); rowColumnFontFormattingPanel = createHeaderFormattingPanel(); contentPanel.add(rowColumnFontFormattingPanel); mgr.tagComponents(SELECTION_NOT_EMPTY, rowHeightLabel, rowHeightSpinner, columnWidthLabel, columnWidthSpinner); mgr.tagComponents(SELECTION_NOT_EMPTY, rowHeaderAlignLeft, rowHeaderAlignCenter, rowHeaderAlignRight); mgr.tagComponents(SELECTION_NOT_EMPTY, columnHeaderAlignLeft, columnHeaderAlignCenter, columnHeaderAlignRight); mgr.tagComponents(SELECTION_NOT_EMPTY, rowColumnFontFormattingPanel); mgr.tagComponents(HEADERS_HIDABLE, showRowHeaders, showColumnHeaders); // layout.addRow().done(); // layout.inColumn(1).add(showGridCheckbox).done(); rowHeaderLabelPanel = new TitledPanel("ROW_HEADER_LABEL_PANEL"); setAccessibleName(rowHeaderLabelPanel, "ROW_HEADER_LABEL_PANEL"); contentPanel.add(rowHeaderLabelPanel); mgr.tagComponents(ROW_HEADER_LABEL, rowHeaderLabelPanel); builder = rowHeaderLabelPanel.getBuilder(); builder.add(new JLabel(bundle.getString("ROW_HEADER_FULL_LABEL_LABEL"))); builder.insets(0, LABEL_VALUE_SPACE, 0, 0); builder.add(rowHeaderFullLabel); builder.nextRow().add(new JLabel(bundle.getString("ROW_HEADER_ABBREVIATIONS_LABEL"))); builder.insets(0, LABEL_VALUE_SPACE, 0, 0); builder.add(rowHeaderAbbreviations); builder.nextRow().add(new JLabel(bundle.getString("ROW_HEADER_ABBREVIATED_LABEL_LABEL"))); builder.insets(0, LABEL_VALUE_SPACE, 0, 0); builder.add(rowHeaderAbbreviatedLabel); columnHeaderLabelPanel = new TitledPanel("COLUMN_HEADER_LABEL_PANEL"); setAccessibleName(columnHeaderLabelPanel, "COLUMN_HEADER_LABEL_PANEL"); contentPanel.add(columnHeaderLabelPanel); mgr.tagComponents(COLUMN_HEADER_LABEL, columnHeaderLabelPanel); builder = columnHeaderLabelPanel.getBuilder(); builder.add(new JLabel(bundle.getString("COLUMN_HEADER_FULL_LABEL_LABEL"))); builder.insets(0, LABEL_VALUE_SPACE, 0, 0); builder.add(columnHeaderFullLabel); builder.nextRow().add(new JLabel(bundle.getString("COLUMN_HEADER_ABBREVIATIONS_LABEL"))); builder.insets(0, LABEL_VALUE_SPACE, 0, 0); builder.add(columnHeaderAbbreviations); builder.nextRow().add(new JLabel(bundle.getString("COLUMN_HEADER_ABBREVIATED_LABEL_LABEL"))); builder.insets(0, LABEL_VALUE_SPACE, 0, 0); builder.add(columnHeaderAbbreviatedLabel); cellLabelPanel = new TitledPanel("CELL_LABEL_PANEL"); setAccessibleName(cellLabelPanel, "CELL_LABEL_PANEL"); contentPanel.add(cellLabelPanel); mgr.tagComponents(CELL_LABEL, cellLabelPanel); builder = cellLabelPanel.getBuilder(); builder.add(new JLabel(bundle.getString("CELL_FULL_LABEL_LABEL"))); builder.insets(0, LABEL_VALUE_SPACE, 0, 0); builder.add(cellFullLabel); builder.nextRow().add(new JLabel(bundle.getString("CELL_ABBREVIATIONS_LABEL"))); builder.insets(0, LABEL_VALUE_SPACE, 0, 0); builder.add(cellAbbreviations); builder.nextRow().add(new JLabel(bundle.getString("CELL_ABBREVIATED_LABEL_LABEL"))); builder.insets(0, LABEL_VALUE_SPACE, 0, 0); builder.add(cellAbbreviatedLabel); cellFormattingPanel = new TitledPanel("CELL_FORMATTING_PANEL"); setAccessibleName(cellFormattingPanel, "CELL_FORMATTING_PANEL"); contentPanel.add(cellFormattingPanel); mgr.tagComponents(SELECTION_NOT_EMPTY, cellFormattingPanel); builder = cellFormattingPanel.getBuilder(); JLabel propertyToShowLabel = new JLabel(bundle.getString("PROPERTY_TO_SHOW_LABEL")); // builder.add(propertyToShowLabel); // builder.insets(0,LABEL_VALUE_SPACE,0,0); // builder.add(propertyToShow); JLabel enumerationLabel = new JLabel(bundle.getString("ENUMERATION_LABEL")); builder.nextRow().add(enumerationLabel); builder.insets(0,LABEL_VALUE_SPACE,LABEL_VALUE_SPACE,0); builder.add(enumeration); JLabel dateLabel = new JLabel(bundle.getString("FORMAT_AS_DATE_LABEL")); builder.nextRow().add(dateLabel); builder.insets(0,LABEL_VALUE_SPACE,LABEL_VALUE_SPACE,0); builder.add(dateFormatChooser); JLabel numberOfDecimalsLabel = new JLabel(bundle.getString("NUMBER_OF_DECIMALS_LABEL")); builder.nextRow().add(numberOfDecimalsLabel); builder.insets(0,LABEL_VALUE_SPACE,LABEL_VALUE_SPACE,0); builder.add(numberOfDecimals); JLabel cellFontNameLabel = new JLabel("Font Name:"); builder.nextRow().add(cellFontNameLabel); builder.insets(0,LABEL_VALUE_SPACE,LABEL_VALUE_SPACE,0); builder.add(cellFontName); JLabel cellFontSizeLabel = new JLabel("Font Size:"); builder.nextRow().add(cellFontSizeLabel); builder.insets(0,LABEL_VALUE_SPACE,LABEL_VALUE_SPACE,0); builder.add(cellFontSize); JLabel cellFontColorLabel = new JLabel("Font Color:"); builder.nextRow().add(cellFontColorLabel); builder.insets(0,LABEL_VALUE_SPACE,0,0); builder.add(cellFontColorComboBox); JLabel cellAlignmentLabel = new JLabel(bundle.getString("CELL_ALIGNMENT")); builder.nextRow().add(cellAlignmentLabel); builder.insets(0,LABEL_VALUE_SPACE,0,0); builder.add(cellAlignLeft, hbox(THIN_SPACE), cellAlignCenter, hbox(THIN_SPACE), cellAlignRight, hbox(THIN_SPACE), cellAlignDecimal); JLabel cellFontStyleLabel = new JLabel("Font Style:"); builder.nextRow().add(cellFontStyleLabel); builder.insets(0,LABEL_VALUE_SPACE,0,0); builder.add(cellFontStyleBold,cellFontStyleItalic, cellFontUnderline); JLabel cellBackgroundColorLabel = new JLabel("Background Color:"); builder.nextRow().add(cellBackgroundColorLabel); builder.insets(0,LABEL_VALUE_SPACE,0,0); builder.add(cellBackgroundColorComboBox); JLabel cellBordersLabel = new JLabel(bundle.getString("BORDERS")); builder.nextRow().add(cellBordersLabel); builder.insets(0,LABEL_VALUE_SPACE,0,0); builder.add(cellBorderOnLeft, hbox(THIN_SPACE), cellBorderOnRight, hbox(THIN_SPACE), cellBorderOnTop, hbox(THIN_SPACE), cellBorderOnBottom); mgr.tagComponents(SINGLE_CELL_SELECTION, propertyToShowLabel, propertyToShow); mgr.tagComponents(ENUMERATION_CONTROLS, enumerationLabel, enumeration); mgr.tagComponents(SELECTION_NOT_EMPTY, cellAlignmentLabel, cellAlignLeft, cellAlignCenter, cellAlignRight, enumerationLabel, enumeration); mgr.tagComponents(DECIMAL_CONTROLS, numberOfDecimalsLabel, numberOfDecimals); mgr.tagComponents(SELECTION_NOT_EMPTY, numberOfDecimalsLabel, numberOfDecimals); mgr.tagComponents(DATE_CONTROLS, dateLabel, dateFormatChooser); mgr.tagComponents(DECIMAL_ALIGNMENT_BUTTON, cellAlignDecimal); mgr.tagComponents(SELECTION_NOT_EMPTY, cellBordersLabel, cellBorderOnLeft, cellBorderOnTop, cellBorderOnRight, cellBorderOnBottom); mgr.tagComponents(NOT_FULLY_IMPLEMENTED, propertyToShowLabel, propertyToShow); loadSettings(); addAncestorListener(new AncestorListener() { @Override public void ancestorAdded(AncestorEvent event) { allPanels.add(TableSettingsControlPanel.this); } @Override public void ancestorMoved(AncestorEvent event) { // ignore } @Override public void ancestorRemoved(AncestorEvent event) { allPanels.remove(TableSettingsControlPanel.this); } }); // Reload the settings when the table selection changes. controller.addSelectionListener(new SelectionListener() { @Override public void selectionChanged() { loadSettings(); } }); } private ButtonGroup groupButtons(AbstractButton... buttons) { ButtonGroup group = new ButtonGroup(); for (AbstractButton b : buttons) { group.add(b); } return group; } private static class TitledPanel extends JPanel { private static final long serialVersionUID = 1L; ConstraintBuilder builder; public TitledPanel(String titleKey) { setLayout(new FlowLayout(FlowLayout.LEADING)); JPanel panel = new JPanel(); builder = new ConstraintBuilder(panel); builder.w().makeDefault(); add(panel); setBorder(new TitledBorder(bundle.getString(titleKey))); } public ConstraintBuilder getBuilder() { return builder; } } /** * Notify all other panels that the settings have changed. */ private void settingsChanged() { for (TableSettingsControlPanel panel : allPanels) { if (panel != this) { panel.loadSettings(); } } } private void setValueWithoutDispatchingEvents(JSpinner spinner, Object value, ChangeListener cl) { spinner.removeChangeListener(cl); spinner.setValue(value); spinner.addChangeListener(cl); } private void setSelectedWithoutDispatchingEvents(JRadioButton button, boolean selected) { ActionListener[] listeners = button.getActionListeners(); for (ActionListener al:listeners) { button.removeActionListener(al); } button.setSelected(selected); for (ActionListener al:listeners) { button.addActionListener(al); } } private void setSelectedWithoutDispatchingEvents(JComboBox comboBox, int selectedIndex) { ActionListener[] listeners = comboBox.getActionListeners(); for (ActionListener al:listeners) { comboBox.removeActionListener(al); } comboBox.setSelectedIndex(selectedIndex); for (ActionListener al:listeners) { comboBox.addActionListener(al); } } /** * Loads settings from the controller and sets the control states. */ public void loadSettings() { // Set initial values for the controls. if (controller.getTableOrientation() == TableOrientation.ROW_MAJOR) { setSelectedWithoutDispatchingEvents(tableRowOrientation, true); } else { setSelectedWithoutDispatchingEvents(tableColOrientation, true); } if ( controller.getRowHeight() > 0) { setValueWithoutDispatchingEvents(rowHeightSpinner, controller.getRowHeight(), rowHeightListener); } setValueWithoutDispatchingEvents(columnWidthSpinner, controller.getColumnWidth(), columnWidthListener); // showGridCheckbox.setSelected(controller.getShowGrid()); mgr.showAll(); configureAbbreviationSettings( LabelType.ROW, ROW_HEADER_LABEL, rowHeaderFullLabel, rowHeaderAbbreviatedLabel, rowHeaderAbbreviations, controller.getRowLabelAbbreviationSettings() ); configureAbbreviationSettings( LabelType.COLUMN, COLUMN_HEADER_LABEL, columnHeaderFullLabel, columnHeaderAbbreviatedLabel, columnHeaderAbbreviations, controller.getColumnLabelAbbreviationSettings() ); configureAbbreviationSettings( LabelType.CELL, CELL_LABEL, cellFullLabel, cellAbbreviatedLabel, cellAbbreviations, controller.getCellLabelAbbreviationSettings() ); ComboBoxModel enumerationModel = controller.getEnumerationModel(); enumeration.setModel(enumerationModel); if (enumerationModel.getSize() <= 1) { // i.e., only "None" enumeration.setEnabled(false); } else { enumeration.setEnabled(true); } if (controller.selectedCellsHaveMixedEnumerations()) { ActionListener[] listeners = enumeration.getActionListeners(); for (ActionListener al : listeners) { enumeration.removeActionListener(al); } enumeration.setSelectedIndex(-1); for (ActionListener al : listeners) { enumeration.addActionListener(al); } } ActionListener[] listeners = numberOfDecimals.getActionListeners(); for (ActionListener al : listeners) { numberOfDecimals.removeActionListener(al); } int decimals = controller.getDecimalPlaces() == null ? -1 : controller.getDecimalPlaces(); numberOfDecimals.setSelectedIndex(decimals); for (ActionListener al : listeners) { numberOfDecimals.addActionListener(al); } //Row and Column Formatting controls //Font Name listeners = rowHeaderFontName.getActionListeners(); for (ActionListener al : listeners) { rowHeaderFontName.removeActionListener(al); } if (controller.getRowHeaderFontName() != null) { rowHeaderFontName.setSelectedItem(controller.getRowHeaderFontName()); } else { rowHeaderFontName.setSelectedIndex(-1); } for (ActionListener al : listeners) { rowHeaderFontName.addActionListener(al); } listeners = columnHeaderFontName.getActionListeners(); for (ActionListener al : listeners) { columnHeaderFontName.removeActionListener(al); } if (controller.getRowHeaderFontName() != null) { columnHeaderFontName.setSelectedItem(controller.getColumnHeaderFontName()); } else { columnHeaderFontName.setSelectedIndex(-1); } for (ActionListener al : listeners) { columnHeaderFontName.addActionListener(al); } //Font Size if (controller.getRowHeaderFontSize() != null) { setValueWithoutDispatchingEvents(rowHeaderFontSize, controller.getRowHeaderFontSize().intValue(), rowHeaderFontSizeListener); } if (controller.getColumnHeaderFontSize() != null) { setValueWithoutDispatchingEvents(columnHeaderFontSize, controller.getColumnHeaderFontSize().intValue(), columnHeaderFontSizeListener); } if (controller.getCellFontSize() != null) { setValueWithoutDispatchingEvents(cellFontSize, controller.getCellFontSize().intValue(), cellFontSizeListener); } //Font Style if (controller.getRowFontStyle() != null) { if (controller.getRowFontStyle().equals(Font.BOLD)) { rowHeaderFontStyleBold.setSelected(true); rowHeaderFontStyleItalic.setSelected(false); } else if (controller.getRowFontStyle().equals(Font.ITALIC)) { rowHeaderFontStyleItalic.setSelected(true); rowHeaderFontStyleBold.setSelected(false); } else if (controller.getRowFontStyle().equals(Font.BOLD+Font.ITALIC)) { rowHeaderFontStyleBold.setSelected(true); rowHeaderFontStyleItalic.setSelected(true); } else { rowHeaderFontStyleBold.setSelected(false); rowHeaderFontStyleItalic.setSelected(false); } } else { rowHeaderFontStyleBold.setSelected(false); rowHeaderFontStyleItalic.setSelected(false); } if (controller.getCellFontTextAttribute() != null) { if (controller.getCellFontTextAttribute().equals(TextAttribute.UNDERLINE_ON)) { cellFontUnderline.setSelected(true); } else { cellFontUnderline.setSelected(false); } } if (controller.getRowHeaderTextAttribute() != null) { if (controller.getRowHeaderTextAttribute().equals(TextAttribute.UNDERLINE_ON)) { rowHeaderFontUnderline.setSelected(true); } else { rowHeaderFontUnderline.setSelected(false); } } if (controller.getColumnHeaderFontStyle() != null) { if (controller.getColumnHeaderFontStyle().equals(Font.BOLD)) { columnHeaderFontStyleBold.setSelected(true); columnHeaderFontStyleItalic.setSelected(false); } else if (controller.getColumnHeaderFontStyle().equals(Font.ITALIC)) { columnHeaderFontStyleItalic.setSelected(true); columnHeaderFontStyleBold.setSelected(false); } else if (controller.getColumnHeaderFontStyle().equals(Font.BOLD+Font.ITALIC)) { columnHeaderFontStyleBold.setSelected(true); columnHeaderFontStyleItalic.setSelected(true); } else { columnHeaderFontStyleBold.setSelected(false); columnHeaderFontStyleItalic.setSelected(false); } } else { columnHeaderFontStyleBold.setSelected(false); columnHeaderFontStyleItalic.setSelected(false); } if (controller.getColumnHeaderTextAttribute() != null) { if (controller.getColumnHeaderTextAttribute().equals(TextAttribute.UNDERLINE_ON)) { columnHeaderFontStyleUnderline.setSelected(true); } else { columnHeaderFontStyleUnderline.setSelected(false); } } if (controller.getCellFontStyle() != null) { if (controller.getCellFontStyle().equals(Font.BOLD)) { cellFontStyleBold.setSelected(true); cellFontStyleItalic.setSelected(false); } else if (controller.getCellFontStyle().equals(Font.ITALIC)) { cellFontStyleItalic.setSelected(true); cellFontStyleBold.setSelected(false); } else if (controller.getCellFontStyle().equals(Font.BOLD+Font.ITALIC)) { cellFontStyleBold.setSelected(true); cellFontStyleItalic.setSelected(true); } else { cellFontStyleBold.setSelected(false); cellFontStyleItalic.setSelected(false); } } else { cellFontStyleBold.setSelected(false); cellFontStyleItalic.setSelected(false); } // Color if (controller.getRowHeaderFontColor() != null) { listeners = rowForegroundColorComboBox.getActionListeners(); for (ActionListener al : listeners) { rowForegroundColorComboBox.removeActionListener(al); } rowForegroundColorComboBox.setSelectedItem(controller.getRowHeaderFontColor()); for (ActionListener al : listeners) { rowForegroundColorComboBox.addActionListener(al); } } else { setSelectedWithoutDispatchingEvents(rowForegroundColorComboBox, 0); } if (controller.getColumnHeaderFontColor() != null) { listeners = columnForegroundColorComboBox.getActionListeners(); for (ActionListener al : listeners) { columnForegroundColorComboBox.removeActionListener(al); } columnForegroundColorComboBox.setSelectedItem(controller.getColumnHeaderFontColor()); for (ActionListener al : listeners) { columnForegroundColorComboBox.addActionListener(al); } } else { setSelectedWithoutDispatchingEvents(columnForegroundColorComboBox, 0); } if (controller.getRowHeaderBorderColor() != null) { listeners = rowHeaderBorderColorComboBox.getActionListeners(); for (ActionListener al : listeners) { rowHeaderBorderColorComboBox.removeActionListener(al); } rowHeaderBorderColorComboBox.setSelectedItem(controller.getRowHeaderBorderColor()); for (ActionListener al : listeners) { rowHeaderBorderColorComboBox.addActionListener(al); } } else { setSelectedWithoutDispatchingEvents(rowHeaderBorderColorComboBox, 0); } if (controller.getColumnHeaderBorderColor() != null) { columnHeaderBorderColorComboBox.setSelectedItem(controller.getColumnHeaderBorderColor()); } else { setSelectedWithoutDispatchingEvents(columnHeaderBorderColorComboBox, 0); } if (controller.getRowHeaderBackgroundColor() != null) { listeners = rowBackgroundColorComboBox.getActionListeners(); for (ActionListener al : listeners) { rowBackgroundColorComboBox.removeActionListener(al); } rowBackgroundColorComboBox.setSelectedItem(controller.getRowHeaderBackgroundColor()); for (ActionListener al : listeners) { rowBackgroundColorComboBox.addActionListener(al); } } else { setSelectedWithoutDispatchingEvents(rowBackgroundColorComboBox, 0); } if (controller.getColumnHeaderBackgroundColor() != null) { columnBackgroundColorComboBox.setSelectedItem(controller.getColumnHeaderBackgroundColor()); } else { setSelectedWithoutDispatchingEvents(columnBackgroundColorComboBox, 0); } if (controller.getCellFontColor() != null) { listeners = cellFontColorComboBox.getActionListeners(); for (ActionListener al : listeners) { cellFontColorComboBox.removeActionListener(al); } cellFontColorComboBox.setSelectedItem(controller.getCellFontColor()); for (ActionListener al : listeners) { cellFontColorComboBox.addActionListener(al); } } else { setSelectedWithoutDispatchingEvents(cellFontColorComboBox, 0); } if (controller.getCellBackgroundColor() != null) { listeners = cellBackgroundColorComboBox.getActionListeners(); for (ActionListener al : listeners) { cellBackgroundColorComboBox.removeActionListener(al); } cellBackgroundColorComboBox.setSelectedItem(controller.getCellBackgroundColor()); for (ActionListener al : listeners) { cellBackgroundColorComboBox.addActionListener(al); } } else { setSelectedWithoutDispatchingEvents(cellBackgroundColorComboBox, 0); } //Cell Formatting Controls listeners = cellFontName.getActionListeners(); for (ActionListener al : listeners) { cellFontName.removeActionListener(al); } if (controller.getCellFontName() != null) { cellFontName.setSelectedItem(controller.getCellFontName()); } else { cellFontName.setSelectedIndex(-1); } for (ActionListener al : listeners) { cellFontName.addActionListener(al); } listeners = dateFormatChooser.getActionListeners(); for (ActionListener al : listeners) { dateFormatChooser.removeActionListener(al); } DateFormatItem dateFormatState = controller.getDateFormat() == null ? DateFormatItem.None : controller.getDateFormat(); dateFormatChooser.setSelectedItem(dateFormatState); for (ActionListener al : listeners) { dateFormatChooser.addActionListener(al); } // Load cell border settings, but don't let action listeners fire. BorderState borderState = controller.getBorderState(); toggleWithoutAction(cellBorderOnLeft, borderState.hasWestBorder()); toggleWithoutAction(cellBorderOnTop, borderState.hasNorthBorder()); toggleWithoutAction(cellBorderOnRight, borderState.hasEastBorder()); toggleWithoutAction(cellBorderOnBottom, borderState.hasSouthBorder()); // Load row header border settings, but don't let action listeners fire. BorderState rowHeaderborderState = controller.getRowHeaderBorderState(); if (rowHeaderborderState == null) { rowHeaderborderState = new BorderState(BorderEdge.NONE.value()); } toggleWithoutAction(rowHeaderBorderOnLeft, rowHeaderborderState.hasWestBorder()); toggleWithoutAction(rowHeaderBorderOnTop, rowHeaderborderState.hasNorthBorder()); toggleWithoutAction(rowHeaderBorderOnRight, rowHeaderborderState.hasEastBorder()); toggleWithoutAction(rowHeaderBorderOnBottom, rowHeaderborderState.hasSouthBorder()); // Load column header border settings, but don't let action listeners fire. BorderState columnHeaderborderState = controller.getColumnHeaderBorderState(); if (columnHeaderborderState == null) { columnHeaderborderState = new BorderState(BorderEdge.NONE.value()); } toggleWithoutAction(columnHeaderBorderOnLeft, columnHeaderborderState.hasWestBorder()); toggleWithoutAction(columnHeaderBorderOnTop, columnHeaderborderState.hasNorthBorder()); toggleWithoutAction(columnHeaderBorderOnRight, columnHeaderborderState.hasEastBorder()); toggleWithoutAction(columnHeaderBorderOnBottom, columnHeaderborderState.hasSouthBorder()); // Load the alignment settings, but don't let action listeners fire. ContentAlignment alignment = controller.getCellAlignment(); selectButtonWithoutAction(cellAlignGroup, alignment); alignment = controller.getRowHeaderAlignment(); selectButtonWithoutAction(rowHeaderAlignGroup, alignment); alignment = controller.getColumnHeaderAlignment(); selectButtonWithoutAction(columnHeaderAlignGroup, alignment); /* * Disable/Enable the table orientation radio buttons when: * 1) No rows or columns are selected (default condition), then "Display collections as Rows or Columns" radio button is enabled * 2) When one or more rows or columns are selected, then "Display collections as Rows or Columns" radio button is disabled. * 3) When all rows or columns are selected, then "Display collections as Rows or Columns" radio button is enabled */ if (controller.getSelectedCellCount() == (controller.getTableColumnCount() * controller.getTableRowCount()) || ((controller.getSelectedCellCount() == 0) && controller.canSetOrientation())) { mgr.enable(TABLE_ORIENTATION, true); } else if (controller.getSelectedCellCount() > 0) { mgr.disable(TABLE_ORIENTATION, true); } // Show/hide controls based on the selection. mgr.hide(SELECTION_NOT_EMPTY, controller.getSelectedCellCount() == 0); mgr.hide(HEADERS_HIDABLE, !controller.isCanHideHeaders()); mgr.hide(SINGLE_CELL_SELECTION, controller.getSelectedCellCount()!=1); mgr.hide(TABLE_ORIENTATION, !controller.canSetOrientation()); mgr.hide(TRANSPOSE, !controller.canTranspose()); mgr.hide(NOT_FULLY_IMPLEMENTED, true); // Disable/Enable numerics depending on the state of the enumeration combo box and date chooser mgr.enable(DATE_CONTROLS, true); if ((!controller.enumerationIsNone(enumerationModel) )) { mgr.disable(DECIMAL_CONTROLS, true); mgr.disable(DECIMAL_ALIGNMENT_BUTTON, true); mgr.disable(DATE_CONTROLS, true); } else if (!controller.dateIsNone(dateFormatChooser.getModel())) { mgr.disable(DECIMAL_CONTROLS, true); mgr.disable(DECIMAL_ALIGNMENT_BUTTON, true); } else { mgr.enable(DECIMAL_CONTROLS, true); mgr.enable(DECIMAL_ALIGNMENT_BUTTON, true); mgr.enable(DATE_CONTROLS, true); } // Hide controls if they will do nothing. R6It1 No longer hiding // mgr.hide(ENUMERATION_CONTROLS, enumeration.getModel().getSize()==0); mgr.hide(DECIMAL_CONTROLS, !controller.showDecimalPlaces()); mgr.hide(DATE_CONTROLS, !controller.showDecimalPlaces()); mgr.hideIfOthersHidden(rowColumnFormattingPanel, rowHeightSpinner, columnWidthSpinner, tableRowOrientation, transposeTableButton, rowHeaderAlignLeft, columnHeaderAlignLeft, showRowHeaders); mgr.tagComponents(COLUMN_IS_NOT_SELECTED, columnHeaderFontName, columnHeaderFontSize, columnHeaderFontStyleBold, columnHeaderFontStyleItalic, columnForegroundColorComboBox); mgr.hide(COLUMN_IS_NOT_SELECTED, controller.getSelectedColumnCount() == 0); mgr.tagComponents(ROW_IS_NOT_SELECTED, rowColumnFontFormattingPanel, rowHeaderFontName, rowHeaderFontSize, rowHeaderFontStyleBold, rowHeaderFontStyleItalic,rowForegroundColorComboBox); mgr.hide(ROW_IS_NOT_SELECTED, controller.getSelectedRowCount() == 0); mgr.hideIfOthersHidden(cellFormattingPanel, propertyToShow, enumeration, numberOfDecimals, dateFormatChooser, cellBorderOnLeft, cellBorderOnTop, cellBorderOnRight, cellBorderOnBottom); } /** * Toggles a button. Ensures that no listeners will be called by first removing all * listeners for the button and then adding them back. * * @param button the button * @param hasEdge true if the cell controlled by this jbutton has this edge drawn. */ private void toggleWithoutAction(JToggleButton button, boolean hasEdge) { ActionListener[] listeners = button.getActionListeners(); for (ActionListener listener : listeners) { button.removeActionListener(listener); } if (hasEdge) { button.setSelected(true); } else { button.setSelected(false); } for (ActionListener listener : listeners) { button.addActionListener(listener); } } /** * Selects a radio button within a button group based on its action command * string. Ensures that no listeners will be called by first removing all * command listeners for the button and then adding them back. * * @param group the button group * @param actionCommandObject an object whose string representation is the action command of the * button to select, or null if no button should be selected */ private void selectButtonWithoutAction(ButtonGroup group, Object actionCommandObject) { group.clearSelection(); if (actionCommandObject != null) { String actionCommand = actionCommandObject.toString(); for (Enumeration<AbstractButton> e=group.getElements(); e.hasMoreElements(); ) { AbstractButton b = e.nextElement(); if (b.getActionCommand().equals(actionCommand)) { ActionListener[] listeners = b.getActionListeners(); for (ActionListener listener : listeners) { b.removeActionListener(listener); } b.setSelected(true); for (ActionListener listener : listeners) { b.addActionListener(listener); } } } } } private static enum LabelType { CELL, COLUMN, ROW } private void configureAbbreviationSettings( final LabelType type, String tag, JLabel fullLabel, final JLabel abbreviatedLabel, JPanel abbreviationsPanel, final AbbreviationSettings abbreviationSettings ) { abbreviationsPanel.removeAll(); if (abbreviationSettings==null || !abbreviationSettings.canAbbreviate()) { mgr.hide(tag, true); } else { fullLabel.setText(abbreviationSettings.getFullLabel()); abbreviatedLabel.setText(abbreviationSettings.getAbbreviatedLabel()); abbreviationsPanel.setLayout(new FlowLayout()); for (ComboBoxModel model : abbreviationSettings.getAbbreviationModels()) { if (model.getSize() > 1) { JComboBox dropDown = new JComboBox(model); dropDown.getAccessibleContext().setAccessibleName(model.getElementAt(0)+"comboBox"); dropDown.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { abbreviatedLabel.setText(abbreviationSettings.getAbbreviatedLabel()); if (type == LabelType.CELL) { controller.setCellLabelAbbreviations(abbreviationSettings); } else if (type == LabelType.ROW) { controller.setRowLabelAbbreviations(abbreviationSettings); } else { controller.setColumnLabelAbbreviations(abbreviationSettings); } } }); abbreviationsPanel.add(dropDown); } else { abbreviationsPanel.add(new JLabel((String) model.getElementAt(0))); } } } } private JRadioButton getIconRadioButton(String offName, String onName, String description) { JRadioButton button = new JRadioButton(loadIcon(offName, description)); button.setSelectedIcon(loadIcon(onName, description)); return button; } private Icon loadIcon(String name, String description) { URL url = getClass().getClassLoader().getResource("images/" + name); return new ImageIcon(url, description); } private void setAccessibleName(JComponent component, String keyPrefix) { String nameKey = keyPrefix + "_NAME"; String descriptionKey = keyPrefix + "_DESCRIPTION"; assert bundle.containsKey(nameKey); assert bundle.containsKey(descriptionKey); component.getAccessibleContext().setAccessibleName(bundle.getString(nameKey)); component.getAccessibleContext().setAccessibleDescription(bundle.getString(descriptionKey)); } /** * Returns a component whose paintComponent method is used to display the combo box items. * Sets the label string for the comboBox. In the default combo box model, the object's toString is used * but the date object's guiString is required, rather than its toString java value. */ class DateComboBoxRenderer extends DefaultListCellRenderer { private static final long serialVersionUID = 1L; /** * This method finds the text corresponding * to the selected value and returns the label, set up * to display the text. * @param list a list object used to display the items. * @param value - the object to render * @param index -- the index of the object to render * @param isSelected - indicates whether the object to render is selected. * @param cellHasFocus - indicates whether the object to render has the focus */ @Override public Component getListCellRendererComponent( JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { JLabel l = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); l.setText(DateFormatItem.class.cast(value).getGuiLabel()); return l; } } private JPanel createHeaderFormattingPanel() { //Alignment Controls JPanel rowHeaderAlignmentControlPanel = new JPanel(new FlowLayout()); rowHeaderAlignmentControlPanel.add(rowHeaderAlignLeft); rowHeaderAlignmentControlPanel.add(rowHeaderAlignCenter); rowHeaderAlignmentControlPanel.add(rowHeaderAlignRight); // thePanel.add(rowHeaderAlignmentControlPanel, gbcCenter2); JPanel columnHeaderAlignmentControlPanel = new JPanel(new FlowLayout()); columnHeaderAlignmentControlPanel.add(columnHeaderAlignLeft); columnHeaderAlignmentControlPanel.add(columnHeaderAlignCenter); columnHeaderAlignmentControlPanel.add(columnHeaderAlignRight); // Font Size Controls TitledPanel theHFPanel = new TitledPanel("HEADER_LABEL_FORMATTING"); ConstraintBuilder builder = theHFPanel.getBuilder(); builder.at(0,1).baseline_centered().add(new JLabel(bundle.getString("ROW"))); builder.at(0,2).baseline_centered().add(new JLabel(bundle.getString("COLUMN"))); builder.at(1,0).baseline_w().add(new JLabel(bundle.getString("FONT_NAME_LABEL")) ,hbox(10)); builder.at(1,1).baseline_w().add(rowHeaderFontName, hbox(20)); builder.at(1,2).baseline_w().add(columnHeaderFontName); builder.insets(LABEL_VALUE_SPACE,0,0,0); builder.at(2,0).baseline_w().add(new JLabel(bundle.getString("FONT_SIZE_LABEL"))); builder.at(2,1).baseline_w().add(rowHeaderFontSize); builder.at(2,2).baseline_w().add(columnHeaderFontSize); builder.at(3,0).w().add(new JLabel(bundle.getString("FONT_COLOR_LABEL"))); builder.at(3,1).insets(LABEL_VALUE_SPACE,0,0,0).baseline_w().add(rowForegroundColorComboBox); builder.at(3,2).insets(LABEL_VALUE_SPACE,0,0,0).baseline_w().add(columnForegroundColorComboBox); builder.at(4,0).w().add(new JLabel(bundle.getString("ALIGNMENT"))); builder.at(4,1).insets(LABEL_VALUE_SPACE,0,0,0).nw().add(rowHeaderAlignLeft, rowHeaderAlignCenter, rowHeaderAlignRight); builder.at(4,2).insets(LABEL_VALUE_SPACE,0,0,0).nw().add(columnHeaderAlignLeft, columnHeaderAlignCenter, columnHeaderAlignRight); builder.at(5,0).w().add(new JLabel(bundle.getString("FONT_STYLE_LABEL"))); builder.at(5,1).insets(LABEL_VALUE_SPACE,0,0,0).baseline_w().add(rowHeaderFontStyleBold, rowHeaderFontStyleItalic,rowHeaderFontUnderline); builder.at(5,2).insets(LABEL_VALUE_SPACE,0,0,0).baseline_w().add(columnHeaderFontStyleBold, columnHeaderFontStyleItalic,columnHeaderFontStyleUnderline); builder.at(6,0).baseline_w().add(new JLabel(bundle.getString("BACKGROUND_COLOR_LABEL")),hbox(10)); builder.at(6,1).insets(LABEL_VALUE_SPACE,0,0,0).nw().add(rowBackgroundColorComboBox); builder.at(6,2).insets(LABEL_VALUE_SPACE,0,0,0).nw().add(columnBackgroundColorComboBox); builder.at(7,0).w().add(new JLabel(bundle.getString("ROW_COL_BORDER"))); builder.at(7,1).insets(LABEL_VALUE_SPACE,0,0,0).nw().add(rowHeaderBorderOnLeft, rowHeaderBorderOnRight, rowHeaderBorderOnTop, rowHeaderBorderOnBottom, hbox(10)); builder.at(7,2).insets(LABEL_VALUE_SPACE,0,0,0).nw().add(columnHeaderBorderOnLeft, columnHeaderBorderOnRight, columnHeaderBorderOnTop, columnHeaderBorderOnBottom); builder.at(8,0).w().add(new JLabel(bundle.getString("BORDER_COLOR"))); builder.at(8,1).insets(LABEL_VALUE_SPACE,0,0,0).nw().add(rowHeaderBorderColorComboBox); builder.at(8,2).insets(LABEL_VALUE_SPACE,0,0,0).nw().add(columnHeaderBorderColorComboBox); return theHFPanel; } private JComboBox setUpFontControl() { // DefaultComboBoxModel fontModel = new DefaultComboBoxModel(); return new JComboBox(TableFormattingConstants.JVMFontFamily.values() // new String[] { // Font.DIALOG, // Font.MONOSPACED, // Font.SANS_SERIF, // Font.SERIF} ); } private void setUpHeaderBorderButtons() { //Row Headers rowHeaderBorderOnLeft = getIconRadioButton("LeftBorder_off.png", "LeftBorder_on.png", bundle.getString("ROW_BORDER_LEFT_DESCRIPTION")); setAccessibleName(rowHeaderBorderOnLeft, "ROW_BORDER_LEFT"); Insets buttonInsets = rowHeaderBorderOnLeft.getInsets(); buttonInsets.set(0, 0, 0, 2); rowHeaderBorderOnLeft.setMargin(buttonInsets); rowHeaderBorderOnTop = getIconRadioButton("TopBorder_off.png", "TopBorder_on.png", bundle.getString("ROW_BORDER_TOP_DESCRIPTION")); rowHeaderBorderOnTop.setMargin(buttonInsets); setAccessibleName(rowHeaderBorderOnTop, "ROW_BORDER_TOP"); rowHeaderBorderOnRight = getIconRadioButton("RightBorder_off.png", "RightBorder_on.png", bundle.getString("ROW_BORDER_RIGHT_DESCRIPTION")); rowHeaderBorderOnRight.setMargin(buttonInsets); setAccessibleName(rowHeaderBorderOnRight, "ROW_BORDER_RIGHT"); rowHeaderBorderOnBottom = getIconRadioButton("BottomBorder_off.png", "BottomBorder_on.png", bundle.getString("ROW_BORDER_BOTTOM_DESCRIPTION")); rowHeaderBorderOnBottom.setMargin(buttonInsets); setAccessibleName(rowHeaderBorderOnBottom, "ROW_BORDER_BOTTOM"); ActionListener rowBorderListener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { BorderState compositeControllerState = new BorderState(rowHeaderBorderOnLeft.getModel(), rowHeaderBorderOnTop.getModel(), rowHeaderBorderOnRight.getModel(), rowHeaderBorderOnBottom.getModel()); controller.mergeRowHeaderBorderState(compositeControllerState); } }; rowHeaderBorderOnLeft.addActionListener(rowBorderListener); rowHeaderBorderOnTop.addActionListener(rowBorderListener); rowHeaderBorderOnRight.addActionListener(rowBorderListener); rowHeaderBorderOnBottom.addActionListener(rowBorderListener); //Col Headers columnHeaderBorderOnLeft = getIconRadioButton("LeftBorder_off.png", "LeftBorder_on.png", bundle.getString("COL_BORDER_LEFT_DESCRIPTION")); columnHeaderBorderOnLeft.setMargin(buttonInsets); setAccessibleName(columnHeaderBorderOnLeft, "COL_BORDER_LEFT"); columnHeaderBorderOnTop = getIconRadioButton("TopBorder_off.png", "TopBorder_on.png", bundle.getString("COL_BORDER_TOP_DESCRIPTION")); columnHeaderBorderOnTop.setMargin(buttonInsets); setAccessibleName(columnHeaderBorderOnTop, "COL_BORDER_TOP"); columnHeaderBorderOnRight = getIconRadioButton("RightBorder_off.png", "RightBorder_on.png", bundle.getString("COL_BORDER_RIGHT_DESCRIPTION")); columnHeaderBorderOnRight.setMargin(buttonInsets); setAccessibleName(columnHeaderBorderOnRight, "COL_BORDER_RIGHT"); columnHeaderBorderOnBottom = getIconRadioButton("BottomBorder_off.png", "BottomBorder_on.png", bundle.getString("COL_BORDER_BOTTOM_DESCRIPTION")); columnHeaderBorderOnBottom.setMargin(buttonInsets); setAccessibleName(columnHeaderBorderOnBottom, "COL_BORDER_BOTTOM"); ActionListener columnBorderListener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { BorderState compositeControllerState = new BorderState(columnHeaderBorderOnLeft.getModel(), columnHeaderBorderOnTop.getModel(), columnHeaderBorderOnRight.getModel(), columnHeaderBorderOnBottom.getModel()); controller.mergeColumnHeaderBorderState(compositeControllerState); } }; columnHeaderBorderOnLeft.addActionListener(columnBorderListener); columnHeaderBorderOnTop.addActionListener(columnBorderListener); columnHeaderBorderOnRight.addActionListener(columnBorderListener); columnHeaderBorderOnBottom.addActionListener(columnBorderListener); } private void setUpRowFontStyleButtons() { rowHeaderFontStyleBold = getIconRadioButton("bold_off.png","bold_on.png", bundle.getString("FONT_BOLD")); Insets boldButtonInsets = rowHeaderFontStyleBold.getInsets(); boldButtonInsets.set(0, 0, 0, 2); rowHeaderFontStyleBold.setMargin(boldButtonInsets); setAccessibleName(rowHeaderFontStyleBold, "ROW_FONT_BOLD"); rowHeaderFontStyleItalic = getIconRadioButton("italics_off.png","italics_on.png", bundle.getString("FONT_ITALIC")); rowHeaderFontStyleItalic.setMargin(boldButtonInsets); setAccessibleName(rowHeaderFontStyleItalic, "ROW_FONT_ITALIC"); rowHeaderFontUnderline = getIconRadioButton("underline_off.png","underline_on.png", bundle.getString("FONT_UNDERLINE")); rowHeaderFontUnderline.setMargin(boldButtonInsets); setAccessibleName(rowHeaderFontUnderline, "ROW_FONT_UNDERLINE"); ActionListener rowFontStyleListener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { int fontStyle = Font.PLAIN; if (rowHeaderFontStyleBold.getModel().isSelected()) { fontStyle = Font.BOLD; if (rowHeaderFontStyleItalic.getModel().isSelected()) { fontStyle += Font.ITALIC; } } else if (rowHeaderFontStyleItalic.getModel().isSelected()) { fontStyle = Font.ITALIC; } controller.setRowHeaderFontStyle(fontStyle); } }; rowHeaderFontStyleBold.addActionListener(rowFontStyleListener); rowHeaderFontStyleItalic.addActionListener(rowFontStyleListener); ActionListener rowHeaderUnderlineListener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (rowHeaderFontUnderline.getModel().isSelected()) { controller.setRowHeaderTextAttribute(TextAttribute.UNDERLINE_ON); } else { controller.setRowHeaderTextAttribute(TableFormattingConstants.UNDERLINE_OFF); } } }; rowHeaderFontUnderline.addActionListener(rowHeaderUnderlineListener); } private void setUpColumnFontStyleButtons() { columnHeaderFontStyleBold = getIconRadioButton("bold_off.png","bold_on.png", bundle.getString("FONT_BOLD")); Insets boldButtonInsets = columnHeaderFontStyleBold.getInsets(); boldButtonInsets.set(0, 0, 0, 2); columnHeaderFontStyleBold.setMargin(boldButtonInsets); setAccessibleName(columnHeaderFontStyleBold, "COL_FONT_BOLD"); columnHeaderFontStyleItalic = getIconRadioButton("italics_off.png","italics_on.png", bundle.getString("FONT_ITALIC")); columnHeaderFontStyleItalic.setMargin(boldButtonInsets); setAccessibleName(columnHeaderFontStyleItalic, "COL_FONT_ITALIC"); columnHeaderFontStyleUnderline = getIconRadioButton("underline_off.png","underline_on.png", bundle.getString("FONT_UNDERLINE")); columnHeaderFontStyleUnderline.setMargin(boldButtonInsets); setAccessibleName(columnHeaderFontStyleUnderline, "COL_FONT_UNDERLINE"); ActionListener columnFontStyleListener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { int fontStyle = Font.PLAIN; if (columnHeaderFontStyleBold.getModel().isSelected()) { fontStyle = Font.BOLD; if (columnHeaderFontStyleItalic.getModel().isSelected()) { fontStyle += Font.ITALIC; } } else if (columnHeaderFontStyleItalic.getModel().isSelected()) { fontStyle = Font.ITALIC; } controller.setColumnHeaderFontStyle(fontStyle); } }; columnHeaderFontStyleBold.addActionListener(columnFontStyleListener); columnHeaderFontStyleItalic.addActionListener(columnFontStyleListener); ActionListener columnHeaderUnderlineListener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (columnHeaderFontStyleUnderline.getModel().isSelected()) { controller.setColumnHeaderTextAttribute(TextAttribute.UNDERLINE_ON); } else { controller.setColumnHeaderTextAttribute(TableFormattingConstants.UNDERLINE_OFF); } } }; columnHeaderFontStyleUnderline.addActionListener(columnHeaderUnderlineListener); } private void setUpCellFontStyleButtons() { cellFontStyleBold = getIconRadioButton("bold_off.png","bold_on.png", bundle.getString("FONT_BOLD")); Insets buttonInsets = cellFontStyleBold.getInsets(); buttonInsets.set(buttonInsets.top, 0, buttonInsets.bottom, buttonInsets.right); cellFontStyleBold.setMargin(buttonInsets); setAccessibleName(cellFontStyleBold, "CELL_FONT_BOLD"); cellFontStyleItalic = getIconRadioButton("italics_off.png","italics_on.png", bundle.getString("FONT_ITALIC")); setAccessibleName(cellFontStyleItalic, "CELL_FONT_ITALIC"); cellFontUnderline = getIconRadioButton("underline_off.png","underline_on.png", bundle.getString("CELL_FONT_UNDERLINE")); setAccessibleName(cellFontUnderline, "CELL_FONT_UNDERLINE"); ActionListener cellFontStyleListener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { int fontStyle = Font.PLAIN; if (cellFontStyleBold.getModel().isSelected()) { fontStyle = Font.BOLD; if (cellFontStyleItalic.getModel().isSelected()) { fontStyle += Font.ITALIC; } } else if (cellFontStyleItalic.getModel().isSelected()) { fontStyle = Font.ITALIC; } controller.setCellFontStyle(fontStyle); } }; cellFontStyleBold.addActionListener(cellFontStyleListener); cellFontStyleItalic.addActionListener(cellFontStyleListener); ActionListener cellFontUnderlineListener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (cellFontUnderline.getModel().isSelected()) { controller.setCellFontTextAttribute(TextAttribute.UNDERLINE_ON); } else { controller.setCellFontTextAttribute(TableFormattingConstants.UNDERLINE_OFF); } } }; cellFontUnderline.addActionListener(cellFontUnderlineListener); } private void setUpColorComboBoxes() { // Build Color choosers rowForegroundColorComboBox = new JComboBox(TableFormattingConstants.ForegroundColors); setAccessibleName(rowForegroundColorComboBox,"ROW_FONT_COLOR"); rowForegroundColorComboBox.setName("Row_colorComboBox"); rowForegroundColorComboBox.setToolTipText("Font color"); rowForegroundColorComboBox.setMaximumRowCount(5); rowForegroundColorComboBox.setPreferredSize(new Dimension(50, 20)); rowForegroundColorComboBox.setSelectedIndex(0); rowForegroundColorComboBox.setRenderer(new ListCellRenderer() { private ColorPanel myColorPanel = new ColorPanel(new Color(0)); @Override public Component getListCellRendererComponent(JList list, Object obj, int arg2, boolean arg3, boolean arg4) { if (obj instanceof Color) { myColorPanel.setColor((Color) obj); return myColorPanel; } return new JPanel(); } }); // Attach listener to show colors in combo box. rowForegroundColorComboBox.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { controller.setRowHeaderFontColor(Color.class.cast(rowForegroundColorComboBox.getSelectedItem())); } }); columnForegroundColorComboBox = new JComboBox(TableFormattingConstants.ForegroundColors); columnForegroundColorComboBox.setName("Column_colorComboBox"); setAccessibleName(columnForegroundColorComboBox,"COL_FONT_COLOR"); columnForegroundColorComboBox.setToolTipText("Font color"); columnForegroundColorComboBox.setMaximumRowCount(5); columnForegroundColorComboBox.setPreferredSize(new Dimension(50, 20)); columnForegroundColorComboBox.setSelectedIndex(0); columnForegroundColorComboBox.setRenderer(new ListCellRenderer() { private ColorPanel myColorPanel = new ColorPanel(new Color(0)); @Override public Component getListCellRendererComponent(JList list, Object obj, int arg2, boolean arg3, boolean arg4) { if (obj instanceof Color) { myColorPanel.setColor((Color) obj); return myColorPanel; } return new JPanel(); } }); // Attach listener to show border styles in combo box. columnForegroundColorComboBox.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { controller.setColumnHeaderFontColor(Color.class.cast(columnForegroundColorComboBox.getSelectedItem())); } }); rowBackgroundColorComboBox = new JComboBox(TableFormattingConstants.ForegroundColors); rowBackgroundColorComboBox.setName("Row_background_colorComboBox"); setAccessibleName(rowBackgroundColorComboBox,"ROW_BACKGROUND_COLOR"); rowBackgroundColorComboBox.setToolTipText("Background color"); rowBackgroundColorComboBox.setMaximumRowCount(5); rowBackgroundColorComboBox.setPreferredSize(new Dimension(50, 20)); rowBackgroundColorComboBox.setSelectedIndex(0); rowBackgroundColorComboBox.setRenderer(new ListCellRenderer() { private ColorPanel myColorPanel = new ColorPanel(new Color(0)); @Override public Component getListCellRendererComponent(JList list, Object obj, int arg2, boolean arg3, boolean arg4) { if (obj instanceof Color) { myColorPanel.setColor((Color) obj); return myColorPanel; } return new JPanel(); } }); // Attach listener to show colors in combo box. rowBackgroundColorComboBox.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { controller.setRowHeaderBackgroundColor(Color.class.cast(rowBackgroundColorComboBox.getSelectedItem())); } }); rowHeaderBorderColorComboBox = new JComboBox(TableFormattingConstants.ForegroundColors); rowHeaderBorderColorComboBox.setName("Row_header_border_colorComboBox"); setAccessibleName(rowHeaderBorderColorComboBox,"ROW_HEADER_BORDER_COLOR"); rowHeaderBorderColorComboBox.setToolTipText("Border color"); rowHeaderBorderColorComboBox.setMaximumRowCount(5); rowHeaderBorderColorComboBox.setPreferredSize(new Dimension(50, 20)); rowHeaderBorderColorComboBox.setSelectedIndex(0); rowHeaderBorderColorComboBox.setRenderer(new ListCellRenderer() { private ColorPanel myColorPanel = new ColorPanel(new Color(0)); @Override public Component getListCellRendererComponent(JList list, Object obj, int arg2, boolean arg3, boolean arg4) { if (obj instanceof Color) { myColorPanel.setColor((Color) obj); return myColorPanel; } return new JPanel(); } }); // Attach listener to show colors in combo box. rowHeaderBorderColorComboBox.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { controller.setRowHeaderBorderColor(Color.class.cast(rowHeaderBorderColorComboBox.getSelectedItem())); } }); columnBackgroundColorComboBox = new JComboBox(TableFormattingConstants.ForegroundColors); columnBackgroundColorComboBox.setName("Column_background_colorComboBox"); setAccessibleName(columnBackgroundColorComboBox,"COL_BACKGROUND_COLOR"); columnBackgroundColorComboBox.setToolTipText("Background color"); columnBackgroundColorComboBox.setMaximumRowCount(5); columnBackgroundColorComboBox.setPreferredSize(new Dimension(50, 20)); columnBackgroundColorComboBox.setSelectedIndex(0); columnBackgroundColorComboBox.setRenderer(new ListCellRenderer() { private ColorPanel myColorPanel = new ColorPanel(new Color(0)); @Override public Component getListCellRendererComponent(JList list, Object obj, int arg2, boolean arg3, boolean arg4) { if (obj instanceof Color) { myColorPanel.setColor((Color) obj); return myColorPanel; } return new JPanel(); } }); // Attach listener to show border styles in combo box. columnBackgroundColorComboBox.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { controller.setColumnHeaderBackgroundColor(Color.class.cast(columnBackgroundColorComboBox.getSelectedItem())); } }); columnHeaderBorderColorComboBox = new JComboBox(TableFormattingConstants.ForegroundColors); columnHeaderBorderColorComboBox.setName("Col_header_border_colorComboBox"); setAccessibleName(columnHeaderBorderColorComboBox,"COL_HEADER_BORDER_COLOR"); columnHeaderBorderColorComboBox.setToolTipText("Border color"); columnHeaderBorderColorComboBox.setMaximumRowCount(5); columnHeaderBorderColorComboBox.setPreferredSize(new Dimension(50, 20)); columnHeaderBorderColorComboBox.setSelectedIndex(0); columnHeaderBorderColorComboBox.setRenderer(new ListCellRenderer() { private ColorPanel myColorPanel = new ColorPanel(new Color(0)); @Override public Component getListCellRendererComponent(JList list, Object obj, int arg2, boolean arg3, boolean arg4) { if (obj instanceof Color) { myColorPanel.setColor((Color) obj); return myColorPanel; } return new JPanel(); } }); // Attach listener to show colors in combo box. columnHeaderBorderColorComboBox.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { controller.setColumnHeaderBorderColor(Color.class.cast(columnHeaderBorderColorComboBox.getSelectedItem())); } }); cellFontColorComboBox = new JComboBox(TableFormattingConstants.ForegroundColors); setAccessibleName(cellFontColorComboBox,"CELL_FONT_COLOR"); cellFontColorComboBox.setName("Cell_colorComboBox"); cellFontColorComboBox.setToolTipText("Font color"); cellFontColorComboBox.setMaximumRowCount(5); cellFontColorComboBox.setPreferredSize(new Dimension(50, 20)); cellFontColorComboBox.setSelectedIndex(0); cellFontColorComboBox.setRenderer(new ListCellRenderer() { private ColorPanel myColorPanel = new ColorPanel(new Color(0)); @Override public Component getListCellRendererComponent(JList list, Object obj, int arg2, boolean arg3, boolean arg4) { if (obj instanceof Color) { myColorPanel.setColor((Color) obj); return myColorPanel; } return new JPanel(); } }); // Attach listener to show border styles in combo box. cellFontColorComboBox.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { controller.setCellFontColor(Color.class.cast(cellFontColorComboBox.getSelectedItem())); } }); cellBackgroundColorComboBox = new JComboBox(TableFormattingConstants.ForegroundColors); setAccessibleName(cellBackgroundColorComboBox,"CELL_BACKGROUND_COLOR"); cellBackgroundColorComboBox.setName("Cell_BackgroundColorComboBox"); cellBackgroundColorComboBox.setToolTipText("Background color"); cellBackgroundColorComboBox.setMaximumRowCount(5); cellBackgroundColorComboBox.setPreferredSize(new Dimension(50, 20)); cellBackgroundColorComboBox.setSelectedIndex(0); cellBackgroundColorComboBox.setRenderer(new ListCellRenderer() { private ColorPanel myColorPanel = new ColorPanel(new Color(0)); @Override public Component getListCellRendererComponent(JList list, Object obj, int arg2, boolean arg3, boolean arg4) { if (obj instanceof Color) { myColorPanel.setColor((Color) obj); return myColorPanel; } return new JPanel(); } }); // Attach listener to show border styles in combo box. cellBackgroundColorComboBox.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { controller.setCellBackgroundColor(Color.class.cast(cellBackgroundColorComboBox.getSelectedItem())); } }); } /** * A JPanel that draws a color, for color dropdowns. * @author vwoeltje */ private static class ColorPanel extends JPanel { /** * */ private static final long serialVersionUID = 5931786628055358422L; private static final Dimension COMBO_BOX_DIMENSION = new Dimension(50, 20); Color color; public ColorPanel(Color c) { color = c; setBackground(c); this.setPreferredSize(COMBO_BOX_DIMENSION); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); g.setColor(color); g.fillRect(0, 0, getWidth(), getHeight()); } protected void setColor(Color aColor) { this.color = aColor; } } }