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 net.kwfgrid.gwui.gui.*;
9   import net.kwfgrid.gworkflowdl.protocol.structure.*;
10  
11  import org.glassbox.gui.*;
12  import org.glassbox.Theme;
13  import org.glassbox.SwingFactory;
14  import org.glassbox.SwingThread;
15  import org.glassbox.widgets.VisibleExecutor;
16  import org.glassbox.executor.Executor;
17  
18  import javax.swing.*;
19  import java.awt.*;
20  import java.awt.event.ActionEvent;
21  import java.awt.event.ActionListener;
22  
23  import org.apache.log4j.Logger;
24  
25  /***
26     A widget to inspect the current workflow document.
27     This widget has the following properties which can be configured in the application's theme:<br>
28     <ul>
29     <li>kwfgrid.WorkflowDocumentInspector.button.icon</li>
30     <li>kwfgrid.Toolbar.background.color</li>
31     <li>kwfgrid.Toolbar.border.color</li>
32     <li>kwfgrid.Toolbar.insets</li>
33     <li>kwfgrid.Toolbar.layout-gap.size</li>
34     <li>kwfgrid.Toolbar.button.background.color</li>
35     <li>kwfgrid.Toolbar.button.border.color</li>
36     <li>kwfgrid.Toolbar.button.insets</li>
37     </ul>
38   */
39  public class WorkflowDocumentInspector extends AbstractMember implements VisibleMember {
40      public static final String IDENTIFIER = "net.kwfgrid.gwui.WorkflowDocumentInspector";
41  
42      private static final String TASK_THEME_PREFIX = "kwfgrid.WorkflowDocumentInspector.task";
43      private static final String BUTTON_THEME_PREFIX = "kwfgrid.Toolbar.button";
44      private static final String PANEL_THEME_PREFIX = "kwfgrid.Toolbar";
45      private static final String ICON_KEY = "kwfgrid.WorkflowDocumentInspector.button.icon";
46      private static final Icon ICON = Theme.getIcon(ICON_KEY);
47      private static final String LAYOUT_GAP_KEY = "kwfgrid.Toolbar.layout-gap.size";
48      private static final Dimension LAYOUT_GAP = Theme.getSize(LAYOUT_GAP_KEY);
49  
50      private static Logger logger = Logger.getLogger(WorkflowDocumentInspector.class);
51  
52      private class OpenAction extends AbstractAction {
53  	public OpenAction(Icon icon) {
54  	    super(null, icon);
55  	}
56  
57  	public void actionPerformed(ActionEvent e) {
58  	    getFrame().setWorkflow(getWorkflow());
59  	}
60      }
61  
62      private Executor _executor;
63      private JPanel _view;
64      private JButton _button;
65      private WorkflowInspectorFrame _frame;
66      private ProtocolWorkflow _workflow;
67  
68      public WorkflowDocumentInspector(Executor executor) {
69  	_executor = executor;
70  	_view = null;	
71  	_frame = null;
72  	_workflow = null;
73      }
74  
75      protected ProtocolWorkflow getWorkflow() {
76  	return _workflow;
77      }
78  
79      protected WorkflowInspectorFrame getFrame() {
80  	if (_frame==null) {
81  	    _frame = new WorkflowInspectorFrame(_workflow, _executor);
82  	}
83  	return _frame;
84      }
85  
86      protected void updateState() {
87  	if (getGroup()!=null && _view!=null) {
88  	    Object modalmember = getGroup().getProperty(VisibleGroup.MODAL_MEMBER_KEY);
89  	    Object status = getGroup().getProperty(WorkflowGroup.WORKFLOW_STATUS_KEY);
90  	    Object appstatus = getGroup().getProperty(Group.APPLICATION_STATUS_KEY);
91  	    
92  	    if (status==null) status = WorkflowGroup.STATUS_UNDEFINED;
93  	    
94  	    if (Group.EXITING.equals(appstatus) || status.equals(WorkflowGroup.STATUS_UNDEFINED)) {
95  		_view.setVisible(false);
96  		getFrame().dispose();
97  	    } else {
98  		_view.setVisible(true);
99  		if (modalmember!=null || status.equals(WorkflowGroup.STATUS_UNDEFINED)) {
100 		    _button.setEnabled(false);
101 		    _button.setToolTipText(null);
102 		    getFrame().setEnabled(false);
103 		} else {
104 		    getFrame().setEnabled(true); //status.equals(WorkflowGroup.STATUS_SUSPENDED) || status.equals(WorkflowGroup.STATUS_INITIATED));
105 		    _button.setEnabled(true);
106 		    _button.setToolTipText("Open Workflow Document Inspector");
107 		}
108 	    }
109 	}	
110     }
111 
112     public JComponent getView() {
113 	if (_view==null) {
114 	    _button = SwingFactory.createButton(BUTTON_THEME_PREFIX);
115 	    _button.setAction(new OpenAction(ICON));
116 	    _view = SwingFactory.createPanel(PANEL_THEME_PREFIX);
117 	    _view.setLayout(new FlowLayout(FlowLayout.LEFT, LAYOUT_GAP.width, LAYOUT_GAP.height));
118 	    _view.add(_button);
119 	    _view.setSize(_view.getLayout().preferredLayoutSize(_view));
120 	    _view.validate();
121 	    updateState();
122 	}
123 	return _view;
124     }
125 
126 
127     public String getIdentifier() {
128 	return IDENTIFIER;
129     }
130 
131     public void groupPropertyChanged(String name, Object oldvalue, Object newvalue) {
132 	logger.debug("groupPropertyChanged("+name+", "+oldvalue+", "+newvalue+")");
133 
134 	if (name.equals(Group.APPLICATION_STATUS_KEY)) {
135 	    updateState();
136 	} else if (name.equals(VisibleGroup.MODAL_MEMBER_KEY)) {
137 	    updateState();
138 	} else if (name.equals(WorkflowGroup.WORKFLOW_STATUS_KEY)) {
139 	    Object status = getGroup().getProperty(WorkflowGroup.WORKFLOW_STATUS_KEY);
140 	    /*
141 	      Causes Deadlock currently?? FIXME!
142 	    
143 	      if (status.equals(WorkflowGroup.STATUS_SUSPENDED) || 
144 	      status.equals(WorkflowGroup.STATUS_INITIATED) || 
145 	      status.equals(WorkflowGroup.STATUS_TERMINATED) ||
146 	      status.equals(WorkflowGroup.STATUS_COMPLETED)) {
147 	      getFrame().updateWorkflowDocument();
148 	      }	
149 	    */	
150 	    updateState();
151 	} else if (name.equals(WorkflowGroup.ACTIVE_WORKFLOW_DOCUMENT_KEY)) {
152 	    getFrame().setWorkflow(null);
153 	    _workflow = (ProtocolWorkflow)newvalue;	    
154 	    updateState();
155 	}
156 
157 	logger.debug("groupPropertyChanged.exit");
158     }    
159 
160     /***
161        Set the group of this member.
162     */
163     public void setGroup(Group g) {
164 	super.setGroup(g);
165 
166 	getFrame().setWorkflow(null);
167 
168 	if (g!=null) {
169 	    _workflow = (ProtocolWorkflow)g.getProperty(WorkflowGroup.ACTIVE_WORKFLOW_DOCUMENT_KEY);
170 	}
171     }
172 }