1 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 ; 26 import java.awt.event.ActionEvent ; 27 import java.awt.event.ActionListener ; 28 29 import javax.swing.event.ListSelectionEvent ; 30 import javax.swing.event.ListSelectionListener ; 31 import javax.swing.event.TableModelEvent ; 32 import javax.swing.event.TableModelListener ; 33 34 public class LocksPanel extends ConfigurationEditorPanel 35 implements TableModelListener 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 m_addAutoLockListener; 44 private Button m_removeAutoLockButton; 45 private ActionListener m_removeAutoLockListener; 46 private ListSelectionListener m_autoLocksListener; 47 private XTable m_namedLockTable; 48 private NamedLocksModel m_namedLocksModel; 49 private Button m_addNamedLockButton; 50 private ActionListener m_addNamedLockListener; 51 private Button m_removeNamedLockButton; 52 private ActionListener m_removeNamedLockListener; 53 private ListSelectionListener 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 () { 68 public void valueChanged(ListSelectionEvent 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 () { 80 public void actionPerformed(ActionEvent ae) { 81 MethodChooser chsr = getAutoLockChooser(); 82 83 chsr.setup(m_project); 84 chsr.center(LocksPanel.this.getAncestorOfClass(Frame .class)); 85 chsr.setVisible(true); 86 } 87 }; 88 89 m_removeAutoLockButton = (Button)findComponent("RemoveAutoLockButton"); 90 m_removeAutoLockListener = new ActionListener () { 91 public void actionPerformed(ActionEvent 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 () { 108 public void valueChanged(ListSelectionEvent 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 () { 120 public void actionPerformed(ActionEvent ae) { 121 MethodChooser chsr = getNamedLockChooser(); 122 123 chsr.setup(m_project); 124 chsr.center(LocksPanel.this.getAncestorOfClass(Frame .class)); 125 chsr.setVisible(true); 126 } 127 }; 128 129 m_removeNamedLockButton = (Button)findComponent("RemoveNamedLockButton"); 130 m_removeNamedLockListener = new ActionListener () { 131 public void actionPerformed(ActionEvent 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 owner = (Frame )getAncestorOfClass(Frame .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 owner = (Frame )getAncestorOfClass(Frame .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 { 183 public void actionPerformed(ActionEvent ae) { 184 String [] 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 { 193 public void actionPerformed(ActionEvent ae) { 194 String [] 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 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 [] AUTO_LOCK_FIELDS = { 301 "MethodExpression", "LockLevel" 302 }; 303 304 private static final String [] 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 type) { 319 return StringEnumAbstractBase.class.isAssignableFrom(type); 320 } 321 } 322 323 private static final String [] NAMED_LOCK_FIELDS = { 324 "LockName", AUTO_LOCK_FIELDS[0], AUTO_LOCK_FIELDS[1] 325 }; 326 327 private static final String [] 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 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 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 expression) { 369 internalAddAutolock(expression, LockLevel.WRITE); 370 } 371 372 private void internalAddAutolock(String 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 expression) { 386 internalAddNamedLock(expression, "NewLock", LockLevel.WRITE); 387 } 388 389 private void internalAddNamedLock( 390 String expression, 391 String 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 |