package org.limewire.ui.swing.library.navigator; import java.awt.Color; import java.awt.Font; import javax.swing.BorderFactory; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.SwingUtilities; import javax.swing.event.CellEditorListener; import javax.swing.event.ChangeEvent; import javax.swing.event.ListSelectionListener; import net.miginfocom.swing.MigLayout; import org.jdesktop.application.Resource; import org.jdesktop.swingx.JXPanel; import org.limewire.core.api.library.LocalFileList; import org.limewire.core.api.library.SharedFileList; import org.limewire.core.api.library.SharedFileListManager; import org.limewire.friend.api.FriendConnectionEvent; import org.limewire.inject.LazySingleton; import org.limewire.listener.EventListener; import org.limewire.listener.ListenerSupport; import org.limewire.listener.SwingEDTEvent; import org.limewire.ui.swing.components.HyperlinkButton; import org.limewire.ui.swing.dnd.GhostDragGlassPane; import org.limewire.ui.swing.util.GuiUtils; import org.limewire.ui.swing.util.I18n; import ca.odell.glazedlists.EventList; import com.google.inject.Inject; @LazySingleton public class LibraryNavigatorPanel extends JXPanel { @Resource private Color backgroundColor; @Resource private Color borderColor; @Resource private Font createListFont; private final LibraryNavigatorTable table; private final CreateListAction createAction; private final SharedFileListManager sharedFileListManager; private HyperlinkButton createListButton; @Inject public LibraryNavigatorPanel(LibraryNavigatorTable table, LibraryNavTableRenderer renderer, LibraryNavTableEditor editor, LibraryNavPopupHandler popupHandler, CreateListAction createAction, SharedFileListManager sharedFileListManager, GhostDragGlassPane ghostGlassPane) { super(new MigLayout("insets 0, gap 0, fillx", "[150!]", "")); this.table = table; this.sharedFileListManager = sharedFileListManager; this.createAction = createAction; GuiUtils.assignResources(this); setBackground(backgroundColor); setBorder(BorderFactory.createMatteBorder(0,0,0,1, borderColor)); JPanel panel = new JPanel(new MigLayout("fill, gap 0, insets 0")); panel.setBackground(backgroundColor); JScrollPane scrollPane = new JScrollPane(panel); scrollPane.setBorder(BorderFactory.createEmptyBorder()); panel.add(table, "grow, wrap"); table.getColumnModel().getColumn(0).setCellRenderer(renderer); table.getColumnModel().getColumn(0).setCellEditor(editor); table.setPopupHandler(popupHandler); add(scrollPane, "growx, growy, wrap"); createCreateListButton(); panel.add(createListButton, "aligny top, gapbottom 5, gapleft 30"); initData(); } @Inject void register(ListenerSupport<FriendConnectionEvent> connectionEvent) { // listen for a friend sign on and create the private shared list // if one doesn't exist on sign on. connectionEvent.addListener(new EventListener<FriendConnectionEvent>() { @Override @SwingEDTEvent public void handleEvent(FriendConnectionEvent event) { if(event.getType() == FriendConnectionEvent.Type.CONNECTED) { EventList<SharedFileList> listsModel = sharedFileListManager.getModel(); if(listsModel.size() == 1) { createPrivateShareList(); } } } }); // when editing stops, reenable the Create List button table.getColumnModel().getColumn(0).getCellEditor().addCellEditorListener(new CellEditorListener(){ @Override public void editingCanceled(ChangeEvent e) { createListButton.setEnabled(true); } @Override public void editingStopped(ChangeEvent e) { createListButton.setEnabled(true); } }); } /** * If we haven't created the Private Shared list yet, create it */ private void createPrivateShareList() { sharedFileListManager.createNewSharedFileList(I18n.tr("Private Shared")); } private void initData() { table.getSelectionModel().setSelectionInterval(0, 0); } private void createCreateListButton() { createListButton = new HyperlinkButton(I18n.tr("Create List"), createAction); createListButton.setFont(createListFont); } public void selectLocalFileList(LocalFileList localFileList) { table.selectLibraryNavItem(localFileList); } public void addTableSelectionListener(ListSelectionListener listener) { table.getSelectionModel().addListSelectionListener(listener); } public int getSelectedRow() { return table.getSelectedRow(); } public LibraryNavItem getSelectedNavItem() { return table.getSelectedItem(); } /** * Selects the specified SharedFileList in the library nav and starts editing on its name. * @param sharedFileList can not be the public shared list */ public void editSharedListName(SharedFileList sharedFileList) { assert(!sharedFileList.isPublic()); selectLocalFileList(sharedFileList); SwingUtilities.invokeLater(new Runnable() { public void run() { table.setEditable(true); table.editCellAt(getSelectedRow(), 0); createListButton.setEnabled(false); } }); } public int getPrivateListCount() { return table.getPrivateSharedLibraryCount(); } }