blob: 27adde4a98ac1d556f52596fd764f27dace2654a [file] [log] [blame]
package junit.swingui;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import junit.framework.*;
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(parent);
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();
}
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);
}
}
}