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  }