1 package org.columba.chat.ui.roaster; 19 20 import java.lang.reflect.InvocationTargetException ; 21 import java.util.logging.Logger ; 22 23 import javax.swing.JOptionPane ; 24 import javax.swing.JTree ; 25 import javax.swing.SwingUtilities ; 26 import javax.swing.tree.DefaultMutableTreeNode ; 27 import javax.swing.tree.DefaultTreeModel ; 28 import javax.swing.tree.TreePath ; 29 30 import org.columba.chat.Connection; 31 import org.columba.chat.MainInterface; 32 import org.columba.chat.command.AddContactCommand; 33 import org.columba.chat.command.ChatCommandReference; 34 import org.columba.chat.command.SubscriptionCommand; 35 import org.columba.chat.conn.api.ConnectionChangedEvent; 36 import org.columba.chat.conn.api.IConnectionChangedListener; 37 import org.columba.chat.conn.api.IConnection.STATUS; 38 import org.columba.chat.model.BuddyList; 39 import org.columba.chat.model.BuddyStatus; 40 import org.columba.chat.model.api.IBuddyStatus; 41 import org.columba.chat.ui.frame.api.IChatFrameMediator; 42 import org.columba.chat.ui.roaster.api.IRoasterController; 43 import org.columba.core.command.CommandProcessor; 44 import org.columba.core.gui.frame.FrameManager; 45 import org.jivesoftware.smack.PacketListener; 46 import org.jivesoftware.smack.filter.PacketTypeFilter; 47 import org.jivesoftware.smack.packet.Packet; 48 import org.jivesoftware.smack.packet.Presence; 49 50 54 public class RoasterTree extends JTree implements IRoasterController, 55 IConnectionChangedListener { 56 57 private static final Logger LOG = Logger 58 .getLogger("org.columba.chat.ui.roaster"); 59 60 private DefaultTreeModel model; 61 62 private DefaultMutableTreeNode root; 63 64 private IChatFrameMediator mediator; 65 66 private SubscriptionListener subscriptionListener = new SubscriptionListener(); 67 68 private PresenceListener presenceListener = new PresenceListener(); 69 70 public RoasterTree(IChatFrameMediator mediator) { 71 this.mediator = mediator; 72 73 root = new DefaultMutableTreeNode ("Roster"); 74 75 model = new DefaultTreeModel (root); 76 77 setModel(model); 78 79 setCellRenderer(new RoasterTreeRenderer()); 80 81 setRootVisible(false); 83 setShowsRootHandles(true); 84 85 MainInterface.connection.addConnectionChangedListener(this); 86 87 } 88 89 94 public IBuddyStatus getSelected() { 95 TreePath path = getSelectionPath(); 96 if (path == null) 97 return null; 98 DefaultMutableTreeNode node = (DefaultMutableTreeNode ) path 99 .getLastPathComponent(); 100 101 if (node != null) { 102 IBuddyStatus b = (IBuddyStatus) node.getUserObject(); 103 104 return b; 105 } 106 107 return null; 108 } 109 110 115 public void updateBuddyPresence(IBuddyStatus buddy) { 116 DefaultMutableTreeNode node = findBuddy(root, buddy); 117 if (node != null) { 118 119 model.nodeChanged(node); 120 121 } 122 123 updateUI(); 124 } 125 126 private DefaultMutableTreeNode findBuddy(DefaultMutableTreeNode parent, 127 IBuddyStatus buddy) { 128 for (int i = 0; i < parent.getChildCount(); i++) { 129 DefaultMutableTreeNode child = (DefaultMutableTreeNode ) parent 130 .getChildAt(i); 131 132 Object o = child.getUserObject(); 133 134 if (o instanceof BuddyStatus) { 135 if (buddy.getJabberId() 136 .equals(((IBuddyStatus) o).getJabberId())) 137 return child; 138 } 139 } 140 141 return null; 142 } 143 144 public void populate(DefaultMutableTreeNode rootNode) { 145 this.root = rootNode; 146 147 model.setRoot(root); 148 149 model.nodeStructureChanged(root); 150 151 } 152 153 class SubscriptionListener implements PacketListener { 154 155 public SubscriptionListener() { 156 super(); 157 } 158 159 162 163 public void processPacket(Packet p) { 164 Presence presence = (Presence) p; 165 166 if (presence.getType().equals(Presence.Type.SUBSCRIBE)) { 168 String from = presence.getFrom(); 170 171 String normalizedFrom = from.replaceAll("\\/.*", ""); 174 175 int option = JOptionPane 176 .showConfirmDialog( 177 FrameManager.getInstance() 178 .getActiveFrame(), 179 "The user " 180 + from 181 + " requests presence notification.\nDo you wish to allow them to see your " 182 + "online presence?", 183 "Subscription Request", 184 JOptionPane.YES_NO_OPTION); 185 186 if (option == JOptionPane.YES_OPTION) { 187 188 CommandProcessor.getInstance().addOp( 189 new SubscriptionCommand(mediator, 190 new ChatCommandReference(normalizedFrom))); 191 192 } else { 193 return; 194 } 195 196 option = JOptionPane.showConfirmDialog(null, 197 "Do you wish to add " + from + " to your roaster?", 198 "Add user", JOptionPane.YES_NO_OPTION); 199 200 if (option == JOptionPane.YES_OPTION) { 201 CommandProcessor.getInstance().addOp( 202 new AddContactCommand(mediator, 203 new ChatCommandReference(normalizedFrom))); 204 } 205 } 206 207 } 208 209 } 210 211 class PresenceListener implements PacketListener { 212 213 public PresenceListener() { 214 super(); 215 216 } 217 218 221 public void processPacket(Packet packet) { 222 Presence presence = (Presence) packet; 223 224 String from = presence.getFrom(); 225 226 if ((presence.getType() != Presence.Type.AVAILABLE) 227 && (presence.getType() != Presence.Type.UNAVAILABLE)) 228 return; 229 230 LOG.info("From=" + from); 231 LOG.info("Presence Mode=" + presence.getMode()); 232 233 String normalizedFrom = from.replaceAll("\\/.*", ""); 236 237 final IBuddyStatus status = BuddyList.getInstance().getBuddy( 238 normalizedFrom); 239 if (status == null) 241 return; 242 243 status.setPresenceMode(presence.getMode()); 244 if (presence.getType() == Presence.Type.AVAILABLE) { 245 status.setSignedOn(true); 246 247 } else if (presence.getType() == Presence.Type.UNAVAILABLE) { 248 status.setSignedOn(false); 249 250 } 251 252 Runnable updateAComponent = new Runnable () { 253 254 public void run() { 255 updateBuddyPresence(status); 256 } 257 }; 258 259 try { 260 SwingUtilities.invokeAndWait(updateAComponent); 261 } catch (InterruptedException e) { 262 e.printStackTrace(); 264 } catch (InvocationTargetException e) { 265 e.printStackTrace(); 267 } 268 269 } 270 } 271 272 275 public void connectionChanged(ConnectionChangedEvent object) { 276 STATUS status = object.getStatus(); 278 279 if (status == STATUS.ONLINE) { 280 setEnabled(true); 281 282 Connection.XMPPConnection.addPacketListener(subscriptionListener, 283 new PacketTypeFilter(Presence.class)); 284 285 Connection.XMPPConnection.addPacketListener(presenceListener, 286 new PacketTypeFilter(Presence.class)); 287 288 } else if (status == STATUS.OFFLINE) { 289 setEnabled(false); 290 291 Connection.XMPPConnection 292 .removePacketListener(subscriptionListener); 293 294 Connection.XMPPConnection.removePacketListener(presenceListener); 295 296 } 297 } 298 299 } | Popular Tags |