diff --git a/app/Sketch.java b/app/Sketch.java index 444f41149..4e16936c8 100644 --- a/app/Sketch.java +++ b/app/Sketch.java @@ -55,12 +55,12 @@ public class Sketch { */ String mainFilename; - /// true if any of the files have been modified + /** + * true if any of the files have been modified. + */ boolean modified; - //boolean library; // true if it's a library - - public File folder; //sketchFolder; + public File folder; public File dataFolder; public File codeFolder; @@ -270,8 +270,8 @@ public class Sketch { } } - boolean renamingCode; + boolean renamingCode; public void newCode() { // make sure the user didn't hide the sketch folder @@ -442,17 +442,6 @@ public class Sketch { // make sure the user didn't hide the sketch folder ensureExistence(); - // don't allow delete of the main code - // TODO maybe gray out the menu on setCurrent(0) - /* - if (current == code[0]) { - Base.showMessage("Can't do that", - "You cannot delete the main " + - ".pde file from a sketch\n"); - return; - } - */ - // confirm deletion with user, yes/no Object[] options = { "OK", "Cancel" }; String prompt = (current == code[0]) ? @@ -552,8 +541,6 @@ public class Sketch { public void unhideCode(String what) { - //System.out.println("unhide " + e); - //int unhideIndex = -1; SketchCode unhideCode = null; for (int i = 0; i < hiddenCount; i++) { @@ -598,14 +585,6 @@ public class Sketch { } - /** - * Return true if this sketch is a library. - */ - //public boolean isLibrary() { - //return library; - //} - - /** * Sets the modified value for the code in the frontmost tab. */ @@ -634,9 +613,9 @@ public class Sketch { protected void ensureExistence() { if (folder.exists()) return; - Base.showWarning("Sketch disappeared", - "The sketch folder has disappeared (did you " + - "delete it? Are you trying to f-- with me?)\n" + + Base.showWarning("Sketch Disappeared", + "The sketch folder has disappeared " + + "(did you delete it?)\n" + "Will attempt to re-save in the same location," + "but anything besides the code will be lost.", null); try { @@ -908,7 +887,7 @@ public class Sketch { } - public void addLibrary(String jarPath) { + public void importLibrary(String jarPath) { // make sure the user didn't hide the sketch folder ensureExistence(); @@ -945,7 +924,6 @@ public class Sketch { */ public void setCurrent(int which) { // get the text currently being edited - //program[current] = editor.getText(); if (current != null) { current.program = editor.getText(); } @@ -984,26 +962,21 @@ public class Sketch { protected void cleanup() { // if the java runtime is holding onto any files in the build dir, we // won't be able to delete them, so we need to force a gc here - // System.gc(); // note that we can't remove the builddir itself, otherwise // the next time we start up, internal runs using Runner won't // work because the build dir won't exist at startup, so the classloader // will ignore the fact that that dir is in the CLASSPATH in run.sh - // - //File dirObject = new File(TEMP_BUILD_PATH); - //Base.removeDescendants(dirObject); Base.removeDescendants(tempBuildFolder); } /** * Preprocess, Compile, and Run the current code. - * This is not Runnable.run(), but a handler for the run() command. - * + *
* There are three main parts to this process: - * + *
* (0. if not java, then use another 'engine'.. i.e. python)
*
* 1. do the p5 language preprocessing
@@ -1023,8 +996,8 @@ public class Sketch {
* or if more than one file is in the project
*
* X. afterwards, some of these steps need a cleanup function
+ *
*/
- //public void run() throws RunnerException {
public boolean handleRun() throws RunnerException {
// make sure the user didn't hide the sketch folder
ensureExistence();
@@ -1078,72 +1051,10 @@ public class Sketch {
}
}
}
-
- // if the compilation worked, run the applet
-// if (mainClassName != null) {
-
- /*
- if (externalPaths == null) {
- externalPaths =
- Compiler.calcClassPath(null) + File.pathSeparator +
- tempBuildPath;
- } else {
- externalPaths =
- tempBuildPath + File.pathSeparator +
- Compiler.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 Runner(this, editor);
-
- // if programType is ADVANCED
- // or the code/ folder is not empty -> or just exists (simpler)
- // then set boolean for external to true
- // include path to build in front, then path for code folder
- // when passing the classpath through
- // actually, build will already be in there, just prepend code
-
- // use the runtime object to consume the errors now
- // no need to bother recycling the old guy
- //MessageStream messageStream = new MessageStream(runtime);
-
- // start the applet
-// runtime.start(presenting ? presentLocation : appletLocation); //,
- //new PrintStream(messageStream));
-
- // spawn a thread to update PDE GUI state
-// watcher = new RunButtonWatcher();
-
-// } else {
- // [dmose] throw an exception here?
- // [fry] iirc the exception will have already been thrown
-// cleanup();
-// }
return (mainClassName != null);
}
- /**
- * Have the contents of the currently visible tab been modified?
- */
- /*
- public boolean isCurrentModified() {
- return modified[current];
- }
- */
-
-
/**
* Build all the code for this sketch.
*
@@ -1427,10 +1338,8 @@ public class Sketch {
/**
- * Called by Editor to handle someone having selected 'export'.
- * Pops up a dialog box for export options, and then calls the
- * necessary function with the parameters from the window.
- *
+ * Initiate export to applet.
+ *
* +-------------------------------------------------------+
* + +
* + Export to: [ Applet (for the web) + ] [ OK ] +
@@ -1455,71 +1364,15 @@ public class Sketch {
* + identical message as 1.3 above... +
* + +
* +-------------------------------------------------------+
- *
- * +-------------------------------------------------------+
- * + +
- * + Export to: [ Application + ] [ OK ] +
- * + +
- * + > Advanced +
- * + - - - - - - - - - - - - - - - - - - - - - - - - - - - +
- * + Version: [ Java 1.1 + ] +
- * + +
- * + Not much point to using Java 1.1 for applications. +
- * + To run applications, all users will have to +
- * + install Java, in which case they'll most likely +
- * + have version 1.3 or later. +
- * + - - - - - - - - - - - - - - - - - - - - - - - - - - - +
- * + Version: [ Java 1.3 + ] +
- * + +
- * + Java 1.3 is the recommended setting for exporting +
- * + applications. Applications will run on any Windows +
- * + or Unix machine with Java installed. Mac OS X has +
- * + Java installed with the operation system, so there +
- * + is no additional installation will be required. +
- * + +
- * + - - - - - - - - - - - - - - - - - - - - - - - - - - - +
- * + +
- * + Platform: [ Mac OS X + ] <-- defaults to current platform
- * + +
- * + Exports the application as a double-clickable +
- * + .app package, compatible with Mac OS X. +
- * + - - - - - - - - - - - - - - - - - - - - - - - - - - - +
- * + Platform: [ Windows + ] +
- * + +
- * + Exports the application as a double-clickable +
- * + .exe and a handful of supporting files. +
- * + - - - - - - - - - - - - - - - - - - - - - - - - - - - +
- * + Platform: [ jar file + ] +
- * + +
- * + A jar file can be used on any platform that has +
- * + Java installed. Simply doube-click the jar (or type +
- * + "java -jar sketch.jar" at a command prompt) to run +
- * + the application. It is the least fancy method for +
- * + exporting. +
- * + +
- * +-------------------------------------------------------+
- *
-
- * +-------------------------------------------------------+
- * + +
- * + Export to: [ Library + ] [ OK ] +
- * + +
- * +-------------------------------------------------------+
+ *
*/
- //public boolean export() throws Exception {
- //return exportApplet(true);
- //}
-
-
- public boolean exportApplet(/*boolean replaceHtml*/) throws Exception {
+ public boolean exportApplet() throws Exception {
// make sure the user didn't hide the sketch folder
ensureExistence();
zipFileContents = new Hashtable();
boolean replaceHtml = true;
- //File appletDir, String exportSketchName, File dataDir) {
- //String program = textarea.getText();
// create the project directory
// pass null for datapath because the files shouldn't be
@@ -1546,8 +1399,8 @@ public class Sketch {
// BUG unfortunately, that can also be a bug in the preproc :(
if (!name.equals(foundName)) {
Base.showWarning("Error during export",
- "Sketch name is " + name + " but the sketch\n" +
- "name in the code was " + foundName, null);
+ "Sketch name is " + name + " but the sketch\n" +
+ "name in the code was " + foundName, null);
return false;
}
@@ -1563,10 +1416,10 @@ public class Sketch {
// this way, no warning is shown if size() isn't actually
// used in the applet, which is the case especially for
// beginners that are cutting/pasting from the reference.
- // modified for 83 to match size(XXX, ddd
+ // modified for 83 to match size(XXX, ddd so that it'll
+ // properly handle size(200, 200) and size(200, 200, P3D)
String sizing =
"[\\s\\;]size\\s*\\(\\s*(\\S+)\\s*,\\s*(\\d+)";
- //"[\\s\\;]size\\s*\\(\\s*(\\S+)\\s*,\\s*(\\S+)\\s*\\);";
Pattern pattern = compiler.compile(sizing);
// adds a space at the beginning, in case size() is the very
@@ -1694,7 +1547,7 @@ public class Sketch {
Base.copyFile(code[i].file,
new File(appletDir, code[i].file.getName()));
} catch (IOException e) {
-
+ e.printStackTrace();
}
}
@@ -1704,6 +1557,9 @@ public class Sketch {
ZipOutputStream zos = new ZipOutputStream(zipOutputFile);
ZipEntry entry;
+ // add the manifest file
+ addManifest(zos);
+
// add the contents of the code folder to the jar
// unpacks all jar files
//File codeFolder = new File(folder, "code");
@@ -1721,7 +1577,6 @@ public class Sketch {
// in the list is a File object that points the
// library sketch's "library" folder
File libraryFolder = (File)en.nextElement();
- //System.out.println("exporting files from " + libFolder);
File exportSettings = new File(libraryFolder, "export.txt");
String exportList[] = null;
if (exportSettings.exists()) {
@@ -1752,8 +1607,6 @@ public class Sketch {
} else if (exportFile.getName().toLowerCase().endsWith(".zip") ||
exportFile.getName().toLowerCase().endsWith(".jar")) {
- //System.out.println("adding zip file " +
- // exportFile.getAbsolutePath());
packClassPathIntoZipFile(exportFile.getAbsolutePath(), zos);
} else { // just copy the file over.. prolly a .dll or something
@@ -1763,43 +1616,11 @@ public class Sketch {
}
}
- // add the appropriate bagel to the classpath
- /*
- String jdkVersion = Preferences.get("compiler.jdk_version");
- String bagelJar = "lib/export11.jar"; // default
- if (jdkVersion.equals("1.3") || jdkVersion.equals("1.4")) {
- bagelJar = "lib/export13.jar";
- }
- */
String bagelJar = "lib/core.jar";
-
- //if (jdkVersionStr.equals("1.3")) { bagelJar = "export13.jar" };
- //if (jdkVersionStr.equals("1.4")) { bagelJar = "export14.jar" };
packClassPathIntoZipFile(bagelJar, zos);
- /*
- // add the contents of lib/export to the jar file
- // these are the jdk11-only bagel classes
- String exportDir = ("lib" + File.separator +
- "export" + File.separator);
- String bagelClasses[] = new File(exportDir).list();
-
- for (int i = 0; i < bagelClasses.length; i++) {
- if (!bagelClasses[i].endsWith(".class")) continue;
- entry = new ZipEntry(bagelClasses[i]);
- zos.putNextEntry(entry);
- zos.write(Base.grabFile(new File(exportDir + bagelClasses[i])));
- zos.closeEntry();
- }
- */
-
- // TODO these two loops are insufficient.
- // should instead recursively add entire contents of build folder
- // the data folder will already be a subdirectory
- // and the classes may be buried in subfolders if a package name was used
-
// files to include from data directory
- //if ((dataDir != null) && (dataDir.exists())) {
+ // TODO this needs to be recursive
if (dataFolder.exists()) {
String dataFiles[] = dataFolder.list();
for (int i = 0; i < dataFiles.length; i++) {
@@ -1818,6 +1639,7 @@ public class Sketch {
// just grabs everything from the build directory
// since there may be some inner classes
// (add any .class files from the applet dir, then delete them)
+ // TODO this needs to be recursive (for packages)
String classfiles[] = appletDir.list();
for (int i = 0; i < classfiles.length; i++) {
if (classfiles[i].endsWith(".class")) {
@@ -1836,9 +1658,9 @@ public class Sketch {
File deadguy = new File(appletDir, classfiles[i]);
if (!deadguy.delete()) {
Base.showWarning("Could not delete",
- classfiles[i] + " could not \n" +
- "be deleted from the applet folder. \n" +
- "You'll need to remove it by hand.", null);
+ classfiles[i] + " could not \n" +
+ "be deleted from the applet folder. \n" +
+ "You'll need to remove it by hand.", null);
}
}
}
@@ -1848,21 +1670,82 @@ public class Sketch {
zos.close();
Base.openFolder(appletDir);
-
- //} catch (Exception e) {
- //e.printStackTrace();
- //}
return true;
}
+ /**
+ * Export to application.
+ * + * +-------------------------------------------------------+ + * + + + * + Export to: [ Application + ] [ OK ] + + * + + + * + > Advanced + + * + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + * + Version: [ Java 1.1 + ] + + * + + + * + Not much point to using Java 1.1 for applications. + + * + To run applications, all users will have to + + * + install Java, in which case they'll most likely + + * + have version 1.3 or later. + + * + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + * + Version: [ Java 1.3 + ] + + * + + + * + Java 1.3 is the recommended setting for exporting + + * + applications. Applications will run on any Windows + + * + or Unix machine with Java installed. Mac OS X has + + * + Java installed with the operation system, so there + + * + is no additional installation will be required. + + * + + + * + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + * + + + * + Platform: [ Mac OS X + ] <-- defaults to current platform + * + + + * + Exports the application as a double-clickable + + * + .app package, compatible with Mac OS X. + + * + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + * + Platform: [ Windows + ] + + * + + + * + Exports the application as a double-clickable + + * + .exe and a handful of supporting files. + + * + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + * + Platform: [ jar file + ] + + * + + + * + A jar file can be used on any platform that has + + * + Java installed. Simply doube-click the jar (or type + + * + "java -jar sketch.jar" at a command prompt) to run + + * + the application. It is the least fancy method for + + * + exporting. + + * + + + * +-------------------------------------------------------+ + *+ */ public boolean exportApplication() { return true; } - public boolean exportLibrary() { - return true; + public void addManifest(ZipOutputStream zos) throws IOException { + ZipEntry entry = new ZipEntry("META-INF/MANIFEST.MF"); + zos.putNextEntry(entry); + + String contents = + "Manifest-Version: 1.0\n" + + "Created-By: Processing " + Base.VERSION_NAME + "\n" + + "Main-Class: " + name + "\n"; // TODO not package friendly + zos.write(contents.getBytes()); + zos.closeEntry(); + + /* + for (int i = 0; i < bagelClasses.length; i++) { + if (!bagelClasses[i].endsWith(".class")) continue; + entry = new ZipEntry(bagelClasses[i]); + zos.putNextEntry(entry); + zos.write(Base.grabFile(new File(exportDir + bagelClasses[i]))); + zos.closeEntry(); + } + */ } @@ -1945,7 +1828,6 @@ public class Sketch { throws IOException { String files[] = dir.list(); for (int i = 0; i < files.length; i++) { - //if (files[i].equals(".") || files[i].equals("..")) continue; // ignore . .. and .DS_Store if (files[i].charAt(0) == '.') continue; @@ -1983,7 +1865,7 @@ public class Sketch { apath.startsWith(Sketchbook.librariesPath)) { return true; - // this doesn't work on directories + // canWrite() doesn't work on directories //} else if (!folder.canWrite()) { } else { // check to see if each modified code file can be written to diff --git a/app/SketchCode.java b/app/SketchCode.java index 947ef8b0c..c8ae144ee 100644 --- a/app/SketchCode.java +++ b/app/SketchCode.java @@ -53,40 +53,24 @@ public class SketchCode { } + /** + * Load this piece of code from a file. + */ public void load() throws IOException { program = Base.loadFile(file); - - //program = null; - /* - } catch (IOException e) { - Base.showWarning("Error loading file", - "Error while opening the file\n" + - file.getPath(), e); - program = null; // just in case - */ - - //if (program != null) { - //history = new History(file); - //} + modified = false; } + /** + * Save this piece of code, regardless of whether the modified + * flag is set or not. + */ public void save() throws IOException { // TODO re-enable history //history.record(s, SketchHistory.SAVE); - //try { - //System.out.println("saving to " + file); - //System.out.println("stuff to save: " + program); - //System.out.println("-------"); Base.saveFile(program, file); modified = false; - - //} catch (Exception e) { - //Base.showWarning("Error saving file", - // "Could not save '" + file.getName() + "'\n" + - // "to '" + file.getParent() + "'\n" + - // "because of an error.", e); - //} } } diff --git a/app/Sketchbook.java b/app/Sketchbook.java index 7496d78ef..f134b41b7 100644 --- a/app/Sketchbook.java +++ b/app/Sketchbook.java @@ -512,7 +512,7 @@ public class Sketchbook { ActionListener listener = new ActionListener() { public void actionPerformed(ActionEvent e) { - editor.sketch.addLibrary(e.getActionCommand()); + editor.sketch.importLibrary(e.getActionCommand()); } }; diff --git a/todo.txt b/todo.txt index 3cd153541..624831ff7 100644 --- a/todo.txt +++ b/todo.txt @@ -55,6 +55,8 @@ might screw people in the long run? _ sketch "delete" not working.. grrr.. +_ creating a new file with the same name as a hidden file will cause trouble + . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . @@ -441,7 +443,13 @@ _ and gives info about what to do next (how to edit) export stuff +_ currently some bugs in the main() because it's not sizing applets +_ if running in present mode it works ok +_ but that also needs its display set.. argh _ write export-to-application +_ problem with packages.. currently mainClassName is preproc name +_ and "name" is the sketch name, w/o package +_ but if a package were in use, then would be trouble _ lock feature for present mode (part of export to application?) _ application can still do serial (qt, other stuff?) _ applet runs in browser, though applet on cbagel is everything..