/*
* 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.Component;
import java.awt.GridLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;
import javax.swing.AbstractCellEditor;
import javax.swing.JComboBox;
import javax.swing.JPanel;
import javax.swing.JTable;
import com.rapidminer.Process;
import com.rapidminer.operator.Operator;
import com.rapidminer.operator.OperatorChain;
import com.rapidminer.parameter.ParameterType;
import com.rapidminer.parameter.ParameterTypeParameterValue;
import com.rapidminer.parameter.ParameterTypeValue;
/**
* Parameter editor for a {@link ParameterTypeValue}, i.e. a parameter name and value of a
* single operator. This can for example be used by parameter optimization operators.
*
* @author Ingo Mierswa
* @version $Id: ParameterValueKeyCellEditor.java,v 1.9 2008/05/09 19:22:46 ingomierswa Exp $
*/
public class ParameterValueKeyCellEditor extends AbstractCellEditor implements PropertyKeyCellEditor {
private static final long serialVersionUID = -2559892872774108384L;
private JPanel panel = new JPanel();
private JComboBox operatorCombo = new JComboBox();
private JComboBox parameterCombo = new JComboBox();
private transient OperatorChain parentOperator;
private transient Process process;
private transient ParameterChangeListener listener = null;
private boolean fireEvent = true;
public ParameterValueKeyCellEditor(ParameterTypeParameterValue type) {}
protected Object readResolve() {
this.process = this.parentOperator.getProcess();
return this;
}
public void setOperator(Operator operator, PropertyTable propertyTable) {
this.parentOperator = (OperatorChain)operator;
this.process = parentOperator.getProcess();
operatorCombo = createOperatorCombo(propertyTable);
parameterCombo = createParameterCombo((String)operatorCombo.getSelectedItem(), propertyTable);
panel.setLayout(new GridLayout(1, 2));
panel.add(operatorCombo);
panel.add(parameterCombo);
fireParameterChangedEvent();
}
private JComboBox createOperatorCombo(final PropertyTable propertyTable) {
List<Operator> allInnerOps = parentOperator.getAllInnerOperators();
Vector<String> allOpNames = new Vector<String>();
Iterator<Operator> i = allInnerOps.iterator();
while (i.hasNext())
allOpNames.add(i.next().getName());
Collections.sort(allOpNames);
final JComboBox combo = new JComboBox(allOpNames);
combo.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
String operatorName = (String)combo.getSelectedItem();
panel.remove(parameterCombo);
parameterCombo = createParameterCombo(operatorName, propertyTable);
panel.add(parameterCombo);
fireParameterChangedEvent();
fireEditingStopped();
}
});
if (combo.getItemCount() == 0)
combo.addItem("add inner operators");
else
combo.setSelectedIndex(0);
return combo;
}
private JComboBox createParameterCombo(String operatorName, PropertyTable propertyTable) {
JComboBox combo = new JComboBox();
Operator operator = process.getOperator((String) operatorCombo.getSelectedItem());
if (operator != null) {
Iterator<ParameterType> i = operator.getParameterTypes().iterator();
while (i.hasNext()) {
combo.addItem(i.next().getKey());
}
}
if (combo.getItemCount() == 0)
combo.addItem("no parameters");
combo.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
fireParameterChangedEvent();
fireEditingStopped();
}
});
combo.setSelectedIndex(0);
return combo;
}
public Object getCellEditorValue() {
String result = operatorCombo.getSelectedItem() + "." + parameterCombo.getSelectedItem();
return result;
}
private void setValue(String valueName) {
this.fireEvent = false;
if (valueName != null) {
String[] components = valueName.split("\\.");
if (components.length == 2) {
String operator = components[0];
String parameterName = components[1];
operatorCombo.setSelectedItem(operator);
parameterCombo.setSelectedItem(parameterName);
} else {
operatorCombo.setSelectedIndex(0);
parameterCombo.setSelectedIndex(0);
}
} else {
operatorCombo.setSelectedIndex(0);
parameterCombo.setSelectedIndex(0);
}
this.fireEvent = true;
}
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int col) {
setValue((String) value);
return panel;
}
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
return getTableCellEditorComponent(table, value, isSelected, row, column);
}
public void setParameterChangeListener(ParameterChangeListener listener) {
this.listener = listener;
}
public void fireParameterChangedEvent() {
if (fireEvent) {
if (listener != null) {
String operatorName = (String)operatorCombo.getSelectedItem();
String parameterName = (String)parameterCombo.getSelectedItem();
listener.parameterSelectionChanged(this.parentOperator, operatorName, parameterName);
}
}
}
}