/* * 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.flow; import java.awt.BorderLayout; import java.awt.Component; import java.util.List; import javax.swing.Action; import javax.swing.JPanel; import javax.swing.JScrollPane; import com.rapidminer.Process; import com.rapidminer.gui.MainFrame; import com.rapidminer.gui.actions.AutoWireAction; import com.rapidminer.gui.processeditor.ProcessEditor; import com.rapidminer.gui.tools.PrintingTools; import com.rapidminer.gui.tools.ResourceDockKey; import com.rapidminer.gui.tools.SwingTools; import com.rapidminer.gui.tools.ViewToolBar; import com.rapidminer.gui.tools.components.DropDownButton; import com.rapidminer.operator.ExecutionUnit; import com.rapidminer.operator.Operator; import com.rapidminer.operator.OperatorChain; import com.rapidminer.operator.ports.metadata.CompatibilityLevel; import com.vlsolutions.swing.docking.DockKey; import com.vlsolutions.swing.docking.Dockable; /** * Contains the main {@link ProcessRenderer} and a {@link ProcessButtonBar} * to navigate through the process. * * @author Simon Fischer, Tobias Malbrecht */ public class ProcessPanel extends JPanel implements Dockable, ProcessEditor { private static final long serialVersionUID = -4419160224916991497L; private final ProcessRenderer renderer; private final ProcessButtonBar processButtonBar; private OperatorChain operatorChain; public ProcessPanel(final MainFrame mainFrame) { processButtonBar = new ProcessButtonBar(mainFrame); renderer = new ProcessRenderer(this, mainFrame); renderer.setBackground(SwingTools.LIGHTEST_BLUE); ViewToolBar toolBar = new ViewToolBar(); toolBar.add(processButtonBar); final Action autoWireAction = new AutoWireAction(mainFrame, "wire", CompatibilityLevel.PRE_VERSION_5, false, true); DropDownButton autoWireDropDownButton = DropDownButton.makeDropDownButton(autoWireAction); autoWireDropDownButton.add(autoWireAction); autoWireDropDownButton.add(new AutoWireAction(mainFrame, "wire_recursive", CompatibilityLevel.PRE_VERSION_5, true, true)); autoWireDropDownButton.add(new AutoWireAction(mainFrame, "rewire", CompatibilityLevel.PRE_VERSION_5, false, false)); autoWireDropDownButton.add(new AutoWireAction(mainFrame, "rewire_recursive", CompatibilityLevel.PRE_VERSION_5, true, false)); autoWireDropDownButton.addToToolBar(toolBar, ViewToolBar.RIGHT); toolBar.add(renderer.getFlowVisualizer().SHOW_ORDER_TOGGLEBUTTON, ViewToolBar.RIGHT); toolBar.add(renderer.ARRANGE_OPERATORS_ACTION, ViewToolBar.RIGHT); toolBar.add(renderer.AUTO_FIT_ACTION, ViewToolBar.RIGHT); String name = "process"; if (mainFrame.getActions().getProcess() != null && mainFrame.getActions().getProcess().getProcessLocation() != null) { name = mainFrame.getActions().getProcess().getProcessLocation().getShortName(); } DropDownButton exportDropDownButton = PrintingTools.makeExportPrintDropDownButton(renderer, name); exportDropDownButton.addToToolBar(toolBar, ViewToolBar.RIGHT); setLayout(new BorderLayout()); add(toolBar, BorderLayout.NORTH); JScrollPane scrollPane = new JScrollPane(renderer); scrollPane.getVerticalScrollBar().setUnitIncrement(10); scrollPane.setBorder(null); add(scrollPane, BorderLayout.CENTER); } public void showOperatorChain(OperatorChain operatorChain) { this.operatorChain = operatorChain; if (operatorChain == null) { processButtonBar.setSelectedNode(null); renderer.showOperatorChain(null); } else { renderer.showOperatorChain(operatorChain); processButtonBar.setSelectedNode(operatorChain); StringBuilder b = new StringBuilder("<html><strong>"); b.append(operatorChain.getName()); b.append("</strong> <emph>("); b.append(operatorChain.getOperatorDescription().getName()); b.append(")</emph><br/>"); b.append("Subprocesses: "); boolean first = true; for (ExecutionUnit executionUnit : operatorChain.getSubprocesses()) { if (first) { first = false; } else { b.append(", "); } b.append("<em>"); b.append(executionUnit.getName()); b.append("</em> ("); b.append(executionUnit.getOperators().size()); b.append(" operators)"); } b.append("</html>"); } } public void setSelection(List<Operator> selection) { Operator first = selection.isEmpty() ? null : selection.get(0); if (first != null) { processButtonBar.addToHistory(first); } if (renderer.getSelection().equals(selection)) { return; } if (first == null) { showOperatorChain(null); } else { OperatorChain target; if (first instanceof OperatorChain) { target = (OperatorChain) first; } else { target = first.getParent(); } showOperatorChain(target); renderer.setSelection(selection); } } @Override public void processChanged(Process process) { processButtonBar.clearHistory(); } @Override public void processUpdated(Process process) { renderer.processUpdated(); processButtonBar.setSelectedNode(this.operatorChain); } public ProcessRenderer getProcessRenderer() { return renderer; } public static final String PROCESS_PANEL_DOCK_KEY = "process_panel"; private final DockKey DOCK_KEY = new ResourceDockKey(PROCESS_PANEL_DOCK_KEY); { DOCK_KEY.setDockGroup(MainFrame.DOCK_GROUP_ROOT); } @Override public Component getComponent() { return this; } @Override public DockKey getDockKey() { return DOCK_KEY; } }