From 0063898d34ab468d06cf1dd4f9bfa5da0026ab7f Mon Sep 17 00:00:00 2001 From: ricardojlrufino Date: Wed, 21 Jan 2015 14:08:57 -0300 Subject: [PATCH 01/25] refactoring of Sketck class and creation of BaseSketck class allowing access to Sketck information in the package 'core' --- app/src/processing/app/Sketch.java | 287 +-------- .../src/processing/app/BaseSketch.java | 576 ++++++++++++++++++ 2 files changed, 579 insertions(+), 284 deletions(-) create mode 100755 arduino-core/src/processing/app/BaseSketch.java diff --git a/app/src/processing/app/Sketch.java b/app/src/processing/app/Sketch.java index 8a32717f712..2286d94bdf2 100644 --- a/app/src/processing/app/Sketch.java +++ b/app/src/processing/app/Sketch.java @@ -42,21 +42,13 @@ /** * Stores information about files in the current sketch */ -public class Sketch { - static private File tempBuildFolder; +public class Sketch extends BaseSketch { + static private File tempBuildFolder; + private Editor editor; - /** true if any of the files have been modified. */ - private boolean modified; - private SketchCodeDocument current; - private int currentIndex; - - private SketchData data; - - /** Class name for the PApplet, as determined by the preprocessor. */ - private String appletClassName; /** * path is location of the main .pde file, because this is also @@ -485,25 +477,6 @@ public void handleDeleteCode() { } } - - /** - * Move to the previous tab. - */ - public void handlePrevCode() { - int prev = currentIndex - 1; - if (prev < 0) prev = data.getCodeCount()-1; - setCurrentCode(prev); - } - - - /** - * Move to the next tab. - */ - public void handleNextCode() { - setCurrentCode((currentIndex + 1) % data.getCodeCount()); - } - - /** * Sets the modified value for the code in the frontmost tab. */ @@ -533,10 +506,6 @@ protected void calcModified() { } - public boolean isModified() { - return modified; - } - /** * Save all code in the current sketch. @@ -607,19 +576,6 @@ public boolean accept(File dir, String name) { } - protected boolean renameCodeToInoExtension(File pdeFile) { - for (SketchCode c : data.getCodes()) { - if (!c.getFile().equals(pdeFile)) - continue; - - String pdeName = pdeFile.getPath(); - pdeName = pdeName.substring(0, pdeName.length() - 4) + ".ino"; - return c.renameTo(new File(pdeName)); - } - return false; - } - - /** * Handles 'Save As' for a sketch. *

@@ -930,10 +886,6 @@ public boolean addFile(File sourceFile) { } - public void importLibrary(Library lib) throws IOException { - importLibrary(lib.getSrcFolder()); - } - /** * Add import statements to the current tab for all of packages inside * the specified jar file. @@ -998,19 +950,6 @@ public void setCurrentCode(int which) { } - /** - * Internal helper function to set the current tab based on a name. - * @param findName the file name (not pretty name) to be shown - */ - protected void setCurrentCode(String findName) { - for (SketchCode code : data.getCodes()) { - if (findName.equals(code.getFileName()) || - findName.equals(code.getPrettyName())) { - setCurrentCode(data.indexOfCode(code)); - return; - } - } - } /** @@ -1234,207 +1173,10 @@ protected boolean upload(String buildPath, String suggestedClassName, boolean us } - public boolean exportApplicationPrompt() throws IOException, RunnerException { - return false; - } - - - /** - * Export to application via GUI. - */ - protected boolean exportApplication() throws IOException, RunnerException { - return false; - } - - - /** - * Export to application without GUI. - */ - public boolean exportApplication(String destPath, - int exportPlatform) throws IOException, RunnerException { - return false; - } - - - /** - * Make sure the sketch hasn't been moved or deleted by some - * nefarious user. If they did, try to re-create it and save. - * Only checks to see if the main folder is still around, - * but not its contents. - */ - protected void ensureExistence() { - if (data.getFolder().exists()) return; - - Base.showWarning(_("Sketch Disappeared"), - _("The sketch folder has disappeared.\n " + - "Will attempt to re-save in the same location,\n" + - "but anything besides the code will be lost."), null); - try { - data.getFolder().mkdirs(); - modified = true; - - for (SketchCode code : data.getCodes()) { - code.save(); // this will force a save - } - calcModified(); - - } catch (Exception e) { - Base.showWarning(_("Could not re-save sketch"), - _("Could not properly re-save the sketch. " + - "You may be in trouble at this point,\n" + - "and it might be time to copy and paste " + - "your code to another text editor."), e); - } - } - - - /** - * Returns true if this is a read-only sketch. Used for the - * examples directory, or when sketches are loaded from read-only - * volumes or folders without appropriate permissions. - */ - public boolean isReadOnly() { - String apath = data.getFolder().getAbsolutePath(); - for (File folder : Base.getLibrariesPath()) { - if (apath.startsWith(folder.getAbsolutePath())) - return true; - } - if (apath.startsWith(Base.getExamplesPath()) || - apath.startsWith(Base.getSketchbookLibrariesPath())) { - return true; - } - - // canWrite() doesn't work on directories - // } else if (!folder.canWrite()) { - - // check to see if each modified code file can be written to - for (SketchCode code : data.getCodes()) { - if (code.isModified() && code.fileReadOnly() && code.fileExists()) { - // System.err.println("found a read-only file " + code[i].file); - return true; - } - } - return false; - } - - // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . - - // Breaking out extension types in order to clean up the code, and make it - // easier for other environments (like Arduino) to incorporate changes. - - /** - * True if the specified code has the default file extension. - */ - public boolean hasDefaultExtension(SketchCode code) { - return code.isExtension(getDefaultExtension()); - } - - - /** - * True if the specified extension is the default file extension. - */ - public boolean isDefaultExtension(String what) { - return what.equals(getDefaultExtension()); - } - - - /** - * Check this extension (no dots, please) against the list of valid - * extensions. - */ - public boolean validExtension(String what) { - return data.getExtensions().contains(what); - } - - - /** - * Returns the default extension for this editor setup. - */ - public String getDefaultExtension() { - return data.getDefaultExtension(); - } - - static private List hiddenExtensions = Arrays.asList("ino", "pde"); - - public List getHiddenExtensions() { - return hiddenExtensions; - } - - - // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . - // Additional accessors added in 0136 because of package work. // These will also be helpful for tool developers. - /** - * Returns the name of this sketch. (The pretty name of the main tab.) - */ - public String getName() { - return data.getName(); - } - - - /** - * Returns path to the main .pde file for this sketch. - */ - public String getMainFilePath() { - return data.getMainFilePath(); - } - - - /** - * Returns the sketch folder. - */ - public File getFolder() { - return data.getFolder(); - } - - - /** - * Create the data folder if it does not exist already. As a convenience, - * it also returns the data folder, since it's likely about to be used. - */ - public File prepareDataFolder() { - if (!data.getDataFolder().exists()) { - data.getDataFolder().mkdirs(); - } - return data.getDataFolder(); - } - - - /** - * Create the code folder if it does not exist already. As a convenience, - * it also returns the code folder, since it's likely about to be used. - */ - public File prepareCodeFolder() { - if (!data.getCodeFolder().exists()) { - data.getCodeFolder().mkdirs(); - } - return data.getCodeFolder(); - } - - - public SketchCode[] getCodes() { - return data.getCodes(); - } - - - public int getCodeCount() { - return data.getCodeCount(); - } - - - public SketchCode getCode(int index) { - return data.getCode(index); - } - - - public int getCodeIndex(SketchCode who) { - return data.indexOfCode(who); - } - - public SketchCode getCurrentCode() { return current.getCode(); } @@ -1450,30 +1192,7 @@ public boolean isUntitled() { } - public String getAppletClassName2() { - return appletClassName; - } - - // ................................................................. - /** - * Convert to sanitized name and alert the user - * if changes were made. - */ - static public String checkName(String origName) { - String newName = BaseNoGui.sanitizeName(origName); - - if (!newName.equals(origName)) { - String msg = - _("The sketch name had to be modified. Sketch names can only consist\n" + - "of ASCII characters and numbers (but cannot start with a number).\n" + - "They should also be less than 64 characters long."); - System.out.println(msg); - } - return newName; - } - - } diff --git a/arduino-core/src/processing/app/BaseSketch.java b/arduino-core/src/processing/app/BaseSketch.java new file mode 100755 index 00000000000..0cc76fc4702 --- /dev/null +++ b/arduino-core/src/processing/app/BaseSketch.java @@ -0,0 +1,576 @@ +/* -*- mode: java; c-basic-offset: 2; indent-tabs-mode: nil -*- */ + +/* + Part of the Processing project - http://processing.org + + Copyright (c) 2004-10 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 + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +package processing.app; + +import static processing.app.I18n._; + +import java.io.File; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; + +import processing.app.debug.RunnerException; +import processing.app.helpers.PreferencesMapException; +import processing.app.packages.Library; + + +/** + * Stores information about files in the current sketch + */ +public abstract class BaseSketch { + + + /** true if any of the files have been modified. */ + protected boolean modified; + + protected int currentIndex; + + protected SketchData data; + + /** Class name for the PApplet, as determined by the preprocessor. */ + protected String appletClassName; + + + /** + * Build the list of files. + *

+ * Generally this is only done once, rather than + * each time a change is made, because otherwise it gets to be + * a nightmare to keep track of what files went where, because + * not all the data will be saved to disk. + *

+ * This also gets called when the main sketch file is renamed, + * because the sketch has to be reloaded from a different folder. + *

+ * Another exception is when an external editor is in use, + * in which case the load happens each time "run" is hit. + */ + protected abstract void load() throws IOException; + + /** + * Handler for the New Code menu option. + */ + public abstract void handleNewCode(); + + /** + * Handler for the Rename Code menu option. + */ + public abstract void handleRenameCode(); + + + /** + * This is called upon return from entering a new file name. + * (that is, from either newCode or renameCode after the prompt) + * This code is almost identical for both the newCode and renameCode + * cases, so they're kept merged except for right in the middle + * where they diverge. + */ + protected abstract void nameCode(String newName); + + + /** + * Remove a piece of code from the sketch and from the disk. + */ + public abstract void handleDeleteCode(); + + + /** + * Move to the previous tab. + */ + public void handlePrevCode() { + int prev = currentIndex - 1; + if (prev < 0) prev = data.getCodeCount()-1; + setCurrentCode(prev); + } + + + /** + * Move to the next tab. + */ + public void handleNextCode() { + setCurrentCode((currentIndex + 1) % data.getCodeCount()); + } + + + /** + * Sets the modified value for the code in the frontmost tab. + */ + public abstract void setModified(boolean state); + + + protected abstract void calcModified(); + + + public boolean isModified() { + return modified; + } + + + /** + * Save all code in the current sketch. + */ + public abstract boolean save() throws IOException; + + + protected boolean renameCodeToInoExtension(File pdeFile) { + for (SketchCode c : data.getCodes()) { + if (!c.getFile().equals(pdeFile)) + continue; + + String pdeName = pdeFile.getPath(); + pdeName = pdeName.substring(0, pdeName.length() - 4) + ".ino"; + return c.renameTo(new File(pdeName)); + } + return false; + } + + + /** + * Handles 'Save As' for a sketch. + *

+ * This basically just duplicates the current sketch folder to + * a new location, and then calls 'Save'. (needs to take the current + * state of the open files and save them to the new folder.. + * but not save over the old versions for the old sketch..) + *

+ * Also removes the previously-generated .class and .jar files, + * because they can cause trouble. + */ + protected abstract boolean saveAs() throws IOException; + + + /** + * Prompt the user for a new file to the sketch, then call the + * other addFile() function to actually add it. + */ + public abstract void handleAddFile(); + + + /** + * Add a file to the sketch. + *

+ * .pde or .java files will be added to the sketch folder.
+ * .jar, .class, .dll, .jnilib, and .so files will all + * be added to the "code" folder.
+ * All other files will be added to the "data" folder. + *

+ * If they don't exist already, the "code" or "data" folder + * will be created. + *

+ * @return true if successful. + */ + public abstract boolean addFile(File sourceFile); + + + public void importLibrary(Library lib) throws IOException { + importLibrary(lib.getSrcFolder()); + } + + /** + * Add import statements to the current tab for all of packages inside + * the specified jar file. + */ + public abstract void importLibrary(File jarPath) throws IOException; + + + /** + * Change what file is currently being edited. Changes the current tab index. + *

    + *
  1. store the String for the text of the current file. + *
  2. retrieve the String for the text of the new file. + *
  3. change the text that's visible in the text area + *
+ */ + public abstract void setCurrentCode(int which); + + + /** + * Internal helper function to set the current tab based on a name. + * @param findName the file name (not pretty name) to be shown + */ + protected void setCurrentCode(String findName) { + for (SketchCode code : data.getCodes()) { + if (findName.equals(code.getFileName()) || + findName.equals(code.getPrettyName())) { + setCurrentCode(data.indexOfCode(code)); + return; + } + } + } + + + /** + * Preprocess, Compile, and Run the current code. + *

+ * There are three main parts to this process: + *

+   *   (0. if not java, then use another 'engine'.. i.e. python)
+   *
+   *    1. do the p5 language preprocessing
+   *       this creates a working .java file in a specific location
+   *       better yet, just takes a chunk of java code and returns a
+   *       new/better string editor can take care of saving this to a
+   *       file location
+   *
+   *    2. compile the code from that location
+   *       catching errors along the way
+   *       placing it in a ready classpath, or .. ?
+   *
+   *    3. run the code
+   *       needs to communicate location for window
+   *       and maybe setup presentation space as well
+   *       run externally if a code folder exists,
+   *       or if more than one file is in the project
+   *
+   *    X. afterwards, some of these steps need a cleanup function
+   * 
+ */ + //protected String compile() throws RunnerException { + + /** + * When running from the editor, take care of preparations before running + * the build. + */ + public abstract void prepare() throws IOException; + + + + /** + * Map an error from a set of processed .java files back to its location + * in the actual sketch. + * @param message The error message. + * @param filename The .java file where the exception was found. + * @param line Line number of the .java file for the exception (1-indexed) + * @return A RunnerException to be sent to the editor, or null if it wasn't + * possible to place the exception to the sketch code. + */ +// public RunnerException placeExceptionAlt(String message, +// String filename, int line) { +// String appletJavaFile = appletClassName + ".java"; +// SketchCode errorCode = null; +// if (filename.equals(appletJavaFile)) { +// for (SketchCode code : getCode()) { +// if (code.isExtension("ino")) { +// if (line >= code.getPreprocOffset()) { +// errorCode = code; +// } +// } +// } +// } else { +// for (SketchCode code : getCode()) { +// if (code.isExtension("java")) { +// if (filename.equals(code.getFileName())) { +// errorCode = code; +// } +// } +// } +// } +// int codeIndex = getCodeIndex(errorCode); +// +// if (codeIndex != -1) { +// //System.out.println("got line num " + lineNumber); +// // in case this was a tab that got embedded into the main .java +// line -= getCode(codeIndex).getPreprocOffset(); +// +// // lineNumber is 1-indexed, but editor wants zero-indexed +// line--; +// +// // getMessage() will be what's shown in the editor +// RunnerException exception = +// new RunnerException(message, codeIndex, line, -1); +// exception.hideStackTrace(); +// return exception; +// } +// return null; +// } + + + /** + * Run the build inside the temporary build folder. + * @return null if compilation failed, main class name if not + * @throws RunnerException + */ + public abstract String build(boolean verbose) throws RunnerException, PreferencesMapException; + + /** + * Preprocess and compile all the code for this sketch. + * + * In an advanced program, the returned class name could be different, + * which is why the className is set based on the return value. + * A compilation error will burp up a RunnerException. + * + * @return null if compilation failed, main class name if not + */ + public abstract String build(String buildPath, boolean verbose) throws RunnerException, PreferencesMapException; + + protected abstract boolean exportApplet(boolean usingProgrammer) throws Exception; + + + /** + * Handle export to applet. + */ + public abstract boolean exportApplet(String appletPath, boolean usingProgrammer) + throws Exception; + + + protected abstract boolean upload(String buildPath, String suggestedClassName, boolean usingProgrammer) throws Exception; + + + public boolean exportApplicationPrompt() throws IOException, RunnerException { + return false; + } + + + /** + * Export to application via GUI. + */ + protected boolean exportApplication() throws IOException, RunnerException { + return false; + } + + + /** + * Export to application without GUI. + */ + public boolean exportApplication(String destPath, + int exportPlatform) throws IOException, RunnerException { + return false; + } + + + /** + * Make sure the sketch hasn't been moved or deleted by some + * nefarious user. If they did, try to re-create it and save. + * Only checks to see if the main folder is still around, + * but not its contents. + */ + protected void ensureExistence() { + if (data.getFolder().exists()) return; + + BaseNoGui.showWarning(_("Sketch Disappeared"), + _("The sketch folder has disappeared.\n " + + "Will attempt to re-save in the same location,\n" + + "but anything besides the code will be lost."), null); + try { + data.getFolder().mkdirs(); + modified = true; + + for (SketchCode code : data.getCodes()) { + code.save(); // this will force a save + } + calcModified(); + + } catch (Exception e) { + BaseNoGui.showWarning(_("Could not re-save sketch"), + _("Could not properly re-save the sketch. " + + "You may be in trouble at this point,\n" + + "and it might be time to copy and paste " + + "your code to another text editor."), e); + } + } + + + /** + * Returns true if this is a read-only sketch. Used for the + * examples directory, or when sketches are loaded from read-only + * volumes or folders without appropriate permissions. + */ + public boolean isReadOnly() { + String apath = data.getFolder().getAbsolutePath(); + for (File folder : BaseNoGui.getLibrariesPath()) { + if (apath.startsWith(folder.getAbsolutePath())) + return true; + } + if (apath.startsWith(BaseNoGui.getExamplesPath()) || + apath.startsWith(BaseNoGui.getSketchbookLibrariesFolder().getAbsolutePath())) { + return true; + } + + // canWrite() doesn't work on directories + // } else if (!folder.canWrite()) { + + // check to see if each modified code file can be written to + for (SketchCode code : data.getCodes()) { + if (code.isModified() && code.fileReadOnly() && code.fileExists()) { + // System.err.println("found a read-only file " + code[i].file); + return true; + } + } + return false; + } + + // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + // Breaking out extension types in order to clean up the code, and make it + // easier for other environments (like Arduino) to incorporate changes. + + /** + * True if the specified code has the default file extension. + */ + public boolean hasDefaultExtension(SketchCode code) { + return code.isExtension(getDefaultExtension()); + } + + + /** + * True if the specified extension is the default file extension. + */ + public boolean isDefaultExtension(String what) { + return what.equals(getDefaultExtension()); + } + + + /** + * Check this extension (no dots, please) against the list of valid + * extensions. + */ + public boolean validExtension(String what) { + return data.getExtensions().contains(what); + } + + + /** + * Returns the default extension for this editor setup. + */ + public String getDefaultExtension() { + return data.getDefaultExtension(); + } + + static private List hiddenExtensions = Arrays.asList("ino", "pde"); + + public List getHiddenExtensions() { + return hiddenExtensions; + } + + + // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + // Additional accessors added in 0136 because of package work. + // These will also be helpful for tool developers. + + + /** + * Returns the name of this sketch. (The pretty name of the main tab.) + */ + public String getName() { + return data.getName(); + } + + + /** + * Returns path to the main .pde file for this sketch. + */ + public String getMainFilePath() { + return data.getMainFilePath(); + } + + + /** + * Returns the sketch folder. + */ + public File getFolder() { + return data.getFolder(); + } + + + /** + * Create the data folder if it does not exist already. As a convenience, + * it also returns the data folder, since it's likely about to be used. + */ + public File prepareDataFolder() { + if (!data.getDataFolder().exists()) { + data.getDataFolder().mkdirs(); + } + return data.getDataFolder(); + } + + + /** + * Create the code folder if it does not exist already. As a convenience, + * it also returns the code folder, since it's likely about to be used. + */ + public File prepareCodeFolder() { + if (!data.getCodeFolder().exists()) { + data.getCodeFolder().mkdirs(); + } + return data.getCodeFolder(); + } + + + public SketchCode[] getCodes() { + return data.getCodes(); + } + + + public int getCodeCount() { + return data.getCodeCount(); + } + + + public SketchCode getCode(int index) { + return data.getCode(index); + } + + + public int getCodeIndex(SketchCode who) { + return data.indexOfCode(who); + } + + + public abstract SketchCode getCurrentCode(); + + + public abstract void setUntitled(boolean u); + + + public abstract boolean isUntitled(); + + + public String getAppletClassName2() { + return appletClassName; + } + + + // ................................................................. + + + /** + * Convert to sanitized name and alert the user + * if changes were made. + */ + static public String checkName(String origName) { + String newName = BaseNoGui.sanitizeName(origName); + + if (!newName.equals(origName)) { + String msg = + _("The sketch name had to be modified. Sketch names can only consist\n" + + "of ASCII characters and numbers (but cannot start with a number).\n" + + "They should also be less than 64 characters long."); + System.out.println(msg); + } + return newName; + } + + +} From 11f6eb05bf704bd2222f3bdd7424cd029d6ff61d Mon Sep 17 00:00:00 2001 From: ricardojlrufino Date: Thu, 22 Jan 2015 23:51:56 -0300 Subject: [PATCH 02/25] State of the buttons (UNDO / REDO) is now in LastUndoableEditAwareUndoManager --- .../app/LastUndoableEditAwareUndoManager.java | 29 +++++++++++-------- 1 file changed, 17 insertions(+), 12 deletions(-) mode change 100644 => 100755 app/src/processing/app/LastUndoableEditAwareUndoManager.java diff --git a/app/src/processing/app/LastUndoableEditAwareUndoManager.java b/app/src/processing/app/LastUndoableEditAwareUndoManager.java old mode 100644 new mode 100755 index 0cd678a935b..736be42d39b --- a/app/src/processing/app/LastUndoableEditAwareUndoManager.java +++ b/app/src/processing/app/LastUndoableEditAwareUndoManager.java @@ -2,31 +2,36 @@ import javax.swing.undo.CannotRedoException; import javax.swing.undo.CannotUndoException; -import javax.swing.undo.UndoManager; -import javax.swing.undo.UndoableEdit; -@SuppressWarnings("serial") -public class LastUndoableEditAwareUndoManager extends UndoManager { +import org.fife.ui.rtextarea.RUndoManager; - private UndoableEdit lastUndoableEdit; +import processing.app.syntax.SketchTextArea; - public LastUndoableEditAwareUndoManager() { - this.lastUndoableEdit = null; +public class LastUndoableEditAwareUndoManager extends RUndoManager { + + private Editor editor; + + public LastUndoableEditAwareUndoManager(SketchTextArea textarea, Editor editor) { + super(textarea); + this.editor = editor; } @Override public synchronized void undo() throws CannotUndoException { - lastUndoableEdit = super.editToBeUndone(); super.undo(); } @Override public synchronized void redo() throws CannotRedoException { - lastUndoableEdit = super.editToBeRedone(); super.redo(); } - - public UndoableEdit getLastUndoableEdit() { - return lastUndoableEdit; + + @Override + public void updateActions() { + super.updateActions(); + editor.undoAction.updateUndoState(); + editor.redoAction.updateRedoState(); } + + } From 4c83280da61ba56a9a041c134f9ff1dc9b17380a Mon Sep 17 00:00:00 2001 From: ricardojlrufino Date: Fri, 23 Jan 2015 13:18:35 -0300 Subject: [PATCH 03/25] Trying to fix (unsuccessfully) support for the Japanese Input --- .../app/syntax/im/CompositionTextManager.java | 35 +++++++++---------- .../app/syntax/im/CompositionTextPainter.java | 22 +++++------- .../app/syntax/im/InputMethodSupport.java | 4 +-- 3 files changed, 26 insertions(+), 35 deletions(-) diff --git a/app/src/processing/app/syntax/im/CompositionTextManager.java b/app/src/processing/app/syntax/im/CompositionTextManager.java index ba9ee155f7f..f6b3fd8e8c1 100644 --- a/app/src/processing/app/syntax/im/CompositionTextManager.java +++ b/app/src/processing/app/syntax/im/CompositionTextManager.java @@ -1,10 +1,6 @@ package processing.app.syntax.im; -import java.awt.Font; -import java.awt.FontMetrics; -import java.awt.Graphics2D; -import java.awt.Point; -import java.awt.Rectangle; +import java.awt.*; import java.awt.font.FontRenderContext; import java.awt.font.TextAttribute; import java.awt.font.TextLayout; @@ -13,8 +9,7 @@ import javax.swing.text.BadLocationException; -import processing.app.syntax.JEditTextArea; -import processing.app.syntax.TextAreaPainter; +import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea; /** * This class Manage texts from input method @@ -30,7 +25,7 @@ */ public class CompositionTextManager { - private JEditTextArea textArea; + private RSyntaxTextArea textArea; private String prevComposeString; private int prevCommittedCount; private boolean isInputProcess; @@ -41,7 +36,7 @@ public class CompositionTextManager { * Create text manager class with a textarea. * @param textArea texarea component for PDE. */ - public CompositionTextManager(JEditTextArea textArea) { + public CompositionTextManager(RSyntaxTextArea textArea) { this.textArea = textArea; prevComposeString = ""; isInputProcess = false; @@ -90,7 +85,7 @@ public void beginCompositionText(AttributedCharacterIterator text, int committed */ public void processCompositionText(AttributedCharacterIterator text, int committed_count) { int layoutCaretPosition = initialCaretPosition + committed_count; - CompositionTextPainter compositionPainter = textArea.getPainter().getCompositionTextpainter(); + CompositionTextPainter compositionPainter = textArea.getGraphics().getCompositionTextpainter(); compositionPainter.setComposedTextLayout(getTextLayout(text, committed_count), layoutCaretPosition); int textLength = text.getEndIndex() - text.getBeginIndex() - committed_count; StringBuffer unCommitedStringBuf = new StringBuffer(textLength); @@ -154,8 +149,8 @@ private void removeNotCommittedText(AttributedCharacterIterator text){ private TextLayout getTextLayout(AttributedCharacterIterator text, int committed_count) { AttributedString composed = new AttributedString(text, committed_count, text.getEndIndex()); - Font font = textArea.getPainter().getFont(); - FontRenderContext context = ((Graphics2D) (textArea.getPainter().getGraphics())).getFontRenderContext(); + Font font = textArea.getFont(); + FontRenderContext context = ((Graphics2D) (textArea.getGraphics())).getFontRenderContext(); composed.addAttribute(TextAttribute.FONT, font); TextLayout layout = new TextLayout(composed.getIterator(), context); return layout; @@ -163,10 +158,9 @@ private TextLayout getTextLayout(AttributedCharacterIterator text, int committed private Point getCaretLocation() { Point loc = new Point(); - TextAreaPainter painter = textArea.getPainter(); - FontMetrics fm = painter.getFontMetrics(); + FontMetrics fm = textArea.getGraphics().getFontMetrics(); int offsetY = fm.getHeight() - COMPOSING_UNDERBAR_HEIGHT; - int lineIndex = textArea.getCaretLine(); + int lineIndex = textArea.getCaretLineNumber(); loc.y = lineIndex * fm.getHeight() + offsetY; int offsetX = textArea.getCaretPosition() - textArea.getLineStartOffset(lineIndex); @@ -180,15 +174,18 @@ public Rectangle getTextLocation() { } private Rectangle getCaretRectangle(int x, int y) { - TextAreaPainter painter = textArea.getPainter(); - Point origin = painter.getLocationOnScreen(); - int height = painter.getFontMetrics().getHeight(); + Point origin = textArea.getLocationOnScreen(); + int height = textArea.getGraphics().getFontMetrics().getHeight(); return new Rectangle(origin.x + x, origin.y + y, 0, height); } public AttributedCharacterIterator getCommittedText(int beginIndex, int endIndex) { int length = endIndex - beginIndex; - String textAreaString = textArea.getText(beginIndex, length); + String textAreaString = null; + try { + textAreaString = textArea.getText(beginIndex, length); + } catch (BadLocationException e) { + } return new AttributedString(textAreaString).getIterator(); } diff --git a/app/src/processing/app/syntax/im/CompositionTextPainter.java b/app/src/processing/app/syntax/im/CompositionTextPainter.java index 0084f491f92..6aa2a14acdd 100644 --- a/app/src/processing/app/syntax/im/CompositionTextPainter.java +++ b/app/src/processing/app/syntax/im/CompositionTextPainter.java @@ -1,14 +1,9 @@ package processing.app.syntax.im; -import java.awt.Color; -import java.awt.FontMetrics; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Point; +import java.awt.*; import java.awt.font.TextLayout; -import processing.app.syntax.JEditTextArea; -import processing.app.syntax.TextAreaPainter; +import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea; /** * Paint texts from input method. Text via input method are transmitted by @@ -24,13 +19,13 @@ public class CompositionTextPainter { private TextLayout composedTextLayout; private int composedBeginCaretPosition = 0; - private JEditTextArea textArea; + private RSyntaxTextArea textArea; /** * Constructor for painter. * @param textarea textarea used by PDE. */ - public CompositionTextPainter(JEditTextArea textArea) { + public CompositionTextPainter(RSyntaxTextArea textArea) { this.textArea = textArea; composedTextLayout = null; } @@ -101,9 +96,9 @@ public void draw(Graphics gfx, Color fillBackGroundColor) { * @param y y-coordinate where to fill. */ private void refillComposedArea(Color fillColor, int x, int y) { - Graphics gfx = textArea.getPainter().getGraphics(); + Graphics gfx = textArea.getGraphics(); gfx.setColor(fillColor); - FontMetrics fm = textArea.getPainter().getFontMetrics(); + FontMetrics fm = textArea.getGraphics().getFontMetrics(); int newY = y - (fm.getHeight() - CompositionTextManager.COMPOSING_UNDERBAR_HEIGHT); int paintHeight = fm.getHeight(); int paintWidth = (int) composedTextLayout.getBounds().getWidth(); @@ -112,10 +107,9 @@ private void refillComposedArea(Color fillColor, int x, int y) { private Point getCaretLocation() { Point loc = new Point(); - TextAreaPainter painter = textArea.getPainter(); - FontMetrics fm = painter.getFontMetrics(); + FontMetrics fm = textArea.getGraphics().getFontMetrics(); int offsetY = fm.getHeight() - CompositionTextManager.COMPOSING_UNDERBAR_HEIGHT; - int lineIndex = textArea.getCaretLine(); + int lineIndex = textArea.getCaretLineNumber(); loc.y = lineIndex * fm.getHeight() + offsetY; int offsetX = composedBeginCaretPosition - textArea.getLineStartOffset(lineIndex); loc.x = textArea.offsetToX(lineIndex, offsetX); diff --git a/app/src/processing/app/syntax/im/InputMethodSupport.java b/app/src/processing/app/syntax/im/InputMethodSupport.java index 461be3d1677..4d5dcb3f7ea 100644 --- a/app/src/processing/app/syntax/im/InputMethodSupport.java +++ b/app/src/processing/app/syntax/im/InputMethodSupport.java @@ -7,7 +7,7 @@ import java.awt.im.InputMethodRequests; import java.text.AttributedCharacterIterator; -import processing.app.syntax.JEditTextArea; +import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea; /** * Support in-line Japanese input for PDE. (Maybe Chinese, Korean and more) @@ -26,7 +26,7 @@ public class InputMethodSupport implements InputMethodRequests, private int committed_count = 0; private CompositionTextManager textManager; - public InputMethodSupport(JEditTextArea textArea) { + public InputMethodSupport(RSyntaxTextArea textArea) { textManager = new CompositionTextManager(textArea); textArea.enableInputMethods(true); textArea.addInputMethodListener(this); From 83891fdcd029fc08378d2e0571e1433a0b72cdba Mon Sep 17 00:00:00 2001 From: ricardojlrufino Date: Fri, 23 Jan 2015 13:20:23 -0300 Subject: [PATCH 04/25] Removed old Japanese support files (perhaps the new java already support this by using the appropriate fonts) --- .../app/syntax/im/CompositionTextManager.java | 195 ------------------ .../app/syntax/im/CompositionTextPainter.java | 118 ----------- .../app/syntax/im/InputMethodSupport.java | 120 ----------- 3 files changed, 433 deletions(-) delete mode 100644 app/src/processing/app/syntax/im/CompositionTextManager.java delete mode 100644 app/src/processing/app/syntax/im/CompositionTextPainter.java delete mode 100644 app/src/processing/app/syntax/im/InputMethodSupport.java diff --git a/app/src/processing/app/syntax/im/CompositionTextManager.java b/app/src/processing/app/syntax/im/CompositionTextManager.java deleted file mode 100644 index f6b3fd8e8c1..00000000000 --- a/app/src/processing/app/syntax/im/CompositionTextManager.java +++ /dev/null @@ -1,195 +0,0 @@ -package processing.app.syntax.im; - -import java.awt.*; -import java.awt.font.FontRenderContext; -import java.awt.font.TextAttribute; -import java.awt.font.TextLayout; -import java.text.AttributedCharacterIterator; -import java.text.AttributedString; - -import javax.swing.text.BadLocationException; - -import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea; - -/** - * This class Manage texts from input method - * by begin-process-end steps. - * - * First, if a user start inputing via input method, - * beginCompositionText is called from InputMethodSupport. - * Second, the user continues from input method, processCompositionText is called - * and reflect user inputs to text area. - * Finally the user try to commit text, endCompositionText is called. - * - * @author Takashi Maekawa (takachin@generative.info) - */ - -public class CompositionTextManager { - private RSyntaxTextArea textArea; - private String prevComposeString; - private int prevCommittedCount; - private boolean isInputProcess; - private int initialCaretPosition; - public static final int COMPOSING_UNDERBAR_HEIGHT = 5; - - /** - * Create text manager class with a textarea. - * @param textArea texarea component for PDE. - */ - public CompositionTextManager(RSyntaxTextArea textArea) { - this.textArea = textArea; - prevComposeString = ""; - isInputProcess = false; - prevCommittedCount = 0; - } - - /** - * Get this text manager is whether in input process or not. - */ - public boolean getIsInputProcess() { - return isInputProcess; - } - /** - * Insert full width space - */ - public void insertFullWidthSpace() { - initialCaretPosition = textArea.getCaretPosition(); - int layoutCaretPosition = initialCaretPosition; - try { - textArea.getDocument().insertString(layoutCaretPosition, "\u3000", null); - } catch (BadLocationException e) { - e.printStackTrace(); - } - } - - /** - * Called when a user begins input from input method. - * This method initializes text manager. - * - * @param text Text from InputMethodEvent. - * @param commited_count Numbers of committed characters in text. - */ - public void beginCompositionText(AttributedCharacterIterator text, int committed_count) { - isInputProcess = true; - prevComposeString = ""; - initialCaretPosition = textArea.getCaretPosition(); - processCompositionText(text, committed_count); - } - - /** - * Called when a user processing input characters and - * select candidates from input method. - * - * @param text Text from InputMethodEvent. - * @param commited_count Numbers of committed characters in text. - */ - public void processCompositionText(AttributedCharacterIterator text, int committed_count) { - int layoutCaretPosition = initialCaretPosition + committed_count; - CompositionTextPainter compositionPainter = textArea.getGraphics().getCompositionTextpainter(); - compositionPainter.setComposedTextLayout(getTextLayout(text, committed_count), layoutCaretPosition); - int textLength = text.getEndIndex() - text.getBeginIndex() - committed_count; - StringBuffer unCommitedStringBuf = new StringBuffer(textLength); - char c; - for (c = text.setIndex(committed_count); c != AttributedCharacterIterator.DONE - && textLength > 0; c = text.next(), --textLength) { - unCommitedStringBuf.append(c); - } - String unCommittedString = unCommitedStringBuf.toString(); - try { - if(canRemovePreviousInput(committed_count)){ - textArea.getDocument().remove(layoutCaretPosition, prevComposeString.length()); - } - textArea.getDocument().insertString(layoutCaretPosition, unCommittedString, null); - if(committed_count > 0){ - initialCaretPosition = initialCaretPosition + committed_count; - } - prevComposeString = unCommittedString; - prevCommittedCount = committed_count; - } catch (BadLocationException e) { - e.printStackTrace(); - } - } - - private boolean canRemovePreviousInput(int committed_count){ - return (prevCommittedCount == committed_count || prevCommittedCount > committed_count); - } - - /** - * Called when a user fixed text from input method or delete all - * composition text. This method resets CompositionTextPainter. - * - * @param text Text from InputMethodEvent. - * @param commited_count Numbers of committed characters in text. - */ - public void endCompositionText(AttributedCharacterIterator text, int committed_count) { - /* - * If there are no committed characters, remove it all from textarea. - * This case will happen if a user delete all composing characters by backspace or delete key. - * If it does, these previous characters are needed to be deleted. - */ - if(committed_count == 0){ - removeNotCommittedText(text); - } - CompositionTextPainter compositionPainter = textArea.getPainter().getCompositionTextpainter(); - compositionPainter.invalidateComposedTextLayout(initialCaretPosition + committed_count); - prevComposeString = ""; - isInputProcess = false; - } - - private void removeNotCommittedText(AttributedCharacterIterator text){ - if (prevComposeString.length() == 0) { - return; - } - try { - textArea.getDocument().remove(initialCaretPosition, prevComposeString.length()); - } catch (BadLocationException e) { - e.printStackTrace(); - } - } - - private TextLayout getTextLayout(AttributedCharacterIterator text, int committed_count) { - AttributedString composed = new AttributedString(text, committed_count, text.getEndIndex()); - Font font = textArea.getFont(); - FontRenderContext context = ((Graphics2D) (textArea.getGraphics())).getFontRenderContext(); - composed.addAttribute(TextAttribute.FONT, font); - TextLayout layout = new TextLayout(composed.getIterator(), context); - return layout; - } - - private Point getCaretLocation() { - Point loc = new Point(); - FontMetrics fm = textArea.getGraphics().getFontMetrics(); - int offsetY = fm.getHeight() - COMPOSING_UNDERBAR_HEIGHT; - int lineIndex = textArea.getCaretLineNumber(); - loc.y = lineIndex * fm.getHeight() + offsetY; - int offsetX = textArea.getCaretPosition() - - textArea.getLineStartOffset(lineIndex); - loc.x = textArea.offsetToX(lineIndex, offsetX); - return loc; - } - - public Rectangle getTextLocation() { - Point caret = getCaretLocation(); - return getCaretRectangle(caret.x, caret.y); - } - - private Rectangle getCaretRectangle(int x, int y) { - Point origin = textArea.getLocationOnScreen(); - int height = textArea.getGraphics().getFontMetrics().getHeight(); - return new Rectangle(origin.x + x, origin.y + y, 0, height); - } - - public AttributedCharacterIterator getCommittedText(int beginIndex, int endIndex) { - int length = endIndex - beginIndex; - String textAreaString = null; - try { - textAreaString = textArea.getText(beginIndex, length); - } catch (BadLocationException e) { - } - return new AttributedString(textAreaString).getIterator(); - } - - public int getInsertPositionOffset() { - return textArea.getCaretPosition() * -1; - } -} diff --git a/app/src/processing/app/syntax/im/CompositionTextPainter.java b/app/src/processing/app/syntax/im/CompositionTextPainter.java deleted file mode 100644 index 6aa2a14acdd..00000000000 --- a/app/src/processing/app/syntax/im/CompositionTextPainter.java +++ /dev/null @@ -1,118 +0,0 @@ -package processing.app.syntax.im; - -import java.awt.*; -import java.awt.font.TextLayout; - -import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea; - -/** - * Paint texts from input method. Text via input method are transmitted by - * AttributedCaharacterIterator. This class helps the PDE's TextAreaPainter - * to handle AttributedCaharacterIterator. - * - * For practical purposes, paint to textarea is done by TextLayout class. - * Because TextLayout class is easy to draw composing texts. (For example, - * draw underline composing texts, focus when select from candidates text.) - * - * @author Takashi Maekawa (takachin@generative.info) - */ -public class CompositionTextPainter { - private TextLayout composedTextLayout; - private int composedBeginCaretPosition = 0; - private RSyntaxTextArea textArea; - - /** - * Constructor for painter. - * @param textarea textarea used by PDE. - */ - public CompositionTextPainter(RSyntaxTextArea textArea) { - this.textArea = textArea; - composedTextLayout = null; - } - - /** - * Check the painter has TextLayout. - * If a user input via InputMethod, this result will return true. - * @param textarea textarea used by PDE. - */ - public boolean hasComposedTextLayout() { - return (composedTextLayout != null); - } - - /** - * Set TextLayout to the painter. - * TextLayout will be created and set by CompositionTextManager. - * - * @see CompositionTextManager - * @param textarea textarea used by PDE. - */ - public void setComposedTextLayout(TextLayout composedTextLayout, int composedStartCaretPosition) { - this.composedTextLayout = composedTextLayout; - this.composedBeginCaretPosition = composedStartCaretPosition; - } - - /** - * Invalidate this TextLayout to set null. - * If a user end input via InputMethod, this method will called from CompositionTextManager.endCompositionText - */ - public void invalidateComposedTextLayout(int composedEndCaretPosition) { - this.composedTextLayout = null; - this.composedBeginCaretPosition = composedEndCaretPosition; - //this.composedBeginCaretPosition = textArea.getCaretPosition(); - } - - /** - * Draw text via input method with composed text information. - * This method can draw texts with some underlines to illustrate converting characters. - * - * This method is workaround for TextAreaPainter. - * Because, TextAreaPainter can't treat AttributedCharacterIterator directly. - * AttributedCharacterIterator has very important information when composing text. - * It has a map where are converted characters and committed characters. - * Ideally, changing TextAreaPainter method can treat AttributedCharacterIterator is better. But it's very tough!! - * So I choose to write some code as a workaround. - * - * This draw method is proceeded with the following steps. - * 1. Original TextAreaPainter draws characters. - * 2. This refillComposedArea method erase previous paint characters by textarea's background color. - * The refill area is only square that width and height defined by characters with input method. - * 3. CompositionTextPainter.draw method paints composed text. It was actually drawn by TextLayout. - * - * @param gfx set TextAreaPainter's Graphics object. - * @param fillBackGroundColor set textarea's background. - */ - public void draw(Graphics gfx, Color fillBackGroundColor) { - assert(composedTextLayout != null); - Point composedLoc = getCaretLocation(); - refillComposedArea(fillBackGroundColor, composedLoc.x, composedLoc.y); - composedTextLayout.draw((Graphics2D) gfx, composedLoc.x, composedLoc.y); - } - - /** - * Fill color to erase characters drawn by original TextAreaPainter. - * - * @param fillColor fill color to erase characters drawn by original TextAreaPainter method. - * @param x x-coordinate where to fill. - * @param y y-coordinate where to fill. - */ - private void refillComposedArea(Color fillColor, int x, int y) { - Graphics gfx = textArea.getGraphics(); - gfx.setColor(fillColor); - FontMetrics fm = textArea.getGraphics().getFontMetrics(); - int newY = y - (fm.getHeight() - CompositionTextManager.COMPOSING_UNDERBAR_HEIGHT); - int paintHeight = fm.getHeight(); - int paintWidth = (int) composedTextLayout.getBounds().getWidth(); - gfx.fillRect(x, newY, paintWidth, paintHeight); - } - - private Point getCaretLocation() { - Point loc = new Point(); - FontMetrics fm = textArea.getGraphics().getFontMetrics(); - int offsetY = fm.getHeight() - CompositionTextManager.COMPOSING_UNDERBAR_HEIGHT; - int lineIndex = textArea.getCaretLineNumber(); - loc.y = lineIndex * fm.getHeight() + offsetY; - int offsetX = composedBeginCaretPosition - textArea.getLineStartOffset(lineIndex); - loc.x = textArea.offsetToX(lineIndex, offsetX); - return loc; - } -} diff --git a/app/src/processing/app/syntax/im/InputMethodSupport.java b/app/src/processing/app/syntax/im/InputMethodSupport.java deleted file mode 100644 index 4d5dcb3f7ea..00000000000 --- a/app/src/processing/app/syntax/im/InputMethodSupport.java +++ /dev/null @@ -1,120 +0,0 @@ -package processing.app.syntax.im; - -import java.awt.Rectangle; -import java.awt.event.InputMethodEvent; -import java.awt.event.InputMethodListener; -import java.awt.font.TextHitInfo; -import java.awt.im.InputMethodRequests; -import java.text.AttributedCharacterIterator; - -import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea; - -/** - * Support in-line Japanese input for PDE. (Maybe Chinese, Korean and more) - * This class is implemented by Java Input Method Framework and handles - * If you would like to know more about Java Input Method Framework, - * Please see http://java.sun.com/j2se/1.5.0/docs/guide/imf/ - * - * This class is implemented to fix Bug #854. - * http://dev.processing.org/bugs/show_bug.cgi?id=854 - * - * @author Takashi Maekawa (takachin@generative.info) - */ -public class InputMethodSupport implements InputMethodRequests, - InputMethodListener { - - private int committed_count = 0; - private CompositionTextManager textManager; - - public InputMethodSupport(RSyntaxTextArea textArea) { - textManager = new CompositionTextManager(textArea); - textArea.enableInputMethods(true); - textArea.addInputMethodListener(this); - } - - public Rectangle getTextLocation(TextHitInfo offset) { - return textManager.getTextLocation(); - } - - public TextHitInfo getLocationOffset(int x, int y) { - return null; - } - - public int getInsertPositionOffset() { - return textManager.getInsertPositionOffset(); - } - - public AttributedCharacterIterator getCommittedText(int beginIndex, - int endIndex, AttributedCharacterIterator.Attribute[] attributes) { - return textManager.getCommittedText(beginIndex, endIndex); - } - - public int getCommittedTextLength() { - return committed_count; - } - - public AttributedCharacterIterator cancelLatestCommittedText( - AttributedCharacterIterator.Attribute[] attributes) { - return null; - } - - public AttributedCharacterIterator getSelectedText( - AttributedCharacterIterator.Attribute[] attributes) { - return null; - } - - /** - * Handles events from InputMethod. - * This method judges whether beginning of input or - * progress of input or end and call related method. - * - * @param event event from Input Method. - */ - public void inputMethodTextChanged(InputMethodEvent event) { - AttributedCharacterIterator text = event.getText(); - committed_count = event.getCommittedCharacterCount(); - if(isFullWidthSpaceInput(text)){ - textManager.insertFullWidthSpace(); - caretPositionChanged(event); - return; - } - if(isBeginInputProcess(text, textManager)){ - textManager.beginCompositionText(text, committed_count); - caretPositionChanged(event); - return; - } - if (isInputProcess(text)){ - textManager.processCompositionText(text, committed_count); - caretPositionChanged(event); - return; - } - textManager.endCompositionText(text, committed_count); - caretPositionChanged(event); - } - - private boolean isFullWidthSpaceInput(AttributedCharacterIterator text){ - if(text == null) - return false; - if(textManager.getIsInputProcess()) - return false; - return (String.valueOf(text.first()).equals("\u3000")); - } - - private boolean isBeginInputProcess(AttributedCharacterIterator text, CompositionTextManager textManager){ - if(text == null) - return false; - if(textManager.getIsInputProcess()) - return false; - return (isInputProcess(text)); - } - - private boolean isInputProcess(AttributedCharacterIterator text){ - if(text == null) - return false; - return (text.getEndIndex() - (text.getBeginIndex() + committed_count) > 0); - } - - public void caretPositionChanged(InputMethodEvent event) { - event.consume(); - } -} From 13269a9447be8aee02a4f02122e73feae0123dc6 Mon Sep 17 00:00:00 2001 From: ricardojlrufino Date: Fri, 23 Jan 2015 17:28:17 -0300 Subject: [PATCH 05/25] [Linux] Installation Script that creates shortcuts on the menu and desktop (with SplashScreen) -Best ICON for Alt+TAB --- build/linux/dist/install.sh | 17 +++++++++++++++++ build/shared/lib/arduino.png | Bin 0 -> 13849 bytes 2 files changed, 17 insertions(+) create mode 100644 build/linux/dist/install.sh create mode 100644 build/shared/lib/arduino.png diff --git a/build/linux/dist/install.sh b/build/linux/dist/install.sh new file mode 100644 index 00000000000..d34c8aac85c --- /dev/null +++ b/build/linux/dist/install.sh @@ -0,0 +1,17 @@ +#!/bin/sh + +CURDIR=`pwd` +APPDIR="$(dirname -- "$(readlink -f -- "${0}")" )" + +cd "$APPDIR" + +# Set arduino.desktop absolute path workaround +mv arduino.desktop arduino.desktop-bak +sed -e "s,FULL_PATH,$PWD,g" arduino.desktop-bak > arduino.desktop +rm arduino.desktop-bak + +cp arduino.desktop ~/.local/share/applications/arduino.desktop +cp arduino.desktop ~/Desktop/arduino.desktop + +echo "Instaled Arduino IDE icons on menu and desktop !" + diff --git a/build/shared/lib/arduino.png b/build/shared/lib/arduino.png new file mode 100644 index 0000000000000000000000000000000000000000..28fa03ab7f78eae2bb4e7b4a76a5f3603e878aef GIT binary patch literal 13849 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 Date: Fri, 23 Jan 2015 17:29:27 -0300 Subject: [PATCH 06/25] Syntax highlighting Styles --- build/shared/lib/theme/syntax/dark.xml | 78 +++++++++++++++++++ build/shared/lib/theme/syntax/default.xml | 78 +++++++++++++++++++ build/shared/lib/theme/syntax/eclipse.xml | 78 +++++++++++++++++++ build/shared/lib/theme/syntax/idea.xml | 78 +++++++++++++++++++ build/shared/lib/theme/syntax/oldarduino.xml | 78 +++++++++++++++++++ .../shared/lib/theme/syntax/visualstudio.xml | 78 +++++++++++++++++++ 6 files changed, 468 insertions(+) create mode 100644 build/shared/lib/theme/syntax/dark.xml create mode 100644 build/shared/lib/theme/syntax/default.xml create mode 100644 build/shared/lib/theme/syntax/eclipse.xml create mode 100644 build/shared/lib/theme/syntax/idea.xml create mode 100644 build/shared/lib/theme/syntax/oldarduino.xml create mode 100644 build/shared/lib/theme/syntax/visualstudio.xml diff --git a/build/shared/lib/theme/syntax/dark.xml b/build/shared/lib/theme/syntax/dark.xml new file mode 100644 index 00000000000..9b51fbc000c --- /dev/null +++ b/build/shared/lib/theme/syntax/dark.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +