From 8eab20516656e445843850febaad87893897f938 Mon Sep 17 00:00:00 2001 From: Federico Fissore Date: Thu, 18 Oct 2012 16:49:14 +0200 Subject: [PATCH] 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() {