1
2
3
4
5
6 package net.kwfgrid.gwui.gui;
7
8 import net.kwfgrid.gworkflowdl.structure.Property;
9 import net.kwfgrid.gworkflowdl.structure.GenericProperties;
10 import net.kwfgrid.gworkflowdl.protocol.structure.*;
11 import net.kwfgrid.gwui.workflow.XMLUtilities;
12
13 import org.glassbox.Theme;
14 import org.glassbox.gui.Visible;
15 import org.glassbox.executor.Executor;
16
17 import java.awt.BorderLayout;
18 import java.awt.Dimension;
19 import java.awt.Component;
20 import java.awt.Color;
21 import java.awt.Font;
22 import java.awt.event.KeyEvent;
23 import java.awt.event.KeyListener;
24 import java.awt.event.KeyAdapter;
25 import java.util.*;
26 import javax.swing.*;
27 import javax.swing.event.TableModelListener;
28 import javax.swing.event.TableModelEvent;
29 import javax.swing.border.TitledBorder;
30 import javax.swing.table.*;
31
32 import org.apache.log4j.Logger;
33
34 /***
35 Abstract super class of an editor for editing the <code>GenericProperties</code> of a place, transition or a workflow.
36 */
37 public abstract class PropertiesEditor extends AbstractWorkflowElementEditor implements SimpleEditTableModel.Controller {
38 private class PropertyTableModel extends AbstractTableModel {
39 private Property[] _properties;
40
41 public PropertyTableModel(Property[] properties) {
42 if (properties == null) {
43 _properties = new Property[0];
44 } else {
45 _properties = properties;
46 }
47 }
48
49 public int getRowCount() {
50 return _properties.length;
51 }
52
53 public int getColumnCount() {
54 return 2;
55 }
56
57 public String getColumnName(int col) {
58 if (col==0) return "Key";
59 else return "Value";
60 }
61
62 public Class getColumnClass(int col) {
63 return String.class;
64 }
65
66 public Object getValueAt(int row, int column) {
67 if (column==0) return _properties[row].getKey();
68 return _properties[row].getValue();
69 }
70
71 public void setValueAt(Object value, int row, int column) {
72 if (column == 1) {
73 cellChanged((String)getValueAt(row, 0), (String)value);
74 } else {
75 fireTableCellUpdated(row, column);
76 }
77 }
78
79 public boolean isCellEditable(int row, int column) {
80 return column == 1;
81 }
82 }
83
84 private static final Logger logger = Logger.getLogger(PropertiesEditor.class);
85
86 private JComponent _view;
87 private JTable _propertytable;
88 private TableSorter _propertytablesorter;
89
90 /***
91 Constructor.
92 @param executor The invoker for a method call on the workflow structure.
93 @param workflow The edited workflow.
94 @param element The owner of the edited properties, an object in the workflow structure.
95 */
96 public PropertiesEditor(Executor executor, ProtocolWorkflow workflow, IStructureObject element) {
97 super(executor, workflow, element);
98 _view = null;
99 }
100
101 /***
102 Get the actual properties edited by this editor. Must be implemented by subclasses.
103 */
104 protected abstract GenericProperties getElementProperties();
105
106 public void rowAdded(Object[] row) {
107 final String key = (String)row[0];
108 final String value = (String)row[1]==null?"":(String)row[1];
109
110 logger.debug("New property added '"+key+"', '"+value+"'.");
111
112 setPerformingTask(true);
113 getExecutor().execute(new GUIMethodCallTask("Adding new property "+key+" with value "+value+" ...", getExecutor(), this) {
114 protected void execute() {
115 getElementProperties().put(key, value);
116 }
117 });
118 }
119
120 public void rowsDeleted(final int[] deletion) {
121 setPerformingTask(true);
122 getExecutor().execute(new GUIMethodCallTask("Removing selected properties ...",
123 getExecutor(),
124 PropertiesEditor.this) {
125 protected void execute() {
126 for (int i=0; i<deletion.length; i++) {
127 deletion[i] = _propertytablesorter.modelIndex(deletion[i]);
128 }
129 for (int i=0; i<deletion.length; i++) {
130 getElementProperties().removeProperty(deletion[i]);
131 for (int j=i+1; j<deletion.length; j++) {
132 if (deletion[j] > deletion[i]) deletion[j]--;
133 }
134 }
135 }
136 });
137 }
138
139 protected void cellChanged(final String key, final String value) {
140 logger.debug("Property '"+key+"' changed to "+value);
141
142 setPerformingTask(true);
143 getExecutor().execute(new GUIMethodCallTask("Setting property "+key+" to new value "+value+" ...", getExecutor(), this) {
144 protected void execute() {
145 getElementProperties().put(key, value);
146 }
147 });
148 }
149
150 public void objectsAdded(IStructureObject parent, String namespace, String name, List objects) {
151 if (affectsTableModel(parent, namespace, name)) updateTableModel();
152 }
153
154 public void objectsRemoved(IStructureObject parent, String namespace, String name, List objects) {
155 if (affectsTableModel(parent, namespace, name)) updateTableModel();
156 }
157
158 public void propertyChanged(IStructureObject parent, String namespace, String name, Object newvalue) {
159 if (affectsTableModel(parent, namespace, name)) updateTableModel();
160 }
161
162 private boolean affectsTableModel(IStructureObject parent, String namespace, String name) {
163 if (parent == getElement() &&
164 ProtocolProperties.NAME.equals(name) &&
165 XMLUtilities.equalNamespace(namespace, ProtocolProperties.NAMESPACE)) {
166 return true;
167 } else if (parent == getElementProperties() &&
168 ProtocolProperty.NAME.equals(name) &&
169 XMLUtilities.equalNamespace(namespace, ProtocolProperty.NAMESPACE)) {
170 return true;
171 } else if (parent instanceof Property &&
172 ((IChildObject)parent).getParent() == getElementProperties()) {
173 return true;
174 }
175 return false;
176 }
177
178 private void updateTableModel() {
179 _propertytablesorter.setTableModel(createPropertyTableModel(getElementProperties().getProperties()));
180
181
182
183
184
185
186 updateView();
187 }
188
189 /***
190 Updates the state of this view.
191 */
192 protected void updateState() {
193 _propertytable.setEnabled(isEnabled() && isEditable() && !isPerformingTask());
194 }
195
196 /***
197 Updates this view.
198 */
199 protected void updateView() {
200 updateState();
201 _view.invalidate();
202 _view.setSize(_view.getLayout().preferredLayoutSize(_view));
203 _view.doLayout();
204 _view.validate();
205 }
206
207 private TableModel createPropertyTableModel(Property[] properties) {
208 TableModel model = new PropertyTableModel(properties);
209
210 return model;
211 }
212
213 public JComponent getView() {
214 if (_view==null) {
215 _propertytablesorter = new TableSorter(createPropertyTableModel(getElementProperties().getProperties()));
216 SimpleEditTableModel editor = new SimpleEditTableModel(_propertytablesorter, this, 0, "Add new property ...");
217 _propertytable = new JTable(editor);
218 _propertytable.addKeyListener(editor.getDeleteKeyHandler(_propertytable));
219 _propertytablesorter.setTableHeader(_propertytable.getTableHeader());
220 _propertytable.setDefaultRenderer(String.class, SimpleEditTableModel.getCellRendererForString());
221 _propertytable.setDefaultEditor(String.class, SimpleEditTableModel.getCellEditorForString());
222
223 _view = new JPanel();
224 _view.setLayout(new BorderLayout());
225 _view.add(_propertytable.getTableHeader(), BorderLayout.NORTH);
226 _view.add(_propertytable, BorderLayout.CENTER);
227 _view.setBorder(createBorder("Properties"));
228 }
229 return _view;
230 }
231 }