1 4 package org.terracotta.dso.editors; 5 6 import org.eclipse.core.resources.IProject; 7 8 import org.dijon.Button; 9 import org.dijon.ContainerResource; 10 11 import org.terracotta.dso.TcPlugin; 12 import com.tc.admin.common.XTable; 13 import org.terracotta.dso.editors.chooser.FieldChooser; 14 import com.terracottatech.config.DsoApplication; 15 import com.terracottatech.config.TransientFields; 16 17 import java.awt.Frame ; 18 import java.awt.event.ActionEvent ; 19 import java.awt.event.ActionListener ; 20 21 import javax.swing.event.ListSelectionEvent ; 22 import javax.swing.event.ListSelectionListener ; 23 import javax.swing.event.TableModelEvent ; 24 import javax.swing.event.TableModelListener ; 25 import javax.swing.table.DefaultTableModel ; 26 27 public class TransientFieldsPanel extends ConfigurationEditorPanel 28 implements TableModelListener 29 { 30 private IProject m_project; 31 private DsoApplication m_dsoApp; 32 private TransientFields m_transientFields; 33 private XTable m_transientTable; 34 private TransientTableModel m_transientTableModel; 35 private Button m_addButton; 36 private ActionListener m_addListener; 37 private Button m_removeButton; 38 private ActionListener m_removeListener; 39 private ListSelectionListener m_transientsListener; 40 private FieldChooser m_fieldChooser; 41 42 public TransientFieldsPanel() { 43 super(); 44 } 45 46 public void load(ContainerResource containerRes) { 47 super.load(containerRes); 48 49 m_transientTable = (XTable)findComponent("TransientFieldTable"); 50 m_transientTable.setModel(m_transientTableModel = new TransientTableModel()); 51 m_transientsListener = new ListSelectionListener () { 52 public void valueChanged(ListSelectionEvent lse) { 53 if(!lse.getValueIsAdjusting()) { 54 int[] sel = m_transientTable.getSelectedRows(); 55 m_removeButton.setEnabled(sel != null && sel.length > 0); 56 } 57 } 58 }; 59 60 m_addButton = (Button)findComponent("AddTransientButton"); 61 m_addListener = new ActionListener () { 62 public void actionPerformed(ActionEvent ae) { 63 FieldChooser chsr = getFieldChooser(); 64 65 chsr.setup(m_project); 66 chsr.center(TransientFieldsPanel.this.getAncestorOfClass(java.awt.Frame .class)); 67 chsr.setVisible(true); 68 } 69 }; 70 71 m_removeButton = (Button)findComponent("RemoveTransientButton"); 72 m_removeListener = new ActionListener () { 73 public void actionPerformed(ActionEvent ae) { 74 int[] selection = m_transientTable.getSelectedRows(); 75 76 for(int i = selection.length-1; i >= 0; i--) { 77 ensureTransientFields().removeFieldName(selection[i]); 78 m_transientTableModel.removeRow(selection[i]); 79 } 80 } 81 }; 82 } 83 84 private FieldChooser getFieldChooser() { 85 if(m_fieldChooser == null) { 86 m_fieldChooser = new FieldChooser((Frame )getAncestorOfClass(Frame .class)); 87 m_fieldChooser.setListener(new FieldChooserListener()); 88 } 89 90 return m_fieldChooser; 91 } 92 93 class FieldChooserListener implements ActionListener { 94 public void actionPerformed(ActionEvent ae) { 95 String [] fields = m_fieldChooser.getFieldNames(); 96 String field; 97 98 for(int i = 0; i < fields.length; i++) { 99 field = fields[i]; 100 101 if(field != null && 102 (field = field.trim()) != null && 103 field.length() > 0 && 104 !isTransient(fields[i])) 105 { 106 internalAddTransient(fields[i]); 107 } 108 } 109 } 110 } 111 112 public boolean hasAnySet() { 113 return m_transientFields != null && 114 m_transientFields.sizeOfFieldNameArray() > 0; 115 } 116 117 private TransientFields ensureTransientFields() { 118 if(m_transientFields == null) { 119 ensureXmlObject(); 120 } 121 return m_transientFields; 122 } 123 124 public void ensureXmlObject() { 125 super.ensureXmlObject(); 126 127 if(m_transientFields == null) { 128 removeListeners(); 129 m_transientFields = m_dsoApp.addNewTransientFields(); 130 updateChildren(); 131 addListeners(); 132 } 133 } 134 135 private void syncModel() { 136 if(!hasAnySet() && m_dsoApp.getTransientFields() != null){ 137 m_dsoApp.unsetTransientFields(); 138 m_transientFields = null; 139 fireXmlObjectStructureChanged(m_dsoApp); 140 } 141 142 setDirty(); 143 } 144 145 private void addListeners() { 146 m_transientTableModel.addTableModelListener(this); 147 m_transientTable.getSelectionModel().addListSelectionListener(m_transientsListener); 148 m_addButton.addActionListener(m_addListener); 149 m_removeButton.addActionListener(m_removeListener); 150 } 151 152 private void removeListeners() { 153 m_transientTableModel.removeTableModelListener(this); 154 m_transientTable.getSelectionModel().removeListSelectionListener(m_transientsListener); 155 m_addButton.removeActionListener(m_addListener); 156 m_removeButton.removeActionListener(m_removeListener); 157 } 158 159 public void updateChildren() { 160 m_transientTableModel.clear(); 161 162 if(m_transientFields != null) { 163 String [] transients = m_transientFields.getFieldNameArray(); 164 165 for(int i = 0; i < transients.length; i++) { 166 m_transientTableModel.addField(transients[i]); 167 } 168 } else { 169 m_transientTableModel.fireTableDataChanged(); 170 } 171 } 172 173 public void updateModel() { 174 removeListeners(); 175 updateChildren(); 176 addListeners(); 177 } 178 179 public void setup(IProject project, DsoApplication dsoApp) { 180 setEnabled(true); 181 removeListeners(); 182 183 m_project = project; 184 m_dsoApp = dsoApp; 185 m_transientFields = m_dsoApp != null ? 186 m_dsoApp.getTransientFields() : 187 null; 188 189 updateChildren(); 190 addListeners(); 191 } 192 193 public void tearDown() { 194 removeListeners(); 195 196 m_dsoApp = null; 197 m_transientFields = null; 198 199 m_transientTableModel.clear(); 200 201 setEnabled(false); 202 } 203 204 class TransientTableModel extends DefaultTableModel { 205 TransientTableModel() { 206 super(); 207 setColumnIdentifiers(new String []{"Transient fields"}); 208 } 209 210 void clear() { 211 setRowCount(0); 212 } 213 214 void setTransientFields(TransientFields fields) { 215 clear(); 216 217 if(fields != null) { 218 int count = fields.sizeOfFieldNameArray(); 219 220 for(int i = 0; i < count; i++) { 221 addField(fields.getFieldNameArray(i)); 222 } 223 } 224 } 225 226 void addField(String fieldName) { 227 addRow(new Object [] {fieldName}); 228 } 229 230 int indexOf(String fieldName) { 231 int count = getRowCount(); 232 233 for(int i = 0; i < count; i++) { 234 if(((String )getValueAt(i, 0)).equals(fieldName)) { 235 return i; 236 } 237 } 238 239 return -1; 240 } 241 242 public void setValueAt(Object value, int row, int col) { 243 m_transientFields.setFieldNameArray(row, (String )value); 244 super.setValueAt(value, row, col); 245 } 246 } 247 248 public void tableChanged(TableModelEvent tme) { 249 syncModel(); 250 } 251 252 private void internalAddTransient(String fieldName) { 253 ensureTransientFields().addFieldName(fieldName); 254 m_transientTableModel.addField(fieldName); 255 256 int row = m_transientTableModel.getRowCount()-1; 257 m_transientTable.setRowSelectionInterval(row, row); 258 } 259 260 public boolean isTransient(String fieldName) { 261 return TcPlugin.getDefault().getConfigurationHelper(m_project).isTransient(fieldName); 262 } 263 } 264 | Popular Tags |