Skip to content

Commit 44045cc

Browse files
committed
import library also import folder (already expanded libraries)
1 parent 378c439 commit 44045cc

File tree

5 files changed

+93
-48
lines changed

5 files changed

+93
-48
lines changed

app/src/processing/app/Base.java

Lines changed: 34 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2596,24 +2596,43 @@ static protected void listFiles(String basePath,
25962596
}
25972597
}
25982598

2599+
public void handleAddLibrary(Editor editor) {
2600+
JFileChooser fileChooser = new JFileChooser(System.getProperty("user.home"));
2601+
fileChooser.setDialogTitle(_("Select a zip file or a folder containing the library you'd like to add"));
2602+
fileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
25992603

2600-
public void handleAddZipLibrary(Editor editor) {
2601-
String prompt = _("Select a zip file containing the library you'd like to add");
2602-
FileDialog fd = new FileDialog(editor, prompt, FileDialog.LOAD);
2603-
fd.setDirectory(System.getProperty("user.home"));
2604-
fd.setVisible(true);
2604+
Dimension preferredSize = fileChooser.getPreferredSize();
2605+
fileChooser.setPreferredSize(new Dimension(preferredSize.width + 200, preferredSize.height + 200));
2606+
2607+
int returnVal = fileChooser.showOpenDialog(editor);
26052608

2606-
String directory = fd.getDirectory();
2607-
String filename = fd.getFile();
2608-
if (filename == null) return;
2609+
if (returnVal != JFileChooser.APPROVE_OPTION) {
2610+
return;
2611+
}
26092612

2610-
File sourceFile = new File(directory, filename);
2611-
try {
2612-
ZipDeflater zipDeflater = new ZipDeflater(sourceFile, getSketchbookLibrariesFolder());
2613-
zipDeflater.deflate();
2614-
editor.statusNotice(_("Library added to your libraries. Check \"Import library\" menu"));
2615-
} catch (IOException e) {
2616-
editor.statusError(e);
2613+
File sourceFile = fileChooser.getSelectedFile();
2614+
2615+
if (sourceFile.isDirectory()) {
2616+
File destinationFolder = new File(getSketchbookLibrariesFolder(), sourceFile.getName());
2617+
if (!destinationFolder.mkdir()) {
2618+
editor.statusError("Can't create folder: " + sourceFile.getName() + " into libraries folder");
2619+
return;
2620+
}
2621+
try {
2622+
FileUtils.copy(sourceFile, destinationFolder);
2623+
} catch (IOException e) {
2624+
editor.statusError(e);
2625+
return;
2626+
}
2627+
} else {
2628+
try {
2629+
ZipDeflater zipDeflater = new ZipDeflater(sourceFile, getSketchbookLibrariesFolder());
2630+
zipDeflater.deflate();
2631+
} catch (IOException e) {
2632+
editor.statusError(e);
2633+
return;
2634+
}
26172635
}
2636+
editor.statusNotice(_("Library added to your libraries. Check \"Import library\" menu"));
26182637
}
26192638
}

app/src/processing/app/Editor.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -634,10 +634,10 @@ public void actionPerformed(ActionEvent e) {
634634
}
635635
sketchMenu.add(importMenu);
636636

637-
item = new JMenuItem(_("Add Library from ZIP"));
637+
item = new JMenuItem(_("Add Library..."));
638638
item.addActionListener(new ActionListener() {
639639
public void actionPerformed(ActionEvent e) {
640-
base.handleAddZipLibrary(Editor.this);
640+
base.handleAddLibrary(Editor.this);
641641
base.onBoardOrPortChange();
642642
base.rebuildImportMenu(Editor.importMenu);
643643
}

app/src/processing/app/helpers/FileUtils.java

Lines changed: 49 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
package processing.app.helpers;
22

33
import java.io.File;
4+
import java.io.FileInputStream;
5+
import java.io.FileOutputStream;
46
import java.io.IOException;
57

68
public class FileUtils {
7-
9+
810
/**
9-
* Checks, whether the child directory is a subdirectory of the base
10-
* directory.
11+
* Checks, whether the child directory is a subdirectory of the base directory.
1112
*
1213
* @param base
1314
* the base directory.
@@ -32,4 +33,49 @@ public static boolean isSubDirectory(File base, File child) {
3233
}
3334
return false;
3435
}
36+
37+
public static void copy(File sourceFolder, File destFolder) throws IOException {
38+
for (File file : sourceFolder.listFiles()) {
39+
File destFile = new File(destFolder, file.getName());
40+
if (file.isDirectory()) {
41+
if (!destFile.mkdir()) {
42+
throw new IOException("Unable to create folder: " + destFile);
43+
}
44+
copy(file, destFile);
45+
} else {
46+
FileInputStream fis = null;
47+
FileOutputStream fos = null;
48+
try {
49+
fis = new FileInputStream(file);
50+
fos = new FileOutputStream(destFile);
51+
byte[] buf = new byte[4096];
52+
int readBytes = -1;
53+
while ((readBytes = fis.read(buf, 0, buf.length)) != -1) {
54+
fos.write(buf, 0, readBytes);
55+
}
56+
} finally {
57+
if (fis != null) {
58+
fis.close();
59+
}
60+
if (fos != null) {
61+
fos.close();
62+
}
63+
}
64+
}
65+
}
66+
}
67+
68+
public static void recursiveDelete(File file) {
69+
if (file.isDirectory()) {
70+
for (File current : file.listFiles()) {
71+
if (current.isDirectory()) {
72+
recursiveDelete(current);
73+
} else {
74+
current.delete();
75+
}
76+
}
77+
}
78+
file.delete();
79+
}
80+
3581
}

app/src/processing/app/tools/ZipDeflater.java

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
import java.util.zip.ZipException;
1111
import java.util.zip.ZipFile;
1212

13+
import processing.app.helpers.FileUtils;
14+
1315
public class ZipDeflater {
1416

1517
private final ZipFile zipFile;
@@ -71,24 +73,11 @@ public void deflate() throws IOException {
7173
private void deleteUndesiredFoldersAndFiles(File folder) {
7274
for (File file : folder.listFiles()) {
7375
if (file.isDirectory() && "__MACOSX".equals(file.getName())) {
74-
recursiveDelete(file);
76+
FileUtils.recursiveDelete(file);
7577
} else if (file.getName().startsWith(".")) {
76-
recursiveDelete(file);
77-
}
78-
}
79-
}
80-
81-
private void recursiveDelete(File file) {
82-
if (file.isDirectory()) {
83-
for (File current : file.listFiles()) {
84-
if (current.isDirectory()) {
85-
recursiveDelete(current);
86-
} else {
87-
current.delete();
88-
}
78+
FileUtils.recursiveDelete(file);
8979
}
9080
}
91-
file.delete();
9281
}
9382

9483
private void ensureFoldersOfEntryExist(File folder, ZipEntry entry) {
@@ -109,7 +98,7 @@ private void ensureOneLevelFolder(File folder) {
10998
}
11099

111100
files[0].renameTo(new File(folder.getParentFile(), files[0].getName()));
112-
recursiveDelete(folder);
101+
FileUtils.recursiveDelete(folder);
113102
}
114103

115104
private String folderNameFromZip() {

app/test/processing/app/tools/ZipDeflaterTest.java

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
import org.junit.Before;
1111
import org.junit.Test;
1212

13+
import processing.app.helpers.FileUtils;
14+
1315
public class ZipDeflaterTest {
1416

1517
private File destFolder;
@@ -103,18 +105,7 @@ public void shouldDeleteHiddenFiles() throws Exception {
103105

104106
@After
105107
public void deleteTempFolder() {
106-
recursiveDelete(destFolder);
107-
}
108-
109-
private void recursiveDelete(File folder) {
110-
for (File file : folder.listFiles()) {
111-
if (file.isDirectory()) {
112-
recursiveDelete(file);
113-
} else {
114-
file.delete();
115-
}
116-
}
117-
folder.delete();
108+
FileUtils.recursiveDelete(destFolder);
118109
}
119110

120111
}

0 commit comments

Comments
 (0)