package org.limewire.ui.swing.library.table; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.io.File; import java.util.ArrayList; 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.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.ShareListIcons; import org.limewire.ui.swing.util.BackgroundExecutorService; import org.limewire.ui.swing.util.I18n; import com.google.inject.Inject; import com.google.inject.Provider; public abstract class AddToListMenu extends JMenu { private final Provider<List<File>> selectedFiles; private final Provider<LocalFileList> selectedLocalFileList; private final ShareListIcons icons = new ShareListIcons(); /** * Constructs an AddToListMenu with all lists enable.. */ public AddToListMenu(Provider<List<File>> selectedFiles) { this(null, selectedFiles); } /** * Constructs an AddToListMenu with all but selectedLocalFileList enabled. */ public AddToListMenu(final Provider<LocalFileList> selectedLocalFileList, Provider<List<File>> selectedFiles) { super(I18n.tr("Add to List")); this.selectedLocalFileList = selectedLocalFileList; this.selectedFiles = selectedFiles; } @Inject public void initialize(final SharedFileListManager manager){ addChangeListener(new ChangeListener(){ @Override public void stateChanged(ChangeEvent e) { JMenu menu = AddToListMenu.this; menu.removeAll(); // once this is selected, show all the submenus manager.getModel().getReadWriteLock().readLock().lock(); try { for(SharedFileList fileList : manager.getModel()) { if(selectedFiles.get().size() == 1) { menu.add(new AddListAction(fileList.getCollectionName(), icons.getListIcon(fileList), fileList)).setEnabled((selectedLocalFileList == null || fileList != selectedLocalFileList.get()) && !fileList.contains(selectedFiles.get().get(0))); } else { menu.add(new AddListAction(fileList.getCollectionName(), icons.getListIcon(fileList), fileList)).setEnabled(selectedLocalFileList == null || fileList != selectedLocalFileList.get()); } } } finally { manager.getModel().getReadWriteLock().readLock().unlock(); } } }); 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("Public Shared"))); } private class AddListAction extends AbstractAction { private final LocalFileList localFileList; public AddListAction(String text, Icon icon, LocalFileList localFileList) { super(text); putValue(SMALL_ICON, icon); this.localFileList = localFileList; } @Override public void actionPerformed(ActionEvent e) { BackgroundExecutorService.execute(new Runnable(){ public void run() { List<File> selected = new ArrayList<File>(selectedFiles.get()); for(File file : selected) { localFileList.addFile(file); } } }); } } }