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.*;
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      /// Manipulator for the graph.
57      /// ....................................................................................................
58  
59      private SingleNodeSelectionManipulator GRAPH_MANIPULATOR = 
60  	new SingleNodeSelectionManipulator(IDENTIFIER, MANIPULATOR_THEME_PREFIX, CURSOR, this, PlaceNode.class);
61  
62      ///
63      /// Controller for the PlaceTokenEditor
64      /// ....................................................................................................
65  
66      private WindowListener WINDOW_LISTENER = new WindowAdapter() {
67  	    public void windowClosing(WindowEvent e) {
68  		setPlaceNode(null);
69  	    }
70  	};
71  
72      ///
73      /// Implementation of PlaceInspector
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 //	if (node != null) {
118 //	    if (node.getPlace().getOwl() != null)
119 //		_uaa.showAssistantFor(node.getPlace().getOwl());
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     /// Implementation of SingleNodeSelectionManipulator.Controller
144     /// ....................................................................................................
145 
146     public void notifyNodeSelected(Node node) {
147 	setActive(node!=null);
148 	setPlaceNode((PlaceNode)node);
149     }
150 
151     ///
152     /// Implementation of Visible
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     /// Implementation of Member
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 }