/* * 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.tools; import java.awt.Point; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.util.Collections; import java.util.List; import java.util.Vector; import javax.swing.Action; import javax.swing.JList; import javax.swing.JPopupMenu; import javax.swing.ListSelectionModel; import com.rapidminer.gui.dnd.OperatorTransferHandler; import com.rapidminer.gui.operatortree.actions.InfoOperatorAction; import com.rapidminer.operator.Operator; import com.rapidminer.operator.OperatorCreationException; import com.rapidminer.operator.OperatorDescription; /** * This class specifies a special JList which is capable of showing all available * kinds of RapidMiner operators, allowing the user to drag a copy of them into his own * process tree. The list elements must be of type {@link OperatorDescription}. * * @author Helge Homburg, Ingo Mierswa */ public class OperatorList extends JList implements MouseListener { private static final long serialVersionUID = -2719941529572427942L; // ====================================================================== // Operator Menu Actions and Items // ====================================================================== private transient final Action INFO_OPERATOR_ACTION = new InfoOperatorAction() { private static final long serialVersionUID = 1L; @Override protected Operator getOperator() { return selectedOperator; } }; /** Creates a special CellRenderer for this class */ private final OperatorListCellRenderer operatorDialogCellRenderer; /* The drag source of the NewOperatorDialog */ //private DragSource dragSource; private transient Operator selectedOperator; /** Creates a new instance of OperatorList */ public OperatorList() { this(false, true); } /** Creates a new instance of OperatorList */ public OperatorList(boolean horizontalWrap, boolean coloredCellBackgrounds) { operatorDialogCellRenderer = new OperatorListCellRenderer(coloredCellBackgrounds); if (horizontalWrap) { setLayoutOrientation(HORIZONTAL_WRAP); setVisibleRowCount(-1); } setCellRenderer(operatorDialogCellRenderer); setSelectionMode(ListSelectionModel.SINGLE_SELECTION); addMouseListener(this); setDragEnabled(true); setTransferHandler(new OperatorTransferHandler() { private static final long serialVersionUID = 1L; @Override protected List<Operator> getDraggedOperators() { return Collections.singletonList(OperatorList.this.getSelectedOperator()); } }); } public void setOperatorDescriptions(Vector<OperatorDescription> descriptions) { setListData(descriptions); } /** Returns the currently selected operator. */ private Operator getSelectedOperator() { Point clickOrigin = getMousePosition(); if (clickOrigin == null) { return null; } int selectedIndex = locationToIndex(clickOrigin); if (selectedIndex != -1) { setSelectedIndex(selectedIndex); } OperatorDescription selectedListElement = (OperatorDescription)getSelectedValue(); Operator selectedOperator = null; if (selectedListElement != null) { try { selectedOperator = selectedListElement.createOperatorInstance(); } catch (OperatorCreationException ocE) { ocE.printStackTrace(); } } return selectedOperator; } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mouseClicked(MouseEvent e) { } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { selectedOperator = getSelectedOperator(); evaluatePopup(e); } /** Checks if the given mouse event is a popup trigger and creates a new popup menu if necessary. */ private void evaluatePopup(MouseEvent e) { if (e.isPopupTrigger()) { createOperatorPopupMenu().show(this, e.getX(), e.getY()); } } /** Creates a new popup menu for the selected operator. */ private JPopupMenu createOperatorPopupMenu() { JPopupMenu menu = new JPopupMenu(); menu.add(this.INFO_OPERATOR_ACTION); return menu; } }