1 19 20 package org.netbeans.bluej; 21 22 import java.awt.Component ; 23 import java.awt.event.MouseEvent ; 24 import java.awt.event.MouseListener ; 25 import java.util.Arrays ; 26 import java.util.Collection ; 27 import java.util.Comparator ; 28 import javax.lang.model.element.TypeElement; 29 import javax.swing.DefaultListCellRenderer ; 30 import javax.swing.JList ; 31 import javax.swing.JPanel ; 32 import javax.swing.ListSelectionModel ; 33 import javax.swing.SwingUtilities ; 34 import javax.swing.event.ChangeEvent ; 35 import javax.swing.event.ChangeListener ; 36 import javax.swing.event.ListSelectionEvent ; 37 import javax.swing.event.ListSelectionListener ; 38 import org.netbeans.api.java.source.ElementHandle; 39 import org.netbeans.api.java.source.SourceUtils; 40 import org.openide.awt.Mnemonics; 41 import org.openide.awt.MouseUtils; 42 import org.openide.filesystems.FileObject; 43 import org.openide.util.NbBundle; 44 import org.openide.util.RequestProcessor; 45 46 51 public class MainClassChooser extends JPanel { 52 53 private ChangeListener changeListener; 54 private String dialogSubtitle = null; 55 private Collection <ElementHandle<TypeElement>> possibleMainClasses; 56 57 private String selectedClass; 58 59 60 public MainClassChooser (FileObject[] sourcesRoots) { 61 this (sourcesRoots, null); 62 } 63 64 public MainClassChooser (FileObject[] sourcesRoots, String subtitle, boolean showArguments) { 65 this (sourcesRoots, subtitle); 66 if (!showArguments) { 67 lblArguments.setVisible(false); 68 txtArguments.setVisible(false); 69 } 70 } 71 72 public MainClassChooser (FileObject[] sourcesRoots, String subtitle) { 73 dialogSubtitle = subtitle; 74 initComponents(); 75 initClassesView (sourcesRoots); 76 } 77 78 private void initClassesView (final FileObject[] sourcesRoots) { 79 possibleMainClasses = null; 80 jMainClassList.setSelectionMode (ListSelectionModel.SINGLE_SELECTION); 81 jMainClassList.setListData (getWarmupList ()); 82 jMainClassList.addListSelectionListener (new ListSelectionListener () { 83 public void valueChanged (ListSelectionEvent evt) { 84 if (changeListener != null) { 85 changeListener.stateChanged (new ChangeEvent (evt)); 86 } 87 } 88 }); 89 jMainClassList.addMouseListener (new MouseListener () { 91 public void mouseClicked (MouseEvent e) { 92 if (MouseUtils.isDoubleClick (e)) { 93 if (getSelectedMainClass () != null) { 94 if (changeListener != null) { 95 changeListener.stateChanged (new ChangeEvent (e)); 96 } 97 } 98 } 99 } 100 public void mousePressed (MouseEvent e) {} 101 public void mouseReleased (MouseEvent e) {} 102 public void mouseEntered (MouseEvent e) {} 103 public void mouseExited (MouseEvent e) {} 104 }); 105 106 RequestProcessor.getDefault ().post (new Runnable () { 107 public void run () { 108 109 possibleMainClasses = SourceUtils.getMainClasses(sourcesRoots); 110 if (possibleMainClasses.isEmpty ()) { 111 SwingUtilities.invokeLater( new Runnable () { 112 public void run () { 113 jMainClassList.setListData (new String [] { NbBundle.getMessage (MainClassChooser.class, "LBL_ChooseMainClass_NO_CLASSES_NODE") } ); } 115 }); 116 } else { 117 final ElementHandle<TypeElement>[] arr = possibleMainClasses.toArray(new ElementHandle[possibleMainClasses.size()]); 118 Arrays.sort (arr, new MainClassComparator()); 120 SwingUtilities.invokeLater(new Runnable () { 121 public void run () { 122 jMainClassList.setListData (arr); 123 jMainClassList.setSelectedIndex (0); 124 } 125 }); 126 } 127 } 128 }); 129 130 if (dialogSubtitle != null) { 131 Mnemonics.setLocalizedText (jLabel1, dialogSubtitle); 132 } 133 } 134 135 private Object [] getWarmupList () { 136 return new Object [] {NbBundle.getMessage (MainClassChooser.class, "LBL_ChooseMainClass_WARMUP_MESSAGE")}; 137 } 138 139 private boolean isValidMainClassName (Object value) { 140 return (possibleMainClasses != null) && (possibleMainClasses.contains (value)); 141 } 142 143 144 148 public String getSelectedMainClass () { 149 if (isValidMainClassName (jMainClassList.getSelectedValue ())) { 150 return (String )jMainClassList.getSelectedValue (); 151 } else { 152 return null; 153 } 154 } 155 156 public String getArguments() { 157 return txtArguments.getText(); 158 } 159 160 public void addChangeListener (ChangeListener l) { 161 changeListener = l; 162 } 163 164 public void removeChangeListener (ChangeListener l) { 165 changeListener = null; 166 } 167 168 public static Boolean unitTestingSupport_hasMainMethodResult = null; 171 172 178 public static boolean hasMainMethod (FileObject classFO) { 179 return BluejActionProvider.hasMainMethod (classFO); 180 } 181 182 187 private void initComponents() { 189 java.awt.GridBagConstraints gridBagConstraints; 190 191 jLabel1 = new javax.swing.JLabel (); 192 jScrollPane1 = new javax.swing.JScrollPane (); 193 jMainClassList = new javax.swing.JList (); 194 lblArguments = new javax.swing.JLabel (); 195 txtArguments = new javax.swing.JTextField (); 196 197 setPreferredSize(new java.awt.Dimension (380, 300)); 198 getAccessibleContext().setAccessibleDescription(null); 199 jLabel1.setLabelFor(jMainClassList); 200 201 jScrollPane1.setMinimumSize(new java.awt.Dimension (100, 200)); 202 jScrollPane1.setViewportView(jMainClassList); 203 jMainClassList.getAccessibleContext().setAccessibleDescription(null); 204 205 lblArguments.setText(org.openide.util.NbBundle.getMessage(MainClassChooser.class, "LBL_Run_Arguments")); 206 207 org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(this); 208 this.setLayout(layout); 209 layout.setHorizontalGroup( 210 layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) 211 .add(layout.createSequentialGroup() 212 .addContainerGap() 213 .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) 214 .add(jLabel1) 215 .add(layout.createSequentialGroup() 216 .add(4, 4, 4) 217 .add(jScrollPane1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 388, Short.MAX_VALUE)) 218 .add(layout.createSequentialGroup() 219 .add(lblArguments) 220 .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) 221 .add(txtArguments, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 315, Short.MAX_VALUE))) 222 .addContainerGap()) 223 ); 224 layout.setVerticalGroup( 225 layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) 226 .add(layout.createSequentialGroup() 227 .addContainerGap() 228 .add(jLabel1) 229 .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) 230 .add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 154, Short.MAX_VALUE) 231 .add(27, 27, 27) 232 .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) 233 .add(lblArguments) 234 .add(txtArguments, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) 235 .add(61, 61, 61)) 236 ); 237 } 239 240 241 242 private javax.swing.JLabel jLabel1; 244 private javax.swing.JList jMainClassList; 245 private javax.swing.JScrollPane jScrollPane1; 246 private javax.swing.JLabel lblArguments; 247 private javax.swing.JTextField txtArguments; 248 250 251 void setSelectedMainClass(String clazz) { 252 this.selectedClass = clazz; 253 } 254 255 void setArguments(String args) { 256 txtArguments.setText(args); 257 } 258 259 private static final class MainClassRenderer extends DefaultListCellRenderer { 260 public Component getListCellRendererComponent (JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { 261 String displayName; 262 if (value instanceof String ) { 263 displayName = (String ) value; 264 } if (value instanceof ElementHandle) { 265 displayName = ((ElementHandle)value).getQualifiedName(); 266 } else { 267 displayName = value.toString (); 268 } 269 return super.getListCellRendererComponent (list, displayName, index, isSelected, cellHasFocus); 270 } 271 } 272 273 private static class MainClassComparator implements Comparator <ElementHandle> { 274 275 public int compare(ElementHandle arg0, ElementHandle arg1) { 276 return arg0.getQualifiedName().compareTo(arg1.getQualifiedName()); 277 } 278 } 279 280 } 281
| Popular Tags
|