/*******************************************************************************
* 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.AbstractComponent;
import gov.nasa.arc.mct.gui.View;
import gov.nasa.arc.mct.roles.events.PropertyChangeEvent;
import gov.nasa.arc.mct.services.component.ViewInfo;
import gov.nasa.arc.mct.util.StandardComboBoxColors;
import gov.nasa.arc.mct.util.ext.commands.CmdProcessBuilder;
import gov.nasa.jsc.mct.executable.buttons.ExecutableButtonComponent;
import gov.nasa.jsc.mct.executable.buttons.ExecutableButtonModel;
import gov.nasa.jsc.mct.executable.buttons.ExecutableButtonSettings;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
import javax.swing.UIManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@SuppressWarnings("serial")
public class ExecutableButtonManifestation extends View {
private static final Logger logger = LoggerFactory.getLogger(ExecutableButtonManifestation.class);
private static final Logger ADVISORY_LOGGER = LoggerFactory.getLogger("gov.nasa.jsc.advisory.service");
private static final ResourceBundle bundle = ResourceBundle.getBundle("ResourceBundle");
private static final int MAX_BASE_DISPLAY_NAME_LENGTH = 30;
private static final String ELLIPSE = "...";
private ExecutableButtonModel execButtonModel;
private JButton execButton;
private String execCmd;
private String baseDisplayName;
private AbstractComponent component;
public static final String VIEW_NAME = bundle.getString("ViewRoleName");
private ExecutableButtonSettings execButtonSettings;
private List<Color> colorList = new ArrayList<Color>();
private String labelText;
private ExecutableButtonControlPanel execButtonControlPanel;
public ExecutableButtonManifestation(AbstractComponent ac, ViewInfo vi) {
super(ac,vi);
setBackground(UIManager.getColor("background"));
execButtonSettings = new ExecutableButtonSettings(this);
this.setOpaque(true);
createExecButtons();
}
public ExecutableButtonSettings getSettings() {
return execButtonSettings;
}
@Override
protected JComponent initializeControlManifestation() {
initializeExecButtonControlPanel();
return new JScrollPane(execButtonControlPanel,
ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
}
private void initializeExecButtonControlPanel() {
execButtonControlPanel = new ExecutableButtonControlPanel(this);
}
public List<Color> getSavedColorList() {
return colorList;
}
public void buildFromSettings() {
colorList = execButtonSettings.getSavedColors();
logger.debug("Saved settings colorList: {}", colorList);
if ( (execButtonSettings.getSetting(StandardComboBoxColors.EXEC_BUTTON_LABEL_TEXT) != null)
&& !((String)execButtonSettings.getSetting(StandardComboBoxColors.EXEC_BUTTON_LABEL_TEXT)).isEmpty()) {
labelText = (String)execButtonSettings.getSetting(StandardComboBoxColors.EXEC_BUTTON_LABEL_TEXT);
execButton.setText(labelText);
} else {
if (baseDisplayName == null) {
execButton.setText("");
logger.error("Base Display Name is NULL.");
} else {
execButton.setText(baseDisplayName);
}
}
if (execButtonSettings.getSetting(StandardComboBoxColors.BACKGROUND_COLOR) != null) {
execButton.setBackground((Color)execButtonSettings.getSetting(StandardComboBoxColors.BACKGROUND_COLOR));
}
if (execButtonSettings.getSetting(StandardComboBoxColors.FOREGROUND_COLOR) != null) {
execButton.setForeground((Color)execButtonSettings.getSetting(StandardComboBoxColors.FOREGROUND_COLOR));
}
}
private void createExecButtons() {
Rectangle bounds = this.getBounds().getBounds();
int padding = Math.min(bounds.width, bounds.height) / 20;
bounds.grow(-padding, -padding);
component = getManifestedComponent();
execButtonModel = ExecutableButtonComponent.class.cast(getManifestedComponent()).getModel();
execCmd = execButtonModel.getData().getExecCmd();
baseDisplayName = component.getDisplayName();
if (execCmd != null) {
execCmd = execCmd.trim();
}
if (baseDisplayName != null) {
baseDisplayName = baseDisplayName.trim();
}
String cmdLine = "Exec Cmd: " + execCmd;
if (baseDisplayName.length() > MAX_BASE_DISPLAY_NAME_LENGTH) {
baseDisplayName = baseDisplayName.substring(0, MAX_BASE_DISPLAY_NAME_LENGTH) + ELLIPSE;
}
execButton = new JButton(baseDisplayName);
execButton.setBounds(bounds);
execButton.setToolTipText(cmdLine);
execButton.setActionCommand(execCmd);
buildFromSettings();
logger.debug("execButton.getBackground(): " + execButton.getBackground() + ", execButton.getForeground(): " + execButton.getForeground()
+ ", execButton.getColorModel(): " + execButton.getColorModel());
execButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
buttonPressed();
}
});
setLayout(new BorderLayout());
add(execButton, BorderLayout.CENTER);
if (execButtonControlPanel == null) {
initializeExecButtonControlPanel();
}
}
private void updateExecCmdValue() {
execCmd = execButtonModel.getData().getExecCmd();
String cmdLine = "Exec Cmd: " + execCmd;
baseDisplayName = component.getDisplayName();
execButton.setText(baseDisplayName);
execButton.setToolTipText(cmdLine);
execButton.setActionCommand(execCmd);
}
public void buttonPressed() {
execCmd = execButtonModel.getData().getExecCmd();
if (execCmd == null) {
String msg = "Button execute command is null.";
logger.error(msg);
ADVISORY_LOGGER.error(msg);
}
if (execCmd.endsWith("&")) {
execCmd = execCmd.replace("&", "");
}
List<String> commandList = new ArrayList<String>();
commandList.add(execCmd);
CmdProcessBuilder cmdProcessBuilder = new CmdProcessBuilder();
if (cmdProcessBuilder.execMultipleCommands("", commandList)) {
String successMsg = bundle.getString("ExecButtonSuccessMsg");
successMsg += "Execution Message: " + cmdProcessBuilder.getExecSuccessfulMsg();
ADVISORY_LOGGER.info(successMsg);
} else {
String errorMsg = bundle.getString("ExecButtonFailedMsg");
errorMsg += "Error Message: " + cmdProcessBuilder.getExecFailedMsg();
ADVISORY_LOGGER.error(errorMsg);
}
}
@Override
public void updateMonitoredGUI() {
updateExecCmdValue();
buildFromSettings();
}
@Override
public void updateMonitoredGUI(PropertyChangeEvent evt) {
updateExecCmdValue();
buildFromSettings();
}
}