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.gui;
7   
8   import net.kwfgrid.gworkflowdl.protocol.structure.*;
9   import net.kwfgrid.gworkflowdl.structure.*;
10  import net.kwfgrid.gwui.workflow.XMLUtilities;
11  import net.kwfgrid.gwui.util.Utilities;
12  
13  import org.glassbox.executor.Executor;
14  
15  import java.awt.*;
16  import java.awt.event.*;
17  import java.util.List;
18  import javax.swing.*;
19  import javax.swing.event.TableModelListener;
20  import javax.swing.event.TableModelEvent;
21  import javax.swing.border.TitledBorder;
22  import javax.swing.table.*;
23  
24  public class PlaceTokenClassEditor extends AbstractWorkflowElementEditor implements ActionListener {
25      ///
26      /// Controller for the table.
27      /// ....................................................................................................
28  
29      private class OwlTableController implements SimpleEditTableModel.Controller, TableModelListener {
30  	public void tableChanged(TableModelEvent e) {
31  	    if (e.getType() == TableModelEvent.UPDATE) {
32  		final int row = e.getFirstRow();
33  		final String newowl = (String)_owltablemodel.getValueAt(row, 0);
34  		getExecutor().execute(new GUIMethodCallTask("Changing selected OWL property...", 
35  							    getExecutor(),
36  							    PlaceTokenClassEditor.this) {
37  			protected void execute() {
38  			    ((Place)getElement()).removeOwl(row);
39  			    ((Place)getElement()).addOwl(newowl);
40  			}
41  		    });		
42  	    }
43  	}
44  
45  	public void rowAdded(final Object[] row) {
46  	    setPerformingTask(true);
47  	    getExecutor().execute(new GUIMethodCallTask("Adding new OWL property ...", 
48  							getExecutor(), 
49  							PlaceTokenClassEditor.this) {
50  		    protected void execute() {
51  			((Place)getElement()).addOwl((String)row[0]);
52  		    }
53  		});	
54  	}
55  	
56  	public void rowsDeleted(final int[] deletion) {
57  	    setPerformingTask(true);
58  	    getExecutor().execute(new GUIMethodCallTask("Removing selected OWL properties ...", 
59  							getExecutor(),
60  							PlaceTokenClassEditor.this) {
61  		    protected void execute() {
62  			for (int i=0; i<deletion.length; i++) {
63  			    deletion[i] = _owltablesorter.modelIndex(deletion[i]);
64  			}
65  			for (int i=0; i<deletion.length; i++) {
66  			    ((Place)getElement()).removeOwl(deletion[i]);
67  			    for (int j=i+1; j<deletion.length; j++) {
68  				if (deletion[j] > deletion[i]) deletion[j]--;
69  			    }
70  			}
71  		    }
72  		});
73  	}
74      }
75      
76      private static final String[] TOKEN_TYPES = new String[] { null, "data", "effect" };
77      private static final String[] TOKEN_TYPE_LABELS = new String[] { "control", "data", "effect" };
78  
79      private JPanel _view;
80      private JComboBox _tcbox;
81      private JTable _owltable;
82      private TableSorter _owltablesorter;
83      private TableModel _owltablemodel;
84      private OwlTableController _owltablecontroller;
85  
86      public PlaceTokenClassEditor(Executor executor, ProtocolWorkflow workflow, ProtocolPlace place) {
87  	super(executor, workflow, place);
88  	_view = null;
89  	_tcbox = null;
90  	_owltable = null;
91  	_owltablesorter = null;
92  	_owltablemodel = null;
93  	_owltablecontroller = null;
94      }
95  
96      public void actionPerformed(ActionEvent e) {
97  	final String tc = TOKEN_TYPES[_tcbox.getSelectedIndex()];
98  	if (!Utilities.equal(tc, ((Place)getElement()).getTokenType())) {
99  	    setPerformingTask(true);	    
100 	    getExecutor().execute(new GUIMethodCallTask("Setting new token type ...", 
101 							getExecutor(),
102 							PlaceTokenClassEditor.this) {
103 		    protected void execute() {
104 			((Place)getElement()).setTokenType(tc);
105 		    }
106 		});		    
107 	}
108     }
109 
110     public void objectsAdded(IStructureObject parent, String namespace, String name, List objects) {
111 	if (addRemoveAffectsOwlTableModel(parent, namespace, name)) updateOwlTableModel();
112     }
113 
114     public void objectsRemoved(IStructureObject parent, String namespace, String name, List objects) {
115 	if (addRemoveAffectsOwlTableModel(parent, namespace, name)) updateOwlTableModel();
116     }
117     
118     public void propertyChanged(IStructureObject parent, String namespace, String name, Object newvalue) {
119 	if (propertyChangeAffectsTokenType(parent, namespace, name)) updateTokenType();	
120     }
121 
122     private boolean addRemoveAffectsOwlTableModel(IStructureObject parent, String namespace, String name) {
123 	return (parent == getElement() &&
124 		ProtocolPlace.NAME_OWL.equals(name) &&
125 		XMLUtilities.equalNamespace(namespace, ProtocolPlace.NAMESPACE));
126     }
127     
128     private boolean propertyChangeAffectsTokenType(IStructureObject parent, String namespace, String name) {
129 	return (parent == getElement() &&
130 		ProtocolPlace.NAME_TOKENTYPE.equals(name) &&
131 		XMLUtilities.equalNamespace(namespace, ProtocolPlace.NAMESPACE_PROPERTIES));
132     }
133 
134     private void updateOwlTableModel() {
135 	_owltablemodel = createOwlTableModel((Owls)getElement());
136 	_owltablemodel.addTableModelListener(_owltablecontroller);
137 	_owltablesorter.setTableModel(_owltablemodel);
138 	updateView();
139     }
140 
141     private void updateTokenType() {
142 	String tc = ((Place)getElement()).getTokenType();
143 	for (int i=0; i<TOKEN_TYPES.length; i++) {
144 	    if (Utilities.equal(TOKEN_TYPES[i], tc)) {
145 		_tcbox.setSelectedIndex(i);
146 		break;
147 	    }
148 	}
149     }
150 
151     private TableModel createOwlTableModel(Owls owl) {
152 	String[] owls = owl.getOwls();
153 	if (owls == null) owls = new String[0];
154 	String[][] data = new String[owls.length][1];
155 	for (int i=0; i<owls.length; i++) {
156 	    data[i][0] = owls[i];
157 	}
158 	return new DefaultTableModel(data, new String[] { "Owl" }) {
159 		public Class getColumnClass(int c) {
160 		    return String.class;
161 		}
162 	    };
163     }
164 
165     protected void updateState() {
166 	_tcbox.setEnabled(isEnabled() && isEditable() && !isPerformingTask());
167 	_owltable.setEnabled(isEnabled() && isEditable() && !isPerformingTask());
168     }
169 
170     protected void updateView() {
171 	updateState();
172 	// _view.invalidate();
173 	// _view.setSize(_view.getLayout().preferredLayoutSize(_view));
174 	// _view.doLayout();
175 	// _view.validate();	
176     }
177 
178     public JComponent getView() {
179 	if (_view == null) {
180 	    _tcbox = new JComboBox(TOKEN_TYPE_LABELS);
181 	    _tcbox.addActionListener(this);
182 	    updateTokenType();
183 
184 	    _owltablecontroller = new OwlTableController();
185 	    _owltablemodel = createOwlTableModel((Owls)getElement());
186 	    _owltablemodel.addTableModelListener(_owltablecontroller);
187 	    _owltablesorter = new TableSorter(_owltablemodel);
188 	    SimpleEditTableModel owleditor = new SimpleEditTableModel(_owltablesorter, _owltablecontroller, 0, "Add new data description reference ...");
189 	    _owltable = new JTable(owleditor);
190 	    _owltablesorter.setTableHeader(_owltable.getTableHeader());
191 	    _owltable.addKeyListener(owleditor.getDeleteKeyHandler(_owltable));
192 	    _owltable.setDefaultRenderer(String.class, SimpleEditTableModel.getCellRendererForString());
193 	    _owltable.setDefaultEditor(String.class, SimpleEditTableModel.getCellEditorForString());
194 
195 	    _view = new JPanel();
196 	    _view.setBorder(createBorder("Token Class"));
197 	    _view.setLayout(new GridBagLayout());
198 	    
199 	    GridBagConstraints c = new GridBagConstraints();
200 	    
201 	    c.insets = new Insets(5, 0, 0, 0);
202 	    c.weightx = 0.1;
203 	    c.weighty = 0.0;
204 	    c.gridx = 0;
205 	    c.gridy = 0;
206 	    c.anchor = GridBagConstraints.WEST;
207 	    c.fill = GridBagConstraints.NONE;
208 	    c.gridwidth = 1;
209 
210 	    _view.add(new JLabel("Type"), c);
211 
212 	    c.gridx = 1;
213 	    c.weightx = 0.9;
214 	    c.fill = GridBagConstraints.HORIZONTAL;
215 	    c.anchor = GridBagConstraints.EAST;	    
216 	    c.gridwidth = GridBagConstraints.REMAINDER;
217 	    
218 	    _view.add(_tcbox, c);
219 	    
220 	    c.gridx = 0;
221 	    c.gridy = 1;
222 	    c.weightx = 1.0;
223 	    c.anchor = GridBagConstraints.WEST;
224 	    c.fill = GridBagConstraints.HORIZONTAL;
225 
226 	    _view.add(new JLabel("Data Description"), c);
227 
228 	    c.gridy = 2;
229 	    c.insets = new Insets(2, 0, 0, 0);
230 	    c.anchor = GridBagConstraints.CENTER;
231 	    c.fill = GridBagConstraints.HORIZONTAL;
232 
233 	    _view.add(_owltable.getTableHeader(), c);
234 	    
235 	    c.weighty = 1.0;
236 	    c.gridy = 3;
237 	    c.insets = new Insets(0, 0, 0, 0);
238 	    c.fill = GridBagConstraints.BOTH;
239 
240 	    _view.add(_owltable, c);	    
241 	}
242 	return _view;
243     }
244 }