package org.limewire.ui.swing.advanced.connection; import java.awt.BorderLayout; import java.awt.Color; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.BorderFactory; import javax.swing.DefaultListModel; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.ListModel; import org.limewire.collection.glazedlists.GlazedListsFactory; import org.limewire.core.api.monitor.IncomingSearchManager; import org.limewire.core.api.search.SearchCategory; import org.limewire.ui.swing.components.Disposable; import org.limewire.ui.swing.search.DefaultSearchInfo; import org.limewire.ui.swing.search.SearchHandler; import org.limewire.ui.swing.settings.SwingUiSettings; import org.limewire.ui.swing.util.GuiUtils; import org.limewire.ui.swing.util.I18n; import ca.odell.glazedlists.EventList; import ca.odell.glazedlists.impl.swing.SwingThreadProxyEventList; import ca.odell.glazedlists.swing.DefaultEventListModel; import com.google.inject.Inject; /** * Display panel for the incoming search list. */ public class IncomingSearchPanel extends JPanel implements Disposable { /** Manager instance for incoming search data. */ private IncomingSearchManager incomingManager; /** The swing-thread wrapped event list, to dispose of later. */ private SwingThreadProxyEventList<String> swingThreadList; /** Handler instance for outgoing searches. */ private SearchHandler searchHandler; private JLabel incomingLabel = new JLabel(); private JScrollPane scrollPane = new JScrollPane(); private JList incomingList = new JList(); /** * Constructs the IncomingSearchPanel to display incoming search phrases. */ @Inject public IncomingSearchPanel( IncomingSearchManager incomingManager, final SearchHandler searchHandler) { this.incomingManager = incomingManager; this.searchHandler = searchHandler; setLayout(new BorderLayout()); setOpaque(false); incomingLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 3, 0)); incomingLabel.setText(I18n.tr("Incoming Searches - people on the P2P Network are now searching for...")); scrollPane.setBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY)); incomingList.setPrototypeCellValue(" "); incomingList.setFixedCellHeight(16); // This no longer installs a transfer handler to support drag/drop // operations. Earlier versions installed one, but there was no // apparent reason for doing so. // Add listener to perform text search when double-clicked. incomingList.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if (e.getClickCount() >= 2) { int index = incomingList.locationToIndex(e.getPoint()); if (index != -1) { Object text = incomingList.getModel().getElementAt(index); doSearch(String.valueOf(text)); } } } }); add(incomingLabel, BorderLayout.NORTH); add(scrollPane, BorderLayout.CENTER); scrollPane.setViewportView(incomingList); } /** * Initializes the data models in the container. */ public void initData() { if (!(incomingList.getModel() instanceof DefaultEventListModel)) { // Get list of incoming search queries. EventList<String> incomingSearchList = incomingManager.getIncomingSearchList(); swingThreadList = GlazedListsFactory.swingThreadProxyEventList(incomingSearchList); // Set the list model. EventListModel automatically wraps the // actual list in a Swing list to ensure that all events are fired // on the UI thread. incomingList.setModel(new DefaultEventListModel<String>(swingThreadList)); } } /** * Clears the data models in the container. */ @Override public void dispose() { // Get list model and dispose resources. ListModel listModel = incomingList.getModel(); if (listModel instanceof DefaultEventListModel) { ((DefaultEventListModel) listModel).dispose(); } if(swingThreadList != null) { swingThreadList.dispose(); swingThreadList = null; } // Set default model to remove old reference. incomingList.setModel(new DefaultListModel()); } /** * Performs a search using the specified query text. */ private void doSearch(String text) { // Get default search category. SearchCategory defaultCategory = SearchCategory.forId( SwingUiSettings.DEFAULT_SEARCH_CATEGORY_ID.getValue()); // Perform search using input text. searchHandler.doSearch(DefaultSearchInfo.createKeywordSearch(text, defaultCategory)); // Activate main frame to display search results. GuiUtils.getMainFrame().toFront(); } }