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