/*
* Geotoolkit - An Open Source Java GIS Toolkit
* http://www.geotoolkit.org
*
* (C) 2012-2013, Geomatys
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*/
package org.geotoolkit.gui.swing.etl;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.Point;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import org.apache.sis.feature.FeatureExt;
import org.geotoolkit.gui.swing.propertyedit.JAttributeEditor;
import org.geotoolkit.gui.swing.resource.IconBundle;
import org.geotoolkit.gui.swing.resource.MessageBundle;
import org.geotoolkit.parameter.Parameters;
import org.geotoolkit.process.ProcessDescriptor;
import org.geotoolkit.processing.chain.ConstantUtilities;
import org.geotoolkit.processing.chain.model.ChainDataTypes;
import org.geotoolkit.processing.chain.model.Constant;
import org.geotoolkit.processing.chain.model.DataLink;
import org.geotoolkit.processing.chain.model.ElementProcess;
import org.geotoolkit.processing.chain.model.Parameter;
import org.geotoolkit.processing.chain.model.event.EventChain;
import org.netbeans.api.visual.widget.Scene;
import org.netbeans.api.visual.widget.Widget;
import org.opengis.feature.Property;
import org.opengis.parameter.GeneralParameterDescriptor;
import org.opengis.parameter.ParameterDescriptor;
import org.opengis.parameter.ParameterDescriptorGroup;
import org.opengis.parameter.ParameterValue;
import org.opengis.parameter.ParameterValueGroup;
/**
* Panel used to configure a process (ChainElement) and create constants.
*
* @author Quentin Boileau (Geomatys)
*/
public class JProcessConfigurePanel extends javax.swing.JPanel {
private static final ImageIcon ICON_OFF = IconBundle.getIcon("16_off");
private static final ImageIcon ICON_ON = IconBundle.getIcon("16_on");
private static final int DIVIDER_SIZE = 6;
private ParameterValueGroup parameter;
private final ChainScene scene;
private final EventChain chain;
private final WElementProcess element;
private final ProcessDescriptor descriptor;
private final JDialog optionPaneDialog = new JDialog();
private boolean displayHelp;
private int lastHelpPanelSize;
private int lastParamPanelSize;
private Map<String, WReceivingParameter> parameterWidget; //map parameter name - widget
private Map<String, DataLink> parameterLinks; //map parameter name link
private List<String> parameterActivated; // list of all activated parameters
private List<String> notSupportedInput; //list of not supported type parameters
/**
* Creates new form JProcessConfigurePanel
*/
public JProcessConfigurePanel(final ChainScene scene, final WElementProcess element) {
initComponents();
this.scene = scene;
this.chain = scene.getChain();
this.element = element;
this.parameter = null;
this.parameterWidget = new HashMap<String, WReceivingParameter>();
this.parameterLinks = new HashMap<String, DataLink>();
this.notSupportedInput = new ArrayList<String>();
this.parameterActivated = new ArrayList<String>();
descriptor = element.getProcessDescriptor();
if (!"missing".equals(descriptor.getProcedureDescription().toString())) {
final ParameterDescriptorGroup inputs = descriptor.getInputDescriptor();
this.parameter = inputs.createValue();
final List<WReceivingParameter> wParameters = element.getInputsParameters();
Collections.reverse(wParameters);
final MouseAdapter mouseListener = new ParameterMouseListener();
final FocusListener focusListner = new ParameterFocusListener();
final GridBagConstraints constraint = new GridBagConstraints();
JComponent editor = null;
int index = 0;
for (final WReceivingParameter wParameter : wParameters) {
//get parameter infos
final String paramName = wParameter.getCode();
final ParameterDescriptor paramDesc = ((ParameterDescriptor) wParameter.getDescriptor());
final Class paramClass = paramDesc.getValueClass();
boolean canToggle = true;
Object value = paramDesc.getDefaultValue();
parameterWidget.put(paramName, wParameter);
/*
* PARAMETER LABEL
*/
final JLabel label = new JLabel(paramName);
label.setName(paramName);
label.setOpaque(true);
if (paramDesc.getMinimumOccurs() == 1 && paramDesc.getMaximumOccurs() == 1) {
final Font font = label.getFont();
label.setFont(font.deriveFont(font.getStyle() ^ Font.BOLD));
label.setText(label.getText() + " *");
parameterActivated.add(paramName); //mandatory parameters always activate
canToggle = false;
}
label.addMouseListener(mouseListener);
constraint.gridx = 0;
constraint.gridy = index;
constraint.weightx = 0.0;
constraint.weighty = 0.0;
constraint.fill = GridBagConstraints.BOTH;
//add to panel
guiParametersGridPane.add(label, constraint);
/*
* PARAMETER EDITOR
*/
//init wih a panel
editor = new JAttributeEditor();
editor.setName(paramName);
//search links
final List<DataLink> links = chain.findDataLink(element.getId(), paramName, false);
if (links != null && links.size() == 1) {
final DataLink link = links.get(0);
final Object source = link.getSource(chain);
parameterLinks.put(paramName, link);
/*
* Linked to a constant
*/
if (source instanceof Constant) {
final Constant cst = (Constant) source;
if (!ChainDataTypes.VALID_TYPES.contains(paramClass)) {
value = ConstantUtilities.stringToValue(cst.getValue(), paramClass);
parameter.parameter(paramName).setValue(value);
notSupportedInput.add(paramName);
final JTextField notSupportedTf = new JTextField(MessageBundle.format("inputNotSupported"));
notSupportedTf.setEnabled(false);
editor.add(BorderLayout.CENTER, notSupportedTf);
canToggle = false;
} else {
value = ConstantUtilities.stringToValue(cst.getValue(), paramClass);
parameter.parameter(paramName).setValue(value);
((JAttributeEditor) editor).setProperty(FeatureExt.toProperty(parameter.parameter(paramName)));
parameterActivated.add(paramName);
canToggle = checkEditorFound(editor, paramName);
addRecursivelyFocusListener(editor, focusListner);
}
/*
* Linked to a process output or chain input. -> Disable textfield
*/
} else if(source instanceof ElementProcess || source instanceof Parameter) {
if (source instanceof ElementProcess) {
final ElementProcess chainElement = (ElementProcess) source;
final JTextField field = new JTextField(chainElement.getCode()+" - "+link.getSourceCode());
field.setEnabled(false);
editor.add(BorderLayout.CENTER, field);
} else {
final Parameter inputParam = (Parameter) source;
final JTextField field = new JTextField(chain.getName()+" - "+inputParam.getCode());
field.setEnabled(false);
editor.add(BorderLayout.CENTER, field);
}
canToggle = false;
}
} else {
/*
* No link -> create a default JAttributeEditor if parameter supported
*/
parameter.parameter(paramName).setValue(value);
if (!ChainDataTypes.VALID_TYPES.contains(paramClass)) {
notSupportedInput.add(paramName);
final JTextField notSupportedTf = new JTextField(MessageBundle.format("inputNotSupported"));
notSupportedTf.setEnabled(false);
editor.add(BorderLayout.CENTER, notSupportedTf );
canToggle = false;
} else {
((JAttributeEditor) editor).setProperty(FeatureExt.toProperty(parameter.parameter(paramName)));
canToggle = checkEditorFound(editor, paramName);
addRecursivelyFocusListener(editor, focusListner);
}
}
constraint.gridx = 1;
constraint.gridy = index;
constraint.weightx = 1.0;
constraint.weighty = 0.0;
constraint.fill = GridBagConstraints.HORIZONTAL;
//add to panel
guiParametersGridPane.add(editor, constraint);
/*
* PARAMETER TOGGLE ENABLE/DISABLE EDITOR
*/
JComponent toggle = null;
if (canToggle) {
if (parameterActivated.contains(paramName)) {
toggle = new JButton(ICON_ON);
}else {
toggle = new JButton(ICON_OFF);
}
((JButton)toggle).setBorderPainted(false);
((JButton)toggle).setContentAreaFilled(false);
toggle.setName(paramName);
toggle.addMouseListener(mouseListener);
} else {
toggle = new JPanel();
toggle.setSize(20, 16);
}
constraint.gridx = 2;
constraint.gridy = index;
constraint.weightx = 0.0;
constraint.weighty = 0.0;
constraint.fill = GridBagConstraints.HORIZONTAL;
guiParametersGridPane.add(toggle, constraint);
index++;
}
}
updateParameterEditorState();
this.displayHelp = true;
guiToggleHelpBtn.setText(MessageBundle.format("hideHelp"));
setHelpContent(descriptor);
this.guiParameterTitleLabel.setText(MessageBundle.format("processInputParameters") + descriptor.getIdentifier().getCode() + " : ");
}
/**
* Show or hide help panel.
*
* @param init
*/
private void updateHelpComponent(final boolean init) {
if (init) {
guiSplitPane.setDividerSize(DIVIDER_SIZE);
guiSplitPane.setDividerLocation(0.75);
this.lastParamPanelSize = guiSplitPane.getDividerLocation() - (DIVIDER_SIZE / 2);
this.lastHelpPanelSize = optionPaneDialog.getWidth() - guiSplitPane.getDividerLocation() - DIVIDER_SIZE;
} else {
if (displayHelp) {
guiSplitPane.setDividerSize(DIVIDER_SIZE);
guiSplitPane.setDividerLocation(lastParamPanelSize + (DIVIDER_SIZE / 2));
guiHelpPane.setVisible(true);
guiToggleHelpBtn.setText(MessageBundle.format("hideHelp"));
optionPaneDialog.setSize(lastParamPanelSize + lastHelpPanelSize + DIVIDER_SIZE, optionPaneDialog.getHeight());
} else {
lastParamPanelSize = guiSplitPane.getDividerLocation() - (DIVIDER_SIZE / 2);
lastHelpPanelSize = optionPaneDialog.getWidth() - guiSplitPane.getDividerLocation() - DIVIDER_SIZE;
guiSplitPane.setDividerLocation(lastParamPanelSize + (DIVIDER_SIZE / 2));
guiSplitPane.setDividerSize(0);
guiHelpPane.setVisible(false);
guiToggleHelpBtn.setText(MessageBundle.format("showHelp"));
optionPaneDialog.setSize(lastParamPanelSize + (DIVIDER_SIZE / 2), optionPaneDialog.getHeight());
}
}
optionPaneDialog.repaint();
}
/**
* Toogle help panel state and update view.
*/
private void toggleHelp() {
this.displayHelp = !displayHelp;
updateHelpComponent(false);
}
/**
* Set the help panel content.
*
* @param descriptor can be a ProcessDescriptor or a ParameterDescriptor.
*/
void setHelpContent(final Object descriptor) {
String title = null;
String description = null;
String mandatory = null;
String defaultValue = null;
String[] validValues = null;
String dataType = null;
String dataUnits = null;
if (descriptor instanceof ProcessDescriptor) {
final ProcessDescriptor processDesc = (ProcessDescriptor) descriptor;
title = processDesc.getIdentifier().getCode();
description = processDesc.getProcedureDescription().toString();
} else if (descriptor instanceof ParameterDescriptor) {
final ParameterDescriptor paramDesc = (ParameterDescriptor) descriptor;
title = paramDesc.getName().getCode();
description = paramDesc.getRemarks() != null ? paramDesc.getRemarks().toString() : null;
dataType = paramDesc.getValueClass().getSimpleName();
if (paramDesc.getMinimumOccurs() == 1 && paramDesc.getMaximumOccurs() == 1) {
mandatory = MessageBundle.format("editorHelpMandatory");
} else {
mandatory = MessageBundle.format("editorHelpOptional");
}
defaultValue = String.valueOf(paramDesc.getDefaultValue());
final Set valueSet = paramDesc.getValidValues();
if (valueSet != null) {
List<String> valueString = new ArrayList<String>();
for (Object object : valueSet) {
valueString.add(String.valueOf(object));
}
validValues = valueString.toArray(new String [valueString.size()]);
}
dataUnits = paramDesc.getUnit() != null ? paramDesc.getUnit().toString() : null;
}
//create html string
final StringBuilder sb = new StringBuilder();
sb.append("<html>");
sb.append("<h1>").append(title).append("</h1>");
sb.append("<hr/>");
sb.append("<ul>");
if (mandatory != null) {
sb.append("<li>").append(MessageBundle.format("editorHelpMandatoryLabel")).append(" : ").append(mandatory).append("</li>");
}
if (dataType != null) {
sb.append("<li>").append(MessageBundle.format("editorHelpTypeLabel")).append(" : ").append(dataType).append("</li>");
}
if (defaultValue != null) {
sb.append("<li>").append(MessageBundle.format("editorHelpDefaultLabel")).append(" : ").append(defaultValue).append("</li>");
}
if (validValues != null) {
sb.append("<li>").append(MessageBundle.format("editorHelpValidLabel")).append(" : ").append(Arrays.toString(validValues)).append("</li>");
}
if (dataUnits != null) {
sb.append("<li>").append(MessageBundle.format("editorHelpUnitLabel")).append(" : ").append(dataUnits).append("</li>");
}
sb.append("</ul>");
sb.append("<h3>").append(MessageBundle.format("editorHelpDescriptionLabel")).append(" : ").append("</h3>");
sb.append("<p>").append(description).append("</p>");
sb.append("</html>");
guiHelpTextPane.setText(sb.toString());
}
/**
* Extract parameters from form.
*/
private void updateProcessParameters() {
final Component[] components = guiParametersGridPane.getComponents();
for (Component component : components) {
if (component instanceof JAttributeEditor) {
final JAttributeEditor editor = (JAttributeEditor) component;
final String paramName = editor.getName();
if (parameterActivated.contains(paramName)) {
if (editor.getProperty() != null) {
final Property prop = editor.getProperty();
final Object value = prop.getValue();
parameter.parameter(paramName).setValue(value);
}
}
}
}
}
/**
* Validate parameters.
* @return a list of invalid ParameterValue. If empty, configuration is valid.
*/
private List<ParameterValue> validateParam() {
final List<ParameterValue> unvalidParameters = new ArrayList<ParameterValue>();
final List<GeneralParameterDescriptor> paramDescList = descriptor.getInputDescriptor().descriptors();
for (GeneralParameterDescriptor paramDesc : paramDescList) {
final String paramName = paramDesc.getName().getCode();
//skip not supported inputs
if (!notSupportedInput.contains(paramName) && parameterActivated.contains(paramName)) {
//skip links not from Constant
final DataLink link = parameterLinks.get(paramName);
if (link != null) {
final Object source = link.getSource(chain);
if (! (source instanceof Constant)) {
continue;
}
}
final ParameterValue paramVal = parameter.parameter(paramName);
final boolean valid = Parameters.isValid(paramVal);
if (!valid) {
unvalidParameters.add(paramVal);
}
}
}
return unvalidParameters;
}
/**
* Create constants and links in chain and scene.
*/
private void buildUpdateConstants() {
for (final GeneralParameterDescriptor generalParamDesc : descriptor.getInputDescriptor().descriptors()) {
final ParameterDescriptor paramDesc = (ParameterDescriptor) generalParamDesc;
final ParameterValue paramValue = parameter.parameter(paramDesc.getName().getCode());
final WReceivingParameter paramWidget = parameterWidget.get(paramDesc.getName().getCode());
final String paramName = paramDesc.getName().getCode();
//parameter value not null and different from default value.
if (paramValue.getValue() != null) {
if (paramValue.getValue() instanceof String && ((String)paramValue.getValue()).isEmpty()) {
continue;
}
final DataLink link = parameterLinks.get(paramName);
Constant candidate = null;
if (link != null) {
//delete constant and link
final Object source = link.getSource(chain);
if (source instanceof Constant) {
final Constant cst = (Constant) source;
if (chain.findDataLink(cst.getId(), null, true).size() == 1) {
//if a constant was already linked to the parameter and have only one link
//kepp constant to update her or remove her if associate parameter is activated or not.
if (parameterActivated.contains(paramName)) {
candidate = cst;
} else {
chain.getConstants().remove(cst);
}
}
chain.getDataLinks().remove(link);
}
}
if (parameterActivated.contains(paramName)) {
final String constantValue = ConstantUtilities.valueToString(paramValue.getValue());
//create a new constant with her link.
if (candidate == null) {
// compute scene location of paramWidget.
final Point pinpointLocation = paramWidget != null ? paramWidget.getLocation() : element.getLocation();
Widget parent = element;
while (parent != null && !(parent instanceof Scene)) {
if (parent.getPreferredLocation() != null) {
pinpointLocation.x += parent.getPreferredLocation().x;
pinpointLocation.y += parent.getPreferredLocation().y;
} else {
pinpointLocation.x += parent.getLocation().x;
pinpointLocation.y += parent.getLocation().y;
}
parent = parent.getParentWidget();
}
// Add constant to chain a drow it a paramWidget location. find Wconstant component to get his size and replace him at paramPos - WConstant size.
final Constant constant = new Constant(chain.getNextId(), paramDesc.getValueClass(), constantValue, pinpointLocation.x, pinpointLocation.y);
chain.getConstants().add(constant);
chain.getDataLinks().add(new DataLink(constant.getId(), (String)null, element.getId(), paramName));
scene.validate();
final Widget wConst = scene.getWidget(constant);
if (wConst != null) {
final Double width = wConst.getBounds().getWidth();
final Double height = wConst.getBounds().getHeight();
wConst.setPreferredLocation(new Point(pinpointLocation.x - width.intValue() - 8, pinpointLocation.y - (height.intValue()/2) - 2));
scene.validate();
}
} else {
//update constant and recreate her link.
candidate.setValue(constantValue);
chain.getDataLinks().add(new DataLink(candidate.getId(), (String)null, element.getId(), paramName));
scene.validate();
}
}
}
}
}
/**
* Show error on parameters.
* @param unvalidParam
*/
private void showParamError(final List<ParameterValue> unvalidParam) {
final Component[] components = guiParametersGridPane.getComponents();
for (Component component : components) {
for (ParameterValue unvalid : unvalidParam) {
final String paramName = unvalid.getDescriptor().getName().getCode();
if (component instanceof JLabel) {
final JLabel label = (JLabel) component;
if (paramName.equals(label.getName())) {
label.setForeground(Color.red);
} else {
label.setForeground(UIManager.getColor("Label.foreground"));
}
}
}
}
}
/**
* Add a Focus listener to all child of a component recursively.
* @param component root component.
* @param focusListner listener
*/
private void addRecursivelyFocusListener(final JComponent component, final FocusListener focusListner) {
component.addFocusListener(focusListner);
for (final Component child : component.getComponents()) {
if (child instanceof JComponent) {
addRecursivelyFocusListener((JComponent)child, focusListner);
}
}
}
/**
* For each parameter editor, check if associate parameter is supported and activate.
* If parameter is not supported or not activate, disable editor.
* If parameter is supported and activate enable editor.
*/
private void updateParameterEditorState() {
final Component[] sibilings = guiParametersGridPane.getComponents();
for (final Component component : sibilings) {
if (component instanceof JAttributeEditor) {
final JAttributeEditor editor = (JAttributeEditor) component;
if (editor.getProperty() != null) {
final String editorParameterName = editor.getProperty().getName().tip().toString();
if (parameterActivated.contains(editorParameterName) && !notSupportedInput.contains(editorParameterName)) {
setRecursivelyEnable(editor, true);
} else {
setRecursivelyEnable(editor, false);
}
} else {
setRecursivelyEnable(editor, false);
}
}
}
guiParametersGridPane.repaint();
}
/**
* REcursively set component and his children enable or disable.
* @param component root component
* @param enable true to enable components, false to disable them.
*/
private void setRecursivelyEnable (final JComponent component, final boolean enable) {
component.setEnabled(enable);
for (final Component child : component.getComponents()) {
if (child instanceof JComponent) {
setRecursivelyEnable((JComponent)child, enable);
}
}
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
guiSplitPane = new javax.swing.JSplitPane();
guiHelpPane = new javax.swing.JPanel();
jScrollPane1 = new javax.swing.JScrollPane();
guiHelpTextPane = new javax.swing.JTextPane();
guiParameterPane = new javax.swing.JPanel();
paramScrollPane = new javax.swing.JScrollPane();
paramPanel = new javax.swing.JPanel();
guiParametersGridPane = new javax.swing.JPanel();
guiToggleHelpBtn = new javax.swing.JToggleButton();
guiParameterTitleLabel = new javax.swing.JLabel();
guiSplitPane.setDividerLocation(550);
guiHelpPane.setBackground(new java.awt.Color(254, 254, 254));
guiHelpTextPane.setEditable(false);
guiHelpTextPane.setContentType("text/html"); // NOI18N
guiHelpTextPane.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
jScrollPane1.setViewportView(guiHelpTextPane);
javax.swing.GroupLayout guiHelpPaneLayout = new javax.swing.GroupLayout(guiHelpPane);
guiHelpPane.setLayout(guiHelpPaneLayout);
guiHelpPaneLayout.setHorizontalGroup(
guiHelpPaneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 212, Short.MAX_VALUE)
);
guiHelpPaneLayout.setVerticalGroup(
guiHelpPaneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 477, Short.MAX_VALUE)
);
guiSplitPane.setRightComponent(guiHelpPane);
paramPanel.setLayout(new java.awt.BorderLayout());
guiParametersGridPane.setLayout(new java.awt.GridBagLayout());
paramPanel.add(guiParametersGridPane, java.awt.BorderLayout.NORTH);
paramScrollPane.setViewportView(paramPanel);
org.openide.awt.Mnemonics.setLocalizedText(guiToggleHelpBtn, "toggleHelp"); // NOI18N
guiToggleHelpBtn.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
guiToggleHelpBtnActionPerformed(evt);
}
});
org.openide.awt.Mnemonics.setLocalizedText(guiParameterTitleLabel, "title"); // NOI18N
javax.swing.GroupLayout guiParameterPaneLayout = new javax.swing.GroupLayout(guiParameterPane);
guiParameterPane.setLayout(guiParameterPaneLayout);
guiParameterPaneLayout.setHorizontalGroup(
guiParameterPaneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(guiParameterPaneLayout.createSequentialGroup()
.addContainerGap()
.addComponent(guiParameterTitleLabel)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(guiToggleHelpBtn))
.addComponent(paramScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 550, Short.MAX_VALUE)
);
guiParameterPaneLayout.setVerticalGroup(
guiParameterPaneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(guiParameterPaneLayout.createSequentialGroup()
.addContainerGap()
.addGroup(guiParameterPaneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(guiToggleHelpBtn)
.addComponent(guiParameterTitleLabel))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(paramScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 431, Short.MAX_VALUE))
);
guiSplitPane.setLeftComponent(guiParameterPane);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(guiSplitPane, javax.swing.GroupLayout.Alignment.TRAILING)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(guiSplitPane, javax.swing.GroupLayout.DEFAULT_SIZE, 477, Short.MAX_VALUE)
);
}// </editor-fold>//GEN-END:initComponents
private void guiToggleHelpBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_guiToggleHelpBtnActionPerformed
toggleHelp();
}//GEN-LAST:event_guiToggleHelpBtnActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JPanel guiHelpPane;
private javax.swing.JTextPane guiHelpTextPane;
private javax.swing.JPanel guiParameterPane;
private javax.swing.JLabel guiParameterTitleLabel;
private javax.swing.JPanel guiParametersGridPane;
private javax.swing.JSplitPane guiSplitPane;
private javax.swing.JToggleButton guiToggleHelpBtn;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JPanel paramPanel;
private javax.swing.JScrollPane paramScrollPane;
// End of variables declaration//GEN-END:variables
/**
* Open JDialog of editor.
*/
public void showDialog() {
final JOptionPane optPane = new JOptionPane(this,
JOptionPane.PLAIN_MESSAGE, JOptionPane.OK_CANCEL_OPTION);
optPane.addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent e) {
if (e.getPropertyName().equals("value")) {
switch ((Integer) e.getNewValue()) {
case JOptionPane.OK_OPTION:
updateProcessParameters();
final List<ParameterValue> unvalidParam = validateParam();
if (unvalidParam.isEmpty()) {
buildUpdateConstants();
optionPaneDialog.dispose();
} else {
showParamError(unvalidParam);
}
break;
case JOptionPane.CANCEL_OPTION:
optionPaneDialog.dispose();
break;
}
}
}
});
optionPaneDialog.setTitle(MessageBundle.format("configProcessTitle")+descriptor.getIdentifier().getCode());
optionPaneDialog.setContentPane(optPane);
optionPaneDialog.pack();
optionPaneDialog.setResizable(true);
optionPaneDialog.setLocationRelativeTo(null);
optionPaneDialog.setModal(true);
optionPaneDialog.setVisible(true);
updateHelpComponent(true);
}
/**
* Check if JAttributeEditor found an editor for this input.
* If not create a disable textfield Not supported input and return false.
* @param editor
* @param paramName
* @return false if editor not found, true otherwise.
*/
private boolean checkEditorFound(JComponent editor, String paramName) {
if (editor.getComponentCount() == 0) {
parameterActivated.remove(paramName);
notSupportedInput.add(paramName);
final JTextField notSupportedTf = new JTextField(MessageBundle.format("inputNotSupported"));
notSupportedTf.setEnabled(false);
editor.add(BorderLayout.CENTER, notSupportedTf );
return false;
}
return true;
}
/**
* Mouse listener for parameter table.
*/
private class ParameterMouseListener extends MouseAdapter {
@Override
public void mouseEntered(MouseEvent e) {
final JComponent source = (JComponent) e.getSource();
if (!(source instanceof JButton)) {
final String parameterName = source.getName();
if (parameterName != null) {
final ParameterDescriptor paramDesc = (ParameterDescriptor) descriptor.getInputDescriptor().descriptor(parameterName);
setHelpContent(paramDesc);
}
if (source != null) {
final Component[] sibilings = guiParametersGridPane.getComponents();
for (final Component component : sibilings) {
if (component instanceof JLabel) {
final JLabel label = (JLabel) component;
if (label.getName().equals(parameterName)) {
source.setBackground(UIManager.getColor("List.selectionBackground"));
} else {
component.setBackground(UIManager.getColor("Label.background"));
}
}
}
guiParametersGridPane.repaint();
}
}
}
@Override
public void mouseExited(MouseEvent e) {
final Component[] sibilings = guiParametersGridPane.getComponents();
for (final Component component : sibilings) {
if (component instanceof JLabel) {
component.setBackground(UIManager.getColor("Label.background"));
}
}
setHelpContent(descriptor);
}
/**
* Event used to toggle editor state (enable/disable)
* @param e
*/
@Override
public void mouseClicked(MouseEvent e) {
if (e.getSource() instanceof JButton) {
final JButton btn = (JButton) e.getSource();
final String paramName = btn.getName();
if (parameterActivated.contains(paramName)) {
btn.setIcon(ICON_OFF);
parameterActivated.remove(paramName);
} else {
btn.setIcon(ICON_ON);
parameterActivated.add(paramName);
}
updateParameterEditorState();
}
}
}
/**
* FocusListener used by parameter editor.
*/
private class ParameterFocusListener extends FocusAdapter {
@Override
public void focusGained(FocusEvent e) {
final JAttributeEditor editor = findAttributEditor((JComponent)e.getSource());
if (editor != null) {
final String parameterName = editor.getProperty().getName().tip().toString();
// update help panel
final ParameterDescriptor paramDesc = (ParameterDescriptor)descriptor.getInputDescriptor().descriptor(parameterName);
setHelpContent(paramDesc);
//color field label background
final Component[] sibilings = guiParametersGridPane.getComponents();
for (final Component component : sibilings) {
if (component instanceof JLabel) {
if (((JLabel) component).getName().equals(parameterName)) {
component.setBackground(UIManager.getColor("List.selectionBackground"));
} else {
component.setBackground(UIManager.getColor("Label.background"));
}
}
}
editor.setBackground(UIManager.getColor("List.selectionBackground"));
}
super.focusGained(e);
}
@Override
public void focusLost(FocusEvent e) {
final JAttributeEditor editor = findAttributEditor((JComponent)e.getSource());
if (editor != null) {
final String parameterName = editor.getProperty().getName().tip().toString();
// update help panel
final ParameterDescriptor paramDesc = (ParameterDescriptor)descriptor.getInputDescriptor().descriptor(parameterName);
setHelpContent(paramDesc);
//color field label background
final Component[] sibilings = guiParametersGridPane.getComponents();
for (final Component component : sibilings) {
if (component instanceof JLabel) {
if (((JLabel) component).getName().equals(parameterName)) {
component.setBackground(UIManager.getColor("Label.background"));
}
}
}
editor.setBackground(UIManager.getColor("Desktop.background"));
}
super.focusLost(e);
}
private JAttributeEditor findAttributEditor(JComponent component) {
if (component instanceof JAttributeEditor || component.equals(guiParametersGridPane)) {
if (component instanceof JAttributeEditor) {
return (JAttributeEditor)component;
} else {
return null;
}
} else {
return findAttributEditor((JComponent)component.getParent());
}
}
}
}