1
2
3
4
5
6 package net.kwfgrid.gwui;
7
8 import de.fzi.wim.guibase.graphview.view.Manipulator;
9 import de.fzi.wim.guibase.graphview.graph.Node;
10 import de.fzi.wim.guibase.graphview.graph.Edge;
11
12 import net.kwfgrid.gwui.gui.*;
13 import net.kwfgrid.gwui.graphview.PlaceNode;
14 import net.kwfgrid.gwui.graphview.WorkflowGraph;
15 import net.kwfgrid.gworkflowdl.structure.Place;
16 import net.kwfgrid.gworkflowdl.structure.Token;
17 import net.kwfgrid.gworkflowdl.structure.Factory;
18 import net.kwfgrid.gworkflowdl.structure.WorkflowFormatException;
19 import net.kwfgrid.gworkflowdl.protocol.structure.*;
20
21 import org.glassbox.SwingFactory;
22 import org.glassbox.Theme;
23 import org.glassbox.gui.*;
24 import org.glassbox.graphview.SingleNodeSelectionManipulator;
25 import org.glassbox.widgets.VisibleExecutor;
26 import org.glassbox.executor.Executor;
27
28 import java.awt.*;
29 import java.awt.event.*;
30 import javax.swing.*;
31
32 import org.apache.log4j.Logger;
33
34 /***
35 A widget to add and remove tokens from places. Must be member of a <code>WorkflowGroup</code>.
36 This widget has the following properties which can be configured in the application's theme:<br>
37 <ul>
38 <li>kwfgrid.PlaceInspector.cursor</li>
39 <li>kwfgrid.PlaceInspector.task.background.color</li>
40 <li>kwfgrid.PlaceInspector.task.text.color</li>
41 <li>kwfgrid.PlaceInspector.task.insets</li>
42 <li>kwfgrid.PlaceInspector.task.font</li>
43 </ul>
44 */
45 public class PlaceInspector extends AbstractMember implements SingleNodeSelectionManipulator.Controller {
46 public static final String IDENTIFIER = "kwfgrid.PlaceInspector";
47
48 private static final String TASK_THEME_PREFIX = "kwfgrid.PlaceInspector.task";
49 private static final String MANIPULATOR_THEME_PREFIX = "glassbox.SingleNodeSelectionManipulator";
50 private static final String CURSOR_KEY = "kwfgrid.PlaceInspector.cursor";
51 private static final Cursor CURSOR = Theme.getCursor(CURSOR_KEY);
52
53 private static final Logger logger = Logger.getLogger(PlaceInspector.class);
54
55
56
57
58
59 private SingleNodeSelectionManipulator GRAPH_MANIPULATOR =
60 new SingleNodeSelectionManipulator(IDENTIFIER, MANIPULATOR_THEME_PREFIX, CURSOR, this, PlaceNode.class);
61
62
63
64
65
66 private WindowListener WINDOW_LISTENER = new WindowAdapter() {
67 public void windowClosing(WindowEvent e) {
68 setPlaceNode(null);
69 }
70 };
71
72
73
74
75
76 private boolean _active;
77 private PlaceInspectorFrame _frame;
78 private Executor _executor;
79 private UAA _uaa;
80 private PlaceNode _placenode;
81 private ProtocolWorkflow _workflow;
82
83 public PlaceInspector(Executor executor, UAA uaa) {
84 _executor = executor;
85 _uaa = uaa;
86 _active = false;
87 _placenode = null;
88 _workflow = null;
89 _frame = null;
90 GRAPH_MANIPULATOR.setEnabled(true);
91 }
92
93 protected ProtocolWorkflow getWorkflow() {
94 return _workflow;
95 }
96
97 public boolean isActive() {
98 return _active;
99 }
100
101 public void setActive(boolean active) {
102 _active = active;
103 if (!active) {
104 setPlaceNode(null);
105 }
106 if (active) getGroup().setProperty(WorkflowGroup.ACTIVE_TOOL_KEY, IDENTIFIER);
107 }
108
109 public Manipulator getManipulator() {
110 return GRAPH_MANIPULATOR;
111 }
112
113 public void setPlaceNode(PlaceNode node) {
114 getFrame().setPlace(node==null?null:(ProtocolPlace)node.getPlace());
115 _placenode = node;
116 GRAPH_MANIPULATOR.setSelectedNode(node);
117
118
119
120
121 }
122
123 public PlaceNode getPlaceNode() {
124 return _placenode;
125 }
126
127 protected PlaceInspectorFrame getFrame() {
128 if (_frame==null) {
129 _frame = new PlaceInspectorFrame(_workflow, _executor);
130 _frame.addWindowListener(WINDOW_LISTENER);
131 }
132 return _frame;
133 }
134
135 protected void disposeFrame() {
136 if (_frame!=null) {
137 _frame.dispose();
138 _frame = null;
139 }
140 }
141
142
143
144
145
146 public void notifyNodeSelected(Node node) {
147 setActive(node!=null);
148 setPlaceNode((PlaceNode)node);
149 }
150
151
152
153
154
155 private void updateState() {
156 logger.debug("updateState()");
157
158 if (getGroup()!=null) {
159 Object modalmember = getGroup().getProperty(VisibleGroup.MODAL_MEMBER_KEY);
160 Object status = getGroup().getProperty(WorkflowGroup.WORKFLOW_STATUS_KEY);
161 Object appstatus = getGroup().getProperty(Group.APPLICATION_STATUS_KEY);
162 boolean document = getWorkflow() != null;
163 String activetool = (String)getGroup().getProperty(WorkflowGroup.ACTIVE_TOOL_KEY);
164
165 if (status==null) status = WorkflowGroup.STATUS_UNDEFINED;
166
167 if (!IDENTIFIER.equals(activetool) && isActive()) {
168 setActive(false);
169 }
170
171 if (!document ||
172 WorkflowGroup.STATUS_RUNNING.equals(status) ||
173 WorkflowGroup.STATUS_ACTIVE.equals(status)) {
174 if (isActive()) {
175 setActive(false);
176 getGroup().setProperty(WorkflowGroup.ACTIVE_TOOL_KEY, null);
177 }
178 } else if (modalmember!=null) {
179 getFrame().setEnabled(false);
180 } else {
181 boolean editable =
182 WorkflowGroup.STATUS_INITIATED.equals(status) ||
183 WorkflowGroup.STATUS_SUSPENDED.equals(status);
184 getFrame().setEnabled(true);
185 getFrame().setEditable(editable);
186 }
187 }
188
189 logger.debug("updateState.exit");
190 }
191
192
193
194
195
196 public void groupPropertyChanged(String name, Object oldvalue, Object newvalue) {
197 logger.debug("groupPropertyChanged("+name+", "+oldvalue+", "+newvalue+")");
198
199 if (name.equals(Group.APPLICATION_STATUS_KEY)) {
200 updateState();
201 } else if (name.equals(VisibleGroup.MODAL_MEMBER_KEY)) {
202 updateState();
203 } else if (name.equals(WorkflowGroup.WORKFLOW_STATUS_KEY)) {
204 updateState();
205 } else if (name.equals(WorkflowGroup.ACTIVE_TOOL_KEY)) {
206 updateState();
207 } else if (name.equals(WorkflowGroup.ACTIVE_WORKFLOW_DOCUMENT_KEY)) {
208 setPlaceNode(null);
209 disposeFrame();
210 _workflow = (ProtocolWorkflow)newvalue;
211 updateState();
212 }
213
214 logger.debug("groupPropertyChanged.exit");
215 }
216
217 public String getIdentifier() {
218 return IDENTIFIER;
219 }
220
221 /***
222 Set the group of this member.
223 */
224 public void setGroup(Group g) {
225 super.setGroup(g);
226
227 setPlaceNode(null);
228 disposeFrame();
229 if (g!=null) {
230 _workflow = (ProtocolWorkflow)g.getProperty(WorkflowGroup.ACTIVE_WORKFLOW_DOCUMENT_KEY);
231 }
232 logger.debug("Workflow: "+_workflow);
233 }
234 }