From 22b04f0c3daa9c44b9ff07dc3ed764022e6ca0f1 Mon Sep 17 00:00:00 2001 From: lonnen Date: Sun, 5 Sep 2010 22:40:50 +0000 Subject: [PATCH] Added sketch launching. Clicking the run button with an open sketch or a sketch folder / file highlighted in the navigator runs an applet just like the PDE, without saving any config. If there are errors, the applet won't load, and errors are reported in the console and Problems view. --- .../Resources/export/application.exe | Bin 0 -> 21602 bytes .../Resources/export/loading.gif | Bin 0 -> 1884 bytes .../Contents/MacOS/JavaApplicationStub | Bin 0 -> 45760 bytes .../Contents/MacOS/JavaApplicationStub64 | Bin 0 -> 14064 bytes .../export/skeleton.app/Contents/PkgInfo | 1 + .../Contents/Resources/sketch.icns | Bin 0 -> 47580 bytes .../Resources/export/template.plist | 75 +++++++ editor/processing.plugin.core/plugin.xml | 2 +- .../plugin/core/ProcessingCore.java | 22 +- .../core/ProcessingCorePreferences.java | 1 + .../plugin/core/builder/SketchBuilder.java | 39 ++++ .../plugin/core/builder/SketchProject.java | 25 ++- .../plugin/core/builder/Utilities.java | 53 ++++- .../ProcessingClasspathProvider.java | 13 -- ...singSketchLaunchConfigurationDelegate.java | 201 +++++++++++++++--- .../processing.plugin.ui/META-INF/MANIFEST.MF | 7 +- .../Resources/16x16_icon.gif | Bin 0 -> 213 bytes editor/processing.plugin.ui/plugin.xml | 38 ++++ .../launching/RunSketchAsAppletShortcut.java | 107 ++++++++++ 19 files changed, 536 insertions(+), 48 deletions(-) create mode 100644 editor/processing.plugin.core/Resources/export/application.exe create mode 100644 editor/processing.plugin.core/Resources/export/loading.gif create mode 100644 editor/processing.plugin.core/Resources/export/skeleton.app/Contents/MacOS/JavaApplicationStub create mode 100644 editor/processing.plugin.core/Resources/export/skeleton.app/Contents/MacOS/JavaApplicationStub64 create mode 100644 editor/processing.plugin.core/Resources/export/skeleton.app/Contents/PkgInfo create mode 100644 editor/processing.plugin.core/Resources/export/skeleton.app/Contents/Resources/sketch.icns create mode 100644 editor/processing.plugin.core/Resources/export/template.plist delete mode 100644 editor/processing.plugin.core/src/processing/plugin/core/launching/ProcessingClasspathProvider.java create mode 100644 editor/processing.plugin.ui/Resources/16x16_icon.gif create mode 100644 editor/processing.plugin.ui/src/processing/plugin/ui/launching/RunSketchAsAppletShortcut.java diff --git a/editor/processing.plugin.core/Resources/export/application.exe b/editor/processing.plugin.core/Resources/export/application.exe new file mode 100644 index 0000000000000000000000000000000000000000..ea70a3a2d91e3a3fcbd3754c9273fe8c93fd2254 GIT binary patch literal 21602 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 H8`u8>AInP` literal 0 HcmV?d00001 diff --git a/editor/processing.plugin.core/Resources/export/skeleton.app/Contents/MacOS/JavaApplicationStub64 b/editor/processing.plugin.core/Resources/export/skeleton.app/Contents/MacOS/JavaApplicationStub64 new file mode 100644 index 0000000000000000000000000000000000000000..a8fbda5e2bef831af3cc1c716d3d4d13bf75ce6e GIT binary patch literal 14064 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 literal 0 HcmV?d00001 diff --git a/editor/processing.plugin.core/Resources/export/skeleton.app/Contents/PkgInfo b/editor/processing.plugin.core/Resources/export/skeleton.app/Contents/PkgInfo new file mode 100644 index 000000000..bd04210fb --- /dev/null +++ b/editor/processing.plugin.core/Resources/export/skeleton.app/Contents/PkgInfo @@ -0,0 +1 @@ +APPL???? \ No newline at end of file diff --git a/editor/processing.plugin.core/Resources/export/skeleton.app/Contents/Resources/sketch.icns b/editor/processing.plugin.core/Resources/export/skeleton.app/Contents/Resources/sketch.icns new file mode 100644 index 0000000000000000000000000000000000000000..8ffb8d7dee4eb6918f150703418e4bb1bbc51c2d GIT binary patch literal 47580 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 pCQqP}g{R{Y)0{^%KMwjoebyzpw7-{{dU2nKb|a literal 0 HcmV?d00001 diff --git a/editor/processing.plugin.core/Resources/export/template.plist b/editor/processing.plugin.core/Resources/export/template.plist new file mode 100644 index 000000000..fb10ceb70 --- /dev/null +++ b/editor/processing.plugin.core/Resources/export/template.plist @@ -0,0 +1,75 @@ + + + + + CFBundleName + @@sketch@@ + CFBundleVersion + 1.0 + CFBundleAllowMixedLocalizations + true + CFBundleExecutable + JavaApplicationStub + CFBundleDevelopmentRegion + English + CFBundlePackageType + APPL + CFBundleSignature + ???? + CFBundleInfoDictionaryVersion + 6.0 + CFBundleIconFile + sketch.icns + CFBundleIdentifier + @@sketch@@ + + + LSUIPresentationMode + @@lsuipresentationmode@@ + + + LSArchitecturePriority + + i386 + ppc + + + Java + + VMOptions + @@vmoptions@@ + MainClass + @@sketch@@ + JVMVersion + 1.5* + JVMArchs + + i386 + ppc + + ClassPath + @@classpath@@ + + + Properties + + apple.laf.useScreenMenuBar + true + apple.awt.showGrowBox + false + com.apple.smallTabs + true + apple.awt.Antialiasing + false + apple.awt.TextAntialiasing + true + com.apple.hwaccel + true + apple.awt.use-file-dialog-packages + false + + + + diff --git a/editor/processing.plugin.core/plugin.xml b/editor/processing.plugin.core/plugin.xml index bc5743ca8..31f74a2c7 100644 --- a/editor/processing.plugin.core/plugin.xml +++ b/editor/processing.plugin.core/plugin.xml @@ -45,7 +45,7 @@ delegate="processing.plugin.core.launching.ProcessingSketchLaunchConfigurationDelegate" id="processing.plugin.core.launching.processingSketch" modes="run" - name="Processing Sketch"> + name="Processing Sketch Applet"> 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 438843f6d..2ef8d8a6b 100644 --- a/editor/processing.plugin.core/src/processing/plugin/core/ProcessingCore.java +++ b/editor/processing.plugin.core/src/processing/plugin/core/ProcessingCore.java @@ -22,6 +22,7 @@ import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.FileLocator; +import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Plugin; import processing.plugin.core.builder.Utilities; @@ -75,19 +76,30 @@ public final class ProcessingCore extends Plugin { /* public void start(BundleContext context) throws Exception {} */ /* public void stop(BundleContext context) throws Exception {} */ - /** * Gets a URL to a file or folder in the plug-in's Resources folder. - * Returns null if something went wrong. + * Returns null if the path results in a bad URL. + * + * @param path relative path from the Resources folder */ - public URL getPluginResource(String fileName){ + public URL getPluginResource(String path){ try{ - return new URL(this.getBundle().getEntry("/"), "Resources/" + fileName); + return new URL(this.getBundle().getEntry("/"), "Resources/" + path); } catch (MalformedURLException e){ return null; } } + /** + * Returns a URL to a file or folder in the plug-in's Resources folder. + * Returns null if the path results in a bad URL. + * + * @param path relative from the Resources folder + */ + public URL getPluginResource(IPath path){ + return getPluginResource(path.toOSString()); + } + /** * Resolves the plug-in resources folder to a File and returns it. This will include the * Processing libraries and the core libraries folder. @@ -95,7 +107,7 @@ public final class ProcessingCore extends Plugin { * @return File reference to the core resources */ public File getPluginResourceFolder(){ - URL fileLocation = ProcessingCore.getProcessingCore().getPluginResource(""); + URL fileLocation = getPluginResource(""); try { File folder = new File(FileLocator.toFileURL(fileLocation).getPath()); if (folder.exists()) 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 5394fff45..ea2db1558 100644 --- a/editor/processing.plugin.core/src/processing/plugin/core/ProcessingCorePreferences.java +++ b/editor/processing.plugin.core/src/processing/plugin/core/ProcessingCorePreferences.java @@ -19,6 +19,7 @@ import org.eclipse.core.runtime.Preferences; * be done by preferences pages in processing.plugin.ui plug-in, but * may be programatically accessed in the case of headless operation. */ +@SuppressWarnings("deprecation") public class ProcessingCorePreferences { private static ProcessingCorePreferences current; 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 664c68f2e..9ca08f661 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 @@ -226,6 +226,45 @@ public class SketchBuilder extends IncrementalProjectBuilder{ StringWriter stream = new StringWriter(); result = preproc.write(stream, bigCode.toString(), codeFolderPackages); + + 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]); + + if (high > 0){ + SketchProject.sketch_height = high; + } else { + SketchProject.sketch_height = -1; + } + if( wide > 0) { + SketchProject.sketch_width = wide; + } else { + SketchProject.sketch_width = -1; + } + + } 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.\n" + +// "Use only numeric values (not variables) for the size()\n" + +// "command. See the size() reference for an explanation."; + + // set these back to null + SketchProject.sketch_height = -1; + SketchProject.sketch_width = -1; + + ProcessingLog.logInfo("Could not find applet size"); + } + } // else no size() command found + ByteArrayInputStream inStream = new ByteArrayInputStream(stream.toString().getBytes()); try{ if (!output.exists()){ diff --git a/editor/processing.plugin.core/src/processing/plugin/core/builder/SketchProject.java b/editor/processing.plugin.core/src/processing/plugin/core/builder/SketchProject.java index bbc3444e3..40f2fd284 100644 --- a/editor/processing.plugin.core/src/processing/plugin/core/builder/SketchProject.java +++ b/editor/processing.plugin.core/src/processing/plugin/core/builder/SketchProject.java @@ -29,12 +29,19 @@ import processing.plugin.core.ProcessingLog; public class SketchProject implements IProjectNature { - /** value: "processing.plugin.core.processingnature" */ + /** value: "processing.plugin.core.sketchNature" */ public static final String NATURE_ID = ProcessingCore.PLUGIN_ID + ".sketchNature"; /** The basic project entry being managed */ protected IProject project; + // TODO make these a preference + public static final int DEFAULT_WIDTH = 100; + public static final int DEFAULT_HEIGHT = 100; + + // set every build + protected static int sketch_width = -1; + protected static int sketch_height = -1; /** * Return the SketchProject associated with the given IProject, or null @@ -434,4 +441,20 @@ public class SketchProject implements IProjectNature { JavaCore.setOptions(options); } + + /** Return the sketch's height, or the default height if size() has not been specified */ + public int getHeight() { + return (sketch_height == -1) ? DEFAULT_HEIGHT : sketch_height; + } + + /** Return the sketch's width, or the default width if size() has not been specified */ + public int getWidth(){ + return (sketch_width == -1) ? DEFAULT_WIDTH : sketch_width; + } + + /** Returns the name of the main type of the compiled sketch*/ + public String getMainType() { + return project.getName(); + } + } \ No newline at end of file diff --git a/editor/processing.plugin.core/src/processing/plugin/core/builder/Utilities.java b/editor/processing.plugin.core/src/processing/plugin/core/builder/Utilities.java index abcaf487d..bfc6e6815 100644 --- a/editor/processing.plugin.core/src/processing/plugin/core/builder/Utilities.java +++ b/editor/processing.plugin.core/src/processing/plugin/core/builder/Utilities.java @@ -18,6 +18,7 @@ import java.util.zip.ZipFile; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.IPath; + import processing.plugin.core.ProcessingCore; import processing.plugin.core.ProcessingCorePreferences; import processing.plugin.core.ProcessingLog; @@ -37,7 +38,9 @@ import processing.plugin.core.ProcessingLog; public class Utilities { public static final String PACKAGE_REGEX = "(?:^|\\s|;)package\\s+(\\S+)\\;"; - + public static final String SIZE_REGEX = + "(?:^|\\s|;)size\\s*\\(\\s*(\\S+)\\s*,\\s*([^\\s,\\)]+),?\\s*([^\\)]*)\\s*\\)\\s*\\;"; + /** * Read in a file and return it as a string * @@ -496,5 +499,53 @@ public class Utilities { } } } + + static public String scrubComments(String what) { + char p[] = what.toCharArray(); + + int index = 0; + while (index < p.length) { + // for any double slash comments, ignore until the end of the line + if ((p[index] == '/') && + (index < p.length - 1) && + (p[index+1] == '/')) { + p[index++] = ' '; + p[index++] = ' '; + while ((index < p.length) && + (p[index] != '\n')) { + p[index++] = ' '; + } + + // check to see if this is the start of a new multiline comment. + // if it is, then make sure it's actually terminated somewhere. + } else if ((p[index] == '/') && + (index < p.length - 1) && + (p[index+1] == '*')) { + p[index++] = ' '; + p[index++] = ' '; + boolean endOfRainbow = false; + while (index < p.length - 1) { + if ((p[index] == '*') && (p[index+1] == '/')) { + p[index++] = ' '; + p[index++] = ' '; + endOfRainbow = true; + break; + + } else { + // continue blanking this area + p[index++] = ' '; + } + } + if (!endOfRainbow) { + throw new RuntimeException("Missing the */ from the end of a " + + "/* comment */"); + } + } else { // any old character, move along + index++; + } + } + return new String(p); + } + } diff --git a/editor/processing.plugin.core/src/processing/plugin/core/launching/ProcessingClasspathProvider.java b/editor/processing.plugin.core/src/processing/plugin/core/launching/ProcessingClasspathProvider.java deleted file mode 100644 index fd04cfda9..000000000 --- a/editor/processing.plugin.core/src/processing/plugin/core/launching/ProcessingClasspathProvider.java +++ /dev/null @@ -1,13 +0,0 @@ -package processing.plugin.core.launching; - -import org.eclipse.debug.core.ILaunchConfiguration; -import org.eclipse.jdt.launching.IRuntimeClasspathEntry; -import org.eclipse.jdt.launching.StandardClasspathProvider; - -public class ProcessingClasspathProvider extends StandardClasspathProvider{ - - public IRuntimeClasspathEntry[] computeUnresolvedClasspath(ILaunchConfiguration configuration) { - return null; - } - -} diff --git a/editor/processing.plugin.core/src/processing/plugin/core/launching/ProcessingSketchLaunchConfigurationDelegate.java b/editor/processing.plugin.core/src/processing/plugin/core/launching/ProcessingSketchLaunchConfigurationDelegate.java index 8d099682c..2881d9451 100644 --- a/editor/processing.plugin.core/src/processing/plugin/core/launching/ProcessingSketchLaunchConfigurationDelegate.java +++ b/editor/processing.plugin.core/src/processing/plugin/core/launching/ProcessingSketchLaunchConfigurationDelegate.java @@ -1,34 +1,65 @@ +/******************************************************************************* + * This program and the accompanying materials are made available under the + * terms of the Common Public License v1.0 which accompanies this distribution, + * and is available at http://www.opensource.org/licenses/cpl1.0.php + * + * Contributors: + * IBM Corporation - initial API and implementation + * Chris Lonnen - adaptation for Processing + *******************************************************************************/ package processing.plugin.core.launching; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.util.HashMap; +import java.util.Iterator; import java.util.Map; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.debug.core.IDebugEventSetListener; import org.eclipse.debug.core.ILaunch; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.ILaunchManager; - import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants; -import org.eclipse.jdt.launching.IRuntimeClasspathEntry; -import org.eclipse.jdt.launching.IVMInstall; import org.eclipse.jdt.launching.JavaLaunchDelegate; import org.eclipse.jdt.launching.JavaRuntime; /** * The launch configuration delegate for Processing Sketches. It is really a customized Java * launch configuration delegate, as Processing Sketches are compiled down and ultimately run - * as Java applications (shhh! dont tell anyone) + * as Java applications (shhh! don't tell anyone). */ -public class ProcessingSketchLaunchConfigurationDelegate extends JavaLaunchDelegate { - - public void launch(ILaunchConfiguration configuration, String mode, ILaunch launch, IProgressMonitor monitor) throws CoreException { - String workingDirectory = configuration.getAttribute(IJavaLaunchConfigurationConstants.ATTR_WORKING_DIRECTORY, ""); - launch.setAttribute(IJavaLaunchConfigurationConstants.ATTR_WORKING_DIRECTORY, workingDirectory); - super.launch(configuration, mode, launch, monitor); - } +public class ProcessingSketchLaunchConfigurationDelegate extends JavaLaunchDelegate implements IDebugEventSetListener { /** - * If this is being started in run mode return true, otherwise return false to indicate it shouldn't be run + * Maps ILaunch objects to File objects that represent the .html file initiating the + * applet launch. This is used to delete the .html file when the launch terminates. + */ + private static Map fgLaunchToFileMap = new HashMap(); + + /** Used to map temp file to launch object. */ + private ILaunch fLaunch; + + /* (non-Javadoc) Makes sure to cleanup the leftovers if things break. */ + public synchronized void launch(ILaunchConfiguration configuration, String mode, ILaunch launch, IProgressMonitor monitor) throws CoreException { + try{ + fLaunch = launch; + super.launch(configuration, mode, launch, monitor); + } catch (CoreException e){ + cleanup(launch); + throw e; + } + fLaunch = null; + } + + /** + * Called first in the launch sequence. Checks to make sure this launcher is being executed + * in run mode, and returns true to indicate that things can proceed. If it is being executed + * in debug mode or some other unsupported mode, return false to abort the launch. */ public boolean preLaunchCheck(ILaunchConfiguration configuration, String mode, IProgressMonitor monitor) throws CoreException { if(mode.equals(ILaunchManager.RUN_MODE)){ @@ -36,21 +67,141 @@ public class ProcessingSketchLaunchConfigurationDelegate extends JavaLaunchDeleg } return false; } - - /** Returns the default VMInstall object. */ - public IVMInstall getVMInstall(ILaunchConfiguration configuration) throws CoreException { - return JavaRuntime.getDefaultVMInstall(); + + // public String getJavaPolicyFile() ?? + + /** Clean up the temp files and listeners after a launch */ + public void cleanup(ILaunch launch){ + File temp = (File) fgLaunchToFileMap.get(launch); + if (temp != null){ + try { + fgLaunchToFileMap.remove(launch); + temp.delete(); + } finally { + // unregister any listeners? there shouldn't be any + // because we don't support debugging + } + } + + } + + // URL fileLocation = ProcessingCore.getProcessingCore().getPluginResource(""); + // try { + // File folder = new File(FileLocator.toFileURL(fileLocation).getPath()); + // if (folder.exists()) + // return folder; + // } catch (Exception e) { + // ProcessingLog.logError(e); + // } + + public File buildHTMLFile(ILaunchConfiguration configuration, File dir) { + FileWriter writer = null; + File tempFile = null; + try { + String name = getAppletMainTypeName(configuration); + tempFile = new File(dir, name + System.currentTimeMillis() + ".html"); //$NON-NLS-1$ + writer = new FileWriter(tempFile); + writer.write("\n"); + writer.write("\n"); + writer.write("\n"); + Map parameters = configuration.getAttribute(IJavaLaunchConfigurationConstants.ATTR_APPLET_PARAMETERS, new HashMap()); + if (parameters.size() != 0) { + Iterator iterator= parameters.entrySet().iterator(); + while(iterator.hasNext()) { + Map.Entry next = (Map.Entry) iterator.next(); + writer.write("\n"); + } + } + writer.write("\n"); + writer.write("\n"); + writer.write("\n"); + } catch(IOException e) { + } catch(CoreException e) { + } finally { + if (writer != null) { + try { + writer.close(); + } catch(IOException e) { + } + } + } + + return tempFile; } - public Map getVMSpecificAttributesMap(ILaunchConfiguration configuration) throws CoreException{ - return null; + public String getQuotedString(String string) { + if (string.indexOf('"') == -1) { + return '"' + string + '"'; + } + return '\'' + string + '\''; } - - public String[] getClassPath(ILaunchConfiguration configuration) throws CoreException{ - IRuntimeClasspathEntry[] entries = new ProcessingClasspathProvider().computeUnresolvedClasspath(configuration); - //TODO pickup here http://www.eclipse.org/articles/Article-Launch-Framework/launch.html - return null; + + + /* @see org.eclipse.jdt.launching.AbstractJavaLaunchConfigurationDelegate#getProgramArguments(org.eclipse.debug.core.ILaunchConfiguration) */ + public String getProgramArguments(ILaunchConfiguration configuration) throws CoreException{ + File workingDir = verifyWorkingDirectory(configuration); + File htmlFile = buildHTMLFile(configuration, workingDir); + if(htmlFile == null){ + abort("Could not build HTML for applet launch.", null, IJavaLaunchConfigurationConstants.ERR_COULD_NOT_BUILD_HTML); + } + // add a mapping of the launch to the html file + fgLaunchToFileMap.put(fLaunch, htmlFile); + return htmlFile.getName(); } - - + + // Uncomment if we end up using javaPolicyFile + // public String getVMArguments(ILaunchConfiguration configuration) throws CoreException { + // StringBuffer arguments = new StringBuffer(super.getVMArguments(configuration)); + // File workingDir = verifyWorkingDirectory(configuration); + // String javaPolicyFile = getJavaPolicyFile(workingDir); + // arguments.append(javaPolicyFile); + // return arguments.toString(); + // } + + + public String getMainTypeName(ILaunchConfiguration configuration) throws CoreException{ + return configuration.getAttribute(IJavaLaunchConfigurationConstants.ATTR_APPLET_APPLETVIEWER_CLASS, IJavaLaunchConfigurationConstants.DEFAULT_APPLETVIEWER_CLASS); + } + + /** + * Returns the applet's main type name. + * + * @param configuration + * @throws CoreException + */ + public String getAppletMainTypeName(ILaunchConfiguration configuration) throws CoreException{ + return super.getMainTypeName(configuration); + } + + /* @see org.eclipse.jdt.launching.AbstractJavaLaunchConfigurationDelegate#getDefaultWorkingDirectory(org.eclipse.debug.core.ILaunchConfiguration) */ + public File getDefaultWorkingDirectory(ILaunchConfiguration configuration) throws CoreException{ + // default working dir for applets is the project's output directory + String outputDir = JavaRuntime.getProjectOutputDirectory(configuration); + if (outputDir == null) { + // if no project attribute, default to eclipse directory + return new File(System.getProperty("user.dir")); + } + IResource resource = ResourcesPlugin.getWorkspace().getRoot().findMember(outputDir); + if (resource == null || !resource.exists()) { + //default to eclipse directory + return new File(System.getProperty("user.dir")); + } + return resource.getLocation().toFile(); + } + } diff --git a/editor/processing.plugin.ui/META-INF/MANIFEST.MF b/editor/processing.plugin.ui/META-INF/MANIFEST.MF index f5c5b2b0a..ce1279e3f 100644 --- a/editor/processing.plugin.ui/META-INF/MANIFEST.MF +++ b/editor/processing.plugin.ui/META-INF/MANIFEST.MF @@ -12,8 +12,11 @@ Require-Bundle: org.eclipse.ui, org.eclipse.jface.text;bundle-version="3.6.0", org.eclipse.ui.editors;bundle-version="3.6.0", org.eclipse.core.resources;bundle-version="3.6.0", - processing.plugin.core;bundle-version="0.1.0" - + processing.plugin.core;bundle-version="0.1.0", + org.eclipse.debug.ui, + org.eclipse.jdt.launching;bundle-version="3.5.100", + org.eclipse.ui.ide;bundle-version="3.6.0", + org.eclipse.jdt.core;bundle-version="3.6.0" Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Bundle-ActivationPolicy: lazy Import-Package: org.eclipse.ui.actions diff --git a/editor/processing.plugin.ui/Resources/16x16_icon.gif b/editor/processing.plugin.ui/Resources/16x16_icon.gif new file mode 100644 index 0000000000000000000000000000000000000000..76a462f44d7d2b559fc2eeb65a0885e6bbf4ba23 GIT binary patch literal 213 zcmZ?wbhEHb6krfwIKlt{jSP(p42_K-0!#s!2M-=(VE7M&4FCUw2rva^LiG?yDgI>P zWB^*F15yvNlYuozfrU3EQtr4yALC6v$DB=tx!0HeePhjYV#6(GafUxJPK!Re>M*t0 zr(NPSRjR+b{NgKPyKM|CJ6P)!&OIu;z@4`}>CLxkd;V^EyMJQM{#`$rl@uAQ0a2(w A^8f$< literal 0 HcmV?d00001 diff --git a/editor/processing.plugin.ui/plugin.xml b/editor/processing.plugin.ui/plugin.xml index fb5c326b8..13efb4e57 100644 --- a/editor/processing.plugin.ui/plugin.xml +++ b/editor/processing.plugin.ui/plugin.xml @@ -43,5 +43,43 @@ + + + + Hides the generated folder and its contents from the UI. + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/editor/processing.plugin.ui/src/processing/plugin/ui/launching/RunSketchAsAppletShortcut.java b/editor/processing.plugin.ui/src/processing/plugin/ui/launching/RunSketchAsAppletShortcut.java new file mode 100644 index 000000000..164d39fce --- /dev/null +++ b/editor/processing.plugin.ui/src/processing/plugin/ui/launching/RunSketchAsAppletShortcut.java @@ -0,0 +1,107 @@ +/******************************************************************************* + * This program and the accompanying materials are made available under the + * terms of the Common Public License v1.0 which accompanies this distribution, + * and is available at http://www.opensource.org/licenses/cpl1.0.php + * + * Contributors: + * IBM Corporation - initial API + * Chris Lonnen - implementation for Processing + *******************************************************************************/ +package processing.plugin.ui.launching; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.debug.core.DebugPlugin; +import org.eclipse.debug.core.ILaunchConfiguration; +import org.eclipse.debug.core.ILaunchConfigurationType; +import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; +import org.eclipse.debug.core.ILaunchManager; +import org.eclipse.debug.ui.DebugUITools; +import org.eclipse.debug.ui.ILaunchShortcut; +import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.ui.IEditorPart; +import org.eclipse.ui.ide.ResourceUtil; + +import processing.plugin.core.builder.SketchProject; +import processing.plugin.ui.ProcessingLog; + +public class RunSketchAsAppletShortcut implements ILaunchShortcut { + + protected ILaunchConfiguration createConfiguration(IProject project){ + if (project == null) return null; + SketchProject sketch = SketchProject.forProject(project); + ILaunchConfiguration config = null; + try{ + ILaunchConfigurationType configType = getConfigurationType(); + ILaunchConfigurationWorkingCopy wc = configType.newInstance(null, project.getName()); + wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME, sketch.getMainType()); + wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, project.getName()); + wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_APPLET_WIDTH, sketch.getWidth()); + wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_APPLET_HEIGHT, sketch.getHeight()); + wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_APPLET_NAME, "Processing Sketch"); + wc.setMappedResources(new IResource[] { sketch.getJavaProject().getUnderlyingResource() }); +// config =wc.doSave(); + config = wc; // this prevents a run config from being saved and sticking around. + } catch (CoreException ce) { + ProcessingLog.logError(ce); + } + return config; + } + + protected ILaunchConfigurationType getConfigurationType(){ + ILaunchManager lm = DebugPlugin.getDefault().getLaunchManager(); + return lm.getLaunchConfigurationType(IJavaLaunchConfigurationConstants.ID_JAVA_APPLET); + } + + public void launch(ISelection selection, String mode) { + if (selection instanceof IStructuredSelection) { + Object element = ((IStructuredSelection)selection).getFirstElement(); + + if (element instanceof IResource){ + IProject proj = ((IResource)element).getProject(); + try{ + if (proj.hasNature("processing.plugin.core.sketchNature")){ + launch(createConfiguration(proj), mode); + } else { + ProcessingLog.logInfo("Sketch could not be launched. The selected project does not have the required Sketch nature."); + } + } catch (CoreException e){ + ProcessingLog.logError("Launch aborted.", e); + } + } else { + ProcessingLog.logInfo("Sketch could not be launched. Launcher was provided with a non-resource selection."); + } + } + } + + // have to implement. log a warning. + // there isn't a great way to launch this without a model + public void launch(IEditorPart editor, String mode) { + IFile file = ResourceUtil.getFile(editor.getEditorInput()); + if(file != null){ + IProject proj = file.getProject(); + try{ + if (proj.hasNature("processing.plugin.core.sketchNature")){ + launch(createConfiguration(proj), mode); + } else { + ProcessingLog.logInfo("Sketch could not be launched. The editor contains a file that is not part of a project with a Sketch nature."); + } + } catch (CoreException e){ + ProcessingLog.logError("Launch aborted.", e); + } + } else { + ProcessingLog.logInfo("Launch aborted. Editor contents are not part of a Sketch Project in the workspace"); + } + } + + private void launch(ILaunchConfiguration config, String mode) { + if (config != null) + DebugUITools.launch(config, mode); + } + + +}