/* * Copyright (c) 2008, 2009, 2010, 2011 Denis Tulskiy * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * version 3 along with this work. If not, see <http://www.gnu.org/licenses/>. */ package com.tulskiy.musique.gui.menu; import java.awt.Desktop; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.IOException; import java.util.ArrayList; import javax.swing.ActionMap; import javax.swing.JMenu; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPopupMenu; import javax.swing.KeyStroke; import com.tulskiy.musique.audio.AudioFileReader; import com.tulskiy.musique.audio.player.Player; import com.tulskiy.musique.gui.dialogs.ConverterDialog; import com.tulskiy.musique.gui.dialogs.FileOperations; import com.tulskiy.musique.gui.dialogs.ProgressDialog; import com.tulskiy.musique.gui.dialogs.Task; import com.tulskiy.musique.gui.playlist.PlaylistTable; import com.tulskiy.musique.images.Images; import com.tulskiy.musique.playlist.Playlist; import com.tulskiy.musique.playlist.Track; import com.tulskiy.musique.playlist.TrackData; import com.tulskiy.musique.system.Application; import com.tulskiy.musique.system.TrackIO; import com.tulskiy.musique.util.FileUtils; import com.tulskiy.musique.util.Util; /** * Author: Denis Tulskiy * Date: 2/26/11 */ public class TracksMenu extends Menu { private static Application app = Application.getInstance(); private static Player player = app.getPlayer(); public JPopupMenu create(final PlaylistTable parent, final Playlist playlist, final ArrayList<Track> tracks) { final ActionMap aMap = parent.getActionMap(); final JPopupMenu tableMenu = new JPopupMenu(); JMenuItem item; item = tableMenu.add(aMap.get("enqueue")); item.setIcon(Images.getEmptyIcon()); item.setAccelerator(KeyStroke.getKeyStroke("Q")); tableMenu.add(new JMenuItem("Reload Tags")).addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { ProgressDialog dialog = new ProgressDialog(parent, "Reloading Tags"); dialog.show(new Task() { String currentTrack; float progress = 0; boolean abort = false; @Override public String getStatus() { return "Reading tags: " + currentTrack; } @Override public void abort() { abort = true; } @Override public void start() { for (int i = 0; i < tracks.size(); i++) { Track track = tracks.get(i); TrackData trackData = track.getTrackData(); if (abort) break; if (trackData.isFile() && trackData.getSubsongIndex() == 0) { currentTrack = trackData.getFile().getName(); progress = (float) i / tracks.size(); AudioFileReader reader = TrackIO.getAudioFileReader(trackData.getFile().getName()); trackData.clearTags(); reader.reload(track); } } playlist.firePlaylistChanged(); } @Override public boolean isIndeterminate() { return false; } @Override public float getProgress() { return progress; } }); } }); ActionListener fileOpsListener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String cmd = e.getActionCommand(); FileOperations.Operation op = FileOperations.Operation.valueOf(cmd); new FileOperations(parent, op, tracks).setVisible(true); } }; JMenu fileOps = new JMenu("File Operations"); fileOps.add("Open containing folder").addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { for (Track track : tracks) { if (track.getTrackData().isFile()) { File file = track.getTrackData().getFile().getParentFile(); try { Desktop.getDesktop().open(file); } catch (IOException e1) { e1.printStackTrace(); } break; } } } }); fileOps.addSeparator(); for (FileOperations.Operation op : FileOperations.Operation.values()) { fileOps.add(op.name()).addActionListener(fileOpsListener); } fileOps.addSeparator(); JMenuItem deleteItem = fileOps.add("Delete "); deleteItem.setIcon(Images.getEmptyIcon()); deleteItem.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { int ret = JOptionPane.showConfirmDialog(null, "This will delete file(s) permanently. Are you sure?", "Delete File(s)?", JOptionPane.YES_NO_OPTION); if (ret == JOptionPane.YES_OPTION) { for (Track track : tracks) { if (track.getTrackData().isFile() && !track.getTrackData().isCue()) { if (player.getTrack() == track) { player.stop(); } if (track.getTrackData().getFile().delete()) { FileUtils.deleteEmptyParentFolders(track.getTrackData().getFile(), true); playlist.remove(track); } } } playlist.firePlaylistChanged(); parent.adjustLastSongAfterDelete(tracks); } } }); tableMenu.add("Convert").addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { new ConverterDialog(parent, tracks).setVisible(true); } }); tableMenu.add(fileOps); for (MenuCallback callback : menus) { JMenu menu = callback.create(tracks, playlist); if (menu != null) tableMenu.add(menu); } JMenuItem properties = new JMenuItem("Properties"); properties.setAccelerator(KeyStroke.getKeyStroke("alt ENTER")); properties.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { parent.showProperties(tracks); } }); tableMenu.add(properties); Util.fixIconTextGap(tableMenu); return tableMenu; } }