85
85
import java .net .URI ;
86
86
import java .net .URISyntaxException ;
87
87
import java .nio .file .Path ;
88
- import java .util .ArrayList ;
89
- import java .util .Enumeration ;
88
+ import java .util .*;
90
89
import java .util .List ;
91
- import java .util .Objects ;
92
90
import java .util .concurrent .CancellationException ;
93
91
import java .util .concurrent .ExecutionException ;
92
+ import java .util .stream .Collectors ;
94
93
95
94
/**
96
95
* @author jcaron
@@ -655,6 +654,7 @@ private void initComponents()
655
654
_playlistTreeRightClickMenu = new javax .swing .JPopupMenu ();
656
655
_miRefreshDirectoryTree = new javax .swing .JMenuItem ();
657
656
_miOpenSelectedPlaylists = new javax .swing .JMenuItem ();
657
+ _miOpenSelectedPlaylistLocation = new javax .swing .JMenuItem ();
658
658
_miExactMatchesSearch = new javax .swing .JMenuItem ();
659
659
_miClosestMatchesSearch = new javax .swing .JMenuItem ();
660
660
_miDeletePlaylist = new javax .swing .JMenuItem ();
@@ -691,6 +691,7 @@ private void initComponents()
691
691
_fileMenu = new JMenu ();
692
692
_newPlaylistMenuItem = new javax .swing .JMenuItem ();
693
693
_loadMenuItem = new javax .swing .JMenuItem ();
694
+ _openPlaylistLocationMenuItem = new javax .swing .JMenuItem ();
694
695
_closeMenuItem = new javax .swing .JMenuItem ();
695
696
_closeAllMenuItem = new javax .swing .JMenuItem ();
696
697
jSeparator1 = new javax .swing .JPopupMenu .Separator ();
@@ -719,25 +720,17 @@ private void initComponents()
719
720
_aboutMenuItem = new javax .swing .JMenuItem ();
720
721
721
722
_miRefreshDirectoryTree .setText ("Refresh" );
722
- _miRefreshDirectoryTree .addActionListener (new java .awt .event .ActionListener ()
723
- {
724
- public void actionPerformed (java .awt .event .ActionEvent evt )
725
- {
726
- _miRefreshDirectoryTreeActionPerformed (evt );
727
- }
728
- });
723
+ _miRefreshDirectoryTree .addActionListener (evt -> _miRefreshDirectoryTreeActionPerformed (evt ));
729
724
_playlistTreeRightClickMenu .add (_miRefreshDirectoryTree );
730
725
731
726
_miOpenSelectedPlaylists .setText ("Open" );
732
- _miOpenSelectedPlaylists .addActionListener (new java .awt .event .ActionListener ()
733
- {
734
- public void actionPerformed (java .awt .event .ActionEvent evt )
735
- {
736
- _miOpenSelectedPlaylistsActionPerformed (evt );
737
- }
738
- });
727
+ _miOpenSelectedPlaylists .addActionListener (evt -> _miOpenSelectedPlaylistsActionPerformed (evt ));
739
728
_playlistTreeRightClickMenu .add (_miOpenSelectedPlaylists );
740
729
730
+ _miOpenSelectedPlaylistLocation .setText ("Open Playlist Location" );
731
+ _miOpenSelectedPlaylistLocation .addActionListener (evt -> this .openPlaylistFoldersFromPlaylistTree ());
732
+ _playlistTreeRightClickMenu .add (_miOpenSelectedPlaylistLocation );
733
+
741
734
_miExactMatchesSearch .setText ("Find Exact Matches" );
742
735
_miExactMatchesSearch .addActionListener (evt -> _miExactMatchesSearchActionPerformed (evt ));
743
736
_playlistTreeRightClickMenu .add (_miExactMatchesSearch );
@@ -891,27 +884,15 @@ public void keyPressed(java.awt.event.KeyEvent evt)
891
884
_btnSetPlaylistsDir .setText ("Set" );
892
885
_btnSetPlaylistsDir .setToolTipText ("Opens the options screen where you can set your playlists directory " );
893
886
_btnSetPlaylistsDir .setMargin (new java .awt .Insets (2 , 8 , 2 , 8 ));
894
- _btnSetPlaylistsDir .addActionListener (new java .awt .event .ActionListener ()
895
- {
896
- public void actionPerformed (java .awt .event .ActionEvent evt )
897
- {
898
- _btnSetPlaylistsDirActionPerformed (evt );
899
- }
900
- });
887
+ _btnSetPlaylistsDir .addActionListener (evt -> _btnSetPlaylistsDirActionPerformed (evt ));
901
888
_playlistsDirectoryButtonPanel .add (_btnSetPlaylistsDir );
902
889
903
890
_btnRefresh .setText ("Refresh" );
904
891
_btnRefresh .setToolTipText ("Refresh Playlists Tree" );
905
892
_btnRefresh .setFocusable (false );
906
893
_btnRefresh .setMargin (new java .awt .Insets (2 , 8 , 2 , 8 ));
907
894
_btnRefresh .setMinimumSize (new java .awt .Dimension (71 , 25 ));
908
- _btnRefresh .addActionListener (new java .awt .event .ActionListener ()
909
- {
910
- public void actionPerformed (java .awt .event .ActionEvent evt )
911
- {
912
- _btnRefreshActionPerformed (evt );
913
- }
914
- });
895
+ _btnRefresh .addActionListener (evt -> _btnRefreshActionPerformed (evt ));
915
896
_playlistsDirectoryButtonPanel .add (_btnRefresh );
916
897
917
898
_btnOpenSelected .setText ("Open" );
@@ -920,39 +901,21 @@ public void actionPerformed(java.awt.event.ActionEvent evt)
920
901
_btnOpenSelected .setFocusable (false );
921
902
_btnOpenSelected .setMargin (new java .awt .Insets (2 , 8 , 2 , 8 ));
922
903
_btnOpenSelected .setMinimumSize (new java .awt .Dimension (71 , 25 ));
923
- _btnOpenSelected .addActionListener (new java .awt .event .ActionListener ()
924
- {
925
- public void actionPerformed (java .awt .event .ActionEvent evt )
926
- {
927
- _btnOpenSelectedActionPerformed (evt );
928
- }
929
- });
904
+ _btnOpenSelected .addActionListener (evt -> _btnOpenSelectedActionPerformed (evt ));
930
905
_playlistsDirectoryButtonPanel .add (_btnOpenSelected );
931
906
932
907
_btnQuickRepair .setText ("Quick" );
933
908
_btnQuickRepair .setToolTipText ("Quick Batch Repair" );
934
909
_btnQuickRepair .setEnabled (false );
935
910
_btnQuickRepair .setMargin (new java .awt .Insets (2 , 8 , 2 , 8 ));
936
- _btnQuickRepair .addActionListener (new java .awt .event .ActionListener ()
937
- {
938
- public void actionPerformed (java .awt .event .ActionEvent evt )
939
- {
940
- _btnQuickRepairActionPerformed (evt );
941
- }
942
- });
911
+ _btnQuickRepair .addActionListener (evt -> _btnQuickRepairActionPerformed (evt ));
943
912
_playlistsDirectoryButtonPanel .add (_btnQuickRepair );
944
913
945
914
_btnDeepRepair .setText ("Deep" );
946
915
_btnDeepRepair .setToolTipText ("Deep Batch Repair" );
947
916
_btnDeepRepair .setEnabled (false );
948
917
_btnDeepRepair .setMargin (new java .awt .Insets (2 , 8 , 2 , 8 ));
949
- _btnDeepRepair .addActionListener (new java .awt .event .ActionListener ()
950
- {
951
- public void actionPerformed (java .awt .event .ActionEvent evt )
952
- {
953
- _btnDeepRepairActionPerformed (evt );
954
- }
955
- });
918
+ _btnDeepRepair .addActionListener (evt -> _btnDeepRepairActionPerformed (evt ));
956
919
_playlistsDirectoryButtonPanel .add (_btnDeepRepair );
957
920
958
921
_playlistDirectoryPanel .add (_playlistsDirectoryButtonPanel , java .awt .BorderLayout .PAGE_END );
@@ -1046,6 +1009,14 @@ public void actionPerformed(java.awt.event.ActionEvent evt)
1046
1009
_loadMenuItem .addActionListener (evt -> openIconButtonActionPerformed (evt ));
1047
1010
_fileMenu .add (_loadMenuItem );
1048
1011
1012
+ _openPlaylistLocationMenuItem .setAccelerator (javax .swing .KeyStroke .getKeyStroke (KeyEvent .VK_E , java .awt .event .InputEvent .CTRL_DOWN_MASK ));
1013
+ _openPlaylistLocationMenuItem .setMnemonic ('E' );
1014
+ _openPlaylistLocationMenuItem .setText ("Open Playlist Location" );
1015
+ _openPlaylistLocationMenuItem .setToolTipText ("Opens playlist folder in Explorer" );
1016
+ _openPlaylistLocationMenuItem .addActionListener (evt -> openPlaylistLocation (this ._currentPlaylist ));
1017
+ _fileMenu .add (_openPlaylistLocationMenuItem );
1018
+
1019
+
1049
1020
_closeMenuItem .setAccelerator (javax .swing .KeyStroke .getKeyStroke (java .awt .event .KeyEvent .VK_W , java .awt .event .InputEvent .CTRL_DOWN_MASK ));
1050
1021
_closeMenuItem .setMnemonic ('C' );
1051
1022
_closeMenuItem .setText ("Close" );
@@ -1224,7 +1195,7 @@ public void documentActivated(JDocumentComponent doc)
1224
1195
setJMenuBar (_mainMenuBar );
1225
1196
1226
1197
this .componentsRequireActivePlaylist = new Component []{
1227
- _openExplorerMenuItem ,
1198
+ _openPlaylistLocationMenuItem ,
1228
1199
_saveAllMenuItem ,
1229
1200
_saveAsMenuItem ,
1230
1201
_saveMenuItem ,
@@ -1331,27 +1302,33 @@ private void runExactMatchesSearchOnSelectedPlaylists()
1331
1302
1332
1303
private void openTreeSelectedPlaylists ()
1333
1304
{
1334
- int [] selRows = _playlistDirectoryTree .getSelectionRows ();
1335
- if (selRows != null && selRows .length > 0 )
1336
- {
1337
- for (int i : selRows )
1305
+ this .getSelectedFilesFromTreePlaylists ().forEach (toOpen -> {
1306
+ if (toOpen .isDirectory ())
1338
1307
{
1339
- TreePath selPath = _playlistDirectoryTree .getPathForRow (i );
1340
- File toOpen = new File (FileTreeNodeGenerator .TreePathToFileSystemPath (selPath ));
1341
- if (toOpen .isDirectory ())
1342
- {
1343
- List <File > files = (new FileTypeSearch ()).findFiles (toOpen , new PlaylistFileFilter ());
1344
- for (File f : files )
1345
- {
1346
- openPlaylist (f );
1347
- }
1348
- }
1349
- else
1308
+ List <File > files = (new FileTypeSearch ()).findFiles (toOpen , new PlaylistFileFilter ());
1309
+ for (File f : files )
1350
1310
{
1351
- openPlaylist (toOpen );
1311
+ openPlaylist (f );
1352
1312
}
1353
1313
}
1314
+ else
1315
+ {
1316
+ openPlaylist (toOpen );
1317
+ }
1318
+ });
1319
+ }
1320
+
1321
+ private List <File > getSelectedFilesFromTreePlaylists ()
1322
+ {
1323
+ int [] selRows = _playlistDirectoryTree .getSelectionRows ();
1324
+ if (selRows == null )
1325
+ {
1326
+ return Collections .emptyList ();
1354
1327
}
1328
+ return Arrays .stream (selRows ).mapToObj (i -> {
1329
+ TreePath selPath = this ._playlistDirectoryTree .getPathForRow (i );
1330
+ return new File (FileTreeNodeGenerator .TreePathToFileSystemPath (selPath ));
1331
+ }).collect (Collectors .toList ());
1355
1332
}
1356
1333
1357
1334
private void deleteTreeSelectedPlaylists ()
@@ -1471,7 +1448,37 @@ private void openIconButtonActionPerformed(java.awt.event.ActionEvent evt)//GEN-
1471
1448
this .openPlaylist (file );
1472
1449
}
1473
1450
}
1474
- }//GEN-LAST:event_openIconButtonActionPerformed
1451
+ }//GEN-LAST:event_openIconButtonActionPerformed(java.awt.event.ActionEvent evt)
1452
+
1453
+ private void openPlaylistFoldersFromPlaylistTree ()
1454
+ {
1455
+ this .getSelectedFilesFromTreePlaylists ().stream ()
1456
+ .map (File :: getParentFile )
1457
+ .filter (Objects :: nonNull )
1458
+ .distinct ()
1459
+ .forEach (this :: openFolderInExplorerPerformed );
1460
+ }
1461
+
1462
+ private void openPlaylistLocation (Playlist playList )
1463
+ {
1464
+ this .openFolderInExplorerPerformed (playList .getFile ().getParentFile ());
1465
+ }
1466
+
1467
+ private void openFolderInExplorerPerformed (File folder )
1468
+ {
1469
+ if (folder != null )
1470
+ {
1471
+ try
1472
+ {
1473
+ Desktop .getDesktop ().open (folder );
1474
+ }
1475
+ catch (IOException e )
1476
+ {
1477
+ _logger .warn ("Failed to open playlist folder location" , e );
1478
+ throw new RuntimeException (e );
1479
+ }
1480
+ }
1481
+ }
1475
1482
1476
1483
public void openPlaylist (final File file )
1477
1484
{
@@ -2863,6 +2870,7 @@ public static void main(String[] args) throws IOException
2863
2870
private javax .swing .JMenuItem _helpMenuItem ;
2864
2871
private javax .swing .JSplitPane _leftSplitPane ;
2865
2872
private javax .swing .JMenuItem _loadMenuItem ;
2873
+ private javax .swing .JMenuItem _openPlaylistLocationMenuItem ;
2866
2874
private javax .swing .JList _lstMediaLibraryDirs ;
2867
2875
private javax .swing .JMenuBar _mainMenuBar ;
2868
2876
private javax .swing .JPanel _mediaLibraryButtonPanel ;
@@ -2875,6 +2883,7 @@ public static void main(String[] args) throws IOException
2875
2883
private javax .swing .JMenuItem _miExactMatchRepairOpenPlaylists ;
2876
2884
private javax .swing .JMenuItem _miExactMatchesSearch ;
2877
2885
private javax .swing .JMenuItem _miOpenSelectedPlaylists ;
2886
+ private javax .swing .JMenuItem _miOpenSelectedPlaylistLocation ;
2878
2887
private javax .swing .JMenuItem _miRefreshDirectoryTree ;
2879
2888
private javax .swing .JMenuItem _miReload ;
2880
2889
private javax .swing .JMenuItem _miReloadAll ;
0 commit comments