KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > terracotta > dso > editors > LocksPanel


1 /*
2  * All content copyright (c) 2003-2006 Terracotta, Inc., except as may otherwise be noted in a separate copyright notice. All rights reserved.
3  */

4 package org.terracotta.dso.editors;
5
6 import org.apache.xmlbeans.StringEnumAbstractBase;
7 import org.eclipse.core.resources.IProject;
8
9 import org.dijon.Button;
10 import org.dijon.ComboBox;
11 import org.dijon.ComboModel;
12 import org.dijon.ContainerResource;
13 import org.dijon.DefaultCellEditor;
14
15 import com.tc.admin.common.XObjectTableModel;
16 import com.tc.admin.common.XTable;
17 import com.tc.admin.common.XTableCellRenderer;
18 import org.terracotta.dso.editors.chooser.MethodChooser;
19 import com.terracottatech.config.Autolock;
20 import com.terracottatech.config.DsoApplication;
21 import com.terracottatech.config.LockLevel;
22 import com.terracottatech.config.Locks;
23 import com.terracottatech.config.NamedLock;
24
25 import java.awt.Frame JavaDoc;
26 import java.awt.event.ActionEvent JavaDoc;
27 import java.awt.event.ActionListener JavaDoc;
28
29 import javax.swing.event.ListSelectionEvent JavaDoc;
30 import javax.swing.event.ListSelectionListener JavaDoc;
31 import javax.swing.event.TableModelEvent JavaDoc;
32 import javax.swing.event.TableModelListener JavaDoc;
33
34 public class LocksPanel extends ConfigurationEditorPanel
35   implements TableModelListener JavaDoc
36 {
37   private IProject m_project;
38   private DsoApplication m_dsoApp;
39   private Locks m_locks;
40   private XTable m_autoLockTable;
41   private AutoLocksModel m_autoLocksModel;
42   private Button m_addAutoLockButton;
43   private ActionListener JavaDoc m_addAutoLockListener;
44   private Button m_removeAutoLockButton;
45   private ActionListener JavaDoc m_removeAutoLockListener;
46   private ListSelectionListener JavaDoc m_autoLocksListener;
47   private XTable m_namedLockTable;
48   private NamedLocksModel m_namedLocksModel;
49   private Button m_addNamedLockButton;
50   private ActionListener JavaDoc m_addNamedLockListener;
51   private Button m_removeNamedLockButton;
52   private ActionListener JavaDoc m_removeNamedLockListener;
53   private ListSelectionListener JavaDoc m_namedLocksListener;
54   private MethodChooser m_methodChooser;
55   private AutoLockChooserListener m_autoLockChooserListener;
56   private NamedLockChooserListener m_namedLockChooserListener;
57   
58   public LocksPanel() {
59     super();
60   }
61   
62   public void load(ContainerResource containerRes) {
63     super.load(containerRes);
64
65     m_autoLockTable = (XTable)findComponent("AutoLockTable");
66     m_autoLockTable.setModel(m_autoLocksModel = new AutoLocksModel());
67     m_autoLocksListener = new ListSelectionListener JavaDoc() {
68       public void valueChanged(ListSelectionEvent JavaDoc lse) {
69         if(!lse.getValueIsAdjusting()) {
70           int[] sel = m_autoLockTable.getSelectedRows();
71           m_removeAutoLockButton.setEnabled(sel != null && sel.length > 0);
72         }
73       }
74     };
75     m_autoLockTable.setDefaultRenderer(StringEnumAbstractBase.class, new LockLevelRenderer());
76     m_autoLockTable.setDefaultEditor(StringEnumAbstractBase.class, new LockLevelEditor());
77
78     m_addAutoLockButton = (Button)findComponent("AddAutoLockButton");
79     m_addAutoLockListener = new ActionListener JavaDoc() {
80       public void actionPerformed(ActionEvent JavaDoc ae) {
81         MethodChooser chsr = getAutoLockChooser();
82         
83         chsr.setup(m_project);
84         chsr.center(LocksPanel.this.getAncestorOfClass(Frame JavaDoc.class));
85         chsr.setVisible(true);
86       }
87     };
88
89     m_removeAutoLockButton = (Button)findComponent("RemoveAutoLockButton");
90     m_removeAutoLockListener = new ActionListener JavaDoc() {
91       public void actionPerformed(ActionEvent JavaDoc ae) {
92         int[] selection = m_autoLockTable.getSelectedRows();
93         int row;
94         
95         for(int i = selection.length-1; i >= 0; i--) {
96           row = selection[i];
97           
98           ensureLocks().removeAutolock(row);
99           m_autoLocksModel.remove(row);
100           m_autoLocksModel.fireTableRowsDeleted(row, row);
101         }
102       }
103     };
104     
105     m_namedLockTable = (XTable)findComponent("NamedLockTable");
106     m_namedLockTable.setModel(m_namedLocksModel = new NamedLocksModel());
107     m_namedLocksListener = new ListSelectionListener JavaDoc() {
108       public void valueChanged(ListSelectionEvent JavaDoc lse) {
109         if(!lse.getValueIsAdjusting()) {
110           int[] sel = m_namedLockTable.getSelectedRows();
111           m_removeNamedLockButton.setEnabled(sel != null && sel.length > 0);
112         }
113       }
114     };
115     m_namedLockTable.setDefaultRenderer(StringEnumAbstractBase.class, new LockLevelRenderer());
116     m_namedLockTable.setDefaultEditor(StringEnumAbstractBase.class, new LockLevelEditor());
117     
118     m_addNamedLockButton = (Button)findComponent("AddNamedLockButton");
119     m_addNamedLockListener = new ActionListener JavaDoc() {
120       public void actionPerformed(ActionEvent JavaDoc ae) {
121         MethodChooser chsr = getNamedLockChooser();
122         
123         chsr.setup(m_project);
124         chsr.center(LocksPanel.this.getAncestorOfClass(Frame JavaDoc.class));
125         chsr.setVisible(true);
126       }
127     };
128     
129     m_removeNamedLockButton = (Button)findComponent("RemoveNamedLockButton");
130     m_removeNamedLockListener = new ActionListener JavaDoc() {
131       public void actionPerformed(ActionEvent JavaDoc ae) {
132         int[] selection = m_namedLockTable.getSelectedRows();
133         int row;
134         
135         for(int i = selection.length-1; i >= 0; i--) {
136           row = selection[i];
137
138           m_namedLocksModel.remove(row);
139           ensureLocks().removeNamedLock(row);
140           m_namedLocksModel.fireTableRowsDeleted(row, row);
141         }
142       }
143     };
144   }
145   
146   private AutoLockChooserListener getAutoLockChooserListener() {
147     if(m_autoLockChooserListener == null) {
148       m_autoLockChooserListener = new AutoLockChooserListener();
149     }
150     
151     return m_autoLockChooserListener;
152   }
153   
154   private MethodChooser getAutoLockChooser() {
155     if(m_methodChooser == null) {
156       Frame JavaDoc owner = (Frame JavaDoc)getAncestorOfClass(Frame JavaDoc.class);
157       m_methodChooser = new MethodChooser(owner);
158     }
159     m_methodChooser.setListener(getAutoLockChooserListener());
160     
161     return m_methodChooser;
162   }
163
164   private NamedLockChooserListener getNamedLockChooserListener() {
165     if(m_namedLockChooserListener == null) {
166       m_namedLockChooserListener = new NamedLockChooserListener();
167     }
168     
169     return m_namedLockChooserListener;
170   }
171   
172   private MethodChooser getNamedLockChooser() {
173     if(m_methodChooser == null) {
174       Frame JavaDoc owner = (Frame JavaDoc)getAncestorOfClass(Frame JavaDoc.class);
175       m_methodChooser = new MethodChooser(owner);
176     }
177     m_methodChooser.setListener(getNamedLockChooserListener());
178     
179     return m_methodChooser;
180   }
181
182   class AutoLockChooserListener implements ActionListener JavaDoc {
183     public void actionPerformed(ActionEvent JavaDoc ae) {
184       String JavaDoc[] expressions = m_methodChooser.getMethodExpressions();
185       
186       for(int i = 0; i < expressions.length; i++) {
187         internalAddAutolock(expressions[i]);
188       }
189     }
190   }
191
192   class NamedLockChooserListener implements ActionListener JavaDoc {
193     public void actionPerformed(ActionEvent JavaDoc ae) {
194       String JavaDoc[] expressions = m_methodChooser.getMethodExpressions();
195       
196       for(int i = 0; i < expressions.length; i++) {
197         internalAddNamedLock(expressions[i]);
198       }
199     }
200   }
201
202   public boolean hasAnySet() {
203     return m_locks != null &&
204           (m_locks.sizeOfAutolockArray() > 0 ||
205            m_locks.sizeOfNamedLockArray() > 0);
206   }
207  
208   private Locks ensureLocks() {
209     if(m_locks == null) {
210       ensureXmlObject();
211     }
212     return m_locks;
213   }
214   
215   public void ensureXmlObject() {
216     super.ensureXmlObject();
217     
218     if(m_locks == null) {
219       removeListeners();
220       m_locks = m_dsoApp.addNewLocks();
221       updateChildren();
222       addListeners();
223     }
224   }
225   
226   private void syncModel() {
227     if(!hasAnySet() && m_dsoApp.getLocks() != null) {
228       m_dsoApp.unsetLocks();
229       m_locks = null;
230       fireXmlObjectStructureChanged(m_dsoApp);
231     }
232
233     setDirty();
234   }
235
236   private void addListeners() {
237     m_autoLockTable.getSelectionModel().addListSelectionListener(m_autoLocksListener);
238     m_addAutoLockButton.addActionListener(m_addAutoLockListener);
239     m_removeAutoLockButton.addActionListener(m_removeAutoLockListener);
240     m_autoLocksModel.addTableModelListener(this);
241     
242     m_namedLockTable.getSelectionModel().addListSelectionListener(m_namedLocksListener);
243     m_addNamedLockButton.addActionListener(m_addNamedLockListener);
244     m_removeNamedLockButton.addActionListener(m_removeNamedLockListener);
245     m_namedLocksModel.addTableModelListener(this);
246   }
247   
248   private void removeListeners() {
249     m_autoLockTable.getSelectionModel().removeListSelectionListener(m_autoLocksListener);
250     m_addAutoLockButton.removeActionListener(m_addAutoLockListener);
251     m_removeAutoLockButton.removeActionListener(m_removeAutoLockListener);
252     m_autoLocksModel.removeTableModelListener(this);
253     
254     m_namedLockTable.getSelectionModel().removeListSelectionListener(m_namedLocksListener);
255     m_addNamedLockButton.removeActionListener(m_addNamedLockListener);
256     m_removeNamedLockButton.removeActionListener(m_removeNamedLockListener);
257     m_namedLocksModel.removeTableModelListener(this);
258   }
259   
260   public void tableChanged(TableModelEvent JavaDoc e) {
261     syncModel();
262   }
263
264   public void updateChildren() {
265     m_autoLocksModel.setAutoLocks(m_locks != null ? m_locks.getAutolockArray() : null);
266     m_namedLocksModel.setNamedLocks(m_locks != null ? m_locks.getNamedLockArray() : null);
267   }
268   
269   public void updateModel() {
270     removeListeners();
271     updateChildren();
272     addListeners();
273   }
274   
275   public void setup(IProject project, DsoApplication dsoApp) {
276     setEnabled(true);
277     removeListeners();
278
279     m_project = project;
280     m_dsoApp = dsoApp;
281     m_locks = m_dsoApp != null ? m_dsoApp.getLocks() : null;
282
283     updateChildren();
284     addListeners();
285   }
286
287   public void tearDown() {
288     removeListeners();
289     
290     m_project = null;
291     m_dsoApp = null;
292     m_locks = null;
293
294     m_autoLocksModel.clear();
295     m_namedLocksModel.clear();
296     
297     setEnabled(false);
298   }
299   
300   private static final String JavaDoc[] AUTO_LOCK_FIELDS = {
301     "MethodExpression", "LockLevel"
302   };
303   
304   private static final String JavaDoc[] AUTO_LOCK_HEADERS = {
305     "Method expression", "Lock level"
306   };
307                                                   
308   class AutoLocksModel extends XObjectTableModel {
309     public AutoLocksModel() {
310       super(Autolock.class, AUTO_LOCK_FIELDS, AUTO_LOCK_HEADERS);
311     }
312     
313     public void setAutoLocks(Autolock[] autoLocks) {
314       set(autoLocks);
315       fireTableDataChanged();
316     }
317     
318     public boolean hasEditor(Class JavaDoc type) {
319       return StringEnumAbstractBase.class.isAssignableFrom(type);
320     }
321   }
322
323   private static final String JavaDoc[] NAMED_LOCK_FIELDS = {
324     "LockName", AUTO_LOCK_FIELDS[0], AUTO_LOCK_FIELDS[1]
325   };
326                                                    
327   private static final String JavaDoc[] NAMED_LOCK_HEADERS = {
328     "Lock name", AUTO_LOCK_HEADERS[0], AUTO_LOCK_HEADERS[1]
329   };
330                                                                                                    
331   class NamedLocksModel extends XObjectTableModel {
332     public NamedLocksModel() {
333       super(NamedLock.class, NAMED_LOCK_FIELDS, NAMED_LOCK_HEADERS);
334     }
335     
336     public void setNamedLocks(NamedLock[] namedLocks) {
337       set(namedLocks);
338       fireTableDataChanged();
339     }
340     
341     public boolean hasEditor(Class JavaDoc type) {
342       return StringEnumAbstractBase.class.isAssignableFrom(type);
343     }
344   }
345   
346   static class LockLevelRenderer extends XTableCellRenderer.UIResource {
347     public LockLevelRenderer() {
348       super();
349     }
350
351     public void setValue(Object JavaDoc value) {
352       setText((value == null) ? "" : value.toString());
353     }
354   }
355   
356   static class LockLevelEditor extends DefaultCellEditor {
357     private static StringEnumAbstractBase[] choices = {
358       LockLevel.READ, LockLevel.WRITE, LockLevel.CONCURRENT
359     };
360     
361     private static ComboBox m_editor = new ComboBox(new ComboModel(choices));
362     
363     public LockLevelEditor() {
364       super(m_editor);
365     }
366   }
367   
368   private void internalAddAutolock(String JavaDoc expression) {
369     internalAddAutolock(expression, LockLevel.WRITE);
370   }
371
372   private void internalAddAutolock(String JavaDoc expression, LockLevel.Enum level) {
373     Locks locks = ensureLocks();
374     Autolock lock = locks.addNewAutolock();
375     
376     lock.setMethodExpression(expression);
377     lock.setLockLevel(level);
378     m_autoLocksModel.add(lock);
379
380     int row = m_autoLocksModel.getRowCount()-1;
381     m_autoLocksModel.fireTableRowsInserted(row, row);
382     m_autoLockTable.setRowSelectionInterval(row, row);
383   }
384
385   private void internalAddNamedLock(String JavaDoc expression) {
386     internalAddNamedLock(expression, "NewLock", LockLevel.WRITE);
387   }
388
389   private void internalAddNamedLock(
390     String JavaDoc expression,
391     String JavaDoc name,
392     LockLevel.Enum level)
393   {
394     Locks locks = ensureLocks();
395     NamedLock lock = locks.addNewNamedLock();
396     
397     lock.setMethodExpression(expression);
398     lock.setLockName(name);
399     lock.setLockLevel(level);
400     m_namedLocksModel.add(lock);
401
402     int row = m_namedLocksModel.getRowCount()-1;
403     m_namedLocksModel.fireTableRowsInserted(row, row);
404     m_namedLockTable.setRowSelectionInterval(row, row);
405   }
406 }
407
Popular Tags