1 package junit.swingui; 2 3 import java.awt.*; 4 import java.util.*; 5 6 import javax.swing.*; 7 import junit.framework.TestFailure; 8 import junit.runner.*; 9 10 /*** 11 * A view that shows a stack trace of a failure 12 */ 13 public class DefaultFailureDetailView implements FailureDetailView { 14 JList fList; 15 16 /*** 17 * A ListModel representing the scanned failure stack trace. 18 */ 19 static class StackTraceListModel extends AbstractListModel { 20 private Vector fLines= new Vector(20); 21 22 public Object getElementAt(int index) { 23 return fLines.elementAt(index); 24 } 25 26 public int getSize() { 27 return fLines.size(); 28 } 29 30 public void setTrace(String trace) { 31 scan(trace); 32 fireContentsChanged(this, 0, fLines.size()); 33 } 34 35 public void clear() { 36 fLines.removeAllElements(); 37 fireContentsChanged(this, 0, fLines.size()); 38 } 39 40 private void scan(String trace) { 41 fLines.removeAllElements(); 42 StringTokenizer st= new StringTokenizer(trace, "\n\r", false); 43 while (st.hasMoreTokens()) 44 fLines.add(st.nextToken()); 45 } 46 } 47 48 /*** 49 * Renderer for stack entries 50 */ 51 static class StackEntryRenderer extends DefaultListCellRenderer { 52 53 public Component getListCellRendererComponent( 54 JList list, Object value, int modelIndex, 55 boolean isSelected, boolean cellHasFocus) { 56 String text= ((String)value).replace('\t', ' '); 57 Component c= super.getListCellRendererComponent(list, text, modelIndex, isSelected, cellHasFocus); 58 setText(text); 59 setToolTipText(text); 60 return c; 61 } 62 } 63 64 /*** 65 * Returns the component used to present the trace 66 */ 67 public Component getComponent() { 68 if (fList == null) { 69 fList= new JList(new StackTraceListModel()); 70 fList.setFont(new Font("Dialog", Font.PLAIN, 12)); 71 fList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 72 fList.setVisibleRowCount(5); 73 fList.setCellRenderer(new StackEntryRenderer()); 74 } 75 return fList; 76 } 77 78 /*** 79 * Shows a TestFailure 80 */ 81 public void showFailure(TestFailure failure) { 82 getModel().setTrace(BaseTestRunner.getFilteredTrace(failure.trace())); 83 } 84 /*** 85 * Clears the output. 86 */ 87 public void clear() { 88 getModel().clear(); 89 } 90 91 private StackTraceListModel getModel() { 92 return (StackTraceListModel)fList.getModel(); 93 } 94 }