From 27e04dde1cd7b73ccf57a6af6a5d27cf2ccb8af7 Mon Sep 17 00:00:00 2001 From: benfry Date: Sun, 5 Sep 2004 22:26:05 +0000 Subject: [PATCH] add library support now getting closer --- app/PdeEditor.java | 6 ++--- app/PdePreprocessor.java | 55 ++++++++++++++++++++++++++++++++++++++-- app/PdeSketch.java | 32 ++++++++++++++++------- build/windows/make.sh | 2 +- core/PApplet.java | 4 +-- todo.txt | 5 ++++ 6 files changed, 87 insertions(+), 17 deletions(-) diff --git a/app/PdeEditor.java b/app/PdeEditor.java index e33f5f2eb..92a2f4451 100644 --- a/app/PdeEditor.java +++ b/app/PdeEditor.java @@ -581,9 +581,7 @@ implements MRJAboutHandler, MRJQuitHandler, MRJPrefsHandler // - menu.add(sketchbook.getAddLibraryMenu()); - - item = new JMenuItem("Import..."); + item = new JMenuItem("Add File..."); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { sketch.addFile(); @@ -591,6 +589,8 @@ implements MRJAboutHandler, MRJQuitHandler, MRJPrefsHandler }); menu.add(item); + menu.add(sketchbook.getAddLibraryMenu()); + item = new JMenuItem("Create font..."); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { diff --git a/app/PdePreprocessor.java b/app/PdePreprocessor.java index e7f75dc6b..5da032684 100644 --- a/app/PdePreprocessor.java +++ b/app/PdePreprocessor.java @@ -28,10 +28,13 @@ import processing.core.*; import java.io.*; + import antlr.*; import antlr.collections.*; import antlr.collections.impl.*; +import com.oroinc.text.regex.*; + public class PdePreprocessor { @@ -77,8 +80,10 @@ public class PdePreprocessor { * preprocesses a pde file and write out a java file * @return the classname of the exported Java */ - public String write(String program, String buildPath, String name, - String extraImports[]) throws java.lang.Exception { + //public String write(String program, String buildPath, String name, + // String extraImports[]) throws java.lang.Exception { + public String write(String program, String buildPath, String name) + throws java.lang.Exception { // if the program ends with no CR or LF an OutOfMemoryError will happen. // not gonna track down the bug now, so here's a hack for it: if ((program.length() > 0) && @@ -123,6 +128,45 @@ public class PdePreprocessor { } } + // if this guy has his own imports, need to remove them + // just in case it's not an advanced mode sketch + PatternMatcher matcher = new Perl5Matcher(); + PatternCompiler compiler = new Perl5Compiler(); + //String mess = "^\\s*(import\\s*[\\w\\d_\\.]+\\s*\\;)"; + //String mess = "^\\s*(import\\s*[\\w\\d\\_\\.]+\\s*\\;)"; + String mess = "^\\s*(import\\s+\\S+\\s*;)"; + java.util.Vector imports = new java.util.Vector(); + + Pattern pattern = null; + try { + pattern = compiler.compile(mess); + } catch (MalformedPatternException e) { + e.printStackTrace(); + return null; + } + + do { + PatternMatcherInput input = new PatternMatcherInput(program); + if (!matcher.contains(input, pattern)) break; + + MatchResult result = matcher.getMatch(); + String piece = result.group(1).toString(); + int len = piece.length(); + + imports.add(piece); + int idx = program.indexOf(piece); + // just remove altogether? + program = program.substring(0, idx) + program.substring(idx + len); + + System.out.println("removing " + piece); + + } while (true); + + String extraImports[] = new String[imports.size()]; + imports.copyInto(extraImports); + + // + // do this after the program gets re-combobulated this.programReader = new StringReader(program); this.buildPath = buildPath; @@ -236,11 +280,18 @@ public class PdePreprocessor { out.print("import processing.core.*; "); // emit emports that are needed for classes from the code folder + /* if (imports != null) { for (int i = 0; i < imports.length; i++) { out.print("import " + imports[i] + ".*; "); } } + */ + if (imports != null) { + for (int i = 0; i < imports.length; i++) { + out.print(imports[i]); + } + } // emit standard imports (read from pde.properties) // for each language level that's being used. diff --git a/app/PdeSketch.java b/app/PdeSketch.java index d81db3c2c..b1a724696 100644 --- a/app/PdeSketch.java +++ b/app/PdeSketch.java @@ -730,12 +730,24 @@ public class PdeSketch { public void addLibrary(String jarPath) { String list[] = PdeCompiler.packageListFromClassPath(jarPath); + // import statements into the main sketch file (code[0]) // if the current code is a .java file, insert into current - // else import statements into the main sketch file (code[0]) - - for (int i = 0; i < list.length; i++) { - System.out.println(list[i]); + if (current.flavor == PDE) { + setCurrent(0); } + // could also scan the text in the file to see if each import + // statement is already in there, but if the user has the import + // commented out, then this will be a problem. + StringBuffer buffer = new StringBuffer(); + for (int i = 0; i < list.length; i++) { + buffer.append("import "); + buffer.append(list[i]); + buffer.append(".*;\n"); + } + buffer.append('\n'); + buffer.append(editor.getText()); + editor.setText(buffer.toString(), false); + setModified(); } @@ -1015,7 +1027,9 @@ public class PdeSketch { // java mode, since that's required String className = preprocessor.write(bigCode.toString(), buildPath, - suggestedClassName, importPackageList); + suggestedClassName); + //preprocessor.write(bigCode.toString(), buildPath, + // suggestedClassName, importPackageList); if (className == null) { throw new PdeException("Could not find main class"); // this situation might be perfectly fine, @@ -1598,13 +1612,13 @@ public class PdeSketch { * volumes or folders without appropraite permissions. */ public boolean isReadOnly() { - //System.out.println("checking read only: " + folder.canWrite()); - if (folder.getAbsolutePath().startsWith(PdeSketchbook.examplesPath)) { + String apath = folder.getAbsolutePath(); + if (apath.startsWith(PdeSketchbook.examplesPath) || + apath.startsWith(PdeSketchbook.librariesPath)) { return true; // this doesn't work on directories - //} else if (!folder.canWrite()) { // is this ok for directories? - //System.err.println("read only directory..."); + //} else if (!folder.canWrite()) { } else { // check to see if each modified code file can be written to for (int i = 0; i < codeCount; i++) { diff --git a/build/windows/make.sh b/build/windows/make.sh index d65c1a89c..7102a2c8f 100755 --- a/build/windows/make.sh +++ b/build/windows/make.sh @@ -189,8 +189,8 @@ cd app #CLASSPATH="..\\build\\windows\\work\\lib\\core.jar;..\\build\\windows\\work\\lib\\mrj.jar;..\\build\\windows\\work\\lib\antlr.jar;..\\build\\windows\\work\\lib\\oro.jar;..\\build\\windows\\work\\java\\lib\\rt.jar;..\\build\\windows\\work\\lib\\comm.jar" CLASSPATH="..\\build\\windows\\work\\lib\\core.jar;..\\build\\windows\\work\\lib\\mrj.jar;..\\build\\windows\\work\\lib\antlr.jar;..\\build\\windows\\work\\lib\\oro.jar;..\\build\\windows\\work\\java\\lib\\rt.jar" -#perl ../bagel/buzz.pl "../build/windows/work/jikes +D -classpath \"$CLASSPATH\" -d \"..\\build\\windows\\work/classes\"" -dJDK13 -dJDK14 *.java jeditsyntax/*.java preprocessor/*.java ../build/windows/work/jikes +D -classpath $CLASSPATH -d ..\\build\\windows\\work/classes *.java jeditsyntax/*.java preprocessor/*.java +#/cygdrive/c/jdk-1.4.2_05/bin/javac.exe -classpath $CLASSPATH -d ..\\build\\windows\\work/classes *.java jeditsyntax/*.java preprocessor/*.java cd ../build/windows/work/classes rm -f ../lib/pde.jar diff --git a/core/PApplet.java b/core/PApplet.java index 0ab5c32ae..2017e52be 100644 --- a/core/PApplet.java +++ b/core/PApplet.java @@ -3469,7 +3469,7 @@ public class PApplet extends Applet public void setupExternal(Frame frame) { //externalRuntime = true; - Thread thread = new Thread() { //new Runnable() { + Thread ethread = new Thread() { //new Runnable() { public void run() { while ((Thread.currentThread() == this) && !finished) { @@ -3491,7 +3491,7 @@ public class PApplet extends Applet } } }; - thread.start(); + ethread.start(); frame.addComponentListener(new ComponentAdapter() { public void componentMoved(ComponentEvent e) { diff --git a/todo.txt b/todo.txt index 261ae7fce..fc8d36827 100644 --- a/todo.txt +++ b/todo.txt @@ -44,6 +44,11 @@ _ "add library" menu item and submenu _ looks for subfolder called 'libraries' inside p5 folder _ libraries are determined by having a subfolder named 'library' +_ import all libraries into classpath +_ all libs found during sketchbook build + all libs in libraries +_ this means sketchbook menu will need to be rebuilt after lib build +_ append the user's classpath to the end of that + _ add preference for showing library stuff _ make built-in libraries read-only _ libraries: static and non-static init for libs