From 44045cc85d1edb66e217e5a77b63529e19850e16 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) --- app/src/processing/app/Base.java | 51 ++++++++++++------ app/src/processing/app/Editor.java | 4 +- app/src/processing/app/helpers/FileUtils.java | 52 +++++++++++++++++-- app/src/processing/app/tools/ZipDeflater.java | 21 ++------ .../processing/app/tools/ZipDeflaterTest.java | 15 ++---- 5 files changed, 94 insertions(+), 49 deletions(-) diff --git a/app/src/processing/app/Base.java b/app/src/processing/app/Base.java index 59966ffc0..5e27138c0 100644 --- a/app/src/processing/app/Base.java +++ b/app/src/processing/app/Base.java @@ -2596,24 +2596,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 6d11af86d..4eff70411 100644 --- a/app/src/processing/app/Editor.java +++ b/app/src/processing/app/Editor.java @@ -634,10 +634,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 index 68c0c07a8..5902db40b 100644 --- a/app/src/processing/app/helpers/FileUtils.java +++ b/app/src/processing/app/helpers/FileUtils.java @@ -1,13 +1,14 @@ 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. + * Checks, whether the child directory is a subdirectory of the base directory. * * @param base * the base directory. @@ -32,4 +33,49 @@ public class FileUtils { } 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() { diff --git a/app/test/processing/app/tools/ZipDeflaterTest.java b/app/test/processing/app/tools/ZipDeflaterTest.java index a24688318..ba240254d 100644 --- a/app/test/processing/app/tools/ZipDeflaterTest.java +++ b/app/test/processing/app/tools/ZipDeflaterTest.java @@ -10,6 +10,8 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; +import processing.app.helpers.FileUtils; + public class ZipDeflaterTest { private File destFolder; @@ -103,18 +105,7 @@ public class ZipDeflaterTest { @After public void deleteTempFolder() { - recursiveDelete(destFolder); - } - - private void recursiveDelete(File folder) { - for (File file : folder.listFiles()) { - if (file.isDirectory()) { - recursiveDelete(file); - } else { - file.delete(); - } - } - folder.delete(); + FileUtils.recursiveDelete(destFolder); } }