package junit.swingui; import java.awt.*; import java.awt.event.*; import java.util.*; import javax.swing.*; import javax.swing.event.*; import junit.runner.*; /** * A test class selector. A simple dialog to pick the name of a test suite. */ class TestSelector extends JDialog { private JButton fCancel; private JButton fOk; private JList fList; private JScrollPane fScrolledList; private JLabel fDescription; private String fSelectedItem; /** * Renders TestFailures in a JList */ static class TestCellRenderer extends DefaultListCellRenderer { Icon fLeafIcon; Icon fSuiteIcon; public TestCellRenderer() { fLeafIcon= UIManager.getIcon("Tree.leafIcon"); fSuiteIcon= UIManager.getIcon("Tree.closedIcon"); } public Component getListCellRendererComponent( JList list, Object value, int modelIndex, boolean isSelected, boolean cellHasFocus) { Component c= super.getListCellRendererComponent(list, value, modelIndex, isSelected, cellHasFocus); String displayString= displayString((String)value); if (displayString.startsWith("AllTests")) setIcon(fSuiteIcon); else setIcon(fLeafIcon); setText(displayString); return c; } public static String displayString(String className) { int typeIndex= className.lastIndexOf('.'); if (typeIndex < 0) return className; return className.substring(typeIndex+1) + " - " + className.substring(0, typeIndex); } public static boolean matchesKey(String s, char ch) { return ch == Character.toUpperCase(s.charAt(typeIndex(s))); } private static int typeIndex(String s) { int typeIndex= s.lastIndexOf('.'); int i= 0; if (typeIndex > 0) i= typeIndex+1; return i; } } protected class DoubleClickListener extends MouseAdapter { public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) { okSelected(); } } } protected class KeySelectListener extends KeyAdapter { public void keyTyped(KeyEvent e) { keySelectTestClass(e.getKeyChar()); } } public TestSelector(Frame parent, TestCollector testCollector) { super(parent, true); setSize(350, 300); setResizable(false); // setLocationRelativeTo only exists in 1.4 try { setLocationRelativeTo(parent); } catch (NoSuchMethodError e) { centerWindow(this); } setTitle("Test Selector"); Vector list= null; try { parent.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); list= createTestList(testCollector); } finally { parent.setCursor(Cursor.getDefaultCursor()); } fList= new JList(list); fList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); fList.setCellRenderer(new TestCellRenderer()); fScrolledList= new JScrollPane(fList); fCancel= new JButton("Cancel"); fDescription= new JLabel("Select the Test class:"); fOk= new JButton("OK"); fOk.setEnabled(false); getRootPane().setDefaultButton(fOk); defineLayout(); addListeners(); } public static void centerWindow(Component c) { Dimension paneSize= c.getSize(); Dimension screenSize= c.getToolkit().getScreenSize(); c.setLocation((screenSize.width-paneSize.width)/2, (screenSize.height-paneSize.height)/2); } private void addListeners() { fCancel.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { dispose(); } } ); fOk.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { okSelected(); } } ); fList.addMouseListener(new DoubleClickListener()); fList.addKeyListener(new KeySelectListener()); fList.addListSelectionListener( new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { checkEnableOK(e); } } ); addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent e) { dispose(); } } ); } private void defineLayout() { getContentPane().setLayout(new GridBagLayout()); GridBagConstraints labelConstraints = new GridBagConstraints(); labelConstraints.gridx= 0; labelConstraints.gridy= 0; labelConstraints.gridwidth= 1; labelConstraints.gridheight= 1; labelConstraints.fill= GridBagConstraints.BOTH; labelConstraints.anchor= GridBagConstraints.WEST; labelConstraints.weightx= 1.0; labelConstraints.weighty= 0.0; labelConstraints.insets= new Insets(8, 8, 0, 8); getContentPane().add(fDescription, labelConstraints); GridBagConstraints listConstraints = new GridBagConstraints(); listConstraints.gridx= 0; listConstraints.gridy= 1; listConstraints.gridwidth= 4; listConstraints.gridheight= 1; listConstraints.fill= GridBagConstraints.BOTH; listConstraints.anchor= GridBagConstraints.CENTER; listConstraints.weightx= 1.0; listConstraints.weighty= 1.0; listConstraints.insets= new Insets(8, 8, 8, 8); getContentPane().add(fScrolledList, listConstraints); GridBagConstraints okConstraints= new GridBagConstraints(); okConstraints.gridx= 2; okConstraints.gridy= 2; okConstraints.gridwidth= 1; okConstraints.gridheight= 1; okConstraints.anchor= java.awt.GridBagConstraints.EAST; okConstraints.insets= new Insets(0, 8, 8, 8); getContentPane().add(fOk, okConstraints); GridBagConstraints cancelConstraints = new GridBagConstraints(); cancelConstraints.gridx= 3; cancelConstraints.gridy= 2; cancelConstraints.gridwidth= 1; cancelConstraints.gridheight= 1; cancelConstraints.anchor= java.awt.GridBagConstraints.EAST; cancelConstraints.insets= new Insets(0, 8, 8, 8); getContentPane().add(fCancel, cancelConstraints); } public void checkEnableOK(ListSelectionEvent e) { fOk.setEnabled(fList.getSelectedIndex() != -1); } public void okSelected() { fSelectedItem= (String)fList.getSelectedValue(); dispose(); } public boolean isEmpty() { return fList.getModel().getSize() == 0; } public void keySelectTestClass(char ch) { ListModel model= fList.getModel(); if (!Character.isJavaIdentifierStart(ch)) return; for (int i= 0; i < model.getSize(); i++) { String s= (String)model.getElementAt(i); if (TestCellRenderer.matchesKey(s, Character.toUpperCase(ch))) { fList.setSelectedIndex(i); fList.ensureIndexIsVisible(i); return; } } Toolkit.getDefaultToolkit().beep(); } public String getSelectedItem() { return fSelectedItem; } private Vector createTestList(TestCollector collector) { Enumeration each= collector.collectTests(); Vector v= new Vector(200); Vector displayVector= new Vector(v.size()); while(each.hasMoreElements()) { String s= (String)each.nextElement(); v.addElement(s); displayVector.addElement(TestCellRenderer.displayString(s)); } if (v.size() > 0) Sorter.sortStrings(displayVector, 0, displayVector.size()-1, new ParallelSwapper(v)); return v; } private class ParallelSwapper implements Sorter.Swapper { Vector fOther; ParallelSwapper(Vector other) { fOther= other; } public void swap(Vector values, int left, int right) { Object tmp= values.elementAt(left); values.setElementAt(values.elementAt(right), left); values.setElementAt(tmp, right); Object tmp2= fOther.elementAt(left); fOther.setElementAt(fOther.elementAt(right), left); fOther.setElementAt(tmp2, right); } } }