package org.limewire.ui.swing.upload.table;
import java.awt.Component;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.ref.WeakReference;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.table.TableCellEditor;
import org.limewire.core.api.Category;
import org.limewire.core.api.library.LibraryManager;
import org.limewire.core.api.upload.UploadItem;
import org.limewire.core.api.upload.UploadState;
import org.limewire.ui.swing.table.TablePopupHandler;
import org.limewire.ui.swing.util.I18n;
public class UploadPopupHandler implements TablePopupHandler {
private int popupRow = -1;
private final LibraryManager libraryManager;
private JPopupMenu popupMenu;
private JMenuItem launchMenuItem;
private JMenuItem playMenuItem;
private JMenuItem removeMenuItem;
private JMenuItem showInLibraryMenuItem;
private JMenuItem locateOnDiskMenuItem;
private JMenuItem cancelMenuItem;
private JMenuItem propertiesMenuItem;
private MenuListener menuListener;
private WeakReference<UploadItem> uploadItemReference;
private UploadTable table;
private UploadActionHandler actionHandler;
public UploadPopupHandler(UploadTable table, UploadActionHandler actionHandler, LibraryManager libraryManager){
this.libraryManager = libraryManager;
this.table = table;
this.actionHandler = actionHandler;
popupMenu = new JPopupMenu();
menuListener = new MenuListener();
showInLibraryMenuItem = new JMenuItem(I18n.tr("Locate in Library"));
showInLibraryMenuItem.setActionCommand(UploadActionHandler.LIBRARY_COMMAND);
showInLibraryMenuItem.addActionListener(menuListener);
cancelMenuItem = new JMenuItem(I18n.tr("Cancel"));
cancelMenuItem.setActionCommand(UploadActionHandler.CANCEL_COMMAND);
cancelMenuItem.addActionListener(menuListener);
launchMenuItem = new JMenuItem(I18n.tr("Launch File"));
launchMenuItem.setActionCommand(UploadActionHandler.LAUNCH_COMMAND);
launchMenuItem.addActionListener(menuListener);
playMenuItem = new JMenuItem(I18n.tr("Play File"));
playMenuItem.setActionCommand(UploadActionHandler.PLAY_COMMAND);
playMenuItem.addActionListener(menuListener);
removeMenuItem = new JMenuItem(I18n.tr("Remove from List"));
removeMenuItem.setActionCommand(UploadActionHandler.REMOVE_COMMAND);
removeMenuItem.addActionListener(menuListener);
locateOnDiskMenuItem = new JMenuItem(I18n.tr("Locate on Disk"));
locateOnDiskMenuItem.setActionCommand(UploadActionHandler.LOCATE_ON_DISK_COMMAND);
locateOnDiskMenuItem.addActionListener(menuListener);
propertiesMenuItem = new JMenuItem(I18n.tr("View File Info..."));
propertiesMenuItem.setActionCommand(UploadActionHandler.PROPERTIES_COMMAND);
propertiesMenuItem.addActionListener(menuListener);
}
@Override
public boolean isPopupShowing(int row) {
return popupMenu.isVisible() && row == popupRow;
}
@Override
public void maybeShowPopup(Component component, int x, int y) {
popupRow = getPopupRow(x, y);
UploadItem uploadItem = table.getUploadItem(popupRow);
popupMenu.removeAll();
UploadState state = uploadItem.getState();
if(state == UploadState.BROWSE_HOST || state == UploadState.BROWSE_HOST_DONE || state == UploadState.DONE || state == UploadState.UNABLE_TO_UPLOAD){
popupMenu.add(removeMenuItem);
} else {
popupMenu.add(cancelMenuItem);
}
if (state != UploadState.BROWSE_HOST && state != UploadState.BROWSE_HOST_DONE) {
popupMenu.addSeparator();
if (uploadItem.getCategory() == Category.VIDEO || uploadItem.getCategory() == Category.AUDIO) {
popupMenu.add(playMenuItem);
} else if (uploadItem.getCategory() != Category.PROGRAM && uploadItem.getCategory() != Category.OTHER) {
popupMenu.add(launchMenuItem);
}
popupMenu.add(locateOnDiskMenuItem);
popupMenu.add(showInLibraryMenuItem).setEnabled(libraryManager.getLibraryManagedList().contains(uploadItem.getUrn()));
popupMenu.addSeparator();
popupMenu.add(propertiesMenuItem);
}
popupMenu.show(component, x, y);
uploadItemReference = new WeakReference<UploadItem>(uploadItem);
}
protected int getPopupRow(int x, int y){
return table.rowAtPoint(new Point(x, y));
}
private class MenuListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
UploadItem uploadItem = uploadItemReference.get();
if (uploadItem != null) {
actionHandler.performAction(e.getActionCommand(), uploadItem);
}
//must cancel editing
Component comp = table.getEditorComponent();
if(comp!=null && comp instanceof TableCellEditor){
((TableCellEditor)comp).cancelCellEditing();
}
}
}
}