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.structure.Property;
9   import net.kwfgrid.gworkflowdl.structure.GenericProperties;
10  import net.kwfgrid.gworkflowdl.protocol.structure.*;
11  import net.kwfgrid.gwui.workflow.XMLUtilities;
12  
13  import org.glassbox.Theme;
14  import org.glassbox.gui.Visible;
15  import org.glassbox.executor.Executor;
16  
17  import java.awt.BorderLayout;
18  import java.awt.Dimension;
19  import java.awt.Component;
20  import java.awt.Color;
21  import java.awt.Font;
22  import java.awt.event.KeyEvent;
23  import java.awt.event.KeyListener;
24  import java.awt.event.KeyAdapter;
25  import java.util.*;
26  import javax.swing.*;
27  import javax.swing.event.TableModelListener;
28  import javax.swing.event.TableModelEvent;
29  import javax.swing.border.TitledBorder;
30  import javax.swing.table.*;
31  
32  import org.apache.log4j.Logger;
33  
34  /***
35     Abstract super class of an editor for editing the <code>GenericProperties</code> of a place, transition or a workflow.
36   */
37  public abstract class PropertiesEditor extends AbstractWorkflowElementEditor implements SimpleEditTableModel.Controller {
38      private class PropertyTableModel extends AbstractTableModel {
39  	private Property[] _properties;
40  
41  	public PropertyTableModel(Property[] properties) {
42  	    if (properties == null) {
43  		_properties = new Property[0];
44  	    } else {
45  		_properties = properties;
46  	    }
47  	}
48  
49  	public int getRowCount() {
50  	    return _properties.length;
51  	}	
52  
53  	public int getColumnCount() {
54  	    return 2;
55  	}
56  
57  	public String getColumnName(int col) {
58  	    if (col==0) return "Key";
59  	    else return "Value";
60  	}
61  
62  	public Class getColumnClass(int col) {
63  	    return String.class;
64  	}
65  
66  	public Object getValueAt(int row, int column) {
67  	    if (column==0) return _properties[row].getKey();
68  	    return _properties[row].getValue();
69  	}
70  
71  	public void setValueAt(Object value, int row, int column) {
72  	    if (column == 1) {
73  		cellChanged((String)getValueAt(row, 0), (String)value);
74  	    } else {
75  		fireTableCellUpdated(row, column);
76  	    }
77  	}
78  
79  	public boolean isCellEditable(int row, int column) {
80  	    return column == 1;
81  	}
82      }
83      
84      private static final Logger logger = Logger.getLogger(PropertiesEditor.class);
85      
86      private JComponent _view;
87      private JTable _propertytable;
88      private TableSorter _propertytablesorter;
89  
90      /***
91         Constructor.
92         @param executor The invoker for a method call on the workflow structure.
93         @param workflow The edited workflow.
94         @param element The owner of the edited properties, an object in the workflow structure.
95       */
96      public PropertiesEditor(Executor executor, ProtocolWorkflow workflow, IStructureObject element) {
97  	super(executor, workflow, element);
98  	_view = null;
99      }
100     
101     /***
102        Get the actual properties edited by this editor. Must be implemented by subclasses.
103      */
104     protected abstract GenericProperties getElementProperties();
105 
106     public void rowAdded(Object[] row) {
107 	final String key = (String)row[0];
108 	final String value = (String)row[1]==null?"":(String)row[1];
109 
110 	logger.debug("New property added '"+key+"', '"+value+"'.");
111 
112 	setPerformingTask(true);
113 	getExecutor().execute(new GUIMethodCallTask("Adding new property "+key+" with value "+value+" ...", getExecutor(), this) {
114 		protected void execute() {
115 		    getElementProperties().put(key, value);
116 		}
117 	    });	
118     }
119 
120     public void rowsDeleted(final int[] deletion) {
121 	setPerformingTask(true);
122 	getExecutor().execute(new GUIMethodCallTask("Removing selected properties ...", 
123 						    getExecutor(),
124 						    PropertiesEditor.this) {
125 		protected void execute() {
126 		    for (int i=0; i<deletion.length; i++) {
127 			deletion[i] = _propertytablesorter.modelIndex(deletion[i]);
128 		    }
129 		    for (int i=0; i<deletion.length; i++) {
130 			getElementProperties().removeProperty(deletion[i]);
131 			for (int j=i+1; j<deletion.length; j++) {
132 			    if (deletion[j] > deletion[i]) deletion[j]--;
133 			}
134 		    }
135 		}
136 	    });
137     }
138 
139     protected void cellChanged(final String key, final String value) {
140 	logger.debug("Property '"+key+"' changed to "+value);
141 	
142 	setPerformingTask(true);
143 	getExecutor().execute(new GUIMethodCallTask("Setting property "+key+" to new value "+value+" ...", getExecutor(), this) {
144 		protected void execute() {
145 		    getElementProperties().put(key, value);
146 		}
147 	    });
148     }
149 
150     public void objectsAdded(IStructureObject parent, String namespace, String name, List objects) {
151 	if (affectsTableModel(parent, namespace, name)) updateTableModel();
152     }
153 
154     public void objectsRemoved(IStructureObject parent, String namespace, String name, List objects) {
155 	if (affectsTableModel(parent, namespace, name)) updateTableModel();
156     }
157     
158     public void propertyChanged(IStructureObject parent, String namespace, String name, Object newvalue) {
159 	if (affectsTableModel(parent, namespace, name)) updateTableModel();
160     }
161     
162     private boolean affectsTableModel(IStructureObject parent, String namespace, String name) {
163 	if (parent == getElement() &&
164 	    ProtocolProperties.NAME.equals(name) &&
165 	    XMLUtilities.equalNamespace(namespace, ProtocolProperties.NAMESPACE)) {
166 	    return true;
167 	} else if (parent == getElementProperties() && 
168 		   ProtocolProperty.NAME.equals(name) &&
169 		   XMLUtilities.equalNamespace(namespace, ProtocolProperty.NAMESPACE)) {
170 	    return true;
171 	} else if (parent instanceof Property &&
172 		   ((IChildObject)parent).getParent() == getElementProperties()) {
173 	    return true;
174 	}
175 	return false;
176     }
177     
178     private void updateTableModel() {
179 	_propertytablesorter.setTableModel(createPropertyTableModel(getElementProperties().getProperties()));
180 	/* FIXME find added key and auto edit the value.
181 	if (_addedrow != -1) {
182 	    _propertytable.editCellAt(_addedrow, 1);
183 	    _addedrow = -1;
184 	}
185 	*/
186 	updateView();
187     }
188 
189     /***
190        Updates the state of this view.
191      */
192     protected void updateState() {
193 	_propertytable.setEnabled(isEnabled() && isEditable() && !isPerformingTask());
194     }
195 
196     /***
197        Updates this view.
198      */
199     protected void updateView() {
200 	updateState();
201 	_view.invalidate();
202 	_view.setSize(_view.getLayout().preferredLayoutSize(_view));
203 	_view.doLayout();
204 	_view.validate();	
205     }
206 
207     private TableModel createPropertyTableModel(Property[] properties) {
208 	TableModel model = new PropertyTableModel(properties);
209 	//model.addTableModelListener(TABLE_LISTENER);	
210 	return model;
211     }
212 
213     public JComponent getView() {
214 	if (_view==null) {
215 	    _propertytablesorter = new TableSorter(createPropertyTableModel(getElementProperties().getProperties()));	    
216 	    SimpleEditTableModel editor = new SimpleEditTableModel(_propertytablesorter, this, 0, "Add new property ...");	    
217  	    _propertytable = new JTable(editor);
218 	    _propertytable.addKeyListener(editor.getDeleteKeyHandler(_propertytable));
219 	    _propertytablesorter.setTableHeader(_propertytable.getTableHeader());
220 	    _propertytable.setDefaultRenderer(String.class, SimpleEditTableModel.getCellRendererForString());
221 	    _propertytable.setDefaultEditor(String.class, SimpleEditTableModel.getCellEditorForString());
222 	    
223 	    _view = new JPanel();
224 	    _view.setLayout(new BorderLayout());
225 	    _view.add(_propertytable.getTableHeader(), BorderLayout.NORTH);
226 	    _view.add(_propertytable, BorderLayout.CENTER);
227 	    _view.setBorder(createBorder("Properties"));
228 	}
229 	return _view;
230     }    
231 }