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