/** * $RCSfile: ,v $ * $Revision: $ * $Date: $ * * Copyright (C) 2004-2011 Jive Software. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jivesoftware.spark.component; import org.jivesoftware.resource.SparkRes; import org.jivesoftware.smack.Roster; import org.jivesoftware.smack.RosterEntry; import org.jivesoftware.smack.RosterGroup; import org.jivesoftware.smack.RosterListener; import org.jivesoftware.smack.XMPPConnection; import org.jivesoftware.smack.packet.Presence; import org.jivesoftware.spark.PresenceManager; import org.jivesoftware.spark.SparkManager; import javax.swing.BorderFactory; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.tree.DefaultTreeModel; import java.awt.BorderLayout; import java.awt.Color; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.util.Collection; import java.util.HashMap; import java.util.Map; public final class RosterTree extends JPanel { private static final long serialVersionUID = 7892174130061826144L; private final JiveTreeNode rootNode = new JiveTreeNode("Contact List"); private final Tree rosterTree; private final Map<JiveTreeNode,String> addressMap = new HashMap<JiveTreeNode,String>(); private boolean showUnavailableAgents = true; /** * Creates a new Roster Tree. */ public RosterTree() { rootNode.setAllowsChildren(true); rosterTree = new Tree(rootNode); rosterTree.setCellRenderer(new JiveTreeCellRenderer()); buildFromRoster(); setLayout(new BorderLayout()); final JPanel panel = new JPanel(); panel.setLayout(new GridBagLayout()); panel.setBackground(Color.white); final JScrollPane treeScroller = new JScrollPane(rosterTree); treeScroller.setBorder(BorderFactory.createEmptyBorder()); panel.add(treeScroller, new GridBagConstraints(0, 1, 1, 1, 1.0, 1.0, GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(5, 5, 5, 5), 0, 0)); add(panel, BorderLayout.CENTER); for (int i = 0; i < rosterTree.getRowCount(); i++) { rosterTree.expandRow(i); } } private void changePresence(String user, Presence presence){ for (Object o : addressMap.keySet()) { final JiveTreeNode node = (JiveTreeNode) o; final String nodeUser = addressMap.get(node); if (user.startsWith(nodeUser)) { if (!presence.isAvailable()) { node.setIcon(SparkRes.getImageIcon(SparkRes.CLEAR_BALL_ICON)); } else { node.setIcon(SparkRes.getImageIcon(SparkRes.GREEN_BALL)); } } } } private void buildFromRoster() { final XMPPConnection xmppCon = SparkManager.getConnection(); final Roster roster = xmppCon.getRoster(); roster.addRosterListener(new RosterListener() { public void entriesAdded(Collection<String> addresses) { } public void entriesUpdated(Collection<String> addresses) { } public void entriesDeleted(Collection<String> addresses) { } public void presenceChanged(Presence presence) { //changePresence(presence.getFrom(), presence.getMode() == Presence.Mode.available); } }); for (RosterGroup group : roster.getGroups()) { final JiveTreeNode groupNode = new JiveTreeNode(group.getName(), true); groupNode.setAllowsChildren(true); if (group.getEntryCount() > 0) { rootNode.add(groupNode); } for (RosterEntry entry : group.getEntries()) { String name = entry.getName(); if (name == null) { name = entry.getUser(); } final JiveTreeNode entryNode = new JiveTreeNode(name, false); final Presence usersPresence = PresenceManager.getPresence(entry.getUser()); addressMap.put(entryNode, entry.getUser()); if (usersPresence.isAvailable() && !usersPresence.isAway()) { groupNode.add(entryNode); } else if (showUnavailableAgents) { groupNode.add(entryNode); } changePresence(entry.getUser(), usersPresence); final DefaultTreeModel model = (DefaultTreeModel)rosterTree.getModel(); model.nodeStructureChanged(groupNode); } } } /** * Returns the Tree representation of the Roster Tree. * * @return the tree representation of the Roster Tree. */ public Tree getRosterTree() { return rosterTree; } /** * Returns the selected agent node userobject. * * @param node the JiveTreeNode. * @return the selected agent nodes userobject. */ public String getJID(JiveTreeNode node) { return addressMap.get(node); } public String toString() { return "Roster"; } }