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  
12  import org.glassbox.executor.Executor;
13  
14  import java.awt.*;
15  import java.util.List;
16  import javax.swing.*;
17  import javax.swing.event.TableModelListener;
18  import javax.swing.event.TableModelEvent;
19  import javax.swing.border.TitledBorder;
20  import javax.swing.table.*;
21  
22  public abstract class AbstractTransitionEdgeEditor extends AbstractWorkflowElementEditor {
23      ///
24      /// Controller for the table.
25      /// ....................................................................................................
26      private class EdgeTableController implements TableModelListener {
27  	public void tableChanged(TableModelEvent e) {
28  	    if (e.getType() == TableModelEvent.UPDATE) {
29  		int column = e.getColumn();
30  		int row = e.getFirstRow();
31  		if (column == COLUMN_INDEX_EXPRESSION) {
32  		    final Object value = _edgetablemodel.getValueAt(row, column);
33  		    final Edge arc = getEdge(row);
34  		
35  		    setPerformingTask(true);
36  		    getExecutor().execute(new GUIMethodCallTask("Setting new edge expression ...", 
37  								getExecutor(), 
38  								AbstractTransitionEdgeEditor.this) {
39  			    protected void execute() {
40  				arc.setExpression((String)value);
41  			    }
42  			});	
43  		}
44  	    }
45  	}
46      }
47  
48      private static final int COLUMN_INDEX_EXPRESSION = 0;
49      private static final int COLUMN_INDEX_PLACEID = 1;
50      private static final String[] COLUMN_NAMES = new String[] { "Expression", "Place ID" };
51  
52      private JPanel _view;
53      private JTable _edgetable;
54      private TableSorter _edgetablesorter;
55      private TableModel _edgetablemodel;
56      private EdgeTableController _edgetablecontroller;
57  
58      protected AbstractTransitionEdgeEditor(Executor executor, ProtocolWorkflow workflow, ProtocolTransition transition) {
59  	super(executor, workflow, transition);
60  	_view = null;
61  	_edgetable = null;
62  	_edgetablesorter = null;
63  	_edgetablemodel = null;
64  	_edgetablecontroller = null;
65      }
66  
67      protected abstract String getTitle();
68  
69      protected abstract Edge getEdge(int index);
70  
71      protected abstract Edge[] getEdges();
72  
73      protected abstract String getElementName();
74  
75      public void objectsAdded(IStructureObject parent, String namespace, String name, List objects) {
76  	if (addRemoveAffectsEdgeTableModel(parent, namespace, name)) updateEdgeTableModel();
77      }
78  
79      public void objectsRemoved(IStructureObject parent, String namespace, String name, List objects) {
80  	if (addRemoveAffectsEdgeTableModel(parent, namespace, name)) updateEdgeTableModel();
81      }
82      
83      public void propertyChanged(IStructureObject parent, String namespace, String name, Object newvalue) {
84  	if (propertyChangeAffectsEdgeTableModel(parent, namespace, name)) updateEdgeTableModel();
85      }
86  
87      private boolean addRemoveAffectsEdgeTableModel(IStructureObject parent, String namespace, String name) {
88  	return (parent == getElement() &&
89  		getElementName().equals(name) &&
90  		XMLUtilities.equalNamespace(namespace, ProtocolEdge.NAMESPACE));
91      }
92      
93      private boolean propertyChangeAffectsEdgeTableModel(IStructureObject parent, String namespace, String name) {
94  	return (parent instanceof Edge &&
95  		((IChildObject)parent).getParent() == getElement());	
96      }
97  
98      private void updateEdgeTableModel() {
99  	_edgetablemodel = createEdgeTableModel(getEdges());
100 	_edgetablemodel.addTableModelListener(_edgetablecontroller);
101 	_edgetablesorter.setTableModel(_edgetablemodel);
102 	updateView();
103     }
104 
105     private TableModel createEdgeTableModel(Edge[] edges) {
106 	if (edges == null) edges = new Edge[0];
107 	String[][] data = new String[edges.length][2];
108 	for (int i=0; i<edges.length; i++) {
109 	    data[i][COLUMN_INDEX_EXPRESSION] = edges[i].getExpression();
110 	    data[i][COLUMN_INDEX_PLACEID] = edges[i].getPlaceID(); 
111 	}
112 	return new DefaultTableModel(data, COLUMN_NAMES) {
113 		public Class getColumnClass(int c) {
114 		    return String.class;
115 		}
116 
117 		public boolean isCellEditable(int row, int column) {
118 		    return column == COLUMN_INDEX_EXPRESSION;
119 		}
120 	    };
121     }
122 
123     protected void updateState() {
124 	_edgetable.setEnabled(isEnabled() && isEditable() && !isPerformingTask());
125     }
126 
127     protected void updateView() {
128 	updateState();
129 	_view.invalidate();
130 	_view.setSize(_view.getLayout().preferredLayoutSize(_view));
131 	_view.doLayout();
132 	_view.validate();	
133     }
134 
135     public JComponent getView() {
136 	if (_view == null) {
137 	    _edgetablecontroller = new EdgeTableController();
138 	    _edgetablemodel = createEdgeTableModel(getEdges());
139 	    _edgetablemodel.addTableModelListener(_edgetablecontroller);
140 	    _edgetablesorter = new TableSorter(_edgetablemodel);
141 	    _edgetable = new JTable(_edgetablesorter);
142 	    _edgetablesorter.setTableHeader(_edgetable.getTableHeader());
143 
144 	    _view = new JPanel();
145 	    _view.setBorder(createBorder(getTitle()));
146 	    _view.setLayout(new GridBagLayout());
147 	    
148 	    GridBagConstraints c = new GridBagConstraints();
149 	    
150 	    c.insets = new Insets(5, 0, 0, 0);
151 	    c.weightx = 1.0;
152 	    c.weighty = 0.0;
153 	    c.gridx = 0;
154 	    c.gridy = 0;
155 	    c.anchor = GridBagConstraints.WEST;
156 	    c.fill = GridBagConstraints.HORIZONTAL;
157 	    c.gridwidth = GridBagConstraints.REMAINDER;
158 	    
159 	    _view.add(_edgetable.getTableHeader(), c);
160 	    
161 	    c.weighty = 1;
162 	    c.gridy = 1;
163 	    c.insets = new Insets(0, 0, 0, 0);
164 	    c.fill = GridBagConstraints.BOTH;
165 
166 	    _view.add(_edgetable, c);
167 	}
168 	return _view;
169     }
170 }