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

📄 bsrostertreeview.java

📁 一款即时通讯软件
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
     */
    protected void updateRoster() {
        
        if (!mainFrame.isConnected()) {
            setOfflineTree();
            return;
        }
        
        // saves current expansion state
        Iterator allRosterGroups = (rosterBean != null)? 
                                        rosterBean.getGroups() :
                                        new TreeSet().iterator();
        tree.saveState(allRosterGroups);
        
        // clears roster
        if (rosterBean == null) return;
        groups.clear();
        items.clear();
        root.removeAllChildren();
        
        // IX panels stuff
        //relations = IXPrefsIO.readRelations2(BSMainFrame.ixPropsPath);
        // end of IX panels stuff
        
        // adds my resources
        addMyResources();
        
        // for all entries in roster
        Enumeration entries = rosterBean.entries();
        while (entries != null && entries.hasMoreElements()) {
            RosterItem ri = (RosterItem) entries.nextElement();
            JID jid = ri.getJID();
            if (jid == null) continue;
            // checks if that is a transport / server component
            boolean isTransport = (jid.getUsername() == null 
                                   || jid.getUsername().equals(""));
            BSPresenceInfo pi = presenceBean.getPresence(jid);
            if (pi == null)
                pi = new BSPresenceInfo(jid, false, null, null);
            boolean messageWaiting = messengerBean.isMessageWaiting(jid);
            if (onlyOnline && !messageWaiting && !pi.isOnline() && !isTransport)
                continue;
            // creates JID roster tree node
            BSJIDItem ji = null;
            BSComponentNode cn = null;
            if (!isTransport) {
                ji = new BSJIDItem(ri, pi, messageWaiting);
                //String str = BSPresenceBean.getJIDHashString(jid, false);
                JID key = jid.getSimpleJID();
                //items.put(str, ji);
                items.put(key, ji);
            }
            else
                cn = new BSComponentNode(ri, pi);
            // adds it into all groups
            Enumeration itemGroups = ri.enumerateGroups();
            // if no group
            if (itemGroups == null || !itemGroups.hasMoreElements()) {
                if (!isTransport) addRosterItem(ji, BSMainFrame.NO_GROUP_NAME);
                else addRosterItem(cn, BSMainFrame.NO_GROUP_NAME);
            }
            // for all groups of roster element
            while (itemGroups != null && itemGroups.hasMoreElements()) {
                String gr = (String) itemGroups.nextElement();
                if (!isTransport) addRosterItem(ji, gr);
                else addRosterItem(cn, gr);
            }
            
            // IX panels stuff
            /*String jidStr = BSPresenceBean.getJIDHashString(jid, false);
            Object category = relations.get(jidStr);
            if (category != null)
                addRosterItem(ji, "[IX] " + (String)category);*/
            // end of IX panels stuff
            
            if (!isTransport) {
                // adds all resources to the jid node
                ji.updateResources();
                // updates unread message flag
                ji.updateMessageWaiting();
            }
        }
        
        // sorts groups
        sortGroups();
        
        //tree.repaint();
        model.reload();
        // restores expansion state
        tree.restoreState();
        
        // expands all groups
        //expandAllGroups();
    }
    
    protected void setOfflineTree() {
        groups.clear();
        items.clear();
        root.removeAllChildren();
        
        //BSGroupNode group = new BSGroupNode(myResGroupName);
        //root.add(group);
        //groups.put(myResGroupName, group);
        BSPresenceInfo pi = new BSPresenceInfo(new JID("jid","server","Offline"), false, null, null);
        BSResourceNode resNode = new BSResourceNode(pi);
        //group.add(resNode);
        root.add(resNode);
        
        model.reload();
        
        //TreePath path = new TreePath((group).getPath());
        //tree.expandPath(path);
    }
    
    /** Adds given jid item into the group */
    protected void addRosterItem(BSJIDItem ji, String groupName) {
        BSGroupNode group = (BSGroupNode) groups.get(groupName);
        if (group == null) {
            group = new BSGroupNode(groupName);
            root.add(group);
            groups.put(groupName, group);
        }
        group.addItem(ji);
    }
    
    /** Adds given transport item into the group */
    protected void addRosterItem(BSComponentNode node, String groupName) {
        BSGroupNode group = (BSGroupNode) groups.get(groupName);
        if (group == null) {
            group = new BSGroupNode(groupName);
            root.add(group);
            groups.put(groupName, group);
        }
        group.addItem(node);
    }
    
    /** Sorts groups in roster tree */
    protected void sortGroups() {
        root.removeAllChildren();
        
        TreeMap tmpMap = (TreeMap) groups.clone();
        while (!tmpMap.isEmpty()) {
            Object o = tmpMap.firstKey();
            BSGroupNode gr = (BSGroupNode)tmpMap.get(o);
            root.add(gr);
            gr.sortNodes();
            tmpMap.remove(o);
        }
    }
    
    /** Expands all groups */
    protected void expandAllGroups() {
        Enumeration nodes = root.children();
        while (nodes.hasMoreElements()) {
            Object o = nodes.nextElement();
            if (o instanceof BSGroupNode) {
                TreePath path = new TreePath(((BSGroupNode)o).getPath());
                tree.expandPath(path);
            }
        }
    }
    
    /** Collapses all groups */
    protected void collapseAllGroups() {
        Enumeration nodes = root.children();
        while (nodes.hasMoreElements()) {
            Object o = nodes.nextElement();
            if (o instanceof BSGroupNode) {
                TreePath path = new TreePath(((BSGroupNode)o).getPath());
                tree.collapsePath(path);
            }
        }
    }
    
    /** Adds my resources into the tree */
    protected void addMyResources() {
        
        // *** get all your presences from new JID(BSCore.username, BSCore.server) ***
        //JID myJID = new JID(BSCore.username, BSCore.server, BSCore.resource);
        //if (myJID == null) return;
        Enumeration pis = presenceBean.getMyResourcesPresences();
        
        BSGroupNode group = null;
        if (pis.hasMoreElements()) {
            group = (BSGroupNode) groups.get(myResGroupName);
            if (group == null) {
                group = new BSGroupNode(myResGroupName);
                root.add(group);
                groups.put(myResGroupName, group);
            }
            else
                group.removeAllChildren();
        }
        
        while (pis.hasMoreElements()) {
            BSPresenceInfo pi = (BSPresenceInfo) pis.nextElement();
            if (pi.isOnline()) {
                BSResourceNode resNode = new BSResourceNode(pi);
                resNode.updateMessageWaiting();
                group.add(resNode);
            }
        }
    }
    
    /** <code>BSMessageListener</code> function - update unread msg flag. */
    public void plainMessageReceived(Message msg) {
        if (msg == null) return;
        updateAfterMessageChange(msg.getFromAddress());
    }
    /** <code>BSMessageListener</code> function - update unread msg flag. */
    public void chatMessageReceived(Message msg) {
        if (msg == null) return;
        updateAfterMessageChange(msg.getFromAddress());
    }
    /** <code>BSMessageListener</code> function - update unread msg flag. */
    public void headlineMessageReceived(Message msg) {
        if (msg == null) return;
        updateAfterMessageChange(msg.getFromAddress());
    }
    /** <code>BSMessageListener</code> function - update unread msg flag. */
    public void groupchatMessageReceived(Message msg) {
        if (msg == null) return;
        updateAfterMessageChange(msg.getFromAddress());
    }
    
    /** <code>BSMessageListener</code> function - update unread msg flag. */
    public void messageRead(Message msg) {
        if (msg == null) return;
        updateAfterMessageChange(msg.getFromAddress());
    }
    
    /** <code>BSMessageListener</code> function - empty implementation. */
    public void messageError(JID toAddress, String errType, String error) { }
    
    /** <code>BSMessageListener</code> function - empty implementation. */
    public void messageError(Message msg) { }
    
    /** Updates unread msg flag for jid */
    public void updateAfterMessageChange(JID fromAddress) {
        if (fromAddress == null) return;
        //String str = BSPresenceBean.getJIDHashString(fromAddress, false);
        JID key = fromAddress.getSimpleJID();
        //BSJIDItem i = (BSJIDItem) items.get(str);
        BSJIDItem i = (BSJIDItem) items.get(key);
        
        if (i == null) {
            Iterator allRosterGroups = (rosterBean != null)? 
                                            rosterBean.getGroups() :
                                            new TreeSet().iterator();
            tree.saveState(allRosterGroups);
        
            addMyResources();
            model.reload();
            //tree.expandRow(0);
            tree.restoreState();
        }
        else
            i.updateMessageWaiting();
        
        tree.repaint();
    }
    
    /** <code>MouseListener</code> function - catches double-clicks. */
    public void mouseClicked(MouseEvent e) {
        // handles only double clicks on JID nodes
        if (e.getClickCount() == 2) {
            if (!mainFrame.isConnected())
                return;
            // hack to not change expansion state
            TreePath curSelPath = tree.getSelectionPath();
            if (tree.isExpanded(curSelPath)) tree.collapsePath(curSelPath);
            else tree.expandPath(curSelPath);
            openChatWindow();
            tree.repaint();
        }
    }
     
    /** <code>MouseListener</code> function - catches popup clicks. */
    public void mousePressed(MouseEvent e) {
        maybeShowPopup(e);
    }
     
    /** <code>MouseListener</code> function - catches popup clicks. */
    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) { }
     
    /**
     * Called when open chat is selected. Open chat with selected jid.
     */
    protected void openChatWindow() {
        // gets selected node
        DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
        if (node == null) return;
        
        // if jid node
        if (node.getUserObject() instanceof BSJIDItem) {
            // opens chat
            BSJIDItem i = (BSJIDItem) node.getUserObject();
            JID jid = i.getJID();
            mainFrame.openChatWindow(jid, true, true);
            i.updateMessageWaiting();
        }
        // if resource node
        else if (node instanceof BSResourceNode) {
            // opens chat
            BSResourceNode resNode = (BSResourceNode) node;
            JID jid = resNode.getJID();
            mainFrame.openChatWindow(jid, true, true);
            DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode) resNode.getParent();
            if (parentNode != null &&
                parentNode.getUserObject() instanceof BSJIDItem) {
                ((BSJIDItem) parentNode.getUserObject()).updateMessageWaiting();
            }
        }
        else
            return;
    }
    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -