⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bsconfrostertree.java

📁 一款即时通讯软件
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
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 + -