~ubuntu-branches/ubuntu/hardy/emesene/hardy-proposed

« back to all changes in this revision

Viewing changes to MainMenu.py

  • Committer: Bazaar Package Importer
  • Author(s): Emilio Pozuelo Monfort
  • Date: 2008-02-06 21:57:05 UTC
  • Revision ID: james.westby@ubuntu.com-20080206215705-d1abf07rdwcaju3p
Tags: upstream-1.0~r1013
Import upstream version 1.0~r1013

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# -*- coding: utf-8 -*-
 
2
 
 
3
#   This file is part of emesene.
 
4
#
 
5
#    Emesene is free software; you can redistribute it and/or modify
 
6
#    it under the terms of the GNU General Public License as published by
 
7
#    the Free Software Foundation; either version 2 of the License, or
 
8
#    (at your option) any later version.
 
9
#
 
10
#    emesene is distributed in the hope that it will be useful,
 
11
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
 
12
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
13
#    GNU General Public License for more details.
 
14
#
 
15
#    You should have received a copy of the GNU General Public License
 
16
#    along with emesene; if not, write to the Free Software
 
17
#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
18
 
 
19
import gtk
 
20
 
 
21
import StatusMenu
 
22
import PreferenceWindow
 
23
 
 
24
class MainMenu(gtk.MenuBar):
 
25
    '''this class represent the main menu in the main window'''
 
26
 
 
27
    def __init__(self, controller, window_type, accelGroup):
 
28
        '''constructor'''
 
29
        gtk.MenuBar.__init__(self)
 
30
 
 
31
        self.controller = controller
 
32
        self.config = self.controller.config
 
33
        self.theme = self.controller.theme
 
34
 
 
35
        fileMenu = gtk.Menu()
 
36
        fileMenuItem = self.newImageMenuItem(_('_File'))
 
37
        fileMenuItem.set_submenu(fileMenu)
 
38
 
 
39
        # If we're in login window we don't need the View 
 
40
        # or the Actions Menu
 
41
        if window_type == 'userlist':
 
42
            viewMenu = gtk.Menu()
 
43
            viewMenuItem = self.newImageMenuItem(_('_View'))
 
44
            viewMenuItem.set_submenu(viewMenu)
 
45
            
 
46
            actionsMenu = gtk.Menu()
 
47
            actionsMenuItem = self.newImageMenuItem(_('_Actions'))
 
48
            actionsMenuItem.connect('activate', self.on_actions_activate)
 
49
            actionsMenuItem.set_submenu(actionsMenu)
 
50
 
 
51
        optionsMenu = gtk.Menu()
 
52
        optionsMenuItem = self.newImageMenuItem(_('_Options'))
 
53
        optionsMenuItem.set_submenu(optionsMenu)
 
54
 
 
55
        helpMenu = gtk.Menu()
 
56
        helpMenuItem = self.newImageMenuItem(_('_Help'))
 
57
        helpMenuItem.set_submenu(helpMenu)
 
58
 
 
59
        # ---------------------- FILE MENU --------------------------------
 
60
 
 
61
        # In login window only quit option is usefull
 
62
        if window_type == 'userlist':
 
63
            statusMenuItem = self.newImageMenuItem(_('_Status'))
 
64
            statusMenu = StatusMenu.StatusMenu(self.controller)
 
65
 
 
66
            statusMenuItem.set_submenu(statusMenu)
 
67
            fileMenu.add(statusMenuItem)
 
68
            
 
69
            fileMenu.add(gtk.SeparatorMenuItem())
 
70
            
 
71
            disconnect = self.newStockImageMenuItem(gtk.STOCK_DISCONNECT)
 
72
            fileMenu.add(disconnect)
 
73
 
 
74
        # Quit option is always visible
 
75
        quitMenuItem = self.newStockImageMenuItem(gtk.STOCK_QUIT)
 
