/* * 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.processeditor; import java.awt.BorderLayout; import java.awt.Color; import java.awt.event.ActionEvent; import javax.swing.Action; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.AbstractTableModel; import com.rapidminer.ProcessContext; import com.rapidminer.gui.tools.ExtendedJScrollPane; import com.rapidminer.gui.tools.ResourceAction; import com.rapidminer.gui.tools.ResourceLabel; import com.rapidminer.gui.tools.ViewToolBar; import com.rapidminer.gui.tools.dialogs.ButtonDialog; import com.rapidminer.tools.container.Pair; /** * * @author Simon Fischer */ public class MacroEditor extends JPanel { private static final long serialVersionUID = 1L; private class MacroTableModel extends AbstractTableModel { private static final long serialVersionUID = 1L; @Override public int getColumnCount() { return 2; } @Override public int getRowCount() { if (context == null) { return 0; } else { return context.getMacros().size(); } } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { return true; } @Override public String getColumnName(int col) { switch (col) { case 0: return "Macro"; case 1: return "Value"; default: throw new IndexOutOfBoundsException(col+" > 1"); } } @Override public Object getValueAt(int rowIndex, int columnIndex) { switch (columnIndex) { case 0: return context.getMacros().get(rowIndex).getFirst(); case 1: return context.getMacros().get(rowIndex).getSecond(); default: throw new IndexOutOfBoundsException(columnIndex+" > 1"); } } @Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) { switch (columnIndex) { case 0: context.getMacros().get(rowIndex).setFirst(aValue.toString()); break; case 1: context.getMacros().get(rowIndex).setSecond(aValue.toString()); break; default: throw new IndexOutOfBoundsException(columnIndex+" > 1"); } } private void fireAdd() { fireTableRowsInserted(context.getMacros().size() - 1, context.getMacros().size() - 1); } private void fireRemoved(int row) { fireTableRowsDeleted(row, row); } private void reset() { fireTableStructureChanged(); } }; private final Action ADD_MACRO_ACTION; private final Action REMOVE_MACRO_ACTION; private ProcessContext context; private final MacroTableModel macroModel = new MacroTableModel(); private final JTable macroTable = new JTable(macroModel); { macroTable.setRowHeight(26); } public MacroEditor(boolean embedded) { setLayout(new BorderLayout()); ADD_MACRO_ACTION = new ResourceAction(embedded, "macros.add_macro") { private static final long serialVersionUID = 1L; @Override public void actionPerformed(ActionEvent e) { addMacro(); } }; REMOVE_MACRO_ACTION = new ResourceAction(embedded, "macros.delete_macro") { private static final long serialVersionUID = 1L; @Override public void actionPerformed(ActionEvent e) { removeMacros(); } }; if (embedded) { ViewToolBar toolBar = new ViewToolBar(); JLabel label = new ResourceLabel("macros"); label.setBorder(BorderFactory.createEmptyBorder(6, 6, 6, 6)); toolBar.add(label); toolBar.add(ADD_MACRO_ACTION, ViewToolBar.RIGHT); toolBar.add(REMOVE_MACRO_ACTION, ViewToolBar.RIGHT); toolBar.setBorder(null); add(toolBar, BorderLayout.NORTH); } JScrollPane tablePane = new ExtendedJScrollPane(macroTable); tablePane.getViewport().setBackground(Color.WHITE); tablePane.setBorder(null); add(tablePane, BorderLayout.CENTER); } private void addMacro() { context.addMacro(new Pair<String, String>("", "")); macroModel.fireAdd(); } private void removeMacros() { int[] selected = macroTable.getSelectedRows(); for (int i = selected.length - 1; i >= 0; i--) { context.getMacros().remove(selected[i]); macroModel.fireRemoved(selected[i]); } } public void setContext(ProcessContext context) { this.context = context; macroModel.reset(); } public static void showMacroEditorDialog(final ProcessContext context) { ButtonDialog dialog = new ButtonDialog("define_macros", true) { private static final long serialVersionUID = 2874661432345426452L; { MacroEditor editor = new MacroEditor(false); editor.setBorder(createBorder()); JButton addMacroButton = new JButton(editor.ADD_MACRO_ACTION); JButton removeMacroButton = new JButton(editor.REMOVE_MACRO_ACTION); layoutDefault(editor, NORMAL, addMacroButton, removeMacroButton, makeOkButton()); } @Override protected void ok() { super.ok(); } }; dialog.setVisible(true); } }