1
# -*- coding: utf-8 -*-
3
# This file is part of emesene.
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.
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.
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
22
import PreferenceWindow
24
class MainMenu(gtk.MenuBar):
25
'''this class represent the main menu in the main window'''
27
def __init__(self, controller, window_type, accelGroup):
29
gtk.MenuBar.__init__(self)
31
self.controller = controller
32
self.config = self.controller.config
33
self.theme = self.controller.theme
36
fileMenuItem = self.newImageMenuItem(_('_File'))
37
fileMenuItem.set_submenu(fileMenu)
39
# If we're in login window we don't need the View
41
if window_type == 'userlist':
43
viewMenuItem = self.newImageMenuItem(_('_View'))
44
viewMenuItem.set_submenu(viewMenu)
46
actionsMenu = gtk.Menu()
47
actionsMenuItem = self.newImageMenuItem(_('_Actions'))
48
actionsMenuItem.connect('activate', self.on_actions_activate)
49
actionsMenuItem.set_submenu(actionsMenu)
51
optionsMenu = gtk.Menu()
52
optionsMenuItem = self.newImageMenuItem(_('_Options'))
53
optionsMenuItem.set_submenu(optionsMenu)
56
helpMenuItem = self.newImageMenuItem(_('_Help'))
57
helpMenuItem.set_submenu(helpMenu)
59
# ---------------------- FILE MENU --------------------------------
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)
66
statusMenuItem.set_submenu(statusMenu)
67
fileMenu.add(statusMenuItem)
69
fileMenu.add(gtk.SeparatorMenuItem())
71
disconnect = self.newStockImageMenuItem(gtk.STOCK_DISCONNECT)
72
fileMenu.add(disconnect)
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)
80
# -------------------- VIEW MENU ----------------------------------
82
# Action Menu is useless in login window
83
if window_type == 'userlist':
84
self.orderByGroup = gtk.RadioMenuItem(None, \
86
self.orderByStatus = gtk.RadioMenuItem(self.orderByGroup, \
87
_('Order by _status'))
88
if not self.config.user['orderByStatus']:
89
self.orderByGroup.set_active(True)
91
self.orderByStatus.set_active(True)
93
viewMenu.add(self.orderByGroup)
94
viewMenu.add(self.orderByStatus)
96
viewMenu.add(gtk.SeparatorMenuItem())
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'])
108
viewMenu.add(self.showByNick)
109
viewMenu.add(self.showOffline)
110
viewMenu.add(self.showEmptyGroups)
111
viewMenu.add(self.showCountContact)
113
# ------------------- ACTIONS MENU --------------------------------
115
# Action Menu is useless in login window
116
if window_type == 'userlist':
118
addUserMenuItem = self.newImageMenuItem(_('_Add contact...'), \
120
actionsMenu.add(addUserMenuItem)
122
addGroupMenuItem = self.newImageMenuItem(_('Add _group...'),
124
actionsMenu.add(addGroupMenuItem)
126
actionsMenu.add(gtk.SeparatorMenuItem())
128
# Contacts action group: remove, block, unblock
129
contactsActionGroup = gtk.ActionGroup('contacts')
130
self.contactsActionGroup = contactsActionGroup
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)
145
self.blockAction = blockAction
146
self.unblockAction = unblockAction
147
self.delAliasAction = delAliasAction
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())
163
# ------------ move to submenu ----------
164
moveMenu = gtk.Menu()
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)
171
moveMenuItem.set_submenu(moveMenu)
172
moveMenuItem.show_all()
174
# ---------------------------------------
176
actionsMenu.add(gtk.SeparatorMenuItem())
178
# Groups action group: remove, rename
179
groupsActionGroup = gtk.ActionGroup('groups')
180
self.groupsActionGroup = groupsActionGroup
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)
187
groupsActionGroup.add_action(renameAction)
188
actionsMenu.add(renameAction.create_menu_item())
189
groupsActionGroup.add_action(deleteGAction)
190
actionsMenu.add(deleteGAction.create_menu_item())
192
# ------------------------ OPTIONS MENU ---------------------------
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)
202
optionsMenu.add(gtk.SeparatorMenuItem())
204
setAutoReplyMenuItem = self.newImageMenuItem(\
205
_('Edit a_utoreply...'), gtk.STOCK_EDIT)
207
self.activateAutoReply = self.newCheckMenuItem(\
208
_('Activate au_toreply'), self.config.user['autoReply'])
210
optionsMenu.add(self.activateAutoReply)
211
optionsMenu.add(setAutoReplyMenuItem)
213
optionsMenu.add(gtk.SeparatorMenuItem())
215
pluginMenuItem = self.newImageMenuItem(_('P_lugins'), \
216
gtk.STOCK_DISCONNECT)
217
optionsMenu.add(pluginMenuItem)
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)
225
accelGroup.connect_group(ord('P'), gtk.gdk.CONTROL_MASK, \
226
gtk.ACCEL_LOCKED, self.on_preferences_activate)
228
# ---------------------- HELP MENU --------------------------------
230
aboutMenuItem = self.newStockImageMenuItem(gtk.STOCK_ABOUT)
231
helpMenu.add(aboutMenuItem)
233
self.add(fileMenuItem)
235
# No Actions Menu in login window
236
if window_type == 'userlist':
237
self.add(viewMenuItem)
238
self.add(actionsMenuItem)
240
self.add(optionsMenuItem)
241
self.add(helpMenuItem)
243
# -------------------- CALLBACKS ----------------------------------
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)
281
preferencesMenuItem.connect('activate',
282
self.on_preferences_activate)
284
# ----------------- VARS ---------------------------
286
def newStockImageMenuItem (self, stock):
287
'''create a new image menu item from gtk's stock and retrun it'''
289
mi = gtk.ImageMenuItem(stock)
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'''
296
mi = gtk.ImageMenuItem(_(label))
299
mi.set_image(gtk.image_new_from_stock(stock,
303
image.set_from_pixbuf(img)
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!)'''
312
mi = gtk.CheckMenuItem(_(label))
313
mi.set_active(checked)
316
# -------------------------- CALLBACKS -------------------------------
318
def on_move_to_activate(self, menuItem, group):
319
self.controller.contact_manager.move_to_group(self.userName,
320
self.userGroup, group)
322
def on_rename_user_activate(self, *args):
323
self.controller.contact_manager.set_alias_dialog(self.userName)
325
def on_delete_alias_activate(self, *args):
326
self.controller.contact_manager.set_alias(self.userName, '')
328
def on_actions_activate(self, *args):
329
data = self.controller.getMenuData()
330
typeSelected = data[0]
332
self.contactsActionGroup.set_sensitive(typeSelected == 'user')
333
self.groupsActionGroup.set_sensitive(typeSelected == 'group')
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]
341
blocked = self.controller.getContactIsBlocked(data[1])
342
self.blockAction.set_sensitive(not blocked)
343
self.unblockAction.set_sensitive(blocked)
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]
350
def on_quit_activate(self, *args):
351
self.controller.quit(0)
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
360
def on_about_activate(self, *args):
362
f = file('COPYING', 'r')
366
def closeAbout(widget, response_id):
367
if response_id == gtk.RESPONSE_CANCEL:
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)
378
about.set_license('GNU General Public License')
380
about.set_license(f.read())
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)',
395
'Jan de Mooij (emesene)',
397
about.set_translator_credits(_('translator-credits'))
398
icon = self.controller.theme.getImage('login')
403
def on_logout_activate(self, *args):
404
self.controller.logout()
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
412
self.controller.refreshUserList(force=True)
414
def on_show_by_nick_activate(self, *args):
415
self.controller.config.user['showByNick'] = \
416
self.showByNick.get_active()
417
self.controller.refreshUserList()
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()
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()
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)
434
def on_add_user_activate(self, *args):
435
self.controller.addUserDialog()
437
def on_delete_user_activate(self, *args):
438
self.controller.contact_manager.remove(self.userName)
440
def on_block_user_activate(self, *args):
441
self.controller.contact_manager.block(self.userName)
443
def on_unblock_user_activate(self, *args):
444
self.controller.contact_manager.unblock(self.userName)
446
def on_add_group_activate(self, *args):
447
self.controller.group_manager.add_dialog()
449
def on_delete_group_activate(self, *args):
450
self.controller.group_manager.remove(self.groupName)
452
def on_rename_group_activate(self, *args):
453
self.controller.group_manager.rename_dialog(self.groupName)
455
def on_change_avatar_activate(self, *args):
456
self.controller.changeAvatarDialog()
458
def on_change_nick_activate(self, *args):
459
self.controller.contact_manager.set_nick_dialog()
461
def on_set_auto_reply_activate(self, *args):
462
self.controller.setAutoReplyDialog()
464
def on_auto_reply_activate(self, *args):
465
self.config.user['autoReply'] = self.activateAutoReply.get_active()
467
def on_plugin_activate(self, *args):
468
self.controller.pluginDialog()