Welcome to mirror list, hosted at ThFree Co, Russian Federation.

dev.gajim.org/gajim/gajim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui_menu_builder.py')
-rw-r--r--src/gui_menu_builder.py880
1 files changed, 439 insertions, 441 deletions
diff --git a/src/gui_menu_builder.py b/src/gui_menu_builder.py
index 3e9bbb181..6652badef 100644
--- a/src/gui_menu_builder.py
+++ b/src/gui_menu_builder.py
@@ -28,448 +28,446 @@ from common import helpers
from common.xmpp.protocol import NS_COMMANDS, NS_FILE, NS_MUC, NS_ESESSION
def build_resources_submenu(contacts, account, action, room_jid=None,
- room_account=None, cap=None):
- """
- Build a submenu with contact's resources. room_jid and room_account are for
- action self.on_invite_to_room
- """
- roster = gajim.interface.roster
- sub_menu = gtk.Menu()
-
- iconset = gajim.config.get('iconset')
- if not iconset:
- iconset = gajim.config.DEFAULT_ICONSET
- path = os.path.join(helpers.get_iconset_path(iconset), '16x16')
- for c in contacts:
- # icon MUST be different instance for every item
- state_images = gtkgui_helpers.load_iconset(path)
- item = gtk.ImageMenuItem('%s (%s)' % (c.resource, str(c.priority)))
- icon_name = helpers.get_icon_name_to_show(c, account)
- icon = state_images[icon_name]
- item.set_image(icon)
- sub_menu.append(item)
-
- if action == roster.on_invite_to_room:
- item.connect('activate', action, [(c, account)], room_jid,
- room_account, c.resource)
- elif action == roster.on_invite_to_new_room:
- item.connect('activate', action, [(c, account)], c.resource)
- else: # start_chat, execute_command, send_file
- item.connect('activate', action, c, account, c.resource)
-
- if cap and not c.supports(cap):
- item.set_sensitive(False)
-
- return sub_menu
+ room_account=None, cap=None):
+ """
+ Build a submenu with contact's resources. room_jid and room_account are for
+ action self.on_invite_to_room
+ """
+ roster = gajim.interface.roster
+ sub_menu = gtk.Menu()
+
+ iconset = gajim.config.get('iconset')
+ if not iconset:
+ iconset = gajim.config.DEFAULT_ICONSET
+ path = os.path.join(helpers.get_iconset_path(iconset), '16x16')
+ for c in contacts:
+ # icon MUST be different instance for every item
+ state_images = gtkgui_helpers.load_iconset(path)
+ item = gtk.ImageMenuItem('%s (%s)' % (c.resource, str(c.priority)))
+ icon_name = helpers.get_icon_name_to_show(c, account)
+ icon = state_images[icon_name]
+ item.set_image(icon)
+ sub_menu.append(item)
+
+ if action == roster.on_invite_to_room:
+ item.connect('activate', action, [(c, account)], room_jid,
+ room_account, c.resource)
+ elif action == roster.on_invite_to_new_room:
+ item.connect('activate', action, [(c, account)], c.resource)
+ else: # start_chat, execute_command, send_file
+ item.connect('activate', action, c, account, c.resource)
+
+ if cap and not c.supports(cap):
+ item.set_sensitive(False)
+
+ return sub_menu
def build_invite_submenu(invite_menuitem, list_):
- """
- list_ in a list of (contact, account)
- """
- roster = gajim.interface.roster
- # used if we invite only one contact with several resources
- contact_list = []
- if len(list_) == 1:
- contact, account = list_[0]
- contact_list = gajim.contacts.get_contacts(account, contact.jid)
- contacts_transport = -1
- connected_accounts = []
- # -1 is at start, False when not from the same, None when jabber
- for (contact, account) in list_:
- if not account in connected_accounts:
- connected_accounts.append(account)
- transport = gajim.get_transport_name_from_jid(contact.jid)
- if contacts_transport == -1:
- contacts_transport = transport
- elif contacts_transport != transport:
- contacts_transport = False
-
- if contacts_transport == False:
- # they are not all from the same transport
- invite_menuitem.set_sensitive(False)
- return
- invite_to_submenu = gtk.Menu()
- invite_menuitem.set_submenu(invite_to_submenu)
- invite_to_new_room_menuitem = gtk.ImageMenuItem(_('_New Group Chat'))
- icon = gtk.image_new_from_stock(gtk.STOCK_NEW, gtk.ICON_SIZE_MENU)
- invite_to_new_room_menuitem.set_image(icon)
- if len(contact_list) > 1: # several resources
- invite_to_new_room_menuitem.set_submenu(build_resources_submenu(
- contact_list, account, roster.on_invite_to_new_room, cap=NS_MUC))
- elif len(list_) == 1 and contact.supports(NS_MUC):
- invite_menuitem.set_sensitive(True)
- # use resource if it's self contact
- if contact.jid == gajim.get_jid_from_account(account):
- resource = contact.resource
- else:
- resource = None
- invite_to_new_room_menuitem.connect('activate',
- roster.on_invite_to_new_room, list_, resource)
- else:
- invite_menuitem.set_sensitive(False)
- # transform None in 'jabber'
- c_t = contacts_transport or 'jabber'
- muc_jid = {}
- for account in connected_accounts:
- for t in gajim.connections[account].muc_jid:
- muc_jid[t] = gajim.connections[account].muc_jid[t]
- if c_t not in muc_jid:
- invite_to_new_room_menuitem.set_sensitive(False)
- rooms = [] # a list of (room_jid, account) tuple
- invite_to_submenu.append(invite_to_new_room_menuitem)
- rooms = [] # a list of (room_jid, account) tuple
- minimized_controls = []
- for account in connected_accounts:
- minimized_controls += gajim.interface.minimized_controls[account].values()
- for gc_control in gajim.interface.msg_win_mgr.get_controls(
- message_control.TYPE_GC) + minimized_controls:
- acct = gc_control.account
- room_jid = gc_control.room_jid
- if room_jid in gajim.gc_connected[acct] and \
- gajim.gc_connected[acct][room_jid] and \
- contacts_transport == gajim.get_transport_name_from_jid(room_jid):
- rooms.append((room_jid, acct))
- if len(rooms):
- item = gtk.SeparatorMenuItem() # separator
- invite_to_submenu.append(item)
- for (room_jid, account) in rooms:
- menuitem = gtk.MenuItem(room_jid.split('@')[0])
- if len(contact_list) > 1: # several resources
- menuitem.set_submenu(build_resources_submenu(
- contact_list, account, roster.on_invite_to_room, room_jid,
- account))
- else:
- # use resource if it's self contact
- if contact.jid == gajim.get_jid_from_account(account):
- resource = contact.resource
- else:
- resource = None
- menuitem.connect('activate', roster.on_invite_to_room, list_,
- room_jid, account, resource)
- invite_to_submenu.append(menuitem)
+ """
+ list_ in a list of (contact, account)
+ """
+ roster = gajim.interface.roster
+ # used if we invite only one contact with several resources
+ contact_list = []
+ if len(list_) == 1:
+ contact, account = list_[0]
+ contact_list = gajim.contacts.get_contacts(account, contact.jid)
+ contacts_transport = -1
+ connected_accounts = []
+ # -1 is at start, False when not from the same, None when jabber
+ for (contact, account) in list_:
+ if not account in connected_accounts:
+ connected_accounts.append(account)
+ transport = gajim.get_transport_name_from_jid(contact.jid)
+ if contacts_transport == -1:
+ contacts_transport = transport
+ elif contacts_transport != transport:
+ contacts_transport = False
+
+ if contacts_transport == False:
+ # they are not all from the same transport
+ invite_menuitem.set_sensitive(False)
+ return
+ invite_to_submenu = gtk.Menu()
+ invite_menuitem.set_submenu(invite_to_submenu)
+ invite_to_new_room_menuitem = gtk.ImageMenuItem(_('_New Group Chat'))
+ icon = gtk.image_new_from_stock(gtk.STOCK_NEW, gtk.ICON_SIZE_MENU)
+ invite_to_new_room_menuitem.set_image(icon)
+ if len(contact_list) > 1: # several resources
+ invite_to_new_room_menuitem.set_submenu(build_resources_submenu(
+ contact_list, account, roster.on_invite_to_new_room, cap=NS_MUC))
+ elif len(list_) == 1 and contact.supports(NS_MUC):
+ invite_menuitem.set_sensitive(True)
+ # use resource if it's self contact
+ if contact.jid == gajim.get_jid_from_account(account):
+ resource = contact.resource
+ else:
+ resource = None
+ invite_to_new_room_menuitem.connect('activate',
+ roster.on_invite_to_new_room, list_, resource)
+ else:
+ invite_menuitem.set_sensitive(False)
+ # transform None in 'jabber'
+ c_t = contacts_transport or 'jabber'
+ muc_jid = {}
+ for account in connected_accounts:
+ for t in gajim.connections[account].muc_jid:
+ muc_jid[t] = gajim.connections[account].muc_jid[t]
+ if c_t not in muc_jid:
+ invite_to_new_room_menuitem.set_sensitive(False)
+ rooms = [] # a list of (room_jid, account) tuple
+ invite_to_submenu.append(invite_to_new_room_menuitem)
+ rooms = [] # a list of (room_jid, account) tuple
+ minimized_controls = []
+ for account in connected_accounts:
+ minimized_controls += gajim.interface.minimized_controls[account].values()
+ for gc_control in gajim.interface.msg_win_mgr.get_controls(
+ message_control.TYPE_GC) + minimized_controls:
+ acct = gc_control.account
+ room_jid = gc_control.room_jid
+ if room_jid in gajim.gc_connected[acct] and \
+ gajim.gc_connected[acct][room_jid] and \
+ contacts_transport == gajim.get_transport_name_from_jid(room_jid):
+ rooms.append((room_jid, acct))
+ if len(rooms):
+ item = gtk.SeparatorMenuItem() # separator
+ invite_to_submenu.append(item)
+ for (room_jid, account) in rooms:
+ menuitem = gtk.MenuItem(room_jid.split('@')[0])
+ if len(contact_list) > 1: # several resources
+ menuitem.set_submenu(build_resources_submenu(
+ contact_list, account, roster.on_invite_to_room, room_jid,
+ account))
+ else:
+ # use resource if it's self contact
+ if contact.jid == gajim.get_jid_from_account(account):
+ resource = contact.resource
+ else:
+ resource = None
+ menuitem.connect('activate', roster.on_invite_to_room, list_,
+ room_jid, account, resource)
+ invite_to_submenu.append(menuitem)
def get_contact_menu(contact, account, use_multiple_contacts=True,
- show_start_chat=True, show_encryption=False, show_buttonbar_items=True,
- control=None):
- """
- Build contact popup menu for roster and chat window. If control is not set,
- we hide invite_contacts_menuitem
- """
- if not contact:
- return
-
- jid = contact.jid
- our_jid = jid == gajim.get_jid_from_account(account)
- roster = gajim.interface.roster
-
- xml = gtkgui_helpers.get_gtk_builder('contact_context_menu.ui')
- contact_context_menu = xml.get_object('contact_context_menu')
-
- start_chat_menuitem = xml.get_object('start_chat_menuitem')
- execute_command_menuitem = xml.get_object('execute_command_menuitem')
- rename_menuitem = xml.get_object('rename_menuitem')
- edit_groups_menuitem = xml.get_object('edit_groups_menuitem')
- send_file_menuitem = xml.get_object('send_file_menuitem')
- assign_openpgp_key_menuitem = xml.get_object('assign_openpgp_key_menuitem')
- add_special_notification_menuitem = xml.get_object(
- 'add_special_notification_menuitem')
- information_menuitem = xml.get_object('information_menuitem')
- history_menuitem = xml.get_object('history_menuitem')
- send_custom_status_menuitem = xml.get_object('send_custom_status_menuitem')
- send_single_message_menuitem = xml.get_object('send_single_message_menuitem')
- invite_menuitem = xml.get_object('invite_menuitem')
- block_menuitem = xml.get_object('block_menuitem')
- unblock_menuitem = xml.get_object('unblock_menuitem')
- ignore_menuitem = xml.get_object('ignore_menuitem')
- unignore_menuitem = xml.get_object('unignore_menuitem')
- set_custom_avatar_menuitem = xml.get_object('set_custom_avatar_menuitem')
- # Subscription submenu
- subscription_menuitem = xml.get_object('subscription_menuitem')
- send_auth_menuitem, ask_auth_menuitem, revoke_auth_menuitem = \
- subscription_menuitem.get_submenu().get_children()
- add_to_roster_menuitem = xml.get_object('add_to_roster_menuitem')
- remove_from_roster_menuitem = xml.get_object(
- 'remove_from_roster_menuitem')
- manage_contact_menuitem = xml.get_object('manage_contact')
- convert_to_gc_menuitem = xml.get_object('convert_to_groupchat_menuitem')
- encryption_separator = xml.get_object('encryption_separator')
- toggle_gpg_menuitem = xml.get_object('toggle_gpg_menuitem')
- toggle_e2e_menuitem = xml.get_object('toggle_e2e_menuitem')
- last_separator = xml.get_object('last_separator')
-
- items_to_hide = []
-
- # add a special img for send file menuitem
- path_to_upload_img = gtkgui_helpers.get_icon_path('gajim-upload')
- img = gtk.Image()
- img.set_from_file(path_to_upload_img)
- send_file_menuitem.set_image(img)
-
- if not our_jid:
- # add a special img for rename menuitem
- gtkgui_helpers.add_image_to_menuitem(rename_menuitem, 'gajim-kbd_input')
-
- muc_icon = gtkgui_helpers.load_icon('muc_active')
- if muc_icon:
- convert_to_gc_menuitem.set_image(muc_icon)
-
- contacts = gajim.contacts.get_contacts(account, jid)
- if len(contacts) > 1 and use_multiple_contacts: # several resources
- start_chat_menuitem.set_submenu(build_resources_submenu(contacts,
- account, gajim.interface.on_open_chat_window))
- send_file_menuitem.set_submenu(build_resources_submenu(contacts,
- account, roster.on_send_file_menuitem_activate, cap=NS_FILE))
- execute_command_menuitem.set_submenu(build_resources_submenu(
- contacts, account, roster.on_execute_command, cap=NS_COMMANDS))
- else:
- start_chat_menuitem.connect('activate',
- gajim.interface.on_open_chat_window, contact, account)
- if contact.supports(NS_FILE):
- send_file_menuitem.set_sensitive(True)
- send_file_menuitem.connect('activate',
- roster.on_send_file_menuitem_activate, contact, account)
- else:
- send_file_menuitem.set_sensitive(False)
-
- if contact.supports(NS_COMMANDS):
- execute_command_menuitem.set_sensitive(True)
- execute_command_menuitem.connect('activate', roster.on_execute_command,
- contact, account, contact.resource)
- else:
- execute_command_menuitem.set_sensitive(False)
-
- rename_menuitem.connect('activate', roster.on_rename, 'contact', jid,
- account)
- history_menuitem.connect('activate', roster.on_history, contact, account)
-
- if control:
- convert_to_gc_menuitem.connect('activate',
- control._on_convert_to_gc_menuitem_activate)
- else:
- items_to_hide.append(convert_to_gc_menuitem)
-
- if _('Not in Roster') not in contact.get_shown_groups():
- # contact is in normal group
- edit_groups_menuitem.connect('activate', roster.on_edit_groups, [(contact,
- account)])
-
- if gajim.connections[account].gpg:
- assign_openpgp_key_menuitem.connect('activate',
- roster.on_assign_pgp_key, contact, account)
- else:
- assign_openpgp_key_menuitem.set_sensitive(False)
- else:
- # contact is in group 'Not in Roster'
- edit_groups_menuitem.set_sensitive(False)
- assign_openpgp_key_menuitem.set_sensitive(False)
-
- # Hide items when it's self contact row
- if our_jid:
- items_to_hide += [rename_menuitem, edit_groups_menuitem]
-
- # Unsensitive many items when account is offline
- if gajim.account_is_disconnected(account):
- for widget in (start_chat_menuitem, rename_menuitem,
- edit_groups_menuitem, send_file_menuitem, convert_to_gc_menuitem):
- widget.set_sensitive(False)
-
- if not show_start_chat:
- items_to_hide.append(start_chat_menuitem)
-
- if not show_encryption or not control:
- items_to_hide += [encryption_separator, toggle_gpg_menuitem,
- toggle_e2e_menuitem]
- else:
- e2e_is_active = control.session is not None and \
- control.session.enable_encryption
-
- # check if we support and use gpg
- if not gajim.config.get_per('accounts', account, 'keyid') or \
- not gajim.connections[account].USE_GPG or gajim.jid_is_transport(
- contact.jid):
- toggle_gpg_menuitem.set_sensitive(False)
- else:
- toggle_gpg_menuitem.set_sensitive(control.gpg_is_active or \
- not e2e_is_active)
- toggle_gpg_menuitem.set_active(control.gpg_is_active)
- toggle_gpg_menuitem.connect('activate',
- control._on_toggle_gpg_menuitem_activate)
-
- # disable esessions if we or the other client don't support them
- if not gajim.HAVE_PYCRYPTO or not contact.supports(NS_ESESSION) or \
- not gajim.config.get_per('accounts', account, 'enable_esessions'):
- toggle_e2e_menuitem.set_sensitive(False)
- else:
- toggle_e2e_menuitem.set_active(e2e_is_active)
- toggle_e2e_menuitem.set_sensitive(e2e_is_active or \
- not control.gpg_is_active)
- toggle_e2e_menuitem.connect('activate',
- control._on_toggle_e2e_menuitem_activate)
-
- if not show_buttonbar_items:
- items_to_hide += [history_menuitem, send_file_menuitem,
- information_menuitem, convert_to_gc_menuitem, last_separator]
-
- if not control:
- items_to_hide.append(convert_to_gc_menuitem)
-
- for item in items_to_hide:
- item.set_no_show_all(True)
- item.hide()
-
- # Zeroconf Account
- if gajim.config.get_per('accounts', account, 'is_zeroconf'):
- for item in (send_custom_status_menuitem, send_single_message_menuitem,
- invite_menuitem, block_menuitem, unblock_menuitem, ignore_menuitem,
- unignore_menuitem, set_custom_avatar_menuitem, subscription_menuitem,
- manage_contact_menuitem, convert_to_gc_menuitem):
- item.set_no_show_all(True)
- item.hide()
-
- if contact.show in ('offline', 'error'):
- information_menuitem.set_sensitive(False)
- send_file_menuitem.set_sensitive(False)
- else:
- information_menuitem.connect('activate', roster.on_info_zeroconf,
- contact, account)
-
- contact_context_menu.connect('selection-done',
- gtkgui_helpers.destroy_widget)
- contact_context_menu.show_all()
- return contact_context_menu
-
- # normal account
-
- # send custom status icon
- blocked = False
- if helpers.jid_is_blocked(account, jid):
- blocked = True
- else:
- for group in contact.get_shown_groups():
- if helpers.group_is_blocked(account, group):
- blocked = True
- break
- if gajim.get_transport_name_from_jid(jid, use_config_setting=False):
- # Transport contact, send custom status unavailable
- send_custom_status_menuitem.set_sensitive(False)
- elif blocked:
- send_custom_status_menuitem.set_image(gtkgui_helpers.load_icon('offline'))
- send_custom_status_menuitem.set_sensitive(False)
- elif account in gajim.interface.status_sent_to_users and \
- jid in gajim.interface.status_sent_to_users[account]:
- send_custom_status_menuitem.set_image(gtkgui_helpers.load_icon(
- gajim.interface.status_sent_to_users[account][jid]))
- else:
- icon = gtk.image_new_from_stock(gtk.STOCK_NETWORK, gtk.ICON_SIZE_MENU)
- send_custom_status_menuitem.set_image(icon)
-
- muc_icon = gtkgui_helpers.load_icon('muc_active')
- if muc_icon:
- invite_menuitem.set_image(muc_icon)
-
- build_invite_submenu(invite_menuitem, [(contact, account)])
-
- # One or several resource, we do the same for send_custom_status
- status_menuitems = gtk.Menu()
- send_custom_status_menuitem.set_submenu(status_menuitems)
- iconset = gajim.config.get('iconset')
- path = os.path.join(helpers.get_iconset_path(iconset), '16x16')
- for s in ('online', 'chat', 'away', 'xa', 'dnd', 'offline'):
- # icon MUST be different instance for every item
- state_images = gtkgui_helpers.load_iconset(path)
- status_menuitem = gtk.ImageMenuItem(helpers.get_uf_show(s))
- status_menuitem.connect('activate', roster.on_send_custom_status,
- [(contact, account)], s)
- icon = state_images[s]
- status_menuitem.set_image(icon)
- status_menuitems.append(status_menuitem)
-
- send_single_message_menuitem.connect('activate',
- roster.on_send_single_message_menuitem_activate, account, contact)
-
- remove_from_roster_menuitem.connect('activate', roster.on_req_usub,
- [(contact, account)])
- information_menuitem.connect('activate', roster.on_info, contact, account)
-
- if _('Not in Roster') not in contact.get_shown_groups():
- # contact is in normal group
- add_to_roster_menuitem.hide()
- add_to_roster_menuitem.set_no_show_all(True)
-
- if contact.sub in ('from', 'both'):
- send_auth_menuitem.set_sensitive(False)
- else:
- send_auth_menuitem.connect('activate', roster.authorize, jid, account)
- if contact.sub in ('to', 'both'):
- ask_auth_menuitem.set_sensitive(False)
- add_special_notification_menuitem.connect('activate',
- roster.on_add_special_notification_menuitem_activate, jid)
- else:
- ask_auth_menuitem.connect('activate', roster.req_sub, jid,
- _('I would like to add you to my roster'), account,
- contact.groups, contact.name)
- if contact.sub in ('to', 'none') or gajim.get_transport_name_from_jid(
- jid, use_config_setting=False):
- revoke_auth_menuitem.set_sensitive(False)
- else:
- revoke_auth_menuitem.connect('activate', roster.revoke_auth, jid,
- account)
-
- else:
- # contact is in group 'Not in Roster'
- add_to_roster_menuitem.set_no_show_all(False)
- subscription_menuitem.set_sensitive(False)
-
- add_to_roster_menuitem.connect('activate', roster.on_add_to_roster,
- contact, account)
-
- set_custom_avatar_menuitem.connect('activate',
- roster.on_set_custom_avatar_activate, contact, account)
-
- # Hide items when it's self contact row
- if our_jid:
- manage_contact_menuitem.set_sensitive(False)
-
- # Unsensitive items when account is offline
- if gajim.account_is_disconnected(account):
- for widget in (send_single_message_menuitem, subscription_menuitem,
- add_to_roster_menuitem, remove_from_roster_menuitem,
- execute_command_menuitem, send_custom_status_menuitem):
- widget.set_sensitive(False)
-
- if gajim.connections[account] and gajim.connections[account].\
- privacy_rules_supported:
- if helpers.jid_is_blocked(account, jid):
- block_menuitem.set_no_show_all(True)
- block_menuitem.hide()
- if gajim.get_transport_name_from_jid(jid, use_config_setting=False):
- unblock_menuitem.set_no_show_all(True)
- unblock_menuitem.hide()
- unignore_menuitem.set_no_show_all(False)
- unignore_menuitem.connect('activate', roster.on_unblock, [(contact,
- account)])
- else:
- unblock_menuitem.connect('activate', roster.on_unblock, [(contact,
- account)])
- else:
- unblock_menuitem.set_no_show_all(True)
- unblock_menuitem.hide()
- if gajim.get_transport_name_from_jid(jid, use_config_setting=False):
- block_menuitem.set_no_show_all(True)
- block_menuitem.hide()
- ignore_menuitem.set_no_show_all(False)
- ignore_menuitem.connect('activate', roster.on_block, [(contact,
- account)])
- else:
- block_menuitem.connect('activate', roster.on_block, [(contact,
- account)])
- else:
- unblock_menuitem.set_no_show_all(True)
- block_menuitem.set_sensitive(False)
- unblock_menuitem.hide()
-
- contact_context_menu.connect('selection-done', gtkgui_helpers.destroy_widget)
- contact_context_menu.show_all()
- return contact_context_menu
-
-# vim: se ts=3:
+ show_start_chat=True, show_encryption=False, show_buttonbar_items=True,
+ control=None):
+ """
+ Build contact popup menu for roster and chat window. If control is not set,
+ we hide invite_contacts_menuitem
+ """
+ if not contact:
+ return
+
+ jid = contact.jid
+ our_jid = jid == gajim.get_jid_from_account(account)
+ roster = gajim.interface.roster
+
+ xml = gtkgui_helpers.get_gtk_builder('contact_context_menu.ui')
+ contact_context_menu = xml.get_object('contact_context_menu')
+
+ start_chat_menuitem = xml.get_object('start_chat_menuitem')
+ execute_command_menuitem = xml.get_object('execute_command_menuitem')
+ rename_menuitem = xml.get_object('rename_menuitem')
+ edit_groups_menuitem = xml.get_object('edit_groups_menuitem')
+ send_file_menuitem = xml.get_object('send_file_menuitem')
+ assign_openpgp_key_menuitem = xml.get_object('assign_openpgp_key_menuitem')
+ add_special_notification_menuitem = xml.get_object(
+ 'add_special_notification_menuitem')
+ information_menuitem = xml.get_object('information_menuitem')
+ history_menuitem = xml.get_object('history_menuitem')
+ send_custom_status_menuitem = xml.get_object('send_custom_status_menuitem')
+ send_single_message_menuitem = xml.get_object('send_single_message_menuitem')
+ invite_menuitem = xml.get_object('invite_menuitem')
+ block_menuitem = xml.get_object('block_menuitem')
+ unblock_menuitem = xml.get_object('unblock_menuitem')
+ ignore_menuitem = xml.get_object('ignore_menuitem')
+ unignore_menuitem = xml.get_object('unignore_menuitem')
+ set_custom_avatar_menuitem = xml.get_object('set_custom_avatar_menuitem')
+ # Subscription submenu
+ subscription_menuitem = xml.get_object('subscription_menuitem')
+ send_auth_menuitem, ask_auth_menuitem, revoke_auth_menuitem = \
+ subscription_menuitem.get_submenu().get_children()
+ add_to_roster_menuitem = xml.get_object('add_to_roster_menuitem')
+ remove_from_roster_menuitem = xml.get_object(
+ 'remove_from_roster_menuitem')
+ manage_contact_menuitem = xml.get_object('manage_contact')
+ convert_to_gc_menuitem = xml.get_object('convert_to_groupchat_menuitem')
+ encryption_separator = xml.get_object('encryption_separator')
+ toggle_gpg_menuitem = xml.get_object('toggle_gpg_menuitem')
+ toggle_e2e_menuitem = xml.get_object('toggle_e2e_menuitem')
+ last_separator = xml.get_object('last_separator')
+
+ items_to_hide = []
+
+ # add a special img for send file menuitem
+ path_to_upload_img = gtkgui_helpers.get_icon_path('gajim-upload')
+ img = gtk.Image()
+ img.set_from_file(path_to_upload_img)
+ send_file_menuitem.set_image(img)
+
+ if not our_jid:
+ # add a special img for rename menuitem
+ gtkgui_helpers.add_image_to_menuitem(rename_menuitem, 'gajim-kbd_input')
+
+ muc_icon = gtkgui_helpers.load_icon('muc_active')
+ if muc_icon:
+ convert_to_gc_menuitem.set_image(muc_icon)
+
+ contacts = gajim.contacts.get_contacts(account, jid)
+ if len(contacts) > 1 and use_multiple_contacts: # several resources
+ start_chat_menuitem.set_submenu(build_resources_submenu(contacts,
+ account, gajim.interface.on_open_chat_window))
+ send_file_menuitem.set_submenu(build_resources_submenu(contacts,
+ account, roster.on_send_file_menuitem_activate, cap=NS_FILE))
+ execute_command_menuitem.set_submenu(build_resources_submenu(
+ contacts, account, roster.on_execute_command, cap=NS_COMMANDS))
+ else:
+ start_chat_menuitem.connect('activate',
+ gajim.interface.on_open_chat_window, contact, account)
+ if contact.supports(NS_FILE):
+ send_file_menuitem.set_sensitive(True)
+ send_file_menuitem.connect('activate',
+ roster.on_send_file_menuitem_activate, contact, account)
+ else:
+ send_file_menuitem.set_sensitive(False)
+
+ if contact.supports(NS_COMMANDS):
+ execute_command_menuitem.set_sensitive(True)
+ execute_command_menuitem.connect('activate', roster.on_execute_command,
+ contact, account, contact.resource)
+ else:
+ execute_command_menuitem.set_sensitive(False)
+
+ rename_menuitem.connect('activate', roster.on_rename, 'contact', jid,
+ account)
+ history_menuitem.connect('activate', roster.on_history, contact, account)
+
+ if control:
+ convert_to_gc_menuitem.connect('activate',
+ control._on_convert_to_gc_menuitem_activate)
+ else:
+ items_to_hide.append(convert_to_gc_menuitem)
+
+ if _('Not in Roster') not in contact.get_shown_groups():
+ # contact is in normal group
+ edit_groups_menuitem.connect('activate', roster.on_edit_groups, [(contact,
+ account)])
+
+ if gajim.connections[account].gpg:
+ assign_openpgp_key_menuitem.connect('activate',
+ roster.on_assign_pgp_key, contact, account)
+ else:
+ assign_openpgp_key_menuitem.set_sensitive(False)
+ else:
+ # contact is in group 'Not in Roster'
+ edit_groups_menuitem.set_sensitive(False)
+ assign_openpgp_key_menuitem.set_sensitive(False)
+
+ # Hide items when it's self contact row
+ if our_jid:
+ items_to_hide += [rename_menuitem, edit_groups_menuitem]
+
+ # Unsensitive many items when account is offline
+ if gajim.account_is_disconnected(account):
+ for widget in (start_chat_menuitem, rename_menuitem,
+ edit_groups_menuitem, send_file_menuitem, convert_to_gc_menuitem):
+ widget.set_sensitive(False)
+
+ if not show_start_chat:
+ items_to_hide.append(start_chat_menuitem)
+
+ if not show_encryption or not control:
+ items_to_hide += [encryption_separator, toggle_gpg_menuitem,
+ toggle_e2e_menuitem]
+ else:
+ e2e_is_active = control.session is not None and \
+ control.session.enable_encryption
+
+ # check if we support and use gpg
+ if not gajim.config.get_per('accounts', account, 'keyid') or \
+ not gajim.connections[account].USE_GPG or gajim.jid_is_transport(
+ contact.jid):
+ toggle_gpg_menuitem.set_sensitive(False)
+ else:
+ toggle_gpg_menuitem.set_sensitive(control.gpg_is_active or \
+ not e2e_is_active)
+ toggle_gpg_menuitem.set_active(control.gpg_is_active)
+ toggle_gpg_menuitem.connect('activate',
+ control._on_toggle_gpg_menuitem_activate)
+
+ # disable esessions if we or the other client don't support them
+ if not gajim.HAVE_PYCRYPTO or not contact.supports(NS_ESESSION) or \
+ not gajim.config.get_per('accounts', account, 'enable_esessions'):
+ toggle_e2e_menuitem.set_sensitive(False)
+ else:
+ toggle_e2e_menuitem.set_active(e2e_is_active)
+ toggle_e2e_menuitem.set_sensitive(e2e_is_active or \
+ not control.gpg_is_active)
+ toggle_e2e_menuitem.connect('activate',
+ control._on_toggle_e2e_menuitem_activate)
+
+ if not show_buttonbar_items:
+ items_to_hide += [history_menuitem, send_file_menuitem,
+ information_menuitem, convert_to_gc_menuitem, last_separator]
+
+ if not control:
+ items_to_hide.append(convert_to_gc_menuitem)
+
+ for item in items_to_hide:
+ item.set_no_show_all(True)
+ item.hide()
+
+ # Zeroconf Account
+ if gajim.config.get_per('accounts', account, 'is_zeroconf'):
+ for item in (send_custom_status_menuitem, send_single_message_menuitem,
+ invite_menuitem, block_menuitem, unblock_menuitem, ignore_menuitem,
+ unignore_menuitem, set_custom_avatar_menuitem, subscription_menuitem,
+ manage_contact_menuitem, convert_to_gc_menuitem):
+ item.set_no_show_all(True)
+ item.hide()
+
+ if contact.show in ('offline', 'error'):
+ information_menuitem.set_sensitive(False)
+ send_file_menuitem.set_sensitive(False)
+ else:
+ information_menuitem.connect('activate', roster.on_info_zeroconf,
+ contact, account)
+
+ contact_context_menu.connect('selection-done',
+ gtkgui_helpers.destroy_widget)
+ contact_context_menu.show_all()
+ return contact_context_menu
+
+ # normal account
+
+ # send custom status icon
+ blocked = False
+ if helpers.jid_is_blocked(account, jid):
+ blocked = True
+ else:
+ for group in contact.get_shown_groups():
+ if helpers.group_is_blocked(account, group):
+ blocked = True
+ break
+ if gajim.get_transport_name_from_jid(jid, use_config_setting=False):
+ # Transport contact, send custom status unavailable
+ send_custom_status_menuitem.set_sensitive(False)
+ elif blocked:
+ send_custom_status_menuitem.set_image(gtkgui_helpers.load_icon('offline'))
+ send_custom_status_menuitem.set_sensitive(False)
+ elif account in gajim.interface.status_sent_to_users and \
+ jid in gajim.interface.status_sent_to_users[account]:
+ send_custom_status_menuitem.set_image(gtkgui_helpers.load_icon(
+ gajim.interface.status_sent_to_users[account][jid]))
+ else:
+ icon = gtk.image_new_from_stock(gtk.STOCK_NETWORK, gtk.ICON_SIZE_MENU)
+ send_custom_status_menuitem.set_image(icon)
+
+ muc_icon = gtkgui_helpers.load_icon('muc_active')
+ if muc_icon:
+ invite_menuitem.set_image(muc_icon)
+
+ build_invite_submenu(invite_menuitem, [(contact, account)])
+
+ # One or several resource, we do the same for send_custom_status
+ status_menuitems = gtk.Menu()
+ send_custom_status_menuitem.set_submenu(status_menuitems)
+ iconset = gajim.config.get('iconset')
+ path = os.path.join(helpers.get_iconset_path(iconset), '16x16')
+ for s in ('online', 'chat', 'away', 'xa', 'dnd', 'offline'):
+ # icon MUST be different instance for every item
+ state_images = gtkgui_helpers.load_iconset(path)
+ status_menuitem = gtk.ImageMenuItem(helpers.get_uf_show(s))
+ status_menuitem.connect('activate', roster.on_send_custom_status,
+ [(contact, account)], s)
+ icon = state_images[s]
+ status_menuitem.set_image(icon)
+ status_menuitems.append(status_menuitem)
+
+ send_single_message_menuitem.connect('activate',
+ roster.on_send_single_message_menuitem_activate, account, contact)
+
+ remove_from_roster_menuitem.connect('activate', roster.on_req_usub,
+ [(contact, account)])
+ information_menuitem.connect('activate', roster.on_info, contact, account)
+
+ if _('Not in Roster') not in contact.get_shown_groups():
+ # contact is in normal group
+ add_to_roster_menuitem.hide()
+ add_to_roster_menuitem.set_no_show_all(True)
+
+ if contact.sub in ('from', 'both'):
+ send_auth_menuitem.set_sensitive(False)
+ else:
+ send_auth_menuitem.connect('activate', roster.authorize, jid, account)
+ if contact.sub in ('to', 'both'):
+ ask_auth_menuitem.set_sensitive(False)
+ add_special_notification_menuitem.connect('activate',
+ roster.on_add_special_notification_menuitem_activate, jid)
+ else:
+ ask_auth_menuitem.connect('activate', roster.req_sub, jid,
+ _('I would like to add you to my roster'), account,
+ contact.groups, contact.name)
+ if contact.sub in ('to', 'none') or gajim.get_transport_name_from_jid(
+ jid, use_config_setting=False):
+ revoke_auth_menuitem.set_sensitive(False)
+ else:
+ revoke_auth_menuitem.connect('activate', roster.revoke_auth, jid,
+ account)
+
+ else:
+ # contact is in group 'Not in Roster'
+ add_to_roster_menuitem.set_no_show_all(False)
+ subscription_menuitem.set_sensitive(False)
+
+ add_to_roster_menuitem.connect('activate', roster.on_add_to_roster,
+ contact, account)
+
+ set_custom_avatar_menuitem.connect('activate',
+ roster.on_set_custom_avatar_activate, contact, account)
+
+ # Hide items when it's self contact row
+ if our_jid:
+ manage_contact_menuitem.set_sensitive(False)
+
+ # Unsensitive items when account is offline
+ if gajim.account_is_disconnected(account):
+ for widget in (send_single_message_menuitem, subscription_menuitem,
+ add_to_roster_menuitem, remove_from_roster_menuitem,
+ execute_command_menuitem, send_custom_status_menuitem):
+ widget.set_sensitive(False)
+
+ if gajim.connections[account] and gajim.connections[account].\
+ privacy_rules_supported:
+ if helpers.jid_is_blocked(account, jid):
+ block_menuitem.set_no_show_all(True)
+ block_menuitem.hide()
+ if gajim.get_transport_name_from_jid(jid, use_config_setting=False):
+ unblock_menuitem.set_no_show_all(True)
+ unblock_menuitem.hide()
+ unignore_menuitem.set_no_show_all(False)
+ unignore_menuitem.connect('activate', roster.on_unblock, [(contact,
+ account)])
+ else:
+ unblock_menuitem.connect('activate', roster.on_unblock, [(contact,
+ account)])
+ else:
+ unblock_menuitem.set_no_show_all(True)
+ unblock_menuitem.hide()
+ if gajim.get_transport_name_from_jid(jid, use_config_setting=False):
+ block_menuitem.set_no_show_all(True)
+ block_menuitem.hide()
+ ignore_menuitem.set_no_show_all(False)
+ ignore_menuitem.connect('activate', roster.on_block, [(contact,
+ account)])
+ else:
+ block_menuitem.connect('activate', roster.on_block, [(contact,
+ account)])
+ else:
+ unblock_menuitem.set_no_show_all(True)
+ block_menuitem.set_sensitive(False)
+ unblock_menuitem.hide()
+
+ contact_context_menu.connect('selection-done', gtkgui_helpers.destroy_widget)
+ contact_context_menu.show_all()
+ return contact_context_menu