Source code: edu/ou/kmi/buddyspace/gui/BSStatusesBar.java
1 package edu.ou.kmi.buddyspace.gui;
2
3 /*
4 * BSStatusesBar.java
5 *
6 * Project: BuddySpace
7 * (C) Copyright Knowledge Media Institute 2002
8 *
9 *
10 * Created on 3 December 2002, 15:19
11 */
12
13 import javax.swing.*;
14 import java.awt.event.*;
15 import java.util.*;
16 import java.awt.*;
17
18 /*
19 import org.jabber.jabberbeans.*;
20 import org.jabber.jabberbeans.Extension.*;
21 */
22
23 import org.jabber.jabberbeans.util.*;
24
25 import edu.ou.kmi.buddyspace.core.*;
26 //import edu.ou.kmi.buddyspace.utils.*;
27
28 /**
29 * Window displaying presence statuses of favourite JIDs.
30 * Uses <code>BSPresenceBean</code> to receive presence info.
31 *
32 * @author Jiri Komzak, Knowledge Media Institute, Open University, United Kingdom
33 */
34 public class BSStatusesBar //extends DockableWindow
35 implements ActionListener, MouseListener,
36 BSPresenceListener {
37
38 private BSMainFrame mainFrame;
39 private BSPresenceBean presenceBean = null;
40 private BSRosterBean rosterBean = null;
41 private Vector jids;
42 private Hashtable buttons;
43 //private JButton myButton;
44 private JButton dockButton;
45 private JButton addButton;
46 private JToolBar toolBar;
47 private JFrame frame;
48 private boolean docked;
49
50 private JPopupMenu buddyPopupMenu;
51 private BSJIDActionMenuItem deleteMenuItem;
52 private BSJIDActionMenuItem chatMenuItem;
53
54 /** Constructor */
55 BSStatusesBar(BSMainFrame parent, BSPresenceBean presenceBean,
56 BSRosterBean rosterBean, Vector jids, boolean docked) {
57
58 this.jids = jids;
59 if (jids == null) this.jids = new Vector();
60 this.docked = docked;
61 mainFrame = parent;
62
63 initComponents();
64
65 setPresenceBean(presenceBean);
66 setRosterBean(rosterBean);
67 updatePresences();
68 }
69
70 /** Inits components */
71 private void initComponents() {
72 frame = new JFrame("BuddyBar");
73 frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
74 frame.getContentPane().setLayout(new BorderLayout());
75 frame.setResizable(false);
76
77 toolBar = new JToolBar();
78 toolBar.setFloatable(false);
79
80 //frame.setIconImage(mainFrame.getCurrentPresenceImage());
81 frame.setIconImage(Toolkit.getDefaultToolkit().getImage(ClassLoader.getSystemResource(
82 mainFrame.isNewMessage()? "images/alert3_status_lights.gif" : "images/3_status_lights.gif")));
83 /*myButton = new JButton(new ImageIcon(mainFrame.getCurrentPresenceImage()));
84 myButton.setMargin(new Insets(1,1,1,1));
85 myButton.setToolTipText("My presence");
86 toolBar.add(myButton);*/
87
88 buttons = new Hashtable();
89
90 if (jids != null) {
91 Enumeration jidEnum = jids.elements();
92 while (jidEnum.hasMoreElements()) {
93 JID jid = (JID) jidEnum.nextElement();
94 String jidStr = BSPresenceBean.getJIDHashString(jid, true);
95 BSJIDActionButton button = new BSJIDActionButton(mainFrame.getPresenceIcon(false, null, null), jid);
96 button.addActionListener(this);
97 button.addMouseListener(this);
98 button.setToolTipText(jidStr);
99 button.setMargin(new Insets(1,1,1,1));
100 toolBar.add(button);
101 buttons.put(jidStr, button);
102 }
103 }
104
105 toolBar.addSeparator();
106
107 //ImageIcon icon = new ImageIcon(ClassLoader.getSystemResource("images/add_user.gif"));
108 ImageIcon icon = new ImageIcon(ClassLoader.getSystemResource("images/add_statuslight.gif"));
109 addButton = new JButton(icon);
110 addButton.setToolTipText("Add status light");
111 //addButton.setPreferredSize(new Dimension(14,14));
112 addButton.setMargin(new Insets(1,1,1,1));
113 addButton.addActionListener(this);
114 toolBar.add(addButton);
115
116 icon = new ImageIcon(ClassLoader.getSystemResource(!docked?
117 "images/dock.gif" : "images/float.gif"));
118 dockButton = new JButton(icon);
119 dockButton.setToolTipText(docked? "Float" : "Dock");
120 //dockButton.setPreferredSize(new Dimension(14,14));
121 dockButton.setMargin(new Insets(1,1,1,1));
122 dockButton.addActionListener(this);
123 toolBar.add(dockButton);
124
125 buddyPopupMenu = new JPopupMenu();
126 chatMenuItem = new BSJIDActionMenuItem("Open chat");
127 chatMenuItem.addActionListener(this);
128 deleteMenuItem = new BSJIDActionMenuItem("Delete");
129 deleteMenuItem.addActionListener(this);
130
131 setDocked(docked);
132 }
133
134 public void setDocked(boolean docked) {
135 frame.setVisible(!docked);
136 ImageIcon icon = new ImageIcon(ClassLoader.getSystemResource(!docked?
137 "images/dock.gif" : "images/float.gif"));
138 dockButton.setIcon(icon);
139 dockButton.setToolTipText(docked? "Float" : "Dock");
140
141 if (!docked) {
142 mainFrame.getContentPane().remove(toolBar);
143 frame.getContentPane().add(toolBar, BorderLayout.NORTH);
144 frame.toFront();
145 frame.pack();
146 frame.validate();
147 mainFrame.validate();
148 }
149 else {
150 frame.getContentPane().remove(toolBar);
151 mainFrame.getContentPane().add(toolBar, BorderLayout.SOUTH);
152 mainFrame.validate();
153 }
154 this.docked = docked;
155 }
156
157 public void setPresenceBean(BSPresenceBean presenceBean) {
158 if (this.presenceBean != null)
159 this.presenceBean.removePresenceListener(this);
160 this.presenceBean = presenceBean;
161 if (presenceBean != null)
162 presenceBean.addPresenceListener(this);
163
164 updatePresences();
165 }
166
167 public void setRosterBean(BSRosterBean rosterBean) {
168 this.rosterBean = rosterBean;
169
170 setToolTips();
171 }
172
173 public void setMyPresenceImage(Image img) {
174 //frame.setIconImage(img);
175 frame.setIconImage(Toolkit.getDefaultToolkit().getImage(ClassLoader.getSystemResource(
176 mainFrame.isNewMessage()? "images/alert3_status_lights.gif" : "images/3_status_lights.gif")));
177 //myButton.setIcon(new ImageIcon(img));
178 }
179
180 public void setToolTips() {
181 if (jids != null) {
182 Enumeration jidEnum = jids.elements();
183 while (jidEnum.hasMoreElements()) {
184 JID jid = (JID) jidEnum.nextElement();
185 String jidStr = BSPresenceBean.getJIDHashString(jid, true);
186 BSJIDActionButton button = (BSJIDActionButton) buttons.get(jidStr);
187 if (button == null) continue;
188 if (rosterBean == null)
189 button.setToolTipText(jidStr);
190 else {
191 String name = rosterBean.getFriendlyName(jid);
192 button.setToolTipText((name != null)? name : jidStr);
193 }
194 }
195 }
196 }
197
198 public void updatePresences() {
199 //frame.setIconImage(mainFrame.getCurrentPresenceImage());
200 frame.setIconImage(Toolkit.getDefaultToolkit().getImage(ClassLoader.getSystemResource(
201 mainFrame.isNewMessage()? "images/alert3_status_lights.gif" : "images/3_status_lights.gif")));
202 //myButton.setIcon(new ImageIcon(mainFrame.getCurrentPresenceImage()));
203
204 if (jids != null) {
205 Enumeration jidEnum = jids.elements();
206 while (jidEnum.hasMoreElements()) {
207 JID jid = (JID) jidEnum.nextElement();
208 String jidStr = BSPresenceBean.getJIDHashString(jid, true);
209 BSJIDActionButton button = (BSJIDActionButton) buttons.get(jidStr);
210 if (button == null) continue;
211 if (presenceBean == null)
212 button.setIcon(mainFrame.getPresenceIcon(false, null, null));
213 else {
214 BSPresenceInfo pi = presenceBean.getResourcePresence(jid);
215 if (pi == null) {
216 String showStr = BSMainFrame.SHOW_OFFLINE_STR;
217 button.setIcon(mainFrame.getPresenceIcon(false, showStr, null));
218 }
219 else {
220 String showStr = pi.getFriendlyShow();
221 String statusStr = pi.getStatus();
222 button.setIcon(mainFrame.getPresenceIcon(pi.isOnline(), showStr, statusStr));
223 }
224 }
225 }
226 }
227
228 if (!docked) {
229 frame.pack();
230 frame.invalidate();
231 }
232 }
233
234 /** Removes itself from listening */
235 public void cancelListening() {
236 if (presenceBean != null)
237 presenceBean.removePresenceListener(this);
238 }
239
240 /** Displays change of presence in chat window */
241 public void presenceChanged(BSPresenceInfo pi) {
242 updatePresences();
243 /*if (pi == null)
244 updatePresences();
245 else {
246 JID jid = pi.getJID();
247 if (jid == null)
248 updatePresences();
249 else {
250 String jidStr = BSPresenceBean.getJIDHashString(jid, true);
251 String jidStr2 = BSPresenceBean.getJIDHashString(jid, false);
252 BSJIDActionButton button = null;
253 //JLabel button = null;
254 if (buttons.keySet().contains(jidStr))
255 button = (BSJIDActionButton) buttons.get(jidStr);
256 else if (buttons.keySet().contains(jidStr2))
257 button = (BSJIDActionButton) buttons.get(jidStr2);
258
259 if (button != null) {
260 String show = pi.getFriendlyShow();
261 String status = pi.getStatus();
262 button.setIcon(mainFrame.getPresenceIcon(pi.isOnline(), show, status));
263 }
264 }
265 }*/
266 }
267
268 /** Called after disconnecting - no presence info is available */
269 public void presencesCleared() {
270 updatePresences();
271 }
272
273 /** Called when subscription request was approved */
274 public void subscriptionApproved(JID jid) {}
275
276 /** Called when subscription request was received */
277 public void subscriptionRequested(JID jid) { }
278
279 /** Handles actions from buttons */
280 public void actionPerformed(ActionEvent evt) {
281
282 if (evt.getSource() == dockButton)
283 setDocked(!docked);
284
285 else if (evt.getSource() == deleteMenuItem) {
286 JID jid = deleteMenuItem.getJID();
287 String jidStr = BSPresenceBean.getJIDHashString(jid, true);
288 jids.remove(jid);
289 BSJIDActionButton button = (BSJIDActionButton) buttons.get(jidStr);
290 if (button != null)
291 toolBar.remove(button);
292 buttons.remove(jidStr);
293 toolBar.invalidate();
294 toolBar.doLayout();
295 if (!docked) {
296 frame.pack();
297 frame.validate();
298 }
299 mainFrame.saveStatusesBarJIDs(jids.elements());
300 }
301
302 else if (evt.getSource() == addButton) {
303 BSChooseJIDDialog dlg = new BSChooseJIDDialog(mainFrame, "Add status light", rosterBean.entries());
304 dlg.show();
305 if (dlg.jid != null) {
306 String jidStr = BSPresenceBean.getJIDHashString(dlg.jid, true);
307 jids.add(dlg.jid);
308 BSJIDActionButton button = new BSJIDActionButton(mainFrame.getPresenceIcon(false, null, null), dlg.jid);
309 button.setMargin(new Insets(1,1,1,1));
310 button.addMouseListener(this);
311 button.addActionListener(this);
312 buttons.put(jidStr, button);
313 toolBar.add(button, toolBar.getComponentIndex(addButton)-1);
314 updatePresences();
315 setToolTips();
316 toolBar.invalidate();
317 toolBar.doLayout();
318 if (!docked) {
319 frame.pack();
320 frame.validate();
321 }
322 mainFrame.saveStatusesBarJIDs(jids.elements());
323 }
324 }
325
326 else if (evt.getSource() instanceof BSJIDActionButton) {
327 JID jid = ((BSJIDActionButton)evt.getSource()).getJID();
328 mainFrame.openChatWindow(jid, true, false);
329 }
330
331 else if (evt.getSource() == chatMenuItem) {
332 JID jid = chatMenuItem.getJID();
333 mainFrame.openChatWindow(jid, true, false);
334 }
335 }
336
337 public void mousePressed(MouseEvent e) {
338 maybeShowPopup(e);
339 }
340
341 public void mouseReleased(MouseEvent e) {
342 maybeShowPopup(e);
343 }
344
345 protected void maybeShowPopup(MouseEvent e) {
346 // if that was context popup event
347 if (e.isPopupTrigger()) {
348 //if (e.getClickCount() == 1 && SwingUtilities.isRightMouseButton(e)) {
349 // gets the selected node
350 if (e.getSource() instanceof BSJIDActionButton) {
351 BSJIDActionButton button = (BSJIDActionButton) e.getSource();
352 JID jid = button.getJID();
353
354 buddyPopupMenu.removeAll();
355
356 chatMenuItem.setJID(jid);
357 buddyPopupMenu.add(chatMenuItem);
358
359 deleteMenuItem.setJID(jid);
360 buddyPopupMenu.add(deleteMenuItem);
361
362 buddyPopupMenu.show(e.getComponent(), e.getX(), e.getY());
363 }
364 }
365 }
366
367 public void mouseClicked(java.awt.event.MouseEvent mouseEvent) { }
368 public void mouseEntered(java.awt.event.MouseEvent mouseEvent) { }
369 public void mouseExited(java.awt.event.MouseEvent mouseEvent) { }
370
371 }