/** * $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.fastpath.workspace.invite; import org.jivesoftware.fastpath.FpRes; import org.jivesoftware.fastpath.resources.FastpathRes; 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 org.jivesoftware.spark.component.JiveTreeCellRenderer; import org.jivesoftware.spark.component.JiveTreeNode; import org.jivesoftware.spark.component.Tree; 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.Iterator; import java.util.List; import java.util.Map; public final class WorkgroupRosterTree extends JPanel { private static final long serialVersionUID = -1159008318665938338L; private final JiveTreeNode rootNode = new JiveTreeNode(FpRes.getString("title.contact.list")); private final Tree rosterTree; private final Map<JiveTreeNode, String> addressMap = new HashMap<JiveTreeNode, String>(); private boolean showUnavailableAgents = true; private final List workgroupList; private Collection exclusionList; /** * Creates a new Roster Tree. * * @param exclusionJIDs the collection of jids to be excluded from the roster. * @param showAgents true if agents should be visible. * @param workgroupList the list of workgroups. */ public WorkgroupRosterTree(Collection exclusionJIDs, boolean showAgents, List workgroupList) { this.workgroupList = workgroupList; showUnavailableAgents = showAgents; exclusionList = exclusionJIDs; 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) { final Iterator<JiveTreeNode> iter = addressMap.keySet().iterator(); while (iter.hasNext()) { final JiveTreeNode node = (JiveTreeNode)iter.next(); final String nodeUser = (String)addressMap.get(node); if (user.startsWith(nodeUser)) { if (!PresenceManager.isAvailable(presence)) { node.setIcon(FastpathRes.getImageIcon(FastpathRes.RED_BALL)); } else { node.setIcon(FastpathRes.getImageIcon(FastpathRes.GREEN_BALL)); } } } } private void buildFromRoster() { final XMPPConnection xmppCon = SparkManager.getConnection(); final Roster roster = xmppCon.getRoster(); roster.addRosterListener(new RosterListener() { public void rosterModified() { } public void entriesAdded(Collection collection) { } public void entriesUpdated(Collection collection) { } public void entriesDeleted(Collection collection) { } public void presenceChanged(Presence presence) { changePresence(presence.getFrom(), presence); } }); for (RosterGroup group : roster.getGroups()) { if (workgroupList.contains(group.getName())) { continue; } 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(); } if (exclusionList.contains(entry.getUser())) { continue; } final JiveTreeNode entryNode = new JiveTreeNode(name, false); final Presence usersPresence = roster.getPresence(entry.getUser()); addressMap.put(entryNode, entry.getUser()); if (PresenceManager.isAvailable(usersPresence)) { 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 getAgentJID(JiveTreeNode node) { String address = (String)addressMap.get(node); return address; } public String toString() { return "Roster"; } }