76
        quitMenuItem.add_accelerator('activate', accelGroup, ord('Q'), \
 
77
                                 gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE)
 
78
        fileMenu.add(quitMenuItem)
 
79
        
 
80
        # -------------------- VIEW MENU ----------------------------------
 
81
        
 
82
        # Action Menu is useless in login window
 
83
        if window_type == 'userlist':
 
84
            self.orderByGroup = gtk.RadioMenuItem(None, \
 
85
                                                      _('Order by _group'))
 
86
            self.orderByStatus = gtk.RadioMenuItem(self.orderByGroup, \
 
87
                                                      _('Order by _status'))
 
88
            if not self.config.user['orderByStatus']:
 
89
                self.orderByGroup.set_active(True)
 
90
            else:
 
91
                self.orderByStatus.set_active(True)
 
92
                
 
93
            viewMenu.add(self.orderByGroup)
 
94
            viewMenu.add(self.orderByStatus)
 
95
            
 
96
            viewMenu.add(gtk.SeparatorMenuItem())
 
97
 
 
98
            self.showByNick = self.newCheckMenuItem(_('Show by _nick'), \
 
99
                    self.config.user['showByNick'])
 
100
            self.showOffline = self.newCheckMenuItem(_('Show _offline'), \
 
101
                    self.config.user['showOffline'])
 
102
            self.showEmptyGroups = self.newCheckMenuItem(
 
103
             _('Show _empty groups'), self.config.user['showEmptyGroups'])
 
104
            self.showCountContact = self.newCheckMenuItem(
 
105
                _('Show _contact count'), 
 
106
                self.config.user['showCountContact'])
 
107
 
 
108
            viewMenu.add(self.showByNick)
 
109
            viewMenu.add(self.showOffline)
 
110
            viewMenu.add(self.showEmptyGroups)
 
111
            viewMenu.add(self.showCountContact)
 
112
 
 
113
        # ------------------- ACTIONS MENU --------------------------------
 
114
 
 
115
        # Action Menu is useless in login window
 
116
        if window_type == 'userlist':
 
117
            # Add user, group
 
118
            addUserMenuItem = self.newImageMenuItem(_('_Add contact...'), \
 
119
                                                     gtk.STOCK_ADD)
 
120
            actionsMenu.add(addUserMenuItem)
 
121
 
 
122
            addGroupMenuItem = self.newImageMenuItem(_('Add _group...'),
 
123
                gtk.STOCK_ADD)
 
124
            actionsMenu.add(addGroupMenuItem)
 
125
            
 
126
            actionsMenu.add(gtk.SeparatorMenuItem())
 
127
            
 
128
            # Contacts action group: remove, block, unblock
 
129
            contactsActionGroup = gtk.ActionGroup('contacts')
 
130
            self.contactsActionGroup = contactsActionGroup
 
131
            
 
132
            setAliasAction = gtk.Action('setAlias', 
 
133
                _('_Set contact alias...'), None, gtk.STOCK_EDIT)
 
134
            delAliasAction = gtk.Action('delAlias', _('_Delete alias'), \
 
135
                                         None, gtk.STOCK_DELETE)
 
136
            blockAction = gtk.Action('block', _('_Block'), \
 
137
                                        None, gtk.STOCK_STOP)
 
138
            unblockAction = gtk.Action('unblock', _('_Unblock'), \
 
139
                                        None, gtk.STOCK_APPLY)
 
140
            moveAction = gtk.Action('move', _('M_ove to group'), \
 
141
                                     None, gtk.STOCK_REDO)
 
142
            deleteAction = gtk.Action('delete', _('_Remove contact'), \
 
143
                                        None, gtk.STOCK_DELETE)
 
144
            
 
145
            self.blockAction = blockAction
 
146
            self.unblockAction = unblockAction
 
147
            self.delAliasAction = delAliasAction
 
148
            
 
149
            contactsActionGroup.add_action(setAliasAction)
 
