/* * RapidMiner * * Copyright (C) 2001-2008 by Rapid-I and the contributors * * Complete list of developers available at our web site: * * http://rapid-i.com * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program 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 Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see http://www.gnu.org/licenses/. */ package com.rapidminer.gui.properties; import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.GridBagLayout; import java.awt.GridBagConstraints; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.util.LinkedHashMap; import java.util.List; import java.util.LinkedList; import javax.swing.DefaultListModel; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JDialog; import javax.swing.JFormattedTextField; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JScrollPane; import javax.swing.JTextField; import javax.swing.ListSelectionModel; import javax.swing.BorderFactory; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import com.rapidminer.gui.RapidMinerGUI; import com.rapidminer.gui.tools.ExtendedJList; import com.rapidminer.gui.tools.ExtendedListModel; import com.rapidminer.gui.tools.SwingTools; import com.rapidminer.gui.wizards.ConfigurationListener; import com.rapidminer.Process; import com.rapidminer.operator.Operator; import com.rapidminer.operator.OperatorChain; import com.rapidminer.operator.meta.ParameterIteratingOperatorChain; import com.rapidminer.parameter.Parameters; import com.rapidminer.parameter.ParameterType; import com.rapidminer.parameter.ParameterTypeBoolean; import com.rapidminer.parameter.ParameterTypeCategory; import com.rapidminer.parameter.ParameterTypeFile; import com.rapidminer.parameter.ParameterTypeNumber; import com.rapidminer.parameter.ParameterTypeString; import com.rapidminer.parameter.ParameterTypeStringCategory; import com.rapidminer.parameter.ParameterTypeValue; import com.rapidminer.parameter.value.ParameterValues; import com.rapidminer.parameter.value.ParameterValueGrid; import com.rapidminer.parameter.value.ParameterValueList; import com.rapidminer.parameter.value.ParameterValueRange; import com.rapidminer.tools.Tools; /** * A Dialog which lets the user select and configure parameter values and * ranges for optimization purposes. * * @author Tobias Malbrecht * @version $Id: ConfigureParameterOptimizationDialog.java,v 1.6 2008/08/07 09:04:36 tobiasmalbrecht Exp $ */ public class ConfigureParameterOptimizationDialog extends JDialog { private static final long serialVersionUID = 187660784321413390L; private boolean ok = false; private int mode; private ExtendedListModel operatorListModel; private ExtendedListModel parametersListModel; private ExtendedListModel selectedParametersListModel; private ExtendedJList operatorList; private ExtendedJList parametersList; private ExtendedJList selectedParametersList; private JLabel minValueJLabel; private JLabel maxValueJLabel; private JLabel stepsValueJLabel; private JLabel gridScaleValueJLabel; private JFormattedTextField minValueTextField; private JFormattedTextField maxValueTextField; private JFormattedTextField stepsValueTextField; private JComboBox gridScaleValueComboBox; private JList categoriesList; private JList selectedCategoriesList; private DefaultListModel categoriesListModel; private DefaultListModel selectedCategoriesListModel; private JTextField createValueTextField; private JButton createValueButton; private JButton addValueButton; private JButton removeValueButton; private JRadioButton choseGridRadioButton; private JRadioButton choseListRadioButton; private JLabel infoLabel; private ConfigurationListener listener; private Process process; private LinkedHashMap<String,ParameterValues> parameterValuesMap; public ConfigureParameterOptimizationDialog(ConfigurationListener listener) { super(RapidMinerGUI.getMainFrame(), "Specify parameters...", true); this.listener = listener; process = listener.getProcess(); parameterValuesMap = new LinkedHashMap<String,ParameterValues>(); initializeDialog(); ParameterIteratingOperatorChain parameterOperatorChain = (ParameterIteratingOperatorChain)listener; this.mode = parameterOperatorChain.getParameterValueMode(); List<ParameterValues> readParameterValues = null; try { List parameterValueList = parameterOperatorChain.getParameterList(ParameterIteratingOperatorChain.PARAMETER_PARAMETERS); readParameterValues = parameterOperatorChain.parseParameterValues(parameterValueList); } catch (Exception e) { parameterOperatorChain.logWarning(e.getMessage()); } if (readParameterValues != null) { for (ParameterValues parameterValue : readParameterValues) { addParameter(parameterValue); } } updateInfoLabel(); } private void initializeDialog() { getContentPane().setLayout(new BorderLayout()); JPanel selectionPanel = new JPanel(new GridBagLayout()); GridBagConstraints c = new GridBagConstraints(); // initialize selection lists operatorListModel = new ExtendedListModel(); for (Operator op : ((OperatorChain)listener).getAllInnerOperators()) { String descriptionText = op.getOperatorDescription().getLongDescriptionHTML(); if (descriptionText == null) { descriptionText = op.getOperatorDescription().getShortDescription(); } StringBuffer toolTipText = new StringBuffer("<b>Description: </b>" + descriptionText); if (op != null) { toolTipText.append(Tools.getLineSeparator() + "<b>Input:</b> " + SwingTools.getStringFromClassArray(op.getInputClasses())); toolTipText.append(Tools.getLineSeparator() + "<b>Output:</b> " + SwingTools.getStringFromClassArray(op.getOutputClasses())); } operatorListModel.addElement(op, SwingTools.transformToolTipText(toolTipText.toString())); } operatorList = new ExtendedJList(operatorListModel); operatorList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); operatorList.setLayoutOrientation(JList.VERTICAL); parametersListModel = new ExtendedListModel(); parametersList = new ExtendedJList(parametersListModel); parametersList.setLayoutOrientation(JList.VERTICAL); operatorList.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { int index = operatorList.getSelectedIndex(); if (index != -1) { Operator op = (Operator)operatorList.getModel().getElementAt(index); updateParameterListModel(op); } } }); selectedParametersListModel = new ExtendedListModel(); selectedParametersList = new ExtendedJList(selectedParametersListModel); selectedParametersList.setLayoutOrientation(JList.VERTICAL); selectedParametersList.getSelectionModel().addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { showParameterValues((String) selectedParametersList.getSelectedValue()); } }); JPanel parameterSelectionButtonsPanel = new JPanel(new BorderLayout()); JButton addParameterButton = new JButton(">"); addParameterButton.setToolTipText("Select parameters."); addParameterButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { addSelectedParameters(); } }); JButton removeParameterButton = new JButton("<"); removeParameterButton.setToolTipText("Deselect parameters."); removeParameterButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { removeSelectedParameters(); } }); parameterSelectionButtonsPanel.add(addParameterButton, BorderLayout.NORTH); parameterSelectionButtonsPanel.add(removeParameterButton, BorderLayout.SOUTH); JScrollPane operatorListScrollPane = new JScrollPane(operatorList); JScrollPane parametersListScrollPane = new JScrollPane(parametersList); JScrollPane selectedParametersListScrollPane = new JScrollPane(selectedParametersList); c.gridx=0; c.gridy=0; c.weightx=0.3; c.weighty=1; c.fill = GridBagConstraints.BOTH; operatorListScrollPane.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(7,7,7,7), BorderFactory.createTitledBorder("Operators"))); selectionPanel.add(operatorListScrollPane, c); c.gridx=1; c.gridy=0; c.weightx=0.3; c.weighty=1; c.fill = GridBagConstraints.BOTH; parametersListScrollPane.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(7,7,7,7), BorderFactory.createTitledBorder("Parameters"))); selectionPanel.add(parametersListScrollPane, c); c.gridx=2; c.gridy=0; c.weightx=0.1; c.weighty=1; c.fill = GridBagConstraints.NONE; selectionPanel.add(parameterSelectionButtonsPanel,c); c.gridx=3; c.gridy=0; c.weightx=0.3; c.weighty=1; c.fill = GridBagConstraints.BOTH; selectedParametersListScrollPane.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(7,7,7,7), BorderFactory.createTitledBorder("Selected Parameters"))); selectionPanel.add(selectedParametersListScrollPane,c); getContentPane().add(selectionPanel,BorderLayout.NORTH); JPanel gridPanel = new JPanel(new GridBagLayout()); gridPanel.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(7,7,7,7), BorderFactory.createTitledBorder("Grid/Range"))); c.insets=new Insets(0,10,2,10); c.gridy=0; c.weightx=0.25; c.gridx=0; minValueJLabel = new JLabel("Min"); minValueJLabel.setEnabled(false); gridPanel.add(minValueJLabel, c); c.gridx=1; maxValueJLabel = new JLabel("Max"); maxValueJLabel.setEnabled(false); gridPanel.add(maxValueJLabel, c); c.gridx=2; stepsValueJLabel = new JLabel("Steps"); stepsValueJLabel.setEnabled(false); gridPanel.add(stepsValueJLabel, c); c.gridx=3; gridScaleValueJLabel = new JLabel("Scale"); gridScaleValueJLabel.setEnabled(false); gridPanel.add(gridScaleValueJLabel, c); minValueTextField = new JFormattedTextField(); minValueTextField.setValue(Double.valueOf(0)); minValueTextField.setToolTipText("Minimum value of grid or range."); minValueTextField.setEnabled(false); minValueTextField.addFocusListener(new FocusListener() { public void focusGained(FocusEvent e) { } public void focusLost(FocusEvent e) { finishTextFieldEdit(minValueTextField); } }); minValueTextField.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { finishTextFieldEdit(maxValueTextField); minValueTextField.transferFocus(); } }); c.insets=new Insets(2,10,7,10); c.gridx=0; c.gridy=1; c.fill = GridBagConstraints.BOTH; gridPanel.add(minValueTextField, c); maxValueTextField = new JFormattedTextField(); maxValueTextField.setValue(new Double(0)); maxValueTextField.setToolTipText("Maximum value of grid or range."); maxValueTextField.setEnabled(false); maxValueTextField.addFocusListener(new FocusListener() { public void focusGained(FocusEvent e) { } public void focusLost(FocusEvent e) { finishTextFieldEdit(maxValueTextField); } }); maxValueTextField.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { finishTextFieldEdit(maxValueTextField); maxValueTextField.transferFocus(); } }); c.gridx=1; c.fill = GridBagConstraints.BOTH; gridPanel.add(maxValueTextField, c); stepsValueTextField = new JFormattedTextField(); stepsValueTextField.setValue(Integer.valueOf(0)); stepsValueTextField.setToolTipText("Number of steps in grid."); stepsValueTextField.setEnabled(false); stepsValueTextField.addFocusListener(new FocusListener() { public void focusGained(FocusEvent e) { } public void focusLost(FocusEvent e) { finishTextFieldEdit(stepsValueTextField); } }); stepsValueTextField.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { finishTextFieldEdit(stepsValueTextField); stepsValueTextField.transferFocus(); } }); c.gridx=2; c.fill = GridBagConstraints.BOTH; gridPanel.add(stepsValueTextField, c); if (mode == ParameterIteratingOperatorChain.VALUE_MODE_DISCRETE) { gridScaleValueComboBox = new JComboBox(ParameterValueGrid.SCALES); } else { gridScaleValueComboBox = new JComboBox(); } gridScaleValueComboBox.setToolTipText("Grid scheme."); gridScaleValueComboBox.setEnabled(false); gridScaleValueComboBox.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { updateSelectedNumericalParameterValues(); } }); c.gridx=3; c.fill = GridBagConstraints.HORIZONTAL; gridPanel.add(gridScaleValueComboBox, c); JPanel listPanel = new JPanel(new GridBagLayout()); listPanel.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(7,7,7,7), BorderFactory.createTitledBorder("Value List"))); categoriesListModel = new DefaultListModel(); selectedCategoriesListModel = new DefaultListModel(); createValueTextField = new JTextField(); createValueTextField.setToolTipText("Type in a new value here."); createValueTextField.setEnabled(false); createValueTextField.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { createListValue(); } }); c.insets = new Insets(2,10,7,0); c.gridx = 0; c.gridy = 0; c.weightx = 0.475; c.weighty = 0; c.fill = GridBagConstraints.BOTH; listPanel.add(createValueTextField, c); categoriesList = new JList(categoriesListModel); categoriesList.setToolTipText("Available (or predefined) values."); categoriesList.setEnabled(false); c.insets=new Insets(2,10,7,0); c.gridx=0; c.gridy=1; c.weightx=0.475; c.weighty = 1; c.fill = GridBagConstraints.BOTH; listPanel.add(new JScrollPane(categoriesList), c); createValueButton = new JButton("+"); createValueButton.setToolTipText("Add a new value."); createValueButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { createListValue(); } }); createValueButton.setEnabled(false); c.insets=new Insets(2,0,7,0); c.gridx=1; c.gridy=0; c.weightx= 0.05; c.weighty=0; c.fill = GridBagConstraints.NONE; listPanel.add(createValueButton, c); JPanel valueSelectionButtonsPanel = new JPanel(new BorderLayout()); addValueButton = new JButton(">"); addValueButton.setToolTipText("Select value from list of available values."); addValueButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String selectedParameter = (String)selectedParametersListModel.get(selectedParametersList.getLeadSelectionIndex()); Object[] selectedValues = categoriesList.getSelectedValues(); for (int i = 0; i < selectedValues.length; i++) { categoriesListModel.removeElement(selectedValues[i]); selectedCategoriesListModel.addElement(selectedValues[i]); ParameterValues parameterValue = parameterValuesMap.get(selectedParameter); if (parameterValue instanceof ParameterValueList) { ((ParameterValueList) parameterValue).add((String)selectedValues[i]); } } updateInfoLabel(); } }); addValueButton.setEnabled(false); removeValueButton = new JButton("<"); removeValueButton.setToolTipText("Remove value from selection."); removeValueButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String selectedParameter = (String)selectedParametersListModel.get(selectedParametersList.getLeadSelectionIndex()); Object[] selectedValues = selectedCategoriesList.getSelectedValues(); for (int i = 0; i < selectedValues.length; i++) { selectedCategoriesListModel.removeElement(selectedValues[i]); ParameterValues parameterValue = parameterValuesMap.get(selectedParameter); if (parameterValue instanceof ParameterValueList) { if (((ParameterValueList)parameterValue).contains((String)selectedValues[i])) { categoriesListModel.addElement(selectedValues[i]); ((ParameterValueList)parameterValue).remove((String)selectedValues[i]); } } } updateInfoLabel(); } }); removeValueButton.setEnabled(false); valueSelectionButtonsPanel.add(addValueButton, BorderLayout.CENTER); valueSelectionButtonsPanel.add(removeValueButton, BorderLayout.SOUTH); c.insets=new Insets(2,0,7,0); c.gridx = 1; c.gridy = 1; c.weightx = 0.05; c.gridheight=2; c.fill = GridBagConstraints.NONE; listPanel.add(valueSelectionButtonsPanel, c); selectedCategoriesList = new JList(selectedCategoriesListModel); selectedCategoriesList.setToolTipText("Selected values."); selectedCategoriesList.setEnabled(false); c.insets = new Insets(2,0,7,10); c.gridx = 2; c.gridy = 0; c.gridheight = 2; c.weightx = 0.475; c.fill = GridBagConstraints.BOTH; listPanel.add(new JScrollPane(selectedCategoriesList), c); listPanel.setEnabled(false); JPanel valuePanel = new JPanel(new BorderLayout()); valuePanel.add(gridPanel, BorderLayout.NORTH); valuePanel.add(listPanel, BorderLayout.CENTER); getContentPane().add(valuePanel,BorderLayout.CENTER); JPanel radioButtonPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); choseGridRadioButton = new JRadioButton("Grid", true); choseGridRadioButton.setToolTipText("Use a regular grid for numerical parameters."); choseGridRadioButton.setEnabled(false); choseGridRadioButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (choseGridRadioButton.isSelected()) { choseGridRadioButton.setSelected(true); choseListRadioButton.setSelected(false); switchToGrid(); } } }); radioButtonPanel.add(choseGridRadioButton); choseListRadioButton = new JRadioButton("List", false); choseListRadioButton.setToolTipText("Use a list of single values for numerical parameters."); choseListRadioButton.setEnabled(false); choseListRadioButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (choseListRadioButton.isSelected()) { choseListRadioButton.setSelected(true); choseGridRadioButton.setSelected(false); switchToList(); } } }); radioButtonPanel.add(choseListRadioButton); JPanel infoPanel = new JPanel(new FlowLayout(FlowLayout.CENTER)); infoLabel = new JLabel(); infoPanel.add(infoLabel); JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); JButton okButton = new JButton("Ok"); okButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { ok(); } }); buttonPanel.add(okButton); JButton cancelButton = new JButton("Cancel"); cancelButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { cancel(); } }); buttonPanel.add(cancelButton); JPanel bottomPanel = new JPanel(new BorderLayout()); bottomPanel.add(radioButtonPanel, BorderLayout.WEST); bottomPanel.add(infoPanel, BorderLayout.CENTER); bottomPanel.add(buttonPanel, BorderLayout.EAST); getContentPane().add(bottomPanel, BorderLayout.SOUTH); setSize(Math.max(640, (int)(0.66d * getOwner().getWidth())), Math.max(480, (int)(0.66d * getOwner().getHeight()))); setResizable(false); setLocationRelativeTo(getOwner()); } private void updateInfoLabel() { int size = parameterValuesMap.size(); int combinations = 1; if (mode == ParameterIteratingOperatorChain.VALUE_MODE_DISCRETE) { for (ParameterValues parameterValues : parameterValuesMap.values()) { int values = parameterValues.getNumberOfValues(); combinations *= (values == 0 ? 1 : values); } infoLabel.setText(size + " parameters / " + combinations + " combinations selected"); } else { infoLabel.setText(size + " parameters selected"); } } private void createListValue() { String selectedParameter = (String)selectedParametersListModel.get(selectedParametersList.getLeadSelectionIndex()); String createdValue = createValueTextField.getText(); if (createdValue.equals("")) { return; } else if (selectedCategoriesListModel.contains(createdValue)) { return; } else { selectedCategoriesListModel.addElement(createdValue); ParameterValues parameterValue = parameterValuesMap.get(selectedParameter); if (parameterValue instanceof ParameterValueList) { ((ParameterValueList) parameterValue).add(createdValue); } if (categoriesListModel.contains(createdValue)) { categoriesListModel.removeElement(createdValue); } } createValueTextField.setText(""); updateInfoLabel(); } private void switchToGrid() { String key = (String) selectedParametersList.getSelectedValue(); if (key != null) { ParameterValues oldParameterValues = parameterValuesMap.get(key); if (oldParameterValues instanceof ParameterValueList) { ParameterValues newParameterValues = createNumericalParameterValues(oldParameterValues.getOperator(), oldParameterValues.getParameterType()); parameterValuesMap.put(key, newParameterValues); fillComponents(newParameterValues); } } minValueJLabel.setEnabled(true); maxValueJLabel.setEnabled(true); stepsValueJLabel.setEnabled(true); gridScaleValueJLabel.setEnabled(true); minValueTextField.setEnabled(true); maxValueTextField.setEnabled(true); stepsValueTextField.setEnabled(true); gridScaleValueComboBox.setEnabled(true); categoriesList.setEnabled(false); selectedCategoriesList.setEnabled(false); addValueButton.setEnabled(false); removeValueButton.setEnabled(false); createValueButton.setEnabled(false); createValueTextField.setEnabled(false); updateInfoLabel(); } private void switchToList() { String key = (String) selectedParametersList.getSelectedValue(); if (key != null) { ParameterValues oldParameterValues = parameterValuesMap.get(key); if (oldParameterValues instanceof ParameterValueGrid) { ParameterValues newParameterValues = new ParameterValueList(oldParameterValues.getOperator(), oldParameterValues.getParameterType()); parameterValuesMap.put(key, newParameterValues); fillComponents(newParameterValues); } } minValueJLabel.setEnabled(false); maxValueJLabel.setEnabled(false); stepsValueJLabel.setEnabled(false); gridScaleValueJLabel.setEnabled(false); minValueTextField.setEnabled(false); maxValueTextField.setEnabled(false); stepsValueTextField.setEnabled(false); gridScaleValueComboBox.setEnabled(false); categoriesList.setEnabled(true); selectedCategoriesList.setEnabled(true); addValueButton.setEnabled(true); removeValueButton.setEnabled(true); createValueButton.setEnabled(true); createValueTextField.setEnabled(true); updateInfoLabel(); } private void updateParameterListModel(Operator operator) { parametersListModel.removeAllElements(); List<ParameterType> parameters = operator.getParameterTypes(); for (ParameterType parameter : parameters) { // do not show parameters that are not numerical in continuous mode if (mode == ParameterIteratingOperatorChain.VALUE_MODE_CONTINUOUS) { if (!(parameter instanceof ParameterTypeNumber)) { continue; } } if (!parameterValuesMap.containsKey(operator.getName() + "." + parameter.getKey())) { parametersListModel.addElement(parameter.getKey(), parameter.getDescription()); if (parameter.isNumerical() || parameter instanceof ParameterTypeCategory || parameter instanceof ParameterTypeStringCategory || parameter instanceof ParameterTypeString || parameter instanceof ParameterTypeBoolean || parameter instanceof ParameterTypeFile) { } else { parametersListModel.setEnabled(parameter.getKey(), false); } } } } private void addSelectedParameters() { Object[] parameterKeys = parametersList.getSelectedValues(); Operator operator = (Operator)operatorList.getSelectedValue(); for (int i = 0; i < parameterKeys.length; i++) { String parameterKey = (String)parameterKeys[i]; ParameterType type = operator.getParameterType(parameterKey); ParameterValues parameterValue = null; if (type.isNumerical()) { parameterValue = createNumericalParameterValues(operator, type); } else { if (type instanceof ParameterTypeCategory || type instanceof ParameterTypeStringCategory || type instanceof ParameterTypeString || type instanceof ParameterTypeBoolean || type instanceof ParameterTypeFile) { parameterValue = new ParameterValueList(operator, type, getDefaultListParameterValues(type)); } } if (parameterValue != null) { addParameter(parameterValue); } } updateInfoLabel(); } private void addParameter(ParameterValues parameterValue) { String key = parameterValue.getKey(); parameterValuesMap.put(key, parameterValue); selectedParametersListModel.addElement(key, parameterValue.getParameterType().getDescription()); parametersListModel.removeElement(parameterValue.getParameterType().getKey()); } private void removeSelectedParameters() { Object[] selectedParameters = selectedParametersList.getSelectedValues(); for (int i = 0; i < selectedParameters.length; i++) { String operatorName = ((String)selectedParameters[i]).substring(0, ((String)selectedParameters[i]).indexOf(".")); selectedParametersListModel.removeElement(selectedParameters[i]); parameterValuesMap.remove(selectedParameters[i]); int index = operatorList.getSelectedIndex(); if (index != -1) { Operator op = (Operator)operatorList.getModel().getElementAt(index); if (op == process.getOperator(operatorName)) { updateParameterListModel(op); } } } updateInfoLabel(); } private void enableComponents(ParameterValues parameterValue) { minValueJLabel.setEnabled(false); maxValueJLabel.setEnabled(false); stepsValueJLabel.setEnabled(false); gridScaleValueJLabel.setEnabled(false); minValueTextField.setEnabled(false); maxValueTextField.setEnabled(false); stepsValueTextField.setEnabled(false); gridScaleValueComboBox.setEnabled(false); categoriesList.setEnabled(false); selectedCategoriesList.setEnabled(false); addValueButton.setEnabled(false); removeValueButton.setEnabled(false); createValueButton.setEnabled(false); createValueTextField.setEnabled(false); choseGridRadioButton.setEnabled(false); choseListRadioButton.setEnabled(false); if (parameterValue != null) { ParameterType type = parameterValue.getParameterType(); if (type instanceof ParameterTypeBoolean || type instanceof ParameterTypeCategory) { categoriesList.setEnabled(true); selectedCategoriesList.setEnabled(true); addValueButton.setEnabled(true); removeValueButton.setEnabled(true); } else if (type instanceof ParameterTypeNumber) { if (!(parameterValue instanceof ParameterValueRange)) { choseGridRadioButton.setEnabled(true); choseListRadioButton.setEnabled(true); } if (parameterValue instanceof ParameterValueList) { categoriesList.setEnabled(true); selectedCategoriesList.setEnabled(true); addValueButton.setEnabled(true); removeValueButton.setEnabled(true); createValueTextField.setEnabled(true); createValueButton.setEnabled(true); choseGridRadioButton.setSelected(false); choseListRadioButton.setSelected(true); } else { minValueJLabel.setEnabled(true); maxValueJLabel.setEnabled(true); minValueTextField.setEnabled(true); maxValueTextField.setEnabled(true); if (parameterValue instanceof ParameterValueGrid) { stepsValueJLabel.setEnabled(true); gridScaleValueJLabel.setEnabled(true); stepsValueTextField.setEnabled(true); gridScaleValueComboBox.setEnabled(true); choseGridRadioButton.setSelected(true); choseListRadioButton.setSelected(false); } } } else if (type instanceof ParameterTypeString || type instanceof ParameterTypeStringCategory || type instanceof ParameterTypeValue || type instanceof ParameterTypeFile) { categoriesList.setEnabled(true); selectedCategoriesList.setEnabled(true); createValueButton.setEnabled(true); createValueTextField.setEnabled(true); addValueButton.setEnabled(true); removeValueButton.setEnabled(true); } } } private void showGridValues(ParameterValueGrid parameterValueGrid) { selectedCategoriesListModel.removeAllElements(); double[] gridValues = parameterValueGrid.getValues(); for (int i = 0; i < gridValues.length; i++) { selectedCategoriesListModel.addElement(Tools.formatIntegerIfPossible(gridValues[i])); } } private void fillComponents(ParameterValues parameterValue) { categoriesListModel.removeAllElements(); selectedCategoriesListModel.removeAllElements(); if (parameterValue instanceof ParameterValueRange) { ParameterValueRange parameterValueRange = (ParameterValueRange) parameterValue; minValueTextField.setValue(Double.valueOf(parameterValueRange.getMin())); maxValueTextField.setValue(Double.valueOf(parameterValueRange.getMax())); } else if (parameterValue instanceof ParameterValueGrid) { ParameterValueGrid parameterValueGrid = (ParameterValueGrid) parameterValue; minValueTextField.setValue(Double.valueOf(parameterValueGrid.getMin())); maxValueTextField.setValue(Double.valueOf(parameterValueGrid.getMax())); stepsValueTextField.setValue(Integer.valueOf(parameterValueGrid.getSteps())); gridScaleValueComboBox.setSelectedIndex(parameterValueGrid.getScale()); showGridValues(parameterValueGrid); } else if (parameterValue instanceof ParameterValueList) { ParameterValueList parameterValueList = (ParameterValueList) parameterValue; ParameterType type = parameterValueList.getParameterType(); for (Object value : parameterValueList) { selectedCategoriesListModel.addElement(value); } String[] categories = getDefaultListParameterValues(type); if (categories != null) { for (int i = 0; i < categories.length; i++) { if (!parameterValueList.contains(categories[i])) { categoriesListModel.addElement(categories[i]); } } } } } private void showParameterValues(String key) { if (key == null) { enableComponents(null); return; } ParameterValues parameterValues = parameterValuesMap.get(key); fillComponents(parameterValues); enableComponents(parameterValues); } private void finishTextFieldEdit(JFormattedTextField textField) { try { textField.commitEdit(); } catch (Exception e) { System.err.println(e.getMessage()); return; } updateSelectedNumericalParameterValues(); } private void updateSelectedNumericalParameterValues() { int index = selectedParametersList.getSelectedIndex(); if (index == -1) { enableComponents(null); return; } String key = (String)selectedParametersListModel.get(index); ParameterValues parameterValues = parameterValuesMap.get(key); if (parameterValues != null) { if (parameterValues instanceof ParameterValueGrid) { ParameterValueGrid parameterValueGrid = (ParameterValueGrid) parameterValues; parameterValueGrid.setMin((Double) minValueTextField.getValue()); parameterValueGrid.setMax((Double) maxValueTextField.getValue()); parameterValueGrid.setSteps((Integer) stepsValueTextField.getValue()); parameterValueGrid.setScale(gridScaleValueComboBox.getSelectedIndex()); showGridValues(parameterValueGrid); } if (parameterValues instanceof ParameterValueRange) { ParameterValueRange parameterValueRange = (ParameterValueRange) parameterValues; parameterValueRange.setMin((Double) minValueTextField.getValue()); parameterValueRange.setMax((Double) maxValueTextField.getValue()); } } updateInfoLabel(); } private ParameterValues createNumericalParameterValues(Operator operator, ParameterType type) { double min = ((ParameterTypeNumber)type).getMinValue(); double max = ((ParameterTypeNumber)type).getMaxValue(); if (mode == ParameterIteratingOperatorChain.VALUE_MODE_DISCRETE) { return new ParameterValueGrid(operator, type, min, max); } else { return new ParameterValueRange(operator, type, min, max); } } private String[] getDefaultListParameterValues(ParameterType type) { if (type instanceof ParameterTypeCategory) { return ((ParameterTypeCategory)type).getValues(); } else if (type instanceof ParameterTypeStringCategory) { return ((ParameterTypeStringCategory)type).getValues(); } else if (type instanceof ParameterTypeBoolean) { return new String[] { "true", "false" }; } else { return new String[] {}; } } private void ok() { ok = true; List<Object[]> parameterList = new LinkedList<Object[]>(); for (String key : parameterValuesMap.keySet()) { String value = parameterValuesMap.get(key).getValuesString(); parameterList.add(new Object[] { key, value }); } Parameters parameters = listener.getParameters(); parameters.setParameter(ParameterIteratingOperatorChain.PARAMETER_PARAMETERS, parameterList); listener.setParameters(parameters); dispose(); } private void cancel() { ok = false; dispose(); } public boolean isOk() { return ok; } }