/*
* 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;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.Collection;
import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import com.rapidminer.gui.tools.ExtendedJScrollPane;
import com.rapidminer.gui.tools.FilterTextField;
import com.rapidminer.gui.tools.FilterableListModel;
import com.rapidminer.gui.tools.ResourceAction;
import com.rapidminer.parameter.ParameterTypeAttributes;
import com.rapidminer.tools.I18N;
/**
* A dialog to select a subset of attributes.
*
* @author Tobias Malbrecht
*/
public class AttributesPropertyDialog extends PropertyDialog {
private static final long serialVersionUID = 5396725165122306231L;
private final ArrayList<String> items;
private final ArrayList<String> selectedItems;
private final FilterTextField itemSearchField;
private final FilterTextField selectedItemSearchField;
private final FilterableListModel itemListModel;
private final FilterableListModel selectedItemListModel;
private final JList itemList;
private final JList selectedItemList;
private final Action selectAttributesAction = new ResourceAction(true, "attributes_select") {
private static final long serialVersionUID = -3046621278306353077L;
public void actionPerformed(ActionEvent e) {
int[] indices = itemList.getSelectedIndices();
itemList.setSelectedIndices(new int[] {});
for (int i = indices.length - 1; i >= 0; i--) {
String item = itemListModel.getElementAt(indices[i]).toString();
selectedItemListModel.addElement(item);
itemListModel.removeElementAt(indices[i]);
selectedItems.add(item);
items.remove(item);
}
}
};
private final Action deselectAttributesAction = new ResourceAction(true, "attributes_deselect") {
private static final long serialVersionUID = -3046621278306353077L;
public void actionPerformed(ActionEvent e) {
int[] indices = selectedItemList.getSelectedIndices();
selectedItemList.setSelectedIndices(new int[] {});
for (int i = indices.length - 1; i >= 0; i--) {
String item = selectedItemListModel.getElementAt(indices[i]).toString();
itemListModel.addElement(item);
selectedItemListModel.removeElementAt(indices[i]);
items.add(item);
selectedItems.remove(item);
}
}
};
public AttributesPropertyDialog(final ParameterTypeAttributes type, Collection<String> preselectedItems) {
super(type, "attributes");
JPanel panel = new JPanel(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
items = new ArrayList<String>();
selectedItems = new ArrayList<String>();
itemListModel = new FilterableListModel();
selectedItemListModel = new FilterableListModel();
System.err.println(preselectedItems.size());
for (String item : type.getAttributeNames()) {
if (!preselectedItems.contains(item)) {
items.add(item);
itemListModel.addElement(item);
} else {
selectedItems.add(item);
selectedItemListModel.addElement(item);
}
}
for (String item : preselectedItems) {
if (!type.getAttributeNames().contains(item)) {
selectedItems.add(item);
selectedItemListModel.addElement(item);
}
}
itemSearchField = new FilterTextField();
itemSearchField.addFilterListener(itemListModel);
JButton itemSearchFieldClearButton = new JButton(new ResourceAction(true, "attributes.clear") {
private static final long serialVersionUID = -3046621278306353077L;
@Override
public void actionPerformed(ActionEvent e) {
itemSearchField.clearFilter();
}
});
JPanel itemSearchFieldPanel = new JPanel(new GridBagLayout());
c.insets = new Insets(0, 0, 0, 0);
c.gridx = 0;
c.gridy = 0;
c.weightx = 1;
c.weighty = 0;
c.fill = GridBagConstraints.BOTH;
itemSearchFieldPanel.add(itemSearchField, c);
c.gridx = 1;
c.weightx = 0;
itemSearchFieldPanel.add(itemSearchFieldClearButton, c);
itemList = new JList(itemListModel);
itemList.addMouseListener(new MouseListener() {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
selectAttributesAction.actionPerformed(null);
}
}
@Override
public void mouseEntered(MouseEvent e) {}
@Override
public void mouseExited(MouseEvent e) {}
@Override
public void mousePressed(MouseEvent e) {}
@Override
public void mouseReleased(MouseEvent e) {}
});
JScrollPane itemListPane = new ExtendedJScrollPane(itemList);
itemListPane.setBorder(createBorder());
JPanel itemListPanel = new JPanel(new GridBagLayout());
c.insets = new Insets(4, 4, 4, 4);
c.gridx = 0;
c.gridy = 0;
c.weightx = 1;
c.weighty = 0;
c.fill = GridBagConstraints.BOTH;
itemListPanel.add(itemSearchFieldPanel, c);
c.gridy = 1;
c.weighty = 1;
itemListPanel.add(itemListPane, c);
itemListPanel.setBorder(createTitledBorder(I18N.getMessage(I18N.getGUIBundle(), getKey() + ".attributes.border")));
selectedItemSearchField = new FilterTextField();
selectedItemSearchField.addFilterListener(selectedItemListModel);
JButton selectedItemSearchFieldClearButton = new JButton(new ResourceAction(true, "attributes.clear") {
private static final long serialVersionUID = -3046621278306353032L;
@Override
public void actionPerformed(ActionEvent e) {
selectedItemSearchField.clearFilter();
}
});
JPanel selectedItemSearchFieldPanel = new JPanel(new GridBagLayout());
c.insets = new Insets(0, 0, 0, 0);
c.gridx = 0;
c.gridy = 0;
c.weightx = 1;
c.weighty = 0;
c.fill = GridBagConstraints.BOTH;
selectedItemSearchFieldPanel.add(selectedItemSearchField, c);
JButton addValueButton = new JButton(new ResourceAction(true, "attributes.add") {
private static final long serialVersionUID = 41667438431831572L;
@Override
public void actionPerformed(ActionEvent e) {
String item = selectedItemSearchField.getText();
if (selectedItems.contains(item)) {
selectedItemSearchField.clearFilter();
return;
}
if (items.contains(item)) {
selectedItemListModel.addElement(item);
itemListModel.removeElement(item);
selectedItems.add(item);
items.remove(item);
selectedItemSearchField.clearFilter();
return;
}
selectedItems.add(item);
selectedItemListModel.addElement(item);
selectedItemSearchField.clearFilter();
}
});
c.gridx = 1;
c.weightx = 0;
selectedItemSearchFieldPanel.add(addValueButton, c);
c.gridx = 2;
c.weightx = 0;
selectedItemSearchFieldPanel.add(selectedItemSearchFieldClearButton, c);
selectedItemList = new JList(selectedItemListModel);
selectedItemList.addMouseListener(new MouseListener() {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
deselectAttributesAction.actionPerformed(null);
}
}
@Override
public void mouseEntered(MouseEvent e) {}
@Override
public void mouseExited(MouseEvent e) {}
@Override
public void mousePressed(MouseEvent e) {}
@Override
public void mouseReleased(MouseEvent e) {}
});
JScrollPane selectedItemListPane = new ExtendedJScrollPane(selectedItemList);
selectedItemListPane.setBorder(createBorder());
JPanel selectedItemListPanel = new JPanel(new GridBagLayout());
c.insets = new Insets(4, 4, 4, 4);
c.gridx = 0;
c.gridy = 0;
c.weightx = 1;
c.weighty = 0;
c.fill = GridBagConstraints.BOTH;
selectedItemListPanel.add(selectedItemSearchFieldPanel, c);
c.gridy = 1;
c.weighty = 1;
selectedItemListPanel.add(selectedItemListPane, c);
selectedItemListPanel.setBorder(createTitledBorder(I18N.getMessage(I18N.getGUIBundle(), getKey() + ".selected_attributes.border")));
c.insets = new Insets(0, 0, 0, 0);
c.gridx = 0;
c.gridy = 0;
c.weightx = 0.5;
c.weighty = 1;
c.fill = GridBagConstraints.BOTH;
panel.add(itemListPanel, c);
JPanel midButtonPanel = new JPanel(new GridLayout(2, 1));
JButton selectButton = new JButton(selectAttributesAction);
JButton deselectButton = new JButton(deselectAttributesAction);
midButtonPanel.add(deselectButton, 0, 0);
midButtonPanel.add(selectButton, 1, 0);
c.insets = new Insets(4, 4, 4, 4);
c.gridx = 1;
c.weightx = 0;
c.weighty = 1;
c.fill = GridBagConstraints.NONE;
panel.add(midButtonPanel, c);
c.insets = new Insets(0, 0, 0, 0);
c.gridx = 2;
c.gridy = 0;
c.weightx = 0.5;
c.fill = GridBagConstraints.BOTH;
panel.add(selectedItemListPanel, c);
Dimension d = panel.getPreferredSize();
d.setSize(d.getWidth() / 2, d.getHeight());
itemListPanel.setPreferredSize(d);
selectedItemListPanel.setPreferredSize(d);
layoutDefault(panel, NORMAL, makeOkButton(), makeCancelButton());
}
public Collection<String> getSelectedAttributeNames() {
return selectedItems;
}
}