1 package junit.swingui; 2 3 import java.awt.Component; 4 import java.awt.Cursor; 5 import java.awt.Dimension; 6 import java.awt.Frame; 7 import java.awt.GridBagConstraints; 8 import java.awt.GridBagLayout; 9 import java.awt.Insets; 10 import java.awt.Toolkit; 11 import java.awt.event.ActionEvent; 12 import java.awt.event.ActionListener; 13 import java.awt.event.KeyAdapter; 14 import java.awt.event.KeyEvent; 15 import java.awt.event.MouseAdapter; 16 import java.awt.event.MouseEvent; 17 import java.awt.event.WindowAdapter; 18 import java.awt.event.WindowEvent; 19 import java.util.Enumeration; 20 import java.util.Vector; 21 22 import javax.swing.DefaultListCellRenderer; 23 import javax.swing.Icon; 24 import javax.swing.JButton; 25 import javax.swing.JDialog; 26 import javax.swing.JLabel; 27 import javax.swing.JList; 28 import javax.swing.JScrollPane; 29 import javax.swing.ListModel; 30 import javax.swing.ListSelectionModel; 31 import javax.swing.UIManager; 32 import javax.swing.event.ListSelectionEvent; 33 import javax.swing.event.ListSelectionListener; 34 35 import junit.runner.Sorter; 36 import junit.runner.TestCollector; 37 38 /** 39 * A test class selector. A simple dialog to pick the name of a test suite. 40 */ 41 public class TestSelector extends JDialog { 42 private JButton fCancel; 43 private JButton fOk; 44 private JList fList; 45 private JScrollPane fScrolledList; 46 private JLabel fDescription; 47 private String fSelectedItem; 48 49 /** 50 * Renders TestFailures in a JList 51 */ 52 static class TestCellRenderer extends DefaultListCellRenderer { 53 Icon fLeafIcon; 54 Icon fSuiteIcon; 55 TestCellRenderer()56 public TestCellRenderer() { 57 fLeafIcon= UIManager.getIcon("Tree.leafIcon"); 58 fSuiteIcon= UIManager.getIcon("Tree.closedIcon"); 59 } 60 getListCellRendererComponent( JList list, Object value, int modelIndex, boolean isSelected, boolean cellHasFocus)61 public Component getListCellRendererComponent( 62 JList list, Object value, int modelIndex, 63 boolean isSelected, boolean cellHasFocus) { 64 Component c= super.getListCellRendererComponent(list, value, modelIndex, isSelected, cellHasFocus); 65 String displayString= displayString((String)value); 66 67 if (displayString.startsWith("AllTests")) 68 setIcon(fSuiteIcon); 69 else 70 setIcon(fLeafIcon); 71 72 setText(displayString); 73 return c; 74 } 75 displayString(String className)76 public static String displayString(String className) { 77 int typeIndex= className.lastIndexOf('.'); 78 if (typeIndex < 0) 79 return className; 80 return className.substring(typeIndex+1) + " - " + className.substring(0, typeIndex); 81 } 82 matchesKey(String s, char ch)83 public static boolean matchesKey(String s, char ch) { 84 return ch == Character.toUpperCase(s.charAt(typeIndex(s))); 85 } 86 typeIndex(String s)87 private static int typeIndex(String s) { 88 int typeIndex= s.lastIndexOf('.'); 89 int i= 0; 90 if (typeIndex > 0) 91 i= typeIndex+1; 92 return i; 93 } 94 } 95 96 protected class DoubleClickListener extends MouseAdapter { mouseClicked(MouseEvent e)97 public void mouseClicked(MouseEvent e) { 98 if (e.getClickCount() == 2) { 99 okSelected(); 100 } 101 } 102 } 103 104 protected class KeySelectListener extends KeyAdapter { keyTyped(KeyEvent e)105 public void keyTyped(KeyEvent e) { 106 keySelectTestClass(e.getKeyChar()); 107 } 108 } 109 TestSelector(Frame parent, TestCollector testCollector)110 public TestSelector(Frame parent, TestCollector testCollector) { 111 super(parent, true); 112 setSize(350, 300); 113 setResizable(false); 114 // setLocationRelativeTo only exists in 1.4 115 try { 116 setLocationRelativeTo(parent); 117 } catch (NoSuchMethodError e) { 118 centerWindow(this); 119 } 120 setTitle("Test Selector"); 121 122 Vector list= null; 123 try { 124 parent.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); 125 list= createTestList(testCollector); 126 } finally { 127 parent.setCursor(Cursor.getDefaultCursor()); 128 } 129 fList= new JList(list); 130 fList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 131 fList.setCellRenderer(new TestCellRenderer()); 132 fScrolledList= new JScrollPane(fList); 133 134 fCancel= new JButton("Cancel"); 135 fDescription= new JLabel("Select the Test class:"); 136 fOk= new JButton("OK"); 137 fOk.setEnabled(false); 138 getRootPane().setDefaultButton(fOk); 139 140 defineLayout(); 141 addListeners(); 142 } 143 centerWindow(Component c)144 public static void centerWindow(Component c) { 145 Dimension paneSize= c.getSize(); 146 Dimension screenSize= c.getToolkit().getScreenSize(); 147 c.setLocation((screenSize.width-paneSize.width)/2, (screenSize.height-paneSize.height)/2); 148 } 149 addListeners()150 private void addListeners() { 151 fCancel.addActionListener( 152 new ActionListener() { 153 public void actionPerformed(ActionEvent e) { 154 dispose(); 155 } 156 } 157 ); 158 159 fOk.addActionListener( 160 new ActionListener() { 161 public void actionPerformed(ActionEvent e) { 162 okSelected(); 163 } 164 } 165 ); 166 167 fList.addMouseListener(new DoubleClickListener()); 168 fList.addKeyListener(new KeySelectListener()); 169 fList.addListSelectionListener( 170 new ListSelectionListener() { 171 public void valueChanged(ListSelectionEvent e) { 172 checkEnableOK(e); 173 } 174 } 175 ); 176 177 addWindowListener( 178 new WindowAdapter() { 179 public void windowClosing(WindowEvent e) { 180 dispose(); 181 } 182 } 183 ); 184 } 185 defineLayout()186 private void defineLayout() { 187 getContentPane().setLayout(new GridBagLayout()); 188 GridBagConstraints labelConstraints = new GridBagConstraints(); 189 labelConstraints.gridx= 0; labelConstraints.gridy= 0; 190 labelConstraints.gridwidth= 1; labelConstraints.gridheight= 1; 191 labelConstraints.fill= GridBagConstraints.BOTH; 192 labelConstraints.anchor= GridBagConstraints.WEST; 193 labelConstraints.weightx= 1.0; 194 labelConstraints.weighty= 0.0; 195 labelConstraints.insets= new Insets(8, 8, 0, 8); 196 getContentPane().add(fDescription, labelConstraints); 197 198 GridBagConstraints listConstraints = new GridBagConstraints(); 199 listConstraints.gridx= 0; listConstraints.gridy= 1; 200 listConstraints.gridwidth= 4; listConstraints.gridheight= 1; 201 listConstraints.fill= GridBagConstraints.BOTH; 202 listConstraints.anchor= GridBagConstraints.CENTER; 203 listConstraints.weightx= 1.0; 204 listConstraints.weighty= 1.0; 205 listConstraints.insets= new Insets(8, 8, 8, 8); 206 getContentPane().add(fScrolledList, listConstraints); 207 208 GridBagConstraints okConstraints= new GridBagConstraints(); 209 okConstraints.gridx= 2; okConstraints.gridy= 2; 210 okConstraints.gridwidth= 1; okConstraints.gridheight= 1; 211 okConstraints.anchor= java.awt.GridBagConstraints.EAST; 212 okConstraints.insets= new Insets(0, 8, 8, 8); 213 getContentPane().add(fOk, okConstraints); 214 215 216 GridBagConstraints cancelConstraints = new GridBagConstraints(); 217 cancelConstraints.gridx= 3; cancelConstraints.gridy= 2; 218 cancelConstraints.gridwidth= 1; cancelConstraints.gridheight= 1; 219 cancelConstraints.anchor= java.awt.GridBagConstraints.EAST; 220 cancelConstraints.insets= new Insets(0, 8, 8, 8); 221 getContentPane().add(fCancel, cancelConstraints); 222 } 223 checkEnableOK(ListSelectionEvent e)224 public void checkEnableOK(ListSelectionEvent e) { 225 fOk.setEnabled(fList.getSelectedIndex() != -1); 226 } 227 okSelected()228 public void okSelected() { 229 fSelectedItem= (String)fList.getSelectedValue(); 230 dispose(); 231 } 232 isEmpty()233 public boolean isEmpty() { 234 return fList.getModel().getSize() == 0; 235 } 236 keySelectTestClass(char ch)237 public void keySelectTestClass(char ch) { 238 ListModel model= fList.getModel(); 239 if (!Character.isJavaIdentifierStart(ch)) 240 return; 241 for (int i= 0; i < model.getSize(); i++) { 242 String s= (String)model.getElementAt(i); 243 if (TestCellRenderer.matchesKey(s, Character.toUpperCase(ch))) { 244 fList.setSelectedIndex(i); 245 fList.ensureIndexIsVisible(i); 246 return; 247 } 248 } 249 Toolkit.getDefaultToolkit().beep(); 250 } 251 getSelectedItem()252 public String getSelectedItem() { 253 return fSelectedItem; 254 } 255 createTestList(TestCollector collector)256 private Vector createTestList(TestCollector collector) { 257 Enumeration each= collector.collectTests(); 258 Vector v= new Vector(200); 259 Vector displayVector= new Vector(v.size()); 260 while(each.hasMoreElements()) { 261 String s= (String)each.nextElement(); 262 v.addElement(s); 263 displayVector.addElement(TestCellRenderer.displayString(s)); 264 } 265 if (v.size() > 0) 266 Sorter.sortStrings(displayVector, 0, displayVector.size()-1, new ParallelSwapper(v)); 267 return v; 268 } 269 270 private class ParallelSwapper implements Sorter.Swapper { 271 Vector fOther; 272 ParallelSwapper(Vector other)273 ParallelSwapper(Vector other) { 274 fOther= other; 275 } swap(Vector values, int left, int right)276 public void swap(Vector values, int left, int right) { 277 Object tmp= values.elementAt(left); 278 values.setElementAt(values.elementAt(right), left); 279 values.setElementAt(tmp, right); 280 Object tmp2= fOther.elementAt(left); 281 fOther.setElementAt(fOther.elementAt(right), left); 282 fOther.setElementAt(tmp2, right); 283 } 284 } 285 }