ChannelPanel.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.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.StringTokenizer;
import javax.swing.AbstractAction;
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.*;
import javax.swing.SwingUtilities;
import javax.swing.border.EmptyBorder;
import org.xnap.XNap;
import org.xnap.chat.Channel;
import org.xnap.chat.ChannelEvent;
import org.xnap.chat.ChannelListener;
import org.xnap.cmdl.Command;
import org.xnap.cmdl.Console;
import org.xnap.cmdl.Executer;
import org.xnap.cmdl.LocalExecuter;
import org.xnap.gui.action.MenuAction;
import org.xnap.gui.component.*;
import org.xnap.gui.component.XNapTextField;
import org.xnap.gui.component.XNapToggleButton;
import org.xnap.gui.event.PopupListener;
import org.xnap.gui.menu.PeerMenu;
import org.xnap.gui.table.ChatPeerTableModel;
import org.xnap.gui.util.FocusHandler;
import org.xnap.gui.util.GUIHelper;
import org.xnap.peer.Peer;
import org.xnap.util.Formatter;
import org.xnap.util.Preferences;
/**
* Provides a panel that handles a chat {@link Channel}. Provides a
* {@link ChatPane} that displays the messages and a table that
* contains the joined {@link Peer} objects.
*/
public class ChannelPanel extends JPanel
implements ChannelListener, PropertyChangeListener, PeerProvider,
ActionProvider, Console {
// --- Data Field(s) ---
private Preferences prefs = Preferences.getInstance();
private ChatPanel parent;
private ChatPane cpChat;
private JTable jta;
private XNapTextField jteInput;
private ChatPeerTableModel ptm;
private JSplitPane jspH;
private JLabel jlTopic;
private JLabel jlServer;
private JCheckBox jcbShowChatMsgTime;
private JCheckBox jcbBeepOnChatMessage;
private JCheckBox jcbBlinkOnChatMessage;
private SendAction acSend = new SendAction();
private Channel channel;
private LocalExecuter executer;
//--- Constructor(s) ---
public ChannelPanel(ChatPanel parent, Channel channel)
{
this.parent = parent;
this.channel = channel;
initialize();
// FIX: the following two statements should be atomic
Peer[] peers = channel.getPeers();
channel.addChannelListener(this);
for (int i = 0; i < peers.length; i++) {
ptm.add(peers[i]);
}
updateStatus();
if (prefs.getPrintServerNotificationsInChatWindow()
&& channel.getProvider() != null) {
println(XNap.tr("connected to {0}",
channel.getProvider().getName()),
"chatInfo");
}
Command[] commands = channel.getCommands();
if (commands != null) {
executer = new LocalExecuter(commands);
}
jspH.addPropertyChangeListener
(JSplitPane.DIVIDER_LOCATION_PROPERTY,
this);
}
// --- Method(s) ---
private void initialize()
{
cpChat = new ChatPane();
Box boxTop = new Box(BoxLayout.X_AXIS);
// topic
boxTop.add(Box.createHorizontalStrut(5));
jlTopic = new SqueezedTextLabel();
setTopic(channel.getTopic());
boxTop.add(jlTopic);
boxTop.add(Box.createGlue());
jcbShowChatMsgTime = new JCheckBox
(XNap.tr("Timestamp Messages"), prefs.getShowChatMsgTime());
boxTop.add(jcbShowChatMsgTime);
jcbBeepOnChatMessage = new JCheckBox
(XNap.tr("Beep"), prefs.getBeepOnChatMessage());
boxTop.add(jcbBeepOnChatMessage);
jcbBlinkOnChatMessage = new JCheckBox(XNap.tr("Blink"), false);
boxTop.add(jcbBlinkOnChatMessage);
// peers
JPanel jpPeers = new JPanel(new BorderLayout());
JMenu jm = new ChatPeerMenu(this);
ptm = new ChatPeerTableModel(getChannel());
jta = ptm.createTable(prefs, "user");
MouseListener ml = new PopupListener(jm);
jta.addMouseListener(ml);
jta.setShowGrid(false);
JScrollPane jsp = new JScrollPane(jta);
jpPeers.add(jsp, BorderLayout.CENTER);
//jta.setPreferredScrollableViewportSize(new Dimension(250, 200));
// server label
JPanel jpServer = new JPanel(new BorderLayout());
jpServer.setBorder(new EmptyBorder(5, 5, 5, 5));
jlServer = new JLabel(" ");
jpServer.add(jlServer, BorderLayout.CENTER);
jpPeers.add(jpServer, BorderLayout.SOUTH);
// input
Box boxBottom = new Box(BoxLayout.X_AXIS);
Command[] commands = channel.getCommands();
if (commands != null) {
CommandMenuActionListener listener
= new CommandMenuActionListener();
JMenu commandMenu = new JMenu("Commands");
for (int i = 0; i < commands.length; i++) {
String name = commands[i].getCommand() + " "
+ commands[i].getParameter();
JMenuItem item = new JMenuItem(name);
item.addActionListener(listener);
item.setActionCommand(name);
commandMenu.add(item);
}
MenuAction commandMenuAction
= new MenuAction(commandMenu, "run.png");
boxBottom.add(new XNapToggleButton(commandMenuAction));
boxBottom.add(Box.createHorizontalStrut(5));
}
// jteInput = new HistoryTextField("", 20);
jteInput = new XNapTextField("", 20);
jteInput.setPreferences("chat");
GUIHelper.bindEnterKey(jteInput, acSend);
boxBottom.add(jteInput);
boxBottom.add(Box.createHorizontalStrut(5));
boxBottom.add(new JButton(acSend));
// split pane
jspH = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
jspH.add(cpChat, JSplitPane.LEFT);
jspH.add(jpPeers, JSplitPane.RIGHT);
jspH.setDividerLocation(prefs.getChatVerticalDividerLocation());
jspH.setResizeWeight(1);
jspH.setOneTouchExpandable(true);
jspH.setBorder(GUIHelper.createEmptyBorder());
// content
setLayout(new BorderLayout());
add(boxTop, BorderLayout.NORTH);
add(jspH, BorderLayout.CENTER);
add(boxBottom, BorderLayout.SOUTH);
addComponentListener(new FocusHandler(jteInput));
}
public void channelJoined(ChannelEvent e)
{
parent.setTabTitle(this, channel.getName());
}
public void channelParted(ChannelEvent e)
{
parent.setTabTitle(this, "(" + channel.getName() + ")");
}
public Action[] getActions()
{
return getChannel().getActions();
//return new Action[] { null, acMenu };
}
public Channel getChannel()
{
return channel;
}
public Command getCommand(String name)
{
return (executer != null)
? executer.getCommand(name)
: Executer.getCommand(name);
}
public Command[] getCommands()
{
return (executer != null)
? executer.getCommands()
: Executer.getCommands();
}
public Peer[] getPeers()
{
int[] rows = jta.getSelectedRows();
Peer[] peers = new Peer[rows.length];
for (int i = 0; i < rows.length; i++) {
peers[i] = ptm.get(rows[i]);
}
return peers;
}
/**
* Returns true.
*/
public boolean isEchoing()
{
return true;
}
public void messageReceived(ChannelEvent e)
{
Peer sender = e.getPeer();
if (e.getMessageType() == ChannelEvent.MESSAGE_TYPE_MESSAGE) {
printTimeStamp();
print(sender.getName(), "chatUser");
print("> " + e.getMessage(), "chatMessage");
println("", "chatMessage", !channel.isLocal(sender));
}
else if (e.getMessageType()
== ChannelEvent.MESSAGE_TYPE_ACTION_MESSAGE) {
println("\003\006* " + sender.getName() + " " + e.getMessage(),
"chatMessage");
}
else if (e.getMessageType() == ChannelEvent.MESSAGE_TYPE_ERROR) {
println(e.getMessage(), "chatError");
}
else if (e.getMessageType() == ChannelEvent.MESSAGE_TYPE_INFO) {
println(e.getMessage(), "chatInfo");
}
if (jcbBlinkOnChatMessage.isSelected()) {
Runnable runner = new Runnable()
{
public void run()
{
XNapFrame.getInstance().chatBlink();
}
};
SwingUtilities.invokeLater(runner);
}
}
public void print(String s, String style)
{
cpChat.appendLater(s, style);
}
public void println(String s, String style, boolean beep)
{
if (s.length() > 0) {
printTimeStamp();
}
print(s + "\n", style);
if (beep && jcbBeepOnChatMessage.isSelected()) {
Toolkit.getDefaultToolkit().beep();
}
}
public void println(String s, String style)
{
println(s, style, true);
}
/**
* Invoked by {@link xnap.cmdl.Command} objects.
*
* @see xnap.cmdl.Console#println(String)
*/
public void println(String text)
{
println(text, "chatInfo", false);
}
public void printTimeStamp()
{
if (jcbShowChatMsgTime.isSelected()) {
cpChat.appendLater("[" + Formatter.shortDate() + "] ",
"chatMessage");
}
}
public String readln(String prompt)
{
return JOptionPane.showInputDialog
(this, prompt, XNap.tr("Console"), JOptionPane.QUESTION_MESSAGE);
}
public void propertyChange(PropertyChangeEvent e)
{
prefs.setChatVerticalDividerLocation(jspH.getDividerLocation());
}
public void updateStatus()
{
StringBuffer sb = new StringBuffer();
if (getChannel().getProvider() != null) {
sb.append(getChannel().getProvider().getName());
sb.append(" / ");
}
sb.append(ptm.getRowCount());
sb.append(" ");
sb.append(XNap.tr("users"));
final String s = sb.toString();
Runnable runner = new Runnable()
{
public void run()
{
jlServer.setText(s);
}
};
SwingUtilities.invokeLater(runner);
}
public void peerAdded(final ChannelEvent e)
{
Runnable runner = new Runnable()
{
public void run()
{
ptm.add(e.getPeer());
updateStatus();
}
};
SwingUtilities.invokeLater(runner);
}
public void peerChanged(final ChannelEvent e)
{
Runnable runner = new Runnable()
{
public void run()
{
ptm.changed(e.getPeer());
}
};
SwingUtilities.invokeLater(runner);
}
public void peerRemoved(final ChannelEvent e)
{
Runnable runner = new Runnable()
{
public void run()
{
ptm.remove(e.getPeer());
updateStatus();
}
};
SwingUtilities.invokeLater(runner);
}
public void setTopic(String topic)
{
jlTopic.setText(topic);
// jlTopic.setToolTipText(topic);
}
public void topicChanged(final ChannelEvent e)
{
Runnable runner = new Runnable()
{
public void run()
{
setTopic(e.getTopic());
}
};
SwingUtilities.invokeLater(runner);
}
//--- Inner Class(es) ---
/**
* Sends a message.
*/
private class SendAction extends AbstractAction {
public SendAction()
{
putValue(Action.NAME, XNap.tr("Send"));
putValue(Action.SHORT_DESCRIPTION, XNap.tr("Sends message."));
putValue(Action.MNEMONIC_KEY, new Integer('S'));
}
public void actionPerformed(ActionEvent event)
{
String s = jteInput.getText();
if (s.length() > 0) {
jteInput.getCompletionModel().insert(s);
if (s.startsWith("/")) {
if (Executer.parse(s, ChannelPanel.this)) {
jteInput.setText("");
return;
}
}
channel.sendMessage(s);
jteInput.setText("");
}
}
}
/**
* Inserts a command into the input field.
*/
private class CommandMenuActionListener
implements ActionListener {
public void actionPerformed(ActionEvent event)
{
String command = event.getActionCommand();
if (command != null) {
StringTokenizer t
= new StringTokenizer(command, " ");
if (t.hasMoreTokens()) {
String cmd = "/" + t.nextToken() + " ";
String parameter
= (t.hasMoreTokens()) ? t.nextToken("") : "";
jteInput.setText(cmd + parameter);
jteInput.setCaretPosition(cmd.length());
jteInput.setSelectionStart(cmd.length());
jteInput.setSelectionEnd
(cmd.length() + parameter.length());
jteInput.requestFocus();
}
}
}
}
private class ChatPeerMenu extends PeerMenu
{
//--- Constant(s) ---
//--- Data field(s) ---
//--- Constructor(s) ---
public ChatPeerMenu(PeerProvider pp)
{
super(pp);
}
//--- Method(s) ---
protected void willBecomeVisible()
{
super.willBecomeVisible();
Peer[] peers = getPeers();
if (peers != null && peers.length == 1) {
Action[] actions = channel.getPeerActions(peers[0]);
if (actions != null) {
addTemporary(new JPopupMenu.Separator(), 0);
for (int i = 0; i < actions.length; i++) {
addTemporary(new XNapMenuItem(actions[i]), i);
}
}
}
}
}
}
The table below shows all metrics for ChannelPanel.java.