150
            actionsMenu.add(setAliasAction.create_menu_item())
 
151
            contactsActionGroup.add_action(delAliasAction)
 
152
            actionsMenu.add(delAliasAction.create_menu_item())
 
153
            contactsActionGroup.add_action(blockAction)
 
154
            actionsMenu.add(blockAction.create_menu_item())
 
155
            contactsActionGroup.add_action(unblockAction)
 
156
            actionsMenu.add(unblockAction.create_menu_item())
 
157
            contactsActionGroup.add_action(moveAction)
 
158
            moveMenuItem = moveAction.create_menu_item()
 
159
            actionsMenu.add(moveMenuItem)
 
160
            contactsActionGroup.add_action(deleteAction)
 
161
            actionsMenu.add(deleteAction.create_menu_item())
 
162
            
 
163
            # ------------ move to submenu ----------
 
164
            moveMenu = gtk.Menu()
 
165
 
 
166
            for i in self.controller.msn.getGroupNames():
 
167
                menuItem = gtk.MenuItem (i)
 
168
                moveMenu.add(menuItem)
 
169
                menuItem.connect('activate', self.on_move_to_activate, i)
 
170
    
 
171
            moveMenuItem.set_submenu(moveMenu)
 
172
            moveMenuItem.show_all()
 
173
            moveMenu.show_all()
 
174
            # ---------------------------------------
 
175
 
 
176
            actionsMenu.add(gtk.SeparatorMenuItem())
 
177
            
 
178
            # Groups action group: remove, rename
 
179
            groupsActionGroup = gtk.ActionGroup('groups')
 
180
            self.groupsActionGroup = groupsActionGroup
 
181
            
 
182
            deleteGAction = gtk.Action('remove', _('Re_move group'), \
 
183
                                        None, gtk.STOCK_DELETE)
 
184
            renameAction = gtk.Action('rename', _('Re_name group...'), \
 
185
                                        None, gtk.STOCK_EDIT)
 
186
            
 
187
            groupsActionGroup.add_action(renameAction)
 
188
            actionsMenu.add(renameAction.create_menu_item())
 
189
            groupsActionGroup.add_action(deleteGAction)
 
190
            actionsMenu.add(deleteGAction.create_menu_item())
 
191
 
 
192
        # ------------------------ OPTIONS MENU ---------------------------
 
193
 
 
194
        if window_type == 'userlist':            
 
195
            changeNickMenuItem = self.newImageMenuItem(\
 
196
                _('_Change nick...'), gtk.STOCK_EDIT)
 
197
            changeAvatarMenuItem = self.newImageMenuItem(\
 
198
                _('Change _display picture...'), gtk.STOCK_EDIT)
 
199
            optionsMenu.add(changeNickMenuItem)
 
200
            optionsMenu.add(changeAvatarMenuItem)
 
201
            
 
202
            optionsMenu.add(gtk.SeparatorMenuItem())
 
203
            
 
204
            setAutoReplyMenuItem = self.newImageMenuItem(\
 
205
                _('Edit a_utoreply...'), gtk.STOCK_EDIT)
 
206
 
 
207
            self.activateAutoReply = self.newCheckMenuItem(\
 
208
                _('Activate au_toreply'), self.config.user['autoReply'])
 
209
 
 
210
            optionsMenu.add(self.activateAutoReply)
 
211
            optionsMenu.add(setAutoReplyMenuItem)
 
212
            
 
213
            optionsMenu.add(gtk.SeparatorMenuItem())
 
214
            
 
215
            pluginMenuItem = self.newImageMenuItem(_('P_lugins'), \
 
216
                gtk.STOCK_DISCONNECT)
 
217
            optionsMenu.add(pluginMenuItem)
 
218
        
 
219
        preferencesMenuItem = self.newStockImageMenuItem(
 
220
            gtk.STOCK_PREFERENCES)
 
