Skip to content

Commit 3a1ee30

Browse files
committed
Add "Open location" for playlists and playlist entries
1 parent 4530230 commit 3a1ee30

File tree

2 files changed

+136
-92
lines changed

2 files changed

+136
-92
lines changed

src/main/java/listfix/view/GUIScreen.java

+79-70
Original file line numberDiff line numberDiff line change
@@ -85,12 +85,11 @@
8585
import java.net.URI;
8686
import java.net.URISyntaxException;
8787
import java.nio.file.Path;
88-
import java.util.ArrayList;
89-
import java.util.Enumeration;
88+
import java.util.*;
9089
import java.util.List;
91-
import java.util.Objects;
9290
import java.util.concurrent.CancellationException;
9391
import java.util.concurrent.ExecutionException;
92+
import java.util.stream.Collectors;
9493

9594
/**
9695
* @author jcaron
@@ -655,6 +654,7 @@ private void initComponents()
655654
_playlistTreeRightClickMenu = new javax.swing.JPopupMenu();
656655
_miRefreshDirectoryTree = new javax.swing.JMenuItem();
657656
_miOpenSelectedPlaylists = new javax.swing.JMenuItem();
657+
_miOpenSelectedPlaylistLocation = new javax.swing.JMenuItem();
658658
_miExactMatchesSearch = new javax.swing.JMenuItem();
659659
_miClosestMatchesSearch = new javax.swing.JMenuItem();
660660
_miDeletePlaylist = new javax.swing.JMenuItem();
@@ -691,6 +691,7 @@ private void initComponents()
691691
_fileMenu = new JMenu();
692692
_newPlaylistMenuItem = new javax.swing.JMenuItem();
693693
_loadMenuItem = new javax.swing.JMenuItem();
694+
_openPlaylistLocationMenuItem = new javax.swing.JMenuItem();
694695
_closeMenuItem = new javax.swing.JMenuItem();
695696
_closeAllMenuItem = new javax.swing.JMenuItem();
696697
jSeparator1 = new javax.swing.JPopupMenu.Separator();
@@ -719,25 +720,17 @@ private void initComponents()
719720
_aboutMenuItem = new javax.swing.JMenuItem();
720721

721722
_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));
729724
_playlistTreeRightClickMenu.add(_miRefreshDirectoryTree);
730725

731726
_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));
739728
_playlistTreeRightClickMenu.add(_miOpenSelectedPlaylists);
740729

730+
_miOpenSelectedPlaylistLocation.setText("Open Playlist Location");
731+
_miOpenSelectedPlaylistLocation.addActionListener(evt -> this.openPlaylistFoldersFromPlaylistTree());
732+
_playlistTreeRightClickMenu.add(_miOpenSelectedPlaylistLocation);
733+
741734
_miExactMatchesSearch.setText("Find Exact Matches");
742735
_miExactMatchesSearch.addActionListener(evt -> _miExactMatchesSearchActionPerformed(evt));
743736
_playlistTreeRightClickMenu.add(_miExactMatchesSearch);
@@ -891,27 +884,15 @@ public void keyPressed(java.awt.event.KeyEvent evt)
891884
_btnSetPlaylistsDir.setText("Set");
892885
_btnSetPlaylistsDir.setToolTipText("Opens the options screen where you can set your playlists directory ");
893886
_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));
901888
_playlistsDirectoryButtonPanel.add(_btnSetPlaylistsDir);
902889

903890
_btnRefresh.setText("Refresh");
904891
_btnRefresh.setToolTipText("Refresh Playlists Tree");
905892
_btnRefresh.setFocusable(false);
906893
_btnRefresh.setMargin(new java.awt.Insets(2, 8, 2, 8));
907894
_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));
915896
_playlistsDirectoryButtonPanel.add(_btnRefresh);
916897

917898
_btnOpenSelected.setText("Open");
@@ -920,39 +901,21 @@ public void actionPerformed(java.awt.event.ActionEvent evt)
920901
_btnOpenSelected.setFocusable(false);
921902
_btnOpenSelected.setMargin(new java.awt.Insets(2, 8, 2, 8));
922903
_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));
930905
_playlistsDirectoryButtonPanel.add(_btnOpenSelected);
931906

932907
_btnQuickRepair.setText("Quick");
933908
_btnQuickRepair.setToolTipText("Quick Batch Repair");
934909
_btnQuickRepair.setEnabled(false);
935910
_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));
943912
_playlistsDirectoryButtonPanel.add(_btnQuickRepair);
944913

945914
_btnDeepRepair.setText("Deep");
946915
_btnDeepRepair.setToolTipText("Deep Batch Repair");
947916
_btnDeepRepair.setEnabled(false);
948917
_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));
956919
_playlistsDirectoryButtonPanel.add(_btnDeepRepair);
957920

958921
_playlistDirectoryPanel.add(_playlistsDirectoryButtonPanel, java.awt.BorderLayout.PAGE_END);
@@ -1046,6 +1009,14 @@ public void actionPerformed(java.awt.event.ActionEvent evt)
10461009
_loadMenuItem.addActionListener(evt -> openIconButtonActionPerformed(evt));
10471010
_fileMenu.add(_loadMenuItem);
10481011

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+
10491020
_closeMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_W, java.awt.event.InputEvent.CTRL_DOWN_MASK));
10501021
_closeMenuItem.setMnemonic('C');
10511022
_closeMenuItem.setText("Close");
@@ -1224,7 +1195,7 @@ public void documentActivated(JDocumentComponent doc)
12241195
setJMenuBar(_mainMenuBar);
12251196

12261197
this.componentsRequireActivePlaylist = new Component[]{
1227-
_openExplorerMenuItem,
1198+
_openPlaylistLocationMenuItem,
12281199
_saveAllMenuItem,
12291200
_saveAsMenuItem,
12301201
_saveMenuItem,
@@ -1331,27 +1302,33 @@ private void runExactMatchesSearchOnSelectedPlaylists()
13311302

13321303
private void openTreeSelectedPlaylists()
13331304
{
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())
13381307
{
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)
13501310
{
1351-
openPlaylist(toOpen);
1311+
openPlaylist(f);
13521312
}
13531313
}
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();
13541327
}
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());
13551332
}
13561333

13571334
private void deleteTreeSelectedPlaylists()
@@ -1471,7 +1448,37 @@ private void openIconButtonActionPerformed(java.awt.event.ActionEvent evt)//GEN-
14711448
this.openPlaylist(file);
14721449
}
14731450
}
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+
}
14751482

14761483
public void openPlaylist(final File file)
14771484
{
@@ -2863,6 +2870,7 @@ public static void main(String[] args) throws IOException
28632870
private javax.swing.JMenuItem _helpMenuItem;
28642871
private javax.swing.JSplitPane _leftSplitPane;
28652872
private javax.swing.JMenuItem _loadMenuItem;
2873+
private javax.swing.JMenuItem _openPlaylistLocationMenuItem;
28662874
private javax.swing.JList _lstMediaLibraryDirs;
28672875
private javax.swing.JMenuBar _mainMenuBar;
28682876
private javax.swing.JPanel _mediaLibraryButtonPanel;
@@ -2875,6 +2883,7 @@ public static void main(String[] args) throws IOException
28752883
private javax.swing.JMenuItem _miExactMatchRepairOpenPlaylists;
28762884
private javax.swing.JMenuItem _miExactMatchesSearch;
28772885
private javax.swing.JMenuItem _miOpenSelectedPlaylists;
2886+
private javax.swing.JMenuItem _miOpenSelectedPlaylistLocation;
28782887
private javax.swing.JMenuItem _miRefreshDirectoryTree;
28792888
private javax.swing.JMenuItem _miReload;
28802889
private javax.swing.JMenuItem _miReloadAll;

0 commit comments

Comments
 (0)