diff options
author | Tomas O'Connor <toconnor@openoffice.org> | 2003-05-26 13:47:45 +0000 |
---|---|---|
committer | Tomas O'Connor <toconnor@openoffice.org> | 2003-05-26 13:47:45 +0000 |
commit | 73ee44c0cddb62992649006f266764d88b52792a (patch) | |
tree | 920bd60e0a453d91e56d124f2dce899429a0930c /scripting/examples/java/debugger | |
parent | 9b4ee751fe3905056157b4f852cdb3063c3582fe (diff) |
Changes from code review, BeanShell document scripts can now be edited,
Rhino document scripts cannot.
Diffstat (limited to 'scripting/examples/java/debugger')
5 files changed, 180 insertions, 247 deletions
diff --git a/scripting/examples/java/debugger/DebugRunner.java b/scripting/examples/java/debugger/DebugRunner.java index 6449334024f6..dc62777e61e3 100644 --- a/scripting/examples/java/debugger/DebugRunner.java +++ b/scripting/examples/java/debugger/DebugRunner.java @@ -1,59 +1,71 @@ -import java.io.*;
-import java.net.URL;
-import java.net.URLDecoder;
-import drafts.com.sun.star.script.framework.runtime.XScriptContext;
-
-public class DebugRunner {
-
- private static final String FILE_URL_PREFIX =
- System.getProperty("os.name").startsWith("Windows") == true ?
- "file:///" : "file://";
-
- public void go(final XScriptContext xsctxt, String language, String uri,
- String filename) {
-
- OOScriptDebugger debugger;
- InputStream is = null;
- String path = "";
-
- System.out.println("uri: " + uri + ", language: " + language);
-
- if (language.equals("Rhino"))
- debugger = new OORhinoDebugger();
- else if (language.equals("BeanShell"))
- debugger = new OOBeanShellDebugger();
- else
- return;
-
- if (uri.startsWith(FILE_URL_PREFIX)) {
- uri = URLDecoder.decode(uri);
- String s = uri.substring(FILE_URL_PREFIX.length());
- File f = new File(s);
-
- if (f.exists()) {
- if (f.isDirectory()) {
- if (!filename.equals("")) {
- path = new File(f, filename).getAbsolutePath();
- }
- }
- else {
- path = f.getAbsolutePath();
- }
- }
- }
- else if (uri.startsWith("http://")) {
- try {
- if (!filename.equals(""))
- uri = uri + "/" + filename;
-
- URL url = new URL(uri);
- is = url.openStream();
- }
- catch (IOException ioe) {
- ioe.printStackTrace();
- }
- }
- System.out.println("path: " + path);
- debugger.go(xsctxt, path);
- }
-}
+import java.io.File; +import java.io.InputStream; +import java.io.IOException; +import java.net.URL; +import java.net.URLDecoder; + +import com.sun.star.uno.XComponentContext; +import com.sun.star.scripting.runtime.java.PathUtils; +import drafts.com.sun.star.script.framework.runtime.XScriptContext; + +public class DebugRunner { + + private static final String FILE_URL_PREFIX = + System.getProperty("os.name").startsWith("Windows") == true ? + "file:///" : "file://"; + + public void go(final XScriptContext xsctxt, String language, String uri, + String filename) { + + OOScriptDebugger debugger; + String path = ""; + + if (language.equals("Rhino")) { + debugger = new OORhinoDebugger(); + } + else if (language.equals("BeanShell")) { + debugger = new OOBeanShellDebugger(); + } + else { + return; + } + + if (uri.startsWith(FILE_URL_PREFIX)) { + uri = URLDecoder.decode(uri); + String s = uri.substring(FILE_URL_PREFIX.length()); + File f = new File(s); + + if (f.exists()) { + if (f.isDirectory()) { + if (!filename.equals("")) { + path = new File(f, filename).getAbsolutePath(); + } + } + else { + path = f.getAbsolutePath(); + } + } + debugger.go(xsctxt, path); + } + else { + if (!uri.endsWith("/")) { + uri += "/"; + } + + String script = uri + filename; + InputStream is; + + try { + is = PathUtils.getScriptFileStream( + script, xsctxt.getComponentContext()); + + if (is != null) { + debugger.go(xsctxt, is); + } + } + catch (IOException ioe) { + System.out.println("Error loading script: " + script); + } + } + } +} diff --git a/scripting/examples/java/debugger/OOBeanShellDebugger.java b/scripting/examples/java/debugger/OOBeanShellDebugger.java index ba93374c84f7..97323735ec48 100644 --- a/scripting/examples/java/debugger/OOBeanShellDebugger.java +++ b/scripting/examples/java/debugger/OOBeanShellDebugger.java @@ -1,13 +1,34 @@ -import java.util.*; -import javax.swing.*; -import javax.swing.text.*; -import javax.swing.event.*; -import java.awt.*; -import java.awt.event.*; -import java.io.*; +import javax.swing.JFrame; +import javax.swing.JTextArea; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JButton; +import javax.swing.JComponent; +import javax.swing.JFileChooser; +import javax.swing.JOptionPane; +import javax.swing.text.Document; +import javax.swing.event.DocumentListener; +import javax.swing.event.DocumentEvent; + +import java.awt.FlowLayout; +import java.awt.Graphics; +import java.awt.Color; +import java.awt.Font; +import java.awt.FontMetrics; +import java.awt.Polygon; +import java.awt.Rectangle; +import java.awt.Dimension; +import java.awt.event.ActionListener; +import java.awt.event.ActionEvent; + +import java.io.File; +import java.io.InputStream; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; import drafts.com.sun.star.script.framework.runtime.XScriptContext; -import bsh.*; +import bsh.Interpreter; public class OOBeanShellDebugger implements OOScriptDebugger, ActionListener, DocumentListener { @@ -16,22 +37,18 @@ public class OOBeanShellDebugger implements OOScriptDebugger, ActionListener, Do private GlyphGutter gg; private XScriptContext context; private int currentPosition = -1; - private ArrayList breakpoints; private int linecount; - private BufferedReader bufReader; private Interpreter sessionInterpreter; private Thread execThread = null; private String filename = null; + /* Entry point for script execution */ public void go(XScriptContext context, String filename) { - this.context = context; - this.breakpoints = new ArrayList(); - initUI(); - if (filename != null && filename != "") { try { - loadFile(filename); + FileInputStream fis = new FileInputStream(filename); this.filename = filename; + go(context, fis); } catch (IOException ioe) { JOptionPane.showMessageDialog(frame, @@ -41,9 +58,9 @@ public class OOBeanShellDebugger implements OOScriptDebugger, ActionListener, Do } } + /* Entry point for script execution */ public void go(XScriptContext context, InputStream in) { this.context = context; - this.breakpoints = new ArrayList(); initUI(); if (in != null) { @@ -58,12 +75,10 @@ public class OOBeanShellDebugger implements OOScriptDebugger, ActionListener, Do } } - public void loadFile(String filename) throws IOException { - FileInputStream fis = new FileInputStream(filename); - loadFile(fis); - } - public void loadFile(InputStream in) throws IOException { + + /* Remove ourselves as a DocumentListener while loading the file + so we don't get a storm of DocumentEvents during loading */ ta.getDocument().removeDocumentListener(this); byte[] contents = new byte[1024]; @@ -74,6 +89,13 @@ public class OOBeanShellDebugger implements OOScriptDebugger, ActionListener, Do pos += len; } + try { + in.close(); + } + catch (IOException ignore) { + } + + /* Update the GlyphGutter and add back the DocumentListener */ gg.update(); ta.getDocument().addDocumentListener(this); } @@ -93,7 +115,7 @@ public class OOBeanShellDebugger implements OOScriptDebugger, ActionListener, Do sp.setRowHeaderView(gg); ta.getDocument().addDocumentListener(this); - String[] labels = {"Run", /* "Stop", */ "Clear", "Save", "Close"}; + String[] labels = {"Run", "Clear", "Save", "Close"}; JPanel p = new JPanel(); p.setLayout(new FlowLayout()); @@ -109,6 +131,7 @@ public class OOBeanShellDebugger implements OOScriptDebugger, ActionListener, Do frame.show(); } + /* Implementation of DocumentListener interface */ public void insertUpdate(DocumentEvent e) { doChanged(e); } @@ -121,6 +144,8 @@ public class OOBeanShellDebugger implements OOScriptDebugger, ActionListener, Do doChanged(e); } + /* If the number of lines in the JTextArea has changed then update the + GlyphGutter */ public void doChanged(DocumentEvent e) { if (linecount != ta.getLineCount()) { gg.update(); @@ -134,6 +159,7 @@ public class OOBeanShellDebugger implements OOScriptDebugger, ActionListener, Do Interpreter interpreter = new Interpreter(); interpreter.getNameSpace().clear(); + // reset position and repaint gutter so no red arrow appears currentPosition = -1; gg.repaint(); @@ -144,12 +170,13 @@ public class OOBeanShellDebugger implements OOScriptDebugger, ActionListener, Do catch (bsh.EvalError err) { currentPosition = err.getErrorLineNumber() - 1; try { + // scroll to line of the error int line = ta.getLineStartOffset(currentPosition); Rectangle rect = ta.modelToView(line); ta.scrollRectToVisible(rect); } catch (Exception e) { - System.err.println("error: " + e.getMessage()); + // couldn't scroll to line, do nothing } gg.repaint(); @@ -168,108 +195,13 @@ public class OOBeanShellDebugger implements OOScriptDebugger, ActionListener, Do execThread.start(); } - private void stopExecution() { - if (execThread != null) { - execThread.interrupt(); - execThread = null; - } - - ta.setEditable(true); - if (bufReader != null) { - try { - bufReader.close(); - } - catch (IOException ioe) {} - } - bufReader = null; - currentPosition = -1; - gg.repaint(); - } - - private void startSession() { - /* Reader reader = new StringReader(ta.getText()); - bsh.Parser parser = new bsh.Parser(reader); - boolean eof = false; - - try { - Interpreter interpreter = new Interpreter(); - interpreter.getNameSpace().clear(); - interpreter.set("context", context); - - CallStack callstack = new CallStack(); - callstack.push(interpreter.getNameSpace()); - - bsh.SimpleNode node = null; - while(!eof) { - eof = parser.Line(); - node = parser.popNode(); - System.out.println("Executing: " + node.getText()); - node.eval(callstack, interpreter); - } - } - catch(Exception e) { - e.printStackTrace(); - } */ - - /* try { - sessionInterpreter = new Interpreter(); - sessionInterpreter.getNameSpace().clear(); - sessionInterpreter.set("context", context); - } - catch (bsh.EvalError err) { - JOptionPane.showMessageDialog(frame, - "Error at line " + String.valueOf(err.getErrorLineNumber()) + - "\n\n: " + err.getErrorText(), - "Error", JOptionPane.ERROR_MESSAGE); - stopExecution(); - } - - ta.setEditable(false); - Reader reader = new StringReader(ta.getText()); - bufReader = new BufferedReader(reader); - currentPosition = 0; - gg.repaint(); */ - } - - private void doStep() { - String line = null; - - try { - line = bufReader.readLine(); - } - catch (IOException ioe) { - JOptionPane.showMessageDialog(frame, - "Error reading line " + currentPosition + - "\n\n: " + ioe.getMessage(), - "Error", JOptionPane.ERROR_MESSAGE); - stopExecution(); - } - - if (line != null) { - try { - sessionInterpreter.eval(line); - currentPosition++; - gg.repaint(); - } - catch (bsh.EvalError err) { - gg.repaint(); - - JOptionPane.showMessageDialog(frame, - "Error at line " + String.valueOf(err.getErrorLineNumber()) + - "\n\n: " + err.getErrorText(), - "Error", JOptionPane.ERROR_MESSAGE); - } - } - else - stopExecution(); - } - private void promptForSaveName() { JFileChooser chooser = new JFileChooser(); chooser.setFileFilter(new javax.swing.filechooser.FileFilter() { public boolean accept(File f) { - if (f.isDirectory() || f.getName().endsWith(".bsh")) + if (f.isDirectory() || f.getName().endsWith(".bsh")) { return true; + } return false; } @@ -282,20 +214,23 @@ public class OOBeanShellDebugger implements OOScriptDebugger, ActionListener, Do if (ret == JFileChooser.APPROVE_OPTION) { filename = chooser.getSelectedFile().getAbsolutePath(); - if (!filename.endsWith(".bsh")) + if (!filename.endsWith(".bsh")) { filename += ".bsh"; + } } } private void saveTextArea() { - if (filename == null) + if (filename == null) { promptForSaveName(); + } + FileOutputStream fos = null; if (filename != null) { try { File f = new File(filename); - FileOutputStream fos = new FileOutputStream(f); + fos = new FileOutputStream(f); String s = ta.getText(); fos.write(s.getBytes(), 0, s.length()); } @@ -304,20 +239,31 @@ public class OOBeanShellDebugger implements OOScriptDebugger, ActionListener, Do "Error saving file: " + ioe.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); } + finally { + if (fos != null) { + try { + fos.close(); + } + catch (IOException ignore) { + } + } + } } } public void actionPerformed(ActionEvent e) { - if (e.getActionCommand().equals("Run")) + if (e.getActionCommand().equals("Run")) { startExecution(); - else if (e.getActionCommand().equals("Stop")) - stopExecution(); - else if (e.getActionCommand().equals("Close")) + } + else if (e.getActionCommand().equals("Close")) { frame.dispose(); - else if (e.getActionCommand().equals("Save")) + } + else if (e.getActionCommand().equals("Save")) { saveTextArea(); - else if (e.getActionCommand().equals("Clear")) + } + else if (e.getActionCommand().equals("Clear")) { ta.setText(""); + } } public JTextArea getTextArea() { @@ -327,52 +273,15 @@ public class OOBeanShellDebugger implements OOScriptDebugger, ActionListener, Do public int getCurrentPosition() { return currentPosition; } - - public void toggleBreakPoint(int line) { - Integer lineObj = new Integer(line); - int idx = breakpoints.indexOf(lineObj); - if (idx != -1) - breakpoints.remove(lineObj); - else - breakpoints.add(lineObj); - } - - public boolean isBreakPoint(int line) { - if (breakpoints.contains(new Integer(line))) - return true; - return false; - } } -class GlyphGutter extends JComponent implements MouseListener { +class GlyphGutter extends JComponent { private OOBeanShellDebugger debugger; - private boolean isError = false; - - public void mouseEntered(MouseEvent e) { - } - public void mousePressed(MouseEvent e) { - } - public void mouseClicked(MouseEvent e) { - if (e.getComponent() == this && - (e.getModifiers() & MouseEvent.BUTTON1_MASK) != 0) { - int x = e.getX(); - int y = e.getY(); - Font font = debugger.getTextArea().getFont(); - FontMetrics metrics = getFontMetrics(font); - int h = metrics.getHeight(); - int line = y/h; - debugger.toggleBreakPoint(line + 1); - } - } - public void mouseExited(MouseEvent e) { - } - public void mouseReleased(MouseEvent e) { - } + private final String DUMMY_STRING = "99"; GlyphGutter(OOBeanShellDebugger debugger) { this.debugger = debugger; - // addMouseListener(this); update(); } @@ -380,13 +289,16 @@ class GlyphGutter extends JComponent implements MouseListener { JTextArea textArea = debugger.getTextArea(); Font font = textArea.getFont(); setFont(font); + FontMetrics metrics = getFontMetrics(font); int h = metrics.getHeight(); int lineCount = textArea.getLineCount() + 1; + String dummy = Integer.toString(lineCount); if (dummy.length() < 2) { - dummy = "99"; + dummy = DUMMY_STRING; } + Dimension d = new Dimension(); d.width = metrics.stringWidth(dummy) + 16; d.height = lineCount * h + 100; @@ -413,7 +325,9 @@ class GlyphGutter extends JComponent implements MouseListener { int startLine = clip.y / h; int endLine = (clip.y + clip.height) / h + 1; int width = getWidth(); - if (endLine > lineCount) endLine = lineCount; + if (endLine > lineCount) { + endLine = lineCount; + } for (int i = startLine; i < endLine; i++) { String text; @@ -424,22 +338,13 @@ class GlyphGutter extends JComponent implements MouseListener { g.drawString(text, 0, y + ascent); int x = width - ascent; - if (debugger.isBreakPoint(i + 1)) - drawBreakPoint(g, ascent, x, y); - - if (i == debugger.getCurrentPosition()) + // if currentPosition is not -1 then a red arrow will be drawn + if (i == debugger.getCurrentPosition()) { drawArrow(g, ascent, x, y); + } } } - private void drawBreakPoint(Graphics g, int ascent, int x, int y) { - g.setColor(new Color(0x80, 0x00, 0x00)); - int dy = y + ascent - 9; - g.fillOval(x, dy, 9, 9); - g.drawOval(x, dy, 8, 8); - g.drawOval(x, dy, 9, 9); - } - private void drawArrow(Graphics g, int ascent, int x, int y) { Polygon arrow = new Polygon(); int dx = x; diff --git a/scripting/examples/java/debugger/OORhinoDebugger.java b/scripting/examples/java/debugger/OORhinoDebugger.java index a69e1359fdfd..8369adfd882c 100644 --- a/scripting/examples/java/debugger/OORhinoDebugger.java +++ b/scripting/examples/java/debugger/OORhinoDebugger.java @@ -1,10 +1,18 @@ -import drafts.com.sun.star.script.framework.runtime.XScriptContext; import javax.swing.SwingUtilities; -import org.mozilla.javascript.*; -import org.mozilla.javascript.tools.debugger.*; +import java.io.InputStream; + +import org.mozilla.javascript.Context; +import org.mozilla.javascript.Scriptable; +import org.mozilla.javascript.ImporterTopLevel; +import org.mozilla.javascript.tools.debugger.Main; +import org.mozilla.javascript.tools.debugger.ScopeProvider; + +import drafts.com.sun.star.script.framework.runtime.XScriptContext; public class OORhinoDebugger implements OOScriptDebugger { + // This code is based on the main method of the Rhino Debugger Main class + // We pass in the XScriptContext in the global scope for script execution public void go(final XScriptContext xsctxt, String filename) { try { final Main sdb = new Main("Rhino JavaScript Debugger"); @@ -31,12 +39,17 @@ public class OORhinoDebugger implements OOScriptDebugger { return scope; } }); + // This is the method we've added to open a file when starting + // the Rhino debugger sdb.openFile(filename); } catch (Exception exc) { exc.printStackTrace(); } } + public void go(final XScriptContext xsctxt, InputStream in) { + } + static void swingInvoke(Runnable f) { if (SwingUtilities.isEventDispatchThread()) { f.run(); diff --git a/scripting/examples/java/debugger/OOScriptDebugger.java b/scripting/examples/java/debugger/OOScriptDebugger.java index c8bcdd042bbb..67532e113f9e 100644 --- a/scripting/examples/java/debugger/OOScriptDebugger.java +++ b/scripting/examples/java/debugger/OOScriptDebugger.java @@ -1,5 +1,7 @@ +import java.io.InputStream; import drafts.com.sun.star.script.framework.runtime.XScriptContext; public interface OOScriptDebugger { public void go(XScriptContext ctxt, String filename); + public void go(XScriptContext ctxt, InputStream in); } diff --git a/scripting/examples/java/debugger/parcel-descriptor.xml b/scripting/examples/java/debugger/parcel-descriptor.xml index 3cbde538be5a..d2e26fcbf9e8 100644 --- a/scripting/examples/java/debugger/parcel-descriptor.xml +++ b/scripting/examples/java/debugger/parcel-descriptor.xml @@ -4,10 +4,11 @@ <script language="Java"> <locale lang="en"> - <displayname value="asdf.doMethod" /> - <description>asdf.doMethod</description> + <displayname value="Scripting Framework Debugger" /> + <description>Script that starts debuggers for Rhino and BeanShell + </description> </locale> - <logicalname value="DebugRunner.Debug" /> + <logicalname value="_$DebugRunner.Debug" /> <functionname value="DebugRunner.go" /> <languagedepprops> <prop name="classpath" value="debugger.jar"/> |