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); | |
} | |
} | |
} |