History

My first initial commit with all of mine experimental changes.

Dmitry Kabak (userdima committed 13 years ago

Commit d37b88d1 parent 3f5b46618352 files · +2598093 −-8690Browse files

Showing the changes to java/pkg/com/sun/tools/example/debug/gui/SourceTreeTool.java (1 of 18352 files). Show all

Unified · Split

java/pkg/com/sun/tools/example/debug/gui/SourceTreeTool.java+283−0
@@ -0,0 +1,283 @@
1/*
2 * Copyright (c) 1998, 1999, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package com.sun.tools.example.debug.gui;
27
28import java.io.*;
29import java.util.*;
30
31import javax.swing.*;
32import javax.swing.tree.*;
33import java.awt.*;
34import java.awt.event.*;
35
36import com.sun.tools.example.debug.bdi.*;
37
38public class SourceTreeTool extends JPanel {
39
40 private static final long serialVersionUID = 3336680912107956419L;
41
42 private Environment env;
43
44 private ExecutionManager runtime;
45 private SourceManager sourceManager;
46 private ClassManager classManager;
47
48 private JTree tree;
49 private SourceTreeNode root;
50 private SearchPath sourcePath;
51 private CommandInterpreter interpreter;
52
53 private static String HEADING = "SOURCES";
54
55 public SourceTreeTool(Environment env) {
56
57 super(new BorderLayout());
58
59 this.env = env;
60 this.runtime = env.getExecutionManager();
61 this.sourceManager = env.getSourceManager();
62
63 this.interpreter = new CommandInterpreter(env);
64
65 sourcePath = sourceManager.getSourcePath();
66 root = createDirectoryTree(HEADING);
67
68 // Create a tree that allows one selection at a time.
69 tree = new JTree(new DefaultTreeModel(root));
70 tree.setSelectionModel(new SingleLeafTreeSelectionModel());
71
72 /******
73 // Listen for when the selection changes.
74 tree.addTreeSelectionListener(new TreeSelectionListener() {
75 public void valueChanged(TreeSelectionEvent e) {
76 SourceTreeNode node = (SourceTreeNode)
77 (e.getPath().getLastPathComponent());
78 interpreter.executeCommand("view " + node.getRelativePath());
79 }
80 });
81 ******/
82
83 MouseListener ml = new MouseAdapter() {
84 @Override
85 public void mouseClicked(MouseEvent e) {
86 int selRow = tree.getRowForLocation(e.getX(), e.getY());
87 TreePath selPath = tree.getPathForLocation(e.getX(), e.getY());
88 if(selRow != -1) {
89 if(e.getClickCount() == 1) {
90 SourceTreeNode node =
91 (SourceTreeNode)selPath.getLastPathComponent();
92 // If user clicks on leaf, select it, and issue 'view' command.
93 if (node.isLeaf()) {
94 tree.setSelectionPath(selPath);
95 interpreter.executeCommand("view " + node.getRelativePath());
96 }
97 }
98 }
99 }
100 };
101 tree.addMouseListener(ml);
102
103 JScrollPane treeView = new JScrollPane(tree);
104 add(treeView);
105
106 // Create listener for source path changes.
107
108 SourceTreeToolListener listener = new SourceTreeToolListener();
109 sourceManager.addSourceListener(listener);
110
111 //### remove listeners on exit!
112 }
113
114 private class SourceTreeToolListener implements SourceListener {
115
116 @Override
117 public void sourcepathChanged(SourcepathChangedEvent e) {
118 sourcePath = sourceManager.getSourcePath();
119 root = createDirectoryTree(HEADING);
120 tree.setModel(new DefaultTreeModel(root));
121 }
122
123 }
124
125 private static class SourceOrDirectoryFilter implements FilenameFilter {
126 @Override
127 public boolean accept(File dir, String name) {
128 return (name.endsWith(".java") ||
129 new File(dir, name).isDirectory());
130 }
131 }
132
133 private static FilenameFilter filter = new SourceOrDirectoryFilter();
134
135 SourceTreeNode createDirectoryTree(String label) {
136 try {
137 return new SourceTreeNode(label, null, "", true);
138 } catch (SecurityException e) {
139 env.failure("Cannot access source file or directory");
140 return null;
141 }
142 }
143
144
145 class SourceTreeNode implements TreeNode {
146
147 private String name;
148 private boolean isDirectory;
149 private SourceTreeNode parent;
150 private SourceTreeNode[] children;
151 private String relativePath;
152 private boolean isExpanded;
153
154 private SourceTreeNode(String label,
155 SourceTreeNode parent,
156 String relativePath,
157 boolean isDirectory) {
158 this.name = label;
159 this.relativePath = relativePath;
160 this.parent = parent;
161 this.isDirectory = isDirectory;
162 }
163
164 @Override
165 public String toString() {
166 return name;
167 }
168
169 public String getRelativePath() {
170 return relativePath;
171 }
172
173 private void expandIfNeeded() {
174 try {
175 if (!isExpanded && isDirectory) {
176 String[] files = sourcePath.children(relativePath, filter);
177 children = new SourceTreeNode[files.length];
178 for (int i = 0; i < files.length; i++) {
179 String childName =
180 (relativePath.equals(""))
181 ? files[i]
182 : relativePath + File.separator + files[i];
183 File file = sourcePath.resolve(childName);
184 boolean isDir = (file != null && file.isDirectory());
185 children[i] =
186 new SourceTreeNode(files[i], this, childName, isDir);
187 }
188 }
189 isExpanded = true;
190 } catch (SecurityException e) {
191 children = null;
192 env.failure("Cannot access source file or directory");
193 }
194 }
195
196 // -- interface TreeNode --
197
198 /*
199 * Returns the child <code>TreeNode</code> at index
200 * <code>childIndex</code>.
201 */
202 @Override
203 public TreeNode getChildAt(int childIndex) {
204 expandIfNeeded();
205 return children[childIndex];
206 }
207
208 /**
209 * Returns the number of children <code>TreeNode</code>s the receiver
210 * contains.
211 */
212 @Override
213 public int getChildCount() {
214 expandIfNeeded();
215 return children.length;
216 }
217
218 /**
219 * Returns the parent <code>TreeNode</code> of the receiver.
220 */
221 @Override
222 public TreeNode getParent() {
223 return parent;
224 }
225
226 /**
227 * Returns the index of <code>node</code> in the receivers children.
228 * If the receiver does not contain <code>node</code>, -1 will be
229 * returned.
230 */
231 @Override
232 public int getIndex(TreeNode node) {
233 expandIfNeeded();
234 for (int i = 0; i < children.length; i++) {
235 if (children[i] == node) {
236 return i;
237 }
238 }
239 return -1;
240 }
241
242 /**
243 * Returns true if the receiver allows children.
244 */
245 @Override
246 public boolean getAllowsChildren() {
247 return isDirectory;
248 }
249
250 /**
251 * Returns true if the receiver is a leaf.
252 */
253 @Override
254 public boolean isLeaf() {
255 expandIfNeeded();
256 return !isDirectory;
257 }
258
259 /**
260 * Returns the children of the receiver as an Enumeration.
261 */
262 @Override
263 public Enumeration children() {
264 expandIfNeeded();
265 return new Enumeration() {
266 int i = 0;
267 @Override
268 public boolean hasMoreElements() {
269 return (i < children.length);
270 }
271 @Override
272 public Object nextElement() throws NoSuchElementException {
273 if (i >= children.length) {
274 throw new NoSuchElementException();
275 }
276 return children[i++];
277 }
278 };
279 }
280
281 }
282
283}