From fb34821d84a023ed6fc36e4ab024dd5c0eb157db Mon Sep 17 00:00:00 2001 From: "David A. Mellis" Date: Sun, 9 Apr 2006 12:40:34 +0000 Subject: [PATCH] Libraries now support syntax coloring and are built on IDE startup. --- app/Base.java | 9 +- app/Editor.java | 31 ++- app/Library.java | 482 +++++++++++++++++++++++------------- app/LibraryManager.java | 15 ++ app/Sketch.java | 46 ++-- app/Sketchbook.java | 2 +- app/syntax/PdeKeywords.java | 13 +- 7 files changed, 387 insertions(+), 211 deletions(-) diff --git a/app/Base.java b/app/Base.java index d646e00de..6f5104a0e 100644 --- a/app/Base.java +++ b/app/Base.java @@ -210,6 +210,9 @@ public class Base { // show the window editor.show(); + // attempt to build libraries + editor.prepareLibraries(); + // check for updates if (Preferences.getBoolean("update.check")) { new UpdateCheck(editor); @@ -1075,7 +1078,8 @@ public class Base { } return null; } - + + ////////////////////////////////////////////////////////////// // STRINGS @@ -1229,7 +1233,4 @@ public class Base { return splits; } - - - } diff --git a/app/Editor.java b/app/Editor.java index 02c8008cf..0886223dc 100644 --- a/app/Editor.java +++ b/app/Editor.java @@ -330,6 +330,29 @@ public class Editor extends JFrame // ................................................................... + /** + * Builds any unbuilt buildable libraries + * Adds syntax coloring from those libraries (if exists) + * Rebuilds sketchbook menu with library examples (if they exist) + */ + public void prepareLibraries() { + // build any unbuilt libraries + try { + LibraryManager libraryManager = new LibraryManager(); + libraryManager.buildAllUnbuilt(); + // update syntax coloring table + libraryManager.addSyntaxColoring(new PdeKeywords()); + } catch (RunnerException re) { + message("Error compiling library ..."); + error(re); + } catch (Exception ex) { + ex.printStackTrace(); + } + // update sketchbook menu, this adds examples of any built libs + sketchbook.rebuildMenus(); + } + + // ................................................................... /** * Post-constructor setup for the editor area. Loads the last @@ -666,7 +689,6 @@ public class Editor extends JFrame }); menu.add(item); */ - item = new JMenuItem("Archive Sketch"); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { @@ -738,7 +760,6 @@ public class Editor extends JFrame return menu; } - // taken from an ancient version of processing class SerialMenuListener implements ActionListener { //public SerialMenuListener() { } @@ -751,16 +772,14 @@ public class Editor extends JFrame for (int i = 0; i < count; i++) { ((JCheckBoxMenuItem)serialMenu.getItem(i)).setState(false); } - JCheckBoxMenuItem item = (JCheckBoxMenuItem)e.getSource(); item.setState(true); String name = item.getLabel(); - //System.out.println(item.getLabel()); Preferences.set("serial.port", name); //System.out.println("set to " + get("serial.port")); } - + /* public void actionPerformed(ActionEvent e) { System.out.println(e.getSource()); @@ -840,7 +859,6 @@ public class Editor extends JFrame //serialMenu.add(item); } - protected JMenu buildHelpMenu() { JMenu menu = new JMenu("Help"); JMenuItem item; @@ -1831,6 +1849,7 @@ public class Editor extends JFrame //String what = sketch.isLibrary() ? "Applet" : "Library"; //message("Exporting " + what + "..."); message("Uploading to I/O Board..."); + SwingUtilities.invokeLater(new Runnable() { public void run() { try { diff --git a/app/Library.java b/app/Library.java index 794ea08a2..9b31878cf 100755 --- a/app/Library.java +++ b/app/Library.java @@ -19,6 +19,8 @@ package processing.app; +import processing.app.syntax.*; + import java.io.*; import java.util.*; import java.util.zip.*; @@ -35,6 +37,7 @@ import javax.swing.event.*; public class Library implements MessageConsumer{ private File libFolder; + private File utilityFolder; private LibraryManager libManager; RunnerException exception; @@ -48,10 +51,13 @@ public class Library implements MessageConsumer{ { libFolder = folder; libManager = manager; + utilityFolder = getUtilityFolder(); - /* for debug output + // for debug output + /* System.out.println("library: " + getName()); System.out.println("folder: " + getFolder()); + System.out.println("utility: " + utilityFolder); System.out.println("built: " + isBuilt()); System.out.println("buildable: " + isBuildable()); System.out.println("o files: " + getObjectFiles().length); @@ -85,12 +91,7 @@ public class Library implements MessageConsumer{ */ public boolean isBuilt() { - FileFilter onlyObjectFiles = new FileFilter() { - public boolean accept(File file) { - return file.getName().endsWith(".o"); - } - }; - if(0 < (libFolder.listFiles(onlyObjectFiles)).length){ + if(getObjectFiles().length >= (getCSourceFiles().length + getCPPSourceFiles().length)){ return true; } return false; @@ -98,16 +99,11 @@ public class Library implements MessageConsumer{ /* * Tests if library is buildable - * @return True if library has .cpp files, false otherwise + * @return True if library has source files, false otherwise */ public boolean isBuildable() { - FileFilter onlySourceFiles = new FileFilter() { - public boolean accept(File file) { - return (file.getName()).endsWith(".cpp"); - } - }; - if(0 < (libFolder.listFiles(onlySourceFiles)).length){ + if(0 < (getCSourceFiles().length + getCPPSourceFiles().length)){ return true; } return false; @@ -127,6 +123,29 @@ public class Library implements MessageConsumer{ return false; } + /* + * Scans for library "utility" folder + * @return File object of library's "utility" folder, or null + */ + private File getUtilityFolder() + { + FileFilter filter = new FileFilter() { + public boolean accept(File file) { + if(file.isDirectory()){ + if((file.getName()).equalsIgnoreCase("utility")){ + return true; + } + } + return false; + } + }; + File[] files = libFolder.listFiles(filter); + if(files.length > 0){ + return files[0]; + } + return null; + } + /* * Finds examples folder * @return "examples" folder as file object or null @@ -195,21 +214,33 @@ public class Library implements MessageConsumer{ /* * List of object files for linking - * @return Array of library's object files as File objects + * @return Array of object files as File objects */ - public File[] getObjectFiles() + private File[] getObjectFiles(File folder) { FileFilter onlyObjectFiles = new FileFilter() { public boolean accept(File file) { return (file.getName()).endsWith(".o"); } }; - return libFolder.listFiles(onlyObjectFiles); + return folder.listFiles(onlyObjectFiles); + } + public File[] getObjectFiles() + { + if(null == utilityFolder){ + return getObjectFiles(libFolder); + } + File[] libraryObjects = getObjectFiles(libFolder); + File[] utilityObjects = getObjectFiles(utilityFolder); + File[] objects = new File[libraryObjects.length + utilityObjects.length]; + System.arraycopy(libraryObjects, 0, objects, 0, libraryObjects.length); + System.arraycopy(utilityObjects, 0, objects, libraryObjects.length, utilityObjects.length); + return objects; } /* * List of header source files for inclusion - * @return Array of library's header source files as File objects + * @return Array of header source files as File objects */ public File[] getHeaderFiles() { @@ -222,31 +253,55 @@ public class Library implements MessageConsumer{ } /* - * List of C source files for compiling - * @return Array of library's C source files as File objects + * List of library's C source files for compiling + * @return Array of C source files as File objects */ - private File[] getCSourceFiles() + private File[] getCSourceFiles(File folder) { FileFilter onlyCFiles = new FileFilter() { public boolean accept(File file) { return (file.getName()).endsWith(".c"); } }; - return libFolder.listFiles(onlyCFiles); + return folder.listFiles(onlyCFiles); + } + private File[] getCSourceFiles() + { + if(null == utilityFolder){ + return getCSourceFiles(libFolder); + } + File[] librarySources = getCSourceFiles(libFolder); + File[] utilitySources = getCSourceFiles(utilityFolder); + File[] sources = new File[librarySources.length + utilitySources.length]; + System.arraycopy(librarySources, 0, sources, 0, librarySources.length); + System.arraycopy(utilitySources, 0, sources, librarySources.length, utilitySources.length); + return sources; } /* * List of C++ source files for compiling - * @return Array of library's C++ source files as File objects + * @return Array of C++ source files as File objects */ - private File[] getCPPSourceFiles() + private File[] getCPPSourceFiles(File folder) { FileFilter onlyCPPFiles = new FileFilter() { public boolean accept(File file) { return (file.getName()).endsWith(".cpp"); } }; - return libFolder.listFiles(onlyCPPFiles); + return folder.listFiles(onlyCPPFiles); + } + private File[] getCPPSourceFiles() + { + if(null == utilityFolder){ + return getCPPSourceFiles(libFolder); + } + File[] librarySources = getCPPSourceFiles(libFolder); + File[] utilitySources = getCPPSourceFiles(utilityFolder); + File[] sources = new File[librarySources.length + utilitySources.length]; + System.arraycopy(librarySources, 0, sources, 0, librarySources.length); + System.arraycopy(utilitySources, 0, sources, librarySources.length, utilitySources.length); + return sources; } /* @@ -255,157 +310,170 @@ public class Library implements MessageConsumer{ */ public boolean build() throws RunnerException { - if(isBuildable()){ - String userDir = System.getProperty("user.dir") + File.separator; - - String[] baseCompileCommandC = new String[] { - ((!Base.isMacOS()) ? "tools/avr/bin/avr-gcc" : userDir + "tools/avr/bin/avr-gcc"), - "-c", - "-g", - "-Os", - "-Wall", - "-mmcu=" + Preferences.get("build.mcu"), - "-DF_CPU=" + Preferences.get("build.f_cpu"), - "-I" + libManager.getTarget().getPath(), - "-I" + getFolder(), - }; - - String[] baseCompileCommandCPP = new String[] { - ((!Base.isMacOS()) ? "tools/avr/bin/avr-g++" : userDir + "tools/avr/bin/avr-g++"), - "-c", - "-g", - "-Os", - "-Wall", - "-fno-exceptions", - "-mmcu=" + Preferences.get("build.mcu"), - "-DF_CPU=" + Preferences.get("build.f_cpu"), - "-I" + libManager.getTarget().getPath(), - "-I" + getFolder(), - }; - - // use built lib directories in include paths when searching for headers - // this allows libs to use other libs easily - String[] libDirs = libManager.getFolderPaths(); - String[] compileCommandC = new String[baseCompileCommandC.length + libDirs.length + 2]; - String[] compileCommandCPP = new String[baseCompileCommandCPP.length + libDirs.length + 2]; - System.arraycopy(baseCompileCommandC, 0, compileCommandC, 0, baseCompileCommandC.length); - System.arraycopy(baseCompileCommandCPP, 0, compileCommandCPP, 0, baseCompileCommandCPP.length); - for (int i = 0; i < libDirs.length; ++i) { - compileCommandC[baseCompileCommandC.length + i] = "-I" + libDirs[i]; - compileCommandCPP[baseCompileCommandCPP.length + i] = "-I" + libDirs[i]; - } - - File[] sourcesC = getCSourceFiles(); - File[] sourcesCPP = getCPPSourceFiles(); - - // execute the compiler, and create threads to deal - // with the input and error streams - // - int result = 0; - try { - String nameSansExtension; - Process process; - boolean compiling = true; - - // compile c sources - for(int i = 0; i < sourcesC.length; ++i) { - nameSansExtension = sourcesC[i].getName(); - nameSansExtension = nameSansExtension.substring(0, nameSansExtension.length() - 2); // -2 because ".c" - - compileCommandC[compileCommandC.length - 2] = sourcesC[i].getPath(); - compileCommandC[compileCommandC.length - 1] = "-o" + getFolder() + File.separator + nameSansExtension + ".o"; - - process = Runtime.getRuntime().exec(compileCommandC); - new MessageSiphon(process.getInputStream(), this); - new MessageSiphon(process.getErrorStream(), this); - - // wait for the process to finish. if interrupted - // before waitFor returns, continue waiting - // - compiling = true; - while (compiling) { - try { - result = process.waitFor(); - //System.out.println("result is " + result); - compiling = false; - } catch (InterruptedException ignored) { } - } - if (exception != null) { - exception.hideStackTrace = true; - throw exception; - } - if(result != 0){ - return false; - } - } - - // compile c++ sources - for(int i = 0; i < sourcesCPP.length; ++i) { - nameSansExtension = sourcesCPP[i].getName(); - nameSansExtension = nameSansExtension.substring(0, nameSansExtension.length() - 4); // -4 because ".cpp" - - compileCommandCPP[compileCommandCPP.length - 2] = sourcesCPP[i].getPath(); - compileCommandCPP[compileCommandCPP.length - 1] = "-o" + getFolder() + File.separator + nameSansExtension + ".o"; - - process = Runtime.getRuntime().exec(compileCommandCPP); - new MessageSiphon(process.getInputStream(), this); - new MessageSiphon(process.getErrorStream(), this); - - // wait for the process to finish. if interrupted - // before waitFor returns, continue waiting - // - compiling = true; - while (compiling) { - try { - result = process.waitFor(); - //System.out.println("result is " + result); - compiling = false; - } catch (InterruptedException ignored) { } - } - if (exception != null) { - exception.hideStackTrace = true; - throw exception; - } - if(result != 0){ - return false; - } - } - } catch (Exception e) { - String msg = e.getMessage(); - if ((msg != null) && (msg.indexOf("avr-gcc: not found") != -1)) { - Base.showWarning("Compiler error", - "Could not find the compiler.\n" + - "avr-gcc is missing from your PATH,\n" + - "see readme.txt for help.", null); - return false; - - } else if ((msg != null) && (msg.indexOf("avr-g++: not found") != -1)) { - Base.showWarning("Compiler error", - "Could not find the compiler.\n" + - "avr-g++ is missing from your PATH,\n" + - "see readme.txt for help.", null); - return false; - - } else { - e.printStackTrace(); - result = -1; - } - } - - // an error was queued up by message() - if (exception != null) { - throw exception; - } - - if (result != 0 && result != 1 ) { - Base.openURL(BUGS_URL); - throw new RunnerException(SUPER_BADNESS); - } - - // success would mean that 'result' is set to zero - return (result == 0); // ? true : false; + // fail if library is not buildable (contains no sources) + if(!isBuildable()){ + return false; } - return false; // library is not buildable (contains no sources) + + String userDir = System.getProperty("user.dir") + File.separator; + + String[] baseCompileCommandC = new String[] { + ((!Base.isMacOS()) ? "tools/avr/bin/avr-gcc" : userDir + "tools/avr/bin/avr-gcc"), + "-c", + "-g", + "-Os", + "-Wall", + "-mmcu=" + Preferences.get("build.mcu"), + "-DF_CPU=" + Preferences.get("build.f_cpu"), + "-I" + libManager.getTarget().getPath(), + "-I" + getFolder(), + }; + + String[] baseCompileCommandCPP = new String[] { + ((!Base.isMacOS()) ? "tools/avr/bin/avr-g++" : userDir + "tools/avr/bin/avr-g++"), + "-c", + "-g", + "-Os", + "-Wall", + "-fno-exceptions", + "-mmcu=" + Preferences.get("build.mcu"), + "-DF_CPU=" + Preferences.get("build.f_cpu"), + "-I" + libManager.getTarget().getPath(), + "-I" + getFolder(), + }; + + // use built lib directories in include paths when searching for headers + // this allows libs to use other libs easily + int extraSpots = 2; // two spots for file path and -o portions + utilityFolder = getUtilityFolder(); // refresh status of utility folder + if(null != utilityFolder){ + extraSpots = 3; // an extra spot for utility folder as include + } + String[] libDirs = libManager.getFolderPaths(); + String[] compileCommandC = new String[baseCompileCommandC.length + libDirs.length + extraSpots]; + String[] compileCommandCPP = new String[baseCompileCommandCPP.length + libDirs.length + extraSpots]; + System.arraycopy(baseCompileCommandC, 0, compileCommandC, 0, baseCompileCommandC.length); + System.arraycopy(baseCompileCommandCPP, 0, compileCommandCPP, 0, baseCompileCommandCPP.length); + for (int i = 0; i < libDirs.length; ++i) { + compileCommandC[baseCompileCommandC.length + i] = "-I" + libDirs[i]; + compileCommandCPP[baseCompileCommandCPP.length + i] = "-I" + libDirs[i]; + } + + // add this library's "utility" folder to inclusion paths + if(null != utilityFolder){ + compileCommandC[compileCommandC.length - 3] = "-I" + utilityFolder.getPath(); + compileCommandCPP[compileCommandCPP.length - 3] = "-I" + utilityFolder.getPath(); + } + + File[] sourcesC = getCSourceFiles(); + File[] sourcesCPP = getCPPSourceFiles(); + + // execute the compiler, and create threads to deal + // with the input and error streams + // + int result = 0; + try { + String pathSansExtension; + Process process; + boolean compiling = true; + + // compile c sources + for(int i = 0; i < sourcesC.length; ++i) { + pathSansExtension = sourcesC[i].getPath(); + pathSansExtension = pathSansExtension.substring(0, pathSansExtension.length() - 2); // -2 because ".c" + + compileCommandC[compileCommandC.length - 2] = sourcesC[i].getPath(); + compileCommandC[compileCommandC.length - 1] = "-o" + pathSansExtension + ".o"; + + process = Runtime.getRuntime().exec(compileCommandC); + new MessageSiphon(process.getInputStream(), this); + new MessageSiphon(process.getErrorStream(), this); + + // wait for the process to finish. if interrupted + // before waitFor returns, continue waiting + // + compiling = true; + while (compiling) { + try { + result = process.waitFor(); + //System.out.println("result is " + result); + compiling = false; + } catch (InterruptedException ignored) { } + } + if (exception != null) { + exception.hideStackTrace = true; + throw exception; + } + if(result != 0){ + return false; + } + } + + // compile c++ sources + for(int i = 0; i < sourcesCPP.length; ++i) { + pathSansExtension = sourcesCPP[i].getPath(); + pathSansExtension = pathSansExtension.substring(0, pathSansExtension.length() - 4); // -4 because ".cpp" + + compileCommandCPP[compileCommandCPP.length - 2] = sourcesCPP[i].getPath(); + compileCommandCPP[compileCommandCPP.length - 1] = "-o" + pathSansExtension + ".o"; + + process = Runtime.getRuntime().exec(compileCommandCPP); + new MessageSiphon(process.getInputStream(), this); + new MessageSiphon(process.getErrorStream(), this); + + // wait for the process to finish. if interrupted + // before waitFor returns, continue waiting + // + compiling = true; + while (compiling) { + try { + result = process.waitFor(); + //System.out.println("result is " + result); + compiling = false; + } catch (InterruptedException ignored) { } + } + if (exception != null) { + exception.hideStackTrace = true; + throw exception; + } + if(result != 0){ + return false; + } + } + } catch (Exception e) { + String msg = e.getMessage(); + if ((msg != null) && (msg.indexOf("avr-gcc: not found") != -1)) { + Base.showWarning("Compiler error", + "Could not find the compiler.\n" + + "avr-gcc is missing from your PATH,\n" + + "see readme.txt for help.", null); + return false; + + } else if ((msg != null) && (msg.indexOf("avr-g++: not found") != -1)) { + Base.showWarning("Compiler error", + "Could not find the compiler.\n" + + "avr-g++ is missing from your PATH,\n" + + "see readme.txt for help.", null); + return false; + + } else { + e.printStackTrace(); + result = -1; + } + } + + // an error was queued up by message() + if (exception != null) { + throw exception; + } + + if (result != 0 && result != 1 ) { + Base.openURL(BUGS_URL); + throw new RunnerException(SUPER_BADNESS); + } + + // success would mean that 'result' is set to zero + return (result == 0); // ? true : false; } /** @@ -440,5 +508,69 @@ public class Library implements MessageConsumer{ exception = new RunnerException("Error building library \"" + getName() + "\""); } } + + /** + * Handles loading of keywords file. + * It is recommended that a # sign be used for comments + * inside keywords.txt. + */ + public void addSyntaxColors(PdeKeywords keywords) { + File keywordsFile = new File(libFolder.getPath() + File.separator + "keywords.txt"); + + // do not bother if no keywords file to read + // should reprimand negligent library writers?! + if(!keywordsFile.exists() || !keywordsFile.canRead()){ + return; + } + + try{ + // open file stream in the verbose java way + InputStream input = new FileInputStream(keywordsFile); + InputStreamReader isr = new InputStreamReader(input); + BufferedReader reader = new BufferedReader(isr); + + String line = null; + while ((line = reader.readLine()) != null) { + + // skip empty and whitespace lines + if (line.trim().length() == 0){ + continue; + } + + // skip lines without tabs + if (line.indexOf('\t') == -1){ + continue; + } + + String pieces[] = Base.split(line, '\t'); + + if (pieces.length >= 2) { + String keyword = pieces[0].trim(); + String coloring = pieces[1].trim(); + + if (coloring.length() > 0) { + // text will be KEYWORD or LITERAL + boolean isKey = (coloring.charAt(0) == 'K'); + + // KEYWORD1 -> 0, KEYWORD2 -> 1, etc + int num = coloring.charAt(coloring.length() - 1) - '1'; + + byte id = (byte)((isKey ? Token.KEYWORD1 : Token.LITERAL1) + num); + + //System.out.println("got " + (isKey ? "keyword" : "literal") + (num+1) + " for " + keyword); + + PdeKeywords.getKeywordColoring().add(keyword, id); + } + } + } + + // close file stream + reader.close(); + } catch (Exception e) { + Base.showError("Problem Loading Keywords", + "Could not load or interpret 'keywords.txt' in " + getName() + " library.\n" + + "This must be corrected before distributing.", e); + } + } } diff --git a/app/LibraryManager.java b/app/LibraryManager.java index 94b609123..77c4de426 100755 --- a/app/LibraryManager.java +++ b/app/LibraryManager.java @@ -19,6 +19,8 @@ package processing.app; +import processing.app.syntax.*; + import java.io.*; import java.util.*; import java.util.zip.*; @@ -225,4 +227,17 @@ public class LibraryManager { } } } + + /* + * Add syntax coloring + */ + public void addSyntaxColoring(PdeKeywords keywords) { + Library library; + Collection libraries = getBuiltLibraries(); + Iterator iterator = libraries.iterator(); + while(iterator.hasNext()){ + library = (Library)iterator.next(); + library.addSyntaxColors(keywords); + } + } } diff --git a/app/Sketch.java b/app/Sketch.java index b5e9abe8b..c5ad82eba 100644 --- a/app/Sketch.java +++ b/app/Sketch.java @@ -1125,7 +1125,7 @@ public class Sketch { public void importLibrary(String jarPath) { - System.out.println(jarPath); + //System.out.println(jarPath); // make sure the user didn't hide the sketch folder ensureExistence(); @@ -1340,17 +1340,7 @@ public class Sketch { // build unbuilt buildable libraries // completely independent from sketch, so run all the time - LibraryManager libraryManager; - try { - libraryManager = new LibraryManager(); - libraryManager.buildAllUnbuilt(); - } catch (RunnerException re) { - throw new RunnerException(re.getMessage()); - } catch (Exception ex) { - throw new RunnerException(ex.toString()); - } - // update sketchbook menu, this adds examples of any built libs - editor.sketchbook.rebuildMenus(); + editor.prepareLibraries(); // make sure the user didn't hide the sketch folder ensureExistence(); @@ -1563,19 +1553,27 @@ public class Sketch { importedLibraries = new Vector(); String imports[] = preprocessor.extraImports; - Collection libraries = libraryManager.getAll(); - for (Iterator i = libraries.iterator(); i.hasNext(); ) { - Library library = (Library) i.next(); - File[] headerFiles = library.getHeaderFiles(); - - for (int j = 0; j < headerFiles.length; j++) - for (int k = 0; k < imports.length; k++) - if (headerFiles[j].getName().equals(imports[k]) && - !importedLibraries.contains(library)) { - importedLibraries.add(library); - //System.out.println("Adding library " + library.getName()); - } + try { + LibraryManager libraryManager = new LibraryManager(); + Collection libraries = libraryManager.getAll(); + for (Iterator i = libraries.iterator(); i.hasNext(); ) { + Library library = (Library) i.next(); + File[] headerFiles = library.getHeaderFiles(); + + for (int j = 0; j < headerFiles.length; j++) + for (int k = 0; k < imports.length; k++) + if (headerFiles[j].getName().equals(imports[k]) && + !importedLibraries.contains(library)) { + importedLibraries.add(library); + //System.out.println("Adding library " + library.getName()); + } + } + } catch (IOException e) { + System.err.println("Error finding libraries:"); + e.printStackTrace(); + throw new RunnerException(e.getMessage()); } + //for (int i = 0; i < imports.length; i++) { /* // remove things up to the last dot diff --git a/app/Sketchbook.java b/app/Sketchbook.java index 596d9dbaf..c79096258 100644 --- a/app/Sketchbook.java +++ b/app/Sketchbook.java @@ -346,10 +346,10 @@ public class Sketchbook { if (addLibraries(importMenu, new File(getSketchbookPath()))) { importMenu.addSeparator(); } + */ if (addLibraries(importMenu, examplesFolder)) { importMenu.addSeparator(); } - */ addLibraries(importMenu, librariesFolder); //System.out.println("libraries cp is now " + librariesClassPath); diff --git a/app/syntax/PdeKeywords.java b/app/syntax/PdeKeywords.java index fee06183f..cba279213 100644 --- a/app/syntax/PdeKeywords.java +++ b/app/syntax/PdeKeywords.java @@ -4,7 +4,7 @@ PdeKeywords - handles text coloring and links to html reference Part of the Processing project - http://processing.org - Copyright (c) 2004-05 Ben Fry and Casey Reas + Copyright (c) 2004-06 Ben Fry and Casey Reas Copyright (c) 2001-04 Massachusetts Institute of Technology This program is free software; you can redistribute it and/or modify @@ -68,6 +68,13 @@ public class PdeKeywords extends CTokenMarker { //System.out.println("line is " + line); // in case there's any garbage on the line //if (line.trim().length() == 0) continue; + + // don't bother if line begins with hash + if(0 < line.length()){ + if('#' == line.charAt(0)){ + continue; + } + } String pieces[] = Base.split(line, '\t'); if (pieces.length >= 2) { @@ -119,4 +126,8 @@ public class PdeKeywords extends CTokenMarker { static public String getReference(String keyword) { return (String) keywordToReference.get(keyword); } + + static public KeywordMap getKeywordColoring() { + return keywordColoring; + } }