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
12 import org.glassbox.executor.Executor;
13
14 import java.awt.*;
15 import java.util.List;
16 import javax.swing.*;
17 import javax.swing.event.TableModelListener;
18 import javax.swing.event.TableModelEvent;
19 import javax.swing.border.TitledBorder;
20 import javax.swing.table.*;
21
22 public abstract class AbstractTransitionEdgeEditor extends AbstractWorkflowElementEditor {
23
24
25
26 private class EdgeTableController implements TableModelListener {
27 public void tableChanged(TableModelEvent e) {
28 if (e.getType() == TableModelEvent.UPDATE) {
29 int column = e.getColumn();
30 int row = e.getFirstRow();
31 if (column == COLUMN_INDEX_EXPRESSION) {
32 final Object value = _edgetablemodel.getValueAt(row, column);
33 final Edge arc = getEdge(row);
34
35 setPerformingTask(true);
36 getExecutor().execute(new GUIMethodCallTask("Setting new edge expression ...",
37 getExecutor(),
38 AbstractTransitionEdgeEditor.this) {
39 protected void execute() {
40 arc.setExpression((String)value);
41 }
42 });
43 }
44 }
45 }
46 }
47
48 private static final int COLUMN_INDEX_EXPRESSION = 0;
49 private static final int COLUMN_INDEX_PLACEID = 1;
50 private static final String[] COLUMN_NAMES = new String[] { "Expression", "Place ID" };
51
52 private JPanel _view;
53 private JTable _edgetable;
54 private TableSorter _edgetablesorter;
55 private TableModel _edgetablemodel;
56 private EdgeTableController _edgetablecontroller;
57
58 protected AbstractTransitionEdgeEditor(Executor executor, ProtocolWorkflow workflow, ProtocolTransition transition) {
59 super(executor, workflow, transition);
60 _view = null;
61 _edgetable = null;
62 _edgetablesorter = null;
63 _edgetablemodel = null;
64 _edgetablecontroller = null;
65 }
66
67 protected abstract String getTitle();
68
69 protected abstract Edge getEdge(int index);
70
71 protected abstract Edge[] getEdges();
72
73 protected abstract String getElementName();
74
75 public void objectsAdded(IStructureObject parent, String namespace, String name, List objects) {
76 if (addRemoveAffectsEdgeTableModel(parent, namespace, name)) updateEdgeTableModel();
77 }
78
79 public void objectsRemoved(IStructureObject parent, String namespace, String name, List objects) {
80 if (addRemoveAffectsEdgeTableModel(parent, namespace, name)) updateEdgeTableModel();
81 }
82
83 public void propertyChanged(IStructureObject parent, String namespace, String name, Object newvalue) {
84 if (propertyChangeAffectsEdgeTableModel(parent, namespace, name)) updateEdgeTableModel();
85 }
86
87 private boolean addRemoveAffectsEdgeTableModel(IStructureObject parent, String namespace, String name) {
88 return (parent == getElement() &&
89 getElementName().equals(name) &&
90 XMLUtilities.equalNamespace(namespace, ProtocolEdge.NAMESPACE));
91 }
92
93 private boolean propertyChangeAffectsEdgeTableModel(IStructureObject parent, String namespace, String name) {
94 return (parent instanceof Edge &&
95 ((IChildObject)parent).getParent() == getElement());
96 }
97
98 private void updateEdgeTableModel() {
99 _edgetablemodel = createEdgeTableModel(getEdges());
100 _edgetablemodel.addTableModelListener(_edgetablecontroller);
101 _edgetablesorter.setTableModel(_edgetablemodel);
102 updateView();
103 }
104
105 private TableModel createEdgeTableModel(Edge[] edges) {
106 if (edges == null) edges = new Edge[0];
107 String[][] data = new String[edges.length][2];
108 for (int i=0; i<edges.length; i++) {
109 data[i][COLUMN_INDEX_EXPRESSION] = edges[i].getExpression();
110 data[i][COLUMN_INDEX_PLACEID] = edges[i].getPlaceID();
111 }
112 return new DefaultTableModel(data, COLUMN_NAMES) {
113 public Class getColumnClass(int c) {
114 return String.class;
115 }
116
117 public boolean isCellEditable(int row, int column) {
118 return column == COLUMN_INDEX_EXPRESSION;
119 }
120 };
121 }
122
123 protected void updateState() {
124 _edgetable.setEnabled(isEnabled() && isEditable() && !isPerformingTask());
125 }
126
127 protected void updateView() {
128 updateState();
129 _view.invalidate();
130 _view.setSize(_view.getLayout().preferredLayoutSize(_view));
131 _view.doLayout();
132 _view.validate();
133 }
134
135 public JComponent getView() {
136 if (_view == null) {
137 _edgetablecontroller = new EdgeTableController();
138 _edgetablemodel = createEdgeTableModel(getEdges());
139 _edgetablemodel.addTableModelListener(_edgetablecontroller);
140 _edgetablesorter = new TableSorter(_edgetablemodel);
141 _edgetable = new JTable(_edgetablesorter);
142 _edgetablesorter.setTableHeader(_edgetable.getTableHeader());
143
144 _view = new JPanel();
145 _view.setBorder(createBorder(getTitle()));
146 _view.setLayout(new GridBagLayout());
147
148 GridBagConstraints c = new GridBagConstraints();
149
150 c.insets = new Insets(5, 0, 0, 0);
151 c.weightx = 1.0;
152 c.weighty = 0.0;
153 c.gridx = 0;
154 c.gridy = 0;
155 c.anchor = GridBagConstraints.WEST;
156 c.fill = GridBagConstraints.HORIZONTAL;
157 c.gridwidth = GridBagConstraints.REMAINDER;
158
159 _view.add(_edgetable.getTableHeader(), c);
160
161 c.weighty = 1;
162 c.gridy = 1;
163 c.insets = new Insets(0, 0, 0, 0);
164 c.fill = GridBagConstraints.BOTH;
165
166 _view.add(_edgetable, c);
167 }
168 return _view;
169 }
170 }