001 /* 002 Copyright (C) 2003 Adam Olsen 003 004 This program is free software; you can redistribute it and/or modify 005 it under the terms of the GNU General Public License as published by 006 the Free Software Foundation; either version 1, or (at your option) 007 any later version. 008 009 This program is distributed in the hope that it will be useful, 010 but WITHOUT ANY WARRANTY; without even the implied warranty of 011 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 012 GNU General Public License for more details. 013 014 You should have received a copy of the GNU General Public License 015 along with this program; if not, write to the Free Software 016 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 017 */ 018 019 package com.valhalla.jbother.menus; 020 021 import java.awt.*; 022 import java.awt.event.*; 023 import java.net.URL; 024 import java.util.*; 025 026 import javax.swing.*; 027 028 import org.jivesoftware.smack.*; 029 import org.jivesoftware.smack.packet.*; 030 import com.valhalla.gui.*; 031 import com.valhalla.jbother.*; 032 import com.valhalla.jbother.jabber.BuddyStatus; 033 import com.valhalla.settings.Settings; 034 035 /** 036 * The menu that pops up when you right click on a user in your roster 037 * 038 * @author Adam Olsen 039 * @version 1.0 040 */ 041 public class BuddyListPopupMenu extends JPopupMenu 042 { 043 private ResourceBundle resources = ResourceBundle.getBundle( "JBotherBundle", Locale.getDefault() ); 044 private JMenuItem removeBuddyItem = new JMenuItem( resources.getString( "removeFromRoster" ) ); 045 private JMenuItem modifyBuddyItem = new JMenuItem( resources.getString( "modify" ) ); 046 private JMenu resourceMenu = new JMenu( resources.getString( "resources" ) ); 047 private JMenu authMenu = new JMenu( resources.getString( "authorization" ) ); 048 private JMenuItem requestSubscription = new JMenuItem( resources.getString( "requestNotification" ) ); 049 private JMenuItem resendSubscription = new JMenuItem( resources.getString( "resendNotification" ) ); 050 private JMenuItem removeSubscription = new JMenuItem( resources.getString( "removeNotification" ) ); 051 052 private JMenuItem messageItem = new JMenuItem( resources.getString( "openChatDialog" ) ); 053 private JMenuItem logItem = new JMenuItem( resources.getString( "viewLog" ) ); 054 private JMenuItem infoItem = new JMenuItem( resources.getString( "getInfo" ) ); 055 private BuddyStatus buddy; 056 private JTree tree; 057 058 /** 059 * Creates the menu 060 */ 061 public BuddyListPopupMenu() 062 { 063 MenuActionListener listener = new MenuActionListener(); 064 065 infoItem.addActionListener( listener ); 066 removeBuddyItem.addActionListener( listener ); 067 messageItem.addActionListener( listener ); 068 modifyBuddyItem.addActionListener( listener ); 069 requestSubscription.addActionListener( listener ); 070 logItem.addActionListener( listener ); 071 resendSubscription.addActionListener( listener ); 072 removeSubscription.addActionListener( listener ); 073 074 authMenu.add( requestSubscription ); 075 authMenu.add( resendSubscription ); 076 authMenu.add( removeSubscription ); 077 078 add( messageItem ); 079 add( infoItem ); 080 add( logItem ); 081 add( removeBuddyItem ); 082 add( modifyBuddyItem ); 083 addSeparator(); 084 add( resourceMenu ); 085 add( authMenu ); 086 } 087 088 /** 089 * Requests subscription to a user 090 * @param type the type of subscription to send 091 */ 092 private void subscriptionHandler( Presence.Type type ) 093 { 094 Presence presence = new Presence( type ); 095 096 presence.setTo( buddy.getUser() ); 097 if( BuddyList.getInstance().checkConnection() ) 098 BuddyList.getInstance().getConnection().sendPacket( presence ); 099 else 100 BuddyList.getInstance().connectionError(); 101 } 102 103 /** 104 * Listens for different items to get clicked on in the popup menu 105 * @author Adam Olsen 106 * @version 1.0 107 */ 108 class MenuActionListener implements ActionListener 109 { 110 public void actionPerformed( ActionEvent e ) 111 { 112 if( e.getSource() == removeBuddyItem ) removeBuddyHandler(); 113 else if( e.getSource() == messageItem ) BuddyList.getInstance().getBuddyListTree().initiateConversation(); 114 else if( e.getSource() == modifyBuddyItem ) modifyBuddyHandler(); 115 else if( e.getSource() == requestSubscription ) subscriptionHandler( Presence.Type.SUBSCRIBE ); 116 else if( e.getSource() == removeSubscription ) subscriptionHandler( Presence.Type.UNSUBSCRIBED ); 117 else if( e.getSource() == resendSubscription ) subscriptionHandler( Presence.Type.SUBSCRIBED ); 118 else if( e.getSource() == infoItem ) 119 { 120 new InformationViewerDialog( buddy.getUser() + "/" + buddy.getHighestResource() ).show(); 121 } 122 else if( e.getSource() == logItem ) 123 { 124 new LogViewerDialog( null, buddy.getUser() ); 125 } 126 } 127 } 128 129 /** 130 * Opens the AddBuddyDialog to modify a buddy 131 */ 132 public void modifyBuddyHandler() 133 { 134 AddBuddyDialog buddyDialog = new AddBuddyDialog(); 135 buddyDialog.setBuddy( buddy.getRosterEntry() ); 136 buddyDialog.show(); 137 } 138 139 /** 140 * Confirms buddy removal, and then removes the buddy 141 */ 142 protected void removeBuddyHandler() 143 { 144 if( !BuddyList.getInstance().checkConnection() ) 145 { 146 BuddyList.getInstance().connectionError(); 147 return; 148 } 149 150 int result = 1; 151 152 result = JOptionPane.showConfirmDialog( null, resources.getString( "sureRemoveContact" ), resources.getString( "removeFromRoster" ), 153 JOptionPane.YES_NO_OPTION ); 154 155 if( result != 0 ) return; 156 157 RosterEntry entry = buddy.getRosterEntry(); 158 buddy.setRemoved( true ); 159 String gp = buddy.getGroup(); 160 161 if( entry != null ) 162 { 163 com.valhalla.Logger.debug( "Remove entry user: " + entry.getUser() ); 164 BuddyList.getInstance().getBuddyListTree().removeBuddy( buddy, gp ); 165 166 Iterator iterator = entry.getGroups(); 167 while( iterator.hasNext() ) 168 { 169 RosterGroup group = (RosterGroup)iterator.next(); 170 group.removeEntry( entry ); 171 } 172 173 RosterPacket packet = new RosterPacket(); 174 packet.setType( IQ.Type.SET ); 175 RosterPacket.Item item = new RosterPacket.Item( entry.getUser(), entry.getName() ); 176 item.setItemType( RosterPacket.ItemType.REMOVE ); 177 packet.addRosterItem( item ); 178 179 BuddyList.getInstance().getConnection().sendPacket( packet ); 180 } 181 else BuddyList.getInstance().getBuddyListTree().removeBuddy( buddy, gp ); 182 } 183 184 /** 185 * Updates the resources menu 186 */ 187 public void updateResourceMenu() 188 { 189 ResourceActionListener listener = new ResourceActionListener( buddy ); 190 resourceMenu.removeAll(); 191 Set keys = buddy.keySet(); 192 193 Iterator i = keys.iterator(); 194 while( i.hasNext() ) 195 { 196 boolean na = false; 197 String key = (String)i.next(); 198 199 if( key.equals( "N/A" ) ) 200 { 201 na = true; 202 key = "None"; 203 } 204 205 JMenuItem item = new JMenuItem( key ); 206 207 if( !na ) 208 { 209 Presence.Mode mode; 210 if( buddy.size() == 0 ) { 211 mode = null; 212 item.setForeground( Color.GRAY ); 213 } else { 214 mode = buddy.getPresence( key ); 215 } 216 217 ImageIcon icon = StatusIconCache.getStatusIcon(mode); 218 if (icon != null) item.setIcon(icon); 219 item.addActionListener( listener ); 220 } 221 else item.setEnabled( false ); 222 223 resourceMenu.add( item ); 224 } 225 } 226 227 /** 228 * Shows the popup menu 229 * @param tree the tree to show the menu on 230 * @param x the x coordinate 231 * @param y the y coordinate 232 * @param buddy the buddy that this menu should show up on 233 */ 234 public void showMenu( Component tree, int x, int y, BuddyStatus buddy ) 235 { 236 this.buddy = buddy; 237 this.tree = (JTree)tree; 238 239 updateResourceMenu(); 240 241 validate(); 242 243 show( tree, x, y ); 244 } 245 246 /** 247 * Listens for a resource to get clicked in the ResourceMenu 248 */ 249 class ResourceActionListener implements ActionListener 250 { 251 private BuddyStatus buddy; 252 253 public ResourceActionListener( BuddyStatus buddy ) 254 { 255 this.buddy = buddy; 256 } 257 258 public void actionPerformed( ActionEvent e ) 259 { 260 JMenuItem item = (JMenuItem)e.getSource(); 261 BuddyList.getInstance().getBuddyListTree().initiateConversation(); 262 ChatPanel window = (ChatPanel)buddy.getConversation(); 263 window.getResourceBox().setSelectedItem( item.getText() ); 264 window.getResourceBox().validate(); 265 } 266 } 267 }