xref: /aoo4110/main/rhino/rhino1_7R3.patch (revision b1cdbd2c)
1*b1cdbd2cSJim JagielskiIndex: toolsrc/org/mozilla/javascript/tools/debugger/GuiCallback.java
2*b1cdbd2cSJim Jagielski===================================================================
3*b1cdbd2cSJim Jagielski--- toolsrc/org/mozilla/javascript/tools/debugger/GuiCallback.java	(revision 1)
4*b1cdbd2cSJim Jagielski+++ misc/build/rhino1_7R3/toolsrc/org/mozilla/javascript/tools/debugger/GuiCallback.java	(working copy)
5*b1cdbd2cSJim Jagielski@@ -56,6 +56,11 @@
6*b1cdbd2cSJim Jagielski                         String threadTitle,
7*b1cdbd2cSJim Jagielski                         String alertMessage);
8*b1cdbd2cSJim Jagielski
9*b1cdbd2cSJim Jagielski+	/**
10*b1cdbd2cSJim Jagielski+	 * Called when the interrupt loop has been exited.
11*b1cdbd2cSJim Jagielski+	 */
12*b1cdbd2cSJim Jagielski+	void exitInterrupt();
13*b1cdbd2cSJim Jagielski+
14*b1cdbd2cSJim Jagielski     /**
15*b1cdbd2cSJim Jagielski      * Returns whether the current thread is the GUI's event thread.
16*b1cdbd2cSJim Jagielski      * This information is required to avoid blocking the event thread
17*b1cdbd2cSJim JagielskiIndex: toolsrc/org/mozilla/javascript/tools/debugger/Main.java
18*b1cdbd2cSJim Jagielski===================================================================
19*b1cdbd2cSJim Jagielski--- toolsrc/org/mozilla/javascript/tools/debugger/Main.java	(revision 1)
20*b1cdbd2cSJim Jagielski+++ misc/build/rhino1_7R3/toolsrc/org/mozilla/javascript/tools/debugger/Main.java	(working copy)
21*b1cdbd2cSJim Jagielski@@ -44,6 +44,8 @@
22*b1cdbd2cSJim Jagielski import java.io.InputStream;
23*b1cdbd2cSJim Jagielski import java.io.PrintStream;
24*b1cdbd2cSJim Jagielski
25*b1cdbd2cSJim Jagielski+import java.net.URL;
26*b1cdbd2cSJim Jagielski+
27*b1cdbd2cSJim Jagielski import javax.swing.JFrame;
28*b1cdbd2cSJim Jagielski
29*b1cdbd2cSJim Jagielski import org.mozilla.javascript.*;
30*b1cdbd2cSJim Jagielski@@ -161,7 +163,7 @@
31*b1cdbd2cSJim Jagielski      * Console window.
32*b1cdbd2cSJim Jagielski      */
33*b1cdbd2cSJim Jagielski     public InputStream getIn() {
34*b1cdbd2cSJim Jagielski-        return debugGui.getConsole().getIn();
35*b1cdbd2cSJim Jagielski+        return null;//return debugGui.getConsole().getIn();
36*b1cdbd2cSJim Jagielski     }
37*b1cdbd2cSJim Jagielski
38*b1cdbd2cSJim Jagielski     /**
39*b1cdbd2cSJim Jagielski@@ -169,7 +171,7 @@
40*b1cdbd2cSJim Jagielski      * Console window.
41*b1cdbd2cSJim Jagielski      */
42*b1cdbd2cSJim Jagielski     public PrintStream getOut() {
43*b1cdbd2cSJim Jagielski-        return debugGui.getConsole().getOut();
44*b1cdbd2cSJim Jagielski+        return null;//return debugGui.getConsole().getOut();
45*b1cdbd2cSJim Jagielski     }
46*b1cdbd2cSJim Jagielski
47*b1cdbd2cSJim Jagielski     /**
48*b1cdbd2cSJim Jagielski@@ -177,7 +179,7 @@
49*b1cdbd2cSJim Jagielski      * Console window.
50*b1cdbd2cSJim Jagielski      */
51*b1cdbd2cSJim Jagielski     public PrintStream getErr() {
52*b1cdbd2cSJim Jagielski-        return debugGui.getConsole().getErr();
53*b1cdbd2cSJim Jagielski+        return null;//return debugGui.getConsole().getErr();
54*b1cdbd2cSJim Jagielski     }
55*b1cdbd2cSJim Jagielski
56*b1cdbd2cSJim Jagielski     /**
57*b1cdbd2cSJim Jagielski@@ -437,4 +439,39 @@
58*b1cdbd2cSJim Jagielski             return scope;
59*b1cdbd2cSJim Jagielski         }
60*b1cdbd2cSJim Jagielski     }
61*b1cdbd2cSJim Jagielski+
62*b1cdbd2cSJim Jagielski+    // shortcut methods
63*b1cdbd2cSJim Jagielski+
64*b1cdbd2cSJim Jagielski+    public void addWindowListener(java.awt.event.WindowListener l) {
65*b1cdbd2cSJim Jagielski+        debugGui.addWindowListener(l);
66*b1cdbd2cSJim Jagielski+    }
67*b1cdbd2cSJim Jagielski+
68*b1cdbd2cSJim Jagielski+    public void highlighLineInScriptWindow(URL url, int lineNum) {
69*b1cdbd2cSJim Jagielski+		debugGui.highlighLineInScriptWindow(url, lineNum);
70*b1cdbd2cSJim Jagielski+	}
71*b1cdbd2cSJim Jagielski+
72*b1cdbd2cSJim Jagielski+    public Object runScriptWindow(URL scriptUrl) throws Exception
73*b1cdbd2cSJim Jagielski+    {
74*b1cdbd2cSJim Jagielski+		return debugGui.runScriptWindow(scriptUrl);
75*b1cdbd2cSJim Jagielski+	}
76*b1cdbd2cSJim Jagielski+
77*b1cdbd2cSJim Jagielski+    public void openFile(URL scriptUrl, Scriptable scope, Runnable closeCallback) {
78*b1cdbd2cSJim Jagielski+		debugGui.openFile(scriptUrl, scope, closeCallback);
79*b1cdbd2cSJim Jagielski+	}
80*b1cdbd2cSJim Jagielski+
81*b1cdbd2cSJim Jagielski+    public void toFront() {
82*b1cdbd2cSJim Jagielski+		debugGui.toFront();
83*b1cdbd2cSJim Jagielski+	}
84*b1cdbd2cSJim Jagielski+
85*b1cdbd2cSJim Jagielski+    public void showScriptWindow(URL url) {
86*b1cdbd2cSJim Jagielski+		debugGui.showScriptWindow(url);
87*b1cdbd2cSJim Jagielski+	}
88*b1cdbd2cSJim Jagielski+
89*b1cdbd2cSJim Jagielski+    public boolean isModified(URL url) {
90*b1cdbd2cSJim Jagielski+		return debugGui.isModified(url);
91*b1cdbd2cSJim Jagielski+	}
92*b1cdbd2cSJim Jagielski+
93*b1cdbd2cSJim Jagielski+	public String getText(URL url) {
94*b1cdbd2cSJim Jagielski+		return debugGui.getText(url);
95*b1cdbd2cSJim Jagielski+	}
96*b1cdbd2cSJim Jagielski }
97*b1cdbd2cSJim JagielskiIndex: toolsrc/org/mozilla/javascript/tools/debugger/Dim.java
98*b1cdbd2cSJim Jagielski===================================================================
99*b1cdbd2cSJim Jagielski--- toolsrc/org/mozilla/javascript/tools/debugger/Dim.java	(revision 1)
100*b1cdbd2cSJim Jagielski+++ misc/build/rhino1_7R3/toolsrc/org/mozilla/javascript/tools/debugger/Dim.java	(working copy)
101*b1cdbd2cSJim Jagielski@@ -69,6 +69,7 @@
102*b1cdbd2cSJim Jagielski     private static final int IPROXY_OBJECT_TO_STRING = 5;
103*b1cdbd2cSJim Jagielski     private static final int IPROXY_OBJECT_PROPERTY = 6;
104*b1cdbd2cSJim Jagielski     private static final int IPROXY_OBJECT_IDS = 7;
105*b1cdbd2cSJim Jagielski+    private static final int IPROXY_EVAL_SCRIPT_WITH_RETURN = 8;
106*b1cdbd2cSJim Jagielski
107*b1cdbd2cSJim Jagielski     /**
108*b1cdbd2cSJim Jagielski      * Interface to the debugger GUI.
109*b1cdbd2cSJim Jagielski@@ -433,7 +434,7 @@
110*b1cdbd2cSJim Jagielski      */
111*b1cdbd2cSJim Jagielski     private String getNormalizedUrl(DebuggableScript fnOrScript) {
112*b1cdbd2cSJim Jagielski         String url = fnOrScript.getSourceName();
113*b1cdbd2cSJim Jagielski-        if (url == null) { url = "<stdin>"; }
114*b1cdbd2cSJim Jagielski+        if (url == null) { url = "document"; }
115*b1cdbd2cSJim Jagielski         else {
116*b1cdbd2cSJim Jagielski             // Not to produce window for eval from different lines,
117*b1cdbd2cSJim Jagielski             // strip line numbers, i.e. replace all #[0-9]+\(eval\) by
118*b1cdbd2cSJim Jagielski@@ -622,6 +623,17 @@
119*b1cdbd2cSJim Jagielski     }
120*b1cdbd2cSJim Jagielski
121*b1cdbd2cSJim Jagielski     /**
122*b1cdbd2cSJim Jagielski+     * Evaluates the given script with scope and return value.
123*b1cdbd2cSJim Jagielski+     */
124*b1cdbd2cSJim Jagielski+    public Object evalScriptWithReturn(final String url, final String text, Scriptable scope) {
125*b1cdbd2cSJim Jagielski+        DimIProxy action = new DimIProxy(this, IPROXY_EVAL_SCRIPT_WITH_RETURN);
126*b1cdbd2cSJim Jagielski+        action.url = url;
127*b1cdbd2cSJim Jagielski+        action.text = text;
128*b1cdbd2cSJim Jagielski+        action.scope = scope;
129*b1cdbd2cSJim Jagielski+        return contextFactory.call(action);
130*b1cdbd2cSJim Jagielski+    }
131*b1cdbd2cSJim Jagielski+
132*b1cdbd2cSJim Jagielski+    /**
133*b1cdbd2cSJim Jagielski      * Converts the given script object to a string.
134*b1cdbd2cSJim Jagielski      */
135*b1cdbd2cSJim Jagielski     public String objectToString(Object object) {
136*b1cdbd2cSJim Jagielski@@ -869,6 +881,7 @@
137*b1cdbd2cSJim Jagielski                 interruptedContextData = null;
138*b1cdbd2cSJim Jagielski                 eventThreadMonitor.notifyAll();
139*b1cdbd2cSJim Jagielski             }
140*b1cdbd2cSJim Jagielski+            callback.exitInterrupt();
141*b1cdbd2cSJim Jagielski         }
142*b1cdbd2cSJim Jagielski
143*b1cdbd2cSJim Jagielski     }
144*b1cdbd2cSJim Jagielski@@ -966,6 +979,11 @@
145*b1cdbd2cSJim Jagielski         private Object[] objectArrayResult;
146*b1cdbd2cSJim Jagielski
147*b1cdbd2cSJim Jagielski         /**
148*b1cdbd2cSJim Jagielski+         * The Scriptable as arguments.
149*b1cdbd2cSJim Jagielski+         */
150*b1cdbd2cSJim Jagielski+        private Scriptable scope;
151*b1cdbd2cSJim Jagielski+
152*b1cdbd2cSJim Jagielski+        /**
153*b1cdbd2cSJim Jagielski          * Creates a new DimIProxy.
154*b1cdbd2cSJim Jagielski          */
155*b1cdbd2cSJim Jagielski         private DimIProxy(Dim dim, int type) {
156*b1cdbd2cSJim Jagielski@@ -1021,6 +1039,9 @@
157*b1cdbd2cSJim Jagielski                 objectArrayResult = dim.getObjectIdsImpl(cx, object);
158*b1cdbd2cSJim Jagielski                 break;
159*b1cdbd2cSJim Jagielski
160*b1cdbd2cSJim Jagielski+              case IPROXY_EVAL_SCRIPT_WITH_RETURN:
161*b1cdbd2cSJim Jagielski+                return cx.evaluateString(this.scope, text, url, 1, null);
162*b1cdbd2cSJim Jagielski+
163*b1cdbd2cSJim Jagielski               default:
164*b1cdbd2cSJim Jagielski                 throw Kit.codeBug();
165*b1cdbd2cSJim Jagielski             }
166*b1cdbd2cSJim JagielskiIndex: toolsrc/org/mozilla/javascript/tools/debugger/SwingGui.java
167*b1cdbd2cSJim Jagielski===================================================================
168*b1cdbd2cSJim Jagielski--- toolsrc/org/mozilla/javascript/tools/debugger/SwingGui.java	(revision 1)
169*b1cdbd2cSJim Jagielski+++ misc/build/rhino1_7R3/toolsrc/org/mozilla/javascript/tools/debugger/SwingGui.java	(working copy)
170*b1cdbd2cSJim Jagielski@@ -68,6 +68,8 @@
171*b1cdbd2cSJim Jagielski import java.awt.Toolkit;
172*b1cdbd2cSJim Jagielski import java.awt.event.*;
173*b1cdbd2cSJim Jagielski
174*b1cdbd2cSJim Jagielski+import java.net.URL;
175*b1cdbd2cSJim Jagielski+
176*b1cdbd2cSJim Jagielski import java.util.List;
177*b1cdbd2cSJim Jagielski import java.util.ArrayList;
178*b1cdbd2cSJim Jagielski import java.util.Arrays;
179*b1cdbd2cSJim Jagielski@@ -84,6 +86,7 @@
180*b1cdbd2cSJim Jagielski import java.lang.reflect.Method;
181*b1cdbd2cSJim Jagielski
182*b1cdbd2cSJim Jagielski import org.mozilla.javascript.Kit;
183*b1cdbd2cSJim Jagielski+import org.mozilla.javascript.Scriptable;
184*b1cdbd2cSJim Jagielski import org.mozilla.javascript.SecurityUtilities;
185*b1cdbd2cSJim Jagielski
186*b1cdbd2cSJim Jagielski import org.mozilla.javascript.tools.shell.ConsoleTextArea;
187*b1cdbd2cSJim Jagielski@@ -178,6 +181,16 @@
188*b1cdbd2cSJim Jagielski      */
189*b1cdbd2cSJim Jagielski     private EventQueue awtEventQueue;
190*b1cdbd2cSJim Jagielski
191*b1cdbd2cSJim Jagielski+    private boolean sourceEditingEnabled = true;
192*b1cdbd2cSJim Jagielski+
193*b1cdbd2cSJim Jagielski+    public boolean isSourceEditingEnabled() {
194*b1cdbd2cSJim Jagielski+        return sourceEditingEnabled;
195*b1cdbd2cSJim Jagielski+    }
196*b1cdbd2cSJim Jagielski+
197*b1cdbd2cSJim Jagielski+    public void setSourceEditingEnabled(boolean b) {
198*b1cdbd2cSJim Jagielski+        sourceEditingEnabled = b;
199*b1cdbd2cSJim Jagielski+    }
200*b1cdbd2cSJim Jagielski+
201*b1cdbd2cSJim Jagielski     /**
202*b1cdbd2cSJim Jagielski      * Creates a new SwingGui.
203*b1cdbd2cSJim Jagielski      */
204*b1cdbd2cSJim Jagielski@@ -218,13 +231,13 @@
205*b1cdbd2cSJim Jagielski         super.setVisible(b);
206*b1cdbd2cSJim Jagielski         if (b) {
207*b1cdbd2cSJim Jagielski             // this needs to be done after the window is visible
208*b1cdbd2cSJim Jagielski-            console.consoleTextArea.requestFocus();
209*b1cdbd2cSJim Jagielski+            // console.consoleTextArea.requestFocus();
210*b1cdbd2cSJim Jagielski             context.split.setDividerLocation(0.5);
211*b1cdbd2cSJim Jagielski             try {
212*b1cdbd2cSJim Jagielski-                console.setMaximum(true);
213*b1cdbd2cSJim Jagielski-                console.setSelected(true);
214*b1cdbd2cSJim Jagielski-                console.show();
215*b1cdbd2cSJim Jagielski-                console.consoleTextArea.requestFocus();
216*b1cdbd2cSJim Jagielski+                // console.setMaximum(true);
217*b1cdbd2cSJim Jagielski+                // console.setSelected(true);
218*b1cdbd2cSJim Jagielski+                // console.show();
219*b1cdbd2cSJim Jagielski+                // console.consoleTextArea.requestFocus();
220*b1cdbd2cSJim Jagielski             } catch (Exception exc) {
221*b1cdbd2cSJim Jagielski             }
222*b1cdbd2cSJim Jagielski         }
223*b1cdbd2cSJim Jagielski@@ -320,7 +333,7 @@
224*b1cdbd2cSJim Jagielski         desk = new JDesktopPane();
225*b1cdbd2cSJim Jagielski         desk.setPreferredSize(new Dimension(600, 300));
226*b1cdbd2cSJim Jagielski         desk.setMinimumSize(new Dimension(150, 50));
227*b1cdbd2cSJim Jagielski-        desk.add(console = new JSInternalConsole("JavaScript Console"));
228*b1cdbd2cSJim Jagielski+        // desk.add(console = new JSInternalConsole("JavaScript Console"));
229*b1cdbd2cSJim Jagielski         context = new ContextWindow(this);
230*b1cdbd2cSJim Jagielski         context.setPreferredSize(new Dimension(600, 120));
231*b1cdbd2cSJim Jagielski         context.setMinimumSize(new Dimension(50, 50));
232*b1cdbd2cSJim Jagielski@@ -540,7 +553,7 @@
233*b1cdbd2cSJim Jagielski         if (line != -1) {
234*b1cdbd2cSJim Jagielski             currentWindow = w;
235*b1cdbd2cSJim Jagielski         }
236*b1cdbd2cSJim Jagielski-        menubar.addFile(url);
237*b1cdbd2cSJim Jagielski+        // menubar.addFile(url);
238*b1cdbd2cSJim Jagielski         w.setVisible(true);
239*b1cdbd2cSJim Jagielski
240*b1cdbd2cSJim Jagielski         if (activate) {
241*b1cdbd2cSJim Jagielski@@ -800,9 +813,17 @@
242*b1cdbd2cSJim Jagielski             proxy.alertMessage = alertMessage;
243*b1cdbd2cSJim Jagielski             SwingUtilities.invokeLater(proxy);
244*b1cdbd2cSJim Jagielski         }
245*b1cdbd2cSJim Jagielski+        setSourceEditingEnabled(false);
246*b1cdbd2cSJim Jagielski     }
247*b1cdbd2cSJim Jagielski
248*b1cdbd2cSJim Jagielski     /**
249*b1cdbd2cSJim Jagielski+     * Called when the interrupt loop has been exited.
250*b1cdbd2cSJim Jagielski+     */
251*b1cdbd2cSJim Jagielski+    public void exitInterrupt() {
252*b1cdbd2cSJim Jagielski+        setSourceEditingEnabled(true);
253*b1cdbd2cSJim Jagielski+    }
254*b1cdbd2cSJim Jagielski+
255*b1cdbd2cSJim Jagielski+    /**
256*b1cdbd2cSJim Jagielski      * Returns whether the current thread is the GUI event thread.
257*b1cdbd2cSJim Jagielski      */
258*b1cdbd2cSJim Jagielski     public boolean isGuiEventThread() {
259*b1cdbd2cSJim Jagielski@@ -879,6 +900,14 @@
260*b1cdbd2cSJim Jagielski                     new Thread(proxy).start();
261*b1cdbd2cSJim Jagielski                 }
262*b1cdbd2cSJim Jagielski             }
263*b1cdbd2cSJim Jagielski+        } else if (cmd.equals("Run")) {
264*b1cdbd2cSJim Jagielski+            FileWindow w = (FileWindow)getSelectedFrame();
265*b1cdbd2cSJim Jagielski+            if (w != null)
266*b1cdbd2cSJim Jagielski+                w.load();
267*b1cdbd2cSJim Jagielski+        } else if (cmd.equals("Save")) {
268*b1cdbd2cSJim Jagielski+            FileWindow w = (FileWindow)getSelectedFrame();
269*b1cdbd2cSJim Jagielski+            if (w != null)
270*b1cdbd2cSJim Jagielski+                w.save();
271*b1cdbd2cSJim Jagielski         } else if (cmd.equals("More Windows...")) {
272*b1cdbd2cSJim Jagielski             MoreWindows dlg = new MoreWindows(this, fileWindows,
273*b1cdbd2cSJim Jagielski                                               "Window", "Files");
274*b1cdbd2cSJim Jagielski@@ -972,6 +1001,120 @@
275*b1cdbd2cSJim Jagielski             dim.setReturnValue(returnValue);
276*b1cdbd2cSJim Jagielski         }
277*b1cdbd2cSJim Jagielski     }
278*b1cdbd2cSJim Jagielski+
279*b1cdbd2cSJim Jagielski+    private String getFileName(URL url) {
280*b1cdbd2cSJim Jagielski+        if (url.getProtocol().startsWith("vnd.sun.star."))
281*b1cdbd2cSJim Jagielski+            return url.toString();
282*b1cdbd2cSJim Jagielski+        return url.getPath();
283*b1cdbd2cSJim Jagielski+    }
284*b1cdbd2cSJim Jagielski+
285*b1cdbd2cSJim Jagielski+    public void openFile(URL scriptUrl, Scriptable scope, Runnable closeCallback) {
286*b1cdbd2cSJim Jagielski+        if (scope == null) {
287*b1cdbd2cSJim Jagielski+            MessageDialogWrapper.showMessageDialog(this,
288*b1cdbd2cSJim Jagielski+                "Can't compile scripts: no scope available",
289*b1cdbd2cSJim Jagielski+                "Open", JOptionPane.ERROR_MESSAGE);
290*b1cdbd2cSJim Jagielski+        } else {
291*b1cdbd2cSJim Jagielski+            if (scriptUrl != null) {
292*b1cdbd2cSJim Jagielski+                try
293*b1cdbd2cSJim Jagielski+                {
294*b1cdbd2cSJim Jagielski+                    InputStreamReader reader = new InputStreamReader(scriptUrl.openStream());
295*b1cdbd2cSJim Jagielski+                    String fileName = getFileName(scriptUrl);
296*b1cdbd2cSJim Jagielski+                    officeScripts.addScript( fileName, scriptUrl, scope, closeCallback  );
297*b1cdbd2cSJim Jagielski+                    RunProxy proxy = new RunProxy(this, RunProxy.OPEN_FILE);
298*b1cdbd2cSJim Jagielski+                    proxy.fileName = fileName;
299*b1cdbd2cSJim Jagielski+                    proxy.text = Kit.readReader(reader);
300*b1cdbd2cSJim Jagielski+                    new Thread(proxy).start();
301*b1cdbd2cSJim Jagielski+                }
302*b1cdbd2cSJim Jagielski+                catch ( IOException e )
303*b1cdbd2cSJim Jagielski+                {
304*b1cdbd2cSJim Jagielski+                    MessageDialogWrapper.showMessageDialog(this,
305*b1cdbd2cSJim Jagielski+                        "Can't open stream for script: " + e.toString(),
306*b1cdbd2cSJim Jagielski+                        "Open", JOptionPane.ERROR_MESSAGE);
307*b1cdbd2cSJim Jagielski+                }
308*b1cdbd2cSJim Jagielski+            }
309*b1cdbd2cSJim Jagielski+        }
310*b1cdbd2cSJim Jagielski+        split1.setDividerLocation(1.0);
311*b1cdbd2cSJim Jagielski+    }
312*b1cdbd2cSJim Jagielski+
313*b1cdbd2cSJim Jagielski+    // patched Office specific interface
314*b1cdbd2cSJim Jagielski+    OfficeScriptInfo officeScripts = new OfficeScriptInfo();
315*b1cdbd2cSJim Jagielski+
316*b1cdbd2cSJim Jagielski+    void removeScript(String url) {
317*b1cdbd2cSJim Jagielski+        officeScripts.deleteScript(url);
318*b1cdbd2cSJim Jagielski+    }
319*b1cdbd2cSJim Jagielski+
320*b1cdbd2cSJim Jagielski+    public void showScriptWindow(URL url) {
321*b1cdbd2cSJim Jagielski+        String key = getFileName(url);
322*b1cdbd2cSJim Jagielski+        FileWindow w = (FileWindow)getFileWindow(key);
323*b1cdbd2cSJim Jagielski+        if (w != null)
324*b1cdbd2cSJim Jagielski+        {
325*b1cdbd2cSJim Jagielski+            desk.getDesktopManager().deiconifyFrame(w);
326*b1cdbd2cSJim Jagielski+            desk.getDesktopManager().activateFrame(w);
327*b1cdbd2cSJim Jagielski+            w.show();
328*b1cdbd2cSJim Jagielski+            w.toFront();
329*b1cdbd2cSJim Jagielski+        }
330*b1cdbd2cSJim Jagielski+    }
331*b1cdbd2cSJim Jagielski+
332*b1cdbd2cSJim Jagielski+    public void highlighLineInScriptWindow(URL url, int lineNum) {
333*b1cdbd2cSJim Jagielski+        String key = getFileName(url);
334*b1cdbd2cSJim Jagielski+        FileWindow w = (FileWindow)getFileWindow(key);
335*b1cdbd2cSJim Jagielski+        if (w != null)
336*b1cdbd2cSJim Jagielski+        {
337*b1cdbd2cSJim Jagielski+            showFileWindow(key, lineNum);
338*b1cdbd2cSJim Jagielski+        }
339*b1cdbd2cSJim Jagielski+    }
340*b1cdbd2cSJim Jagielski+
341*b1cdbd2cSJim Jagielski+    public Object runScriptWindow(URL scriptUrl) throws Exception
342*b1cdbd2cSJim Jagielski+    {
343*b1cdbd2cSJim Jagielski+        String key = getFileName(scriptUrl);
344*b1cdbd2cSJim Jagielski+        FileWindow w = (FileWindow)getFileWindow(key);
345*b1cdbd2cSJim Jagielski+        Object result = null;
346*b1cdbd2cSJim Jagielski+        w.toFront();
347*b1cdbd2cSJim Jagielski+        if (w != null)
348*b1cdbd2cSJim Jagielski+        {
349*b1cdbd2cSJim Jagielski+            Scriptable scope = officeScripts.getScriptScope(key);
350*b1cdbd2cSJim Jagielski+            if (scope == null)
351*b1cdbd2cSJim Jagielski+            {
352*b1cdbd2cSJim Jagielski+                MessageDialogWrapper.showMessageDialog(this, "Can't load scripts: no scope available", "Run", JOptionPane.ERROR_MESSAGE);
353*b1cdbd2cSJim Jagielski+            }
354*b1cdbd2cSJim Jagielski+            else
355*b1cdbd2cSJim Jagielski+            {
356*b1cdbd2cSJim Jagielski+                String url = w.getUrl();
357*b1cdbd2cSJim Jagielski+                if (url != null)
358*b1cdbd2cSJim Jagielski+                {
359*b1cdbd2cSJim Jagielski+                    if (officeScripts.isScriptRunning(key))
360*b1cdbd2cSJim Jagielski+                    {
361*b1cdbd2cSJim Jagielski+                        return result;
362*b1cdbd2cSJim Jagielski+                    }
363*b1cdbd2cSJim Jagielski+                    officeScripts.setScriptRunning(key, true);
364*b1cdbd2cSJim Jagielski+                    try {
365*b1cdbd2cSJim Jagielski+                        result = dim.evalScriptWithReturn(url, w.textArea.getText(), scope);
366*b1cdbd2cSJim Jagielski+                    } catch (Exception exc) {
367*b1cdbd2cSJim Jagielski+                        exc.printStackTrace();
368*b1cdbd2cSJim Jagielski+                        throw exc;
369*b1cdbd2cSJim Jagielski+                    } finally {
370*b1cdbd2cSJim Jagielski+                        officeScripts.setScriptRunning(key, false);
371*b1cdbd2cSJim Jagielski+                    }
372*b1cdbd2cSJim Jagielski+                }
373*b1cdbd2cSJim Jagielski+            }
374*b1cdbd2cSJim Jagielski+        }
375*b1cdbd2cSJim Jagielski+        return result;
376*b1cdbd2cSJim Jagielski+    }
377*b1cdbd2cSJim Jagielski+
378*b1cdbd2cSJim Jagielski+    public boolean isModified(URL url)
379*b1cdbd2cSJim Jagielski+    {
380*b1cdbd2cSJim Jagielski+        String key = getFileName(url);
381*b1cdbd2cSJim Jagielski+        FileWindow w = (FileWindow)getFileWindow(key);
382*b1cdbd2cSJim Jagielski+        return w.isModified();
383*b1cdbd2cSJim Jagielski+    }
384*b1cdbd2cSJim Jagielski+
385*b1cdbd2cSJim Jagielski+    public String getText(URL url)
386*b1cdbd2cSJim Jagielski+    {
387*b1cdbd2cSJim Jagielski+        String key = getFileName(url);
388*b1cdbd2cSJim Jagielski+        FileWindow w = (FileWindow)getFileWindow(key);
389*b1cdbd2cSJim Jagielski+        return w.getText();
390*b1cdbd2cSJim Jagielski+    }
391*b1cdbd2cSJim Jagielski+
392*b1cdbd2cSJim Jagielski }
393*b1cdbd2cSJim Jagielski
394*b1cdbd2cSJim Jagielski /**
395*b1cdbd2cSJim Jagielski@@ -1590,7 +1733,9 @@
396*b1cdbd2cSJim Jagielski         case KeyEvent.VK_ENTER:
397*b1cdbd2cSJim Jagielski         case KeyEvent.VK_DELETE:
398*b1cdbd2cSJim Jagielski         case KeyEvent.VK_TAB:
399*b1cdbd2cSJim Jagielski-            e.consume();
400*b1cdbd2cSJim Jagielski+            if (! w.isEditable()) {
401*b1cdbd2cSJim Jagielski+                e.consume();
402*b1cdbd2cSJim Jagielski+            }
403*b1cdbd2cSJim Jagielski             break;
404*b1cdbd2cSJim Jagielski         }
405*b1cdbd2cSJim Jagielski     }
406*b1cdbd2cSJim Jagielski@@ -1599,14 +1744,18 @@
407*b1cdbd2cSJim Jagielski      * Called when a key is typed.
408*b1cdbd2cSJim Jagielski      */
409*b1cdbd2cSJim Jagielski     public void keyTyped(KeyEvent e) {
410*b1cdbd2cSJim Jagielski-        e.consume();
411*b1cdbd2cSJim Jagielski+        if (! w.isEditable()) {
412*b1cdbd2cSJim Jagielski+            e.consume();
413*b1cdbd2cSJim Jagielski+        }
414*b1cdbd2cSJim Jagielski     }
415*b1cdbd2cSJim Jagielski
416*b1cdbd2cSJim Jagielski     /**
417*b1cdbd2cSJim Jagielski      * Called when a key is released.
418*b1cdbd2cSJim Jagielski      */
419*b1cdbd2cSJim Jagielski     public void keyReleased(KeyEvent e) {
420*b1cdbd2cSJim Jagielski-        e.consume();
421*b1cdbd2cSJim Jagielski+        if (! w.isEditable()) {
422*b1cdbd2cSJim Jagielski+            e.consume();
423*b1cdbd2cSJim Jagielski+        }
424*b1cdbd2cSJim Jagielski     }
425*b1cdbd2cSJim Jagielski }
426*b1cdbd2cSJim Jagielski
427*b1cdbd2cSJim Jagielski@@ -2089,7 +2238,7 @@
428*b1cdbd2cSJim Jagielski /**
429*b1cdbd2cSJim Jagielski  * An internal frame for script files.
430*b1cdbd2cSJim Jagielski  */
431*b1cdbd2cSJim Jagielski-class FileWindow extends JInternalFrame implements ActionListener {
432*b1cdbd2cSJim Jagielski+class FileWindow extends JInternalFrame implements ActionListener, DocumentListener {
433*b1cdbd2cSJim Jagielski
434*b1cdbd2cSJim Jagielski     /**
435*b1cdbd2cSJim Jagielski      * Serializable magic number.
436*b1cdbd2cSJim Jagielski@@ -2126,6 +2275,7 @@
437*b1cdbd2cSJim Jagielski      */
438*b1cdbd2cSJim Jagielski     int currentPos;
439*b1cdbd2cSJim Jagielski
440*b1cdbd2cSJim Jagielski+    boolean isModified = false;
441*b1cdbd2cSJim Jagielski     /**
442*b1cdbd2cSJim Jagielski      * Loads the file.
443*b1cdbd2cSJim Jagielski      */
444*b1cdbd2cSJim Jagielski@@ -2134,11 +2284,62 @@
445*b1cdbd2cSJim Jagielski         if (url != null) {
446*b1cdbd2cSJim Jagielski             RunProxy proxy = new RunProxy(debugGui, RunProxy.LOAD_FILE);
447*b1cdbd2cSJim Jagielski             proxy.fileName = url;
448*b1cdbd2cSJim Jagielski-            proxy.text = sourceInfo.source();
449*b1cdbd2cSJim Jagielski+            proxy.text = textArea.getText();
450*b1cdbd2cSJim Jagielski+            proxy.scope = debugGui.officeScripts.getScriptScope(url);
451*b1cdbd2cSJim Jagielski             new Thread(proxy).start();
452*b1cdbd2cSJim Jagielski         }
453*b1cdbd2cSJim Jagielski     }
454*b1cdbd2cSJim Jagielski
455*b1cdbd2cSJim Jagielski+    void save() {
456*b1cdbd2cSJim Jagielski+        String url = getUrl();
457*b1cdbd2cSJim Jagielski+        if (url != null) {
458*b1cdbd2cSJim Jagielski+            OutputStream os = null;
459*b1cdbd2cSJim Jagielski+            try {
460*b1cdbd2cSJim Jagielski+                if (url.startsWith("vnd.sun.star"))
461*b1cdbd2cSJim Jagielski+                {
462*b1cdbd2cSJim Jagielski+                    URL scriptUrl = debugGui.officeScripts.getScriptUrl(url);
463*b1cdbd2cSJim Jagielski+                    if ( scriptUrl == null )
464*b1cdbd2cSJim Jagielski+                    {
465*b1cdbd2cSJim Jagielski+                        throw new IOException("Can't optain stream for " + url);
466*b1cdbd2cSJim Jagielski+                    }
467*b1cdbd2cSJim Jagielski+                    os = scriptUrl.openConnection().getOutputStream();
468*b1cdbd2cSJim Jagielski+                }
469*b1cdbd2cSJim Jagielski+                else
470*b1cdbd2cSJim Jagielski+                {
471*b1cdbd2cSJim Jagielski+                   os = new FileOutputStream(url);
472*b1cdbd2cSJim Jagielski+                }
473*b1cdbd2cSJim Jagielski+                String s = textArea.getText();
474*b1cdbd2cSJim Jagielski+                os.write(s.getBytes(), 0, s.length());
475*b1cdbd2cSJim Jagielski+
476*b1cdbd2cSJim Jagielski+                this.isModified = false;
477*b1cdbd2cSJim Jagielski+            } catch (IOException ioe) {
478*b1cdbd2cSJim Jagielski+                MessageDialogWrapper.showMessageDialog(this,
479*b1cdbd2cSJim Jagielski+                    "Error saving file: " + ioe.getMessage(),
480*b1cdbd2cSJim Jagielski+                    "Error", JOptionPane.ERROR_MESSAGE);
481*b1cdbd2cSJim Jagielski+            }
482*b1cdbd2cSJim Jagielski+            finally
483*b1cdbd2cSJim Jagielski+            {
484*b1cdbd2cSJim Jagielski+                if ( os != null )
485*b1cdbd2cSJim Jagielski+                {
486*b1cdbd2cSJim Jagielski+                    try
487*b1cdbd2cSJim Jagielski+                    {
488*b1cdbd2cSJim Jagielski+                        os.close();
489*b1cdbd2cSJim Jagielski+                        os = null;
490*b1cdbd2cSJim Jagielski+                    }
491*b1cdbd2cSJim Jagielski+                    catch( IOException ioe )
492*b1cdbd2cSJim Jagielski+                    {
493*b1cdbd2cSJim Jagielski+                        System.err.println("Error closing stream: " + ioe.getMessage() );
494*b1cdbd2cSJim Jagielski+                        ioe.printStackTrace();
495*b1cdbd2cSJim Jagielski+                    }
496*b1cdbd2cSJim Jagielski+                }
497*b1cdbd2cSJim Jagielski+            }
498*b1cdbd2cSJim Jagielski+        }
499*b1cdbd2cSJim Jagielski+    }
500*b1cdbd2cSJim Jagielski+
501*b1cdbd2cSJim Jagielski+    public boolean isEditable() {
502*b1cdbd2cSJim Jagielski+        return debugGui.isSourceEditingEnabled();
503*b1cdbd2cSJim Jagielski+    }
504*b1cdbd2cSJim Jagielski+
505*b1cdbd2cSJim Jagielski     /**
506*b1cdbd2cSJim Jagielski      * Returns the offset position for the given line.
507*b1cdbd2cSJim Jagielski      */
508*b1cdbd2cSJim Jagielski@@ -2214,7 +2415,16 @@
509*b1cdbd2cSJim Jagielski         pack();
510*b1cdbd2cSJim Jagielski         updateText(sourceInfo);
511*b1cdbd2cSJim Jagielski         textArea.select(0);
512*b1cdbd2cSJim Jagielski+        addInternalFrameListener( new InternalFrameAdapter() {
513*b1cdbd2cSJim Jagielski+            public void internalFrameClosed(InternalFrameEvent e) {
514*b1cdbd2cSJim Jagielski+                getDebugGui().removeScript( getUrl() );
515*b1cdbd2cSJim Jagielski+            }
516*b1cdbd2cSJim Jagielski+        } );
517*b1cdbd2cSJim Jagielski     }
518*b1cdbd2cSJim Jagielski+
519*b1cdbd2cSJim Jagielski+    public SwingGui getDebugGui() {
520*b1cdbd2cSJim Jagielski+        return debugGui;
521*b1cdbd2cSJim Jagielski+    }
522*b1cdbd2cSJim Jagielski
523*b1cdbd2cSJim Jagielski     /**
524*b1cdbd2cSJim Jagielski      * Updates the tool tip contents.
525*b1cdbd2cSJim Jagielski@@ -2249,7 +2459,10 @@
526*b1cdbd2cSJim Jagielski         this.sourceInfo = sourceInfo;
527*b1cdbd2cSJim Jagielski         String newText = sourceInfo.source();
528*b1cdbd2cSJim Jagielski         if (!textArea.getText().equals(newText)) {
529*b1cdbd2cSJim Jagielski+            textArea.getDocument().removeDocumentListener(this);
530*b1cdbd2cSJim Jagielski             textArea.setText(newText);
531*b1cdbd2cSJim Jagielski+            this.isModified = false;
532*b1cdbd2cSJim Jagielski+            textArea.getDocument().addDocumentListener(this);
533*b1cdbd2cSJim Jagielski             int pos = 0;
534*b1cdbd2cSJim Jagielski             if (currentPos != -1) {
535*b1cdbd2cSJim Jagielski                 pos = currentPos;
536*b1cdbd2cSJim Jagielski@@ -2260,6 +2473,31 @@
537*b1cdbd2cSJim Jagielski         fileHeader.repaint();
538*b1cdbd2cSJim Jagielski     }
539*b1cdbd2cSJim Jagielski
540*b1cdbd2cSJim Jagielski+    /* Implementation of DocumentListener interface */
541*b1cdbd2cSJim Jagielski+    public void insertUpdate(DocumentEvent e) {
542*b1cdbd2cSJim Jagielski+        doChanged(e);
543*b1cdbd2cSJim Jagielski+    }
544*b1cdbd2cSJim Jagielski+
545*b1cdbd2cSJim Jagielski+    public void removeUpdate(DocumentEvent e) {
546*b1cdbd2cSJim Jagielski+        doChanged(e);
547*b1cdbd2cSJim Jagielski+    }
548*b1cdbd2cSJim Jagielski+
549*b1cdbd2cSJim Jagielski+    public void changedUpdate(DocumentEvent e) {
550*b1cdbd2cSJim Jagielski+        doChanged(e);
551*b1cdbd2cSJim Jagielski+    }
552*b1cdbd2cSJim Jagielski+
553*b1cdbd2cSJim Jagielski+    public void doChanged(DocumentEvent e) {
554*b1cdbd2cSJim Jagielski+        this.isModified = true;
555*b1cdbd2cSJim Jagielski+    }
556*b1cdbd2cSJim Jagielski+
557*b1cdbd2cSJim Jagielski+    public boolean isModified() {
558*b1cdbd2cSJim Jagielski+        return this.isModified;
559*b1cdbd2cSJim Jagielski+    }
560*b1cdbd2cSJim Jagielski+
561*b1cdbd2cSJim Jagielski+    public String getText() {
562*b1cdbd2cSJim Jagielski+        return textArea.getText();
563*b1cdbd2cSJim Jagielski+    }
564*b1cdbd2cSJim Jagielski+
565*b1cdbd2cSJim Jagielski     /**
566*b1cdbd2cSJim Jagielski      * Sets the cursor position.
567*b1cdbd2cSJim Jagielski      */
568*b1cdbd2cSJim Jagielski@@ -2295,11 +2533,11 @@
569*b1cdbd2cSJim Jagielski     public void actionPerformed(ActionEvent e) {
570*b1cdbd2cSJim Jagielski         String cmd = e.getActionCommand();
571*b1cdbd2cSJim Jagielski         if (cmd.equals("Cut")) {
572*b1cdbd2cSJim Jagielski-            // textArea.cut();
573*b1cdbd2cSJim Jagielski+             textArea.cut();
574*b1cdbd2cSJim Jagielski         } else if (cmd.equals("Copy")) {
575*b1cdbd2cSJim Jagielski             textArea.copy();
576*b1cdbd2cSJim Jagielski         } else if (cmd.equals("Paste")) {
577*b1cdbd2cSJim Jagielski-            // textArea.paste();
578*b1cdbd2cSJim Jagielski+             textArea.paste();
579*b1cdbd2cSJim Jagielski         }
580*b1cdbd2cSJim Jagielski     }
581*b1cdbd2cSJim Jagielski }
582*b1cdbd2cSJim Jagielski@@ -2920,7 +3158,7 @@
583*b1cdbd2cSJim Jagielski      */
584*b1cdbd2cSJim Jagielski     public ContextWindow(final SwingGui debugGui) {
585*b1cdbd2cSJim Jagielski         this.debugGui = debugGui;
586*b1cdbd2cSJim Jagielski-        enabled = false;
587*b1cdbd2cSJim Jagielski+        enabled = true;
588*b1cdbd2cSJim Jagielski         JPanel left = new JPanel();
589*b1cdbd2cSJim Jagielski         JToolBar t1 = new JToolBar();
590*b1cdbd2cSJim Jagielski         t1.setName("Variables");
591*b1cdbd2cSJim Jagielski@@ -3161,6 +3399,10 @@
592*b1cdbd2cSJim Jagielski     public void enableUpdate() {
593*b1cdbd2cSJim Jagielski         enabled = true;
594*b1cdbd2cSJim Jagielski     }
595*b1cdbd2cSJim Jagielski+
596*b1cdbd2cSJim Jagielski+    public boolean isEnabled() {
597*b1cdbd2cSJim Jagielski+        return enabled;
598*b1cdbd2cSJim Jagielski+    }
599*b1cdbd2cSJim Jagielski
600*b1cdbd2cSJim Jagielski     // ActionListener
601*b1cdbd2cSJim Jagielski
602*b1cdbd2cSJim Jagielski@@ -3249,8 +3491,10 @@
603*b1cdbd2cSJim Jagielski     Menubar(SwingGui debugGui) {
604*b1cdbd2cSJim Jagielski         super();
605*b1cdbd2cSJim Jagielski         this.debugGui = debugGui;
606*b1cdbd2cSJim Jagielski-        String[] fileItems  = {"Open...", "Run...", "", "Exit"};
607*b1cdbd2cSJim Jagielski-        String[] fileCmds  = {"Open", "Load", "", "Exit"};
608*b1cdbd2cSJim Jagielski+        // String[] fileItems  = {"Open...", "Run...", "", "Exit"};
609*b1cdbd2cSJim Jagielski+        // String[] fileCmds  = {"Open", "Load", "", "Exit"};
610*b1cdbd2cSJim Jagielski+        String[] fileItems  = {"Run", "Save", "", "Exit"};
611*b1cdbd2cSJim Jagielski+        String[] fileCmds  = {"Run", "Save", "", "Exit"};
612*b1cdbd2cSJim Jagielski         char[] fileShortCuts = {'0', 'N', 0, 'X'};
613*b1cdbd2cSJim Jagielski         int[] fileAccelerators = {KeyEvent.VK_O,
614*b1cdbd2cSJim Jagielski                                   KeyEvent.VK_N,
615*b1cdbd2cSJim Jagielski@@ -3299,6 +3543,8 @@
616*b1cdbd2cSJim Jagielski                                            editShortCuts[i]);
617*b1cdbd2cSJim Jagielski             item.addActionListener(this);
618*b1cdbd2cSJim Jagielski             editMenu.add(item);
619*b1cdbd2cSJim Jagielski+            if (i < 3)
620*b1cdbd2cSJim Jagielski+                runOnlyItems.add(item);
621*b1cdbd2cSJim Jagielski         }
622*b1cdbd2cSJim Jagielski         for (int i = 0; i < plafItems.length; ++i) {
623*b1cdbd2cSJim Jagielski             JMenuItem item = new JMenuItem(plafItems[i],
624*b1cdbd2cSJim Jagielski@@ -3348,9 +3594,9 @@
625*b1cdbd2cSJim Jagielski         item.addActionListener(this);
626*b1cdbd2cSJim Jagielski         windowMenu.add(item = new JMenuItem("Tile", 'T'));
627*b1cdbd2cSJim Jagielski         item.addActionListener(this);
628*b1cdbd2cSJim Jagielski-        windowMenu.addSeparator();
629*b1cdbd2cSJim Jagielski-        windowMenu.add(item = new JMenuItem("Console", 'C'));
630*b1cdbd2cSJim Jagielski-        item.addActionListener(this);
631*b1cdbd2cSJim Jagielski+        // windowMenu.addSeparator();
632*b1cdbd2cSJim Jagielski+        // windowMenu.add(item = new JMenuItem("Console", 'C'));
633*b1cdbd2cSJim Jagielski+        // item.addActionListener(this);
634*b1cdbd2cSJim Jagielski         add(windowMenu);
635*b1cdbd2cSJim Jagielski
636*b1cdbd2cSJim Jagielski         updateEnabled(false);
637*b1cdbd2cSJim Jagielski@@ -3530,6 +3776,11 @@
638*b1cdbd2cSJim Jagielski      * interruption, if any.
639*b1cdbd2cSJim Jagielski      */
640*b1cdbd2cSJim Jagielski     String alertMessage;
641*b1cdbd2cSJim Jagielski+
642*b1cdbd2cSJim Jagielski+    /**
643*b1cdbd2cSJim Jagielski+     * The arguments for evaluation.
644*b1cdbd2cSJim Jagielski+     */
645*b1cdbd2cSJim Jagielski+    Scriptable scope;
646*b1cdbd2cSJim Jagielski
647*b1cdbd2cSJim Jagielski     /**
648*b1cdbd2cSJim Jagielski      * Creates a new RunProxy.
649*b1cdbd2cSJim Jagielski@@ -3556,7 +3807,10 @@
650*b1cdbd2cSJim Jagielski
651*b1cdbd2cSJim Jagielski           case LOAD_FILE:
652*b1cdbd2cSJim Jagielski             try {
653*b1cdbd2cSJim Jagielski-                debugGui.dim.evalScript(fileName, text);
654*b1cdbd2cSJim Jagielski+                if (scope != null)
655*b1cdbd2cSJim Jagielski+                    debugGui.dim.evalScriptWithReturn(fileName, text, scope);
656*b1cdbd2cSJim Jagielski+                else
657*b1cdbd2cSJim Jagielski+                    debugGui.dim.evalScript(fileName, text);
658*b1cdbd2cSJim Jagielski             } catch (RuntimeException ex) {
659*b1cdbd2cSJim Jagielski                 MessageDialogWrapper.showMessageDialog(
660*b1cdbd2cSJim Jagielski                     debugGui, ex.getMessage(), "Run error for "+fileName,
661*b1cdbd2cSJim JagielskiIndex: toolsrc/org/mozilla/javascript/tools/debugger/OfficeScriptInfo.java
662*b1cdbd2cSJim Jagielski===================================================================
663*b1cdbd2cSJim Jagielski--- toolsrc/org/mozilla/javascript/tools/debugger/OfficeScriptInfo.java	(revision 2)
664*b1cdbd2cSJim Jagielski+++ misc/build/rhino1_7R3/toolsrc/org/mozilla/javascript/tools/debugger/OfficeScriptInfo.java	(working copy)
665*b1cdbd2cSJim Jagielski@@ -1 +1,124 @@
666*b1cdbd2cSJim Jagielski-dummy
667*b1cdbd2cSJim Jagielski+/**************************************************************
668*b1cdbd2cSJim Jagielski+ *
669*b1cdbd2cSJim Jagielski+ * Licensed to the Apache Software Foundation (ASF) under one
670*b1cdbd2cSJim Jagielski+ * or more contributor license agreements.  See the NOTICE file
671*b1cdbd2cSJim Jagielski+ * distributed with this work for additional information
672*b1cdbd2cSJim Jagielski+ * regarding copyright ownership.  The ASF licenses this file
673*b1cdbd2cSJim Jagielski+ * to you under the Apache License, Version 2.0 (the
674*b1cdbd2cSJim Jagielski+ * "License"); you may not use this file except in compliance
675*b1cdbd2cSJim Jagielski+ * with the License.  You may obtain a copy of the License at
676*b1cdbd2cSJim Jagielski+ *
677*b1cdbd2cSJim Jagielski+ *   http://www.apache.org/licenses/LICENSE-2.0
678*b1cdbd2cSJim Jagielski+ *
679*b1cdbd2cSJim Jagielski+ * Unless required by applicable law or agreed to in writing,
680*b1cdbd2cSJim Jagielski+ * software distributed under the License is distributed on an
681*b1cdbd2cSJim Jagielski+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
682*b1cdbd2cSJim Jagielski+ * KIND, either express or implied.  See the License for the
683*b1cdbd2cSJim Jagielski+ * specific language governing permissions and limitations
684*b1cdbd2cSJim Jagielski+ * under the License.
685*b1cdbd2cSJim Jagielski+ *
686*b1cdbd2cSJim Jagielski+ *************************************************************/
687*b1cdbd2cSJim Jagielski+
688*b1cdbd2cSJim Jagielski+
689*b1cdbd2cSJim Jagielski+package org.mozilla.javascript.tools.debugger;
690*b1cdbd2cSJim Jagielski+import java.net.URL;
691*b1cdbd2cSJim Jagielski+import java.util.Hashtable;
692*b1cdbd2cSJim Jagielski+import org.mozilla.javascript.Scriptable;
693*b1cdbd2cSJim Jagielski+
694*b1cdbd2cSJim Jagielski+public class OfficeScriptInfo
695*b1cdbd2cSJim Jagielski+{
696*b1cdbd2cSJim Jagielski+    private Hashtable<String, SFScriptInfo> loadedSFScripts = new Hashtable<String, SFScriptInfo>();
697*b1cdbd2cSJim Jagielski+
698*b1cdbd2cSJim Jagielski+    public void addScript( URL url, Scriptable scope, Runnable closeCallback )
699*b1cdbd2cSJim Jagielski+    {
700*b1cdbd2cSJim Jagielski+        addScript( url.toString(), url, scope, closeCallback );
701*b1cdbd2cSJim Jagielski+    }
702*b1cdbd2cSJim Jagielski+
703*b1cdbd2cSJim Jagielski+    public void addScript( String key, URL url, Scriptable scope, Runnable closeCallback )
704*b1cdbd2cSJim Jagielski+    {
705*b1cdbd2cSJim Jagielski+        SFScriptInfo si = (SFScriptInfo)loadedSFScripts.get( key );
706*b1cdbd2cSJim Jagielski+        if ( si == null )
707*b1cdbd2cSJim Jagielski+        {
708*b1cdbd2cSJim Jagielski+            si = new SFScriptInfo();
709*b1cdbd2cSJim Jagielski+            si.url = url;
710*b1cdbd2cSJim Jagielski+            si.scope = scope;
711*b1cdbd2cSJim Jagielski+            si.closeCallback = closeCallback;
712*b1cdbd2cSJim Jagielski+            loadedSFScripts.put( key, si );
713*b1cdbd2cSJim Jagielski+        }
714*b1cdbd2cSJim Jagielski+    }
715*b1cdbd2cSJim Jagielski+
716*b1cdbd2cSJim Jagielski+    public void deleteScript( String key )
717*b1cdbd2cSJim Jagielski+    {
718*b1cdbd2cSJim Jagielski+        SFScriptInfo info = (SFScriptInfo)loadedSFScripts.remove( key );
719*b1cdbd2cSJim Jagielski+        if ( info != null )
720*b1cdbd2cSJim Jagielski+        {
721*b1cdbd2cSJim Jagielski+            if ( info.closeCallback != null )
722*b1cdbd2cSJim Jagielski+            {
723*b1cdbd2cSJim Jagielski+                System.out.println("** In removeSFScriptInfo  have callback for " + key );
724*b1cdbd2cSJim Jagielski+                info.closeCallback.run(); // really need to do this in seperate thread????
725*b1cdbd2cSJim Jagielski+            }
726*b1cdbd2cSJim Jagielski+        }
727*b1cdbd2cSJim Jagielski+    }
728*b1cdbd2cSJim Jagielski+
729*b1cdbd2cSJim Jagielski+    public Scriptable getScriptScope( String key )
730*b1cdbd2cSJim Jagielski+    {
731*b1cdbd2cSJim Jagielski+        Scriptable result = null;
732*b1cdbd2cSJim Jagielski+        SFScriptInfo info = (SFScriptInfo)loadedSFScripts.get( key );
733*b1cdbd2cSJim Jagielski+        if ( info != null )
734*b1cdbd2cSJim Jagielski+        {
735*b1cdbd2cSJim Jagielski+            result = info.scope;
736*b1cdbd2cSJim Jagielski+        }
737*b1cdbd2cSJim Jagielski+        return result;
738*b1cdbd2cSJim Jagielski+    }
739*b1cdbd2cSJim Jagielski+
740*b1cdbd2cSJim Jagielski+    public URL getScriptUrl( String key )
741*b1cdbd2cSJim Jagielski+    {
742*b1cdbd2cSJim Jagielski+        URL result = null;
743*b1cdbd2cSJim Jagielski+        SFScriptInfo info = (SFScriptInfo)loadedSFScripts.get( key );
744*b1cdbd2cSJim Jagielski+        if ( info != null )
745*b1cdbd2cSJim Jagielski+        {
746*b1cdbd2cSJim Jagielski+            result = info.url;
747*b1cdbd2cSJim Jagielski+        }
748*b1cdbd2cSJim Jagielski+        return result;
749*b1cdbd2cSJim Jagielski+    }
750*b1cdbd2cSJim Jagielski+    public boolean hasScript( String key )
751*b1cdbd2cSJim Jagielski+    {
752*b1cdbd2cSJim Jagielski+        boolean result = true;
753*b1cdbd2cSJim Jagielski+        SFScriptInfo info = (SFScriptInfo)loadedSFScripts.get( key );
754*b1cdbd2cSJim Jagielski+        if ( info == null )
755*b1cdbd2cSJim Jagielski+        {
756*b1cdbd2cSJim Jagielski+            result = false;
757*b1cdbd2cSJim Jagielski+        }
758*b1cdbd2cSJim Jagielski+        return result;
759*b1cdbd2cSJim Jagielski+    }
760*b1cdbd2cSJim Jagielski+
761*b1cdbd2cSJim Jagielski+    public void setScriptRunning( String key, boolean running )
762*b1cdbd2cSJim Jagielski+    {
763*b1cdbd2cSJim Jagielski+        SFScriptInfo info = (SFScriptInfo)loadedSFScripts.get( key );
764*b1cdbd2cSJim Jagielski+        if ( info != null )
765*b1cdbd2cSJim Jagielski+        {
766*b1cdbd2cSJim Jagielski+            info.isExecuting = running;
767*b1cdbd2cSJim Jagielski+        }
768*b1cdbd2cSJim Jagielski+    }
769*b1cdbd2cSJim Jagielski+
770*b1cdbd2cSJim Jagielski+    public boolean isScriptRunning( String key )
771*b1cdbd2cSJim Jagielski+    {
772*b1cdbd2cSJim Jagielski+        boolean result = false;
773*b1cdbd2cSJim Jagielski+        SFScriptInfo info = (SFScriptInfo)loadedSFScripts.get( key );
774*b1cdbd2cSJim Jagielski+        if ( info != null )
775*b1cdbd2cSJim Jagielski+        {
776*b1cdbd2cSJim Jagielski+            result = info.isExecuting;
777*b1cdbd2cSJim Jagielski+        }
778*b1cdbd2cSJim Jagielski+        return result;
779*b1cdbd2cSJim Jagielski+    }
780*b1cdbd2cSJim Jagielski+
781*b1cdbd2cSJim Jagielski+
782*b1cdbd2cSJim Jagielski+
783*b1cdbd2cSJim Jagielski+    class SFScriptInfo
784*b1cdbd2cSJim Jagielski+    {
785*b1cdbd2cSJim Jagielski+        Scriptable scope;
786*b1cdbd2cSJim Jagielski+        boolean isExecuting;
787*b1cdbd2cSJim Jagielski+        URL url;
788*b1cdbd2cSJim Jagielski+        Runnable closeCallback;
789*b1cdbd2cSJim Jagielski+    }
790*b1cdbd2cSJim Jagielski+}
791*b1cdbd2cSJim JagielskiIndex: toolsrc/build.xml
792*b1cdbd2cSJim Jagielski===================================================================
793*b1cdbd2cSJim Jagielski--- toolsrc/build.xml	(revision 1)
794*b1cdbd2cSJim Jagielski+++ misc/build/rhino1_7R3/toolsrc/build.xml	(working copy)
795*b1cdbd2cSJim Jagielski@@ -40,6 +40,24 @@
796*b1cdbd2cSJim Jagielski -->
797*b1cdbd2cSJim Jagielski <project name="toolsrc" default="compile" basedir="..">
798*b1cdbd2cSJim Jagielski
799*b1cdbd2cSJim Jagielski+  <condition property="boot_refID" value="macPath" else="nonMacPath">
800*b1cdbd2cSJim Jagielski+    <and>
801*b1cdbd2cSJim Jagielski+      <os family="mac"/>
802*b1cdbd2cSJim Jagielski+      <os family="unix"/>
803*b1cdbd2cSJim Jagielski+    </and>
804*b1cdbd2cSJim Jagielski+  </condition>
805*b1cdbd2cSJim Jagielski+  <path id="macPath" location="${java.home}/../Classes/classes.jar"/>
806*b1cdbd2cSJim Jagielski+  <!-- rhino.jar from OpenJDK breaks build -->
807*b1cdbd2cSJim Jagielski+  <path id="nonMacPath">
808*b1cdbd2cSJim Jagielski+    <fileset dir="${java.home}/">
809*b1cdbd2cSJim Jagielski+       <include name="jre/lib/*.jar"/>
810*b1cdbd2cSJim Jagielski+       <include name="lib/*.jar"/>
811*b1cdbd2cSJim Jagielski+       <exclude name="jre/lib/rhino.jar"/>
812*b1cdbd2cSJim Jagielski+       <exclude name="lib/rhino.jar"/>
813*b1cdbd2cSJim Jagielski+     </fileset>
814*b1cdbd2cSJim Jagielski+  </path>
815*b1cdbd2cSJim Jagielski+  <path id="my.bootstrap.classpath" refID="${boot_refID}"/>
816*b1cdbd2cSJim Jagielski+
817*b1cdbd2cSJim Jagielski   <target name="properties">
818*b1cdbd2cSJim Jagielski     <property file="build.properties"/>
819*b1cdbd2cSJim Jagielski   </target>
820*b1cdbd2cSJim JagielskiIndex: src/org/mozilla/javascript/DefiningClassLoader.java
821*b1cdbd2cSJim Jagielski===================================================================
822*b1cdbd2cSJim Jagielski--- src/org/mozilla/javascript/DefiningClassLoader.java	(revision 1)
823*b1cdbd2cSJim Jagielski+++ misc/build/rhino1_7R3/src/org/mozilla/javascript/DefiningClassLoader.java	(working copy)
824*b1cdbd2cSJim Jagielski@@ -39,6 +39,8 @@
825*b1cdbd2cSJim Jagielski
826*b1cdbd2cSJim Jagielski package org.mozilla.javascript;
827*b1cdbd2cSJim Jagielski
828*b1cdbd2cSJim Jagielski+import java.lang.reflect.Method;
829*b1cdbd2cSJim Jagielski+import java.lang.reflect.InvocationTargetException;
830*b1cdbd2cSJim Jagielski /**
831*b1cdbd2cSJim Jagielski  * Load generated classes.
832*b1cdbd2cSJim Jagielski  *
833*b1cdbd2cSJim Jagielski@@ -48,13 +50,33 @@
834*b1cdbd2cSJim Jagielski     implements GeneratedClassLoader
835*b1cdbd2cSJim Jagielski {
836*b1cdbd2cSJim Jagielski     public DefiningClassLoader() {
837*b1cdbd2cSJim Jagielski-        this.parentLoader = getClass().getClassLoader();
838*b1cdbd2cSJim Jagielski+		this.parentLoader = getClass().getClassLoader();
839*b1cdbd2cSJim Jagielski+        init();
840*b1cdbd2cSJim Jagielski     }
841*b1cdbd2cSJim Jagielski
842*b1cdbd2cSJim Jagielski     public DefiningClassLoader(ClassLoader parentLoader) {
843*b1cdbd2cSJim Jagielski-        this.parentLoader = parentLoader;
844*b1cdbd2cSJim Jagielski+		this.parentLoader = parentLoader;
845*b1cdbd2cSJim Jagielski+        init();
846*b1cdbd2cSJim Jagielski     }
847*b1cdbd2cSJim Jagielski
848*b1cdbd2cSJim Jagielski+    private void init() {
849*b1cdbd2cSJim Jagielski+        this.contextLoader = null;
850*b1cdbd2cSJim Jagielski+        if (method_getContextClassLoader != null) {
851*b1cdbd2cSJim Jagielski+            try {
852*b1cdbd2cSJim Jagielski+                this.contextLoader = (ClassLoader)
853*b1cdbd2cSJim Jagielski+                    method_getContextClassLoader.invoke(
854*b1cdbd2cSJim Jagielski+                        Thread.currentThread(),
855*b1cdbd2cSJim Jagielski+                        ScriptRuntime.emptyArgs);
856*b1cdbd2cSJim Jagielski+            } catch (IllegalAccessException ex) {
857*b1cdbd2cSJim Jagielski+            } catch (InvocationTargetException ex) {
858*b1cdbd2cSJim Jagielski+            } catch (SecurityException ex) {
859*b1cdbd2cSJim Jagielski+            }
860*b1cdbd2cSJim Jagielski+            if (this.contextLoader == this.parentLoader) {
861*b1cdbd2cSJim Jagielski+                this.contextLoader = null;
862*b1cdbd2cSJim Jagielski+            }
863*b1cdbd2cSJim Jagielski+        }
864*b1cdbd2cSJim Jagielski+    }
865*b1cdbd2cSJim Jagielski+
866*b1cdbd2cSJim Jagielski     public Class<?> defineClass(String name, byte[] data) {
867*b1cdbd2cSJim Jagielski         // Use our own protection domain for the generated classes.
868*b1cdbd2cSJim Jagielski         // TODO: we might want to use a separate protection domain for classes
869*b1cdbd2cSJim Jagielski@@ -73,10 +95,14 @@
870*b1cdbd2cSJim Jagielski     {
871*b1cdbd2cSJim Jagielski         Class<?> cl = findLoadedClass(name);
872*b1cdbd2cSJim Jagielski         if (cl == null) {
873*b1cdbd2cSJim Jagielski-            if (parentLoader != null) {
874*b1cdbd2cSJim Jagielski-                cl = parentLoader.loadClass(name);
875*b1cdbd2cSJim Jagielski+            if (contextLoader == null) {
876*b1cdbd2cSJim Jagielski+                cl = loadFromParent(name);
877*b1cdbd2cSJim Jagielski             } else {
878*b1cdbd2cSJim Jagielski-                cl = findSystemClass(name);
879*b1cdbd2cSJim Jagielski+                try {
880*b1cdbd2cSJim Jagielski+                    cl = loadFromParent(name);
881*b1cdbd2cSJim Jagielski+                } catch (ClassNotFoundException ex) {
882*b1cdbd2cSJim Jagielski+                    cl = contextLoader.loadClass(name);
883*b1cdbd2cSJim Jagielski+                }
884*b1cdbd2cSJim Jagielski             }
885*b1cdbd2cSJim Jagielski         }
886*b1cdbd2cSJim Jagielski         if (resolve) {
887*b1cdbd2cSJim Jagielski@@ -85,5 +111,36 @@
888*b1cdbd2cSJim Jagielski         return cl;
889*b1cdbd2cSJim Jagielski     }
890*b1cdbd2cSJim Jagielski
891*b1cdbd2cSJim Jagielski+    private Class loadFromParent(String name)
892*b1cdbd2cSJim Jagielski+        throws ClassNotFoundException
893*b1cdbd2cSJim Jagielski+    {
894*b1cdbd2cSJim Jagielski+        if (parentLoader != null) {
895*b1cdbd2cSJim Jagielski+            return parentLoader.loadClass(name);
896*b1cdbd2cSJim Jagielski+        } else {
897*b1cdbd2cSJim Jagielski+            return findSystemClass(name);
898*b1cdbd2cSJim Jagielski+        }
899*b1cdbd2cSJim Jagielski+    }
900*b1cdbd2cSJim Jagielski+
901*b1cdbd2cSJim Jagielski     private final ClassLoader parentLoader;
902*b1cdbd2cSJim Jagielski+
903*b1cdbd2cSJim Jagielski+    private ClassLoader contextLoader;
904*b1cdbd2cSJim Jagielski+
905*b1cdbd2cSJim Jagielski+    // We'd like to use "Thread.getContextClassLoader", but
906*b1cdbd2cSJim Jagielski+    // that's only available on Java2.
907*b1cdbd2cSJim Jagielski+    private static Method method_getContextClassLoader;
908*b1cdbd2cSJim Jagielski+
909*b1cdbd2cSJim Jagielski+    static {
910*b1cdbd2cSJim Jagielski+        try {
911*b1cdbd2cSJim Jagielski+            // Don't use "Thread.class": that performs the lookup
912*b1cdbd2cSJim Jagielski+            // in the class initializer, which doesn't allow us to
913*b1cdbd2cSJim Jagielski+            // catch possible security exceptions.
914*b1cdbd2cSJim Jagielski+            Class threadClass = Class.forName("java.lang.Thread");
915*b1cdbd2cSJim Jagielski+            method_getContextClassLoader =
916*b1cdbd2cSJim Jagielski+                threadClass.getDeclaredMethod("getContextClassLoader",
917*b1cdbd2cSJim Jagielski+                                               new Class[0]);
918*b1cdbd2cSJim Jagielski+        } catch (ClassNotFoundException e) {
919*b1cdbd2cSJim Jagielski+        } catch (NoSuchMethodException e) {
920*b1cdbd2cSJim Jagielski+        } catch (SecurityException e) {
921*b1cdbd2cSJim Jagielski+        }
922*b1cdbd2cSJim Jagielski+    }
923*b1cdbd2cSJim Jagielski }
924