221
        preferencesMenuItem.add_accelerator('activate', accelGroup, \
 
222
            ord('P'), gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE)
 
223
        optionsMenu.add(preferencesMenuItem)
 
224
 
 
225
        accelGroup.connect_group(ord('P'), gtk.gdk.CONTROL_MASK, \
 
226
            gtk.ACCEL_LOCKED, self.on_preferences_activate)
 
227
 
 
228
        # ---------------------- HELP MENU --------------------------------
 
229
 
 
230
        aboutMenuItem = self.newStockImageMenuItem(gtk.STOCK_ABOUT)
 
231
        helpMenu.add(aboutMenuItem)
 
232
 
 
233
        self.add(fileMenuItem)
 
234
 
 
235
        # No Actions Menu in login window
 
236
        if window_type == 'userlist':
 
237
            self.add(viewMenuItem)
 
238
            self.add(actionsMenuItem)
 
239
 
 
240
        self.add(optionsMenuItem)
 
241
        self.add(helpMenuItem)
 
242
 
 
243
        # -------------------- CALLBACKS ----------------------------------
 
244
 
 
245
        quitMenuItem.connect('activate', self.on_quit_activate)
 
246
        aboutMenuItem.connect('activate', self.on_about_activate)
 
247
        # We don't need this callbacks in login window, 
 
248
        # because we didn't create this menu items
 
249
        if window_type == 'userlist':
 
250
            disconnect.connect('activate', self.on_logout_activate)
 
251
            self.orderByGroup.connect('activate', self.on_order_changed)
 
252
            self.orderByStatus.connect('activate', self.on_order_changed)
 
253
            self.showByNick.connect('activate', 
 
254
                self.on_show_by_nick_activate)
 
255
            self.showOffline.connect('activate', 
 
256
                self.on_show_offline_activate)
 
257
            self.showEmptyGroups.connect('activate', 
 
258
                self.on_show_empty_groups_activate)
 
259
            self.showCountContact.connect('activate', 
 
260
                self.on_show_count_contact_activate)
 
261
            addUserMenuItem.connect('activate', self.on_add_user_activate)
 
262
            setAliasAction.connect('activate', self.on_rename_user_activate)
 
263
            delAliasAction.connect('activate', 
 
264
                self.on_delete_alias_activate)
 
265
            deleteAction.connect('activate', self.on_delete_user_activate)
 
266
            blockAction.connect('activate', self.on_block_user_activate)
 
267
            unblockAction.connect('activate', self.on_unblock_user_activate)
 
268
            addGroupMenuItem.connect('activate', self.on_add_group_activate)
 
269
            deleteGAction.connect('activate', self.on_delete_group_activate)
 
270
            renameAction.connect('activate', self.on_rename_group_activate)
 
271
            setAutoReplyMenuItem.connect('activate', 
 
272
                self.on_set_auto_reply_activate)
 
273
            self.activateAutoReply.connect('activate', 
 
274
                self.on_auto_reply_activate)
 
275
            changeNickMenuItem.connect('activate', 
 
276
                self.on_change_nick_activate)
 
277
            changeAvatarMenuItem.connect('activate', 
 
278
                self.on_change_avatar_activate)
 
279
            pluginMenuItem.connect('activate', self.on_plugin_activate)
 
280
            
 
281
        preferencesMenuItem.connect('activate', 
 
282
            self.on_preferences_activate)
 
283
 
 
284
        # ----------------- VARS ---------------------------
 
285
 
 
286
    def newStockImageMenuItem (self, stock):
 
287
        '''create a new image menu item from gtk's stock and retrun it'''
 
288
 
 
289
        mi = gtk.ImageMenuItem(stock)
 
290
        return mi
 
291
 
 
292
    def newImageMenuItem(self, label, stock = None, img = None):
 
293
        '''create a new Imege menu item and return it, it could have a 
 
294
            stock image or a custom image'''
 
295
 
 
296
        mi = gtk.ImageMenuItem(_(label))
 
297
 
 
298
        if stock != None:
 
299
            mi.set_image(gtk.image_new_from_stock(stock, 
 
300
                gtk.ICON_SIZE_MENU))
 
301
        elif img != None:
 
302
            image = gtk.Image()
 
303
            image.set_from_pixbuf(img)
 
304
            mi.set_image(image)
 
305
 
 
306
        return mi
 
307
 
 
308
    def newCheckMenuItem(self, label, checked):
 
309
        '''create a new checkbox and return it, if checked is true, 
 
310
            the check box will be checked (d'uh!)'''
 
311
 
 
312
        mi = gtk.CheckMenuItem(_(label))
 
313
        mi.set_active(checked)
 
314
        return mi
 
315
 
 
316
    # -------------------------- CALLBACKS -------------------------------
 
317
 
 
318
    def on_move_to_activate(self, menuItem, group):
 
319
        self.controller.contact_manager.move_to_group(self.userName, 
 
320
            self.userGroup, group)
 
321
        
 
322
    def on_rename_user_activate(self, *args):
 
323
        self.controller.contact_manager.set_alias_dialog(self.userName)
 
324
    
 
325
    def on_delete_alias_activate(self, *args):
 
326
        self.controller.contact_manager.set_alias(self.userName, '')
 
327
 
 
328
    def on_actions_activate(self, *args):
 
329
        data = self.controller.getMenuData()
 
330
        typeSelected = data[0]
 
331
        
 
332
        self.contactsActionGroup.set_sensitive(typeSelected == 'user')
 
333
        self.groupsActionGroup.set_sensitive(typeSelected == 'group')
 
334
        
 
335
        # set selected data class-available
 
336
        # set some action's senstibility
 
337
        if typeSelected == 'user':
 
338
            self.userName = data[1]
 
339
            self.userGroup = data[2]
 
340
            # block/unblock
 
341
            blocked = self.controller.getContactIsBlocked(data[1])
 
342
            self.blockAction.set_sensitive(not blocked)
 
343
            self.unblockAction.set_sensitive(blocked)
 
344
            # delete alias
 
345
            alias = self.controller.contact_manager.get_alias(self.userName)
 
346
            self.delAliasAction.set_sensitive(not alias == '')
 
347
        if typeSelected == 'group':
 
348
            self.groupName = data[1]
 
349
 
 
350
    def on_quit_activate(self, *args):
 
351
        self.controller.quit(0)
 
352
 
 
353
    def on_preferences_activate(self, *args):
 
354
        if not self.controller.preference_open:
 
355
            PreferenceWindow.PreferenceWindow(self.controller, 
 
356
                self.config, self.controller.mainWindow).show()
 
357
            self.controller.preference_open = True
 
358
 
 
359
 
 
360
    def on_about_activate(self, *args):
 
361
        try:
 
362
            f = file('COPYING', 'r')
 
363
        except:
 
364
            f = None
 
365
 
 
366
        def closeAbout(widget, response_id):
 
367
            if response_id == gtk.RESPONSE_CANCEL:
 
368
                widget.destroy()
 
369
 
 
370
        about = gtk.AboutDialog()
 
371
        about.set_name('emesene')
 
372
        about.set_version('1.0')
 
373
        about.set_copyright('Luis Mariano Guerra')
 
374
        about.set_comments(_('a MSN Messenger clone.'))
 
375
        about.connect('response', closeAbout)
 
376
 
 
377
        if f == None:
 
378
            about.set_license('GNU General Public License')
 
379
        else:
 
380
            about.set_license(f.read())
 
381
 
 
382
        about.set_website('marianoguerra.com.ar\nemesene.org')
 
