29
29
import java .util .List ;
30
30
31
31
import javax .swing .*;
32
+ import javax .swing .filechooser .FileNameExtensionFilter ;
32
33
33
34
import processing .app .debug .TargetPackage ;
34
35
import processing .app .debug .TargetPlatform ;
@@ -954,8 +955,19 @@ public Map<String, File> getUserLibs() {
954
955
return userLibs ;
955
956
}
956
957
957
- public void rebuildImportMenu (JMenu importMenu ) {
958
+ public void rebuildImportMenu (JMenu importMenu , final Editor editor ) {
958
959
importMenu .removeAll ();
960
+
961
+ JMenuItem addLibraryMenuItem = new JMenuItem (_ ("Add Library..." ));
962
+ addLibraryMenuItem .addActionListener (new ActionListener () {
963
+ public void actionPerformed (ActionEvent e ) {
964
+ Base .this .handleAddLibrary (editor );
965
+ Base .this .onBoardOrPortChange ();
966
+ Base .this .rebuildImportMenu (Editor .importMenu , editor );
967
+ Base .this .rebuildExamplesMenu (Editor .examplesMenu );
968
+ }
969
+ });
970
+ importMenu .add (addLibraryMenuItem );
959
971
960
972
// Split between user supplied libraries and IDE libraries
961
973
Map <String , File > ideLibs = getIDELibs ();
@@ -1108,7 +1120,7 @@ public void onBoardOrPortChange() {
1108
1120
}
1109
1121
1110
1122
1111
- public void rebuildBoardsMenu (JMenu boardsMenu , final JMenu cpuTypeMenu ) {
1123
+ public void rebuildBoardsMenu (JMenu boardsMenu , final JMenu cpuTypeMenu , final Editor editor ) {
1112
1124
String selPackage = Preferences .get ("target_package" );
1113
1125
String selPlatform = Preferences .get ("target_platform" );
1114
1126
String selBoard = Preferences .get ("board" );
@@ -1172,7 +1184,7 @@ public void actionPerformed(ActionEvent actionevent) {
1172
1184
1173
1185
onBoardOrPortChange ();
1174
1186
Sketch .buildSettingChanged ();
1175
- rebuildImportMenu (Editor .importMenu );
1187
+ rebuildImportMenu (Editor .importMenu , editor );
1176
1188
rebuildExamplesMenu (Editor .examplesMenu );
1177
1189
}
1178
1190
};
@@ -2600,22 +2612,54 @@ public void handleAddLibrary(Editor editor) {
2600
2612
JFileChooser fileChooser = new JFileChooser (System .getProperty ("user.home" ));
2601
2613
fileChooser .setDialogTitle (_ ("Select a zip file or a folder containing the library you'd like to add" ));
2602
2614
fileChooser .setFileSelectionMode (JFileChooser .FILES_AND_DIRECTORIES );
2615
+ fileChooser .setFileFilter (new FileNameExtensionFilter ("ZIP files or folders" , "zip" ));
2603
2616
2604
2617
Dimension preferredSize = fileChooser .getPreferredSize ();
2605
2618
fileChooser .setPreferredSize (new Dimension (preferredSize .width + 200 , preferredSize .height + 200 ));
2606
-
2619
+
2607
2620
int returnVal = fileChooser .showOpenDialog (editor );
2608
2621
2609
2622
if (returnVal != JFileChooser .APPROVE_OPTION ) {
2610
2623
return ;
2611
2624
}
2612
2625
2613
2626
File sourceFile = fileChooser .getSelectedFile ();
2627
+ File tmpFolder = null ;
2628
+
2629
+ try {
2630
+ // unpack ZIP
2631
+ if (!sourceFile .isDirectory ()) {
2632
+ try {
2633
+ tmpFolder = FileUtils .createTempFolder ();
2634
+ ZipDeflater zipDeflater = new ZipDeflater (sourceFile , tmpFolder );
2635
+ zipDeflater .deflate ();
2636
+ File [] foldersInTmpFolder = tmpFolder .listFiles (new OnlyDirs ());
2637
+ if (foldersInTmpFolder .length != 1 ) {
2638
+ throw new IOException ("Zip doesn't contain one library" );
2639
+ }
2640
+ sourceFile = foldersInTmpFolder [0 ];
2641
+ } catch (IOException e ) {
2642
+ editor .statusError (e );
2643
+ return ;
2644
+ }
2645
+ }
2646
+
2647
+ // is there a library?
2648
+ File libFolder = scanFatLibrary (sourceFile );
2649
+ if (libFolder == null ) {
2650
+ editor .statusError ("Not a valid library" );
2651
+ return ;
2652
+ }
2653
+ String [] headerFiles = headerListFromIncludePath (libFolder );
2654
+ if (headerFiles == null || headerFiles .length == 0 ) {
2655
+ editor .statusError ("Not a valid library" );
2656
+ return ;
2657
+ }
2614
2658
2615
- if ( sourceFile . isDirectory ()) {
2659
+ // copy folder
2616
2660
File destinationFolder = new File (getSketchbookLibrariesFolder (), sourceFile .getName ());
2617
2661
if (!destinationFolder .mkdir ()) {
2618
- editor .statusError ("Can't create folder: " + sourceFile .getName () + " into libraries folder " );
2662
+ editor .statusError ("A library named " + sourceFile .getName () + " already exists " );
2619
2663
return ;
2620
2664
}
2621
2665
try {
@@ -2624,15 +2668,10 @@ public void handleAddLibrary(Editor editor) {
2624
2668
editor .statusError (e );
2625
2669
return ;
2626
2670
}
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
- }
2671
+ editor .statusNotice (_ ("Library added to your libraries. Check \" Import library\" menu" ));
2672
+ } finally {
2673
+ // delete zip created temp folder, if exists
2674
+ FileUtils .recursiveDelete (tmpFolder );
2635
2675
}
2636
- editor .statusNotice (_ ("Library added to your libraries. Check \" Import library\" menu" ));
2637
2676
}
2638
2677
}
0 commit comments