OpenNapServerPanel.java
| Index Score | ||
|---|---|---|
![]() |
![]() |
org.xnap.plugin.opennap.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.plugin.opennap.gui;
import javax.swing.AbstractAction;
import javax.swing.AbstractButton;
import javax.swing.Action;
import javax.swing.JCheckBox;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.TreePath;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseListener;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.LinkedList;
import org.xnap.XNap;
import org.xnap.event.StatusListener;
import org.xnap.gui.ActionProvider;
import org.xnap.gui.StatusBar;
import org.xnap.gui.action.CollapseAllNodesAction;
import org.xnap.gui.action.ExpandAllNodesAction;
import org.xnap.gui.component.XNapButton;
import org.xnap.gui.component.XNapCheckBox;
import org.xnap.gui.component.XNapMenuItem;
import org.xnap.gui.event.DoubleClickListener;
import org.xnap.gui.event.PopupListener;
import org.xnap.gui.table.JTreeTable;
import org.xnap.gui.table.LeafTreeTableNode;
import org.xnap.gui.table.TreeTableNode;
import org.xnap.gui.tree.NetworkTreeCellRenderer;
import org.xnap.gui.util.FocusManager;
import org.xnap.gui.util.GUIHelper;
import org.xnap.gui.util.IconHelper;
import org.xnap.io.FileExtensionFilter;
import org.xnap.plugin.opennap.OpenNapPlugin;
import org.xnap.plugin.opennap.action.OpenNapGetServerListAction;
import org.xnap.plugin.opennap.net.OpenNapBrowse;
import org.xnap.plugin.opennap.net.OpenNapServer;
import org.xnap.plugin.opennap.util.OpenNapPreferences;
import org.xnap.search.DefaultSearchFilter;
import org.xnap.search.Search;
import org.xnap.search.SearchFilter;
import org.xnap.search.SearchManager;
import org.xnap.util.FileHelper;
import org.xnap.util.IllegalOperationException;
/**
* This class provides a {@link JTreeTable} that contains a list of
* {@link OpenNapServer} objects that are grouped by network.
*/
public class OpenNapServerPanel extends JPanel
implements ActionProvider, TreeSelectionListener, StatusListener {
// --- Data Field(s) ---
private OpenNapPreferences napPrefs = OpenNapPlugin.getPreferences();
private JTreeTable jttServers;
private OpenNapServerTableModel tmServers;
private JLabel jlStatus;
private JFileChooser jfcDefault = new JFileChooser();
private Action acConnect = new ConnectAction();
private Action acDisconnect = new DisconnectAction();
private Action acAddServer = new AddServerAction();
private Action acEditServer = new EditServerAction();
private Action acRemoveServer = new RemoveServerAction();
private Action acOpenServerFile = new OpenServerFileAction(jfcDefault);
private Action acSaveServerFile = new SaveServerFileAction(jfcDefault);
private Action acUseAutoConnector = new UseAutoConnectorAction();
private Action acCollapseAllNodes;
private Action acExpandAllNodes;
private Action browseAction = new BrowseAction();
private Action chatAction = new ChatAction();
// --- Constructor(s) ---
public OpenNapServerPanel()
{
initialize();
}
// --- Method(s) ---
private void initialize()
{
setLayout(new BorderLayout());
// server table
tmServers = new OpenNapServerTableModel();
jttServers = tmServers.createTreeTable(napPrefs, "server");
jttServers.getTree().getSelectionModel().addTreeSelectionListener(this);
jttServers.getTree().setCellRenderer
(new NetworkTreeCellRenderer(tmServers));
DoubleClickListener.install(jttServers, acConnect);
GUIHelper.bindEnterKey(jttServers, acConnect);
acCollapseAllNodes = new CollapseAllNodesAction(jttServers.getTree());
acExpandAllNodes = new ExpandAllNodesAction(jttServers.getTree());
// popup-context menu
JPopupMenu popup = new JPopupMenu();
popup.add(new XNapMenuItem(acConnect));
popup.add(new XNapMenuItem(acDisconnect));
popup.addSeparator();
popup.add(new XNapMenuItem(browseAction));
popup.add(new XNapMenuItem(chatAction));
popup.addSeparator();
popup.add(new XNapMenuItem(acAddServer));
popup.addSeparator();
popup.add(new XNapMenuItem(acEditServer));
popup.add(new XNapMenuItem(acRemoveServer));
MouseListener popupListener = new PopupListener(popup);
jttServers.addMouseListener(popupListener);
jttServers.getInputMap().put(KeyStroke.getKeyStroke
(KeyEvent.VK_ENTER, 0), acConnect);
jttServers.getActionMap().put(acConnect, acConnect);
// button panel
JPanel jpButtons = new JPanel();
jpButtons.setLayout(new FlowLayout(FlowLayout.LEFT));
jpButtons.add(new XNapButton(new OpenNapGetServerListAction()));
jpButtons.add(new XNapButton(new FindWSXFiles()));
JCheckBox jcbAutoConnect = new JCheckBox(acUseAutoConnector);
jcbAutoConnect.setSelected(napPrefs.getUseAutoconnector());
jpButtons.add(jcbAutoConnect);
JCheckBox jcbRemoveServers
= new XNapCheckBox(new RemoveFailedServersAction());
jpButtons.add(jcbRemoveServers);
// status line
jlStatus = new JLabel(OpenNapPlugin.getServerManager().getStats());
// add containers to panel
add(jlStatus, BorderLayout.NORTH);
add(new JScrollPane(jttServers), BorderLayout.CENTER);
add(jpButtons, BorderLayout.SOUTH);
// stats updates
// Connector.getInstance().addStatsListener(new StatsListener());
// Connector.getInstance().setStatusListener(this);
// file chooser for open and save
jfcDefault.setSelectedFile
(new File(FileHelper.getHomeDir() + "hosts"));
jfcDefault.addChoosableFileFilter(new FileExtensionFilter("wsx"));
jfcDefault.addChoosableFileFilter
(new FileExtensionFilter("hosts", XNap.tr("XNap Server")));
valueChanged();
}
public Action[] getActions()
{
return new Action[] {
acOpenServerFile, acSaveServerFile, null, acConnect, acDisconnect,
null, acAddServer, null, acEditServer, acRemoveServer, null,
acCollapseAllNodes, acExpandAllNodes
};
}
/**
* Returns the currently selected servers.
*
* @return null, if nothing is selected
*/
public OpenNapServer[] getSelectedServers()
{
TreePath[] paths = jttServers.getTree().getSelectionPaths();
if (paths != null) {
LinkedList results = new LinkedList();
for (int i = 0; i < paths.length; i++) {
TreeTableNode node
= (TreeTableNode)paths[i].getLastPathComponent();
if (node instanceof LeafTreeTableNode) {
results.add((OpenNapServer)node.getData());
}
}
return (results.size() > 0)
? (OpenNapServer[])results.toArray(new OpenNapServer[0]) : null;
}
return null;
}
public void setStatus(final String newValue)
{
Runnable runner = new Runnable()
{
public void run()
{
jlStatus.setText(newValue);
}
};
SwingUtilities.invokeLater(runner);
}
public void valueChanged(TreeSelectionEvent e)
{
valueChanged();
}
public void valueChanged()
{
boolean selected = (getSelectedServers() != null);
acConnect.setEnabled(selected);
acDisconnect.setEnabled(selected);
acEditServer.setEnabled(selected);
acRemoveServer.setEnabled(selected);
browseAction.setEnabled(selected);
chatAction.setEnabled(selected);
}
//--- Inner Class(es) ---
/**
* AddServerAction class handles the command to add a user defined
* server to the list.
*/
private class AddServerAction extends AbstractAction {
public AddServerAction()
{
putValue(Action.NAME, XNap.tr("Add Server") + "...");
putValue(Action.SHORT_DESCRIPTION,
XNap.tr("Add a server to the list."));
putValue(IconHelper.XNAP_ICON, "filenew.png");
}
public void actionPerformed( ActionEvent event )
{
OpenNapServerEditorDialog d = new OpenNapServerEditorDialog();
d.setNetworks(tmServers.getNetworkNames());
d.show(OpenNapServerPanel.this);
}
}
private class BrowseAction extends AbstractAction {
public BrowseAction()
{
putValue(Action.NAME, XNap.tr("Browse User") + "...");
putValue(Action.SHORT_DESCRIPTION,
XNap.tr("Prompts for a nick."));
putValue(IconHelper.XNAP_ICON, "filefind.png");
}
public void actionPerformed( ActionEvent event )
{
OpenNapServer[] servers = getSelectedServers();
if (servers != null) {
for (int i = 0; i < servers.length; i++) {
String nick = JOptionPane.showInputDialog
(OpenNapServerPanel.this, XNap.tr("Nick"),
XNap.tr("Browse User"), JOptionPane.QUESTION_MESSAGE);
if (nick != null) {
OpenNapBrowse b
= new OpenNapBrowse(servers[i].getUser(nick));
SearchManager.getInstance().handle(b);
FocusManager.setFocusTo("search");
}
}
}
}
}
private class ChatAction extends AbstractAction {
public ChatAction()
{
putValue(Action.NAME, XNap.tr("Chat With User") + "...");
putValue(Action.SHORT_DESCRIPTION,
XNap.tr("Prompts for a nick."));
putValue(IconHelper.XNAP_ICON, "mail_generic.png");
}
public void actionPerformed( ActionEvent event )
{
OpenNapServer[] servers = getSelectedServers();
if (servers != null) {
for (int i = 0; i < servers.length; i++) {
String nick = JOptionPane.showInputDialog
(OpenNapServerPanel.this, XNap.tr("Nick"),
XNap.tr("Chat With User"),
JOptionPane.QUESTION_MESSAGE);
if (nick != null) {
OpenNapPlugin.getMessageHandler().getPrivateChannel
(servers[i].getUser(nick));
FocusManager.setFocusTo("chat");
}
}
}
}
}
/**
* This class connects the selected servers.
*/
private class ConnectAction extends AbstractAction {
public ConnectAction()
{
putValue(Action.NAME, XNap.tr("Connect"));
putValue(Action.SHORT_DESCRIPTION,
XNap.tr("Connects to the selected servers."));
putValue(IconHelper.XNAP_ICON, "connect_creating.png");
}
public void actionPerformed(ActionEvent event)
{
OpenNapServer[] servers = getSelectedServers();
if (servers != null) {
for (int i = 0; i < servers.length; i++) {
try {
servers[i].connect();
}
catch (IllegalOperationException e) {
StatusBar.setText(e.getLocalizedMessage());
}
}
}
}
}
/**
* This class provides an action that disconnects the selected servers.
*/
private class DisconnectAction extends AbstractAction {
public DisconnectAction()
{
putValue(Action.NAME, XNap.tr("Disconnect"));
putValue(Action.SHORT_DESCRIPTION,
XNap.tr("Disconnect from the selected servers."));
putValue(IconHelper.XNAP_ICON, "connect_no.png");
}
public void actionPerformed( ActionEvent event )
{
OpenNapServer[] servers = getSelectedServers();
if (servers != null) {
for (int i = 0; i < servers.length; i++) {
try {
servers[i].disconnect();
}
catch (IllegalOperationException e) {
StatusBar.setText(e.getLocalizedMessage());
}
}
}
}
}
/**
* This class provides an action that opens a
* {@link OpenNapServerEditorDialog} for each selected server.
*/
private class EditServerAction extends AbstractAction {
public EditServerAction()
{
putValue(Action.NAME, XNap.tr("Edit Server") + "...");
putValue(Action.SHORT_DESCRIPTION,
XNap.tr("Opens a dialog with the server properties."));
putValue(IconHelper.XNAP_ICON, "edit.png");
}
public void actionPerformed( ActionEvent event )
{
OpenNapServer[] servers = getSelectedServers();
if (servers != null) {
for (int i = 0; i < servers.length; i++) {
OpenNapServerEditorDialog d
= new OpenNapServerEditorDialog(servers[i]);
d.setNetworks(tmServers.getNetworkNames());
d.show(OpenNapServerPanel.this);
}
}
else {
StatusBar.setText(XNap.tr("Please select a server."));
}
}
}
/**
* RemoveServerAction class handles the command to remove the selected
* server(s) from the list. For each selected server it calls
* tmServers.removeServer(server).
*/
private class RemoveServerAction extends AbstractAction {
public RemoveServerAction()
{
putValue(Action.NAME, XNap.tr("Remove Server"));
putValue(Action.SHORT_DESCRIPTION,
XNap.tr("Remove the selected servers from the list"));
putValue(IconHelper.XNAP_ICON, "eraser.png");
}
public void actionPerformed( ActionEvent event )
{
OpenNapServer[] servers = getSelectedServers();
if (servers != null) {
for (int i = 0; i < servers.length; i++) {
OpenNapPlugin.getServerManager().remove(servers[i]);
}
}
else {
StatusBar.setText(XNap.tr("Please select a server."));
}
}
}
/**
*
*/
private class UseAutoConnectorAction extends AbstractAction {
public UseAutoConnectorAction()
{
putValue(Action.NAME, XNap.tr("Connect automatically"));
putValue(Action.SHORT_DESCRIPTION,
XNap.tr("Automatically connect to servers"));
}
public void actionPerformed(ActionEvent event)
{
AbstractButton ab = (AbstractButton)event.getSource();
OpenNapPlugin.getServerManager().getConnector().setEnabled
(ab.isSelected());
}
}
/**
*
*/
private class FindWSXFiles extends AbstractAction {
public FindWSXFiles()
{
putValue(Action.NAME, XNap.tr("Find WSX Files"));
putValue(IconHelper.XNAP_ICON, "editfind.png");
putValue(Action.SHORT_DESCRIPTION,
XNap.tr("Find servers file."));
}
public void actionPerformed(ActionEvent event)
{
SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");
DefaultSearchFilter filter = new DefaultSearchFilter();
filter.put(SearchFilter.TEXT, "PUBLIC " + df.format(new Date()));
filter.put("nap.minBitrate", new Long(24));
filter.put("nap.maxBitrate", new Long(24));
filter.put("nap.minFrequency", new Long(16000));
filter.put("nap.maxFrequency", new Long(16000));
Search search = OpenNapPlugin.getSearchManager().search(filter);
SearchManager.getInstance().handle(search);
FocusManager.setFocusTo("search", event);
}
}
}
The table below shows all metrics for OpenNapServerPanel.java.



