View Javadoc

1   /*
2    * Copyright (c) 2005, The K-Wf Grid Consortium
3    * Fraunhofer Institute for Computer Architecture and Software Technology
4    * See http://www.kwfgrid.eu and http://www.first.fraunhofer.de for more details.
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      /// Manipulator for the graph.
63      /// ....................................................................................................
64  
65      private SingleNodeSelectionManipulator GRAPH_MANIPULATOR = 
66  	new SingleNodeSelectionManipulator(IDENTIFIER, MANIPULATOR_THEME_PREFIX, CURSOR, this, TransitionNode.class);
67  
68      ///
69      /// Controller for the TransitionNodeView
70      /// ....................................................................................................
71  
72      private WindowListener WINDOW_LISTENER = new WindowAdapter() {
73  	    public void windowClosing(WindowEvent e) {
74  		setTransitionNode(null);
75  	    }
76  	};
77  
78      ///
79      /// Implementation of TransitionInspector
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 //	if (node != null) {
123 //	    Operation o = node.getTransition().getOperation();
124 //	    if (o != null) {
125 //		if (o.get() instanceof OperationClass) {
126 //		    String owl = ((OperationClass)o.get()).getOwl();
127 //		    if (owl != null)
128 //			_uaa.showAssistantFor(owl);
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     /// Implementation of SingleNodeSelectionManipulator.Controller
155     /// ....................................................................................................
156 
157     public void notifyNodeSelected(Node node) {
158 	setActive(node!=null);
159 	setTransitionNode((TransitionNode)node);
160     }
161 
162     ///
163     /// Implementation of Visible
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     /// Implementation of Member
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 }