package org.limewire.ui.swing.library.table;
import java.awt.Dimension;
import java.io.File;
import java.util.List;
import javax.swing.Action;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;
import org.limewire.core.api.library.SharedFileList;
import org.limewire.core.api.library.SharedFileListManager;
import org.limewire.ui.swing.library.LibrarySelected;
import org.limewire.ui.swing.util.I18n;
import com.google.inject.Inject;
import com.google.inject.Provider;
/**
* Constructs a menu list of all LocalFileLists excluding the Library.
* Selecting a given LocalFileList will remove the given files from that
* list.
*/
public class RemoveFromListMenu extends JMenu {
/**
* Constructs an RemoveFromListMenu with all lists enable..
*/
@Inject
public RemoveFromListMenu(final @LibrarySelected Provider<List<File>> selectedFiles,
final RemoveFromLibraryAction removeFromLibraryAction,
final RemoveFromAllListAction removeFromAllAction, final SharedFileListManager manager) {
super(I18n.tr("Remove from"));
addChangeListener(new ChangeListener(){
@Override
public void stateChanged(ChangeEvent e) {
JMenu menu = RemoveFromListMenu.this;
menu.removeAll();
removeFromAllAction.putValue(Action.NAME, I18n.tr("All Lists"));
menu.add(removeFromAllAction).setEnabled(isAllRemovedEnabled(manager, selectedFiles));
menu.addSeparator();
menu.add(removeFromLibraryAction);
}
});
getPopupMenu().addPopupMenuListener(new PopupMenuListener(){
@Override
public void popupMenuCanceled(PopupMenuEvent e) {}
@Override
public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {}
@Override
public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
//keeps menu from expaning too far
if(getPopupMenu().getPreferredSize().width > 300)
getPopupMenu().setPreferredSize(new Dimension(300, getPopupMenu().getPreferredSize().height));
}
});
// place holder to get the -> on the parent menu
add(new JMenuItem(I18n.tr("empty")));
}
/**
* Returns true if a selected file exists in a playlist, false otherwise.
*/
private boolean isAllRemovedEnabled(SharedFileListManager manager, Provider<List<File>> selectedFiles) {
boolean enabled = false;
if(selectedFiles.get().size() == 1) {
manager.getModel().getReadWriteLock().readLock().lock();
try {
for(SharedFileList fileList : manager.getModel()) {
boolean isEnabled = fileList.contains(selectedFiles.get().get(0));
enabled |= isEnabled;
}
} finally {
manager.getModel().getReadWriteLock().readLock().unlock();
}
} else {
enabled = true;
}
return enabled;
}
}