/*
* RapidMiner
*
* Copyright (C) 2001-2011 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.celleditors.value;
import java.util.Vector;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.SwingUtilities;
import com.rapidminer.gui.tools.autocomplete.AutoCompleteComboBoxAddition;
import com.rapidminer.operator.ports.MetaDataChangeListener;
import com.rapidminer.operator.ports.metadata.MetaData;
import com.rapidminer.parameter.MetaDataProvider;
import com.rapidminer.parameter.ParameterTypeAttribute;
/**
* Autocompletion combo box that observes an input port so it can update itself whenever the meta data changes.
*
* @author Simon Fischer, Sebastian Land
*
*/
public class AttributeComboBox extends JComboBox {
private static final long serialVersionUID = 1L;
private static class AttributeComboBoxModel extends DefaultComboBoxModel implements MetaDataChangeListener {
private static final long serialVersionUID = 1L;
private ParameterTypeAttribute attributeType;
private Vector<String> attributes = new Vector<String>();
public AttributeComboBoxModel(ParameterTypeAttribute attributeType) {
this.attributeType = attributeType;
MetaData metaData = attributeType.getMetaData();
//InputPort inputPort = attributeType.getInputPort();
if (metaData != null)
informMetaDataChanged(metaData);
}
@Override
public int getSize() {
return attributes.size();
}
@Override
public Object getElementAt(int index) {
return attributes.get(index);
}
/**
* This method will cause this model to register as a MetaDataChangeListener on the given input port. Attention!
* Make sure, it will be proper unregistered to avoid a memory leak!
*/
protected void registerListener() {
MetaDataProvider mdp = attributeType.getMetaDataProvider();
if (mdp != null)
mdp.addMetaDataChangeListener(this);
}
/**
* This method will unregister this model from the InputPort.
*/
protected void unregisterListener() {
MetaDataProvider mdp = attributeType.getMetaDataProvider();
if (mdp != null)
mdp.removeMetaDataChangeListener(this);
}
@Override
public void informMetaDataChanged(MetaData newMetadata) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
attributes = attributeType.getAttributeNames();
fireContentsChanged(0, 0, attributes.size());
}
});
}
}
private AttributeComboBoxModel model;
public AttributeComboBox(ParameterTypeAttribute type) {
super(new AttributeComboBoxModel(type));
model = (AttributeComboBoxModel) getModel();
AutoCompleteComboBoxAddition autoCompleteCBA = new AutoCompleteComboBoxAddition(this);
autoCompleteCBA.setCaseSensitive(true);
}
@Override
public void addNotify() {
super.addNotify();
model.registerListener();
}
@Override
public void removeNotify() {
super.removeNotify();
model.unregisterListener();
}
}