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 com.tc.admin.common.XObjectTableModel; 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.Root; 16 import com.terracottatech.config.Roots; 17 18 import java.awt.Frame ; 19 import java.awt.event.ActionEvent ; 20 import java.awt.event.ActionListener ; 21 22 import javax.swing.event.ListSelectionEvent ; 23 import javax.swing.event.ListSelectionListener ; 24 import javax.swing.event.TableModelEvent ; 25 import javax.swing.event.TableModelListener ; 26 27 public class RootsPanel extends ConfigurationEditorPanel 28 implements TableModelListener 29 { 30 private IProject m_project; 31 private DsoApplication m_dsoApp; 32 private Roots m_roots; 33 private XTable m_rootTable; 34 private RootsModel m_rootsModel; 35 private Button m_addButton; 36 private ActionListener m_addListener; 37 private Button m_removeButton; 38 private ActionListener m_removeListener; 39 private ListSelectionListener m_rootsListener; 40 private FieldChooser m_fieldChooser; 41 42 public RootsPanel() { 43 super(); 44 } 45 46 public void load(ContainerResource containerRes) { 47 super.load(containerRes); 48 49 m_rootTable = (XTable)findComponent("RootTable"); 50 m_rootTable.setModel(m_rootsModel = new RootsModel()); 51 m_rootsListener = new ListSelectionListener () { 52 public void valueChanged(ListSelectionEvent lse) { 53 if(!lse.getValueIsAdjusting()) { 54 int[] sel = m_rootTable.getSelectedRows(); 55 m_removeButton.setEnabled(sel != null && sel.length > 0); 56 } 57 } 58 }; 59 60 m_addButton = (Button)findComponent("AddRootButton"); 61 m_addListener = new ActionListener () { 62 public void actionPerformed(ActionEvent ae) { 63 FieldChooser chsr = getFieldChooser(); 64 65 chsr.setup(m_project); 66 chsr.center(RootsPanel.this.getAncestorOfClass(Frame .class)); 67 chsr.setVisible(true); 68 } 69 }; 70 71 m_removeButton = (Button)findComponent("RemoveRootButton"); 72 m_removeListener = new ActionListener () { 73 public void actionPerformed(ActionEvent ae) { 74 int[] selection = m_rootTable.getSelectedRows(); 75 int row; 76 77 for(int i = selection.length-1; i >= 0; i--) { 78 row = selection[i]; 79 80 ensureRoots().removeRoot(row); 81 m_rootsModel.remove(row); 82 m_rootsModel.fireTableRowsDeleted(row, row); 83 } 84 } 85 }; 86 } 87 88 private FieldChooser getFieldChooser() { 89 if(m_fieldChooser == null) { 90 m_fieldChooser = new FieldChooser((Frame )getAncestorOfClass(Frame .class)); 91 m_fieldChooser.setListener(new FieldChooserListener()); 92 } 93 94 return m_fieldChooser; 95 } 96 97 class FieldChooserListener implements ActionListener { 98 public void actionPerformed(ActionEvent ae) { 99 String [] fields = m_fieldChooser.getFieldNames(); 100 String field; 101 102 for(int i = 0; i < fields.length; i++) { 103 field = fields[i]; 104 105 if(field != null && 106 (field = field.trim()) != null && 107 field.length() > 0 && 108 !isRoot(field)) 109 { 110 internalAddRoot(fields[i]); 111 } 112 } 113 } 114 } 115 116 public boolean hasAnySet() { 117 return m_roots != null && 118 m_roots.sizeOfRootArray() > 0; 119 } 120 121 private Roots ensureRoots() { 122 if(m_roots == null) { 123 ensureXmlObject(); 124 } 125 return m_roots; 126 } 127 128 public void ensureXmlObject() { 129 super.ensureXmlObject(); 130 131 if(m_roots == null) { 132 removeListeners(); 133 m_roots = m_dsoApp.addNewRoots(); 134 updateChildren(); 135 addListeners(); 136 } 137 } 138 139 private void syncModel() { 140 if(!hasAnySet() && m_dsoApp.getRoots() != null){ 141 m_dsoApp.unsetRoots(); 142 m_roots = null; 143 fireXmlObjectStructureChanged(m_dsoApp); 144 } 145 146 setDirty(); 147 } 148 149 private void addListeners() { 150 m_rootsModel.addTableModelListener(this); 151 m_rootTable.getSelectionModel().addListSelectionListener(m_rootsListener); 152 m_addButton.addActionListener(m_addListener); 153 m_removeButton.addActionListener(m_removeListener); 154 } 155 156 private void removeListeners() { 157 m_rootsModel.removeTableModelListener(this); 158 m_rootTable.getSelectionModel().removeListSelectionListener(m_rootsListener); 159 m_addButton.removeActionListener(m_addListener); 160 m_removeButton.removeActionListener(m_removeListener); 161 } 162 163 public void updateChildren() { 164 m_rootsModel.set((m_roots != null) ? m_roots.getRootArray() : null); 165 } 166 167 public void updateModel() { 168 removeListeners(); 169 updateChildren(); 170 addListeners(); 171 } 172 173 public void setup(IProject project, DsoApplication dsoApp) { 174 setEnabled(true); 175 removeListeners(); 176 177 m_project = project; 178 m_dsoApp = dsoApp; 179 m_roots = m_dsoApp != null ? m_dsoApp.getRoots() : null; 180 181 updateChildren(); 182 addListeners(); 183 } 184 185 public void tearDown() { 186 removeListeners(); 187 188 m_project = null; 189 m_dsoApp = null; 190 m_roots = null; 191 192 m_rootsModel.clear(); 193 194 setEnabled(false); 195 } 196 197 private void internalAddRoot(String fieldName) { 198 Root root = ensureRoots().addNewRoot(); 199 200 root.setFieldName(fieldName); 201 m_rootsModel.add(root); 202 203 int row = m_rootsModel.getRowCount()-1; 204 m_rootsModel.fireTableRowsInserted(row, row); 205 m_rootTable.setRowSelectionInterval(row, row); 206 } 207 208 private static final String [] COLUMNS = {"FieldName", "RootName"}; 209 private static final String [] HEADERS = {"Field", "Name"}; 210 211 class RootsModel extends XObjectTableModel { 212 RootsModel() { 213 super(Root.class, COLUMNS, HEADERS); 214 } 215 216 int getFieldRow(String fieldName) { 217 Root root; 218 int count = getRowCount(); 219 220 for(int i = 0; i < count; i++) { 221 root = (Root)getObjectAt(i); 222 if(root.getFieldName().equals(fieldName)) { 223 return i; 224 } 225 } 226 227 return -1; 228 } 229 } 230 231 public boolean isRoot(String fieldName) { 232 Roots roots = ensureRoots(); 233 int count = roots.sizeOfRootArray(); 234 235 for(int i = 0; i < count; i++) { 236 if(fieldName.equals(roots.getRootArray(i).getFieldName())) { 237 return true; 238 } 239 } 240 241 return false; 242 } 243 244 public void tableChanged(TableModelEvent e) { 245 syncModel(); 246 } 247 } 248 | Popular Tags |