/* * * * Copyright (C) 2015 CS SI * * * * This program is free software; you can redistribute it and/or modify it * * under the terms of the GNU 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 General Public License for * * more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, see http://www.gnu.org/licenses/ * */ package org.esa.snap.ui.tooladapter.model; import org.esa.snap.core.gpf.descriptor.SystemDependentVariable; import org.esa.snap.core.gpf.descriptor.SystemVariable; import org.esa.snap.ui.AppContext; import org.esa.snap.ui.UIUtils; import org.esa.snap.ui.tool.ToolButtonFactory; import org.esa.snap.ui.tooladapter.dialogs.SystemDependentVariableEditorDialog; import javax.swing.*; import javax.swing.table.*; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.List; /** * @author Ramona Manda */ public class VariablesTable extends JTable { private static String[] columnNames = {"", "Shared", "Key", "Value"}; private static int[] widths = {24, 40, 100, 250}; private List<SystemVariable> variables; private MultiRenderer tableRenderer; private AppContext appContext; public VariablesTable(List<SystemVariable> variables, AppContext context) { this.variables = variables; this.appContext = context; tableRenderer = new MultiRenderer(); setModel(new VariablesTableModel()); setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN); for(int i=0; i < widths.length; i++) { TableColumn column = getColumnModel().getColumn(i); column.setPreferredWidth(widths[i]); } } public void stopVariablesTableEditing(){ int row = getEditingRow(); int column = getEditingColumn(); if(row >= 0 && column >= 0){ /* For System Dependent Variables, the value is edited by using a dedicated form and not the Table Editor */ if(!(variables.get(row) instanceof SystemDependentVariable) || column != 3){ getCellEditor(getEditingRow(), getEditingColumn()).stopCellEditing(); } } } @Override public TableCellRenderer getCellRenderer(int row, int column) { if (column == 0) { return tableRenderer; } return super.getCellRenderer(row, column); } @Override public TableCellEditor getCellEditor(int row, int column) { switch (column) { case 0: case 2: case 3: return tableRenderer; case 1: return getDefaultEditor(Boolean.class); default: return getDefaultEditor(String.class); } } class VariablesTableModel extends AbstractTableModel { @Override public String getColumnName(int column) { return columnNames[column]; } @Override public Class<?> getColumnClass(int columnIndex) { return columnIndex != 1 ? String.class : Boolean.class; } @Override public int getColumnCount() { return columnNames.length; } @Override public int getRowCount() { return variables.size(); } @Override public Object getValueAt(int row, int column) { switch (column) { case 0: return false; case 1: return variables.get(row).isShared(); case 2: return variables.get(row).getKey(); case 3: return variables.get(row).getValue(); } return null; } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { return true; } @Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) { if (aValue != null) { switch (columnIndex) { case 0: variables.remove(variables.get(rowIndex)); fireTableDataChanged(); break; case 1: variables.get(rowIndex).setShared(Boolean.valueOf(aValue.toString())); break; case 2: variables.get(rowIndex).setKey(aValue.toString()); break; case 3: variables.get(rowIndex).setValue(aValue.toString()); break; } } } } class MultiRenderer extends AbstractCellEditor implements TableCellEditor, TableCellRenderer { private TableCellRenderer defaultRenderer = new DefaultTableCellRenderer(); private AbstractButton delButton = ToolButtonFactory.createButton(UIUtils.loadImageIcon("/org/esa/snap/resources/images/icons/DeleteShapeTool16.gif"), false); private TableCellEditor lastEditor; public MultiRenderer() { delButton.addActionListener(e -> fireEditingStopped()); } public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { switch (column) { case 0: return delButton; default: return defaultRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); } } @Override public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { switch (column) { case 0: lastEditor = null; return delButton; case 1: lastEditor = getDefaultEditor(Boolean.class); return lastEditor.getTableCellEditorComponent(table, value, isSelected, row, column); case 3: SystemVariable variable = variables.get(row); if (variable instanceof SystemDependentVariable) { lastEditor = new SystemDependentVariableCellEditor(appContext.getApplicationWindow(), (SystemDependentVariable)variable, null); return lastEditor.getTableCellEditorComponent(table, value, isSelected, row, column); } else { lastEditor = getDefaultEditor(String.class); return lastEditor.getTableCellEditorComponent(table, value, isSelected, row, column); } default: lastEditor = getDefaultEditor(String.class); return lastEditor.getTableCellEditorComponent(table, value, isSelected, row, column); } } @Override public Object getCellEditorValue() { //return lastEditor != null ? lastEditor.getCellEditorValue() : delButton; //delButton; return lastEditor != null ? ((DefaultCellEditor)lastEditor).getComponent() instanceof JTextField ? ((JTextField)((DefaultCellEditor)lastEditor).getComponent()).getText() : lastEditor.getCellEditorValue() : delButton; } } class SystemDependentVariableCellEditor extends DefaultCellEditor implements TableCellEditor, VariableChangedListener { private static final int CLICK_COUNT_TO_START = 2; private JButton button; private SystemDependentVariableEditorDialog dialog; private SystemDependentVariable variable; /** * Constructor. */ public SystemDependentVariableCellEditor(Window window, SystemDependentVariable variable, String helpID) { super(new JTextField()); setClickCountToStart(CLICK_COUNT_TO_START); // Using a JButton as the editor component button = new JButton(); button.setBackground(Color.white); button.setFont(button.getFont().deriveFont(Font.PLAIN)); button.setBorder(null); button.setHorizontalAlignment(SwingConstants.LEFT); button.setText(variable.getValue()); this.variable = variable; // Dialog which will do the actual editing dialog = new SystemDependentVariableEditorDialog(window, this.variable, helpID); dialog.addListener(this); button.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if (e.getClickCount() == CLICK_COUNT_TO_START) { dialog.show(); fireEditingStopped(); } } }); } @Override public Object getCellEditorValue() { return variable.getValue(); } @Override public Component getComponent() { /* The button is used for editing System Dependent Variables; therefore the table cell editor is calling this method to get the current value for the stop editing event */ return button; } @Override public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { /*SwingUtilities.invokeLater(() -> { dialog.show(); fireEditingStopped(); });*/ return button; } @Override public void variableChanged(VariableChangedEvent ev) { String currentOSValue = variable.getCurrentOSValue(); button.setText(currentOSValue); } } }