package junit.swingui; import java.awt.*; import java.util.*; import javax.swing.*; import junit.framework.TestFailure; import junit.runner.*; /** * A view that shows a stack trace of a failure */ public class DefaultFailureDetailView implements FailureDetailView { JList fList; /** * A ListModel representing the scanned failure stack trace. */ static class StackTraceListModel extends AbstractListModel { private Vector fLines= new Vector(20); public Object getElementAt(int index) { return fLines.elementAt(index); } public int getSize() { return fLines.size(); } public void setTrace(String trace) { scan(trace); fireContentsChanged(this, 0, fLines.size()); } public void clear() { fLines.removeAllElements(); fireContentsChanged(this, 0, fLines.size()); } private void scan(String trace) { fLines.removeAllElements(); StringTokenizer st= new StringTokenizer(trace, "\n\r", false); while (st.hasMoreTokens()) fLines.add(st.nextToken()); } } /** * Renderer for stack entries */ static class StackEntryRenderer extends DefaultListCellRenderer { public Component getListCellRendererComponent( JList list, Object value, int modelIndex, boolean isSelected, boolean cellHasFocus) { String text= ((String)value).replace('\t', ' '); Component c= super.getListCellRendererComponent(list, text, modelIndex, isSelected, cellHasFocus); setText(text); setToolTipText(text); return c; } } /** * Returns the component used to present the trace */ public Component getComponent() { if (fList == null) { fList= new JList(new StackTraceListModel()); fList.setFont(new Font("Dialog", Font.PLAIN, 12)); fList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); fList.setVisibleRowCount(5); fList.setCellRenderer(new StackEntryRenderer()); } return fList; } /** * Shows a TestFailure */ public void showFailure(TestFailure failure) { getModel().setTrace(BaseTestRunner.getFilteredTrace(failure.trace())); } /** * Clears the output. */ public void clear() { getModel().clear(); } private StackTraceListModel getModel() { return (StackTraceListModel)fList.getModel(); } }