From 85ae458a00eb3cf1d09fe138d14be41ad7188368 Mon Sep 17 00:00:00 2001 From: lonnen Date: Thu, 16 Sep 2010 16:25:06 +0000 Subject: [PATCH] Doc updates and builder changes. Halved the time it takes for a sketch to build and open. --- .../plugin/core/ProcessingCore.java | 2 +- .../core/ProcessingCorePreferences.java | 4 +- .../plugin/core/builder/SketchBuilder.java | 115 +++++++++++------- .../plugin/ui/ProcessingPlugin.java | 12 +- .../language/ProcessingCodeScanner.java | 4 +- .../ProcessingCompletionProcessor.java | 5 +- .../ProcessingDoubleClickSelector.java | 23 ++-- .../util/ProcessingColorProvider.java | 13 +- .../util/ProcessingWhitespaceDetector.java | 8 ++ .../util/ProcessingWordDetector.java | 9 +- .../ui/wizards/ExportAsAppletWizard.java | 5 - 11 files changed, 104 insertions(+), 96 deletions(-) diff --git a/editor/processing.plugin.core/src/processing/plugin/core/ProcessingCore.java b/editor/processing.plugin.core/src/processing/plugin/core/ProcessingCore.java index 15d51444c..eb35813ef 100644 --- a/editor/processing.plugin.core/src/processing/plugin/core/ProcessingCore.java +++ b/editor/processing.plugin.core/src/processing/plugin/core/ProcessingCore.java @@ -140,7 +140,7 @@ public final class ProcessingCore extends Plugin { public static ProcessingCore getProcessingCore(){ return plugin; } - + /** Returns true if the resource is a Processing file */ public static boolean isProcessingFile(IResource resource){ if (resource.getType() == IResource.FILE) diff --git a/editor/processing.plugin.core/src/processing/plugin/core/ProcessingCorePreferences.java b/editor/processing.plugin.core/src/processing/plugin/core/ProcessingCorePreferences.java index fd1a9c7a0..f35be2560 100644 --- a/editor/processing.plugin.core/src/processing/plugin/core/ProcessingCorePreferences.java +++ b/editor/processing.plugin.core/src/processing/plugin/core/ProcessingCorePreferences.java @@ -1,5 +1,5 @@ /** - * Copyright (c) 2010 Chris Lonnen. All rights reserved. +r * Copyright (c) 2010 Chris Lonnen. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, @@ -25,7 +25,7 @@ import org.osgi.service.prefs.Preferences; public class ProcessingCorePreferences { private static ProcessingCorePreferences current; - + static { current = new ProcessingCorePreferences(); } protected static final String CORE_PREFERENCES = ProcessingCore.PLUGIN_ID + ".preferences"; diff --git a/editor/processing.plugin.core/src/processing/plugin/core/builder/SketchBuilder.java b/editor/processing.plugin.core/src/processing/plugin/core/builder/SketchBuilder.java index 0273a23b3..de98cd5ee 100644 --- a/editor/processing.plugin.core/src/processing/plugin/core/builder/SketchBuilder.java +++ b/editor/processing.plugin.core/src/processing/plugin/core/builder/SketchBuilder.java @@ -22,6 +22,7 @@ import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.IResourceDelta; //import org.eclipse.core.resources.IResourceChangeListener; //import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.IncrementalProjectBuilder; @@ -102,7 +103,7 @@ public class SketchBuilder extends IncrementalProjectBuilder{ // // Further extensions would add flexibility, possibly integrate things // with the JDT more completely. - + /** Full paths to source folders for the JDT */ private ArrayListsrcFolderPathList; @@ -143,19 +144,39 @@ public class SketchBuilder extends IncrementalProjectBuilder{ * */ protected IProject[] build(int kind, Map args, IProgressMonitor monitor) throws CoreException{ - SketchProject sketch = SketchProject.forProject(this.getProject()); - // Eventually we may distinguish between build types. - // switch (kind){ - // case FULL_BUILD: - // return this.fullBuild(sketch, monitor); - // case AUTO_BUILD: - // return this.autoBuild(sketch, monitor); - // case INCREMENTAL_BUILD: - // return this.incrementalBuild(sketch, monitor); - // default: - // return null - // } - return this.fullBuild(sketch, monitor); + IProject project = this.getProject(); + SketchProject sketch = SketchProject.forProject(project); + + switch (kind){ + case FULL_BUILD: + return this.fullBuild(sketch, monitor); + case AUTO_BUILD: + return (fullBuildRequired(project)) ? this.fullBuild(sketch, monitor) : null; +// return this.autoBuild(sketch, monitor); + case INCREMENTAL_BUILD: + return (fullBuildRequired(project)) ? this.fullBuild(sketch, monitor) : null; +// return this.incrementalBuild(sketch, monitor); + default: + return null; + } + } + + /** + * Returns false if the resource change definitely didn't affect this project. + *

+ * Runs simple checks to try and rule out a build. If it can't find a reason + * to rule out a build, it defaults to true. Hopefully this will spare a few + * CPU cycles, though there is a lot of room for improvement here. + */ + private boolean fullBuildRequired(IProject proj) { + if (proj == null) return false; + IResourceDelta delta = this.getDelta(proj); + if (delta == null) return false; + if (delta.getResource().getType() == IResource.PROJECT){ + IProject changedProject = (IProject) delta.getResource(); + if (changedProject != proj) return false; + } + return true; } /** @@ -167,7 +188,7 @@ public class SketchBuilder extends IncrementalProjectBuilder{ */ protected IProject[] fullBuild( SketchProject sketchProject, IProgressMonitor monitor) throws CoreException { clean(sketchProject, monitor); // tabula rasa - + IProject sketch = sketchProject.getProject(); if ( sketch == null || !sketch.isAccessible() ){ ProcessingLog.logError("Sketch is inaccessible. Aborting build process.", null); @@ -189,7 +210,7 @@ public class SketchBuilder extends IncrementalProjectBuilder{ * Get the packages of those jars so they can be added to the imports * Add it to the class path source folders */ - + IFolder codeFolder = sketchProject.getCodeFolder(); // may not exist String[] codeFolderPackages = null; if (codeFolder != null && codeFolder.exists()){ @@ -209,7 +230,7 @@ public class SketchBuilder extends IncrementalProjectBuilder{ * starts and ends in the bigCode file. This information is used later for mapping * errors back to their source. */ - + StringBuffer bigCode = new StringBuffer(); int bigCount = 0; // line count @@ -227,43 +248,43 @@ public class SketchBuilder extends IncrementalProjectBuilder{ monitor.worked(10); if(checkCancel(monitor)) { return null; } // Feed everything to the preprocessor - + PdePreprocessor preproc = new PdePreprocessor(sketch.getName(), 4); PreprocessResult result = null; try{ IFile output = buildFolder.getFile(sketch.getName()+".java"); StringWriter stream = new StringWriter(); - + result = preproc.write(stream, bigCode.toString(), codeFolderPackages); - sketchProject.sketch_width = -1; - sketchProject.sketch_height = -1; - + sketchProject.sketch_width = -1; + sketchProject.sketch_height = -1; + String scrubbed = Utilities.scrubComments(stream.toString()); String[] matches = Utilities.match(scrubbed, Utilities.SIZE_REGEX); if(matches != null){ try { - int wide = Integer.parseInt(matches[1]); - int high = Integer.parseInt(matches[2]); + int wide = Integer.parseInt(matches[1]); + int high = Integer.parseInt(matches[2]); + + if(wide > 0) sketchProject.sketch_width = wide; + if (high > 0) sketchProject.sketch_height = high; + } catch (NumberFormatException e) { + ProcessingLog.logInfo( + "Found a reference to size, but it didn't seem to contain numbers. " + + "Will use default sizes instead." + ); + } + } // else no size() command found, defaults are used - if(wide > 0) sketchProject.sketch_width = wide; - if (high > 0) sketchProject.sketch_height = high; - } catch (NumberFormatException e) { - ProcessingLog.logInfo( - "Found a reference to size, but it didn't seem to contain numbers. " - + "Will use default sizes instead." - ); - } - } // else no size() command found, defaults are used - ByteArrayInputStream inStream = new ByteArrayInputStream(stream.toString().getBytes()); try{ if (!output.exists()){ output.create(inStream, true, monitor); //TODO resource change listener to move trace back JDT errors -// IWorkspace w = ResourcesPlugin.getWorkspace(); -// IResourceChangeListener rcl = new ProblemListener(output); -// w.addResourceChangeListener(rcl); + // IWorkspace w = ResourcesPlugin.getWorkspace(); + // IResourceChangeListener rcl = new ProblemListener(output); + // w.addResourceChangeListener(rcl); } else { output.setContents(inStream, true, false, monitor); } @@ -271,9 +292,9 @@ public class SketchBuilder extends IncrementalProjectBuilder{ stream.close(); inStream.close(); } - + srcFolderPathList.add(buildFolder.getFullPath()); - + } catch(antlr.RecognitionException re){ IResource errorFile = null; // if this remains null, the error is reported back on the sketch itself with no line number @@ -371,7 +392,7 @@ public class SketchBuilder extends IncrementalProjectBuilder{ allFoundLibraries.addAll( Utilities.getLibraryJars(ProcessingCore.getProcessingCore().getCoreLibsFolder()) ); allFoundLibraries.addAll( Utilities.getLibraryJars(Utilities.getSketchBookLibsFolder(sketch)) ); - + HashMap libraryImportToPathTable = new HashMap(); for (String libraryPath : allFoundLibraries ){ @@ -401,27 +422,27 @@ public class SketchBuilder extends IncrementalProjectBuilder{ monitor.worked(10); if(checkCancel(monitor)) { return null; } // Almost there! Set a new classpath using all this stuff we've computed. - + // Even though the list types are specified, Java still tosses errors when I try // to cast them. So instead I'm stuck with explicit iteration. - + IPath[] libPaths = new IPath[libraryJarPathList.size()]; - + int i=0; for(IPath path : libraryJarPathList) libPaths[i++] = path; IPath[] srcPaths = new IPath[srcFolderPathList.size()]; - + i=0; for(IPath path : srcFolderPathList) srcPaths[i++] = path; - + try{ sketchProject.updateClasspathEntries( srcPaths, libPaths); } catch (JavaModelException e) { ProcessingLog.logError("There was a problem setting the compiler class path.", e); return null; // bail ! } - + // everything is cool sketchProject.wasLastBuildSuccessful = true; return null; @@ -448,7 +469,7 @@ public class SketchBuilder extends IncrementalProjectBuilder{ * to a specific file it will be marked against the project and the line will not be marked. */ private void reportProblem(String message, IResource problemFile, int lineNumber, boolean isError){ - + // translate error messages to a friendlier form if (message.equals("expecting RCURLY, found 'null'")) message = "Found one too many { characters without a } to match it."; diff --git a/editor/processing.plugin.ui/src/processing/plugin/ui/ProcessingPlugin.java b/editor/processing.plugin.ui/src/processing/plugin/ui/ProcessingPlugin.java index 1bd6adc51..e332a7709 100644 --- a/editor/processing.plugin.ui/src/processing/plugin/ui/ProcessingPlugin.java +++ b/editor/processing.plugin.ui/src/processing/plugin/ui/ProcessingPlugin.java @@ -91,9 +91,7 @@ public class ProcessingPlugin extends AbstractUIPlugin { * @return a scanner for creating Processing partitions */ public ProcessingPartitionScanner getProcessingPartitionScanner() { - if (fPartitionScanner == null) - fPartitionScanner= new ProcessingPartitionScanner(); - return fPartitionScanner; + return (fPartitionScanner == null) ? new ProcessingPartitionScanner() : fPartitionScanner; } /** @@ -102,9 +100,7 @@ public class ProcessingPlugin extends AbstractUIPlugin { * @return the singleton Processing code scanner */ public RuleBasedScanner getProcessingCodeScanner() { - if (fCodeScanner == null) - fCodeScanner= new ProcessingCodeScanner(getProcessingColorProvider()); - return fCodeScanner; + return (fCodeScanner == null) ? new ProcessingCodeScanner(getProcessingColorProvider()) : fCodeScanner; } /** @@ -113,9 +109,7 @@ public class ProcessingPlugin extends AbstractUIPlugin { * @return the singleton Processing color provider */ public ProcessingColorProvider getProcessingColorProvider() { - if (fColorProvider == null) - fColorProvider= new ProcessingColorProvider(); - return fColorProvider; + return (fColorProvider == null) ? new ProcessingColorProvider() : fColorProvider; } } diff --git a/editor/processing.plugin.ui/src/processing/plugin/ui/processingeditor/language/ProcessingCodeScanner.java b/editor/processing.plugin.ui/src/processing/plugin/ui/processingeditor/language/ProcessingCodeScanner.java index bfc6fd3ee..552a872b6 100644 --- a/editor/processing.plugin.ui/src/processing/plugin/ui/processingeditor/language/ProcessingCodeScanner.java +++ b/editor/processing.plugin.ui/src/processing/plugin/ui/processingeditor/language/ProcessingCodeScanner.java @@ -169,7 +169,7 @@ public class ProcessingCodeScanner extends RuleBasedScanner { wordRule.addWord(fgOperators[i], operator); for (int i= 0; i < fgInvalids.length; i++) wordRule.addWord(fgInvalids[i], invalid); - // Set these as the colorizing rules for the document + // Set these as the coloring rules for the document rules.add(wordRule); IRule[] result= new IRule[rules.size()]; @@ -179,8 +179,6 @@ public class ProcessingCodeScanner extends RuleBasedScanner { /** * Concatenates the keyword arrays into one array and returns it. - * - * @return A string array of all the keywords */ public final static String[] getKeywords(){ String[] result = new String[fgKeywords1.length + fgKeywords2.length + fgKeywords3.length]; diff --git a/editor/processing.plugin.ui/src/processing/plugin/ui/processingeditor/language/ProcessingCompletionProcessor.java b/editor/processing.plugin.ui/src/processing/plugin/ui/processingeditor/language/ProcessingCompletionProcessor.java index f8c3f3d97..90aed9082 100644 --- a/editor/processing.plugin.ui/src/processing/plugin/ui/processingeditor/language/ProcessingCompletionProcessor.java +++ b/editor/processing.plugin.ui/src/processing/plugin/ui/processingeditor/language/ProcessingCompletionProcessor.java @@ -24,10 +24,7 @@ import org.eclipse.jface.text.contentassist.IContextInformationValidator; /** * Naive auto completion provider. *

- * None of this is particularly useful, but may be extended in the future. - * - * - * @author lonnen + * None of this is particularly useful without a language model. */ public class ProcessingCompletionProcessor implements IContentAssistProcessor { diff --git a/editor/processing.plugin.ui/src/processing/plugin/ui/processingeditor/language/ProcessingDoubleClickSelector.java b/editor/processing.plugin.ui/src/processing/plugin/ui/processingeditor/language/ProcessingDoubleClickSelector.java index 960f63462..b89fab715 100644 --- a/editor/processing.plugin.ui/src/processing/plugin/ui/processingeditor/language/ProcessingDoubleClickSelector.java +++ b/editor/processing.plugin.ui/src/processing/plugin/ui/processingeditor/language/ProcessingDoubleClickSelector.java @@ -16,15 +16,12 @@ import org.eclipse.jface.text.ITextDoubleClickStrategy; import org.eclipse.jface.text.ITextViewer; /** - * On a double click, try to automatically highlight a logical section of the source code. + * On a double click, try to automatically highlight a sensible section of the source code. *

* If the double click is near an opening or closing bracket type, this should highlight to * the other bracket in the set. - *

*

* If the user didn't double click a bracket, assume they wanted the word - * - * @author lonnen */ public class ProcessingDoubleClickSelector implements ITextDoubleClickStrategy { @@ -42,20 +39,17 @@ public class ProcessingDoubleClickSelector implements ITextDoubleClickStrategy { /* Method declared on ITextDoubleClickStrategy */ public void doubleClicked(ITextViewer text) { fPos = text.getSelectedRange().x; - - if (fPos < 0) - return; - - fText= text; - - // If a matching bracket wasn't found, assume the user wants the word - if (!selectBracketBlock()) + + if (fPos < 0) return; + + fText = text; + + if (!selectBracketBlock()) // if you can't match brackets, try to grab the word selectWord(); } /** - * Match the brackets at the current selection. - * Return true if successful, false otherwise. + * Tries to find a matching bracket. the brackets at the current selection. * * @return true if brackets match, false otherwise */ @@ -106,7 +100,6 @@ public class ProcessingDoubleClickSelector implements ITextDoubleClickStrategy { } catch (BadLocationException x) { // assume everything is cool } - return false; } diff --git a/editor/processing.plugin.ui/src/processing/plugin/ui/processingeditor/util/ProcessingColorProvider.java b/editor/processing.plugin.ui/src/processing/plugin/ui/processingeditor/util/ProcessingColorProvider.java index b2580d8d9..8c55772a5 100644 --- a/editor/processing.plugin.ui/src/processing/plugin/ui/processingeditor/util/ProcessingColorProvider.java +++ b/editor/processing.plugin.ui/src/processing/plugin/ui/processingeditor/util/ProcessingColorProvider.java @@ -18,7 +18,7 @@ import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.widgets.Display; -/** Manages the colors used in the Java Editor */ +/** Manages the colors used in the Processing Editor */ public class ProcessingColorProvider { public static final RGB COMMENT1= new RGB(126, 126, 126); //comment 1 @@ -34,9 +34,9 @@ public class ProcessingColorProvider { public static final RGB STRING= new RGB(0, 102, 153); public static final RGB DEFAULT= new RGB(0, 0, 0); - protected Map fColorTable= new HashMap(17); + protected Map fColorTable= new HashMap(12); // number of color categories - /** Release all of the color resources held onto by the receiver. */ + /** Release all of the color resources held onto by the receiver. */ public void dispose() { Iterator e= fColorTable.values().iterator(); while (e.hasNext()) @@ -44,10 +44,9 @@ public class ProcessingColorProvider { } /** - * convert an RGB value to a Color using the resource table - * - * @param rgb the RGB value - * @return the color stored in the color table for the given RGB value + * Convert an RGB value to a Color using the resource table. + *

+ * Please note that this is an SWT color, not a Processing color. */ public Color getColor(RGB rgb) { Color color= (Color) fColorTable.get(rgb); diff --git a/editor/processing.plugin.ui/src/processing/plugin/ui/processingeditor/util/ProcessingWhitespaceDetector.java b/editor/processing.plugin.ui/src/processing/plugin/ui/processingeditor/util/ProcessingWhitespaceDetector.java index 635fc3483..d66955bee 100644 --- a/editor/processing.plugin.ui/src/processing/plugin/ui/processingeditor/util/ProcessingWhitespaceDetector.java +++ b/editor/processing.plugin.ui/src/processing/plugin/ui/processingeditor/util/ProcessingWhitespaceDetector.java @@ -12,6 +12,14 @@ package processing.plugin.ui.processingeditor.util; import org.eclipse.jface.text.rules.IWhitespaceDetector; +/** + * Detects Processing whitespace. + *

+ * Processing whitespace is the same as Java whitespace, so this is all + * a big wrapper for Characer.isWhitespace(). The method + * itself is not static because it has to implement the IWhitespaceDetector + * interface. + */ public class ProcessingWhitespaceDetector implements IWhitespaceDetector { public boolean isWhitespace(char character){ diff --git a/editor/processing.plugin.ui/src/processing/plugin/ui/processingeditor/util/ProcessingWordDetector.java b/editor/processing.plugin.ui/src/processing/plugin/ui/processingeditor/util/ProcessingWordDetector.java index 1859e80e1..ead83a036 100644 --- a/editor/processing.plugin.ui/src/processing/plugin/ui/processingeditor/util/ProcessingWordDetector.java +++ b/editor/processing.plugin.ui/src/processing/plugin/ui/processingeditor/util/ProcessingWordDetector.java @@ -13,9 +13,12 @@ package processing.plugin.ui.processingeditor.util; import org.eclipse.jface.text.rules.IWordDetector; /** - * Processing Words are Java words, so this class wraps Character methods to detect - * Java words. JavaDoc for the methods can be found in the IWordDetector interface. - * */ + * Detects Processing words + *

+ * Processing Words are Java words, so this class wraps Character + * methods to detect Java words. The interface prevents these + * from being made static. + */ public class ProcessingWordDetector implements IWordDetector { public boolean isWordPart(char character) { diff --git a/editor/processing.plugin.ui/src/processing/plugin/ui/wizards/ExportAsAppletWizard.java b/editor/processing.plugin.ui/src/processing/plugin/ui/wizards/ExportAsAppletWizard.java index 7eda9f57d..e37a288d3 100644 --- a/editor/processing.plugin.ui/src/processing/plugin/ui/wizards/ExportAsAppletWizard.java +++ b/editor/processing.plugin.ui/src/processing/plugin/ui/wizards/ExportAsAppletWizard.java @@ -10,20 +10,15 @@ */ package processing.plugin.ui.wizards; -import java.util.ArrayList; import java.util.Iterator; -import java.util.List; - import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; -import org.eclipse.jface.dialogs.IDialogSettings; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.wizard.Wizard; import org.eclipse.ui.IExportWizard; import org.eclipse.ui.IWorkbench; import processing.plugin.core.builder.SketchProject; -import processing.plugin.ui.ProcessingPlugin; /** * A wizard to export a Processing sketch project as an applet