diff --git a/processing/app/PdeEditor.java b/processing/app/PdeEditor.java index 1b922dc0e..04c804d32 100644 --- a/processing/app/PdeEditor.java +++ b/processing/app/PdeEditor.java @@ -1096,7 +1096,6 @@ public class PdeEditor extends JFrame public void setSketchModified(boolean what) { header.sketchModified = what; - //header.update(); header.repaint(); sketchModified = what; } @@ -1118,11 +1117,8 @@ public class PdeEditor extends JFrame String prompt = "Save changes to " + sketch.name + "? "; if (checking == DO_QUIT) { - int result = 0; - //if (PdeBase.platform == PdeBase.MACOSX) { - // macosx java kills the app even though cancel might get hit // so the cancel button is (temporarily) left off // this may be treated differently in macosx java 1.4, @@ -1142,16 +1138,16 @@ public class PdeEditor extends JFrame options[0]); // default to save /* - } else { - Object[] options = { "Yes", "No", "Cancel" }; - result = JOptionPane.showOptionDialog(this, - prompt, - "Quit", - JOptionPane.YES_NO_CANCEL_OPTION, - JOptionPane.QUESTION_MESSAGE, - null, - options, - options[2]); + } else { + Object[] options = { "Yes", "No", "Cancel" }; + result = JOptionPane.showOptionDialog(this, + prompt, + "Quit", + JOptionPane.YES_NO_CANCEL_OPTION, + JOptionPane.QUESTION_MESSAGE, + null, + options, + options[2]); */ if (result == JOptionPane.YES_OPTION) { diff --git a/processing/app/PdeRuntime.java b/processing/app/PdeRuntime.java index 6f40e6bbb..be8902df8 100644 --- a/processing/app/PdeRuntime.java +++ b/processing/app/PdeRuntime.java @@ -2,7 +2,7 @@ /* PdeRuntime - runs compiled java applet - Part of the Processing project - http://Proce55ing.net + Part of the Processing project - http://processing.org Except where noted, code is written by Ben Fry and Copyright (c) 2001-03 Massachusetts Institute of Technology @@ -39,39 +39,31 @@ public class PdeRuntime implements PdeMessageConsumer { BApplet applet; PdeException exception; Window window; - PdeEditor editor; PrintStream leechErr; - String className; + //String className; + + PdeEditor editor; + PdeSketch sketch; boolean newMessage; int messageLineCount; Process process; OutputStream processOutput; - boolean externalRuntime; - //String codeFolderPath; - //String externalPaths; - String libraryPath; - String classPath; + + //boolean externalRuntime; + //String libraryPath; + //String classPath; - public PdeRuntime(PdeEditor editor, String className, - boolean externalRuntime, - String classPath, String libraryPath) { - //String codeFolderPath, String externalPaths) { + public PdeRuntime(PdeSketch sketch, PdeEditor editor) { + this.sketch = sketch; this.editor = editor; - this.className = className; - - this.externalRuntime = externalRuntime; - this.classPath = classPath; - this.libraryPath = libraryPath; - //this.codeFolderPath = codeFolderPath; - //this.externalPaths = externalPaths; } - public void start(Point windowLocation, PrintStream leechErr) - throws PdeException { + public void start(Point windowLocation, + PrintStream leechErr) throws PdeException { this.leechErr = new PrintStream(new PdeMessageStream(this)); @@ -82,23 +74,28 @@ public class PdeRuntime implements PdeMessageConsumer { int y1 = parentLoc.y; try { - if (externalRuntime) { + if (sketch.externalRuntime) { + // if there was a saved location (this guy has been run more than + // once) then windowLocation will be set to the last position of + // the sketch window. this will be passed to the BApplet runner + // using something like --external=e30,20 where the e stands for + // exact. otherwise --external=x,y for just the regular positioning. + String location = (windowLocation != null) ? + (BApplet.EXACT_LOCATION + + windowLocation.x + "," + windowLocation.y) : + (x1 + "," + y1); + String command[] = new String[] { "java", - "-Djava.library.path=" + libraryPath, // might be "" + "-Djava.library.path=" + sketch.libraryPath, // might be "" "-cp", - classPath, + sketch.classPath, "BApplet", - BApplet.EXTERNAL_FLAG + ((windowLocation != null) ? - ("e" + - windowLocation.x + "," + - windowLocation.y) : - (x1 + "," + y1)), - className + BApplet.EXTERNAL_FLAG + location, + sketch.mainClassName }; process = Runtime.getRuntime().exec(command); - //new PdeMessageSiphon(process.getInputStream(), this); new SystemOutSiphon(process.getInputStream()); new PdeMessageSiphon(process.getErrorStream(), this); processOutput = process.getOutputStream(); @@ -108,7 +105,6 @@ public class PdeRuntime implements PdeMessageConsumer { applet = (BApplet) c.newInstance(); // replaces setRuntime with BApplet having leechErr [fry] - //applet.setRuntime(this); applet.leechErr = leechErr; // has to be before init @@ -155,7 +151,7 @@ public class PdeRuntime implements PdeMessageConsumer { // toxi_030903: moved keyListener to PdeEditor's presentationWindow } else { - window = new Frame(editor.sketchName); // use ugly windows + window = new Frame(sketch.name); // use ugly windows ((Frame)window).setResizable(false); if (editor.icon != null) { ((Frame)window).setIconImage(editor.icon); @@ -225,8 +221,10 @@ public class PdeRuntime implements PdeMessageConsumer { int minW = PdePreferences.getInteger("run.window.width.minimum"); int minH = PdePreferences.getInteger("run.window.height.minimum"); - int windowW = Math.max(applet.width, minW) + insets.left + insets.right; - int windowH = Math.max(applet.height, minH) + insets.top + insets.bottom; + int windowW = + Math.max(applet.width, minW) + insets.left + insets.right; + int windowH = + Math.max(applet.height, minH) + insets.top + insets.bottom; if (x1 - windowW > 10) { // if it fits to the left of the window window.setBounds(x1 - windowW, y1, windowW, windowH); @@ -246,15 +244,12 @@ public class PdeRuntime implements PdeMessageConsumer { window.setBounds(x1, y1, windowW, windowH); //ww, wh); } - Color windowBgColor = - PdePreferences.getColor("run.window.bgcolor"); - //new Color(102, 102, 102)); + Color windowBgColor = PdePreferences.getColor("run.window.bgcolor"); window.setBackground(windowBgColor); - //window.setBackground(SystemColor.windowBorder); - //window.setBackground(SystemColor.control); applet.setBounds((windowW - applet.width)/2, - insets.top + ((windowH - insets.top - insets.bottom) - + insets.top + ((windowH - + insets.top - insets.bottom) - applet.height)/2, windowW, windowH); } @@ -266,13 +261,6 @@ public class PdeRuntime implements PdeMessageConsumer { window.show(); applet.requestFocus(); // necessary for key events } - //System.out.println("KJC RUNNING"); - - //need to parse this code to give a decent error message - //internal error - //java.lang.NullPointerException - // at ProcessingApplet.colorMode(ProcessingApplet.java:652) - // at Temporary_203_1176.setup(Temporary_203_1176.java:3) } catch (Exception e) { // this will pass through to the first part of message @@ -314,23 +302,7 @@ public class PdeRuntime implements PdeMessageConsumer { //e.printStackTrace(); close(); } - - /* - try { - FileOutputStream fos = new FileOutputStream("die"); - fos.close(); - } catch (Exception e) { - e.printStackTrace(); - } - */ } - - //System.gc(); - //System.out.println("* stopped"); - - //System.out.println("thread count: " + Thread.activeCount()); - //System.out.println(); - //System.out.println(); } @@ -355,13 +327,15 @@ public class PdeRuntime implements PdeMessageConsumer { public void message(String s) { + // this is BApplet sending a message (via System.out.println) + // that signals that the applet has been quit. if (s.indexOf(BApplet.EXTERNAL_QUIT) == 0) { - //close(); - //System.out.println("got proper quit message"); editor.doClose(); return; } + // this is the BApplet sending us a message that the applet + // is being moved to a new window location if (s.indexOf(BApplet.EXTERNAL_MOVE) == 0) { String nums = s.substring(s.indexOf(' ') + 1); int space = nums.indexOf(' '); @@ -375,14 +349,16 @@ public class PdeRuntime implements PdeMessageConsumer { //System.err.println("message " + s.length() + ":" + s); if (s.length() > 2) System.err.println(s); + // this is BApplet sending a message saying "i'm about to spew + // a stack trace because an error occurred during BApplet.run()" if (s.indexOf(BApplet.LEECH_WAKEUP) == 0) { //System.err.println("got wakeup"); newMessage = true; return; // this line ignored } - // if s.length <=2, that probably means that it's just the platform - // line-terminators. ignore it. + // if s.length <=2, ignore it because that probably means + // that it's just the platform line-terminators. if (newMessage && s.length() > 2) { exception = new PdeException(s); // type of java ex //System.out.println("setting ex type to " + s); @@ -392,20 +368,22 @@ public class PdeRuntime implements PdeMessageConsumer { } else { messageLineCount++; + // TODO this is insufficient. need to cycle through the + // different classes that are currently loaded and see if + // there is an error in one of them. + String className = sketch.mainClassName; + int index = s.indexOf(className + ".java"); - //System.out.println("> " + index + " " + s); if (index != -1) { int len = (className + ".java").length(); String lineNumberStr = s.substring(index + len + 1); index = lineNumberStr.indexOf(')'); lineNumberStr = lineNumberStr.substring(0, index); - //System.err.println("error line is: " + lineNumberStr); try { exception.line = Integer.parseInt(lineNumberStr) - 1; //2; - //System.out.println("exception in RUNNING"); editor.error(exception); } catch (NumberFormatException e) { - e.printStackTrace(); + e.printStackTrace(); // a recursive error waiting to happen? } } else if ((index = s.indexOf(className + ".class")) != -1) { // code to check for: diff --git a/processing/app/PdeSketch.java b/processing/app/PdeSketch.java index ecdc57168..6ee15fa81 100644 --- a/processing/app/PdeSketch.java +++ b/processing/app/PdeSketch.java @@ -54,7 +54,7 @@ public class PdeSketch { // all these set each time build() is called boolean externalRuntime; - //String mainClassName; + String mainClassName; String classPath; String libraryPath; @@ -323,7 +323,7 @@ public class PdeSketch { * X. afterwards, some of these steps need a cleanup function */ public void run() throws PdeException { - current.program = textarea.getText(); + current.program = editor.getText(); // TODO record history here //current.history.record(program, PdeHistory.RUN); @@ -359,12 +359,13 @@ public class PdeSketch { "_" + String.valueOf((int) (Math.random() * 10000))); // handle preprocessing the main file's code - String mainClassName = build(TEMP_BUILD_PATH, suggestedClassName); + mainClassName = build(TEMP_BUILD_PATH, suggestedClassName); // externalPaths is magically set by build() // if the compilation worked, run the applet if (mainClassName != null) { + /* if (externalPaths == null) { externalPaths = PdeCompiler.calcClassPath(null) + File.pathSeparator + @@ -375,18 +376,19 @@ public class PdeSketch { PdeCompiler.calcClassPath(null) + File.pathSeparator + externalPaths; } + */ // get a useful folder name for the 'code' folder // so that it can be included in the java.library.path + /* String libraryPath = ""; if (externalCode != null) { libraryPath = externalCode.getCanonicalPath(); } + */ // create a runtime object - runtime = new PdeRuntime(this, className, - externalRuntime, - libraryPath, classPath); + runtime = new PdeRuntime(this, editor); // if programType is ADVANCED // or the code/ folder is not empty -> or just exists (simpler) @@ -409,32 +411,8 @@ public class PdeSketch { } else { // [dmose] throw an exception here? // [fry] iirc the exception will have already been thrown - cleanTempFiles(); //tempBuildPath); + cleanup(); } - - /* - } catch (PdeException e) { - // if it made it as far as creating a Runtime object, - // call its stop method to unwind its thread - if (runtime != null) runtime.stop(); - cleanTempFiles(); //tempBuildPath); - - // printing the stack trace may be overkill since it happens - // even on a simple parse error - //e.printStackTrace(); - - error(e); - - } catch (Exception e) { // something more general happened - e.printStackTrace(); - - // if it made it as far as creating a Runtime object, - // call its stop method to unwind its thread - if (runtime != null) runtime.stop(); - - cleanTempFiles(); //tempBuildPath); - } - */ } @@ -515,7 +493,7 @@ public class PdeSketch { importPackageList = PdeCompiler.magicImports(classPath); libraryPath = codeFolder.getCanonicalPath(); } else { - externalRuntime = (codeCount > 1); // at least for now + externalRuntime = (codeCount > 1); // may still be set true later importPackageList = null; libraryPath = ""; } @@ -526,7 +504,7 @@ public class PdeSketch { // if .pde, run preproc to buildpath // if no class def'd for the pde file, then complain - String mainClassName = null; + String primaryClassName = null; for (int i = 0; i < codeCount; i++) { if (code[i].flavor == JAVA) { @@ -559,7 +537,7 @@ public class PdeSketch { if (i == 0) { // store this for the compiler and the runtime - mainClassName = className; + primaryClassName = className; // check if the 'main' file is in java mode if (PdePreprocessor.programType == PdePreprocessor.JAVA) { @@ -615,7 +593,7 @@ public class PdeSketch { // PdeCompiler compiler = new PdeCompiler(); boolean success = compiler.compile(this, buildPath); - return success ? mainClassName : null; + return success ? primaryClassName : null; } diff --git a/processing/todo.txt b/processing/todo.txt index 8d8955afe..f18f23268 100644 --- a/processing/todo.txt +++ b/processing/todo.txt @@ -73,7 +73,6 @@ o http://processing.org/discourse/yabb/YaBB.cgi?board=Proce55ing_Software;acti o try ariel's Thread.yield() suggestion o set default framerate of 24? 30? 2x that? - _ once compiling again, change PdeException _ rename the class for a minute to find all references _ then add references to the *file index* in question @@ -84,6 +83,8 @@ _ http://processing.org/discourse/yabb/YaBB.cgi?board=Proce55ing_Software;acti _ fix command keys for menus (broken since switching to swing) +_ PdeRuntime isn't properly handling messages from all classes in project +_ get things up and running, and see how it looks _ fix make.sh and dist.sh for all platforms to include new export setup _ re-implement history (disabled for 68) @@ -133,8 +134,8 @@ _ remove the 'default' for sketchbook _ bring this up on bboard and get votes _ win2k: my documents, macosx: ~/Documents, linux: ~/sketchbook _ fix code for changing the sketch folder -_ don't allow editing of multiple files in this release -_ but support multiple java/pde files through the 'add file' option +o don't allow editing of multiple files in this release +o but support multiple java/pde files through the 'add file' option _ open mode _ on application open, override 'open' mode _ and just open an empty sketch in the sketchbook folder @@ -200,6 +201,7 @@ void toGrayscale() { BUGS / PDE _ find/replace hangs when recapitalizing things _ http://processing.org/discourse/yabb/YaBB.cgi?board=Proce55ing_software_bugs;action=display;num=1072994196;start=0 +_ http://processing.org/discourse/yabb/YaBB.cgi?board=Proce55ing_software_bugs;action=display;num=1074602643 _ if last line of code is a comment with no CR after it, _ an OutOfMemoryError ensues _ http://processing.org/discourse/yabb/YaBB.cgi?board=Proce55ing_software_bugs;action=display;num=1067717095