From d66e094a3be0e46da1bc65dc5508172d2ada90ec Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Fri, 10 May 2013 17:25:36 +0200 Subject: [PATCH 01/12] Revert ""Add library" moved into "Import library" menu" This reverts commit 1866050e0783e85b814c6afb57fa36318f3496bb. --- app/src/processing/app/Base.java | 18 ++++-------------- app/src/processing/app/Editor.java | 14 ++++++++++++-- build/shared/revisions.txt | 6 +----- 3 files changed, 17 insertions(+), 21 deletions(-) diff --git a/app/src/processing/app/Base.java b/app/src/processing/app/Base.java index 33e8ff410..401def98c 100644 --- a/app/src/processing/app/Base.java +++ b/app/src/processing/app/Base.java @@ -943,20 +943,10 @@ public class Base { } - public void rebuildImportMenu(JMenu importMenu, final Editor editor) { + public void rebuildImportMenu(JMenu importMenu) { + //System.out.println("rebuilding import menu"); importMenu.removeAll(); - - JMenuItem addLibraryMenuItem = new JMenuItem(_("Add Library...")); - addLibraryMenuItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - Base.this.handleAddZipLibrary(editor); - Base.this.onBoardOrPortChange(); - Base.this.rebuildImportMenu(Editor.importMenu, editor); - } - }); - importMenu.add(addLibraryMenuItem); - importMenu.addSeparator(); - + // reset the set of libraries libraries = new HashSet(); @@ -1008,7 +998,7 @@ public class Base { } - public void rebuildBoardsMenu(JMenu menu, final Editor editor) { + public void rebuildBoardsMenu(JMenu menu) { //System.out.println("rebuilding boards menu"); menu.removeAll(); ButtonGroup group = new ButtonGroup(); diff --git a/app/src/processing/app/Editor.java b/app/src/processing/app/Editor.java index 4fc2d13cd..cb18b0e44 100644 --- a/app/src/processing/app/Editor.java +++ b/app/src/processing/app/Editor.java @@ -627,10 +627,20 @@ public class Editor extends JFrame implements RunnerListener { if (importMenu == null) { importMenu = new JMenu(_("Import Library...")); - base.rebuildImportMenu(importMenu, this); + base.rebuildImportMenu(importMenu); } sketchMenu.add(importMenu); + item = new JMenuItem(_("Add Library from ZIP")); + item.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + base.handleAddZipLibrary(Editor.this); + base.onBoardOrPortChange(); + base.rebuildImportMenu(Editor.importMenu); + } + }); + sketchMenu.add(item); + item = newJMenuItem(_("Show Sketch Folder"), 'K'); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { @@ -680,7 +690,7 @@ public class Editor extends JFrame implements RunnerListener { if (boardsMenu == null) { boardsMenu = new JMenu(_("Board")); - base.rebuildBoardsMenu(boardsMenu, this); + base.rebuildBoardsMenu(boardsMenu); } menu.add(boardsMenu); diff --git a/build/shared/revisions.txt b/build/shared/revisions.txt index 4fd135592..3f7e61b23 100644 --- a/build/shared/revisions.txt +++ b/build/shared/revisions.txt @@ -1,5 +1,5 @@ -ARDUINO 1.0.5 - 2013.04.08 +ARDUINO 1.0.5 - 2013.03.29 [core] @@ -15,10 +15,6 @@ ARDUINO 1.0.5 - 2013.04.08 * Upgrades to WiFi firmwares -[ide] - -* Backport from 1.5: install Library from file - ARDUINO 1.0.4 - 2013.03.11 [core] From 62a8a0149f148459490ddb3a80e4a8f36ef1f4b9 Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Fri, 10 May 2013 17:27:52 +0200 Subject: [PATCH 02/12] keep included folder name as top level folder name, delete MAC folder and hidden files --- app/src/processing/app/tools/ZipDeflater.java | 72 +++++++++++++------ 1 file changed, 49 insertions(+), 23 deletions(-) diff --git a/app/src/processing/app/tools/ZipDeflater.java b/app/src/processing/app/tools/ZipDeflater.java index 651ff37ba..6a1cf2c5d 100644 --- a/app/src/processing/app/tools/ZipDeflater.java +++ b/app/src/processing/app/tools/ZipDeflater.java @@ -14,26 +14,30 @@ public class ZipDeflater { private final ZipFile zipFile; private final File destFolder; + private final Random random; + private final File file; public ZipDeflater(File file, File destFolder) throws ZipException, IOException { + this.file = file; this.destFolder = destFolder; this.zipFile = new ZipFile(file); + this.random = new Random(); } public void deflate() throws IOException { - String folderName = tempFolderNameFromZip(); + String tmpFolderName = folderNameFromZip() + random.nextInt(1000000); - File folder = new File(destFolder, folderName); + File tmpFolder = new File(destFolder, tmpFolderName); - if (!folder.mkdir()) { - throw new IOException("Unable to create folder " + folderName); + if (!tmpFolder.mkdir()) { + throw new IOException("Unable to create folder " + tmpFolderName); } Enumeration entries = zipFile.entries(); while (entries.hasMoreElements()) { ZipEntry entry = entries.nextElement(); - ensureFoldersOfEntryExist(folder, entry); - File entryFile = new File(folder, entry.getName()); + ensureFoldersOfEntryExist(tmpFolder, entry); + File entryFile = new File(tmpFolder, entry.getName()); if (entry.isDirectory()) { entryFile.mkdir(); } else { @@ -58,8 +62,33 @@ public class ZipDeflater { } } - // Test.zip may or may not contain Test folder. We use zip name to create libraries folder. Therefore, a contained Test folder is useless and must be removed - ensureOneLevelFolder(folder); + deleteUndesiredFoldersAndFiles(tmpFolder); + + // Test.zip may or may not contain Test folder. If it does, we keep it. If not, we use zip name. + ensureOneLevelFolder(tmpFolder); + } + + private void deleteUndesiredFoldersAndFiles(File folder) { + for (File file : folder.listFiles()) { + if (file.isDirectory() && "__MACOSX".equals(file.getName())) { + recursiveDelete(file); + } else if (file.getName().startsWith(".")) { + recursiveDelete(file); + } + } + } + + private void recursiveDelete(File file) { + if (file.isDirectory()) { + for (File current : file.listFiles()) { + if (current.isDirectory()) { + recursiveDelete(current); + } else { + current.delete(); + } + } + } + file.delete(); } private void ensureFoldersOfEntryExist(File folder, ZipEntry entry) { @@ -73,25 +102,22 @@ public class ZipDeflater { private void ensureOneLevelFolder(File folder) { File[] files = folder.listFiles(); - if (files.length == 1 && files[0].isDirectory()) { - File tempFile = new File(files[0].getPath() + new Random().nextInt(1000)); - files[0].renameTo(tempFile); - for (File file : tempFile.listFiles()) { - file.renameTo(new File(folder, file.getName())); - } - tempFile.delete(); + + if (files.length != 1) { + folder.renameTo(new File(folder.getParentFile(), folderNameFromZip())); + return; } + + files[0].renameTo(new File(folder.getParentFile(), files[0].getName())); + recursiveDelete(folder); } - private String tempFolderNameFromZip() { - String folderName = zipFile.getName(); - if (folderName.lastIndexOf(".") != -1) { - folderName = folderName.substring(0, folderName.lastIndexOf(".")); + private String folderNameFromZip() { + String filename = file.getName(); + if (filename.lastIndexOf(".") != -1) { + filename = filename.substring(0, filename.lastIndexOf(".")); } - if (folderName.lastIndexOf(File.separator) != -1) { - folderName = folderName.substring(folderName.lastIndexOf(File.separator) + 1); - } - return folderName; + return filename; } } From 8eab20516656e445843850febaad87893897f938 Mon Sep 17 00:00:00 2001 From: Federico Fissore Date: Thu, 18 Oct 2012 16:49:14 +0200 Subject: [PATCH 03/12] import library also import folder (already expanded libraries) Conflicts: app/src/processing/app/helpers/FileUtils.java app/test/processing/app/tools/ZipDeflaterTest.java --- app/src/processing/app/Base.java | 52 ++++++++---- app/src/processing/app/Editor.java | 4 +- app/src/processing/app/helpers/FileUtils.java | 81 +++++++++++++++++++ app/src/processing/app/tools/ZipDeflater.java | 21 ++--- 4 files changed, 124 insertions(+), 34 deletions(-) create mode 100644 app/src/processing/app/helpers/FileUtils.java diff --git a/app/src/processing/app/Base.java b/app/src/processing/app/Base.java index 401def98c..b1d34b709 100644 --- a/app/src/processing/app/Base.java +++ b/app/src/processing/app/Base.java @@ -31,6 +31,7 @@ import javax.swing.*; import processing.app.debug.Compiler; import processing.app.debug.Target; +import processing.app.helpers.FileUtils; import processing.app.tools.ZipDeflater; import processing.core.*; import static processing.app.I18n._; @@ -2364,24 +2365,43 @@ public class Base { } } + public void handleAddLibrary(Editor editor) { + JFileChooser fileChooser = new JFileChooser(System.getProperty("user.home")); + fileChooser.setDialogTitle(_("Select a zip file or a folder containing the library you'd like to add")); + fileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); - public void handleAddZipLibrary(Editor editor) { - String prompt = _("Select a zip file containing the library you'd like to add"); - FileDialog fd = new FileDialog(editor, prompt, FileDialog.LOAD); - fd.setDirectory(System.getProperty("user.home")); - fd.setVisible(true); + Dimension preferredSize = fileChooser.getPreferredSize(); + fileChooser.setPreferredSize(new Dimension(preferredSize.width + 200, preferredSize.height + 200)); + + int returnVal = fileChooser.showOpenDialog(editor); - String directory = fd.getDirectory(); - String filename = fd.getFile(); - if (filename == null) return; - - File sourceFile = new File(directory, filename); - try { - ZipDeflater zipDeflater = new ZipDeflater(sourceFile, getSketchbookLibrariesFolder()); - zipDeflater.deflate(); - editor.statusNotice(_("Library added to your libraries. Check \"Import library\" menu")); - } catch (IOException e) { - editor.statusError(e); + if (returnVal != JFileChooser.APPROVE_OPTION) { + return; } + + File sourceFile = fileChooser.getSelectedFile(); + + if (sourceFile.isDirectory()) { + File destinationFolder = new File(getSketchbookLibrariesFolder(), sourceFile.getName()); + if (!destinationFolder.mkdir()) { + editor.statusError("Can't create folder: " + sourceFile.getName() + " into libraries folder"); + return; + } + try { + FileUtils.copy(sourceFile, destinationFolder); + } catch (IOException e) { + editor.statusError(e); + return; + } + } else { + try { + ZipDeflater zipDeflater = new ZipDeflater(sourceFile, getSketchbookLibrariesFolder()); + zipDeflater.deflate(); + } catch (IOException e) { + editor.statusError(e); + return; + } + } + editor.statusNotice(_("Library added to your libraries. Check \"Import library\" menu")); } } diff --git a/app/src/processing/app/Editor.java b/app/src/processing/app/Editor.java index cb18b0e44..52de7b66e 100644 --- a/app/src/processing/app/Editor.java +++ b/app/src/processing/app/Editor.java @@ -631,10 +631,10 @@ public class Editor extends JFrame implements RunnerListener { } sketchMenu.add(importMenu); - item = new JMenuItem(_("Add Library from ZIP")); + item = new JMenuItem(_("Add Library...")); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - base.handleAddZipLibrary(Editor.this); + base.handleAddLibrary(Editor.this); base.onBoardOrPortChange(); base.rebuildImportMenu(Editor.importMenu); } diff --git a/app/src/processing/app/helpers/FileUtils.java b/app/src/processing/app/helpers/FileUtils.java new file mode 100644 index 000000000..5902db40b --- /dev/null +++ b/app/src/processing/app/helpers/FileUtils.java @@ -0,0 +1,81 @@ +package processing.app.helpers; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; + +public class FileUtils { + + /** + * Checks, whether the child directory is a subdirectory of the base directory. + * + * @param base + * the base directory. + * @param child + * the suspected child directory. + * @return true, if the child is a subdirectory of the base directory. + */ + public static boolean isSubDirectory(File base, File child) { + try { + base = base.getCanonicalFile(); + child = child.getCanonicalFile(); + } catch (IOException e) { + return false; + } + + File parentFile = child; + while (parentFile != null) { + if (base.equals(parentFile)) { + return true; + } + parentFile = parentFile.getParentFile(); + } + return false; + } + + public static void copy(File sourceFolder, File destFolder) throws IOException { + for (File file : sourceFolder.listFiles()) { + File destFile = new File(destFolder, file.getName()); + if (file.isDirectory()) { + if (!destFile.mkdir()) { + throw new IOException("Unable to create folder: " + destFile); + } + copy(file, destFile); + } else { + FileInputStream fis = null; + FileOutputStream fos = null; + try { + fis = new FileInputStream(file); + fos = new FileOutputStream(destFile); + byte[] buf = new byte[4096]; + int readBytes = -1; + while ((readBytes = fis.read(buf, 0, buf.length)) != -1) { + fos.write(buf, 0, readBytes); + } + } finally { + if (fis != null) { + fis.close(); + } + if (fos != null) { + fos.close(); + } + } + } + } + } + + public static void recursiveDelete(File file) { + if (file.isDirectory()) { + for (File current : file.listFiles()) { + if (current.isDirectory()) { + recursiveDelete(current); + } else { + current.delete(); + } + } + } + file.delete(); + } + +} diff --git a/app/src/processing/app/tools/ZipDeflater.java b/app/src/processing/app/tools/ZipDeflater.java index 6a1cf2c5d..55f0c0c8b 100644 --- a/app/src/processing/app/tools/ZipDeflater.java +++ b/app/src/processing/app/tools/ZipDeflater.java @@ -10,6 +10,8 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipException; import java.util.zip.ZipFile; +import processing.app.helpers.FileUtils; + public class ZipDeflater { private final ZipFile zipFile; @@ -71,26 +73,13 @@ public class ZipDeflater { private void deleteUndesiredFoldersAndFiles(File folder) { for (File file : folder.listFiles()) { if (file.isDirectory() && "__MACOSX".equals(file.getName())) { - recursiveDelete(file); + FileUtils.recursiveDelete(file); } else if (file.getName().startsWith(".")) { - recursiveDelete(file); + FileUtils.recursiveDelete(file); } } } - private void recursiveDelete(File file) { - if (file.isDirectory()) { - for (File current : file.listFiles()) { - if (current.isDirectory()) { - recursiveDelete(current); - } else { - current.delete(); - } - } - } - file.delete(); - } - private void ensureFoldersOfEntryExist(File folder, ZipEntry entry) { String[] parts = entry.getName().split("/"); File current = folder; @@ -109,7 +98,7 @@ public class ZipDeflater { } files[0].renameTo(new File(folder.getParentFile(), files[0].getName())); - recursiveDelete(folder); + FileUtils.recursiveDelete(folder); } private String folderNameFromZip() { From 1cdf75d4df368cbb83cb0cd2092aaeaaf27e7c79 Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Sat, 6 Apr 2013 12:55:39 +0200 Subject: [PATCH 04/12] "Add library" moved into "Import library" menu --- app/src/processing/app/Base.java | 18 ++++++++++++++---- app/src/processing/app/Editor.java | 14 ++------------ build/shared/revisions.txt | 6 +++++- 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/app/src/processing/app/Base.java b/app/src/processing/app/Base.java index b1d34b709..bb5d4d55a 100644 --- a/app/src/processing/app/Base.java +++ b/app/src/processing/app/Base.java @@ -944,10 +944,20 @@ public class Base { } - public void rebuildImportMenu(JMenu importMenu) { - //System.out.println("rebuilding import menu"); + public void rebuildImportMenu(JMenu importMenu, final Editor editor) { importMenu.removeAll(); - + + JMenuItem addLibraryMenuItem = new JMenuItem(_("Add Library...")); + addLibraryMenuItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + Base.this.handleAddLibrary(editor); + Base.this.onBoardOrPortChange(); + Base.this.rebuildImportMenu(Editor.importMenu, editor); + } + }); + importMenu.add(addLibraryMenuItem); + importMenu.addSeparator(); + // reset the set of libraries libraries = new HashSet(); @@ -999,7 +1009,7 @@ public class Base { } - public void rebuildBoardsMenu(JMenu menu) { + public void rebuildBoardsMenu(JMenu menu, final Editor editor) { //System.out.println("rebuilding boards menu"); menu.removeAll(); ButtonGroup group = new ButtonGroup(); diff --git a/app/src/processing/app/Editor.java b/app/src/processing/app/Editor.java index 52de7b66e..4fc2d13cd 100644 --- a/app/src/processing/app/Editor.java +++ b/app/src/processing/app/Editor.java @@ -627,20 +627,10 @@ public class Editor extends JFrame implements RunnerListener { if (importMenu == null) { importMenu = new JMenu(_("Import Library...")); - base.rebuildImportMenu(importMenu); + base.rebuildImportMenu(importMenu, this); } sketchMenu.add(importMenu); - item = new JMenuItem(_("Add Library...")); - item.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - base.handleAddLibrary(Editor.this); - base.onBoardOrPortChange(); - base.rebuildImportMenu(Editor.importMenu); - } - }); - sketchMenu.add(item); - item = newJMenuItem(_("Show Sketch Folder"), 'K'); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { @@ -690,7 +680,7 @@ public class Editor extends JFrame implements RunnerListener { if (boardsMenu == null) { boardsMenu = new JMenu(_("Board")); - base.rebuildBoardsMenu(boardsMenu); + base.rebuildBoardsMenu(boardsMenu, this); } menu.add(boardsMenu); diff --git a/build/shared/revisions.txt b/build/shared/revisions.txt index 3f7e61b23..ef3d7bb20 100644 --- a/build/shared/revisions.txt +++ b/build/shared/revisions.txt @@ -1,5 +1,5 @@ -ARDUINO 1.0.5 - 2013.03.29 +ARDUINO 1.0.5 - 2013.05.15 [core] @@ -15,6 +15,10 @@ ARDUINO 1.0.5 - 2013.03.29 * Upgrades to WiFi firmwares +[ide] + +* Backport from 1.5: install Library from .zip file or folder + ARDUINO 1.0.4 - 2013.03.11 [core] From 29856fff53dda02118feef69aa0383fc2610683f Mon Sep 17 00:00:00 2001 From: Federico Fissore Date: Fri, 19 Oct 2012 10:35:48 +0200 Subject: [PATCH 05/12] improved import library: complains if invalid zip or folders are selected --- app/src/processing/app/Base.java | 48 ++++++++++++++----- app/src/processing/app/helpers/FileUtils.java | 12 +++++ 2 files changed, 49 insertions(+), 11 deletions(-) diff --git a/app/src/processing/app/Base.java b/app/src/processing/app/Base.java index bb5d4d55a..30ba20136 100644 --- a/app/src/processing/app/Base.java +++ b/app/src/processing/app/Base.java @@ -2382,7 +2382,7 @@ public class Base { Dimension preferredSize = fileChooser.getPreferredSize(); fileChooser.setPreferredSize(new Dimension(preferredSize.width + 200, preferredSize.height + 200)); - + int returnVal = fileChooser.showOpenDialog(editor); if (returnVal != JFileChooser.APPROVE_OPTION) { @@ -2390,8 +2390,39 @@ public class Base { } File sourceFile = fileChooser.getSelectedFile(); + File tmpFolder = null; - if (sourceFile.isDirectory()) { + try { + // unpack ZIP + if (!sourceFile.isDirectory()) { + try { + tmpFolder = FileUtils.createTempFolder(); + ZipDeflater zipDeflater = new ZipDeflater(sourceFile, tmpFolder); + zipDeflater.deflate(); + File[] foldersInTmpFolder = tmpFolder.listFiles(new OnlyDirs()); + if (foldersInTmpFolder.length != 1) { + throw new IOException("Zip doesn't contain one library"); + } + sourceFile = foldersInTmpFolder[0]; + } catch (IOException e) { + editor.statusError(e); + return; + } + } + + // is there a library? + File libFolder = scanFatLibrary(sourceFile); + if (libFolder == null) { + editor.statusError("Not a valid library"); + return; + } + String[] headerFiles = headerListFromIncludePath(libFolder); + if (headerFiles == null || headerFiles.length == 0) { + editor.statusError("Not a valid library"); + return; + } + + // copy folder File destinationFolder = new File(getSketchbookLibrariesFolder(), sourceFile.getName()); if (!destinationFolder.mkdir()) { editor.statusError("Can't create folder: " + sourceFile.getName() + " into libraries folder"); @@ -2403,15 +2434,10 @@ public class Base { editor.statusError(e); return; } - } else { - try { - ZipDeflater zipDeflater = new ZipDeflater(sourceFile, getSketchbookLibrariesFolder()); - zipDeflater.deflate(); - } catch (IOException e) { - editor.statusError(e); - return; - } + editor.statusNotice(_("Library added to your libraries. Check \"Import library\" menu")); + } finally { + // delete zip created temp folder, if exists + FileUtils.recursiveDelete(tmpFolder); } - editor.statusNotice(_("Library added to your libraries. Check \"Import library\" menu")); } } diff --git a/app/src/processing/app/helpers/FileUtils.java b/app/src/processing/app/helpers/FileUtils.java index 5902db40b..47c5b0a32 100644 --- a/app/src/processing/app/helpers/FileUtils.java +++ b/app/src/processing/app/helpers/FileUtils.java @@ -4,6 +4,7 @@ import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; +import java.util.Random; public class FileUtils { @@ -66,6 +67,9 @@ public class FileUtils { } public static void recursiveDelete(File file) { + if (file == null) { + return; + } if (file.isDirectory()) { for (File current : file.listFiles()) { if (current.isDirectory()) { @@ -78,4 +82,12 @@ public class FileUtils { file.delete(); } + public static File createTempFolder() throws IOException { + File tmpFolder = new File(System.getProperty("java.io.tmpdir"), "arduino_" + new Random().nextInt(1000000)); + if (!tmpFolder.mkdir()) { + throw new IOException("Unable to create temp folder " + tmpFolder); + } + return tmpFolder; + } + } From 3d5c76a8a1eb1bea27869af85a99670a4761fbeb Mon Sep 17 00:00:00 2001 From: Federico Fissore Date: Fri, 19 Oct 2012 10:41:43 +0200 Subject: [PATCH 06/12] also rebuild examples menu after library import --- app/src/processing/app/Base.java | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/processing/app/Base.java b/app/src/processing/app/Base.java index 30ba20136..2e8091eb9 100644 --- a/app/src/processing/app/Base.java +++ b/app/src/processing/app/Base.java @@ -953,6 +953,7 @@ public class Base { Base.this.handleAddLibrary(editor); Base.this.onBoardOrPortChange(); Base.this.rebuildImportMenu(Editor.importMenu, editor); + Base.this.rebuildExamplesMenu(Editor.examplesMenu); } }); importMenu.add(addLibraryMenuItem); From 8266ac5aad6b83abffcfe586807d08972d33e082 Mon Sep 17 00:00:00 2001 From: Federico Fissore Date: Fri, 19 Oct 2012 10:49:23 +0200 Subject: [PATCH 07/12] better error message when library names clash filter out non .ZIP files --- app/src/processing/app/Base.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/processing/app/Base.java b/app/src/processing/app/Base.java index 2e8091eb9..efad32f1b 100644 --- a/app/src/processing/app/Base.java +++ b/app/src/processing/app/Base.java @@ -28,6 +28,7 @@ import java.io.*; import java.util.*; import javax.swing.*; +import javax.swing.filechooser.FileNameExtensionFilter; import processing.app.debug.Compiler; import processing.app.debug.Target; @@ -2380,6 +2381,7 @@ public class Base { JFileChooser fileChooser = new JFileChooser(System.getProperty("user.home")); fileChooser.setDialogTitle(_("Select a zip file or a folder containing the library you'd like to add")); fileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); + fileChooser.setFileFilter(new FileNameExtensionFilter("ZIP files or folders", "zip")); Dimension preferredSize = fileChooser.getPreferredSize(); fileChooser.setPreferredSize(new Dimension(preferredSize.width + 200, preferredSize.height + 200)); @@ -2426,7 +2428,7 @@ public class Base { // copy folder File destinationFolder = new File(getSketchbookLibrariesFolder(), sourceFile.getName()); if (!destinationFolder.mkdir()) { - editor.statusError("Can't create folder: " + sourceFile.getName() + " into libraries folder"); + editor.statusError("A library named " + sourceFile.getName() + " already exists"); return; } try { From fa9566235d0a878f5c7a51342834548c59c0da3b Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Wed, 24 Oct 2012 12:50:30 +0200 Subject: [PATCH 08/12] Disabled 'fat' (multiplatform) library check. Conflicts: app/src/processing/app/Base.java --- app/src/processing/app/Base.java | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/app/src/processing/app/Base.java b/app/src/processing/app/Base.java index efad32f1b..0ae732238 100644 --- a/app/src/processing/app/Base.java +++ b/app/src/processing/app/Base.java @@ -2381,7 +2381,7 @@ public class Base { JFileChooser fileChooser = new JFileChooser(System.getProperty("user.home")); fileChooser.setDialogTitle(_("Select a zip file or a folder containing the library you'd like to add")); fileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); - fileChooser.setFileFilter(new FileNameExtensionFilter("ZIP files or folders", "zip")); + fileChooser.setFileFilter(new FileNameExtensionFilter(_("ZIP files or folders"), "zip")); Dimension preferredSize = fileChooser.getPreferredSize(); fileChooser.setPreferredSize(new Dimension(preferredSize.width + 200, preferredSize.height + 200)); @@ -2404,7 +2404,7 @@ public class Base { zipDeflater.deflate(); File[] foldersInTmpFolder = tmpFolder.listFiles(new OnlyDirs()); if (foldersInTmpFolder.length != 1) { - throw new IOException("Zip doesn't contain one library"); + throw new IOException(_("Zip doesn't contain a library")); } sourceFile = foldersInTmpFolder[0]; } catch (IOException e) { @@ -2413,22 +2413,27 @@ public class Base { } } - // is there a library? - File libFolder = scanFatLibrary(sourceFile); - if (libFolder == null) { - editor.statusError("Not a valid library"); + // is there a valid library? + File libFolder = sourceFile; + String libName = libFolder.getName(); + if (!Sketch.isSanitaryName(libName)) { + String mess = I18n.format(_("The library \"{0}\" cannot be used.\n" + + "Library names must contain only basic letters and numbers.\n" + + "(ASCII only and no spaces, and it cannot start with a number)"), + libName); + editor.statusError(mess); return; } String[] headerFiles = headerListFromIncludePath(libFolder); if (headerFiles == null || headerFiles.length == 0) { - editor.statusError("Not a valid library"); + editor.statusError(_("Not a valid library: no header files found")); return; } // copy folder File destinationFolder = new File(getSketchbookLibrariesFolder(), sourceFile.getName()); if (!destinationFolder.mkdir()) { - editor.statusError("A library named " + sourceFile.getName() + " already exists"); + editor.statusError(I18n.format(_("A library named {0} already exists"), sourceFile.getName())); return; } try { From 544445524a8b3d863e6713952ff106fa2e473e91 Mon Sep 17 00:00:00 2001 From: Federico Fissore Date: Tue, 4 Dec 2012 16:45:25 +0100 Subject: [PATCH 09/12] removed check on .h file existence --- app/src/processing/app/Base.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/app/src/processing/app/Base.java b/app/src/processing/app/Base.java index 0ae732238..b866b4814 100644 --- a/app/src/processing/app/Base.java +++ b/app/src/processing/app/Base.java @@ -2424,11 +2424,6 @@ public class Base { editor.statusError(mess); return; } - String[] headerFiles = headerListFromIncludePath(libFolder); - if (headerFiles == null || headerFiles.length == 0) { - editor.statusError(_("Not a valid library: no header files found")); - return; - } // copy folder File destinationFolder = new File(getSketchbookLibrariesFolder(), sourceFile.getName()); From 13d821456712cb0b88f4406e5f6a5ef7407ba45d Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Sat, 11 May 2013 12:02:14 +0200 Subject: [PATCH 10/12] Backported OnlyDirs.class --- app/src/processing/app/Base.java | 1 + .../app/helpers/filefilters/OnlyDirs.java | 42 +++++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 app/src/processing/app/helpers/filefilters/OnlyDirs.java diff --git a/app/src/processing/app/Base.java b/app/src/processing/app/Base.java index b866b4814..4e40f8c34 100644 --- a/app/src/processing/app/Base.java +++ b/app/src/processing/app/Base.java @@ -33,6 +33,7 @@ import javax.swing.filechooser.FileNameExtensionFilter; import processing.app.debug.Compiler; import processing.app.debug.Target; import processing.app.helpers.FileUtils; +import processing.app.helpers.filefilters.OnlyDirs; import processing.app.tools.ZipDeflater; import processing.core.*; import static processing.app.I18n._; diff --git a/app/src/processing/app/helpers/filefilters/OnlyDirs.java b/app/src/processing/app/helpers/filefilters/OnlyDirs.java new file mode 100644 index 000000000..46f407248 --- /dev/null +++ b/app/src/processing/app/helpers/filefilters/OnlyDirs.java @@ -0,0 +1,42 @@ +/* + OnlyDirs - FilenameFilter that accepts only directories (CVS, .svn, + .DS_Store files are excluded as well) + Part of the Arduino project - http://www.arduino.cc/ + + Copyright (c) 2011 Cristian Maglie + + 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.helpers.filefilters; + +import java.io.File; +import java.io.FilenameFilter; + +/** + * This filter accepts only directories (excluding .DS_Store files, .svn + * folders, etc) + * + * @author Cristian Maglie + */ +public class OnlyDirs implements FilenameFilter { + + public boolean accept(File dir, String name) { + if (name.charAt(0) == '.') + return false; + if (name.equals("CVS")) + return false; + return new File(dir, name).isDirectory(); + } +} From 62846f1f1b206aac2c74a6491932c4780414d9e0 Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Sat, 11 May 2013 12:56:07 +0200 Subject: [PATCH 11/12] Fixed disappearing 'Import library' menu --- app/src/processing/app/Editor.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/processing/app/Editor.java b/app/src/processing/app/Editor.java index 4fc2d13cd..774d20f74 100644 --- a/app/src/processing/app/Editor.java +++ b/app/src/processing/app/Editor.java @@ -177,7 +177,7 @@ public class Editor extends JFrame implements RunnerListener { // re-add the sub-menus that are shared by all windows fileMenu.insert(sketchbookMenu, 2); fileMenu.insert(examplesMenu, 3); - //sketchMenu.insert(importMenu, 4); + sketchMenu.insert(importMenu, 4); toolsMenu.insert(boardsMenu, numTools); toolsMenu.insert(serialMenu, numTools + 1); } @@ -188,7 +188,7 @@ public class Editor extends JFrame implements RunnerListener { // System.err.println("deactivate"); // not coming through fileMenu.remove(sketchbookMenu); fileMenu.remove(examplesMenu); - //sketchMenu.remove(importMenu); + sketchMenu.remove(importMenu); toolsMenu.remove(boardsMenu); toolsMenu.remove(serialMenu); } From 296bdacfb976f88841adfdccf4ac3c635a2ec31f Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Sat, 11 May 2013 13:23:51 +0200 Subject: [PATCH 12/12] Updated revision log --- build/shared/revisions.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/build/shared/revisions.txt b/build/shared/revisions.txt index ef3d7bb20..e0a6922c1 100644 --- a/build/shared/revisions.txt +++ b/build/shared/revisions.txt @@ -6,10 +6,13 @@ ARDUINO 1.0.5 - 2013.05.15 * [avr] malloc bug: backported avr-libc 1.8.0 implementation * [avr] removed deprecated interrupt handlers causing compiler issues with newer avr-gcc. +* [avr] added c_str() method to String +* [avr] Stream "_timeout" field and related methods are now protected [libraries] * Upgrades to WiFi library +* Fixed a bunch of examples [firmwares] @@ -18,6 +21,9 @@ ARDUINO 1.0.5 - 2013.05.15 [ide] * Backport from 1.5: install Library from .zip file or folder +* Added button "Copy error to clipboard" (Paul Stoffregen) +* Updated windows drivers +* Added Windows installer ARDUINO 1.0.4 - 2013.03.11