1 7 34 35 package com.sun.tools.example.debug.gui; 36 37 import java.io.*; 38 import java.util.*; 39 import java.util.List ; 41 import javax.swing.*; 42 import javax.swing.tree.*; 43 import javax.swing.event.*; 44 import java.awt.*; 45 import java.awt.event.*; 46 47 import com.sun.jdi.*; 48 import com.sun.tools.example.debug.bdi.*; 49 50 public class StackTraceTool extends JPanel { 51 52 private Environment env; 53 54 private ExecutionManager runtime; 55 private ContextManager context; 56 57 private ThreadInfo tinfo; 58 59 private JList list; 60 private ListModel stackModel; 61 62 public StackTraceTool(Environment env) { 63 64 super(new BorderLayout()); 65 66 this.env = env; 67 this.runtime = env.getExecutionManager(); 68 this.context = env.getContextManager(); 69 70 stackModel = new DefaultListModel(); 72 list = new JList(stackModel); 73 list.setCellRenderer(new StackFrameRenderer()); 74 75 JScrollPane listView = new JScrollPane(list); 76 add(listView); 77 78 StackTraceToolListener listener = new StackTraceToolListener(); 80 context.addContextListener(listener); 81 list.addListSelectionListener(listener); 82 83 } 85 86 private class StackTraceToolListener 87 implements ContextListener, ListSelectionListener 88 { 89 90 92 95 97 public void currentFrameChanged(CurrentFrameChangedEvent e) { 98 int frameIndex = e.getIndex(); 101 ThreadInfo ti = e.getThreadInfo(); 102 if (e.getInvalidate() || tinfo != ti) { 103 tinfo = ti; 104 showStack(ti, frameIndex); 105 } else { 106 if (frameIndex < stackModel.getSize()) { 107 list.setSelectedIndex(frameIndex); 108 list.ensureIndexIsVisible(frameIndex); 109 } 110 } 111 } 112 113 115 public void valueChanged(ListSelectionEvent e) { 116 int index = list.getSelectedIndex(); 117 if (index != -1) { 118 try { 120 context.setCurrentFrameIndex(index); 121 } catch (VMNotInterruptedException exc) { 122 } 123 } 124 } 125 } 126 127 private class StackFrameRenderer extends DefaultListCellRenderer { 128 129 public Component getListCellRendererComponent(JList list, 130 Object value, 131 int index, 132 boolean isSelected, 133 boolean cellHasFocus) { 134 135 140 super.getListCellRendererComponent(list, value, index, 141 isSelected, cellHasFocus); 142 if (value == null) { 143 this.setText("<unavailable>"); 144 } else { 145 StackFrame frame = (StackFrame)value; 146 Location loc = frame.location(); 147 Method meth = loc.method(); 148 String methName = 149 meth.declaringType().name() + '.' + meth.name(); 150 String position = ""; 151 if (meth instanceof Method && ((Method)meth).isNative()) { 152 position = " (native method)"; 153 } else if (loc.lineNumber() != -1) { 154 position = ":" + loc.lineNumber(); 155 } else { 156 long pc = loc.codeIndex(); 157 if (pc != -1) { 158 position = ", pc = " + pc; 159 } 160 } 161 this.setText("[" + (index+1) +"] " + methName + position); 163 } 164 return this; 165 } 166 } 167 168 170 private void showStack(ThreadInfo tinfo, int selectFrame) { 171 StackTraceListModel model = new StackTraceListModel(tinfo); 172 stackModel = model; 173 list.setModel(stackModel); 174 list.setSelectedIndex(selectFrame); 175 list.ensureIndexIsVisible(selectFrame); 176 } 177 178 private static class StackTraceListModel extends AbstractListModel { 179 180 private final ThreadInfo tinfo; 181 182 public StackTraceListModel(ThreadInfo tinfo) { 183 this.tinfo = tinfo; 184 } 185 186 public Object getElementAt(int index) { 187 try { 188 return tinfo == null? null : tinfo.getFrame(index); 189 } catch (VMNotInterruptedException e) { 190 return null; 195 } 196 } 197 198 public int getSize() { 199 try { 200 return tinfo == null? 1 : tinfo.getFrameCount(); 201 } catch (VMNotInterruptedException e) { 202 return 0; 204 } 205 } 206 } 207 } 208 | Popular Tags |