SearchResultPanel.java
| Index Score | ||
|---|---|---|
![]() |
![]() |
org.xnap.gui |
![]() |
![]() |
XNap 3 |
View: Reasons, Metrics, Source Code
These are the metrics that contribute to the Enerjy Score for this file, ranked by impact. So the metrics listed at the top influence the score to a greater extent that the metrics listed at the bottom.
/*
* XNap - A P2P framework and client.
*
* See the file AUTHORS for copyright information.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package org.xnap.gui;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.Box;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
import javax.swing.event.TreeModelEvent;
import javax.swing.event.TreeModelListener;
import javax.swing.tree.TreePath;
import org.xnap.XNap;
import org.xnap.event.StatusListener;
import org.xnap.gui.component.EraseButton;
import org.xnap.gui.component.XNapButton;
import org.xnap.gui.event.DoubleClickListener;
import org.xnap.gui.event.PopupListener;
import org.xnap.gui.table.JTreeTable;
import org.xnap.gui.table.SearchTableModel;
import org.xnap.gui.table.TreeTableNode;
import org.xnap.gui.tree.*;
import org.xnap.gui.util.GUIHelper;
import org.xnap.gui.util.GridBagHelper;
import org.xnap.gui.util.IconHelper;
import org.xnap.search.DefaultSearchFilter;
import org.xnap.search.MediaType;
import org.xnap.search.Search;
import org.xnap.search.SearchController;
import org.xnap.search.SearchFilter;
import org.xnap.search.SearchManager;
import org.xnap.search.SearchResult;
import org.xnap.util.Preferences;
/**
* This class provides a panel with a {@link JTreeTable} that displays
* search results.
*/
public class SearchResultPanel extends JPanel implements StatusListener {
//--- Data field(s) ---
protected SearchPanel parent;
private JLabel jlStatus;
private JTextField jtFilter;
private JComboBox jcbMediaType;
private JTreeTable jta;
protected SearchTableModel tmResults;
private JScrollPane jspSearch;
private SearchController controller;
private Preferences prefs = Preferences.getInstance();
//--- Constructor(s) ---
/**
* Invoked by {@link SearchResultTreePanel}.
*/
protected SearchResultPanel(SearchPanel parent, Search search,
String table, boolean addTable)
{
this.parent = parent;
initialize(search, table, addTable);
controller = new SearchController
(search, tmResults.getListListener(), this);
if (controller.getFilter() != null && prefs.getFilterResults()) {
setFilter(controller.getFilter());
}
}
public SearchResultPanel(SearchPanel parent, Search search)
{
this(parent, search, "search", true);
controller.start();
setStatus(controller.getStatus());
}
//--- Method(s) ---
protected void initialize(Search search, String table, boolean addTable)
{
JPanel jpTop = new JPanel(new BorderLayout());
jpTop.setBorder(new EmptyBorder(2, 2, 2, 2));
// actions
Action[] actions = search.getActions();
if (actions != null && actions.length > 0) {
JPanel jpActions = new JPanel(new FlowLayout(FlowLayout.LEFT));
for (int i = 0; i < actions.length; i++) {
jpActions.add(new XNapButton(actions[i]));
}
jpTop.add(jpActions, BorderLayout.WEST);
}
// filter panel
JPanel jpFilter = new JPanel(new GridBagLayout());
jpTop.add(jpFilter, BorderLayout.EAST);
jcbMediaType = new JComboBox(SearchManager.DEFAULT_MEDIA_TYPES);
GridBagHelper.addComponent(jpFilter, jcbMediaType,
GridBagConstraints.WEST);
GridBagHelper.addComponent(jpFilter,Box.createHorizontalStrut(5));
// erase button
EraseButton jbErase = new EraseButton();
GridBagHelper.addComponent(jpFilter, jbErase, GridBagConstraints.WEST);
// filter text
JLabel filterByLabel = new JLabel(XNap.tr("Filter By"));
GridBagHelper.addComponent(jpFilter, filterByLabel,
GridBagConstraints.WEST);
jtFilter = new JTextField("", 10);
ApplyOptionsAction acApply = new ApplyOptionsAction();
GUIHelper.bindEnterKey(jtFilter, acApply);
jbErase.setTextField(jtFilter);
GridBagHelper.addComponent(jpFilter, jtFilter,
GridBagConstraints.WEST);
GridBagHelper.addComponent(jpFilter, new XNapButton(acApply),
GridBagConstraints.WEST);
// maintain sort order
// JCheckBox jcbMaintainSortOrder
// = new XNapCheckBox(new MaintainSortOrderAction(table));
// GridBagHelper.addComponent(jpFilter, jcbMaintainSortOrder);
// tree table
tmResults = new SearchTableModel();
jta = tmResults.createTreeTable(prefs, table);
// jta.getTree().setCellRenderer(new IconTreeCellRenderer(tmResults));
jta.getTree().setCellRenderer(new SearchTreeCellRenderer(tmResults));
DoubleClickListener.install(jta, new DoubleClickAction());
PopupListener pl = new PopupListener(parent.getPopupMenu());
jta.addMouseListener(pl);
jspSearch = new JScrollPane(jta);
//jspSearch.setBorder(GUIHelper.createEmptyBorder());
jta.getTree().getModel().addTreeModelListener(new TitleUpdater());
// status label
jlStatus = new JLabel(" ");
// content
setLayout(new BorderLayout());
add(jpTop, BorderLayout.NORTH);
if (addTable) {
add(jspSearch, BorderLayout.CENTER);
}
add(jlStatus, BorderLayout.SOUTH);
}
/**
* Returns the currently selected search result.
*
* @return null, if nothing is selected; the result, otherwise
*/
public SearchResult getSelectedResult()
{
TreePath path = jta.getTree().getSelectionPath();
if (path != null) {
TreeTableNode node = (TreeTableNode)path.getLastPathComponent();
return (SearchResult)node.getData();
}
return null;
}
/**
* Returns the currently selected search results.
*
* @return null, if nothing is selected; the results, otherwise
*/
public SearchResult[] getSelectedResults()
{
TreePath[] paths = jta.getTree().getSelectionPaths();
if (paths != null) {
SearchResult[] results = new SearchResult[paths.length];
for (int i = 0; i < results.length; i++) {
TreeTableNode node
= (TreeTableNode)paths[i].getLastPathComponent();
results[i] = (SearchResult)node.getData();
}
return results;
}
return null;
}
public SearchController getController()
{
return controller;
}
public SearchFilter getFilter()
{
SearchFilter filter = new DefaultSearchFilter();
filter.put(SearchFilter.TEXT, jtFilter.getText());
filter.put(SearchFilter.MEDIA_TYPE, jcbMediaType.getSelectedItem());
return filter;
}
protected void setFilter(SearchFilter filter)
{
jtFilter.setText((String)filter.get(SearchFilter.TEXT));
jcbMediaType.setSelectedItem
((MediaType)filter.get(SearchFilter.MEDIA_TYPE));
controller.setFilter(filter);
}
public void setStatus(String newValue)
{
jlStatus.setText(newValue);
jlStatus.setToolTipText(newValue);
parent.updateActions();
updateTitle();
}
public String getTitle()
{
StringBuffer sb = new StringBuffer();
sb.append(controller.getSearch().getName());
if (controller.isDone()) {
sb.append(" [");
sb.append(tmResults.size());
sb.append("]");
}
else if (tmResults.size() > 0) {
sb.append(" (");
sb.append(tmResults.size());
sb.append(")");
}
return sb.toString();
}
public void removeNotify()
{
// somebody has closed the panel, abort search
controller.stop();
super.removeNotify();
}
protected void updateTitle()
{
parent.setTabTitle(this, getTitle());
}
protected JScrollPane getSearchPanel()
{
return jspSearch;
}
//--- Inner Class(es) ---
/**
*
*/
private class ApplyOptionsAction extends AbstractAction {
public ApplyOptionsAction()
{
putValue(Action.NAME, XNap.tr("Go"));
putValue(IconHelper.XNAP_ICON, "filter.png");
putValue(Action.SHORT_DESCRIPTION,
XNap.tr("Filters search results."));
}
public void actionPerformed(ActionEvent event)
{
tmResults.setFilter(getFilter());
}
}
private class DoubleClickAction extends AbstractAction
{
public void actionPerformed(ActionEvent event)
{
SearchResult result = getSelectedResult();
if (result != null) {
Action[] actions = result.getActions();
if (actions != null && actions.length > 0
&& actions[0].isEnabled()) {
actions[0].actionPerformed(event);
}
}
}
}
public class TitleUpdater implements TreeModelListener
{
//--- Method(s) ---
public void treeNodesChanged(TreeModelEvent e)
{
}
public void treeNodesInserted(TreeModelEvent e)
{
SearchResultPanel.this.updateTitle();
}
public void treeNodesRemoved(TreeModelEvent e)
{
SearchResultPanel.this.updateTitle();
}
public void treeStructureChanged(TreeModelEvent e)
{
SearchResultPanel.this.updateTitle();
}
}
}
The table below shows all metrics for SearchResultPanel.java.



