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/SourceTool.java (1 of 18352 files). Show all

Unified · Split

java/pkg/com/sun/tools/example/debug/gui/SourceTool.java+383−0
@@ -0,0 +1,383 @@
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.awt.*;
30import java.awt.event.*;
31import javax.swing.*;
32
33import com.sun.jdi.*;
34import com.sun.jdi.request.*;
35
36import com.sun.tools.example.debug.bdi.*;
37
38public class SourceTool extends JPanel {
39
40 private static final long serialVersionUID = -5461299294186395257L;
41
42 private Environment env;
43
44 private ExecutionManager runtime;
45 private ContextManager context;
46 private SourceManager sourceManager;
47
48 private JList list;
49 private ListModel sourceModel;
50
51 // Information on source file that is on display, or failed to be
52 // displayed due to inaccessible source. Used to update display
53 // when sourcepath is changed.
54
55 private String sourceName; // relative path name, if showSourceFile
56 private Location sourceLocn; // location, if showSourceForLocation
57 private CommandInterpreter interpreter;
58
59 public SourceTool(Environment env) {
60
61 super(new BorderLayout());
62
63 this.env = env;
64
65 runtime = env.getExecutionManager();
66 sourceManager = env.getSourceManager();
67 this.context = env.getContextManager();
68 this.interpreter = new CommandInterpreter(env, true);
69
70 sourceModel = new DefaultListModel(); // empty
71
72 list = new JList(sourceModel);
73 list.setCellRenderer(new SourceLineRenderer());
74
75 list.setPrototypeCellValue(SourceModel.prototypeCellValue);
76
77 SourceToolListener listener = new SourceToolListener();
78 context.addContextListener(listener);
79 runtime.addSpecListener(listener);
80 sourceManager.addSourceListener(listener);
81
82 MouseListener squeek = new STMouseListener();
83 list.addMouseListener(squeek);
84
85 add(new JScrollPane(list));
86 }
87
88 public void setTextFont(Font f) {
89 list.setFont(f);
90 list.setPrototypeCellValue(SourceModel.prototypeCellValue);
91 }
92
93 private class SourceToolListener
94 implements ContextListener, SourceListener, SpecListener
95 {
96
97 // ContextListener
98
99 @Override
100 public void currentFrameChanged(CurrentFrameChangedEvent e) {
101 showSourceContext(e.getThread(), e.getIndex());
102 }
103
104 // Clear source view.
105 // sourceModel = new DefaultListModel(); // empty
106
107 // SourceListener
108
109 @Override
110 public void sourcepathChanged(SourcepathChangedEvent e) {
111 // Reload source view if its contents depend
112 // on the source path.
113 if (sourceName != null) {
114 showSourceFile(sourceName);
115 } else if (sourceLocn != null) {
116 showSourceForLocation(sourceLocn);
117 }
118 }
119
120 // SpecListener
121
122 @Override
123 public void breakpointSet(SpecEvent e) {
124 breakpointResolved(e);
125 }
126
127 @Override
128 public void breakpointDeferred(SpecEvent e) { }
129
130 @Override
131 public void breakpointDeleted(SpecEvent e) {
132 BreakpointRequest req = (BreakpointRequest)e.getEventRequest();
133 Location loc = req.location();
134 if (loc != null) {
135 try {
136 SourceModel sm = sourceManager.sourceForLocation(loc);
137 sm.showBreakpoint(loc.lineNumber(), false);
138 showSourceForLocation(loc);
139 } catch (Exception exc) {
140 }
141 }
142 }
143
144 @Override
145 public void breakpointResolved(SpecEvent e) {
146 BreakpointRequest req = (BreakpointRequest)e.getEventRequest();
147 Location loc = req.location();
148 try {
149 SourceModel sm = sourceManager.sourceForLocation(loc);
150 sm.showBreakpoint(loc.lineNumber(), true);
151 showSourceForLocation(loc);
152 } catch (Exception exc) {
153 }
154 }
155
156 @Override
157 public void breakpointError(SpecErrorEvent e) {
158 breakpointDeleted(e);
159 }
160
161 @Override
162 public void watchpointSet(SpecEvent e) {
163 }
164 @Override
165 public void watchpointDeferred(SpecEvent e) {
166 }
167 @Override
168 public void watchpointDeleted(SpecEvent e) {
169 }
170 @Override
171 public void watchpointResolved(SpecEvent e) {
172 }
173 @Override
174 public void watchpointError(SpecErrorEvent e) {
175 }
176
177 @Override
178 public void exceptionInterceptSet(SpecEvent e) {
179 }
180 @Override
181 public void exceptionInterceptDeferred(SpecEvent e) {
182 }
183 @Override
184 public void exceptionInterceptDeleted(SpecEvent e) {
185 }
186 @Override
187 public void exceptionInterceptResolved(SpecEvent e) {
188 }
189 @Override
190 public void exceptionInterceptError(SpecErrorEvent e) {
191 }
192 }
193
194 private void showSourceContext(ThreadReference thread, int index) {
195 //### Should use ThreadInfo here.
196 StackFrame frame = null;
197 if (thread != null) {
198 try {
199 frame = thread.frame(index);
200 } catch (IncompatibleThreadStateException e) {}
201 }
202 if (frame == null) {
203 return;
204 }
205 Location locn = frame.location();
206 /*****
207 if (!showSourceForLocation(locn)) {
208 env.notice("Could not display source for "
209 + Utils.locationString(locn));
210 }
211 *****/
212 showSourceForLocation(locn);
213 }
214
215 public boolean showSourceForLocation(Location locn) {
216 sourceName = null;
217 sourceLocn = locn;
218 int lineNo = locn.lineNumber();
219 if (lineNo != -1) {
220 SourceModel source = sourceManager.sourceForLocation(locn);
221 if (source != null) {
222 showSourceAtLine(source, lineNo-1);
223 return true;
224 }
225 }
226 // Here if we could not display source.
227 showSourceUnavailable();
228 return false;
229 }
230
231 public boolean showSourceFile(String fileName) {
232 sourceLocn = null;
233 File file;
234 if (!fileName.startsWith(File.separator)) {
235 sourceName = fileName;
236 SearchPath sourcePath = sourceManager.getSourcePath();
237 file = sourcePath.resolve(fileName);
238 if (file == null) {
239 //env.failure("Source not found on current source path.");
240 showSourceUnavailable();
241 return false;
242 }
243 } else {
244 sourceName = null; // Absolute pathname does not depend on sourcepath.
245 file = new File(fileName);
246 }
247 SourceModel source = sourceManager.sourceForFile(file);
248 if (source != null) {
249 showSource(source);
250 return true;
251 }
252 showSourceUnavailable();
253 return false;
254 }
255
256 private void showSource(SourceModel model) {
257 setViewModel(model);
258 }
259
260 private void showSourceAtLine(SourceModel model, int lineNo) {
261 setViewModel(model);
262 if (model.isActuallySource && (lineNo < model.getSize())) {
263 list.setSelectedIndex(lineNo);
264 if (lineNo+4 < model.getSize()) {
265 list.ensureIndexIsVisible(lineNo+4); // give some context
266 }
267 list.ensureIndexIsVisible(lineNo);
268 }
269 }
270
271 private void showSourceUnavailable() {
272 SourceModel model = new SourceModel("[Source code is not available]");
273 setViewModel(model);
274 }
275
276 private void setViewModel(SourceModel model) {
277 if (model != sourceModel) {
278 // install new model
279 list.setModel(model);
280 sourceModel = model;
281 }
282 }
283
284 private class SourceLineRenderer extends DefaultListCellRenderer {
285
286 @Override
287 public Component getListCellRendererComponent(JList list,
288 Object value,
289 int index,
290 boolean isSelected,
291 boolean cellHasFocus) {
292
293 //### Should set background highlight and/or icon if breakpoint on this line.
294 // Configures "this"
295 super.getListCellRendererComponent(list, value, index,
296 isSelected, cellHasFocus);
297
298 SourceModel.Line line = (SourceModel.Line)value;
299
300 //### Tab expansion is now done when source file is read in,
301 //### to speed up display. This costs a lot of space, slows
302 //### down source file loading, and has not been demonstrated
303 //### to yield an observable improvement in display performance.
304 //### Measurements may be appropriate here.
305 //String sourceLine = expandTabs((String)value);
306 setText(line.text);
307 if (line.hasBreakpoint) {
308 setIcon(Icons.stopSignIcon);
309 } else if (line.isExecutable()) {
310 setIcon(Icons.execIcon);
311 } else {
312 setIcon(Icons.blankIcon);
313 }
314
315
316 return this;
317 }
318
319 @Override
320 public Dimension getPreferredSize() {
321 Dimension dim = super.getPreferredSize();
322 return new Dimension(dim.width, dim.height-5);
323 }
324
325 }
326
327 private class STMouseListener extends MouseAdapter implements MouseListener {
328 @Override
329 public void mousePressed(MouseEvent e) {
330 if (e.isPopupTrigger()) {
331 showPopupMenu((Component)e.getSource(),
332 e.getX(), e.getY());
333 }
334 }
335
336 @Override
337 public void mouseReleased(MouseEvent e) {
338 if (e.isPopupTrigger()) {
339 showPopupMenu((Component)e.getSource(),
340 e.getX(), e.getY());
341 }
342 }
343
344 private void showPopupMenu(Component invoker, int x, int y) {
345 JList list = (JList)invoker;
346 int ln = list.getSelectedIndex() + 1;
347 SourceModel.Line line =
348 (SourceModel.Line)list.getSelectedValue();
349 JPopupMenu popup = new JPopupMenu();
350
351 if (line == null) {
352 popup.add(new JMenuItem("please select a line"));
353 } else if (line.isExecutable()) {
354 String className = line.refType.name();
355 if (line.hasBreakpoint()) {
356 popup.add(commandItem("Clear Breakpoint",
357 "clear " + className +
358 ":" + ln));
359 } else {
360 popup.add(commandItem("Set Breakpoint",
361 "stop at " + className +
362 ":" + ln));
363 }
364 } else {
365 popup.add(new JMenuItem("not an executable line"));
366 }
367
368 popup.show(invoker,
369 x + popup.getWidth()/2, y + popup.getHeight()/2);
370 }
371
372 private JMenuItem commandItem(String label, final String cmd) {
373 JMenuItem item = new JMenuItem(label);
374 item.addActionListener(new ActionListener() {
375 @Override
376 public void actionPerformed(ActionEvent e) {
377 interpreter.executeCommand(cmd);
378 }
379 });
380 return item;
381 }
382 }
383}