📄 bsconfrostertree.java
字号:
package edu.ou.kmi.buddyspace.plugins.conference.gui;
/*
* BSConfRosterTree.java
*
* Project: BuddySpace
* (C) Copyright Knowledge Media Institute 2002
*
*
* Created on 7 October 2002, 17:28
*/
import java.util.*;
import javax.swing.*;
import javax.swing.tree.*;
import java.awt.*;
import java.awt.event.*;
import org.jabber.jabberbeans.*;
import org.jabber.jabberbeans.util.*;
import org.jabber.jabberbeans.Extension.*;
import edu.ou.kmi.buddyspace.core.*;
import edu.ou.kmi.buddyspace.gui.*;
import edu.ou.kmi.buddyspace.plugins.conference.*;
import edu.ou.kmi.buddyspace.plugins.conference.core.*;
/**
* <code>BSConfRosterBean</code> is the graphical representation of nicks
* present in a conference room and their presences. It relies on
* <code>BSConfBeanInterface</code>.
*
* @author Jiri Komzak, Knowledge Media Institute, Open University, United Kingdom
*/
public class BSConfRosterTree implements BSConfListener,
/*BSMessageListener,*/ MouseListener,
ActionListener {
private TreeMap items = null;
private JTree tree = null;
private JScrollPane scrollPane = null;
private DefaultMutableTreeNode root = null;
private DefaultTreeModel model = null;
private JMenuItem chatMenuItem = null;
private JMenuItem nickMenuItem = null;
//private JMenuItem fileMenuItem = null;
private JPopupMenu popupMenu = null;
private BSConfBeanInterface confBean = null;
private BSConfWinManager winMan = null;
private JID roomJID = null;
/** Constructor */
public BSConfRosterTree (BSConfBeanInterface confBean, JID roomJID, BSConfWinManager winMan) {
items = new TreeMap();
this.roomJID = roomJID;
this.winMan = winMan;
setConfBean(confBean);
initComponents();
}
/** Sets conference bean */
public void setConfBean(BSConfBeanInterface confBean) {
this.confBean = confBean;
if (confBean != null)
confBean.addConfListener(this);
}
/*public void setMessengerBean(BSMessengerBean messengerBean) {
this.messengerBean = messengerBean;
if (messengerBean != null)
messengerBean.addMessageListener(this);
}*/
/** Inits GUI components */
protected void initComponents() {
root = new DefaultMutableTreeNode("Roster");
model = new DefaultTreeModel(root);
//tree = new JTree(model);
tree = new JTree(model);
tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
//tree.setCellRenderer(new BSConfRosterRenderer());
tree.setCellRenderer(new BSMultiImgTreeRenderer());
tree.setRootVisible(false);
//tree.setEditable(true);
//tree.setToggleClickCount(1);
tree.addMouseListener(this);
//tree.setPreferredSize(new Dimension(200, 100));
ToolTipManager.sharedInstance().registerComponent(tree);
scrollPane = new JScrollPane(tree);
scrollPane.setBorder(new javax.swing.border.TitledBorder("Roster"));
scrollPane.setAutoscrolls(true);
scrollPane.setPreferredSize(new Dimension(10, 10));
// context menu items
chatMenuItem = new JMenuItem("Open chat");
chatMenuItem.addActionListener(this);
nickMenuItem = new JMenuItem("Change nick");
nickMenuItem.addActionListener(this);
//fileMenuItem = new JMenuItem("Send file");
//fileMenuItem.addActionListener(this);
// group context menu
popupMenu = new JPopupMenu();
//groupContextMenu.add(addContactMenuItem);
//groupContextMenu.add(refreshMenuItem);
}
/** Returns scroll pane, which is the tree top component */
public JScrollPane getScrollPane() {
return scrollPane;
}
/** return jids of users in roster */
public String [] getUsers()
{
int n = root.getChildCount();
String [] people = new String[n];
for (int i = 0; i < n; i++)
{
TreeNode node = root.getChildAt(i);
if (node instanceof BSNickNode)
{
BSNickNode nick = (BSNickNode)node;
people[i] = nick.getJID().toString();
System.out.println(people[i]);
} else {
System.err.println("Non BSNickNode in BSConfRosterTree");
}
}
return people;
}
/** Updates roster contents according to conference bean */
protected void updateRoster() {
if (confBean == null) return;
root.removeAllChildren();
items.clear();
Enumeration roster = confBean.getRoster(roomJID);
while(roster.hasMoreElements()) {
BSPresenceInfo tpi = (BSPresenceInfo) roster.nextElement();
if (tpi.isOnline()) {
BSNickNode nickNode = new BSNickNode(tpi);
root.add(nickNode);
items.put(nickNode.toString(), nickNode);
}
}
sortNodes();
//tree.repaint();
model.reload();
//tree.expandRow(0);
//tree.restoreState();
}
/** Sorts nodes in tree */
protected void sortNodes() {
root.removeAllChildren();
TreeMap tmpMap = (TreeMap) items.clone();
while (!tmpMap.isEmpty()) {
Object o = tmpMap.firstKey();
root.add((BSNickNode)items.get(o));
tmpMap.remove(o);
}
}
/** <code>MouseListener</code> function - catches double-clicks */
public void mouseClicked(MouseEvent e) {
// handles only double clicks on JID nodes
if ( e.getClickCount() == 2 ) {
//openChatWindow();
//tree.repaint();
}
}
/** <code>MouseListener</code> function - catches show popup */
public void mousePressed(MouseEvent e) {
maybeShowPopup(e);
}
/** <code>MouseListener</code> function - catches show popup */
public void mouseReleased(MouseEvent e) {
maybeShowPopup(e);
}
/** <code>MouseListener</code> function - empty implementation */
public void mouseEntered(MouseEvent e) { }
/** <code>MouseListener</code> function - empty implementation */
public void mouseExited(MouseEvent e) { }
/** Checks if supposed to show popup and shows it */
protected void maybeShowPopup(MouseEvent e) {
// if that was context popup event
if (e.isPopupTrigger()) {
//if (e.getClickCount() == 1 && SwingUtilities.isRightMouseButton(e)) {
// gets the selected node
int selRow = tree.getRowForLocation(e.getX(), e.getY());
TreePath selPath = tree.getPathForLocation(e.getX(), e.getY());
if (selRow != -1) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) selPath.getLastPathComponent();
tree.addSelectionPath(selPath);
// if we clicked on a nick node
if (node instanceof BSNickNode) {
popupMenu.removeAll();
popupMenu.add(chatMenuItem);
popupMenu.add(nickMenuItem);
//popupMenu.add(fileMenuItem);
popupMenu.show(e.getComponent(), e.getX(), e.getY());
adjustPopupPosition(popupMenu);
}
}
}
}
/** Adjusts popup menu position */
protected void adjustPopupPosition(JPopupMenu menu) {
Point point = menu.getLocationOnScreen();
Dimension menuSize = menu.getSize();
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Rectangle oldRect = new Rectangle(point.x, point.y, menuSize.width, menuSize.height);
Rectangle newRect = new Rectangle(Math.max(0, Math.min(screenSize.width - menuSize.width,
point.x)),
Math.max(0, Math.min(screenSize.height - menuSize.height,
point.y)),
menuSize.width, menuSize.height);
if (!oldRect.equals(newRect)) {
Window window = SwingUtilities.getWindowAncestor(menu);
if(window != null){
window.setLocation(newRect.x, newRect.y);
}
}
}
/** Handles actions from GUI controls */
public void actionPerformed(ActionEvent e) {
Object mi = e.getSource();
// opens private chat
if (mi == chatMenuItem) {
openChatWindow();
}
// changes nick
else if (mi == nickMenuItem) {
winMan.changeNick(roomJID);
}
}
/** Opens private chat window with selected node */
protected void openChatWindow() {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
if (node == null) return;
if (node instanceof BSNickNode) {
BSNickNode resNode = (BSNickNode) node;
JID jid = resNode.getJID();
winMan.openChatWindow(jid, true, true);
}
else
return;
}
/** Called when presence changed - updates tree */
public void presenceChanged(JID fromAddress, String nick, BSPresenceInfo pi) {
updateRoster();
}
/** Empty */
public void error(JID roomJID, String errCode, String errMsg) { }
/** Empty */
public void groupMessage(JID fromAddress, String nick, String body) { }
/** Empty */
public void invitation(JID fromAddress, JID roomJID, String subject, String body) { }
/** Empty */
public void privateMessage(JID fromAddress, String nick, String body) { }
/** Empty */
public void roomMessage(JID roomJID, String body) { }
/** Empty */
public void stateChanged(JID roomJID, int state) { }
/** Empty */
public void setMyJID(JID roomJID, JID myJID) { }
// *** inner classes ***
/**
* <code>BSNickNode</code> is a tree node representing a nick.
*/
public class BSNickNode extends DefaultMutableTreeNode {
protected BSPresenceInfo pi = null;
protected String nick;
/** Constructor */
public BSNickNode(BSPresenceInfo pi) {
this.pi = pi;
}
/** Returns text displayed in tree */
public String toString() {
//return pi.jid.getResource();// + "(" + pi.show + "-" + pi.status + ")";
return (pi != null)? confBean.getNick(pi.getJID()) : null;
}
/** Returns nick's JID */
public JID getJID() {
return (pi != null)? pi.getJID() : null;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -