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    }