notes on ui for export

This commit is contained in:
benfry
2004-01-18 14:26:41 +00:00
parent a5c1e087b3
commit 72e709747d
2 changed files with 319 additions and 275 deletions
+26 -4
View File
@@ -96,7 +96,7 @@ public class PdeEditor extends JFrame
JMenuItem saveAsMenuItem;
JMenuItem beautifyMenuItem;
JMenu exportMenu;
//JMenu exportMenu;
//
@@ -429,7 +429,7 @@ public class PdeEditor extends JFrame
// in case library option has been enabled or disabled
buildExportMenu();
//buildExportMenu();
// in case moved to a new location
@@ -508,8 +508,25 @@ public class PdeEditor extends JFrame
});
menu.add(item);
exportMenu = buildExportMenu();
menu.add(exportMenu);
item = newMenuItem("Export", 'E');
item.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
editor.message("Exporting code...");
try {
if (sketch.export()) {
message("Done exporting.");
} else {
// error message will already be visible
}
} catch (Exception e) {
editor.message("Error during export.");
e.printStackTrace();
}
buttons.clear();
}
});
//exportMenu = buildExportMenu();
//menu.add(exportMenu);
menu.addSeparator();
@@ -547,6 +564,7 @@ public class PdeEditor extends JFrame
}
/*
protected JMenu buildExportMenu() {
if (exportMenu == null) {
exportMenu = new JMenu("Export");
@@ -574,6 +592,7 @@ public class PdeEditor extends JFrame
}
return exportMenu;
}
*/
protected JMenu buildSketchMenu() {
@@ -1755,12 +1774,15 @@ public class PdeEditor extends JFrame
}
/*
public void skExport() {
doStop();
message("Exporting for the web...");
File appletDir = new File(sketchDir, "applet");
handleExport(appletDir, sketchName, new File(sketchDir, "data"));
}
*/
/*
public void doExport() {
+293 -271
View File
@@ -22,59 +22,6 @@
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/*
Export to: [ Applet (for the web) + ] [ OK ]
[ ] OK to overwrite HTML file <-- only visible if there is one there
remembers previous setting as a pref
> Advanced
Version: [ Java 1.1 + ]
Using a version of Java other than 1.1 will require
your Windows users to install the Java Plug-In,
and your Macintosh users to be running OS X.
Export to: [ Application + ] [ OK ]
> Advanced
Platform: [ Mac OS X + ] <-- defaults to your current platform
Windows
jar file
Exports the application as a double-clickable .app package,
compatible with Mac OS X.
Exports the application as a double-clickable .exe
and a handful of supporting files.
A jar file can be used on any platform that has Java
installed. Simply doube-click the jar to run the application.
It is the simplest (but ugliest) method for exporting.
Version: [ Java 1.3 + ]
Java 1.3 is the recommended setting for exporting
applications. Applications will run on any Windows or
Unix machine that has java installed, and on Mac OS X.
Export to: [ Library + ] [ OK ]
> Advanced
(no settings here?)
*/
public class PdeSketch {
// name of sketch, which is the name of main file
// (without .pde or .java extension)
@@ -492,172 +439,257 @@ public class PdeSketch {
}
public void exportApplet(boolean replaceHtml) {
/**
* Called by PdeEditor 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.
*
*
* +-------------------------------------------------------+
* + +
* + Export to: [ Applet (for the web) + ] [ OK ] +
* + +
* + [ ] OK to overwrite HTML file <-- only visible if there is one there
* + remembers previous setting as a pref
* + > Advanced +
* + +
* + - - - - - - - - - - - - - - - - - - - - - - - - - - - +
* + Version: [ Java 1.1 + ] +
* + +
* + Recommended version of Java when exporting applets. +
* + - - - - - - - - - - - - - - - - - - - - - - - - - - - +
* + Version: [ Java 1.3 + ] +
* + +
* + Java 1.3 is not recommended for applets, +
* + unless you are using features that require it. +
* + Using a version of Java other than 1.1 will require +
* + your Windows users to install the Java Plug-In, +
* + and your Macintosh users to be running OS X. +
* + - - - - - - - - - - - - - - - - - - - - - - - - - - - +
* + Version: [ Java 1.4 + ] +
* + +
* + 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 {
//File appletDir, String exportSketchName, File dataDir) {
try {
String program = textarea.getText();
//String program = textarea.getText();
// create the project directory
// pass null for datapath because the files shouldn't be
// copied to the build dir.. that's only for the temp stuff
File appletDir = new File(directory, "applet");
// create the project directory
// pass null for datapath because the files shouldn't be
// copied to the build dir.. that's only for the temp stuff
File appletDir = new File(directory, "applet");
boolean writeHtml = true;
if (appletDir.exists()) {
File htmlFile = new new File(appletDir, "index.html");
if (htmlFile.exists() && !replaceHtml) {
writeHtml = false;
}
} else {
appletDir.mkdirs();
boolean writeHtml = true;
if (appletDir.exists()) {
File htmlFile = new new File(appletDir, "index.html");
if (htmlFile.exists() && !replaceHtml) {
writeHtml = false;
}
} else {
appletDir.mkdirs();
}
// build the sketch
String foundName = build(name, appletDir.getPath());
// build the sketch
String foundName = build(name, appletDir.getPath());
// (already reported) error during export, exit this function
if (foundName == null) {
buttons.clear();
return;
}
// (already reported) error during export, exit this function
if (foundName == null) return false;
// if name != exportSketchName, then that's weirdness
// BUG unfortunately, that can also be a bug in the preproc :(
if (!name.equals(foundName)) {
PdeBase.showWarning("Error during export",
"Sketch name is " + name + " but the sketch\n" +
"name in the code was " + foundName);
return;
}
// if name != exportSketchName, then that's weirdness
// BUG unfortunately, that can also be a bug in the preproc :(
if (!name.equals(foundName)) {
PdeBase.showWarning("Error during export",
"Sketch name is " + name + " but the sketch\n" +
"name in the code was " + foundName);
return false;
}
if (writeHtml) {
int wide = BApplet.DEFAULT_WIDTH;
int high = BApplet.DEFAULT_HEIGHT;
if (writeHtml) {
int wide = BApplet.DEFAULT_WIDTH;
int high = BApplet.DEFAULT_HEIGHT;
//try {
PatternMatcher matcher = new Perl5Matcher();
PatternCompiler compiler = new Perl5Compiler();
// this matches against any uses of the size() function,
// whether they contain numbers of variables or whatever.
// 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.
String sizing =
"[\\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
// first thing in the program (very common), since the regexp
// needs to check for things in front of it.
PatternMatcherInput input = new PatternMatcherInput(" " + program);
if (matcher.contains(input, pattern)) {
MatchResult result = matcher.getMatch();
try {
PatternMatcher matcher = new Perl5Matcher();
PatternCompiler compiler = new Perl5Compiler();
wide = Integer.parseInt(result.group(1).toString());
high = Integer.parseInt(result.group(2).toString());
// this matches against any uses of the size() function,
// whether they contain numbers of variables or whatever.
// 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.
String sizing =
"[\\s\\;]size\\s*\\(\\s*(\\S+)\\s*,\\s*(\\S+)\\s*\\);";
Pattern pattern = compiler.compile(sizing);
} catch (NumberFormatException e) {
// found a reference to size, but it didn't
// seem to contain numbers
final String message =
"The size of this applet could not automatically be\n" +
"determined from your code. You'll have to edit the\n" +
"HTML file to set the size of the applet.";
// adds a space at the beginning, in case size() is the very
// first thing in the program (very common), since the regexp
// needs to check for things in front of it.
PatternMatcherInput input = new PatternMatcherInput(" " + program);
if (matcher.contains(input, pattern)) {
MatchResult result = matcher.getMatch();
try {
wide = Integer.parseInt(result.group(1).toString());
high = Integer.parseInt(result.group(2).toString());
} catch (NumberFormatException e) {
// found a reference to size, but it didn't
// seem to contain numbers
final String message =
"The size of this applet could not automatically be\n" +
"determined from your code. You'll have to edit the\n" +
"HTML file to set the size of the applet.";
PdeBase.showWarning("Could not find applet size", message, null);
}
} // else no size() command found
} catch (MalformedPatternException e) {
PdeBase.showWarning("Internal Problem",
"An internal error occurred while trying\n" +
"to export the sketch. Please report this.", e);
PdeBase.showWarning("Could not find applet size", message, null);
}
} // else no size() command found
StringBuffer sources = new StringBuffer();
for (int i = 0; i < codeCount; i++) {
sources.append("<a href=\'" + code[i].file.getName() + "\">" +
code[i].name + "</a> ");
}
// handle this in editor instead, rare or nonexistant
//} catch (MalformedPatternException e) {
//PdeBase.showWarning("Internal Problem",
// "An internal error occurred while trying\n" +
// "to export the sketch. Please report this.", e);
//return false;
//}
File htmlOutputFile = new File(appletDir, "index.html");
FileOutputStream fos = new FileOutputStream(htmlOutputFile);
PrintStream ps = new PrintStream(fos);
// @@sketch@@, @@width@@, @@height@@, @@archive@@, @@source@@
InputStream is = PdeBase.getStream("applet.html");
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String line = null;
while ((line = reader.readLine()) != null) {
if (line.indexOf("@@") != -1) {
StringBuffer sb = new StringBuffer(line);
int index = 0;
while ((index = sb.indexOf("@@sketch@@")) != -1) {
sb.replace(index, index + "@@sketch@@".length(),
name);
}
while ((index = sb.indexOf("@@source@@")) != -1) {
sb.replace(index, index + "@@source@@".length(),
sources.toString());
}
while ((index = sb.indexOf("@@archive@@")) != -1) {
sb.replace(index, index + "@@archive@@".length(),
name + ".jar");
}
while ((index = sb.indexOf("@@width@@")) != -1) {
sb.replace(index, index + "@@width@@".length(),
String.valueOf(wide));
}
while ((index = sb.indexOf("@@height@@")) != -1) {
sb.replace(index, index + "@@height@@".length(),
String.valueOf(wide));
}
line = sb.toString();
}
ps.println(line);
}
reader.close();
ps.flush();
ps.close();
}
// copy the source files to the target, since we like
// to encourage people to share their code
StringBuffer sources = new StringBuffer();
for (int i = 0; i < codeCount; i++) {
PdeBase.copyFile(code[i].file,
new File(appletDir, code[i].file.getName()));
sources.append("<a href=\'" + code[i].file.getName() + "\">" +
code[i].name + "</a> ");
}
// create new .jar file
FileOutputStream zipOutputFile =
new FileOutputStream(new File(appletDir, name + ".jar"));
ZipOutputStream zos = new ZipOutputStream(zipOutputFile);
ZipEntry entry;
File htmlOutputFile = new File(appletDir, "index.html");
FileOutputStream fos = new FileOutputStream(htmlOutputFile);
PrintStream ps = new PrintStream(fos);
// add the contents of the code folder to the jar
// unpacks all jar files
File codeFolder = new File(sketchDir, "code");
if (codeFolder.exists()) {
String includes = PdeCompiler.contentsToClassPath(codeFolder);
packClassPathIntoZipFile(includes, zos);
// @@sketch@@, @@width@@, @@height@@, @@archive@@, @@source@@
InputStream is = PdeBase.getStream("applet.html");
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String line = null;
while ((line = reader.readLine()) != null) {
if (line.indexOf("@@") != -1) {
StringBuffer sb = new StringBuffer(line);
int index = 0;
while ((index = sb.indexOf("@@sketch@@")) != -1) {
sb.replace(index, index + "@@sketch@@".length(),
name);
}
while ((index = sb.indexOf("@@source@@")) != -1) {
sb.replace(index, index + "@@source@@".length(),
sources.toString());
}
while ((index = sb.indexOf("@@archive@@")) != -1) {
sb.replace(index, index + "@@archive@@".length(),
name + ".jar");
}
while ((index = sb.indexOf("@@width@@")) != -1) {
sb.replace(index, index + "@@width@@".length(),
String.valueOf(wide));
}
while ((index = sb.indexOf("@@height@@")) != -1) {
sb.replace(index, index + "@@height@@".length(),
String.valueOf(wide));
}
line = sb.toString();
}
ps.println(line);
}
// add the appropriate bagel to the classpath
String jdkVersionStr = PdePreferences.get("compiler.jdk_version");
String bagelJar = "lib/export11.jar"; // default
if (jdkVersion.equals("1.3") || jdkVersion.equals("1.4")) {
bagelJar = "lib/export13.jar";
}
//if (jdkVersionStr.equals("1.3")) { bagelJar = "export13.jar" };
//if (jdkVersionStr.equals("1.4")) { bagelJar = "export14.jar" };
packClassPathIntoZipFile(bagelJar);
/*
reader.close();
ps.flush();
ps.close();
}
// copy the source files to the target, since we like
// to encourage people to share their code
for (int i = 0; i < codeCount; i++) {
PdeBase.copyFile(code[i].file,
new File(appletDir, code[i].file.getName()));
}
// create new .jar file
FileOutputStream zipOutputFile =
new FileOutputStream(new File(appletDir, name + ".jar"));
ZipOutputStream zos = new ZipOutputStream(zipOutputFile);
ZipEntry entry;
// add the contents of the code folder to the jar
// unpacks all jar files
File codeFolder = new File(sketchDir, "code");
if (codeFolder.exists()) {
String includes = PdeCompiler.contentsToClassPath(codeFolder);
packClassPathIntoZipFile(includes, zos);
}
// add the appropriate bagel to the classpath
String jdkVersionStr = PdePreferences.get("compiler.jdk_version");
String bagelJar = "lib/export11.jar"; // default
if (jdkVersion.equals("1.3") || jdkVersion.equals("1.4")) {
bagelJar = "lib/export13.jar";
}
//if (jdkVersionStr.equals("1.3")) { bagelJar = "export13.jar" };
//if (jdkVersionStr.equals("1.4")) { bagelJar = "export14.jar" };
packClassPathIntoZipFile(bagelJar);
/*
// add the contents of lib/export to the jar file
// these are the jdk11-only bagel classes
String exportDir = ("lib" + File.separator +
@@ -671,78 +703,67 @@ public class PdeSketch {
zos.write(PdeBase.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
// 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())) {
String datafiles[] = dataDir.list();
for (int i = 0; i < datafiles.length; i++) {
// don't export hidden files
// skipping dot prefix removes all: . .. .DS_Store
if (datafiles[i].charAt(0) == '.') continue;
// files to include from data directory
if ((dataDir != null) && (dataDir.exists())) {
String datafiles[] = dataDir.list();
for (int i = 0; i < datafiles.length; i++) {
// don't export hidden files
// skipping dot prefix removes all: . .. .DS_Store
if (datafiles[i].charAt(0) == '.') continue;
entry = new ZipEntry(datafiles[i]);
zos.putNextEntry(entry);
zos.write(PdeBase.grabFile(new File(dataDir, datafiles[i])));
zos.closeEntry();
}
entry = new ZipEntry(datafiles[i]);
zos.putNextEntry(entry);
zos.write(PdeBase.grabFile(new File(dataDir, datafiles[i])));
zos.closeEntry();
}
// add the project's .class files to the jar
// 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)
String classfiles[] = appletDir.list();
for (int i = 0; i < classfiles.length; i++) {
if (classfiles[i].endsWith(".class")) {
entry = new ZipEntry(classfiles[i]);
zos.putNextEntry(entry);
zos.write(PdeBase.grabFile(new File(appletDir, classfiles[i])));
zos.closeEntry();
}
}
// remove the .class files from the applet folder. if they're not
// removed, the msjvm will complain about an illegal access error,
// since the classes are outside the jar file.
for (int i = 0; i < classfiles.length; i++) {
if (classfiles[i].endsWith(".class")) {
File deadguy = new File(appletDir, classfiles[i]);
if (!deadguy.delete()) {
PdeBase.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);
}
}
}
// close up the jar file
zos.flush();
zos.close();
// make a copy of the .pde file to post on the web
FileOutputStream sketchOutput =
new FileOutputStream(new File(appletDir, name + ".pde"));
PrintWriter sketchWriter =
new PrintWriter(new OutputStreamWriter(sketchOutput));
sketchWriter.print(program);
sketchWriter.flush();
sketchWriter.close();
message("Done exporting.");
PdeBase.openFolder(appletDir);
} catch (Exception e) {
message("Error during export.");
e.printStackTrace();
}
buttons.clear();
// add the project's .class files to the jar
// 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)
String classfiles[] = appletDir.list();
for (int i = 0; i < classfiles.length; i++) {
if (classfiles[i].endsWith(".class")) {
entry = new ZipEntry(classfiles[i]);
zos.putNextEntry(entry);
zos.write(PdeBase.grabFile(new File(appletDir, classfiles[i])));
zos.closeEntry();
}
}
// remove the .class files from the applet folder. if they're not
// removed, the msjvm will complain about an illegal access error,
// since the classes are outside the jar file.
for (int i = 0; i < classfiles.length; i++) {
if (classfiles[i].endsWith(".class")) {
File deadguy = new File(appletDir, classfiles[i]);
if (!deadguy.delete()) {
PdeBase.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);
}
}
}
// close up the jar file
zos.flush();
zos.close();
PdeBase.openFolder(appletDir);
//} catch (Exception e) {
//e.printStackTrace();
//}
return true;
}
@@ -750,8 +771,9 @@ public class PdeSketch {
* Slurps up .class files from a colon (or semicolon on windows)
* separated list of paths and adds them to a ZipOutputStream.
*/
static public void packClassPathIntoZipFile(String path, ZipOutputStream zos)
throws IOException {
static public void packClassPathIntoZipFile(String path,
ZipOutputStream zos)
throws IOException {
String pieces[] =
BApplet.splitStrings(path, File.pathSeparatorChar);
@@ -814,10 +836,10 @@ public class PdeSketch {
* can be called recursively to walk through folders looking
* for more goodies that will be added to the ZipOutputStream.
*/
static public void packClassPathIntoZipFileRecursive(File dir, String sofar,
ZipOutputStream zos)
throws IOException {
static public void packClassPathIntoZipFileRecursive(File dir,
String sofar,
ZipOutputStream zos)
throws IOException {
String files[] = dir.list();
for (int i = 0; i < files.length; i++) {
//if (files[i].equals(".") || files[i].equals("..")) continue;