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