1 7 34 35 package com.sun.tools.example.debug.gui; 36 37 import java.io.*; 38 import java.util.*; 39 40 import javax.swing.*; 41 import javax.swing.tree.*; 42 import javax.swing.event.*; 43 import java.awt.*; 44 import java.awt.event.*; 45 46 import com.sun.jdi.*; 47 import com.sun.tools.example.debug.event.*; 48 import com.sun.tools.example.debug.bdi.*; 49 50 public class ClassTreeTool extends JPanel { 51 52 private Environment env; 53 54 private ExecutionManager runtime; 55 private SourceManager sourceManager; 56 private ClassManager classManager; 57 58 private JTree tree; 59 private DefaultTreeModel treeModel; 60 private ClassTreeNode root; 61 private SearchPath sourcePath; 62 63 private CommandInterpreter interpreter; 64 65 private static String HEADING = "CLASSES"; 66 67 public ClassTreeTool(Environment env) { 68 69 super(new BorderLayout()); 70 71 this.env = env; 72 this.runtime = env.getExecutionManager(); 73 this.sourceManager = env.getSourceManager(); 74 75 this.interpreter = new CommandInterpreter(env); 76 77 root = createClassTree(HEADING); 78 treeModel = new DefaultTreeModel(root); 79 80 82 tree = new JTree(treeModel); 83 tree.setSelectionModel(new SingleLeafTreeSelectionModel()); 84 85 97 98 MouseListener ml = new MouseAdapter() { 99 public void mouseClicked(MouseEvent e) { 100 int selRow = tree.getRowForLocation(e.getX(), e.getY()); 101 TreePath selPath = tree.getPathForLocation(e.getX(), e.getY()); 102 if(selRow != -1) { 103 if(e.getClickCount() == 1) { 104 ClassTreeNode node = 105 (ClassTreeNode)selPath.getLastPathComponent(); 106 if (node.isLeaf()) { 108 tree.setSelectionPath(selPath); 109 interpreter.executeCommand("view " + node.getReferenceTypeName()); 110 } 111 } 112 } 113 } 114 }; 115 tree.addMouseListener(ml); 116 117 JScrollPane treeView = new JScrollPane(tree); 118 add(treeView); 119 120 ClassTreeToolListener listener = new ClassTreeToolListener(); 122 runtime.addJDIListener(listener); 123 runtime.addSessionListener(listener); 124 125 } 127 128 private class ClassTreeToolListener extends JDIAdapter 129 implements JDIListener, SessionListener { 130 131 133 public void sessionStart(EventObject e) { 134 try { 136 Iterator iter = runtime.allClasses().iterator(); 137 while (iter.hasNext()) { 138 ReferenceType type = ((ReferenceType)iter.next()); 139 root.addClass(type); 140 } 141 } catch (VMDisconnectedException ee) { 142 } catch (NoSessionException ee) { 144 } 146 } 147 148 public void sessionInterrupt(EventObject e) {} 149 public void sessionContinue(EventObject e) {} 150 151 153 public void classPrepare(ClassPrepareEventSet e) { 154 root.addClass(e.getReferenceType()); 155 } 156 157 public void classUnload(ClassUnloadEventSet e) { 158 root.removeClass(e.getClassName()); 159 } 160 161 public void vmDisconnect(VMDisconnectEventSet e) { 162 root = createClassTree(HEADING); 164 treeModel = new DefaultTreeModel(root); 165 tree.setModel(treeModel); 166 } 167 } 168 169 ClassTreeNode createClassTree(String label) { 170 return new ClassTreeNode(label, null); 171 } 172 173 class ClassTreeNode extends DefaultMutableTreeNode { 174 175 private String name; 176 private ReferenceType refTy; 178 ClassTreeNode(String name, ReferenceType refTy) { 179 this.name = name; 180 this.refTy = refTy; 181 } 182 183 public String toString() { 184 return name; 185 } 186 187 public ReferenceType getReferenceType() { 188 return refTy; 189 } 190 191 public String getReferenceTypeName() { 192 return refTy.name(); 193 } 194 195 private boolean isPackage() { 196 return (refTy == null); 197 } 198 199 public boolean isLeaf() { 200 return !isPackage(); 201 } 202 203 public void addClass(ReferenceType refTy) { 204 addClass(refTy.name(), refTy); 205 } 206 207 private void addClass(String className, ReferenceType refTy) { 208 if (className.equals("")) { 209 return; 210 } 211 int pos = className.indexOf('.'); 212 if (pos < 0) { 213 insertNode(className, refTy); 214 } else { 215 String head = className.substring(0, pos); 216 String tail = className.substring(pos + 1); 217 ClassTreeNode child = insertNode(head, null); 218 child.addClass(tail, refTy); 219 } 220 } 221 222 private ClassTreeNode insertNode(String name, ReferenceType refTy) { 223 for (int i = 0; i < getChildCount(); i++) { 224 ClassTreeNode child = (ClassTreeNode)getChildAt(i); 225 int cmp = name.compareTo(child.toString()); 226 if (cmp == 0) { 227 return child; 229 } else if (cmp < 0) { 230 ClassTreeNode newChild = new ClassTreeNode(name, refTy); 232 treeModel.insertNodeInto(newChild, this, i); 233 return newChild; 234 } 235 } 236 ClassTreeNode newChild = new ClassTreeNode(name, refTy); 238 treeModel.insertNodeInto(newChild, this, getChildCount()); 239 return newChild; 240 } 241 242 public void removeClass(String className) { 243 if (className.equals("")) { 244 return; 245 } 246 int pos = className.indexOf('.'); 247 if (pos < 0) { 248 ClassTreeNode child = findNode(className); 249 if (!isPackage()) { 250 treeModel.removeNodeFromParent(child); 251 } 252 } else { 253 String head = className.substring(0, pos); 254 String tail = className.substring(pos + 1); 255 ClassTreeNode child = findNode(head); 256 child.removeClass(tail); 257 if (isPackage() && child.getChildCount() < 1) { 258 treeModel.removeNodeFromParent(child); 260 } 261 } 262 } 263 264 private ClassTreeNode findNode(String name) { 265 for (int i = 0; i < getChildCount(); i++) { 266 ClassTreeNode child = (ClassTreeNode)getChildAt(i); 267 int cmp = name.compareTo(child.toString()); 268 if (cmp == 0) { 269 return child; 270 } else if (cmp > 0) { 271 return null; 273 } 274 } 275 return null; 276 } 277 278 } 279 280 } 281 | Popular Tags |