package org.limewire.ui.swing.library.table;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.io.File;
import java.util.List;
import javax.swing.Icon;
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.jdesktop.application.Resource;
import org.limewire.core.api.library.LibraryManager;
import org.limewire.core.api.library.LocalFileList;
import org.limewire.core.api.library.SharedFileList;
import org.limewire.core.api.library.SharedFileListManager;
import org.limewire.ui.swing.action.AbstractAction;
import org.limewire.ui.swing.library.LibraryPanel;
import org.limewire.ui.swing.util.GuiUtils;
import org.limewire.ui.swing.util.I18n;
import com.google.inject.Provider;
class ShowInListMenu extends JMenu {
private final Provider<List<File>> selectedFiles;
private LibraryPanel libraryPanel;
private final ShowInListMenuIcons icons = new ShowInListMenuIcons();
private Provider<LocalFileList> selectedLocalFileList;
/**
* Constructs a ShowInListMenu with all items enabled. Initialize must be called after construction (except for injected subclasses).
*/
public ShowInListMenu(Provider<List<File>> selectedFiles) {
this(selectedFiles, null);
}
/**
* Constructs a ShowInListMenu with all items but selectedLocalFileList enabled. Initialize must be called after construction (except for injected subclasses).
*/
public ShowInListMenu(Provider<List<File>> selectedFiles, final Provider<LocalFileList> selectedLocalFileList) {
super(I18n.tr("Show in List"));
this.selectedFiles = selectedFiles;
this.selectedLocalFileList = selectedLocalFileList;
}
public void initialize(final SharedFileListManager manager, final LibraryManager libraryManager,
LibraryPanel libraryPanel, final boolean showLibrary){
this.libraryPanel = libraryPanel;
// once this is selected, show all the submenus
addChangeListener(new ChangeListener(){
@Override
public void stateChanged(ChangeEvent e) {
JMenu menu = ShowInListMenu.this;
menu.removeAll();
if(!selectedFiles.get().isEmpty()) {
File selectedFile = selectedFiles.get().get(0);
LocalFileList libraryList = libraryManager.getLibraryManagedList();
if(showLibrary) {
menu.add(new ShowAction(I18n.tr("Library"), getListIcon(libraryList), libraryList, selectedFile));//.setEnabled(selectedLocalFileList == null || libraryManager.getLibraryManagedList() != selectedLocalFileList.get());
}
manager.getModel().getReadWriteLock().readLock().lock();
try {
boolean addSeperator = false;
for(SharedFileList fileList : manager.getModel()) {
// only show lists that contain the file and isn't the currently selected list
if(fileList.contains(selectedFile) && (selectedLocalFileList == null || fileList != selectedLocalFileList.get())) {
menu.add(new ShowAction(fileList.getCollectionName(), getListIcon(fileList), fileList, selectedFile));//.setEnabled(selectedLocalFileList == null || fileList != selectedLocalFileList.get());
addSeperator = true;
}
}
if(addSeperator && showLibrary)
menu.insertSeparator(1);
} finally {
manager.getModel().getReadWriteLock().readLock().unlock();
}
}
if(menu.getMenuComponentCount() < 1)
menu.add(new JMenuItem(I18n.tr("empty"))).setEnabled(false);
}
});
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")));
}
private Icon getListIcon(LocalFileList localFileList) {
if(localFileList instanceof SharedFileList) {
if(((SharedFileList)localFileList).isPublic())
return icons.publicIcon;
else if(((SharedFileList)localFileList).getFriendIds().size() == 0)
return icons.unsharedIcon;
else
return icons.sharedIcon;
} else
return icons.libraryIcon;
}
private class ShowAction extends AbstractAction {
private final LocalFileList localFileList;
private final File selectedFile;
public ShowAction(String text, Icon icon, LocalFileList localFileList, File selectedFile) {
super(text);
putValue(SMALL_ICON, icon);
this.localFileList = localFileList;
this.selectedFile = selectedFile;
}
@Override
public void actionPerformed(ActionEvent e) {
libraryPanel.selectLocalFileList(localFileList);
libraryPanel.selectAndScrollTo(selectedFile);
}
}
private static class ShowInListMenuIcons {
@Resource
private Icon libraryIcon;
@Resource
private Icon publicIcon;
@Resource
private Icon unsharedIcon;
@Resource
private Icon sharedIcon;
public ShowInListMenuIcons() {
GuiUtils.assignResources(this);
}
}
}