KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > columba > chat > ui > roaster > RoasterTree


1 // The contents of this file are subject to the Mozilla Public License Version
2
// 1.1
3
//(the "License"); you may not use this file except in compliance with the
4
//License. You may obtain a copy of the License at http://www.mozilla.org/MPL/
5
//
6
//Software distributed under the License is distributed on an "AS IS" basis,
7
//WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
8
//for the specific language governing rights and
9
//limitations under the License.
10
//
11
//The Original Code is "The Columba Project"
12
//
13
//The Initial Developers of the Original Code are Frederik Dietz and Timo
14
// Stich.
15
//Portions created by Frederik Dietz and Timo Stich are Copyright (C) 2003.
16
//
17
//All Rights Reserved.
18
package org.columba.chat.ui.roaster;
19
20 import java.lang.reflect.InvocationTargetException JavaDoc;
21 import java.util.logging.Logger JavaDoc;
22
23 import javax.swing.JOptionPane JavaDoc;
24 import javax.swing.JTree JavaDoc;
25 import javax.swing.SwingUtilities JavaDoc;
26 import javax.swing.tree.DefaultMutableTreeNode JavaDoc;
27 import javax.swing.tree.DefaultTreeModel JavaDoc;
28 import javax.swing.tree.TreePath JavaDoc;
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 /**
51  * @author fdietz
52  *
53  */

54 public class RoasterTree extends JTree JavaDoc implements IRoasterController,
55         IConnectionChangedListener {
56
57     private static final Logger JavaDoc LOG = Logger
58             .getLogger("org.columba.chat.ui.roaster");
59
60     private DefaultTreeModel JavaDoc model;
61
62     private DefaultMutableTreeNode JavaDoc 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 JavaDoc("Roster");
74
75         model = new DefaultTreeModel JavaDoc(root);
76
77         setModel(model);
78
79         setCellRenderer(new RoasterTreeRenderer());
80
81         // setPreferredSize(new Dimension(250, 300));
82
setRootVisible(false);
83         setShowsRootHandles(true);
84
85         MainInterface.connection.addConnectionChangedListener(this);
86
87     }
88
89     /*
90      * (non-Javadoc)
91      *
92      * @see org.columba.chat.ui.roaster.IRoasterTree#getSelected()
93      */

94     public IBuddyStatus getSelected() {
95         TreePath JavaDoc path = getSelectionPath();
96         if (path == null)
97             return null;
98         DefaultMutableTreeNode JavaDoc node = (DefaultMutableTreeNode JavaDoc) 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     /*
111      * (non-Javadoc)
112      *
113      * @see org.columba.chat.ui.roaster.IRoasterTree#updateBuddyPresence(org.columba.chat.api.IBuddyStatus)
114      */

115     public void updateBuddyPresence(IBuddyStatus buddy) {
116         DefaultMutableTreeNode JavaDoc node = findBuddy(root, buddy);
117         if (node != null) {
118
119             model.nodeChanged(node);
120
121         }
122
123         updateUI();
124     }
125
126     private DefaultMutableTreeNode JavaDoc findBuddy(DefaultMutableTreeNode JavaDoc parent,
127             IBuddyStatus buddy) {
128         for (int i = 0; i < parent.getChildCount(); i++) {
129             DefaultMutableTreeNode JavaDoc child = (DefaultMutableTreeNode JavaDoc) parent
130                     .getChildAt(i);
131
132             Object JavaDoc 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 JavaDoc 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         /**
160          * @see org.jivesoftware.smack.PacketListener#processPacket(org.jivesoftware.smack.packet.Packet)
161          */

162
163         public void processPacket(Packet p) {
164             Presence presence = (Presence) p;
165
166             // we are only interested on subscription requests
167
if (presence.getType().equals(Presence.Type.SUBSCRIBE)) {
168                 // ask the user
169
String JavaDoc from = presence.getFrom();
170
171                 // example: fdietz@jabber.org/Jabber-client
172
// -> remove "/Jabber-client"
173
String JavaDoc 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         /**
219          * @see org.jivesoftware.smack.PacketListener#processPacket(org.jivesoftware.smack.packet.Packet)
220          */

221         public void processPacket(Packet packet) {
222             Presence presence = (Presence) packet;
223
224             String JavaDoc 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             // example: fdietz@jabber.org/Jabber-client
234
// -> remove "/Jabber-client"
235
String JavaDoc normalizedFrom = from.replaceAll("\\/.*", "");
236
237             final IBuddyStatus status = BuddyList.getInstance().getBuddy(
238                     normalizedFrom);
239             // just ignore unknown people
240
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 JavaDoc updateAComponent = new Runnable JavaDoc() {
253
254                 public void run() {
255                     updateBuddyPresence(status);
256                 }
257             };
258
259             try {
260                 SwingUtilities.invokeAndWait(updateAComponent);
261             } catch (InterruptedException JavaDoc e) {
262                 // TODO Auto-generated catch block
263
e.printStackTrace();
264             } catch (InvocationTargetException JavaDoc e) {
265                 // TODO Auto-generated catch block
266
e.printStackTrace();
267             }
268
269         }
270     }
271
272     /**
273      * @see org.columba.chat.conn.api.IConnectionChangedListener#connectionChanged(org.columba.chat.conn.api.ConnectionChangedEvent)
274      */

275     public void connectionChanged(ConnectionChangedEvent object) {
276         //IAccount account = object.getAccount();
277
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