1
2
3
4
5
6 package net.kwfgrid.gwui.gui;
7
8 import net.kwfgrid.gworkflowdl.protocol.structure.*;
9 import net.kwfgrid.gworkflowdl.structure.*;
10 import net.kwfgrid.gwui.workflow.XMLUtilities;
11 import net.kwfgrid.gwui.util.Utilities;
12
13 import org.glassbox.executor.Executor;
14
15 import java.awt.*;
16 import java.awt.event.*;
17 import java.util.List;
18 import javax.swing.*;
19 import javax.swing.event.TableModelListener;
20 import javax.swing.event.TableModelEvent;
21 import javax.swing.border.TitledBorder;
22 import javax.swing.table.*;
23
24 public class PlaceTokenClassEditor extends AbstractWorkflowElementEditor implements ActionListener {
25
26
27
28
29 private class OwlTableController implements SimpleEditTableModel.Controller, TableModelListener {
30 public void tableChanged(TableModelEvent e) {
31 if (e.getType() == TableModelEvent.UPDATE) {
32 final int row = e.getFirstRow();
33 final String newowl = (String)_owltablemodel.getValueAt(row, 0);
34 getExecutor().execute(new GUIMethodCallTask("Changing selected OWL property...",
35 getExecutor(),
36 PlaceTokenClassEditor.this) {
37 protected void execute() {
38 ((Place)getElement()).removeOwl(row);
39 ((Place)getElement()).addOwl(newowl);
40 }
41 });
42 }
43 }
44
45 public void rowAdded(final Object[] row) {
46 setPerformingTask(true);
47 getExecutor().execute(new GUIMethodCallTask("Adding new OWL property ...",
48 getExecutor(),
49 PlaceTokenClassEditor.this) {
50 protected void execute() {
51 ((Place)getElement()).addOwl((String)row[0]);
52 }
53 });
54 }
55
56 public void rowsDeleted(final int[] deletion) {
57 setPerformingTask(true);
58 getExecutor().execute(new GUIMethodCallTask("Removing selected OWL properties ...",
59 getExecutor(),
60 PlaceTokenClassEditor.this) {
61 protected void execute() {
62 for (int i=0; i<deletion.length; i++) {
63 deletion[i] = _owltablesorter.modelIndex(deletion[i]);
64 }
65 for (int i=0; i<deletion.length; i++) {
66 ((Place)getElement()).removeOwl(deletion[i]);
67 for (int j=i+1; j<deletion.length; j++) {
68 if (deletion[j] > deletion[i]) deletion[j]--;
69 }
70 }
71 }
72 });
73 }
74 }
75
76 private static final String[] TOKEN_TYPES = new String[] { null, "data", "effect" };
77 private static final String[] TOKEN_TYPE_LABELS = new String[] { "control", "data", "effect" };
78
79 private JPanel _view;
80 private JComboBox _tcbox;
81 private JTable _owltable;
82 private TableSorter _owltablesorter;
83 private TableModel _owltablemodel;
84 private OwlTableController _owltablecontroller;
85
86 public PlaceTokenClassEditor(Executor executor, ProtocolWorkflow workflow, ProtocolPlace place) {
87 super(executor, workflow, place);
88 _view = null;
89 _tcbox = null;
90 _owltable = null;
91 _owltablesorter = null;
92 _owltablemodel = null;
93 _owltablecontroller = null;
94 }
95
96 public void actionPerformed(ActionEvent e) {
97 final String tc = TOKEN_TYPES[_tcbox.getSelectedIndex()];
98 if (!Utilities.equal(tc, ((Place)getElement()).getTokenType())) {
99 setPerformingTask(true);
100 getExecutor().execute(new GUIMethodCallTask("Setting new token type ...",
101 getExecutor(),
102 PlaceTokenClassEditor.this) {
103 protected void execute() {
104 ((Place)getElement()).setTokenType(tc);
105 }
106 });
107 }
108 }
109
110 public void objectsAdded(IStructureObject parent, String namespace, String name, List objects) {
111 if (addRemoveAffectsOwlTableModel(parent, namespace, name)) updateOwlTableModel();
112 }
113
114 public void objectsRemoved(IStructureObject parent, String namespace, String name, List objects) {
115 if (addRemoveAffectsOwlTableModel(parent, namespace, name)) updateOwlTableModel();
116 }
117
118 public void propertyChanged(IStructureObject parent, String namespace, String name, Object newvalue) {
119 if (propertyChangeAffectsTokenType(parent, namespace, name)) updateTokenType();
120 }
121
122 private boolean addRemoveAffectsOwlTableModel(IStructureObject parent, String namespace, String name) {
123 return (parent == getElement() &&
124 ProtocolPlace.NAME_OWL.equals(name) &&
125 XMLUtilities.equalNamespace(namespace, ProtocolPlace.NAMESPACE));
126 }
127
128 private boolean propertyChangeAffectsTokenType(IStructureObject parent, String namespace, String name) {
129 return (parent == getElement() &&
130 ProtocolPlace.NAME_TOKENTYPE.equals(name) &&
131 XMLUtilities.equalNamespace(namespace, ProtocolPlace.NAMESPACE_PROPERTIES));
132 }
133
134 private void updateOwlTableModel() {
135 _owltablemodel = createOwlTableModel((Owls)getElement());
136 _owltablemodel.addTableModelListener(_owltablecontroller);
137 _owltablesorter.setTableModel(_owltablemodel);
138 updateView();
139 }
140
141 private void updateTokenType() {
142 String tc = ((Place)getElement()).getTokenType();
143 for (int i=0; i<TOKEN_TYPES.length; i++) {
144 if (Utilities.equal(TOKEN_TYPES[i], tc)) {
145 _tcbox.setSelectedIndex(i);
146 break;
147 }
148 }
149 }
150
151 private TableModel createOwlTableModel(Owls owl) {
152 String[] owls = owl.getOwls();
153 if (owls == null) owls = new String[0];
154 String[][] data = new String[owls.length][1];
155 for (int i=0; i<owls.length; i++) {
156 data[i][0] = owls[i];
157 }
158 return new DefaultTableModel(data, new String[] { "Owl" }) {
159 public Class getColumnClass(int c) {
160 return String.class;
161 }
162 };
163 }
164
165 protected void updateState() {
166 _tcbox.setEnabled(isEnabled() && isEditable() && !isPerformingTask());
167 _owltable.setEnabled(isEnabled() && isEditable() && !isPerformingTask());
168 }
169
170 protected void updateView() {
171 updateState();
172
173
174
175
176 }
177
178 public JComponent getView() {
179 if (_view == null) {
180 _tcbox = new JComboBox(TOKEN_TYPE_LABELS);
181 _tcbox.addActionListener(this);
182 updateTokenType();
183
184 _owltablecontroller = new OwlTableController();
185 _owltablemodel = createOwlTableModel((Owls)getElement());
186 _owltablemodel.addTableModelListener(_owltablecontroller);
187 _owltablesorter = new TableSorter(_owltablemodel);
188 SimpleEditTableModel owleditor = new SimpleEditTableModel(_owltablesorter, _owltablecontroller, 0, "Add new data description reference ...");
189 _owltable = new JTable(owleditor);
190 _owltablesorter.setTableHeader(_owltable.getTableHeader());
191 _owltable.addKeyListener(owleditor.getDeleteKeyHandler(_owltable));
192 _owltable.setDefaultRenderer(String.class, SimpleEditTableModel.getCellRendererForString());
193 _owltable.setDefaultEditor(String.class, SimpleEditTableModel.getCellEditorForString());
194
195 _view = new JPanel();
196 _view.setBorder(createBorder("Token Class"));
197 _view.setLayout(new GridBagLayout());
198
199 GridBagConstraints c = new GridBagConstraints();
200
201 c.insets = new Insets(5, 0, 0, 0);
202 c.weightx = 0.1;
203 c.weighty = 0.0;
204 c.gridx = 0;
205 c.gridy = 0;
206 c.anchor = GridBagConstraints.WEST;
207 c.fill = GridBagConstraints.NONE;
208 c.gridwidth = 1;
209
210 _view.add(new JLabel("Type"), c);
211
212 c.gridx = 1;
213 c.weightx = 0.9;
214 c.fill = GridBagConstraints.HORIZONTAL;
215 c.anchor = GridBagConstraints.EAST;
216 c.gridwidth = GridBagConstraints.REMAINDER;
217
218 _view.add(_tcbox, c);
219
220 c.gridx = 0;
221 c.gridy = 1;
222 c.weightx = 1.0;
223 c.anchor = GridBagConstraints.WEST;
224 c.fill = GridBagConstraints.HORIZONTAL;
225
226 _view.add(new JLabel("Data Description"), c);
227
228 c.gridy = 2;
229 c.insets = new Insets(2, 0, 0, 0);
230 c.anchor = GridBagConstraints.CENTER;
231 c.fill = GridBagConstraints.HORIZONTAL;
232
233 _view.add(_owltable.getTableHeader(), c);
234
235 c.weighty = 1.0;
236 c.gridy = 3;
237 c.insets = new Insets(0, 0, 0, 0);
238 c.fill = GridBagConstraints.BOTH;
239
240 _view.add(_owltable, c);
241 }
242 return _view;
243 }
244 }