/*******************************************************************************
* 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.jsc.mct.executable.buttons.view;
import gov.nasa.arc.mct.components.ExtendedProperties;
import gov.nasa.arc.mct.util.StandardComboBoxColors;
import gov.nasa.jsc.mct.executable.buttons.ExecutableButtonSettings;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.FlowLayout;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Collection;
import java.util.Map;
import java.util.ResourceBundle;
import javax.swing.BorderFactory;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.ListCellRenderer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@SuppressWarnings("serial")
public class ExecutableButtonControlPanel extends JPanel {
private static final Logger logger = LoggerFactory.getLogger(ExecutableButtonControlPanel.class);
private static final ResourceBundle bundle = ResourceBundle.getBundle("ResourceBundle");
private ExecutableButtonSettings execButtonSettings;
private ExecutableButtonManifestation manifestation;
private JLabel buttonLabel;
private JLabel buttonLabelColor;
private JLabel buttonBGColor;
private JTextField buttonField;
private String buttonText;
private JComboBox buttonColorComboBox;
private JComboBox buttonBGColorComboBox;
private Map<String, Color> colorMap;
private Map<String, String> defaultSettingsMap;
private JPanel mainComponent;
private StandardComboBoxColors stdComboBoxColors;
public ExecutableButtonControlPanel(ExecutableButtonManifestation manifestation) {
this.manifestation = manifestation;
initializeStandardComboBoxColors();
execButtonSettings = manifestation.getSettings();
buildView(manifestation);
}
private void initializeStandardComboBoxColors() {
stdComboBoxColors = new StandardComboBoxColors();
colorMap = stdComboBoxColors.getColorMap();
defaultSettingsMap = stdComboBoxColors.getDefaultSettingsMap();
logger.debug("colorMap: {}", colorMap);
}
private void buildView(ExecutableButtonManifestation manifestation) {
this.setLayout(new FlowLayout(FlowLayout.LEADING));
this.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
mainComponent = new JPanel(new GridBagLayout());
mainComponent.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2));
mainComponent.setAlignmentY(TOP_ALIGNMENT);
mainComponent.setAlignmentX(LEFT_ALIGNMENT);
if (execButtonSettings.getSetting(StandardComboBoxColors.EXEC_BUTTON_LABEL_TEXT) != null) {
buttonText = (String)execButtonSettings.getSetting(StandardComboBoxColors.EXEC_BUTTON_LABEL_TEXT);
}
buttonField = new JTextField(buttonText, ExecutableButtonSettings.LABEL_TEXT_SIZE);
buttonField.setToolTipText(buttonText);
buttonField.setEditable(true);
buttonField.addFocusListener(new FocusListener() {
@Override
public void focusLost(FocusEvent e) {
String currentText = buttonField.getText();
if (currentText != null) {
currentText = currentText.trim();
}
if (!currentText.equals(buttonText)) {
saveSettings(StandardComboBoxColors.EXEC_BUTTON_LABEL_TEXT, currentText);
buttonText = currentText;
}
}
@Override
public void focusGained(FocusEvent e) {
}
});
buttonField.addKeyListener(new KeyListener() {
@Override
public void keyPressed(KeyEvent keyEvt) {
int key = keyEvt.getKeyCode();
if ( (key == KeyEvent.VK_ENTER) || (key == KeyEvent.VK_TAB) ) {
saveSettings(StandardComboBoxColors.EXEC_BUTTON_LABEL_TEXT, buttonField.getText());
}
}
@Override
public void keyReleased(KeyEvent keyEvt) {
}
@Override
public void keyTyped(KeyEvent keyEvt) {
}
});
instrumentNamesForButtonLabel();
buttonColorComboBox = makeComboBox("ButtonLabelColor", stdComboBoxColors.getSupportedColors());
buttonBGColorComboBox = makeComboBox("ButtonBGColor", stdComboBoxColors.getSupportedColors());
buttonLabel = new JLabel(bundle.getString("ButtonLabel"));
buttonLabel.setLabelFor(buttonField);
buttonLabelColor = new JLabel(bundle.getString("ButtonLabelColor"));
buttonLabelColor.setLabelFor(buttonColorComboBox);
buttonBGColor = new JLabel(bundle.getString("ButtonBGColor"));
buttonBGColor.setLabelFor(buttonBGColorComboBox);
instrumentLabelNames();
mainComponent.add(buttonLabel, stdComboBoxColors.getConstraints(1,0)); mainComponent.add(buttonField, stdComboBoxColors.getConstraints(1,1));
mainComponent.add(buttonLabelColor, stdComboBoxColors.getConstraints(2,0)); mainComponent.add(buttonColorComboBox, stdComboBoxColors.getConstraints(2,1));
mainComponent.add(buttonBGColor, stdComboBoxColors.getConstraints(3,0)); mainComponent.add(buttonBGColorComboBox, stdComboBoxColors.getConstraints(3,1));
add(mainComponent, BorderLayout.NORTH);
}
private void saveSettings(String name, String text) {
execButtonSettings.setByObject(name, text);
execButtonSettings.updateManifestation();
}
private void instrumentLabelNames() {
buttonLabel.getAccessibleContext().setAccessibleName("buttonLabel");
buttonLabelColor.getAccessibleContext().setAccessibleName("buttonLabelColor");
buttonBGColor.getAccessibleContext().setAccessibleName("buttonBGColor");
}
public Object getSetting(String name) {
String choice = getProps(name);
if (colorMap.containsKey(choice)) {
return colorMap.get(choice);
} else {
return choice;
}
}
private boolean isValidKey(String key) {
return defaultSettingsMap.containsKey(key);
}
private String getProps(String key) {
String value = manifestation.getViewProperties().getProperty(key, String.class);
if (value == null) {
if (!isValidKey(key)) return null;
setProps(key, defaultSettingsMap.get(key));
value = defaultSettingsMap.get(key);
}
return value;
}
private void setProps(String key, String value) {
ExtendedProperties viewProperties = manifestation.getViewProperties();
viewProperties.setProperty(key, value);
}
private JComboBox makeComboBox(String name, Collection<?> items) {
JComboBox box = new JComboBox (items.toArray());
box.setName(name);
box.setRenderer(new ListCellRenderer() {
@Override
public Component getListCellRendererComponent(JList list,
Object obj, int arg2, boolean arg3, boolean arg4) {
if (obj instanceof Color) {
return new StandardComboBoxColors.ColorPanel((Color) obj);
}
return new JPanel();
}
});
Object selected = execButtonSettings.getSetting(name);
if (selected != null) {
box.setSelectedItem(selected);
} else if (items.size() > 0) {
box.setSelectedIndex(0);
}
box.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
JComponent comp = (JComponent)evt.getSource();
Object value = null;
String name = comp.getName();
if (comp instanceof JComboBox) {
value = ((JComboBox) comp).getSelectedItem();
}
if (value != null) {
execButtonSettings.setByObject(name, value);
execButtonSettings.updateManifestation();
}
}
});
return box;
}
private void instrumentNamesForButtonLabel() {
buttonField.getAccessibleContext().setAccessibleName("buttonLabelTextField");
}
}