383
        about.set_authors(['Luis Mariano Guerra (emesene and emesenelib)', \
 
384
            'Horacio Duran (emesene and emesenelib)', \
 
385
            'Alberto Talavera (emesene)', \
 
386
            'Linan Wang (MsnOIM)', \
 
387
            'Roberto Salas & Jakub Steiner (tango theme)', \
 
388
            'Vinicius Depizzol (default theme)', \
 
389
            'Yguaratã C. Cavalcanti (emesene)', \
 
390
            'Roger Duran (emesene)', \
 
391
            'dx (emesene & emesenelib)',
 
392
            'alencool (emesene & cairo wizzard :P)',
 
393
            'Mattia \'MaTz\' Pini (emesene)',
 
394
            'mg (emesene)',
 
395
            'Jan de Mooij (emesene)',
 
396
            'j0hn (emesene)'])
 
397
        about.set_translator_credits(_('translator-credits'))
 
398
        icon = self.controller.theme.getImage('login')
 
399
        about.set_icon(icon)
 
400
        about.set_logo(icon)
 
401
        about.run()
 
402
 
 
403
    def on_logout_activate(self, *args):
 
404
        self.controller.logout()
 
405
            
 
406
    def on_order_changed(self, menuitem):
 
407
        if menuitem == self.orderByGroup:
 
408
            self.controller.config.user['orderByStatus'] = False
 
409
        elif menuitem == self.orderByStatus:
 
410
            self.controller.config.user['orderByStatus'] = True
 
411
    
 
412
        self.controller.refreshUserList(force=True)
 
413
 
 
414
    def on_show_by_nick_activate(self, *args):
 
415
        self.controller.config.user['showByNick'] = \
 
416
            self.showByNick.get_active()
 
417
        self.controller.refreshUserList()
 
418
 
 
419
    def on_show_offline_activate(self, *args):
 
420
        self.controller.config.user['showOffline'] = \
 
421
            self.showOffline.get_active()
 
422
        self.controller.mainWindow.userList.refilter()
 
423
 
 
424
    def on_show_empty_groups_activate(self, *args):
 
425
        self.controller.config.user['showEmptyGroups'] = \
 
426
            self.showEmptyGroups.get_active()
 
427
        self.controller.mainWindow.userList.refilter()
 
428
    
 
429
    def on_show_count_contact_activate(self, *args):
 
430
        self.controller.config.user['showCountContact'] = \
 
431
            self.showCountContact.get_active()
 
432
        self.controller.refreshUserList(force=True)
 
433
 
 
434
    def on_add_user_activate(self, *args):
 
435
        self.controller.addUserDialog()
 
436
 
 
437
    def on_delete_user_activate(self, *args):
 
438
        self.controller.contact_manager.remove(self.userName)
 
439
 
 
440
    def on_block_user_activate(self, *args):
 
441
        self.controller.contact_manager.block(self.userName)
 
442
 
 
443
    def on_unblock_user_activate(self, *args):
 
444
        self.controller.contact_manager.unblock(self.userName)
 
445
 
 
446
    def on_add_group_activate(self, *args):
 
447
        self.controller.group_manager.add_dialog()
 
448
 
 
449
    def on_delete_group_activate(self, *args):
 
450
        self.controller.group_manager.remove(self.groupName)
 
451
 
 
452
    def on_rename_group_activate(self, *args):
 
453
        self.controller.group_manager.rename_dialog(self.groupName)
 
454
 
 
455
    def on_change_avatar_activate(self, *args):
 
456
        self.controller.changeAvatarDialog()
 
457
 
 
458
    def on_change_nick_activate(self, *args):
 
459
        self.controller.contact_manager.set_nick_dialog()
 
460
 
 
461
    def on_set_auto_reply_activate(self, *args):
 
462
        self.controller.setAutoReplyDialog()
 
463
 
 
464
    def on_auto_reply_activate(self, *args):
 
465
        self.config.user['autoReply'] = self.activateAutoReply.get_active()
 
466
 
 
467
    def on_plugin_activate(self, *args):
 
468
        self.controller.pluginDialog()
 
469