1 4 package org.terracotta.dso.editors; 5 6 import org.eclipse.core.resources.IProject; 7 import org.eclipse.jdt.core.IJavaElement; 8 import org.eclipse.jdt.core.IJavaProject; 9 import org.eclipse.jdt.core.IType; 10 import org.eclipse.jdt.core.JavaCore; 11 import org.eclipse.jdt.core.JavaModelException; 12 import org.eclipse.jdt.core.search.IJavaSearchScope; 13 import org.eclipse.jdt.core.search.SearchEngine; 14 import org.eclipse.jdt.ui.IJavaElementSearchConstants; 15 import org.eclipse.jdt.ui.JavaUI; 16 import org.eclipse.swt.widgets.Display; 17 import org.eclipse.ui.dialogs.SelectionDialog; 18 19 import org.dijon.Button; 20 import org.dijon.ContainerResource; 21 22 import com.tc.admin.common.XTable; 23 import com.terracottatech.config.AdditionalBootJarClasses; 24 import com.terracottatech.config.DsoApplication; 25 26 import java.awt.event.ActionEvent ; 27 import java.awt.event.ActionListener ; 28 29 import javax.swing.SwingUtilities ; 30 import javax.swing.event.ListSelectionEvent ; 31 import javax.swing.event.ListSelectionListener ; 32 import javax.swing.event.TableModelEvent ; 33 import javax.swing.event.TableModelListener ; 34 import javax.swing.table.DefaultTableModel ; 35 36 public class BootClassesPanel extends ConfigurationEditorPanel 37 implements TableModelListener 38 { 39 private IProject m_project; 40 private DsoApplication m_dsoApp; 41 private AdditionalBootJarClasses m_bootClasses; 42 private XTable m_bootClassesTable; 43 private BootClassTableModel m_bootClassesTableModel; 44 private Button m_addButton; 45 private ActionListener m_addListener; 46 private Button m_removeButton; 47 private ActionListener m_removeListener; 48 private ListSelectionListener m_bootClassesListener; 49 50 public BootClassesPanel() { 51 super(); 52 } 53 54 public void load(ContainerResource containerRes) { 55 super.load(containerRes); 56 57 m_bootClassesTable = (XTable)findComponent("BootClassesTable"); 58 m_bootClassesTable.setModel(m_bootClassesTableModel = new BootClassTableModel()); 59 m_bootClassesListener = new ListSelectionListener () { 60 public void valueChanged(ListSelectionEvent lse) { 61 if(!lse.getValueIsAdjusting()) { 62 int[] sel = m_bootClassesTable.getSelectedRows(); 63 m_removeButton.setEnabled(sel != null && sel.length > 0); 64 } 65 } 66 }; 67 68 m_addButton = (Button)findComponent("AddBootClassButton"); 69 m_addListener = new ActionListener () { 70 public void actionPerformed(ActionEvent ae) { 71 Display.getDefault().asyncExec(new Runnable () { 72 public void run() { 73 IJavaProject javaProject = JavaCore.create(m_project); 74 int filter = IJavaSearchScope.SYSTEM_LIBRARIES; 75 IJavaElement[] elements = new IJavaElement[]{javaProject}; 76 IJavaSearchScope scope = SearchEngine.createJavaSearchScope(elements, filter); 77 int style = IJavaElementSearchConstants.CONSIDER_ALL_TYPES; 78 SelectionDialog dialog; 79 80 try { 81 dialog = JavaUI.createTypeDialog(null, null, scope, style, true); 82 } catch(JavaModelException jme) { 83 jme.printStackTrace(); 84 return; 85 } 86 87 dialog.setTitle("DSO Application Configuration"); 88 dialog.setMessage("Select system classes to add to DSO Boot Jar"); 89 dialog.open(); 90 91 final Object [] result = dialog.getResult(); 92 93 SwingUtilities.invokeLater(new Runnable () { 94 public void run() { 95 IType type; 96 97 if(result != null) { 98 for(int i = 0; i < result.length; i++) { 99 type = (IType)result[i]; 100 internalAddBootClass(type.getFullyQualifiedName()); 101 } 102 } 103 } 104 }); 105 } 106 }); 107 } 108 }; 109 110 m_removeButton = (Button)findComponent("RemoveBootClassButton"); 111 m_removeListener = new ActionListener () { 112 public void actionPerformed(ActionEvent ae) { 113 int[] selection = m_bootClassesTable.getSelectedRows(); 114 115 for(int i = selection.length-1; i >= 0; i--) { 116 ensureAdditionalBootClasses().removeInclude(selection[i]); 117 m_bootClassesTableModel.removeRow(selection[i]); 118 } 119 } 120 }; 121 } 122 123 public boolean hasAnySet() { 124 return m_bootClasses != null && 125 m_bootClasses.sizeOfIncludeArray() > 0; 126 } 127 128 private AdditionalBootJarClasses ensureAdditionalBootClasses() { 129 if(m_bootClasses == null) { 130 ensureXmlObject(); 131 } 132 return m_bootClasses; 133 } 134 135 public void ensureXmlObject() { 136 super.ensureXmlObject(); 137 138 if(m_bootClasses == null) { 139 removeListeners(); 140 m_bootClasses = m_dsoApp.addNewAdditionalBootJarClasses(); 141 updateChildren(); 142 addListeners(); 143 } 144 } 145 146 private void syncModel() { 147 if(!hasAnySet() && m_dsoApp.getAdditionalBootJarClasses() != null) { 148 m_dsoApp.unsetAdditionalBootJarClasses(); 149 m_bootClasses = null; 150 fireXmlObjectStructureChanged(m_dsoApp); 151 } 152 153 setDirty(); 154 } 155 156 private void addListeners() { 157 m_bootClassesTableModel.addTableModelListener(this); 158 m_bootClassesTable.getSelectionModel().addListSelectionListener(m_bootClassesListener); 159 m_addButton.addActionListener(m_addListener); 160 m_removeButton.addActionListener(m_removeListener); 161 } 162 163 private void removeListeners() { 164 m_bootClassesTableModel.removeTableModelListener(this); 165 m_bootClassesTable.getSelectionModel().removeListSelectionListener(m_bootClassesListener); 166 m_addButton.removeActionListener(m_addListener); 167 m_removeButton.removeActionListener(m_removeListener); 168 } 169 170 public void updateChildren() { 171 m_bootClassesTableModel.clear(); 172 173 if(m_bootClasses != null) { 174 String [] bootClasses = m_bootClasses.getIncludeArray(); 175 176 for(int i = 0; i < bootClasses.length; i++) { 177 m_bootClassesTableModel.addBootClass(bootClasses[i]); 178 } 179 } else { 180 m_bootClassesTableModel.fireTableDataChanged(); 181 } 182 } 183 184 public void updateModel() { 185 removeListeners(); 186 updateChildren(); 187 addListeners(); 188 } 189 190 public void setup(IProject project, DsoApplication dsoApp) { 191 setEnabled(true); 192 removeListeners(); 193 194 m_project = project; 195 m_dsoApp = dsoApp; 196 m_bootClasses = m_dsoApp != null ? 197 m_dsoApp.getAdditionalBootJarClasses() : null; 198 199 updateChildren(); 200 addListeners(); 201 } 202 203 public void tearDown() { 204 removeListeners(); 205 206 m_dsoApp = null; 207 m_bootClasses = null; 208 209 m_bootClassesTableModel.clear(); 210 211 setEnabled(false); 212 } 213 214 class BootClassTableModel extends DefaultTableModel { 215 BootClassTableModel() { 216 super(); 217 setColumnIdentifiers(new String []{"Boot Classes"}); 218 } 219 220 void clear() { 221 setRowCount(0); 222 } 223 224 void setBootClasses(AdditionalBootJarClasses bootClasses) { 225 clear(); 226 227 if(bootClasses != null) { 228 int count = bootClasses.sizeOfIncludeArray(); 229 230 for(int i = 0; i < count; i++) { 231 addBootClass(bootClasses.getIncludeArray(i)); 232 } 233 } 234 } 235 236 void addBootClass(String typeName) { 237 addRow(new Object [] {typeName}); 238 } 239 240 int indexOf(String typeName) { 241 int count = getRowCount(); 242 243 for(int i = 0; i < count; i++) { 244 if(((String )getValueAt(i, 0)).equals(typeName)) { 245 return i; 246 } 247 } 248 249 return -1; 250 } 251 252 public void setValueAt(Object value, int row, int col) { 253 m_bootClasses.setIncludeArray(row, (String )value); 254 super.setValueAt(value, row, col); 255 } 256 } 257 258 public void tableChanged(TableModelEvent tme) { 259 syncModel(); 260 } 261 262 private void internalAddBootClass(String typeName) { 263 ensureAdditionalBootClasses().addInclude(typeName); 264 m_bootClassesTableModel.addBootClass(typeName); 265 266 int row = m_bootClassesTableModel.getRowCount()-1; 267 m_bootClassesTable.setRowSelectionInterval(row, row); 268 } 269 270 public boolean isBootClass(String typeName) { 271 AdditionalBootJarClasses bootClasses = ensureAdditionalBootClasses(); 272 int count = bootClasses.sizeOfIncludeArray(); 273 274 for(int i = 0; i < count; i++) { 275 if(typeName.equals(bootClasses.getIncludeArray(i))) { 276 return true; 277 } 278 } 279 280 return false; 281 } 282 } 283 | Popular Tags |