2006-11-18 21:52:28 +01:00
|
|
|
|
# -*- coding: utf-8 -*-
|
2005-06-12 17:14:07 +02:00
|
|
|
|
## roster_window.py
|
|
|
|
|
##
|
2006-03-28 13:52:25 +02:00
|
|
|
|
## Copyright (C) 2003-2006 Yann Le Boulanger <asterix@lagaule.org>
|
2007-01-17 00:26:38 +01:00
|
|
|
|
## Copyright (C) 2005-2007 Nikos Kouremenos <kourem@gmail.com>
|
2006-03-28 13:52:25 +02:00
|
|
|
|
## Copyright (C) 2005-2006 Dimitur Kirov <dkirov@gmail.com>
|
2005-06-12 17:14:07 +02:00
|
|
|
|
##
|
|
|
|
|
## This program is free software; you can redistribute it and/or modify
|
|
|
|
|
## it under the terms of the GNU General Public License as published
|
|
|
|
|
## by the Free Software Foundation; version 2 only.
|
|
|
|
|
##
|
|
|
|
|
## This program is distributed in the hope that it will be useful,
|
|
|
|
|
## but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
## GNU General Public License for more details.
|
|
|
|
|
##
|
|
|
|
|
|
|
|
|
|
import gtk
|
|
|
|
|
import gobject
|
|
|
|
|
import os
|
|
|
|
|
import time
|
2006-09-13 18:47:58 +02:00
|
|
|
|
import urllib
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
2005-07-19 16:53:35 +02:00
|
|
|
|
import common.sleepy
|
2005-06-12 17:14:07 +02:00
|
|
|
|
import history_window
|
|
|
|
|
import dialogs
|
2005-11-13 21:25:04 +01:00
|
|
|
|
import vcard
|
2005-06-12 17:14:07 +02:00
|
|
|
|
import config
|
2005-10-30 10:58:13 +01:00
|
|
|
|
import disco
|
2005-07-30 12:20:46 +02:00
|
|
|
|
import gtkgui_helpers
|
2005-06-12 17:14:07 +02:00
|
|
|
|
import cell_renderer_image
|
2005-08-15 01:52:12 +02:00
|
|
|
|
import tooltips
|
2006-01-06 02:48:59 +01:00
|
|
|
|
import message_control
|
2006-06-23 00:49:39 +02:00
|
|
|
|
import adhoc_commands
|
2006-09-13 18:47:58 +02:00
|
|
|
|
import notify
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
|
|
|
|
from common import gajim
|
|
|
|
|
from common import helpers
|
2006-11-18 21:52:28 +01:00
|
|
|
|
from common import passwords
|
|
|
|
|
from common.exceptions import GajimGeneralException
|
2007-03-17 11:14:31 +01:00
|
|
|
|
from common import i18n
|
2006-11-18 21:52:28 +01:00
|
|
|
|
|
2005-12-31 07:27:22 +01:00
|
|
|
|
from message_window import MessageWindowMgr
|
2005-12-30 21:47:59 +01:00
|
|
|
|
from chat_control import ChatControl
|
2005-12-31 08:35:14 +01:00
|
|
|
|
from groupchat_control import GroupchatControl
|
2006-01-03 08:34:18 +01:00
|
|
|
|
from groupchat_control import PrivateChatControl
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
2006-11-18 21:52:28 +01:00
|
|
|
|
from common import dbus_support
|
|
|
|
|
if dbus_support.supported:
|
|
|
|
|
from music_track_listener import MusicTrackListener
|
2007-04-25 19:34:14 +02:00
|
|
|
|
import dbus
|
2006-11-18 21:52:28 +01:00
|
|
|
|
|
2005-11-26 00:23:25 +01:00
|
|
|
|
#(icon, name, type, jid, account, editable, second pixbuf)
|
2005-09-09 00:07:49 +02:00
|
|
|
|
(
|
|
|
|
|
C_IMG, # image to show state (online, new message etc)
|
|
|
|
|
C_NAME, # cellrenderer text that holds contact nickame
|
|
|
|
|
C_TYPE, # account, group or contact?
|
2005-09-09 22:28:25 +02:00
|
|
|
|
C_JID, # the jid of the row
|
2005-09-09 00:07:49 +02:00
|
|
|
|
C_ACCOUNT, # cellrenderer text that holds account name
|
2005-11-08 16:47:27 +01:00
|
|
|
|
C_SECPIXBUF, # secondary_pixbuf (holds avatar or padlock)
|
2006-11-19 20:45:43 +01:00
|
|
|
|
) = range(6)
|
2005-09-09 00:07:49 +02:00
|
|
|
|
|
2005-06-12 17:14:07 +02:00
|
|
|
|
class RosterWindow:
|
2006-11-18 21:52:28 +01:00
|
|
|
|
'''Class for main window of the GTK+ interface'''
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
|
|
|
|
def get_account_iter(self, name):
|
|
|
|
|
model = self.tree.get_model()
|
2005-07-25 20:48:15 +02:00
|
|
|
|
if model is None:
|
|
|
|
|
return
|
2005-09-13 00:46:41 +02:00
|
|
|
|
account_iter = model.get_iter_root()
|
2005-11-09 08:00:46 +01:00
|
|
|
|
if self.regroup:
|
|
|
|
|
return account_iter
|
2005-09-13 00:46:41 +02:00
|
|
|
|
while account_iter:
|
2006-09-13 18:47:58 +02:00
|
|
|
|
account_name = model[account_iter][C_ACCOUNT].decode('utf-8')
|
2005-06-12 17:14:07 +02:00
|
|
|
|
if name == account_name:
|
|
|
|
|
break
|
2005-09-13 00:46:41 +02:00
|
|
|
|
account_iter = model.iter_next(account_iter)
|
|
|
|
|
return account_iter
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
|
|
|
|
def get_group_iter(self, name, account):
|
|
|
|
|
model = self.tree.get_model()
|
|
|
|
|
root = self.get_account_iter(account)
|
2005-09-13 00:46:41 +02:00
|
|
|
|
group_iter = model.iter_children(root)
|
2005-12-30 21:47:59 +01:00
|
|
|
|
# C_NAME column contacts the pango escaped group name
|
2005-09-13 00:46:41 +02:00
|
|
|
|
while group_iter:
|
2006-11-18 21:52:28 +01:00
|
|
|
|
group_name = model[group_iter][C_JID].decode('utf-8')
|
2005-06-12 17:14:07 +02:00
|
|
|
|
if name == group_name:
|
|
|
|
|
break
|
2005-09-13 00:46:41 +02:00
|
|
|
|
group_iter = model.iter_next(group_iter)
|
|
|
|
|
return group_iter
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
2005-07-07 18:38:36 +02:00
|
|
|
|
def get_contact_iter(self, jid, account):
|
2006-07-19 13:01:09 +02:00
|
|
|
|
if jid == gajim.get_jid_from_account(account):
|
|
|
|
|
iter = self.get_self_contact_iter(account)
|
|
|
|
|
if iter:
|
|
|
|
|
return [iter]
|
|
|
|
|
else:
|
|
|
|
|
return []
|
2005-06-12 17:14:07 +02:00
|
|
|
|
model = self.tree.get_model()
|
|
|
|
|
acct = self.get_account_iter(account)
|
|
|
|
|
found = []
|
2005-10-30 22:46:48 +01:00
|
|
|
|
if model is None: # when closing Gajim model can be none (async pbs?)
|
|
|
|
|
return found
|
2005-09-13 00:46:41 +02:00
|
|
|
|
group_iter = model.iter_children(acct)
|
|
|
|
|
while group_iter:
|
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
|
|
|
|
contact_iter = model.iter_children(group_iter)
|
|
|
|
|
while contact_iter:
|
|
|
|
|
if jid == model[contact_iter][C_JID].decode('utf-8') and \
|
|
|
|
|
account == model[contact_iter][C_ACCOUNT].decode('utf-8'):
|
|
|
|
|
found.append(contact_iter)
|
2006-03-06 11:34:51 +01:00
|
|
|
|
# find next contact iter
|
|
|
|
|
if model.iter_has_child(contact_iter):
|
|
|
|
|
# his first child if it has some
|
|
|
|
|
contact_iter = model.iter_children(contact_iter)
|
|
|
|
|
else:
|
|
|
|
|
next_contact_iter = model.iter_next(contact_iter)
|
|
|
|
|
if not next_contact_iter:
|
|
|
|
|
# now we need to go up
|
|
|
|
|
parent_iter = model.iter_parent(contact_iter)
|
|
|
|
|
parent_type = model[parent_iter][C_TYPE]
|
|
|
|
|
while parent_type != 'group':
|
|
|
|
|
contact_iter = model.iter_next(parent_iter)
|
|
|
|
|
if contact_iter:
|
|
|
|
|
break
|
|
|
|
|
else:
|
|
|
|
|
parent_iter = model.iter_parent(parent_iter)
|
|
|
|
|
parent_type = model[parent_iter][C_TYPE]
|
|
|
|
|
else:
|
|
|
|
|
# we tested all contacts in this group
|
|
|
|
|
contact_iter = None
|
|
|
|
|
else:
|
|
|
|
|
# his brother if he has
|
|
|
|
|
contact_iter = next_contact_iter
|
2005-09-13 00:46:41 +02:00
|
|
|
|
group_iter = model.iter_next(group_iter)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
return found
|
|
|
|
|
|
2006-11-18 21:52:28 +01:00
|
|
|
|
def get_path(self, jid, account):
|
|
|
|
|
''' Try to get line of contact in roster '''
|
|
|
|
|
iters = self.get_contact_iter(jid, account)
|
|
|
|
|
if iters:
|
|
|
|
|
path = self.tree.get_model().get_path(iters[0])
|
|
|
|
|
else:
|
|
|
|
|
path = None
|
|
|
|
|
return path
|
|
|
|
|
|
|
|
|
|
def show_and_select_path(self, path, jid, account):
|
|
|
|
|
'''Show contact in roster (if he is invisible for example)
|
|
|
|
|
and select line'''
|
|
|
|
|
if not path:
|
|
|
|
|
# contact is in roster but we curently don't see him online
|
|
|
|
|
# show him
|
|
|
|
|
self.add_contact_to_roster(jid, account)
|
|
|
|
|
iters = self.get_contact_iter(jid, account)
|
|
|
|
|
path = self.tree.get_model().get_path(iters[0])
|
2007-03-17 09:14:25 +01:00
|
|
|
|
if self.dragging or not gajim.config.get('scroll_roster_to_last_message'):
|
2006-12-29 18:41:13 +01:00
|
|
|
|
# do not change selection while DND'ing
|
|
|
|
|
return
|
2006-11-18 21:52:28 +01:00
|
|
|
|
# popup == False so we show awaiting event in roster
|
2006-12-29 18:41:13 +01:00
|
|
|
|
# show and select contact line in roster (even if he is not in roster)
|
2006-11-18 21:52:28 +01:00
|
|
|
|
self.tree.expand_row(path[0:1], False)
|
|
|
|
|
self.tree.expand_row(path[0:2], False)
|
|
|
|
|
self.tree.scroll_to_cell(path)
|
|
|
|
|
self.tree.set_cursor(path)
|
|
|
|
|
|
2005-06-12 17:14:07 +02:00
|
|
|
|
def add_account_to_roster(self, account):
|
|
|
|
|
model = self.tree.get_model()
|
|
|
|
|
if self.get_account_iter(account):
|
|
|
|
|
return
|
2005-11-09 08:00:46 +01:00
|
|
|
|
|
|
|
|
|
if self.regroup:
|
|
|
|
|
show = helpers.get_global_show()
|
2005-12-12 16:13:31 +01:00
|
|
|
|
model.append(None, [self.jabber_state_images['16'][show],
|
2006-11-19 20:45:43 +01:00
|
|
|
|
_('Merged accounts'), 'account', '', 'all', None])
|
2006-04-13 11:36:55 +02:00
|
|
|
|
self.draw_account(account)
|
2005-11-09 08:00:46 +01:00
|
|
|
|
return
|
|
|
|
|
|
2005-11-15 17:48:40 +01:00
|
|
|
|
show = gajim.SHOW_LIST[gajim.connections[account].connected]
|
2005-06-29 14:57:46 +02:00
|
|
|
|
|
|
|
|
|
tls_pixbuf = None
|
2006-11-18 21:52:28 +01:00
|
|
|
|
if gajim.account_is_securely_connected(account):
|
2005-06-29 14:57:46 +02:00
|
|
|
|
tls_pixbuf = self.window.render_icon(gtk.STOCK_DIALOG_AUTHENTICATION,
|
2005-07-07 18:38:36 +02:00
|
|
|
|
gtk.ICON_SIZE_MENU) # the only way to create a pixbuf from stock
|
2005-06-29 14:57:46 +02:00
|
|
|
|
|
2005-09-13 00:46:41 +02:00
|
|
|
|
our_jid = gajim.get_jid_from_account(account)
|
2005-09-12 19:57:16 +02:00
|
|
|
|
|
2005-12-12 16:13:31 +01:00
|
|
|
|
model.append(None, [self.jabber_state_images['16'][show],
|
2007-01-17 00:26:38 +01:00
|
|
|
|
gobject.markup_escape_text(account),
|
2006-11-19 20:45:43 +01:00
|
|
|
|
'account', our_jid, account, tls_pixbuf])
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
2006-03-24 22:51:15 +01:00
|
|
|
|
def draw_account(self, account):
|
|
|
|
|
model = self.tree.get_model()
|
|
|
|
|
iter = self.get_account_iter(account)
|
2006-04-13 11:36:55 +02:00
|
|
|
|
if self.regroup:
|
|
|
|
|
accounts = gajim.connections.keys()
|
|
|
|
|
else:
|
|
|
|
|
accounts = [account]
|
|
|
|
|
num_of_accounts = len(accounts)
|
2006-11-18 21:52:28 +01:00
|
|
|
|
num_of_secured = gajim.get_number_of_securely_connected_accounts()
|
2006-11-20 08:53:58 +01:00
|
|
|
|
if num_of_secured and gajim.con_types.has_key(account) and \
|
|
|
|
|
gajim.con_types[account] in ('tls', 'ssl'):
|
2006-03-24 22:51:15 +01:00
|
|
|
|
tls_pixbuf = self.window.render_icon(gtk.STOCK_DIALOG_AUTHENTICATION,
|
|
|
|
|
gtk.ICON_SIZE_MENU) # the only way to create a pixbuf from stock
|
2006-04-13 11:36:55 +02:00
|
|
|
|
if num_of_secured < num_of_accounts:
|
|
|
|
|
# Make it transparent
|
|
|
|
|
colorspace = tls_pixbuf.get_colorspace()
|
|
|
|
|
bps = tls_pixbuf.get_bits_per_sample()
|
|
|
|
|
rowstride = tls_pixbuf.get_rowstride()
|
|
|
|
|
pixels = tls_pixbuf.get_pixels()
|
|
|
|
|
new_pixels = ''
|
2006-04-16 14:43:14 +02:00
|
|
|
|
width = tls_pixbuf.get_width()
|
|
|
|
|
height = tls_pixbuf.get_height()
|
|
|
|
|
for i in range(0, width*height):
|
2006-04-13 11:36:55 +02:00
|
|
|
|
rgb = pixels[4*i:4*i+3]
|
|
|
|
|
new_pixels += rgb
|
|
|
|
|
if rgb == chr(0)*3:
|
|
|
|
|
new_pixels += chr(0)
|
|
|
|
|
else:
|
|
|
|
|
new_pixels += chr(128)
|
|
|
|
|
tls_pixbuf = gtk.gdk.pixbuf_new_from_data(new_pixels, colorspace,
|
2006-04-16 14:43:14 +02:00
|
|
|
|
True, bps, width, height, rowstride)
|
2006-03-24 22:51:15 +01:00
|
|
|
|
model[iter][C_SECPIXBUF] = tls_pixbuf
|
|
|
|
|
else:
|
|
|
|
|
model[iter][C_SECPIXBUF] = None
|
2006-09-13 18:47:58 +02:00
|
|
|
|
path = model.get_path(iter)
|
2006-11-18 21:52:28 +01:00
|
|
|
|
account_name = account
|
|
|
|
|
accounts = [account]
|
2006-09-13 18:47:58 +02:00
|
|
|
|
if self.regroup:
|
2006-11-18 21:52:28 +01:00
|
|
|
|
account_name = _('Merged accounts')
|
|
|
|
|
accounts = []
|
2006-09-13 18:47:58 +02:00
|
|
|
|
if not self.tree.row_expanded(path) and model.iter_has_child(iter):
|
2006-11-18 21:52:28 +01:00
|
|
|
|
# account row not expanded
|
|
|
|
|
account_name = '[%s]' % account_name
|
2006-12-29 19:39:33 +01:00
|
|
|
|
if (gajim.account_is_connected(account) or (self.regroup and \
|
|
|
|
|
gajim.get_number_of_connected_accounts())) and gajim.config.get(
|
|
|
|
|
'show_contacts_number'):
|
2006-11-18 21:52:28 +01:00
|
|
|
|
nbr_on, nbr_total = gajim.contacts.get_nb_online_total_contacts(
|
|
|
|
|
accounts = accounts)
|
|
|
|
|
account_name += ' (%s/%s)' % (repr(nbr_on),repr(nbr_total))
|
|
|
|
|
model[iter][C_NAME] = account_name
|
2006-03-24 22:51:15 +01:00
|
|
|
|
|
2005-06-12 17:14:07 +02:00
|
|
|
|
def remove_newly_added(self, jid, account):
|
2005-07-18 23:08:31 +02:00
|
|
|
|
if jid in gajim.newly_added[account]:
|
|
|
|
|
gajim.newly_added[account].remove(jid)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
self.draw_contact(jid, account)
|
|
|
|
|
|
2006-03-24 13:55:56 +01:00
|
|
|
|
def add_contact_to_roster(self, jid, account):
|
2006-01-26 20:37:13 +01:00
|
|
|
|
'''Add a contact to the roster and add groups if they aren't in roster
|
2006-11-18 21:52:28 +01:00
|
|
|
|
force is about force to add it, even if it is offline and show offline
|
2006-03-06 13:50:38 +01:00
|
|
|
|
is False, because it has online children, so we need to show it.
|
|
|
|
|
If add_children is True, we also add all children, even if they were not
|
|
|
|
|
already drawn'''
|
2005-06-12 17:14:07 +02:00
|
|
|
|
showOffline = gajim.config.get('showoffline')
|
2006-03-24 13:55:56 +01:00
|
|
|
|
model = self.tree.get_model()
|
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
|
|
|
|
contact = gajim.contacts.get_first_contact_from_jid(account, jid)
|
2006-11-18 21:52:28 +01:00
|
|
|
|
nb_events = gajim.events.get_nb_roster_events(account, contact.jid)
|
|
|
|
|
# count events from all resources
|
|
|
|
|
for contact_ in gajim.contacts.get_contact(account, jid):
|
|
|
|
|
if contact_.resource:
|
|
|
|
|
nb_events += gajim.events.get_nb_roster_events(account,
|
|
|
|
|
contact_.get_full_jid())
|
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
|
|
|
|
if not contact:
|
2005-06-12 17:14:07 +02:00
|
|
|
|
return
|
2006-01-26 12:23:15 +01:00
|
|
|
|
# If contact already in roster, do not add it
|
2006-03-24 13:55:56 +01:00
|
|
|
|
if len(self.get_contact_iter(jid, account)):
|
2006-01-26 12:23:15 +01:00
|
|
|
|
return
|
2006-07-19 13:01:09 +02:00
|
|
|
|
if jid == gajim.get_jid_from_account(account):
|
|
|
|
|
self.add_self_contact(account)
|
|
|
|
|
return
|
2006-03-28 13:32:53 +02:00
|
|
|
|
if gajim.jid_is_transport(contact.jid):
|
2006-11-18 21:52:28 +01:00
|
|
|
|
# if jid is transport, check if we wanna show it in roster
|
|
|
|
|
if not gajim.config.get('show_transports_group') and not nb_events:
|
|
|
|
|
return
|
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
|
|
|
|
contact.groups = [_('Transports')]
|
2006-11-18 21:52:28 +01:00
|
|
|
|
elif not showOffline and not gajim.account_is_connected(account) and \
|
|
|
|
|
nb_events == 0:
|
|
|
|
|
return
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
2006-11-18 21:52:28 +01:00
|
|
|
|
# XEP-0162
|
|
|
|
|
hide = contact.is_hidden_from_roster()
|
|
|
|
|
if hide and contact.sub != 'from':
|
|
|
|
|
return
|
|
|
|
|
observer = contact.is_observer()
|
2006-01-10 19:34:23 +01:00
|
|
|
|
|
2006-03-24 13:55:56 +01:00
|
|
|
|
if observer:
|
|
|
|
|
# if he has a tag, remove it
|
|
|
|
|
tag = gajim.contacts.get_metacontacts_tag(account, jid)
|
|
|
|
|
if tag:
|
|
|
|
|
gajim.contacts.remove_metacontact(account, jid)
|
|
|
|
|
|
|
|
|
|
# family is [{'account': acct, 'jid': jid, 'priority': prio}, ]
|
|
|
|
|
# 'priority' is optional
|
|
|
|
|
family = gajim.contacts.get_metacontacts_family(account, jid)
|
|
|
|
|
|
2006-05-24 20:17:51 +02:00
|
|
|
|
# family members that are in roster and belong to the same account.
|
|
|
|
|
shown_family = []
|
2006-03-24 13:55:56 +01:00
|
|
|
|
if family:
|
|
|
|
|
for data in family:
|
|
|
|
|
_account = data['account']
|
2006-07-17 21:30:53 +02:00
|
|
|
|
# Metacontacts over different accounts only in merged mode
|
|
|
|
|
if _account != account and not self.regroup:
|
2006-05-24 20:17:51 +02:00
|
|
|
|
continue
|
|
|
|
|
_jid = data['jid']
|
|
|
|
|
|
2006-03-24 13:55:56 +01:00
|
|
|
|
if self.get_contact_iter(_jid, _account):
|
|
|
|
|
shown_family.append(data)
|
2006-09-13 18:47:58 +02:00
|
|
|
|
if _jid == jid and _account == account:
|
2006-03-24 13:55:56 +01:00
|
|
|
|
our_data = data
|
|
|
|
|
shown_family.append(our_data)
|
|
|
|
|
big_brother_data = gajim.contacts.get_metacontacts_big_brother(
|
|
|
|
|
shown_family)
|
|
|
|
|
big_brother_jid = big_brother_data['jid']
|
|
|
|
|
big_brother_account = big_brother_data['account']
|
2006-09-13 18:47:58 +02:00
|
|
|
|
if big_brother_jid != jid or big_brother_account != account:
|
2006-03-24 13:55:56 +01:00
|
|
|
|
# We are adding a child contact
|
|
|
|
|
if contact.show in ('offline', 'error') and \
|
2006-09-13 18:47:58 +02:00
|
|
|
|
not showOffline and len(gajim.events.get_events(account, jid)) == 0:
|
2006-03-24 13:55:56 +01:00
|
|
|
|
return
|
|
|
|
|
parent_iters = self.get_contact_iter(big_brother_jid,
|
|
|
|
|
big_brother_account)
|
|
|
|
|
name = contact.get_shown_name()
|
|
|
|
|
for i in parent_iters:
|
|
|
|
|
# we add some values here. see draw_contact for more
|
2006-11-19 20:45:43 +01:00
|
|
|
|
model.append(i, (None, name, 'contact', jid, account, None))
|
2006-03-24 13:55:56 +01:00
|
|
|
|
self.draw_contact(jid, account)
|
|
|
|
|
self.draw_avatar(jid, account)
|
|
|
|
|
# Redraw parent to change icon
|
|
|
|
|
self.draw_contact(big_brother_jid, big_brother_account)
|
|
|
|
|
return
|
|
|
|
|
|
2006-01-10 19:34:23 +01:00
|
|
|
|
if (contact.show in ('offline', 'error') or hide) and \
|
2006-11-18 21:52:28 +01:00
|
|
|
|
not showOffline and (not _('Transports') in contact.groups or \
|
|
|
|
|
gajim.connections[account].connected < 2) and \
|
|
|
|
|
len(gajim.contacts.get_contact(account, jid)) == 1 and nb_events == 0 and\
|
|
|
|
|
not _('Not in Roster') in contact.groups:
|
2005-06-12 17:14:07 +02:00
|
|
|
|
return
|
|
|
|
|
|
2006-03-24 13:55:56 +01:00
|
|
|
|
# Remove brother contacts that are already in roster to add them
|
2006-01-26 12:23:15 +01:00
|
|
|
|
# under this iter
|
2006-03-24 13:55:56 +01:00
|
|
|
|
for data in shown_family:
|
|
|
|
|
contacts = gajim.contacts.get_contact(data['account'],
|
|
|
|
|
data['jid'])
|
|
|
|
|
for c in contacts:
|
|
|
|
|
self.remove_contact(c, data['account'])
|
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
|
|
|
|
groups = contact.groups
|
2006-01-10 19:34:23 +01:00
|
|
|
|
if observer:
|
2006-01-11 09:18:40 +01:00
|
|
|
|
groups = [_('Observers')]
|
2006-02-27 00:29:49 +01:00
|
|
|
|
elif not groups:
|
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
|
|
|
|
groups = [_('General')]
|
2006-11-18 21:52:28 +01:00
|
|
|
|
for group in groups:
|
|
|
|
|
iterG = self.get_group_iter(group, account)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
if not iterG:
|
|
|
|
|
IterAcct = self.get_account_iter(account)
|
2005-12-12 16:13:31 +01:00
|
|
|
|
iterG = model.append(IterAcct, [
|
|
|
|
|
self.jabber_state_images['16']['closed'],
|
2007-01-17 00:26:38 +01:00
|
|
|
|
gobject.markup_escape_text(group), 'group',
|
2006-11-19 20:45:43 +01:00
|
|
|
|
group, account, None])
|
2006-11-18 21:52:28 +01:00
|
|
|
|
self.draw_group(group, account)
|
|
|
|
|
if model.iter_n_children(IterAcct) == 1: # We added the first one
|
|
|
|
|
self.draw_account(account)
|
|
|
|
|
if group not in gajim.groups[account]: # It can probably never append
|
|
|
|
|
if account + group in self.collapsed_rows:
|
2005-06-12 17:14:07 +02:00
|
|
|
|
ishidden = False
|
|
|
|
|
else:
|
|
|
|
|
ishidden = True
|
2006-11-18 21:52:28 +01:00
|
|
|
|
gajim.groups[account][group] = {'expand': ishidden}
|
2005-11-09 08:00:46 +01:00
|
|
|
|
if not account in self.collapsed_rows:
|
2005-06-12 17:14:07 +02:00
|
|
|
|
self.tree.expand_row((model.get_path(iterG)[0]), False)
|
|
|
|
|
|
2005-07-07 18:38:36 +02:00
|
|
|
|
typestr = 'contact'
|
2006-11-18 21:52:28 +01:00
|
|
|
|
if group == _('Transports'):
|
2005-06-12 17:14:07 +02:00
|
|
|
|
typestr = 'agent'
|
2005-12-06 18:43:21 +01:00
|
|
|
|
|
2006-01-11 03:49:37 +01:00
|
|
|
|
name = contact.get_shown_name()
|
2005-11-08 16:47:27 +01:00
|
|
|
|
# we add some values here. see draw_contact for more
|
2006-11-19 20:45:43 +01:00
|
|
|
|
model.append(iterG, (None, name, typestr, contact.jid, account, None))
|
2005-11-19 17:59:09 +01:00
|
|
|
|
|
2006-11-18 21:52:28 +01:00
|
|
|
|
if gajim.groups[account][group]['expand']:
|
2005-08-26 02:52:44 +02:00
|
|
|
|
self.tree.expand_row(model.get_path(iterG), False)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
self.draw_contact(jid, account)
|
2005-11-19 17:59:09 +01:00
|
|
|
|
self.draw_avatar(jid, account)
|
2006-01-26 12:23:15 +01:00
|
|
|
|
# put the children under this iter
|
2006-03-24 13:55:56 +01:00
|
|
|
|
for data in shown_family:
|
|
|
|
|
contacts = gajim.contacts.get_contact(data['account'],
|
|
|
|
|
data['jid'])
|
|
|
|
|
self.add_contact_to_roster(data['jid'], data['account'])
|
2005-11-19 17:59:09 +01:00
|
|
|
|
|
2006-11-18 21:52:28 +01:00
|
|
|
|
def draw_group(self, group, account):
|
|
|
|
|
iter = self.get_group_iter(group, account)
|
|
|
|
|
if not iter:
|
|
|
|
|
return
|
|
|
|
|
if self.regroup:
|
|
|
|
|
accounts = []
|
|
|
|
|
else:
|
|
|
|
|
accounts = [account]
|
2006-12-29 19:39:33 +01:00
|
|
|
|
text = group
|
|
|
|
|
if gajim.config.get('show_contacts_number'):
|
|
|
|
|
nbr_on, nbr_total = gajim.contacts.get_nb_online_total_contacts(
|
|
|
|
|
accounts = accounts, groups = [group])
|
|
|
|
|
text += ' (%s/%s)' % (repr(nbr_on), repr(nbr_total))
|
2006-11-18 21:52:28 +01:00
|
|
|
|
model = self.tree.get_model()
|
2007-01-17 00:26:38 +01:00
|
|
|
|
model.set_value(iter, 1 , gobject.markup_escape_text(text))
|
2006-11-18 21:52:28 +01:00
|
|
|
|
|
2007-01-27 19:43:28 +01:00
|
|
|
|
def add_to_not_in_the_roster(self, account, jid, nick = '', resource = ''):
|
2006-11-18 21:52:28 +01:00
|
|
|
|
''' add jid to group "not in the roster", he MUST not be in roster yet,
|
2007-02-04 14:01:04 +01:00
|
|
|
|
return contact '''
|
2006-11-18 21:52:28 +01:00
|
|
|
|
keyID = ''
|
|
|
|
|
attached_keys = gajim.config.get_per('accounts', account,
|
|
|
|
|
'attached_gpg_keys').split()
|
|
|
|
|
if jid in attached_keys:
|
|
|
|
|
keyID = attached_keys[attached_keys.index(jid) + 1]
|
2007-01-27 19:43:28 +01:00
|
|
|
|
contact = gajim.contacts.create_contact(jid = jid, name = nick,
|
|
|
|
|
groups = [_('Not in Roster')], show = 'not in roster', status = '',
|
|
|
|
|
sub = 'none', resource = resource, keyID = keyID)
|
2006-11-18 21:52:28 +01:00
|
|
|
|
gajim.contacts.add_contact(account, contact)
|
|
|
|
|
self.add_contact_to_roster(contact.jid, account)
|
|
|
|
|
return contact
|
|
|
|
|
|
2006-07-19 13:01:09 +02:00
|
|
|
|
def get_self_contact_iter(self, account):
|
|
|
|
|
model = self.tree.get_model()
|
|
|
|
|
iterAcct = self.get_account_iter(account)
|
|
|
|
|
iter = model.iter_children(iterAcct)
|
|
|
|
|
if not iter:
|
|
|
|
|
return None
|
|
|
|
|
if model[iter][C_TYPE] == 'self_contact':
|
|
|
|
|
return iter
|
|
|
|
|
return None
|
|
|
|
|
|
|
|
|
|
def add_self_contact(self, account):
|
|
|
|
|
jid = gajim.get_jid_from_account(account)
|
|
|
|
|
if self.get_self_contact_iter(account):
|
|
|
|
|
self.draw_contact(jid, account)
|
|
|
|
|
self.draw_avatar(jid, account)
|
|
|
|
|
return
|
2006-09-13 18:47:58 +02:00
|
|
|
|
|
|
|
|
|
contact = gajim.contacts.get_first_contact_from_jid(account, jid)
|
|
|
|
|
if not contact:
|
|
|
|
|
return
|
|
|
|
|
showOffline = gajim.config.get('showoffline')
|
|
|
|
|
if (contact.show in ('offline', 'error')) and not showOffline and \
|
|
|
|
|
len(gajim.events.get_events(account, jid)) == 0:
|
|
|
|
|
return
|
|
|
|
|
|
2006-07-19 13:01:09 +02:00
|
|
|
|
model = self.tree.get_model()
|
|
|
|
|
iterAcct = self.get_account_iter(account)
|
|
|
|
|
model.append(iterAcct, (None, gajim.nicks[account], 'self_contact', jid,
|
2006-11-19 20:45:43 +01:00
|
|
|
|
account, None))
|
2006-07-19 13:01:09 +02:00
|
|
|
|
self.draw_contact(jid, account)
|
|
|
|
|
self.draw_avatar(jid, account)
|
|
|
|
|
|
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
|
|
|
|
def add_transport_to_roster(self, account, transport):
|
|
|
|
|
c = gajim.contacts.create_contact(jid = transport, name = transport,
|
|
|
|
|
groups = [_('Transports')], show = 'offline', status = 'offline',
|
|
|
|
|
sub = 'from')
|
|
|
|
|
gajim.contacts.add_contact(account, c)
|
2007-01-24 11:01:25 +01:00
|
|
|
|
self.add_contact_to_roster(transport, account)
|
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
|
|
|
|
|
|
|
|
|
def really_remove_contact(self, contact, account):
|
2006-07-17 21:30:53 +02:00
|
|
|
|
if not gajim.interface.instances.has_key(account):
|
|
|
|
|
# Account has been deleted during the timeout that called us
|
|
|
|
|
return
|
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
|
|
|
|
if contact.jid in gajim.newly_added[account]:
|
2005-06-12 17:14:07 +02:00
|
|
|
|
return
|
2006-11-18 21:52:28 +01:00
|
|
|
|
if gajim.jid_is_transport(contact.jid) and gajim.account_is_connected(
|
|
|
|
|
account) and gajim.config.get('show_transports_group'):
|
|
|
|
|
# It's an agent and we show them
|
2005-06-12 17:14:07 +02:00
|
|
|
|
return
|
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
|
|
|
|
if contact.jid in gajim.to_be_removed[account]:
|
|
|
|
|
gajim.to_be_removed[account].remove(contact.jid)
|
2006-11-18 21:52:28 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
hide = contact.is_hidden_from_roster()
|
|
|
|
|
|
|
|
|
|
show_offline = gajim.config.get('showoffline')
|
|
|
|
|
show_transports = gajim.config.get('show_transports_group')
|
2006-11-21 21:07:18 +01:00
|
|
|
|
|
|
|
|
|
nb_events = 0
|
|
|
|
|
jid_list = [contact.jid]
|
|
|
|
|
if contact.get_full_jid() != contact.jid:
|
|
|
|
|
jid_list.append(contact.get_full_jid())
|
|
|
|
|
for jid in jid_list:
|
|
|
|
|
# dont't count printed_chat messages
|
|
|
|
|
nb_events += gajim.events.get_nb_roster_events(account, jid, ['chat'])
|
|
|
|
|
|
2006-11-18 21:52:28 +01:00
|
|
|
|
if (_('Transports') in contact.groups and not show_transports) or \
|
|
|
|
|
((contact.show in ('offline', 'error') or hide) and not show_offline and \
|
|
|
|
|
(not _('Transports') in contact.groups or \
|
2006-11-21 21:07:18 +01:00
|
|
|
|
gajim.account_is_disconnected(account))) and nb_events == 0:
|
2006-03-30 20:07:56 +02:00
|
|
|
|
self.remove_contact(contact, account)
|
|
|
|
|
else:
|
|
|
|
|
self.draw_contact(contact.jid, account)
|
2005-11-19 17:59:09 +01:00
|
|
|
|
|
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
|
|
|
|
def remove_contact(self, contact, account):
|
|
|
|
|
'''Remove a contact from the roster'''
|
|
|
|
|
if contact.jid in gajim.to_be_removed[account]:
|
2005-06-12 17:14:07 +02:00
|
|
|
|
return
|
|
|
|
|
model = self.tree.get_model()
|
2006-03-24 13:55:56 +01:00
|
|
|
|
iters = self.get_contact_iter(contact.jid, account)
|
|
|
|
|
if not iters:
|
|
|
|
|
return
|
|
|
|
|
parent_iter = model.iter_parent(iters[0])
|
|
|
|
|
parent_type = model[parent_iter][C_TYPE]
|
|
|
|
|
# remember children to re-add them
|
|
|
|
|
children = []
|
|
|
|
|
child_iter = model.iter_children(iters[0])
|
|
|
|
|
while child_iter:
|
|
|
|
|
c_jid = model[child_iter][C_JID].decode('utf-8')
|
|
|
|
|
c_account = model[child_iter][C_ACCOUNT].decode('utf-8')
|
|
|
|
|
children.append((c_jid, c_account))
|
|
|
|
|
child_iter = model.iter_next(child_iter)
|
|
|
|
|
|
|
|
|
|
# Remove iters and group iter if they are empty
|
|
|
|
|
for i in iters:
|
2005-06-12 17:14:07 +02:00
|
|
|
|
parent_i = model.iter_parent(i)
|
|
|
|
|
model.remove(i)
|
2006-03-24 13:55:56 +01:00
|
|
|
|
if parent_type == 'group':
|
|
|
|
|
group = model[parent_i][C_JID].decode('utf-8')
|
|
|
|
|
if model.iter_n_children(parent_i) == 0:
|
|
|
|
|
model.remove(parent_i)
|
|
|
|
|
# We need to check all contacts, even offline contacts
|
|
|
|
|
for jid in gajim.contacts.get_jid_list(account):
|
|
|
|
|
if group in gajim.contacts.get_contact_with_highest_priority(
|
|
|
|
|
account, jid).groups:
|
2006-01-26 12:23:15 +01:00
|
|
|
|
break
|
2006-03-24 13:55:56 +01:00
|
|
|
|
else:
|
|
|
|
|
if gajim.groups[account].has_key(group):
|
|
|
|
|
del gajim.groups[account][group]
|
|
|
|
|
|
|
|
|
|
# re-add children
|
|
|
|
|
for child in children:
|
|
|
|
|
self.add_contact_to_roster(child[0], child[1])
|
|
|
|
|
# redraw parent
|
|
|
|
|
if parent_type == 'contact':
|
|
|
|
|
parent_jid = model[parent_iter][C_JID].decode('utf-8')
|
|
|
|
|
parent_account = model[parent_iter][C_ACCOUNT].decode('utf-8')
|
|
|
|
|
self.draw_contact(parent_jid, parent_account)
|
2005-07-18 23:08:31 +02:00
|
|
|
|
|
2006-02-26 16:08:59 +01:00
|
|
|
|
def get_appropriate_state_images(self, jid, size = '16',
|
|
|
|
|
icon_name = 'online'):
|
2005-12-12 16:13:31 +01:00
|
|
|
|
'''check jid and return the appropriate state images dict for
|
2006-11-18 21:52:28 +01:00
|
|
|
|
the demanded size. icon_name is taken into account when jid is from
|
2006-02-26 16:08:59 +01:00
|
|
|
|
transport: transport iconset doesn't contain all icons, so we fall back
|
|
|
|
|
to jabber one'''
|
2005-08-26 15:11:20 +02:00
|
|
|
|
transport = gajim.get_transport_name_from_jid(jid)
|
2006-09-13 18:47:58 +02:00
|
|
|
|
if transport and self.transports_state_images.has_key(size) and \
|
|
|
|
|
self.transports_state_images[size].has_key(transport) and icon_name in \
|
|
|
|
|
self.transports_state_images[size][transport]:
|
2005-12-12 16:13:31 +01:00
|
|
|
|
return self.transports_state_images[size][transport]
|
|
|
|
|
return self.jabber_state_images[size]
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
2005-11-15 17:48:40 +01:00
|
|
|
|
def draw_contact(self, jid, account, selected = False, focus = False):
|
2005-11-19 17:59:09 +01:00
|
|
|
|
'''draw the correct state image, name BUT not avatar'''
|
2005-11-15 20:56:49 +01:00
|
|
|
|
# focus is about if the roster window has toplevel-focus or not
|
2005-06-12 17:14:07 +02:00
|
|
|
|
model = self.tree.get_model()
|
2005-07-07 18:38:36 +02:00
|
|
|
|
iters = self.get_contact_iter(jid, account)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
if len(iters) == 0:
|
|
|
|
|
return
|
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
|
|
|
|
contact_instances = gajim.contacts.get_contact(account, jid)
|
|
|
|
|
contact = gajim.contacts.get_highest_prio_contact_from_contacts(
|
|
|
|
|
contact_instances)
|
|
|
|
|
if not contact:
|
|
|
|
|
return
|
2007-01-17 00:26:38 +01:00
|
|
|
|
name = gobject.markup_escape_text(contact.get_shown_name())
|
2007-04-25 19:09:07 +02:00
|
|
|
|
if jid in gajim.connections[account].blocked_contacts:
|
|
|
|
|
name = '<span strikethrough="true">%s</span>' % name
|
2005-11-19 17:59:09 +01:00
|
|
|
|
|
2006-11-18 21:52:28 +01:00
|
|
|
|
nb_connected_contact = 0
|
|
|
|
|
for c in contact_instances:
|
|
|
|
|
if c.show not in ('error', 'offline'):
|
|
|
|
|
nb_connected_contact += 1
|
|
|
|
|
if nb_connected_contact > 1:
|
|
|
|
|
name += ' (' + unicode(nb_connected_contact) + ')'
|
2005-11-19 17:59:09 +01:00
|
|
|
|
|
2006-02-20 18:09:14 +01:00
|
|
|
|
# show (account_name) if there are 2 contact with same jid in merged mode
|
2005-11-16 20:44:06 +01:00
|
|
|
|
if self.regroup:
|
|
|
|
|
add_acct = False
|
|
|
|
|
# look through all contacts of all accounts
|
2006-11-18 21:52:28 +01:00
|
|
|
|
for account_iter in gajim.connections:
|
|
|
|
|
if account_iter == account: # useless to add accout name
|
|
|
|
|
continue
|
|
|
|
|
for jid_iter in gajim.contacts.get_jid_list(account_iter):
|
2005-11-16 20:44:06 +01:00
|
|
|
|
# [0] cause it'fster than highest_prio
|
2006-11-18 21:52:28 +01:00
|
|
|
|
contact_iter = gajim.contacts.\
|
|
|
|
|
get_first_contact_from_jid(account_iter, jid_iter)
|
|
|
|
|
if contact_iter.get_shown_name() == \
|
|
|
|
|
contact.get_shown_name() and\
|
|
|
|
|
(jid_iter, account_iter) != (jid, account):
|
2005-11-16 20:44:06 +01:00
|
|
|
|
add_acct = True
|
|
|
|
|
break
|
|
|
|
|
if add_acct:
|
|
|
|
|
# No need to continue in other account if we already found one
|
|
|
|
|
break
|
|
|
|
|
if add_acct:
|
|
|
|
|
name += ' (' + account + ')'
|
2005-11-19 17:59:09 +01:00
|
|
|
|
|
2005-11-06 15:30:17 +01:00
|
|
|
|
# add status msg, if not empty, under contact name in the treeview
|
|
|
|
|
if contact.status and gajim.config.get('show_status_msgs_in_roster'):
|
|
|
|
|
status = contact.status.strip()
|
|
|
|
|
if status != '':
|
2006-11-18 21:52:28 +01:00
|
|
|
|
status = helpers.reduce_chars_newlines(status, max_lines = 1)
|
2005-11-06 17:29:52 +01:00
|
|
|
|
# escape markup entities and make them small italic and fg color
|
2005-11-08 15:09:56 +01:00
|
|
|
|
color = gtkgui_helpers._get_fade_color(self.tree, selected, focus)
|
2005-11-07 11:50:40 +01:00
|
|
|
|
colorstring = "#%04x%04x%04x" % (color.red, color.green, color.blue)
|
2006-11-20 09:03:05 +01:00
|
|
|
|
name += \
|
|
|
|
|
'\n<span size="small" style="italic" foreground="%s">%s</span>' \
|
2007-01-17 00:26:38 +01:00
|
|
|
|
% (colorstring, gobject.markup_escape_text(status))
|
2005-11-06 15:30:17 +01:00
|
|
|
|
|
2006-02-20 18:09:14 +01:00
|
|
|
|
iter = iters[0] # choose the icon with the first iter
|
|
|
|
|
icon_name = helpers.get_icon_name_to_show(contact, account)
|
2006-09-13 18:47:58 +02:00
|
|
|
|
# look if another resource has awaiting events
|
2006-03-25 18:05:54 +01:00
|
|
|
|
for c in contact_instances:
|
|
|
|
|
c_icon_name = helpers.get_icon_name_to_show(c, account)
|
|
|
|
|
if c_icon_name == 'message':
|
|
|
|
|
icon_name = c_icon_name
|
|
|
|
|
break
|
2006-02-20 18:09:14 +01:00
|
|
|
|
path = model.get_path(iter)
|
|
|
|
|
if model.iter_has_child(iter):
|
|
|
|
|
if not self.tree.row_expanded(path) and icon_name != 'message':
|
|
|
|
|
child_iter = model.iter_children(iter)
|
|
|
|
|
if icon_name in ('error', 'offline'):
|
|
|
|
|
# get the icon from the first child as they are sorted by show
|
|
|
|
|
child_jid = model[child_iter][C_JID].decode('utf-8')
|
2006-07-17 21:30:53 +02:00
|
|
|
|
child_account = model[child_iter][C_ACCOUNT].decode('utf-8')
|
2006-02-20 18:09:14 +01:00
|
|
|
|
child_contact = gajim.contacts.get_contact_with_highest_priority(
|
2006-07-17 21:30:53 +02:00
|
|
|
|
child_account, child_jid)
|
|
|
|
|
child_icon_name = helpers.get_icon_name_to_show(child_contact,
|
|
|
|
|
child_account)
|
2006-03-04 01:29:29 +01:00
|
|
|
|
if child_icon_name not in ('error', 'not in roster'):
|
|
|
|
|
icon_name = child_icon_name
|
2006-02-20 18:09:14 +01:00
|
|
|
|
while child_iter:
|
|
|
|
|
# a child has awaiting messages ?
|
|
|
|
|
child_jid = model[child_iter][C_JID].decode('utf-8')
|
2006-07-17 21:30:53 +02:00
|
|
|
|
child_account = model[child_iter][C_ACCOUNT].decode('utf-8')
|
2006-09-13 18:47:58 +02:00
|
|
|
|
if len(gajim.events.get_events(child_account, child_jid)):
|
2006-02-20 18:09:14 +01:00
|
|
|
|
icon_name = 'message'
|
|
|
|
|
break
|
|
|
|
|
child_iter = model.iter_next(child_iter)
|
|
|
|
|
if self.tree.row_expanded(path):
|
|
|
|
|
state_images = self.get_appropriate_state_images(jid,
|
2006-02-26 16:08:59 +01:00
|
|
|
|
size = 'opened', icon_name = icon_name)
|
2006-01-30 23:52:34 +01:00
|
|
|
|
else:
|
2006-02-20 18:09:14 +01:00
|
|
|
|
state_images = self.get_appropriate_state_images(jid,
|
2006-02-26 16:08:59 +01:00
|
|
|
|
size = 'closed', icon_name = icon_name)
|
2006-02-20 18:09:14 +01:00
|
|
|
|
else:
|
2006-03-04 10:49:53 +01:00
|
|
|
|
# redraw parent
|
2006-03-24 13:55:56 +01:00
|
|
|
|
self.draw_parent_contact(jid, account)
|
2006-02-26 16:08:59 +01:00
|
|
|
|
state_images = self.get_appropriate_state_images(jid,
|
|
|
|
|
icon_name = icon_name)
|
2006-02-20 18:09:14 +01:00
|
|
|
|
|
|
|
|
|
img = state_images[icon_name]
|
2005-11-08 16:47:27 +01:00
|
|
|
|
|
2006-02-20 18:09:14 +01:00
|
|
|
|
for iter in iters:
|
2005-11-19 17:59:09 +01:00
|
|
|
|
model[iter][C_IMG] = img
|
|
|
|
|
model[iter][C_NAME] = name
|
|
|
|
|
|
2006-03-24 13:55:56 +01:00
|
|
|
|
def draw_parent_contact(self, jid, account):
|
|
|
|
|
model = self.tree.get_model()
|
|
|
|
|
iters = self.get_contact_iter(jid, account)
|
|
|
|
|
if not len(iters):
|
|
|
|
|
return
|
|
|
|
|
parent_iter = model.iter_parent(iters[0])
|
|
|
|
|
if model[parent_iter][C_TYPE] != 'contact':
|
|
|
|
|
# parent is not a contact
|
|
|
|
|
return
|
|
|
|
|
parent_jid = model[parent_iter][C_JID].decode('utf-8')
|
2006-09-13 18:47:58 +02:00
|
|
|
|
parent_account = model[parent_iter][C_ACCOUNT].decode('utf-8')
|
|
|
|
|
self.draw_contact(parent_jid, parent_account)
|
2006-03-24 13:55:56 +01:00
|
|
|
|
|
2005-11-19 17:59:09 +01:00
|
|
|
|
def draw_avatar(self, jid, account):
|
|
|
|
|
'''draw the avatar'''
|
|
|
|
|
model = self.tree.get_model()
|
|
|
|
|
iters = self.get_contact_iter(jid, account)
|
2005-11-08 16:47:27 +01:00
|
|
|
|
if gajim.config.get('show_avatars_in_roster'):
|
2005-11-12 22:24:54 +01:00
|
|
|
|
pixbuf = gtkgui_helpers.get_avatar_pixbuf_from_cache(jid)
|
2005-11-08 16:47:27 +01:00
|
|
|
|
if pixbuf in ('ask', None):
|
|
|
|
|
scaled_pixbuf = None
|
|
|
|
|
else:
|
|
|
|
|
scaled_pixbuf = gtkgui_helpers.get_scaled_pixbuf(pixbuf, 'roster')
|
|
|
|
|
else:
|
|
|
|
|
scaled_pixbuf = None
|
2005-06-12 17:14:07 +02:00
|
|
|
|
for iter in iters:
|
2005-11-08 16:47:27 +01:00
|
|
|
|
model[iter][C_SECPIXBUF] = scaled_pixbuf
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
2005-06-13 12:49:48 +02:00
|
|
|
|
def join_gc_room(self, account, room_jid, nick, password):
|
2005-11-16 11:21:43 +01:00
|
|
|
|
'''joins the room immediatelly'''
|
2006-01-25 03:43:55 +01:00
|
|
|
|
if gajim.interface.msg_win_mgr.has_window(room_jid, account) and \
|
|
|
|
|
gajim.gc_connected[account][room_jid]:
|
2006-02-01 22:15:56 +01:00
|
|
|
|
win = gajim.interface.msg_win_mgr.get_window(room_jid, account)
|
|
|
|
|
win.window.present()
|
|
|
|
|
win.set_active_tab(room_jid, account)
|
2006-11-18 21:52:28 +01:00
|
|
|
|
dialogs.ErrorDialog(_('You are already in group chat %s') % room_jid)
|
2005-06-13 12:49:48 +02:00
|
|
|
|
return
|
2005-09-30 19:52:25 +02:00
|
|
|
|
invisible_show = gajim.SHOW_LIST.index('invisible')
|
|
|
|
|
if gajim.connections[account].connected == invisible_show:
|
2006-11-20 08:53:58 +01:00
|
|
|
|
dialogs.ErrorDialog(
|
|
|
|
|
_('You cannot join a group chat while you are invisible'))
|
2005-09-30 19:52:25 +02:00
|
|
|
|
return
|
2006-01-25 03:43:55 +01:00
|
|
|
|
if not gajim.interface.msg_win_mgr.has_window(room_jid, account):
|
2005-08-04 23:14:43 +02:00
|
|
|
|
self.new_room(room_jid, nick, account)
|
2006-01-25 03:43:55 +01:00
|
|
|
|
gc_win = gajim.interface.msg_win_mgr.get_window(room_jid, account)
|
|
|
|
|
gc_win.set_active_tab(room_jid, account)
|
2006-01-05 06:51:28 +01:00
|
|
|
|
gc_win.window.present()
|
2006-11-18 21:52:28 +01:00
|
|
|
|
gajim.connections[account].join_gc(nick, room_jid, password)
|
2005-11-13 18:24:08 +01:00
|
|
|
|
if password:
|
|
|
|
|
gajim.gc_passwords[room_jid] = password
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
2006-02-19 18:25:22 +01:00
|
|
|
|
def on_actions_menuitem_activate(self, widget):
|
|
|
|
|
self.make_menu()
|
2006-04-09 00:47:57 +02:00
|
|
|
|
|
|
|
|
|
def on_edit_menuitem_activate(self, widget):
|
2006-04-09 01:12:32 +02:00
|
|
|
|
'''need to call make_menu to build profile, avatar item'''
|
2006-04-09 00:47:57 +02:00
|
|
|
|
self.make_menu()
|
|
|
|
|
|
2005-06-12 17:14:07 +02:00
|
|
|
|
def on_bookmark_menuitem_activate(self, widget, account, bookmark):
|
2005-06-13 12:49:48 +02:00
|
|
|
|
self.join_gc_room(account, bookmark['jid'], bookmark['nick'],
|
|
|
|
|
bookmark['password'])
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
2005-07-18 11:55:55 +02:00
|
|
|
|
def on_send_server_message_menuitem_activate(self, widget, account):
|
2005-08-06 21:14:21 +02:00
|
|
|
|
server = gajim.config.get_per('accounts', account, 'hostname')
|
|
|
|
|
server += '/announce/online'
|
2005-10-20 13:17:17 +02:00
|
|
|
|
dialogs.SingleMessageWindow(account, server, 'send')
|
2005-08-06 21:14:21 +02:00
|
|
|
|
|
|
|
|
|
def on_xml_console_menuitem_activate(self, widget, account):
|
2005-11-13 16:08:47 +01:00
|
|
|
|
if gajim.interface.instances[account].has_key('xml_console'):
|
|
|
|
|
gajim.interface.instances[account]['xml_console'].window.present()
|
2005-08-06 21:14:21 +02:00
|
|
|
|
else:
|
2006-04-05 14:01:21 +02:00
|
|
|
|
gajim.interface.instances[account]['xml_console'] = \
|
|
|
|
|
dialogs.XMLConsoleWindow(account)
|
2005-07-18 11:55:55 +02:00
|
|
|
|
|
2006-07-17 21:30:53 +02:00
|
|
|
|
def on_privacy_lists_menuitem_activate(self, widget, account):
|
|
|
|
|
if gajim.interface.instances[account].has_key('privacy_lists'):
|
|
|
|
|
gajim.interface.instances[account]['privacy_lists'].window.present()
|
|
|
|
|
else:
|
|
|
|
|
gajim.interface.instances[account]['privacy_lists'] = \
|
|
|
|
|
dialogs.PrivacyListsWindow(account)
|
2007-04-24 21:56:24 +02:00
|
|
|
|
|
|
|
|
|
def on_blocked_contacts_menuitem_activate(self, widget, account):
|
|
|
|
|
if gajim.interface.instances[account].has_key('blocked_contacts'):
|
|
|
|
|
gajim.interface.instances[account]['blocked_contacts'].window.present()
|
|
|
|
|
else:
|
|
|
|
|
gajim.interface.instances[account]['blocked_contacts'] = \
|
|
|
|
|
dialogs.BlockedContactsWindow(account)
|
2006-07-17 21:30:53 +02:00
|
|
|
|
|
2005-07-18 11:55:55 +02:00
|
|
|
|
def on_set_motd_menuitem_activate(self, widget, account):
|
2005-08-06 21:14:21 +02:00
|
|
|
|
server = gajim.config.get_per('accounts', account, 'hostname')
|
|
|
|
|
server += '/announce/motd'
|
2005-10-20 13:17:17 +02:00
|
|
|
|
dialogs.SingleMessageWindow(account, server, 'send')
|
2005-07-18 11:55:55 +02:00
|
|
|
|
|
|
|
|
|
def on_update_motd_menuitem_activate(self, widget, account):
|
2005-08-06 21:14:21 +02:00
|
|
|
|
server = gajim.config.get_per('accounts', account, 'hostname')
|
|
|
|
|
server += '/announce/motd/update'
|
2005-10-20 13:17:17 +02:00
|
|
|
|
dialogs.SingleMessageWindow(account, server, 'send')
|
2005-07-18 11:55:55 +02:00
|
|
|
|
|
|
|
|
|
def on_delete_motd_menuitem_activate(self, widget, account):
|
2005-08-06 21:14:21 +02:00
|
|
|
|
server = gajim.config.get_per('accounts', account, 'hostname')
|
|
|
|
|
server += '/announce/motd/delete'
|
2005-12-06 18:43:21 +01:00
|
|
|
|
gajim.connections[account].send_motd(server)
|
|
|
|
|
|
2006-03-21 15:26:01 +01:00
|
|
|
|
def on_history_manager_menuitem_activate(self, widget):
|
2006-03-27 15:43:58 +02:00
|
|
|
|
if os.name == 'nt':
|
|
|
|
|
if os.path.exists('history_manager.exe'): # user is running stable
|
2006-09-13 18:47:58 +02:00
|
|
|
|
helpers.exec_command('history_manager.exe')
|
2006-03-27 15:43:58 +02:00
|
|
|
|
else: # user is running svn
|
2006-11-28 13:49:36 +01:00
|
|
|
|
helpers.exec_command('python history_manager.py')
|
2006-03-27 15:40:51 +02:00
|
|
|
|
else: # Unix user
|
2006-11-28 13:49:36 +01:00
|
|
|
|
helpers.exec_command('python history_manager.py &')
|
2005-08-06 21:14:21 +02:00
|
|
|
|
|
|
|
|
|
def get_and_connect_advanced_menuitem_menu(self, account):
|
2006-03-22 02:09:59 +01:00
|
|
|
|
'''adds FOR ACCOUNT options'''
|
2006-05-02 17:53:25 +02:00
|
|
|
|
xml = gtkgui_helpers.get_glade('advanced_menuitem_menu.glade')
|
2005-08-06 21:14:21 +02:00
|
|
|
|
advanced_menuitem_menu = xml.get_widget('advanced_menuitem_menu')
|
2005-12-06 18:43:21 +01:00
|
|
|
|
|
2005-08-06 21:14:21 +02:00
|
|
|
|
send_single_message_menuitem = xml.get_widget(
|
|
|
|
|
'send_single_message_menuitem')
|
|
|
|
|
xml_console_menuitem = xml.get_widget('xml_console_menuitem')
|
2007-04-24 21:56:24 +02:00
|
|
|
|
blocked_contacts_menuitem = xml.get_widget('blocked_contacts_menuitem')
|
2006-07-17 21:30:53 +02:00
|
|
|
|
privacy_lists_menuitem = xml.get_widget('privacy_lists_menuitem')
|
2005-08-06 21:14:21 +02:00
|
|
|
|
administrator_menuitem = xml.get_widget('administrator_menuitem')
|
|
|
|
|
send_server_message_menuitem = xml.get_widget(
|
|
|
|
|
'send_server_message_menuitem')
|
|
|
|
|
set_motd_menuitem = xml.get_widget('set_motd_menuitem')
|
|
|
|
|
update_motd_menuitem = xml.get_widget('update_motd_menuitem')
|
|
|
|
|
delete_motd_menuitem = xml.get_widget('delete_motd_menuitem')
|
2005-12-06 18:43:21 +01:00
|
|
|
|
|
2005-08-06 21:14:21 +02:00
|
|
|
|
xml_console_menuitem.connect('activate',
|
|
|
|
|
self.on_xml_console_menuitem_activate, account)
|
|
|
|
|
|
2006-11-20 08:53:58 +01:00
|
|
|
|
if gajim.connections[account] and gajim.connections[account].\
|
|
|
|
|
privacy_rules_supported:
|
2007-04-24 21:56:24 +02:00
|
|
|
|
blocked_contacts_menuitem.connect('activate',
|
|
|
|
|
self.on_blocked_contacts_menuitem_activate, account)
|
2006-11-18 21:52:28 +01:00
|
|
|
|
privacy_lists_menuitem.connect('activate',
|
|
|
|
|
self.on_privacy_lists_menuitem_activate, account)
|
|
|
|
|
else:
|
2007-04-24 21:56:24 +02:00
|
|
|
|
blocked_contacts_menuitem.set_sensitive(False)
|
2006-11-18 21:52:28 +01:00
|
|
|
|
privacy_lists_menuitem.set_sensitive(False)
|
|
|
|
|
|
|
|
|
|
if gajim.connections[account].is_zeroconf:
|
|
|
|
|
send_single_message_menuitem.set_sensitive(False)
|
|
|
|
|
administrator_menuitem.set_sensitive(False)
|
|
|
|
|
send_server_message_menuitem.set_sensitive(False)
|
|
|
|
|
set_motd_menuitem.set_sensitive(False)
|
|
|
|
|
update_motd_menuitem.set_sensitive(False)
|
|
|
|
|
delete_motd_menuitem.set_sensitive(False)
|
|
|
|
|
else:
|
|
|
|
|
send_single_message_menuitem.connect('activate',
|
|
|
|
|
self.on_send_single_message_menuitem_activate, account)
|
|
|
|
|
|
|
|
|
|
send_server_message_menuitem.connect('activate',
|
|
|
|
|
self.on_send_server_message_menuitem_activate, account)
|
2005-08-06 21:14:21 +02:00
|
|
|
|
|
2006-11-18 21:52:28 +01:00
|
|
|
|
set_motd_menuitem.connect('activate',
|
|
|
|
|
self.on_set_motd_menuitem_activate, account)
|
2005-08-06 21:14:21 +02:00
|
|
|
|
|
2006-11-18 21:52:28 +01:00
|
|
|
|
update_motd_menuitem.connect('activate',
|
|
|
|
|
self.on_update_motd_menuitem_activate, account)
|
2005-12-06 18:43:21 +01:00
|
|
|
|
|
2006-11-18 21:52:28 +01:00
|
|
|
|
delete_motd_menuitem.connect('activate',
|
|
|
|
|
self.on_delete_motd_menuitem_activate, account)
|
2005-12-06 18:43:21 +01:00
|
|
|
|
|
2005-08-06 22:16:50 +02:00
|
|
|
|
advanced_menuitem_menu.show_all()
|
2005-12-06 18:43:21 +01:00
|
|
|
|
|
2005-08-06 21:14:21 +02:00
|
|
|
|
return advanced_menuitem_menu
|
2005-07-18 11:55:55 +02:00
|
|
|
|
|
2005-06-12 17:14:07 +02:00
|
|
|
|
def make_menu(self):
|
2005-07-07 17:41:03 +02:00
|
|
|
|
'''create the main window's menus'''
|
2006-02-19 23:21:25 +01:00
|
|
|
|
if not self.actions_menu_needs_rebuild:
|
2006-02-19 18:25:22 +01:00
|
|
|
|
return
|
2006-04-18 17:17:07 +02:00
|
|
|
|
new_chat_menuitem = self.xml.get_widget('new_chat_menuitem')
|
2005-06-12 17:14:07 +02:00
|
|
|
|
join_gc_menuitem = self.xml.get_widget('join_gc_menuitem')
|
2006-11-18 21:52:28 +01:00
|
|
|
|
muc_icon = self.load_icon('muc_active')
|
|
|
|
|
if muc_icon:
|
|
|
|
|
join_gc_menuitem.set_image(muc_icon)
|
2006-01-08 08:50:26 +01:00
|
|
|
|
add_new_contact_menuitem = self.xml.get_widget('add_new_contact_menuitem')
|
|
|
|
|
service_disco_menuitem = self.xml.get_widget('service_disco_menuitem')
|
2005-07-06 15:34:47 +02:00
|
|
|
|
advanced_menuitem = self.xml.get_widget('advanced_menuitem')
|
2006-04-09 00:47:57 +02:00
|
|
|
|
profile_avatar_menuitem = self.xml.get_widget('profile_avatar_menuitem')
|
2005-12-06 18:43:21 +01:00
|
|
|
|
|
2006-04-07 23:50:27 +02:00
|
|
|
|
# destroy old advanced menus
|
|
|
|
|
for m in self.advanced_menus:
|
|
|
|
|
m.destroy()
|
|
|
|
|
|
2005-08-18 18:51:03 +02:00
|
|
|
|
# make it sensitive. it is insensitive only if no accounts are *available*
|
|
|
|
|
advanced_menuitem.set_sensitive(True)
|
2005-08-06 22:16:50 +02:00
|
|
|
|
|
2005-06-12 17:14:07 +02:00
|
|
|
|
if self.add_new_contact_handler_id:
|
2005-07-06 15:34:47 +02:00
|
|
|
|
add_new_contact_menuitem.handler_disconnect(
|
|
|
|
|
self.add_new_contact_handler_id)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
self.add_new_contact_handler_id = None
|
2005-07-07 17:41:03 +02:00
|
|
|
|
|
2005-06-12 17:14:07 +02:00
|
|
|
|
if self.service_disco_handler_id:
|
|
|
|
|
service_disco_menuitem.handler_disconnect(
|
2005-06-13 12:21:12 +02:00
|
|
|
|
self.service_disco_handler_id)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
self.service_disco_handler_id = None
|
2005-12-06 18:43:21 +01:00
|
|
|
|
|
2006-04-18 17:17:07 +02:00
|
|
|
|
if self.new_chat_menuitem_handler_id:
|
|
|
|
|
new_chat_menuitem.handler_disconnect(
|
|
|
|
|
self.new_chat_menuitem_handler_id)
|
|
|
|
|
self.new_chat_menuitem_handler_id = None
|
2005-12-06 18:43:21 +01:00
|
|
|
|
|
2006-04-09 00:47:57 +02:00
|
|
|
|
if self.profile_avatar_menuitem_handler_id:
|
|
|
|
|
profile_avatar_menuitem.handler_disconnect(
|
|
|
|
|
self.profile_avatar_menuitem_handler_id)
|
|
|
|
|
self.profile_avatar_menuitem_handler_id = None
|
|
|
|
|
|
|
|
|
|
|
2006-01-08 06:05:16 +01:00
|
|
|
|
# remove the existing submenus
|
2005-06-12 17:14:07 +02:00
|
|
|
|
add_new_contact_menuitem.remove_submenu()
|
|
|
|
|
service_disco_menuitem.remove_submenu()
|
|
|
|
|
join_gc_menuitem.remove_submenu()
|
2006-04-18 17:17:07 +02:00
|
|
|
|
new_chat_menuitem.remove_submenu()
|
2005-08-14 23:52:48 +02:00
|
|
|
|
advanced_menuitem.remove_submenu()
|
2006-04-09 00:47:57 +02:00
|
|
|
|
profile_avatar_menuitem.remove_submenu()
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
2006-01-08 06:05:16 +01:00
|
|
|
|
# remove the existing accelerator
|
2006-04-18 17:17:07 +02:00
|
|
|
|
if self.have_new_chat_accel:
|
2005-07-05 22:47:25 +02:00
|
|
|
|
ag = gtk.accel_groups_from_object(self.window)[0]
|
2006-04-18 17:17:07 +02:00
|
|
|
|
new_chat_menuitem.remove_accelerator(ag, gtk.keysyms.n,
|
2005-08-06 21:14:21 +02:00
|
|
|
|
gtk.gdk.CONTROL_MASK)
|
2006-04-18 17:17:07 +02:00
|
|
|
|
self.have_new_chat_accel = False
|
2005-07-05 22:47:25 +02:00
|
|
|
|
|
2006-04-07 22:22:12 +02:00
|
|
|
|
gc_sub_menu = gtk.Menu() # gc is always a submenu
|
|
|
|
|
join_gc_menuitem.set_submenu(gc_sub_menu)
|
|
|
|
|
|
2006-04-08 12:28:53 +02:00
|
|
|
|
connected_accounts = gajim.get_number_of_connected_accounts()
|
2006-04-07 22:22:12 +02:00
|
|
|
|
if connected_accounts > 1: # 2 or more accounts? make submenus
|
|
|
|
|
add_sub_menu = gtk.Menu()
|
|
|
|
|
disco_sub_menu = gtk.Menu()
|
2006-04-18 17:17:07 +02:00
|
|
|
|
new_chat_sub_menu = gtk.Menu()
|
2006-09-13 18:47:58 +02:00
|
|
|
|
|
2006-11-18 21:52:28 +01:00
|
|
|
|
accounts_list = gajim.contacts.get_accounts()
|
|
|
|
|
accounts_list.sort()
|
|
|
|
|
for account in accounts_list:
|
2006-04-08 12:33:13 +02:00
|
|
|
|
if gajim.connections[account].connected <= 1:
|
|
|
|
|
# if offline or connecting
|
2006-04-07 22:22:12 +02:00
|
|
|
|
continue
|
2006-11-18 21:52:28 +01:00
|
|
|
|
|
|
|
|
|
# new chat
|
|
|
|
|
new_chat_item = gtk.MenuItem(_('using account %s') % account,
|
|
|
|
|
False)
|
|
|
|
|
new_chat_sub_menu.append(new_chat_item)
|
|
|
|
|
new_chat_item.connect('activate',
|
|
|
|
|
self.on_new_chat_menuitem_activate, account)
|
|
|
|
|
|
|
|
|
|
if gajim.config.get_per('accounts', account, 'is_zeroconf'):
|
|
|
|
|
continue
|
|
|
|
|
|
2006-04-07 22:22:12 +02:00
|
|
|
|
# join gc
|
2005-06-12 17:14:07 +02:00
|
|
|
|
label = gtk.Label()
|
|
|
|
|
label.set_markup('<u>' + account.upper() +'</u>')
|
2006-01-08 06:05:16 +01:00
|
|
|
|
label.set_use_underline(False)
|
2006-04-07 22:22:12 +02:00
|
|
|
|
gc_item = gtk.MenuItem()
|
|
|
|
|
gc_item.add(label)
|
2006-11-18 21:52:28 +01:00
|
|
|
|
gc_item.connect('state-changed',
|
|
|
|
|
gtkgui_helpers.on_bm_header_changed_state)
|
2006-04-07 22:22:12 +02:00
|
|
|
|
gc_sub_menu.append(gc_item)
|
|
|
|
|
|
2006-04-09 13:13:39 +02:00
|
|
|
|
self.add_bookmarks_list(gc_sub_menu, account)
|
2006-04-07 22:22:12 +02:00
|
|
|
|
|
2006-11-18 21:52:28 +01:00
|
|
|
|
# the 'manage gc bookmarks' item is shown
|
2006-04-08 12:33:13 +02:00
|
|
|
|
# below to avoid duplicate code
|
2006-04-07 22:22:12 +02:00
|
|
|
|
|
|
|
|
|
# add
|
|
|
|
|
add_item = gtk.MenuItem(_('to %s account') % account, False)
|
|
|
|
|
add_sub_menu.append(add_item)
|
|
|
|
|
add_item.connect('activate', self.on_add_new_contact, account)
|
|
|
|
|
|
|
|
|
|
# disco
|
|
|
|
|
disco_item = gtk.MenuItem(_('using %s account') % account, False)
|
|
|
|
|
disco_sub_menu.append(disco_item)
|
2006-04-08 12:33:13 +02:00
|
|
|
|
disco_item.connect('activate',
|
|
|
|
|
self.on_service_disco_menuitem_activate, account)
|
2006-04-07 22:22:12 +02:00
|
|
|
|
|
2006-09-13 18:47:58 +02:00
|
|
|
|
|
|
|
|
|
add_new_contact_menuitem.set_submenu(add_sub_menu)
|
|
|
|
|
add_sub_menu.show_all()
|
|
|
|
|
service_disco_menuitem.set_submenu(disco_sub_menu)
|
|
|
|
|
disco_sub_menu.show_all()
|
|
|
|
|
new_chat_menuitem.set_submenu(new_chat_sub_menu)
|
|
|
|
|
new_chat_sub_menu.show_all()
|
2006-04-07 22:22:12 +02:00
|
|
|
|
|
|
|
|
|
elif connected_accounts == 1: # user has only one account
|
|
|
|
|
for account in gajim.connections:
|
2006-11-18 21:52:28 +01:00
|
|
|
|
if gajim.account_is_connected(account): # THE connected account
|
2006-04-07 22:22:12 +02:00
|
|
|
|
# gc
|
2006-04-09 13:13:39 +02:00
|
|
|
|
self.add_bookmarks_list(gc_sub_menu, account)
|
2006-04-07 22:22:12 +02:00
|
|
|
|
# add
|
|
|
|
|
if not self.add_new_contact_handler_id:
|
2006-04-08 12:33:13 +02:00
|
|
|
|
self.add_new_contact_handler_id =\
|
|
|
|
|
add_new_contact_menuitem.connect(
|
2006-04-07 22:22:12 +02:00
|
|
|
|
'activate', self.on_add_new_contact, account)
|
|
|
|
|
# disco
|
|
|
|
|
if not self.service_disco_handler_id:
|
2006-11-20 08:53:58 +01:00
|
|
|
|
self.service_disco_handler_id = service_disco_menuitem.\
|
|
|
|
|
connect('activate',
|
|
|
|
|
self.on_service_disco_menuitem_activate, account)
|
2006-04-18 17:17:07 +02:00
|
|
|
|
# new chat
|
|
|
|
|
if not self.new_chat_menuitem_handler_id:
|
|
|
|
|
self.new_chat_menuitem_handler_id = new_chat_menuitem.\
|
|
|
|
|
connect('activate', self.on_new_chat_menuitem_activate,
|
2006-04-08 12:33:13 +02:00
|
|
|
|
account)
|
2006-04-18 17:17:07 +02:00
|
|
|
|
# new chat accel
|
|
|
|
|
if not self.have_new_chat_accel:
|
2006-04-07 22:22:12 +02:00
|
|
|
|
ag = gtk.accel_groups_from_object(self.window)[0]
|
2006-04-18 17:17:07 +02:00
|
|
|
|
new_chat_menuitem.add_accelerator('activate', ag,
|
2006-04-07 22:22:12 +02:00
|
|
|
|
gtk.keysyms.n, gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE)
|
2006-04-18 17:17:07 +02:00
|
|
|
|
self.have_new_chat_accel = True
|
2006-04-09 00:47:57 +02:00
|
|
|
|
|
2006-04-07 22:22:12 +02:00
|
|
|
|
break # No other account connected
|
|
|
|
|
|
2006-04-08 12:33:13 +02:00
|
|
|
|
if connected_accounts == 0:
|
|
|
|
|
# no connected accounts, make the menuitems insensitive
|
2006-11-18 21:52:28 +01:00
|
|
|
|
for item in [new_chat_menuitem, join_gc_menuitem,\
|
|
|
|
|
add_new_contact_menuitem, service_disco_menuitem]:
|
|
|
|
|
item.set_sensitive(False)
|
2006-04-07 22:22:12 +02:00
|
|
|
|
else: # we have one or more connected accounts
|
2006-11-18 21:52:28 +01:00
|
|
|
|
for item in [new_chat_menuitem, join_gc_menuitem,\
|
|
|
|
|
add_new_contact_menuitem, service_disco_menuitem]:
|
|
|
|
|
item.set_sensitive(True)
|
|
|
|
|
|
|
|
|
|
# disable some fields if only local account is there
|
|
|
|
|
if connected_accounts == 1:
|
|
|
|
|
for account in gajim.connections:
|
|
|
|
|
if gajim.account_is_connected(account) and \
|
|
|
|
|
gajim.connections[account].is_zeroconf:
|
|
|
|
|
for item in [join_gc_menuitem,\
|
|
|
|
|
add_new_contact_menuitem, service_disco_menuitem]:
|
|
|
|
|
item.set_sensitive(False)
|
|
|
|
|
|
2006-04-08 12:33:13 +02:00
|
|
|
|
# show the 'manage gc bookmarks' item
|
2006-03-21 15:26:01 +01:00
|
|
|
|
newitem = gtk.SeparatorMenuItem() # separator
|
2006-04-07 22:22:12 +02:00
|
|
|
|
gc_sub_menu.append(newitem)
|
2005-12-06 18:43:21 +01:00
|
|
|
|
|
2006-09-13 18:47:58 +02:00
|
|
|
|
connected_accounts_with_vcard = []
|
|
|
|
|
for account in gajim.connections:
|
2006-11-18 21:52:28 +01:00
|
|
|
|
if gajim.account_is_connected(account) and \
|
2006-09-13 18:47:58 +02:00
|
|
|
|
gajim.connections[account].vcard_supported:
|
|
|
|
|
connected_accounts_with_vcard.append(account)
|
|
|
|
|
if len(connected_accounts_with_vcard) > 1:
|
|
|
|
|
# 2 or more accounts? make submenus
|
|
|
|
|
profile_avatar_sub_menu = gtk.Menu()
|
|
|
|
|
for account in connected_accounts_with_vcard:
|
|
|
|
|
# profile, avatar
|
|
|
|
|
profile_avatar_item = gtk.MenuItem(_('of account %s') % account,
|
2007-02-04 14:01:04 +01:00
|
|
|
|
False)
|
2006-09-13 18:47:58 +02:00
|
|
|
|
profile_avatar_sub_menu.append(profile_avatar_item)
|
|
|
|
|
profile_avatar_item.connect('activate',
|
|
|
|
|
self.on_profile_avatar_menuitem_activate, account)
|
|
|
|
|
profile_avatar_menuitem.set_submenu(profile_avatar_sub_menu)
|
|
|
|
|
profile_avatar_sub_menu.show_all()
|
|
|
|
|
elif len(connected_accounts_with_vcard) == 1: # user has only one account
|
|
|
|
|
account = connected_accounts_with_vcard[0]
|
|
|
|
|
# profile, avatar
|
|
|
|
|
if not self.profile_avatar_menuitem_handler_id:
|
|
|
|
|
self.profile_avatar_menuitem_handler_id = \
|
|
|
|
|
profile_avatar_menuitem.connect('activate', self.\
|
|
|
|
|
on_profile_avatar_menuitem_activate, account)
|
|
|
|
|
|
|
|
|
|
if len(connected_accounts_with_vcard) == 0:
|
|
|
|
|
profile_avatar_menuitem.set_sensitive(False)
|
|
|
|
|
else:
|
|
|
|
|
profile_avatar_menuitem.set_sensitive(True)
|
|
|
|
|
|
2006-11-18 21:52:28 +01:00
|
|
|
|
newitem = gtk.ImageMenuItem(_('_Manage Bookmarks...'))
|
2005-07-06 16:34:59 +02:00
|
|
|
|
img = gtk.image_new_from_stock(gtk.STOCK_PREFERENCES,
|
|
|
|
|
gtk.ICON_SIZE_MENU)
|
|
|
|
|
newitem.set_image(img)
|
2006-11-18 21:52:28 +01:00
|
|
|
|
newitem.connect('activate',
|
|
|
|
|
self.on_manage_bookmarks_menuitem_activate)
|
2006-04-07 22:22:12 +02:00
|
|
|
|
gc_sub_menu.append(newitem)
|
|
|
|
|
gc_sub_menu.show_all()
|
|
|
|
|
|
2006-04-08 12:33:13 +02:00
|
|
|
|
# Advanced Actions
|
2006-04-06 20:37:24 +02:00
|
|
|
|
if len(gajim.connections) == 0: # user has no accounts
|
|
|
|
|
advanced_menuitem.set_sensitive(False)
|
2006-04-08 12:33:13 +02:00
|
|
|
|
elif len(gajim.connections) == 1: # we have one acccount
|
|
|
|
|
account = gajim.connections.keys()[0]
|
2006-04-08 03:25:16 +02:00
|
|
|
|
advanced_menuitem_menu = self.get_and_connect_advanced_menuitem_menu(
|
2006-04-08 12:33:13 +02:00
|
|
|
|
account)
|
2006-04-07 23:50:27 +02:00
|
|
|
|
self.advanced_menus.append(advanced_menuitem_menu)
|
2006-04-06 20:37:24 +02:00
|
|
|
|
|
|
|
|
|
self._add_history_manager_menuitem(advanced_menuitem_menu)
|
|
|
|
|
|
|
|
|
|
advanced_menuitem.set_submenu(advanced_menuitem_menu)
|
|
|
|
|
advanced_menuitem_menu.show_all()
|
2006-04-07 22:22:12 +02:00
|
|
|
|
else: # user has *more* than one account : build advanced submenus
|
|
|
|
|
advanced_sub_menu = gtk.Menu()
|
2006-11-18 21:52:28 +01:00
|
|
|
|
accounts = [] # Put accounts in a list to sort them
|
2005-07-07 17:41:03 +02:00
|
|
|
|
for account in gajim.connections:
|
2006-11-18 21:52:28 +01:00
|
|
|
|
accounts.append(account)
|
|
|
|
|
accounts.sort()
|
|
|
|
|
for account in accounts:
|
2006-04-07 22:22:12 +02:00
|
|
|
|
advanced_item = gtk.MenuItem(_('for account %s') % account, False)
|
|
|
|
|
advanced_sub_menu.append(advanced_item)
|
2006-11-20 08:53:58 +01:00
|
|
|
|
advanced_menuitem_menu = \
|
|
|
|
|
self.get_and_connect_advanced_menuitem_menu(account)
|
2006-04-07 23:50:27 +02:00
|
|
|
|
self.advanced_menus.append(advanced_menuitem_menu)
|
2006-04-07 22:22:12 +02:00
|
|
|
|
advanced_item.set_submenu(advanced_menuitem_menu)
|
2006-03-21 15:26:01 +01:00
|
|
|
|
|
2006-04-07 22:22:12 +02:00
|
|
|
|
self._add_history_manager_menuitem(advanced_sub_menu)
|
2006-03-22 02:09:59 +01:00
|
|
|
|
|
2006-04-07 22:22:12 +02:00
|
|
|
|
advanced_menuitem.set_submenu(advanced_sub_menu)
|
|
|
|
|
advanced_sub_menu.show_all()
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
2006-02-19 22:28:41 +01:00
|
|
|
|
self.actions_menu_needs_rebuild = False
|
2006-02-19 18:25:22 +01:00
|
|
|
|
|
2006-03-22 02:09:59 +01:00
|
|
|
|
def _add_history_manager_menuitem(self, menu):
|
|
|
|
|
'''adds a seperator and History Manager menuitem BELOW for account
|
|
|
|
|
menuitems'''
|
|
|
|
|
item = gtk.SeparatorMenuItem() # separator
|
|
|
|
|
menu.append(item)
|
|
|
|
|
|
|
|
|
|
# History manager
|
|
|
|
|
item = gtk.ImageMenuItem(_('History Manager'))
|
|
|
|
|
icon = gtk.image_new_from_stock(gtk.STOCK_JUSTIFY_FILL,
|
|
|
|
|
gtk.ICON_SIZE_MENU)
|
|
|
|
|
item.set_image(icon)
|
|
|
|
|
menu.append(item)
|
|
|
|
|
item.connect('activate', self.on_history_manager_menuitem_activate)
|
2006-04-07 22:22:12 +02:00
|
|
|
|
|
2006-04-09 13:13:39 +02:00
|
|
|
|
def add_bookmarks_list(self, gc_sub_menu, account):
|
2006-11-18 21:52:28 +01:00
|
|
|
|
'''Show join new group chat item and bookmarks list for an account'''
|
|
|
|
|
item = gtk.MenuItem(_('_Join New Group Chat'))
|
2006-04-07 22:22:12 +02:00
|
|
|
|
item.connect('activate', self.on_join_gc_activate, account)
|
|
|
|
|
gc_sub_menu.append(item)
|
|
|
|
|
|
|
|
|
|
for bookmark in gajim.connections[account].bookmarks:
|
|
|
|
|
item = gtk.MenuItem(bookmark['name'], False) # Do not use underline
|
|
|
|
|
item.connect('activate', self.on_bookmark_menuitem_activate,
|
|
|
|
|
account, bookmark)
|
|
|
|
|
gc_sub_menu.append(item)
|
2006-03-22 02:09:59 +01:00
|
|
|
|
|
2005-09-19 17:23:18 +02:00
|
|
|
|
def _change_style(self, model, path, iter, option):
|
2006-11-20 23:22:30 +01:00
|
|
|
|
if option is None or model[iter][C_TYPE] == option:
|
|
|
|
|
# We changed style for this type of row
|
2005-09-19 17:23:18 +02:00
|
|
|
|
model[iter][C_NAME] = model[iter][C_NAME]
|
|
|
|
|
|
|
|
|
|
def change_roster_style(self, option):
|
|
|
|
|
model = self.tree.get_model()
|
|
|
|
|
model.foreach(self._change_style, option)
|
2006-01-06 02:48:59 +01:00
|
|
|
|
for win in gajim.interface.msg_win_mgr.windows():
|
|
|
|
|
win.repaint_themed_widgets()
|
2006-04-11 09:27:04 +02:00
|
|
|
|
|
2005-06-12 17:14:07 +02:00
|
|
|
|
def draw_roster(self):
|
2006-04-11 01:30:18 +02:00
|
|
|
|
'''clear and draw roster'''
|
2006-02-03 13:17:34 +01:00
|
|
|
|
# clear the model, only if it is not empty
|
2006-04-11 01:30:18 +02:00
|
|
|
|
model = self.tree.get_model()
|
|
|
|
|
if model:
|
|
|
|
|
model.clear()
|
2005-06-12 17:14:07 +02:00
|
|
|
|
for acct in gajim.connections:
|
|
|
|
|
self.add_account_to_roster(acct)
|
2006-02-19 23:20:45 +01:00
|
|
|
|
self.add_account_contacts(acct)
|
2006-04-11 09:27:04 +02:00
|
|
|
|
|
2006-02-19 23:20:45 +01:00
|
|
|
|
def add_account_contacts(self, account):
|
2006-04-11 01:30:18 +02:00
|
|
|
|
'''adds contacts of group to roster treeview'''
|
2006-02-19 23:20:45 +01:00
|
|
|
|
for jid in gajim.contacts.get_jid_list(account):
|
|
|
|
|
self.add_contact_to_roster(jid, account)
|
2006-09-13 18:47:58 +02:00
|
|
|
|
self.draw_account(account)
|
2006-04-11 09:27:04 +02:00
|
|
|
|
|
2006-04-11 01:30:18 +02:00
|
|
|
|
def fire_up_unread_messages_events(self, account):
|
|
|
|
|
'''reads from db the unread messages, and fire them up'''
|
|
|
|
|
for jid in gajim.contacts.get_jid_list(account):
|
2006-04-11 01:06:11 +02:00
|
|
|
|
results = gajim.logger.get_unread_msgs_for_jid(jid)
|
2006-04-11 00:36:55 +02:00
|
|
|
|
for result in results:
|
|
|
|
|
tim = time.localtime(float(result[2]))
|
2006-04-11 09:27:04 +02:00
|
|
|
|
self.on_message(jid, result[1], tim, account, msg_type = 'chat',
|
|
|
|
|
msg_id = result[0])
|
|
|
|
|
|
2005-07-22 16:30:35 +02:00
|
|
|
|
def fill_contacts_and_groups_dicts(self, array, account):
|
2005-07-18 23:08:31 +02:00
|
|
|
|
'''fill gajim.contacts and gajim.groups'''
|
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
|
|
|
|
if account not in gajim.contacts.get_accounts():
|
|
|
|
|
gajim.contacts.add_account(account)
|
2005-07-18 23:08:31 +02:00
|
|
|
|
if not gajim.groups.has_key(account):
|
|
|
|
|
gajim.groups[account] = {}
|
2005-06-12 17:14:07 +02:00
|
|
|
|
for jid in array.keys():
|
|
|
|
|
jids = jid.split('/')
|
|
|
|
|
#get jid
|
|
|
|
|
ji = jids[0]
|
|
|
|
|
#get resource
|
|
|
|
|
resource = ''
|
|
|
|
|
if len(jids) > 1:
|
|
|
|
|
resource = '/'.join(jids[1:])
|
|
|
|
|
#get name
|
|
|
|
|
name = array[jid]['name']
|
|
|
|
|
if not name:
|
2006-01-10 19:30:57 +01:00
|
|
|
|
name = ''
|
2005-06-12 17:14:07 +02:00
|
|
|
|
show = 'offline' # show is offline by default
|
|
|
|
|
status = '' #no status message by default
|
|
|
|
|
|
|
|
|
|
keyID = ''
|
|
|
|
|
attached_keys = gajim.config.get_per('accounts', account,
|
|
|
|
|
'attached_gpg_keys').split()
|
|
|
|
|
if jid in attached_keys:
|
|
|
|
|
keyID = attached_keys[attached_keys.index(jid) + 1]
|
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
|
|
|
|
contact1 = gajim.contacts.create_contact(jid = ji, name = name,
|
|
|
|
|
groups = array[jid]['groups'], show = show, status = status,
|
|
|
|
|
sub = array[jid]['subscription'], ask = array[jid]['ask'],
|
|
|
|
|
resource = resource, keyID = keyID)
|
|
|
|
|
gajim.contacts.add_contact(account, contact1)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
|
|
|
|
# when we draw the roster, we avoid having the same contact
|
2005-07-22 16:30:35 +02:00
|
|
|
|
# more than once (f.e. we avoid showing it twice when 2 resources)
|
2005-11-15 20:56:49 +01:00
|
|
|
|
for g in array[jid]['groups']:
|
2005-07-18 23:08:31 +02:00
|
|
|
|
if g in gajim.groups[account].keys():
|
2005-06-12 17:14:07 +02:00
|
|
|
|
continue
|
|
|
|
|
|
|
|
|
|
if account + g in self.collapsed_rows:
|
|
|
|
|
ishidden = False
|
|
|
|
|
else:
|
|
|
|
|
ishidden = True
|
2005-07-18 23:08:31 +02:00
|
|
|
|
gajim.groups[account][g] = { 'expand': ishidden }
|
2005-11-16 00:26:22 +01:00
|
|
|
|
if gajim.config.get('ask_avatars_on_startup'):
|
|
|
|
|
pixbuf = gtkgui_helpers.get_avatar_pixbuf_from_cache(ji)
|
|
|
|
|
if pixbuf == 'ask':
|
2007-01-02 12:43:57 +01:00
|
|
|
|
transport = gajim.get_transport_name_from_jid(contact1.jid)
|
|
|
|
|
if not transport or gajim.jid_is_transport(contact1.jid):
|
|
|
|
|
jid_with_resource = contact1.jid
|
|
|
|
|
if contact1.resource:
|
|
|
|
|
jid_with_resource += '/' + contact1.resource
|
|
|
|
|
gajim.connections[account].request_vcard(jid_with_resource)
|
|
|
|
|
else:
|
|
|
|
|
host = gajim.get_server_from_jid(contact1.jid)
|
|
|
|
|
if not gajim.transport_avatar[account].has_key(host):
|
|
|
|
|
gajim.transport_avatar[account][host] = [contact1.jid]
|
|
|
|
|
else:
|
|
|
|
|
gajim.transport_avatar[account][host].append(contact1.jid)
|
2006-03-12 21:33:36 +01:00
|
|
|
|
# If we already have a chat window opened, update it with new contact
|
|
|
|
|
# instance
|
|
|
|
|
chat_control = gajim.interface.msg_win_mgr.get_control(ji, account)
|
|
|
|
|
if chat_control:
|
|
|
|
|
chat_control.contact = contact1
|
2005-11-14 11:08:50 +01:00
|
|
|
|
|
2005-07-21 19:54:58 +02:00
|
|
|
|
def chg_contact_status(self, contact, show, status, account):
|
2005-11-12 15:15:32 +01:00
|
|
|
|
'''When a contact changes his or her status'''
|
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
|
|
|
|
contact_instances = gajim.contacts.get_contact(account, contact.jid)
|
2005-07-21 19:54:58 +02:00
|
|
|
|
contact.show = show
|
|
|
|
|
contact.status = status
|
2005-07-23 17:23:45 +02:00
|
|
|
|
if show in ('offline', 'error') and \
|
2006-11-18 21:52:28 +01:00
|
|
|
|
len(gajim.events.get_events(account, contact.get_full_jid())) == 0:
|
Merged revisions 4987-4989,4991-4996,4999,5003 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4987 | nk | 2006-01-03 04:00:51 -0700 (Tue, 03 Jan 2006) | 1 line
commit 48x48 transport online/offline imgs by Grenshad (I pngcrushed them)
........
r4988 | nk | 2006-01-03 04:32:01 -0700 (Tue, 03 Jan 2006) | 1 line
icon in notification window not always jabber now. MSN if he uses msn etc. thanks stian barmen for helping me test
........
r4989 | nk | 2006-01-03 04:40:44 -0700 (Tue, 03 Jan 2006) | 1 line
all strings I got report about them, are not translatable; pot/po update
........
r4991 | asterix | 2006-01-03 08:08:21 -0700 (Tue, 03 Jan 2006) | 2 lines
don't remove the jid entry in _contacts[account] when we remove a contact
........
r4992 | asterix | 2006-01-03 08:18:30 -0700 (Tue, 03 Jan 2006) | 2 lines
fix logic
........
r4993 | asterix | 2006-01-03 09:04:14 -0700 (Tue, 03 Jan 2006) | 2 lines
a GC_Contact can have a resource if we knoe his real JID
........
r4994 | asterix | 2006-01-03 09:32:58 -0700 (Tue, 03 Jan 2006) | 2 lines
missing argument in create_gc_contact
........
r4995 | asterix | 2006-01-03 10:36:41 -0700 (Tue, 03 Jan 2006) | 2 lines
we save gc_contact vcard instance in instances[self.account]['infos'][Fake_jid]
........
r4996 | asterix | 2006-01-03 11:17:43 -0700 (Tue, 03 Jan 2006) | 2 lines
in DataForm, a field of type 'list-single' can have no <value> element. Create a default one in such a case to prevent TB
........
r4999 | asterix | 2006-01-04 05:52:26 -0700 (Wed, 04 Jan 2006) | 2 lines
prevent TB when we move a contact that was in no group
........
r5003 | asterix | 2006-01-04 09:03:42 -0700 (Wed, 04 Jan 2006) | 2 lines
handle correctly unlabeled option values in DataForms
........
2006-01-05 04:17:36 +01:00
|
|
|
|
if len(contact_instances) > 1:
|
|
|
|
|
# if multiple resources
|
2007-01-09 21:01:30 +01:00
|
|
|
|
jid_with_resource = contact.jid + '/' + contact.resource
|
|
|
|
|
if gajim.interface.msg_win_mgr.has_window(jid_with_resource,
|
|
|
|
|
account):
|
|
|
|
|
win = gajim.interface.msg_win_mgr.get_window(jid_with_resource,
|
|
|
|
|
account)
|
|
|
|
|
ctrl = win.get_control(jid_with_resource, account)
|
|
|
|
|
ctrl.update_ui()
|
|
|
|
|
win.redraw_tab(ctrl)
|
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
|
|
|
|
gajim.contacts.remove_contact(account, contact)
|
2006-03-24 13:55:56 +01:00
|
|
|
|
self.remove_contact(contact, account)
|
|
|
|
|
self.add_contact_to_roster(contact.jid, account)
|
2005-10-07 15:00:44 +02:00
|
|
|
|
# print status in chat window and update status/GPG image
|
2006-11-18 21:52:28 +01:00
|
|
|
|
jid_list = [contact.jid]
|
2006-11-21 19:46:33 +01:00
|
|
|
|
for jid in jid_list:
|
|
|
|
|
if gajim.interface.msg_win_mgr.has_window(jid, account):
|
|
|
|
|
win = gajim.interface.msg_win_mgr.get_window(jid, account)
|
|
|
|
|
ctrl = win.get_control(jid, account)
|
2007-01-02 01:04:31 +01:00
|
|
|
|
ctrl.contact = gajim.contacts.get_contact_with_highest_priority(
|
|
|
|
|
account, contact.jid)
|
2006-03-14 19:18:34 +01:00
|
|
|
|
ctrl.update_ui()
|
|
|
|
|
win.redraw_tab(ctrl)
|
|
|
|
|
|
|
|
|
|
name = contact.get_shown_name()
|
2006-11-18 21:52:28 +01:00
|
|
|
|
|
|
|
|
|
# if multiple resources (or second one disconnecting)
|
|
|
|
|
if (len(contact_instances) > 1 or (len(contact_instances) == 1 and \
|
|
|
|
|
show in ('offline', 'error'))) and contact.resource != '':
|
2006-03-14 19:18:34 +01:00
|
|
|
|
name += '/' + contact.resource
|
2006-11-18 21:52:28 +01:00
|
|
|
|
|
2006-03-14 19:18:34 +01:00
|
|
|
|
uf_show = helpers.get_uf_show(show)
|
|
|
|
|
if status:
|
|
|
|
|
ctrl.print_conversation(_('%s is now %s (%s)') % (name, uf_show,
|
|
|
|
|
status), 'status')
|
|
|
|
|
else: # No status message
|
|
|
|
|
ctrl.print_conversation(_('%s is now %s') % (name, uf_show),
|
2005-12-31 22:55:44 +01:00
|
|
|
|
'status')
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
2006-11-18 21:52:28 +01:00
|
|
|
|
if not contact.groups:
|
|
|
|
|
self.draw_group(_('General'), account)
|
|
|
|
|
else:
|
|
|
|
|
for group in contact.groups:
|
|
|
|
|
self.draw_group(group, account)
|
|
|
|
|
|
|
|
|
|
self.draw_account(account)
|
|
|
|
|
|
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
|
|
|
|
def on_info(self, widget, contact, account):
|
|
|
|
|
'''Call vcard_information_window class to display contact's information'''
|
2006-11-24 18:38:12 +01:00
|
|
|
|
if gajim.connections[account].is_zeroconf:
|
|
|
|
|
self.on_info_zeroconf(widget, contact, account)
|
|
|
|
|
return
|
|
|
|
|
|
2005-11-13 16:08:47 +01:00
|
|
|
|
info = gajim.interface.instances[account]['infos']
|
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
|
|
|
|
if info.has_key(contact.jid):
|
|
|
|
|
info[contact.jid].window.present()
|
2005-06-12 17:14:07 +02:00
|
|
|
|
else:
|
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
|
|
|
|
info[contact.jid] = vcard.VcardWindow(contact, account)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
2006-11-18 21:52:28 +01:00
|
|
|
|
def on_info_zeroconf(self, widget, contact, account):
|
|
|
|
|
info = gajim.interface.instances[account]['infos']
|
|
|
|
|
if info.has_key(contact.jid):
|
|
|
|
|
info[contact.jid].window.present()
|
|
|
|
|
else:
|
|
|
|
|
contact = gajim.contacts.get_first_contact_from_jid(account,
|
|
|
|
|
contact.jid)
|
|
|
|
|
if contact.show in ('offline', 'error'):
|
|
|
|
|
# don't show info on offline contacts
|
|
|
|
|
return
|
|
|
|
|
info[contact.jid] = vcard.ZeroconfVcardWindow(contact, account)
|
|
|
|
|
|
|
|
|
|
|
2005-07-15 20:13:54 +02:00
|
|
|
|
def show_tooltip(self, contact):
|
2005-07-09 00:26:46 +02:00
|
|
|
|
pointer = self.tree.get_pointer()
|
|
|
|
|
props = self.tree.get_path_at_pos(pointer[0], pointer[1])
|
2006-02-28 11:13:42 +01:00
|
|
|
|
# check if the current pointer is at the same path
|
|
|
|
|
# as it was before setting the timeout
|
2005-07-31 21:21:11 +02:00
|
|
|
|
if props and self.tooltip.id == props[0]:
|
2006-02-28 11:13:42 +01:00
|
|
|
|
# bounding rectangle of coordinates for the cell within the treeview
|
2006-01-08 08:50:26 +01:00
|
|
|
|
rect = self.tree.get_cell_area(props[0], props[1])
|
2006-02-28 11:13:42 +01:00
|
|
|
|
|
|
|
|
|
# position of the treeview on the screen
|
2005-07-31 21:21:11 +02:00
|
|
|
|
position = self.tree.window.get_origin()
|
2006-02-28 11:13:42 +01:00
|
|
|
|
self.tooltip.show_tooltip(contact, rect.height, position[1] + rect.y)
|
2005-07-09 00:26:46 +02:00
|
|
|
|
else:
|
|
|
|
|
self.tooltip.hide_tooltip()
|
2005-07-07 23:27:53 +02:00
|
|
|
|
|
2005-07-08 01:37:04 +02:00
|
|
|
|
def on_roster_treeview_leave_notify_event(self, widget, event):
|
|
|
|
|
props = widget.get_path_at_pos(int(event.x), int(event.y))
|
2005-07-07 23:27:53 +02:00
|
|
|
|
if self.tooltip.timeout > 0:
|
2005-07-31 21:21:11 +02:00
|
|
|
|
if not props or self.tooltip.id == props[0]:
|
2005-07-07 23:27:53 +02:00
|
|
|
|
self.tooltip.hide_tooltip()
|
|
|
|
|
|
2005-07-08 01:37:04 +02:00
|
|
|
|
def on_roster_treeview_motion_notify_event(self, widget, event):
|
2005-07-07 23:27:53 +02:00
|
|
|
|
model = widget.get_model()
|
2005-07-08 01:37:04 +02:00
|
|
|
|
props = widget.get_path_at_pos(int(event.x), int(event.y))
|
2005-07-07 23:27:53 +02:00
|
|
|
|
if self.tooltip.timeout > 0:
|
2005-07-31 21:21:11 +02:00
|
|
|
|
if not props or self.tooltip.id != props[0]:
|
2005-07-07 23:27:53 +02:00
|
|
|
|
self.tooltip.hide_tooltip()
|
|
|
|
|
if props:
|
|
|
|
|
[row, col, x, y] = props
|
2005-08-03 16:14:11 +02:00
|
|
|
|
iter = None
|
|
|
|
|
try:
|
|
|
|
|
iter = model.get_iter(row)
|
|
|
|
|
except:
|
|
|
|
|
self.tooltip.hide_tooltip()
|
|
|
|
|
return
|
2006-07-19 13:01:09 +02:00
|
|
|
|
if model[iter][C_TYPE] in ('contact', 'self_contact'):
|
2005-09-15 01:11:13 +02:00
|
|
|
|
# we're on a contact entry in the roster
|
2005-09-09 00:07:49 +02:00
|
|
|
|
account = model[iter][C_ACCOUNT].decode('utf-8')
|
|
|
|
|
jid = model[iter][C_JID].decode('utf-8')
|
2005-07-31 21:21:11 +02:00
|
|
|
|
if self.tooltip.timeout == 0 or self.tooltip.id != props[0]:
|
|
|
|
|
self.tooltip.id = row
|
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
|
|
|
|
contacts = gajim.contacts.get_contact(account, jid)
|
2006-11-18 21:52:28 +01:00
|
|
|
|
connected_contacts = []
|
|
|
|
|
for c in contacts:
|
|
|
|
|
if c.show not in ('offline', 'error'):
|
|
|
|
|
connected_contacts.append(c)
|
|
|
|
|
if not connected_contacts:
|
|
|
|
|
# no connected contacts, show the ofline one
|
|
|
|
|
connected_contacts = contacts
|
2007-04-25 19:09:07 +02:00
|
|
|
|
self.tooltip.account = account
|
2005-07-07 23:27:53 +02:00
|
|
|
|
self.tooltip.timeout = gobject.timeout_add(500,
|
2006-11-18 21:52:28 +01:00
|
|
|
|
self.show_tooltip, connected_contacts)
|
2005-09-13 23:13:40 +02:00
|
|
|
|
elif model[iter][C_TYPE] == 'account':
|
2005-09-15 01:11:13 +02:00
|
|
|
|
# we're on an account entry in the roster
|
2005-11-09 08:00:46 +01:00
|
|
|
|
account = model[iter][C_ACCOUNT].decode('utf-8')
|
|
|
|
|
if account == 'all':
|
2005-11-09 22:05:55 +01:00
|
|
|
|
if self.tooltip.timeout == 0 or self.tooltip.id != props[0]:
|
|
|
|
|
self.tooltip.id = row
|
2007-04-25 19:09:07 +02:00
|
|
|
|
self.tooltip.account = None
|
2005-11-09 22:05:55 +01:00
|
|
|
|
self.tooltip.timeout = gobject.timeout_add(500,
|
|
|
|
|
self.show_tooltip, [])
|
2005-11-09 08:00:46 +01:00
|
|
|
|
return
|
2005-09-13 20:46:21 +02:00
|
|
|
|
jid = gajim.get_jid_from_account(account)
|
2005-09-13 23:13:40 +02:00
|
|
|
|
contacts = []
|
2005-09-15 01:11:13 +02:00
|
|
|
|
connection = gajim.connections[account]
|
|
|
|
|
# get our current contact info
|
2006-11-18 21:52:28 +01:00
|
|
|
|
|
|
|
|
|
nbr_on, nbr_total = gajim.contacts.get_nb_online_total_contacts(
|
|
|
|
|
accounts = [account])
|
|
|
|
|
account_name = account
|
|
|
|
|
if gajim.account_is_connected(account):
|
2007-01-06 20:48:18 +01:00
|
|
|
|
account_name += ' (%s/%s)' % (repr(nbr_on), repr(nbr_total))
|
2006-11-18 21:52:28 +01:00
|
|
|
|
contact = gajim.contacts.create_contact(jid = jid,
|
|
|
|
|
name = account_name, show = connection.get_status(), sub = '',
|
2005-12-06 18:43:21 +01:00
|
|
|
|
status = connection.status,
|
2007-03-28 16:20:50 +02:00
|
|
|
|
resource = connection.server_resource,
|
2006-11-18 21:52:28 +01:00
|
|
|
|
priority = connection.priority,
|
2005-11-14 11:24:38 +01:00
|
|
|
|
keyID = gajim.config.get_per('accounts', connection.name,
|
|
|
|
|
'keyid'))
|
2005-09-14 19:17:19 +02:00
|
|
|
|
contacts.append(contact)
|
2005-09-15 01:11:13 +02:00
|
|
|
|
# if we're online ...
|
|
|
|
|
if connection.connection:
|
|
|
|
|
roster = connection.connection.getRoster()
|
2006-11-20 08:53:58 +01:00
|
|
|
|
# in threadless connection when no roster stanza is sent,
|
|
|
|
|
# 'roster' is None
|
2006-02-03 13:17:34 +01:00
|
|
|
|
if roster and roster.getItem(jid):
|
2005-09-15 01:11:13 +02:00
|
|
|
|
resources = roster.getResources(jid)
|
|
|
|
|
# ...get the contact info for our other online resources
|
2005-09-14 19:17:19 +02:00
|
|
|
|
for resource in resources:
|
2005-09-22 17:53:27 +02:00
|
|
|
|
show = roster.getShow(jid+'/'+resource)
|
|
|
|
|
if not show:
|
|
|
|
|
show = 'online'
|
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
|
|
|
|
contact = gajim.contacts.create_contact(jid = jid,
|
|
|
|
|
name = account, show = show,
|
|
|
|
|
status = roster.getStatus(jid+'/'+resource),
|
|
|
|
|
resource = resource,
|
|
|
|
|
priority = roster.getPriority(jid+'/'+resource))
|
2005-09-14 19:17:19 +02:00
|
|
|
|
contacts.append(contact)
|
2005-09-13 20:46:21 +02:00
|
|
|
|
if self.tooltip.timeout == 0 or self.tooltip.id != props[0]:
|
|
|
|
|
self.tooltip.id = row
|
2007-04-25 19:09:07 +02:00
|
|
|
|
self.tooltip.account = None
|
2005-09-13 20:46:21 +02:00
|
|
|
|
self.tooltip.timeout = gobject.timeout_add(500,
|
|
|
|
|
self.show_tooltip, contacts)
|
2005-07-07 23:27:53 +02:00
|
|
|
|
|
2005-06-12 17:14:07 +02:00
|
|
|
|
def on_agent_logging(self, widget, jid, state, account):
|
|
|
|
|
'''When an agent is requested to log in or off'''
|
|
|
|
|
gajim.connections[account].send_agent_status(jid, state)
|
|
|
|
|
|
2005-07-06 16:34:59 +02:00
|
|
|
|
def on_edit_agent(self, widget, contact, account):
|
2005-06-12 17:14:07 +02:00
|
|
|
|
'''When we want to modify the agent registration'''
|
2005-07-06 16:34:59 +02:00
|
|
|
|
gajim.connections[account].request_register_agent_info(contact.jid)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
2006-09-13 18:47:58 +02:00
|
|
|
|
def on_remove_agent(self, widget, list_):
|
2006-11-18 21:52:28 +01:00
|
|
|
|
'''When an agent is requested to be removed. list_ is a list of
|
2006-09-13 18:47:58 +02:00
|
|
|
|
(contact, account) tuple'''
|
|
|
|
|
for (contact, account) in list_:
|
|
|
|
|
if gajim.config.get_per('accounts', account, 'hostname') == \
|
|
|
|
|
contact.jid:
|
|
|
|
|
# We remove the server contact
|
|
|
|
|
# remove it from treeview
|
|
|
|
|
gajim.connections[account].unsubscribe(contact.jid)
|
|
|
|
|
self.remove_contact(contact, account)
|
|
|
|
|
gajim.contacts.remove_contact(account, contact)
|
|
|
|
|
return
|
2005-08-01 21:37:18 +02:00
|
|
|
|
|
2006-09-13 18:47:58 +02:00
|
|
|
|
def remove(widget, list_):
|
2006-04-02 18:11:21 +02:00
|
|
|
|
self.dialog.destroy()
|
2006-09-13 18:47:58 +02:00
|
|
|
|
for (contact, account) in list_:
|
|
|
|
|
full_jid = contact.get_full_jid()
|
|
|
|
|
gajim.connections[account].unsubscribe_agent(full_jid)
|
|
|
|
|
# remove transport from treeview
|
|
|
|
|
self.remove_contact(contact, account)
|
|
|
|
|
gajim.contacts.remove_jid(account, contact.jid)
|
|
|
|
|
gajim.contacts.remove_contact(account, contact)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
2006-11-18 21:52:28 +01:00
|
|
|
|
# Check if there are unread events from some contacts
|
|
|
|
|
has_unread_events = False
|
|
|
|
|
for (contact, account) in list_:
|
|
|
|
|
for jid in gajim.events.get_events(account):
|
|
|
|
|
if jid.endswith(contact.jid):
|
|
|
|
|
has_unread_events = True
|
|
|
|
|
break
|
|
|
|
|
if has_unread_events:
|
|
|
|
|
dialogs.ErrorDialog(_('You have unread messages'),
|
|
|
|
|
_('You must read them before removing this transport.'))
|
|
|
|
|
return
|
2006-09-13 18:47:58 +02:00
|
|
|
|
if len(list_) == 1:
|
|
|
|
|
pritext = _('Transport "%s" will be removed') % contact.jid
|
2006-11-20 08:53:58 +01:00
|
|
|
|
sectext = _('You will no longer be able to send and receive messages '
|
2007-01-02 14:36:54 +01:00
|
|
|
|
'from contacts using this transport.')
|
2006-09-13 18:47:58 +02:00
|
|
|
|
else:
|
|
|
|
|
pritext = _('Transports will be removed')
|
|
|
|
|
jids = ''
|
|
|
|
|
for (contact, account) in list_:
|
|
|
|
|
jids += '\n ' + contact.get_shown_name() + ','
|
|
|
|
|
jids = jids[:-1] + '.'
|
2006-11-20 08:53:58 +01:00
|
|
|
|
sectext = _('You will no longer be able to send and receive messages '
|
|
|
|
|
'to contacts from these transports:%s') % jids
|
2006-09-13 18:47:58 +02:00
|
|
|
|
self.dialog = dialogs.ConfirmationDialog(pritext, sectext,
|
|
|
|
|
on_response_ok = (remove, list_))
|
2006-04-02 18:11:21 +02:00
|
|
|
|
|
2007-04-25 22:51:01 +02:00
|
|
|
|
def on_block(self, widget, iter, group_list):
|
2007-04-25 17:54:58 +02:00
|
|
|
|
''' When clicked on the 'block' button in context menu. '''
|
2007-04-24 21:56:24 +02:00
|
|
|
|
model = self.tree.get_model()
|
|
|
|
|
accounts = []
|
2007-04-25 22:51:01 +02:00
|
|
|
|
msg = self.get_status_message('offline')
|
|
|
|
|
if group_list == None:
|
2007-04-24 21:56:24 +02:00
|
|
|
|
jid = model[iter][C_JID].decode('utf-8')
|
|
|
|
|
account = model[iter][C_ACCOUNT].decode('utf-8')
|
|
|
|
|
accounts.append(account)
|
|
|
|
|
self.send_status(account, 'offline', msg, to = jid)
|
|
|
|
|
new_rule = {'order': u'1', 'type': u'jid', 'action': u'deny',
|
|
|
|
|
'value' : jid, 'child': [u'message', u'iq', u'presence-out']}
|
2007-04-25 17:54:58 +02:00
|
|
|
|
gajim.connections[account].blocked_list.append(new_rule)
|
2007-04-25 19:09:07 +02:00
|
|
|
|
# needed for draw_contact:
|
|
|
|
|
gajim.connections[account].blocked_contacts.append(jid)
|
|
|
|
|
self.draw_contact(jid, account)
|
2007-04-24 21:56:24 +02:00
|
|
|
|
else:
|
2007-04-25 17:54:58 +02:00
|
|
|
|
if iter == None:
|
2007-04-25 22:51:01 +02:00
|
|
|
|
for (contact, account) in group_list:
|
2007-04-25 17:54:58 +02:00
|
|
|
|
if account not in accounts:
|
2007-04-25 19:09:07 +02:00
|
|
|
|
if not gajim.connections[account].privacy_rules_supported:
|
|
|
|
|
continue
|
|
|
|
|
accounts.append(account)
|
2007-04-25 22:51:01 +02:00
|
|
|
|
self.send_status(account, 'offline', msg, to=contact.jid)
|
2007-04-25 19:09:07 +02:00
|
|
|
|
new_rule = {'order': u'1', 'type': u'jid',
|
|
|
|
|
'action': u'deny', 'value' : contact.jid,
|
|
|
|
|
'child': [u'message', u'iq', u'presence-out']}
|
|
|
|
|
gajim.connections[account].blocked_list.append(new_rule)
|
|
|
|
|
# needed for draw_contact:
|
|
|
|
|
gajim.connections[account].blocked_contacts.append(contact.jid)
|
|
|
|
|
self.draw_contact(contact.jid, account)
|
2007-04-25 17:54:58 +02:00
|
|
|
|
else:
|
|
|
|
|
group = model[iter][C_JID].decode('utf-8')
|
|
|
|
|
msg = self.get_status_message('offline')
|
2007-04-25 22:51:01 +02:00
|
|
|
|
for (contact, account) in group_list:
|
2007-04-25 17:54:58 +02:00
|
|
|
|
if account not in accounts:
|
2007-04-25 19:09:07 +02:00
|
|
|
|
if not gajim.connections[account].privacy_rules_supported:
|
|
|
|
|
continue
|
|
|
|
|
accounts.append(account)
|
2007-04-25 22:51:01 +02:00
|
|
|
|
self.send_status(account, 'offline', msg, to=contact.jid)
|
2007-04-25 19:09:07 +02:00
|
|
|
|
# needed for draw_contact:
|
|
|
|
|
gajim.connections[account].blocked_contacts.append(contact.jid)
|
|
|
|
|
self.draw_contact(contact.jid, account)
|
2007-04-25 17:54:58 +02:00
|
|
|
|
new_rule = {'order': u'1', 'type': u'group', 'action': u'deny',
|
|
|
|
|
'value' : group, 'child': [u'message', u'iq', u'presence-out']}
|
|
|
|
|
gajim.connections[account].blocked_list.append(new_rule)
|
2007-04-25 19:09:07 +02:00
|
|
|
|
for account in accounts:
|
|
|
|
|
gajim.connections[account].set_privacy_list(
|
|
|
|
|
'block', gajim.connections[account].blocked_list)
|
|
|
|
|
if len(gajim.connections[account].blocked_list) == 1:
|
|
|
|
|
gajim.connections[account].set_active_list('block')
|
|
|
|
|
gajim.connections[account].set_default_list('block')
|
|
|
|
|
gajim.connections[account].get_privacy_list('block')
|
2007-04-24 21:56:24 +02:00
|
|
|
|
|
2007-04-25 17:54:58 +02:00
|
|
|
|
def on_unblock(self, widget, iter, group_list):
|
|
|
|
|
''' When clicked on the 'unblock' button in context menu. '''
|
2007-04-24 21:56:24 +02:00
|
|
|
|
model = self.tree.get_model()
|
|
|
|
|
accounts = []
|
2007-04-25 17:54:58 +02:00
|
|
|
|
if group_list == None:
|
2007-04-24 21:56:24 +02:00
|
|
|
|
jid = model[iter][C_JID].decode('utf-8')
|
|
|
|
|
jid_account = model[iter][C_ACCOUNT].decode('utf-8')
|
|
|
|
|
accounts.append(jid_account)
|
|
|
|
|
gajim.connections[jid_account].new_blocked_list = []
|
|
|
|
|
for rule in gajim.connections[jid_account].blocked_list:
|
2007-04-25 17:54:58 +02:00
|
|
|
|
if rule['action'] != 'deny' or rule['type'] != 'jid' \
|
2007-04-25 19:09:07 +02:00
|
|
|
|
or rule['value'] != jid:
|
2007-04-24 21:56:24 +02:00
|
|
|
|
gajim.connections[jid_account].new_blocked_list.append(rule)
|
2007-04-25 19:09:07 +02:00
|
|
|
|
# needed for draw_contact:
|
|
|
|
|
if jid in gajim.connections[jid_account].blocked_contacts:
|
|
|
|
|
gajim.connections[jid_account].blocked_contacts.remove(jid)
|
|
|
|
|
self.draw_contact(jid, jid_account)
|
2007-04-24 21:56:24 +02:00
|
|
|
|
else:
|
2007-04-25 17:54:58 +02:00
|
|
|
|
if iter == None:
|
|
|
|
|
for (contact, account) in group_list:
|
|
|
|
|
if account not in accounts:
|
|
|
|
|
if gajim.connections[account].privacy_rules_supported:
|
|
|
|
|
accounts.append(account)
|
|
|
|
|
gajim.connections[account].new_blocked_list = []
|
|
|
|
|
gajim.connections[account].to_unblock = []
|
|
|
|
|
gajim.connections[account].to_unblock.append(contact.jid)
|
|
|
|
|
else:
|
|
|
|
|
gajim.connections[account].to_unblock.append(contact.jid)
|
2007-04-25 19:09:07 +02:00
|
|
|
|
# needed for draw_contact:
|
|
|
|
|
if contact.jid in gajim.connections[account].blocked_contacts:
|
|
|
|
|
gajim.connections[account].blocked_contacts.remove(
|
|
|
|
|
contact.jid)
|
|
|
|
|
self.draw_contact(contact.jid, account)
|
2007-04-25 17:54:58 +02:00
|
|
|
|
for account in accounts:
|
|
|
|
|
for rule in gajim.connections[account].blocked_list:
|
|
|
|
|
if rule['action'] != 'deny' or rule['type'] != 'jid' \
|
|
|
|
|
or rule['value'] not in gajim.connections[account].to_unblock:
|
|
|
|
|
gajim.connections[account].new_blocked_list.append(rule)
|
|
|
|
|
else:
|
|
|
|
|
group = model[iter][C_JID].decode('utf-8')
|
|
|
|
|
for (contact, account) in group_list:
|
|
|
|
|
if account not in accounts:
|
|
|
|
|
if gajim.connections[account].privacy_rules_supported:
|
|
|
|
|
accounts.append(account)
|
|
|
|
|
gajim.connections[account].new_blocked_list = []
|
|
|
|
|
for rule in gajim.connections[account].blocked_list:
|
|
|
|
|
if rule['action'] != 'deny' or rule['type'] != 'group' \
|
2007-04-25 19:09:07 +02:00
|
|
|
|
or rule['value'] != group:
|
|
|
|
|
gajim.connections[account].new_blocked_list.append(
|
|
|
|
|
rule)
|
|
|
|
|
# needed for draw_contact:
|
|
|
|
|
if contact.jid in gajim.connections[account].blocked_contacts:
|
|
|
|
|
gajim.connections[account].blocked_contacts.remove(
|
|
|
|
|
contact.jid)
|
|
|
|
|
self.draw_contact(contact.jid, account)
|
2007-04-24 21:56:24 +02:00
|
|
|
|
for account in accounts:
|
|
|
|
|
gajim.connections[account].set_privacy_list(
|
|
|
|
|
'block', gajim.connections[account].new_blocked_list)
|
|
|
|
|
gajim.connections[account].get_privacy_list('block')
|
|
|
|
|
if len(gajim.connections[account].new_blocked_list) == 0:
|
|
|
|
|
gajim.connections[account].blocked_list = []
|
|
|
|
|
gajim.connections[account].blocked_contacts = []
|
|
|
|
|
gajim.connections[account].blocked_groups = []
|
|
|
|
|
gajim.connections[account].set_default_list('')
|
|
|
|
|
gajim.connections[account].set_active_list('')
|
|
|
|
|
gajim.connections[account].del_privacy_list('block')
|
2007-04-25 17:54:58 +02:00
|
|
|
|
if gajim.interface.instances[account].has_key('blocked_contacts'):
|
|
|
|
|
gajim.interface.instances[account]['blocked_contacts'].\
|
|
|
|
|
privacy_list_received([])
|
|
|
|
|
if group_list == None:
|
2007-04-24 21:56:24 +02:00
|
|
|
|
status = gajim.connections[jid_account].connected
|
|
|
|
|
msg = gajim.connections[jid_account].status
|
|
|
|
|
if not self.regroup:
|
|
|
|
|
show = gajim.SHOW_LIST[status]
|
|
|
|
|
else: # accounts merged
|
|
|
|
|
show = helpers.get_global_show()
|
2007-04-25 22:51:01 +02:00
|
|
|
|
self.send_status(jid_account, show, msg, to=jid)
|
2007-04-24 21:56:24 +02:00
|
|
|
|
else:
|
2007-04-25 17:54:58 +02:00
|
|
|
|
for (contact, account) in group_list:
|
2007-04-24 21:56:24 +02:00
|
|
|
|
if not self.regroup:
|
|
|
|
|
show = gajim.SHOW_LIST[gajim.connections[account].connected]
|
|
|
|
|
else: # accounts merged
|
|
|
|
|
show = helpers.get_global_show()
|
|
|
|
|
if account not in accounts:
|
|
|
|
|
if gajim.connections[account].privacy_rules_supported:
|
|
|
|
|
accounts.append(account)
|
|
|
|
|
self.send_status(account, show,
|
2007-04-25 22:51:01 +02:00
|
|
|
|
gajim.connections[account].status, to=contact.jid)
|
2007-04-24 21:56:24 +02:00
|
|
|
|
else:
|
|
|
|
|
self.send_status(account, show,
|
2007-04-25 22:51:01 +02:00
|
|
|
|
gajim.connections[account].status, to=contact.jid)
|
2007-04-24 21:56:24 +02:00
|
|
|
|
|
2005-06-12 17:14:07 +02:00
|
|
|
|
def on_rename(self, widget, iter, path):
|
2005-11-08 20:19:09 +01:00
|
|
|
|
# this function is called either by F2 or by Rename menuitem
|
2006-11-19 20:45:43 +01:00
|
|
|
|
if gajim.interface.instances.has_key('rename'):
|
|
|
|
|
gajim.interface.instances['rename'].dialog.window.present()
|
|
|
|
|
return
|
2005-06-12 17:14:07 +02:00
|
|
|
|
model = self.tree.get_model()
|
2005-12-06 18:43:21 +01:00
|
|
|
|
|
2005-09-09 00:07:49 +02:00
|
|
|
|
row_type = model[iter][C_TYPE]
|
|
|
|
|
jid = model[iter][C_JID].decode('utf-8')
|
|
|
|
|
account = model[iter][C_ACCOUNT].decode('utf-8')
|
2006-04-01 14:10:02 +02:00
|
|
|
|
# account is offline, don't allow to rename
|
|
|
|
|
if gajim.connections[account].connected < 2:
|
|
|
|
|
return
|
2006-04-11 20:20:47 +02:00
|
|
|
|
if row_type in ('contact', 'agent'):
|
2005-07-21 15:16:31 +02:00
|
|
|
|
# it's jid
|
2006-11-19 20:45:43 +01:00
|
|
|
|
title = _('Rename Contact')
|
|
|
|
|
message = _('Enter a new nickname for contact %s') % jid
|
|
|
|
|
old_text = gajim.contacts.get_contact_with_highest_priority(account,
|
|
|
|
|
jid).name
|
2006-03-30 23:35:43 +02:00
|
|
|
|
elif row_type == 'group':
|
2006-03-30 23:37:45 +02:00
|
|
|
|
if jid in helpers.special_groups + (_('General'),):
|
2006-03-30 23:35:43 +02:00
|
|
|
|
return
|
2006-11-19 20:45:43 +01:00
|
|
|
|
old_text = model[iter][C_JID].decode('utf-8')
|
|
|
|
|
title = _('Rename Group')
|
|
|
|
|
message = _('Enter a new name for group %s') % old_text
|
|
|
|
|
|
|
|
|
|
def on_renamed(new_text, account, row_type, jid, old_text):
|
|
|
|
|
if gajim.interface.instances.has_key('rename'):
|
|
|
|
|
del gajim.interface.instances['rename']
|
|
|
|
|
if row_type in ('contact', 'agent'):
|
|
|
|
|
if old_text == new_text:
|
|
|
|
|
return
|
|
|
|
|
for u in gajim.contacts.get_contact(account, jid):
|
|
|
|
|
u.name = new_text
|
|
|
|
|
gajim.connections[account].update_contact(jid, new_text, u.groups)
|
|
|
|
|
self.draw_contact(jid, account)
|
|
|
|
|
# Update opened chat
|
|
|
|
|
ctrl = gajim.interface.msg_win_mgr.get_control(jid, account)
|
|
|
|
|
if ctrl:
|
|
|
|
|
ctrl.update_ui()
|
|
|
|
|
win = gajim.interface.msg_win_mgr.get_window(jid, account)
|
|
|
|
|
win.redraw_tab(ctrl)
|
|
|
|
|
win.show_title()
|
|
|
|
|
elif row_type == 'group':
|
|
|
|
|
# in C_JID column, we hold the group name (which is not escaped)
|
|
|
|
|
if old_text == new_text:
|
|
|
|
|
return
|
|
|
|
|
# Groups may not change name from or to a special groups
|
|
|
|
|
for g in helpers.special_groups:
|
|
|
|
|
if g in (new_text, old_text):
|
|
|
|
|
return
|
|
|
|
|
# get all contacts in that group
|
|
|
|
|
for jid in gajim.contacts.get_jid_list(account):
|
|
|
|
|
contact = gajim.contacts.get_contact_with_highest_priority(
|
|
|
|
|
account, jid)
|
|
|
|
|
if old_text in contact.groups:
|
|
|
|
|
# set them in the new one and remove it from the old
|
|
|
|
|
contact.groups.remove(old_text)
|
|
|
|
|
self.remove_contact(contact, account)
|
|
|
|
|
if new_text not in contact.groups:
|
|
|
|
|
contact.groups.append(new_text)
|
|
|
|
|
self.add_contact_to_roster(contact.jid, account)
|
|
|
|
|
gajim.connections[account].update_contact(contact.jid,
|
|
|
|
|
contact.name, contact.groups)
|
|
|
|
|
# If last removed iter was not visible, gajim.groups is not cleaned
|
|
|
|
|
if gajim.groups[account].has_key(old_text):
|
|
|
|
|
del gajim.groups[account][old_text]
|
2006-11-20 00:29:45 +01:00
|
|
|
|
self.draw_group(new_text, account)
|
2006-11-19 20:45:43 +01:00
|
|
|
|
|
|
|
|
|
def on_canceled():
|
|
|
|
|
if gajim.interface.instances.has_key('rename'):
|
|
|
|
|
del gajim.interface.instances['rename']
|
|
|
|
|
|
|
|
|
|
gajim.interface.instances['rename'] = dialogs.InputDialog(title, message,
|
|
|
|
|
old_text, False, (on_renamed, account, row_type, jid, old_text),
|
|
|
|
|
on_canceled)
|
2005-12-06 18:43:21 +01:00
|
|
|
|
|
2006-12-26 14:30:35 +01:00
|
|
|
|
def readd_if_needed(self, contact, account):
|
|
|
|
|
need_readd = False
|
|
|
|
|
if len(gajim.events.get_events(account, contact.jid)):
|
|
|
|
|
need_readd = True
|
|
|
|
|
elif gajim.interface.msg_win_mgr.has_window(contact.jid, account):
|
|
|
|
|
if _('Not in Roster') in contact.groups:
|
|
|
|
|
# Close chat window
|
|
|
|
|
msg_win = gajim.interface.msg_win_mgr.get_window(contact.jid,
|
|
|
|
|
account)
|
|
|
|
|
ctrl = gajim.interface.msg_win_mgr.get_control(contact.jid, account)
|
|
|
|
|
msg_win.remove_tab(ctrl, msg_win.CLOSE_CLOSE_BUTTON)
|
|
|
|
|
else:
|
|
|
|
|
need_readd = True
|
|
|
|
|
if need_readd:
|
|
|
|
|
c = gajim.contacts.create_contact(jid = contact.jid,
|
|
|
|
|
name = '', groups = [_('Not in Roster')],
|
|
|
|
|
show = 'not in roster', status = '', ask = 'none',
|
|
|
|
|
keyID = contact.keyID)
|
|
|
|
|
gajim.contacts.add_contact(account, c)
|
|
|
|
|
self.add_contact_to_roster(contact.jid, account)
|
|
|
|
|
|
2006-11-18 21:52:28 +01:00
|
|
|
|
def on_remove_group_item_activated(self, widget, group, account):
|
|
|
|
|
dlg = dialogs.ConfirmationDialogCheck(_('Remove Group'),
|
2006-11-23 07:49:22 +01:00
|
|
|
|
_('Do you want to remove group %s from the roster?' % group),
|
2006-11-18 21:52:28 +01:00
|
|
|
|
_('Remove also all contacts in this group from your roster'))
|
|
|
|
|
dlg.set_default_response(gtk.BUTTONS_OK_CANCEL)
|
|
|
|
|
response = dlg.run()
|
|
|
|
|
if response == gtk.RESPONSE_OK:
|
|
|
|
|
for contact in gajim.contacts.get_contacts_from_group(account, group):
|
|
|
|
|
if not dlg.is_checked():
|
|
|
|
|
self.remove_contact_from_group(account, contact, group)
|
|
|
|
|
gajim.connections[account].update_contact(contact.jid,
|
|
|
|
|
contact.name, contact.groups)
|
|
|
|
|
self.add_contact_to_roster(contact.jid, account)
|
|
|
|
|
else:
|
|
|
|
|
gajim.connections[account].unsubscribe(contact.jid)
|
2006-12-26 14:30:35 +01:00
|
|
|
|
for c in gajim.contacts.get_contact(account, contact.jid):
|
|
|
|
|
self.remove_contact(c, account)
|
|
|
|
|
gajim.contacts.remove_jid(account, c.jid)
|
|
|
|
|
self.readd_if_needed(contact, account)
|
|
|
|
|
self.draw_account(account)
|
|
|
|
|
|
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
|
|
|
|
def on_assign_pgp_key(self, widget, contact, account):
|
2005-06-12 17:14:07 +02:00
|
|
|
|
attached_keys = gajim.config.get_per('accounts', account,
|
|
|
|
|
'attached_gpg_keys').split()
|
|
|
|
|
keys = {}
|
2007-02-18 21:58:56 +01:00
|
|
|
|
#GPG Key
|
|
|
|
|
keyID = _('None')
|
2006-03-29 19:22:56 +02:00
|
|
|
|
for i in xrange(len(attached_keys)/2):
|
2005-06-12 17:14:07 +02:00
|
|
|
|
keys[attached_keys[2*i]] = attached_keys[2*i+1]
|
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
|
|
|
|
if attached_keys[2*i] == contact.jid:
|
2005-06-12 17:14:07 +02:00
|
|
|
|
keyID = attached_keys[2*i+1]
|
|
|
|
|
public_keys = gajim.connections[account].ask_gpg_keys()
|
2007-02-18 21:58:56 +01:00
|
|
|
|
#GPG Key
|
|
|
|
|
public_keys[_('None')] = _('None')
|
2005-07-23 00:49:03 +02:00
|
|
|
|
instance = dialogs.ChooseGPGKeyDialog(_('Assign OpenPGP Key'),
|
|
|
|
|
_('Select a key to apply to the contact'), public_keys, keyID)
|
2005-08-02 18:27:25 +02:00
|
|
|
|
keyID = instance.run()
|
2005-07-23 00:49:03 +02:00
|
|
|
|
if keyID is None:
|
2005-06-12 17:14:07 +02:00
|
|
|
|
return
|
2007-02-18 21:58:56 +01:00
|
|
|
|
#GPG Key
|
|
|
|
|
if keyID[0] == _('None'):
|
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
|
|
|
|
if contact.jid in keys:
|
|
|
|
|
del keys[contact.jid]
|
2007-01-11 19:19:24 +01:00
|
|
|
|
for u in gajim.contacts.get_contact(account, contact.jid):
|
|
|
|
|
u.keyID = ''
|
2005-06-12 17:14:07 +02:00
|
|
|
|
else:
|
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
|
|
|
|
keys[contact.jid] = keyID[0]
|
|
|
|
|
for u in gajim.contacts.get_contact(account, contact.jid):
|
2005-06-12 17:14:07 +02:00
|
|
|
|
u.keyID = keyID[0]
|
2007-01-11 19:19:24 +01:00
|
|
|
|
if gajim.interface.msg_win_mgr.has_window(contact.jid, account):
|
|
|
|
|
ctrl = gajim.interface.msg_win_mgr.get_control(contact.jid, account)
|
|
|
|
|
ctrl.update_ui()
|
2005-06-12 17:14:07 +02:00
|
|
|
|
keys_str = ''
|
|
|
|
|
for jid in keys:
|
2005-07-02 10:50:11 +02:00
|
|
|
|
keys_str += jid + ' ' + keys[jid] + ' '
|
2005-06-12 17:14:07 +02:00
|
|
|
|
gajim.config.set_per('accounts', account, 'attached_gpg_keys', keys_str)
|
|
|
|
|
|
2006-09-13 18:47:58 +02:00
|
|
|
|
def on_edit_groups(self, widget, list_):
|
|
|
|
|
dlg = dialogs.EditGroupsDialog(list_)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
dlg.run()
|
2005-12-06 18:43:21 +01:00
|
|
|
|
|
2005-08-04 16:30:41 +02:00
|
|
|
|
def on_history(self, widget, contact, account):
|
2005-06-12 17:14:07 +02:00
|
|
|
|
'''When history menuitem is activated: call log window'''
|
2005-11-13 16:08:47 +01:00
|
|
|
|
if gajim.interface.instances['logs'].has_key(contact.jid):
|
|
|
|
|
gajim.interface.instances['logs'][contact.jid].window.present()
|
2005-06-12 17:14:07 +02:00
|
|
|
|
else:
|
2005-11-13 16:08:47 +01:00
|
|
|
|
gajim.interface.instances['logs'][contact.jid] = history_window.\
|
2005-10-20 13:17:17 +02:00
|
|
|
|
HistoryWindow(contact.jid, account)
|
2005-07-01 17:15:35 +02:00
|
|
|
|
|
2006-03-15 18:45:55 +01:00
|
|
|
|
def on_send_single_message_menuitem_activate(self, widget, account,
|
2005-08-06 21:14:21 +02:00
|
|
|
|
contact = None):
|
|
|
|
|
if contact is None:
|
2005-10-21 20:13:33 +02:00
|
|
|
|
dialogs.SingleMessageWindow(account, action = 'send')
|
2006-11-18 21:52:28 +01:00
|
|
|
|
elif type(contact) == type([]):
|
|
|
|
|
dialogs.SingleMessageWindow(account, contact, 'send')
|
2005-08-06 21:14:21 +02:00
|
|
|
|
else:
|
2006-07-19 13:01:09 +02:00
|
|
|
|
jid = contact.jid
|
|
|
|
|
if contact.jid == gajim.get_jid_from_account(account):
|
|
|
|
|
jid += '/' + contact.resource
|
|
|
|
|
dialogs.SingleMessageWindow(account, jid, 'send')
|
2005-12-06 18:43:21 +01:00
|
|
|
|
|
2005-08-03 16:14:11 +02:00
|
|
|
|
def on_send_file_menuitem_activate(self, widget, account, contact):
|
2005-12-06 18:43:21 +01:00
|
|
|
|
gajim.interface.instances['file_transfers'].show_file_send_request(
|
2005-08-03 16:14:11 +02:00
|
|
|
|
account, contact)
|
2006-11-20 08:53:58 +01:00
|
|
|
|
|
2006-03-15 18:45:55 +01:00
|
|
|
|
def on_add_special_notification_menuitem_activate(self, widget, jid):
|
|
|
|
|
dialogs.AddSpecialNotificationDialog(jid)
|
2005-12-06 18:43:21 +01:00
|
|
|
|
|
2006-03-29 18:42:06 +02:00
|
|
|
|
def make_contact_menu(self, event, iter):
|
2005-07-06 16:34:59 +02:00
|
|
|
|
'''Make contact's popup menu'''
|
2005-06-12 17:14:07 +02:00
|
|
|
|
model = self.tree.get_model()
|
2005-09-09 00:07:49 +02:00
|
|
|
|
jid = model[iter][C_JID].decode('utf-8')
|
2006-11-18 21:52:28 +01:00
|
|
|
|
tree_path = model.get_path(iter)
|
2005-09-09 00:07:49 +02:00
|
|
|
|
account = model[iter][C_ACCOUNT].decode('utf-8')
|
2006-07-19 13:01:09 +02:00
|
|
|
|
our_jid = jid == gajim.get_jid_from_account(account)
|
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
|
|
|
|
contact = gajim.contacts.get_contact_with_highest_priority(account, jid)
|
2006-04-09 11:44:20 +02:00
|
|
|
|
if not contact:
|
|
|
|
|
return
|
2005-12-06 18:43:21 +01:00
|
|
|
|
|
2006-11-18 21:52:28 +01:00
|
|
|
|
if gajim.config.get_per('accounts', account, 'is_zeroconf'):
|
|
|
|
|
xml = gtkgui_helpers.get_glade('zeroconf_contact_context_menu.glade')
|
2006-11-20 08:53:58 +01:00
|
|
|
|
zeroconf_contact_context_menu = xml.get_widget(
|
|
|
|
|
'zeroconf_contact_context_menu')
|
|
|
|
|
|
2006-11-18 21:52:28 +01:00
|
|
|
|
start_chat_menuitem = xml.get_widget('start_chat_menuitem')
|
|
|
|
|
rename_menuitem = xml.get_widget('rename_menuitem')
|
|
|
|
|
edit_groups_menuitem = xml.get_widget('edit_groups_menuitem')
|
|
|
|
|
# separator has with send file, assign_openpgp_key_menuitem, etc..
|
|
|
|
|
above_send_file_separator = xml.get_widget('above_send_file_separator')
|
|
|
|
|
send_file_menuitem = xml.get_widget('send_file_menuitem')
|
|
|
|
|
assign_openpgp_key_menuitem = xml.get_widget(
|
|
|
|
|
'assign_openpgp_key_menuitem')
|
|
|
|
|
add_special_notification_menuitem = xml.get_widget(
|
|
|
|
|
'add_special_notification_menuitem')
|
2006-11-20 08:53:58 +01:00
|
|
|
|
|
2006-11-18 21:52:28 +01:00
|
|
|
|
add_special_notification_menuitem.hide()
|
|
|
|
|
add_special_notification_menuitem.set_no_show_all(True)
|
|
|
|
|
|
|
|
|
|
if not our_jid:
|
|
|
|
|
# add a special img for rename menuitem
|
|
|
|
|
path_to_kbd_input_img = os.path.join(gajim.DATA_DIR, 'pixmaps',
|
|
|
|
|
'kbd_input.png')
|
|
|
|
|
img = gtk.Image()
|
|
|
|
|
img.set_from_file(path_to_kbd_input_img)
|
|
|
|
|
rename_menuitem.set_image(img)
|
|
|
|
|
|
|
|
|
|
above_information_separator = xml.get_widget(
|
|
|
|
|
'above_information_separator')
|
|
|
|
|
|
|
|
|
|
# skip a separator
|
|
|
|
|
information_menuitem = xml.get_widget('information_menuitem')
|
|
|
|
|
history_menuitem = xml.get_widget('history_menuitem')
|
|
|
|
|
|
|
|
|
|
contacts = gajim.contacts.get_contact(account, jid)
|
2007-01-14 21:43:42 +01:00
|
|
|
|
if len(contacts) > 1: # several resources
|
2006-11-18 21:52:28 +01:00
|
|
|
|
sub_menu = gtk.Menu()
|
|
|
|
|
start_chat_menuitem.set_submenu(sub_menu)
|
|
|
|
|
|
|
|
|
|
iconset = gajim.config.get('iconset')
|
|
|
|
|
path = os.path.join(gajim.DATA_DIR, 'iconsets', iconset, '16x16')
|
|
|
|
|
for c in contacts:
|
|
|
|
|
# icon MUST be different instance for every item
|
|
|
|
|
state_images = self.load_iconset(path)
|
2006-11-20 08:53:58 +01:00
|
|
|
|
item = gtk.ImageMenuItem('%s (%s)' % (c.resource,
|
|
|
|
|
str(c.priority)))
|
2006-11-18 21:52:28 +01:00
|
|
|
|
icon_name = helpers.get_icon_name_to_show(c, account)
|
|
|
|
|
icon = state_images[icon_name]
|
|
|
|
|
item.set_image(icon)
|
|
|
|
|
sub_menu.append(item)
|
|
|
|
|
item.connect('activate', self.on_open_chat_window, c, account,
|
|
|
|
|
c.resource)
|
|
|
|
|
|
|
|
|
|
else: # one resource
|
|
|
|
|
start_chat_menuitem.connect('activate',
|
|
|
|
|
self.on_roster_treeview_row_activated, tree_path)
|
|
|
|
|
|
|
|
|
|
if contact.resource:
|
|
|
|
|
send_file_menuitem.connect('activate',
|
|
|
|
|
self.on_send_file_menuitem_activate, account, contact)
|
|
|
|
|
else: # if we do not have resource we cannot send file
|
|
|
|
|
send_file_menuitem.hide()
|
|
|
|
|
send_file_menuitem.set_no_show_all(True)
|
|
|
|
|
|
|
|
|
|
rename_menuitem.connect('activate', self.on_rename, iter, tree_path)
|
|
|
|
|
if contact.show in ('offline', 'error'):
|
|
|
|
|
information_menuitem.set_sensitive(False)
|
|
|
|
|
send_file_menuitem.set_sensitive(False)
|
|
|
|
|
else:
|
2006-11-20 08:53:58 +01:00
|
|
|
|
information_menuitem.connect('activate', self.on_info_zeroconf,
|
|
|
|
|
contact, account)
|
2006-11-18 21:52:28 +01:00
|
|
|
|
history_menuitem.connect('activate', self.on_history, contact,
|
|
|
|
|
account)
|
|
|
|
|
|
|
|
|
|
if _('Not in Roster') not in contact.groups:
|
|
|
|
|
#contact is in normal group
|
|
|
|
|
edit_groups_menuitem.set_no_show_all(False)
|
|
|
|
|
assign_openpgp_key_menuitem.set_no_show_all(False)
|
|
|
|
|
edit_groups_menuitem.connect('activate', self.on_edit_groups, [(
|
|
|
|
|
contact,account)])
|
|
|
|
|
|
|
|
|
|
if gajim.config.get('usegpg'):
|
|
|
|
|
assign_openpgp_key_menuitem.connect('activate',
|
|
|
|
|
self.on_assign_pgp_key, contact, account)
|
|
|
|
|
|
|
|
|
|
else: # contact is in group 'Not in Roster'
|
|
|
|
|
edit_groups_menuitem.hide()
|
|
|
|
|
edit_groups_menuitem.set_no_show_all(True)
|
|
|
|
|
# hide first of the two consecutive separators
|
|
|
|
|
above_send_file_separator.hide()
|
|
|
|
|
above_send_file_separator.set_no_show_all(True)
|
|
|
|
|
assign_openpgp_key_menuitem.hide()
|
|
|
|
|
assign_openpgp_key_menuitem.set_no_show_all(True)
|
|
|
|
|
|
|
|
|
|
# Remove many items when it's self contact row
|
|
|
|
|
if our_jid:
|
|
|
|
|
for menuitem in (rename_menuitem, edit_groups_menuitem,
|
|
|
|
|
above_information_separator):
|
|
|
|
|
menuitem.set_no_show_all(True)
|
|
|
|
|
menuitem.hide()
|
|
|
|
|
|
|
|
|
|
# Unsensitive many items when account is offline
|
|
|
|
|
if gajim.connections[account].connected < 2:
|
2006-11-20 08:53:58 +01:00
|
|
|
|
for widget in [start_chat_menuitem, rename_menuitem,
|
|
|
|
|
edit_groups_menuitem, send_file_menuitem]:
|
2006-11-18 21:52:28 +01:00
|
|
|
|
widget.set_sensitive(False)
|
|
|
|
|
|
|
|
|
|
event_button = gtkgui_helpers.get_possible_button_event(event)
|
|
|
|
|
|
|
|
|
|
zeroconf_contact_context_menu.attach_to_widget(self.tree, None)
|
|
|
|
|
zeroconf_contact_context_menu.connect('selection-done',
|
|
|
|
|
gtkgui_helpers.destroy_widget)
|
|
|
|
|
zeroconf_contact_context_menu.show_all()
|
|
|
|
|
zeroconf_contact_context_menu.popup(None, None, None, event_button,
|
|
|
|
|
event.time)
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# normal account
|
2006-05-02 17:53:25 +02:00
|
|
|
|
xml = gtkgui_helpers.get_glade('roster_contact_context_menu.glade')
|
2005-07-01 17:15:35 +02:00
|
|
|
|
roster_contact_context_menu = xml.get_widget(
|
|
|
|
|
'roster_contact_context_menu')
|
2006-03-15 18:45:55 +01:00
|
|
|
|
|
|
|
|
|
start_chat_menuitem = xml.get_widget('start_chat_menuitem')
|
2007-04-21 13:29:55 +02:00
|
|
|
|
send_custom_status_menuitem = xml.get_widget(
|
|
|
|
|
'send_custom_status_menuitem')
|
2006-04-01 14:10:02 +02:00
|
|
|
|
send_single_message_menuitem = xml.get_widget(
|
|
|
|
|
'send_single_message_menuitem')
|
2006-09-13 18:47:58 +02:00
|
|
|
|
invite_menuitem = xml.get_widget('invite_menuitem')
|
2007-04-24 21:56:24 +02:00
|
|
|
|
block_menuitem = xml.get_widget('block_menuitem')
|
|
|
|
|
unblock_menuitem = xml.get_widget('unblock_menuitem')
|
2006-03-15 18:45:55 +01:00
|
|
|
|
rename_menuitem = xml.get_widget('rename_menuitem')
|
|
|
|
|
edit_groups_menuitem = xml.get_widget('edit_groups_menuitem')
|
|
|
|
|
# separator has with send file, assign_openpgp_key_menuitem, etc..
|
|
|
|
|
above_send_file_separator = xml.get_widget('above_send_file_separator')
|
|
|
|
|
send_file_menuitem = xml.get_widget('send_file_menuitem')
|
2006-04-01 14:10:02 +02:00
|
|
|
|
assign_openpgp_key_menuitem = xml.get_widget(
|
|
|
|
|
'assign_openpgp_key_menuitem')
|
2006-03-15 18:45:55 +01:00
|
|
|
|
add_special_notification_menuitem = xml.get_widget(
|
|
|
|
|
'add_special_notification_menuitem')
|
2006-06-19 23:30:58 +02:00
|
|
|
|
execute_command_menuitem = xml.get_widget(
|
|
|
|
|
'execute_command_menuitem')
|
2006-11-20 08:53:58 +01:00
|
|
|
|
|
2006-03-17 23:00:27 +01:00
|
|
|
|
add_special_notification_menuitem.hide()
|
|
|
|
|
add_special_notification_menuitem.set_no_show_all(True)
|
2005-12-06 18:43:21 +01:00
|
|
|
|
|
2006-07-19 13:01:09 +02:00
|
|
|
|
if not our_jid:
|
|
|
|
|
# add a special img for rename menuitem
|
|
|
|
|
path_to_kbd_input_img = os.path.join(gajim.DATA_DIR, 'pixmaps',
|
|
|
|
|
'kbd_input.png')
|
|
|
|
|
img = gtk.Image()
|
|
|
|
|
img.set_from_file(path_to_kbd_input_img)
|
|
|
|
|
rename_menuitem.set_image(img)
|
|
|
|
|
|
2006-11-18 21:52:28 +01:00
|
|
|
|
muc_icon = self.load_icon('muc_active')
|
|
|
|
|
if muc_icon:
|
|
|
|
|
invite_menuitem.set_image(muc_icon)
|
|
|
|
|
|
2006-07-19 13:01:09 +02:00
|
|
|
|
above_subscription_separator = xml.get_widget(
|
|
|
|
|
'above_subscription_separator')
|
2006-03-15 18:45:55 +01:00
|
|
|
|
subscription_menuitem = xml.get_widget('subscription_menuitem')
|
2005-11-25 22:32:56 +01:00
|
|
|
|
send_auth_menuitem, ask_auth_menuitem, revoke_auth_menuitem =\
|
2006-03-15 18:45:55 +01:00
|
|
|
|
subscription_menuitem.get_submenu().get_children()
|
|
|
|
|
add_to_roster_menuitem = xml.get_widget('add_to_roster_menuitem')
|
2006-07-19 13:01:09 +02:00
|
|
|
|
remove_from_roster_menuitem = xml.get_widget(
|
|
|
|
|
'remove_from_roster_menuitem')
|
|
|
|
|
|
2006-04-09 11:44:20 +02:00
|
|
|
|
# skip a separator
|
2006-03-15 18:45:55 +01:00
|
|
|
|
information_menuitem = xml.get_widget('information_menuitem')
|
|
|
|
|
history_menuitem = xml.get_widget('history_menuitem')
|
2005-12-06 18:43:21 +01:00
|
|
|
|
|
2006-03-14 14:10:09 +01:00
|
|
|
|
contacts = gajim.contacts.get_contact(account, jid)
|
2007-01-14 21:43:42 +01:00
|
|
|
|
|
|
|
|
|
# Invite to
|
|
|
|
|
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)
|
|
|
|
|
contact_transport = gajim.get_transport_name_from_jid(contact.jid)
|
|
|
|
|
t = contact_transport or 'jabber' # transform None in 'jabber'
|
|
|
|
|
if not gajim.connections[account].muc_jid.has_key(t):
|
|
|
|
|
invite_to_new_room_menuitem.set_sensitive(False)
|
|
|
|
|
invite_to_submenu.append(invite_to_new_room_menuitem)
|
|
|
|
|
rooms = [] # a list of (room_jid, account) tuple
|
|
|
|
|
for gc_control in gajim.interface.msg_win_mgr.get_controls(
|
|
|
|
|
message_control.TYPE_GC):
|
|
|
|
|
acct = gc_control.account
|
|
|
|
|
room_jid = gc_control.room_jid
|
|
|
|
|
if gajim.gc_connected[acct].has_key(room_jid) and \
|
|
|
|
|
gajim.gc_connected[acct][room_jid] and \
|
|
|
|
|
contact_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)
|
|
|
|
|
|
2007-04-21 13:29:55 +02:00
|
|
|
|
# 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(gajim.DATA_DIR, 'iconsets', iconset, '16x16')
|
|
|
|
|
for s in ['online', 'chat', 'away', 'xa', 'dnd', 'offline']:
|
|
|
|
|
# icon MUST be different instance for every item
|
|
|
|
|
state_images = self.load_iconset(path)
|
|
|
|
|
status_menuitem = gtk.ImageMenuItem(helpers.get_uf_show(s))
|
|
|
|
|
status_menuitem.connect('activate', self.on_send_custom_status,
|
2007-04-21 13:45:23 +02:00
|
|
|
|
[(contact, account)], s)
|
2007-04-21 13:29:55 +02:00
|
|
|
|
icon = state_images[s]
|
|
|
|
|
status_menuitem.set_image(icon)
|
|
|
|
|
status_menuitems.append(status_menuitem)
|
2006-11-20 18:24:52 +01:00
|
|
|
|
if len(contacts) > 1: # several resources
|
2007-01-14 21:43:42 +01:00
|
|
|
|
def resources_submenu(action, room_jid = None, room_account = None):
|
|
|
|
|
''' Build a submenu with contact's resources.
|
|
|
|
|
room_jid and room_account are for action self.on_invite_to_room '''
|
2006-06-19 23:30:58 +02:00
|
|
|
|
sub_menu = gtk.Menu()
|
|
|
|
|
|
|
|
|
|
iconset = gajim.config.get('iconset')
|
|
|
|
|
if not iconset:
|
2006-11-20 18:24:52 +01:00
|
|
|
|
iconset = gajim.config.DEFAULT_ICONSET
|
2006-06-19 23:30:58 +02:00
|
|
|
|
path = os.path.join(gajim.DATA_DIR, 'iconsets', iconset, '16x16')
|
|
|
|
|
for c in contacts:
|
|
|
|
|
# icon MUST be different instance for every item
|
|
|
|
|
state_images = self.load_iconset(path)
|
2006-11-20 08:53:58 +01:00
|
|
|
|
item = gtk.ImageMenuItem('%s (%s)' % (c.resource,
|
|
|
|
|
str(c.priority)))
|
2006-06-19 23:30:58 +02:00
|
|
|
|
icon_name = helpers.get_icon_name_to_show(c, account)
|
|
|
|
|
icon = state_images[icon_name]
|
|
|
|
|
item.set_image(icon)
|
|
|
|
|
sub_menu.append(item)
|
2007-01-14 21:43:42 +01:00
|
|
|
|
if action == self.on_invite_to_room:
|
|
|
|
|
item.connect('activate', action, [(c, account)],
|
|
|
|
|
room_jid, room_account, c.resource)
|
|
|
|
|
elif action == self.on_invite_to_new_room:
|
|
|
|
|
item.connect('activate', action, [(c, account)], c.resource)
|
|
|
|
|
else: # start_chat, execute_command
|
|
|
|
|
item.connect('activate', action, c, account, c.resource)
|
2006-06-19 23:30:58 +02:00
|
|
|
|
return sub_menu
|
|
|
|
|
|
2006-11-20 08:53:58 +01:00
|
|
|
|
start_chat_menuitem.set_submenu(resources_submenu(
|
|
|
|
|
self.on_open_chat_window))
|
|
|
|
|
execute_command_menuitem.set_submenu(resources_submenu(
|
|
|
|
|
self.on_execute_command))
|
2007-01-14 21:43:42 +01:00
|
|
|
|
invite_to_new_room_menuitem.set_submenu(resources_submenu(
|
|
|
|
|
self.on_invite_to_new_room))
|
|
|
|
|
for (room_jid, room_account) in rooms:
|
|
|
|
|
menuitem = gtk.MenuItem(room_jid.split('@')[0])
|
|
|
|
|
menuitem.set_submenu(resources_submenu(self.on_invite_to_room,
|
|
|
|
|
room_jid, room_account))
|
|
|
|
|
invite_to_submenu.append(menuitem)
|
2006-03-14 14:10:09 +01:00
|
|
|
|
|
|
|
|
|
else: # one resource
|
|
|
|
|
start_chat_menuitem.connect('activate',
|
2006-06-19 23:30:58 +02:00
|
|
|
|
self.on_open_chat_window, contact, account)
|
|
|
|
|
# we cannot execute commands when the resource is unknown
|
2006-06-23 00:49:39 +02:00
|
|
|
|
# TODO: that's true only if the entity is a contact,
|
|
|
|
|
# TODO: we need to show this also for transports
|
2006-06-19 23:30:58 +02:00
|
|
|
|
if contact.resource:
|
|
|
|
|
execute_command_menuitem.connect('activate',
|
2006-06-23 00:49:39 +02:00
|
|
|
|
self.on_execute_command, contact, account, contact.resource)
|
2006-06-19 23:30:58 +02:00
|
|
|
|
else:
|
|
|
|
|
execute_command_menuitem.hide()
|
|
|
|
|
execute_command_menuitem.set_no_show_all(True)
|
2005-12-06 18:43:21 +01:00
|
|
|
|
|
2007-01-14 21:43:42 +01:00
|
|
|
|
our_jid_other_resource = None
|
|
|
|
|
if our_jid:
|
|
|
|
|
# It's another resource of us, be sure to send invite to her
|
|
|
|
|
our_jid_other_resource = contact.resource
|
|
|
|
|
# Else this var is useless but harmless in next connect calls
|
|
|
|
|
|
|
|
|
|
invite_to_new_room_menuitem.connect('activate',
|
|
|
|
|
self.on_invite_to_new_room, [(contact, account)],
|
|
|
|
|
our_jid_other_resource)
|
|
|
|
|
for (room_jid, room_account) in rooms:
|
|
|
|
|
menuitem = gtk.MenuItem(room_jid.split('@')[0])
|
|
|
|
|
menuitem.connect('activate', self.on_invite_to_room,
|
|
|
|
|
[(contact, account)], room_jid, room_account,
|
|
|
|
|
our_jid_other_resource)
|
|
|
|
|
invite_to_submenu.append(menuitem)
|
|
|
|
|
|
2005-10-07 16:46:10 +02:00
|
|
|
|
if contact.resource:
|
2005-10-07 16:21:31 +02:00
|
|
|
|
send_file_menuitem.connect('activate',
|
|
|
|
|
self.on_send_file_menuitem_activate, account, contact)
|
2005-10-07 16:46:10 +02:00
|
|
|
|
else: # if we do not have resource we cannot send file
|
|
|
|
|
send_file_menuitem.hide()
|
|
|
|
|
send_file_menuitem.set_no_show_all(True)
|
2005-12-06 18:43:21 +01:00
|
|
|
|
|
2005-07-01 17:15:35 +02:00
|
|
|
|
send_single_message_menuitem.connect('activate',
|
|
|
|
|
self.on_send_single_message_menuitem_activate, account, contact)
|
2006-09-13 18:47:58 +02:00
|
|
|
|
|
2006-11-18 21:52:28 +01:00
|
|
|
|
rename_menuitem.connect('activate', self.on_rename, iter, tree_path)
|
2005-07-01 17:15:35 +02:00
|
|
|
|
remove_from_roster_menuitem.connect('activate', self.on_req_usub,
|
2006-09-13 18:47:58 +02:00
|
|
|
|
[(contact, account)])
|
2005-07-01 17:15:35 +02:00
|
|
|
|
information_menuitem.connect('activate', self.on_info, contact,
|
|
|
|
|
account)
|
|
|
|
|
history_menuitem.connect('activate', self.on_history, contact,
|
|
|
|
|
account)
|
|
|
|
|
|
2006-01-19 22:55:01 +01:00
|
|
|
|
if _('Not in Roster') not in contact.groups:
|
2005-07-01 17:15:35 +02:00
|
|
|
|
#contact is in normal group
|
|
|
|
|
edit_groups_menuitem.set_no_show_all(False)
|
|
|
|
|
assign_openpgp_key_menuitem.set_no_show_all(False)
|
|
|
|
|
add_to_roster_menuitem.hide()
|
|
|
|
|
add_to_roster_menuitem.set_no_show_all(True)
|
2006-09-13 18:47:58 +02:00
|
|
|
|
edit_groups_menuitem.connect('activate', self.on_edit_groups, [(
|
|
|
|
|
contact,account)])
|
2005-06-20 21:18:53 +02:00
|
|
|
|
|
2005-06-12 17:14:07 +02:00
|
|
|
|
if gajim.config.get('usegpg'):
|
2005-07-01 17:15:35 +02:00
|
|
|
|
assign_openpgp_key_menuitem.connect('activate',
|
|
|
|
|
self.on_assign_pgp_key, contact, account)
|
2005-06-20 21:18:53 +02:00
|
|
|
|
|
2005-11-25 22:32:56 +01:00
|
|
|
|
if contact.sub in ('from', 'both'):
|
|
|
|
|
send_auth_menuitem.set_sensitive(False)
|
|
|
|
|
else:
|
|
|
|
|
send_auth_menuitem.connect('activate', self.authorize, jid, account)
|
|
|
|
|
if contact.sub in ('to', 'both'):
|
|
|
|
|
ask_auth_menuitem.set_sensitive(False)
|
2006-03-15 18:45:55 +01:00
|
|
|
|
add_special_notification_menuitem.connect('activate',
|
|
|
|
|
self.on_add_special_notification_menuitem_activate, jid)
|
2005-11-25 22:32:56 +01:00
|
|
|
|
else:
|
|
|
|
|
ask_auth_menuitem.connect('activate', self.req_sub, jid,
|
2006-12-10 15:18:31 +01:00
|
|
|
|
_('I would like to add you to my roster'), account,
|
|
|
|
|
contact.groups, contact.name)
|
2005-11-25 22:32:56 +01:00
|
|
|
|
if contact.sub in ('to', 'none'):
|
|
|
|
|
revoke_auth_menuitem.set_sensitive(False)
|
|
|
|
|
else:
|
|
|
|
|
revoke_auth_menuitem.connect('activate', self.revoke_auth, jid,
|
|
|
|
|
account)
|
2005-12-06 18:43:21 +01:00
|
|
|
|
|
2006-01-19 22:55:01 +01:00
|
|
|
|
else: # contact is in group 'Not in Roster'
|
2005-07-01 17:15:35 +02:00
|
|
|
|
add_to_roster_menuitem.set_no_show_all(False)
|
|
|
|
|
edit_groups_menuitem.hide()
|
|
|
|
|
edit_groups_menuitem.set_no_show_all(True)
|
2005-07-21 11:45:55 +02:00
|
|
|
|
# hide first of the two consecutive separators
|
2006-03-15 18:45:55 +01:00
|
|
|
|
above_send_file_separator.hide()
|
|
|
|
|
above_send_file_separator.set_no_show_all(True)
|
2005-07-01 17:15:35 +02:00
|
|
|
|
assign_openpgp_key_menuitem.hide()
|
|
|
|
|
assign_openpgp_key_menuitem.set_no_show_all(True)
|
2006-04-09 12:35:21 +02:00
|
|
|
|
subscription_menuitem.hide()
|
|
|
|
|
subscription_menuitem.set_no_show_all(True)
|
2005-12-06 18:43:21 +01:00
|
|
|
|
|
2005-07-01 17:15:35 +02:00
|
|
|
|
add_to_roster_menuitem.connect('activate',
|
|
|
|
|
self.on_add_to_roster, contact, account)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
2006-07-19 13:08:25 +02:00
|
|
|
|
# Remove many items when it's self contact row
|
|
|
|
|
if our_jid:
|
|
|
|
|
for menuitem in (rename_menuitem, edit_groups_menuitem,
|
|
|
|
|
above_subscription_separator, subscription_menuitem,
|
|
|
|
|
remove_from_roster_menuitem):
|
|
|
|
|
menuitem.set_no_show_all(True)
|
|
|
|
|
menuitem.hide()
|
|
|
|
|
|
2006-04-01 14:10:02 +02:00
|
|
|
|
# Unsensitive many items when account is offline
|
|
|
|
|
if gajim.connections[account].connected < 2:
|
|
|
|
|
for widget in [start_chat_menuitem, send_single_message_menuitem,
|
|
|
|
|
rename_menuitem, edit_groups_menuitem, send_file_menuitem,
|
|
|
|
|
subscription_menuitem, add_to_roster_menuitem,
|
2006-08-07 18:18:01 +02:00
|
|
|
|
remove_from_roster_menuitem, execute_command_menuitem]:
|
2006-04-01 14:10:02 +02:00
|
|
|
|
widget.set_sensitive(False)
|
|
|
|
|
|
2007-04-24 21:56:24 +02:00
|
|
|
|
if gajim.connections[account] and gajim.connections[account].\
|
|
|
|
|
privacy_rules_supported:
|
|
|
|
|
if jid in gajim.connections[account].blocked_contacts:
|
|
|
|
|
block_menuitem.set_no_show_all(True)
|
|
|
|
|
unblock_menuitem.connect('activate', self.on_unblock, iter, None)
|
|
|
|
|
block_menuitem.hide()
|
|
|
|
|
else:
|
|
|
|
|
unblock_menuitem.set_no_show_all(True)
|
|
|
|
|
block_menuitem.connect('activate', self.on_block, iter, None)
|
|
|
|
|
unblock_menuitem.hide()
|
|
|
|
|
else:
|
|
|
|
|
block_menuitem.set_no_show_all(True)
|
|
|
|
|
unblock_menuitem.set_no_show_all(True)
|
|
|
|
|
block_menuitem.hide()
|
|
|
|
|
unblock_menuitem.hide()
|
|
|
|
|
|
2006-03-29 18:42:06 +02:00
|
|
|
|
event_button = gtkgui_helpers.get_possible_button_event(event)
|
2005-07-17 22:29:44 +02:00
|
|
|
|
|
2006-04-07 17:51:17 +02:00
|
|
|
|
roster_contact_context_menu.attach_to_widget(self.tree, None)
|
|
|
|
|
roster_contact_context_menu.connect('selection-done',
|
|
|
|
|
gtkgui_helpers.destroy_widget)
|
2006-05-26 15:25:31 +02:00
|
|
|
|
roster_contact_context_menu.show_all()
|
2005-07-17 22:29:44 +02:00
|
|
|
|
roster_contact_context_menu.popup(None, None, None, event_button,
|
2005-07-01 17:15:35 +02:00
|
|
|
|
event.time)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
2007-01-14 21:43:42 +01:00
|
|
|
|
def on_invite_to_new_room(self, widget, list_, resource = None):
|
|
|
|
|
''' resource parameter MUST NOT be used if more than one contact in
|
|
|
|
|
list '''
|
2006-09-13 18:47:58 +02:00
|
|
|
|
account_list = []
|
|
|
|
|
jid_list = []
|
|
|
|
|
for (contact, account) in list_:
|
|
|
|
|
if contact.jid not in jid_list:
|
2007-01-14 21:43:42 +01:00
|
|
|
|
if resource: # we MUST have one contact only in list_
|
|
|
|
|
fjid = contact.jid + '/' + resource
|
|
|
|
|
jid_list.append(fjid)
|
|
|
|
|
else:
|
|
|
|
|
jid_list.append(contact.jid)
|
2006-09-13 18:47:58 +02:00
|
|
|
|
if account not in account_list:
|
|
|
|
|
account_list.append(account)
|
|
|
|
|
# transform None in 'jabber'
|
|
|
|
|
type_ = gajim.get_transport_name_from_jid(jid_list[0]) or 'jabber'
|
|
|
|
|
for account in account_list:
|
|
|
|
|
if gajim.connections[account].muc_jid[type_]:
|
|
|
|
|
# create the room on this muc server
|
|
|
|
|
if gajim.interface.instances[account].has_key('join_gc'):
|
|
|
|
|
gajim.interface.instances[account]['join_gc'].window.destroy()
|
|
|
|
|
try:
|
|
|
|
|
gajim.interface.instances[account]['join_gc'] = \
|
|
|
|
|
dialogs.JoinGroupchatWindow(account,
|
2006-11-18 21:52:28 +01:00
|
|
|
|
gajim.connections[account].muc_jid[type_],
|
2006-09-13 18:47:58 +02:00
|
|
|
|
automatic = {'invities': jid_list})
|
2006-11-18 21:52:28 +01:00
|
|
|
|
except GajimGeneralException:
|
2006-09-13 18:47:58 +02:00
|
|
|
|
continue
|
|
|
|
|
break
|
|
|
|
|
|
2007-01-14 21:43:42 +01:00
|
|
|
|
def on_invite_to_room(self, widget, list_, room_jid, room_account,
|
|
|
|
|
resource = None):
|
|
|
|
|
''' resource parameter MUST NOT be used if more than one contact in
|
|
|
|
|
list '''
|
2006-09-13 18:47:58 +02:00
|
|
|
|
for (contact, acct) in list_:
|
2007-01-14 21:43:42 +01:00
|
|
|
|
contact_jid = contact.jid
|
|
|
|
|
if resource: # we MUST have one contact only in list_
|
|
|
|
|
contact_jid += '/' + resource
|
|
|
|
|
gajim.connections[room_account].send_invite(room_jid, contact_jid)
|
2006-09-13 18:47:58 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def make_multiple_contact_menu(self, event, iters):
|
|
|
|
|
'''Make group's popup menu'''
|
|
|
|
|
model = self.tree.get_model()
|
|
|
|
|
list_ = [] # list of (jid, account) tuples
|
|
|
|
|
one_account_offline = False
|
|
|
|
|
connected_accounts = []
|
|
|
|
|
contacts_transport = -1
|
|
|
|
|
# -1 is at start, False when not from the same, None when jabber
|
2007-04-25 17:54:58 +02:00
|
|
|
|
is_blocked = True
|
2006-09-13 18:47:58 +02:00
|
|
|
|
for iter in iters:
|
|
|
|
|
jid = model[iter][C_JID].decode('utf-8')
|
|
|
|
|
account = model[iter][C_ACCOUNT].decode('utf-8')
|
|
|
|
|
if gajim.connections[account].connected < 2:
|
|
|
|
|
one_account_offline = True
|
|
|
|
|
elif not account in connected_accounts:
|
|
|
|
|
connected_accounts.append(account)
|
|
|
|
|
contact = gajim.contacts.get_contact_with_highest_priority(account,
|
|
|
|
|
jid)
|
|
|
|
|
transport = gajim.get_transport_name_from_jid(contact.jid)
|
|
|
|
|
if contacts_transport == -1:
|
|
|
|
|
contacts_transport = transport
|
|
|
|
|
if contacts_transport != transport:
|
|
|
|
|
contacts_transport = False
|
2007-04-25 17:54:58 +02:00
|
|
|
|
if jid not in gajim.connections[account].blocked_contacts:
|
|
|
|
|
is_blocked = False
|
2006-09-13 18:47:58 +02:00
|
|
|
|
list_.append((contact, account))
|
|
|
|
|
|
|
|
|
|
menu = gtk.Menu()
|
|
|
|
|
|
|
|
|
|
remove_item = gtk.ImageMenuItem(_('_Remove from Roster'))
|
|
|
|
|
icon = gtk.image_new_from_stock(gtk.STOCK_REMOVE, gtk.ICON_SIZE_MENU)
|
|
|
|
|
remove_item.set_image(icon)
|
|
|
|
|
menu.append(remove_item)
|
|
|
|
|
remove_item.connect('activate', self.on_req_usub, list_)
|
|
|
|
|
|
|
|
|
|
invite_item = gtk.ImageMenuItem(_('In_vite to'))
|
|
|
|
|
icon = gtk.image_new_from_stock(gtk.STOCK_GO_BACK, gtk.ICON_SIZE_MENU)
|
|
|
|
|
invite_item.set_image(icon)
|
|
|
|
|
if contacts_transport == False:
|
|
|
|
|
# they are not all from the same transport
|
|
|
|
|
invite_item.set_sensitive(False)
|
|
|
|
|
else:
|
|
|
|
|
|
|
|
|
|
sub_menu = gtk.Menu()
|
2006-11-18 21:52:28 +01:00
|
|
|
|
menuitem = gtk.ImageMenuItem(_('_New group chat'))
|
2006-09-13 18:47:58 +02:00
|
|
|
|
icon = gtk.image_new_from_stock(gtk.STOCK_NEW, gtk.ICON_SIZE_MENU)
|
|
|
|
|
menuitem.set_image(icon)
|
|
|
|
|
menuitem.connect('activate', self.on_invite_to_new_room, list_)
|
|
|
|
|
muc_jid = {}
|
|
|
|
|
c_t = contacts_transport or 'jabber' # transform None in 'jabber'
|
|
|
|
|
for account in connected_accounts:
|
|
|
|
|
for t in gajim.connections[account].muc_jid:
|
|
|
|
|
muc_jid[t] = gajim.connections[account].muc_jid[t]
|
|
|
|
|
if not muc_jid.has_key(c_t):
|
|
|
|
|
menuitem.set_sensitive(False)
|
|
|
|
|
sub_menu.append(menuitem)
|
|
|
|
|
rooms = [] # a list of (room_jid, account) tuple
|
|
|
|
|
for gc_control in gajim.interface.msg_win_mgr.get_controls(
|
|
|
|
|
message_control.TYPE_GC):
|
|
|
|
|
account = gc_control.account
|
|
|
|
|
room_jid = gc_control.room_jid
|
|
|
|
|
if gajim.gc_connected[account].has_key(room_jid) and \
|
|
|
|
|
gajim.gc_connected[account][room_jid] and \
|
|
|
|
|
contacts_transport == gajim.get_transport_name_from_jid(room_jid):
|
|
|
|
|
rooms.append((room_jid, account))
|
|
|
|
|
if len(rooms):
|
|
|
|
|
item = gtk.SeparatorMenuItem() # separator
|
|
|
|
|
sub_menu.append(item)
|
|
|
|
|
for (room_jid, account) in rooms:
|
|
|
|
|
menuitem = gtk.MenuItem(room_jid.split('@')[0])
|
|
|
|
|
menuitem.connect('activate', self.on_invite_to_room, list_,
|
|
|
|
|
room_jid, account)
|
|
|
|
|
sub_menu.append(menuitem)
|
|
|
|
|
|
|
|
|
|
invite_item.set_submenu(sub_menu)
|
|
|
|
|
menu.append(invite_item)
|
|
|
|
|
|
|
|
|
|
edit_groups_item = gtk.MenuItem(_('Edit _Groups'))
|
|
|
|
|
menu.append(edit_groups_item)
|
|
|
|
|
edit_groups_item.connect('activate', self.on_edit_groups, list_)
|
2006-11-18 21:52:28 +01:00
|
|
|
|
|
|
|
|
|
account = None
|
|
|
|
|
for (contact, current_account) in list_:
|
|
|
|
|
# check that we use the same account for every sender
|
|
|
|
|
if account is not None and account != current_account:
|
|
|
|
|
account = None
|
|
|
|
|
break
|
|
|
|
|
account = current_account
|
|
|
|
|
if account is not None:
|
|
|
|
|
send_group_message_item = gtk.MenuItem(_('Send Group M_essage'))
|
|
|
|
|
menu.append(send_group_message_item)
|
|
|
|
|
send_group_message_item.connect('activate',
|
|
|
|
|
self.on_send_single_message_menuitem_activate, account, list_)
|
2006-09-13 18:47:58 +02:00
|
|
|
|
|
2007-04-25 17:54:58 +02:00
|
|
|
|
if is_blocked:
|
|
|
|
|
unblock_menuitem = gtk.ImageMenuItem(_('_Unblock'))
|
|
|
|
|
icon = gtk.image_new_from_stock(gtk.STOCK_YES, gtk.ICON_SIZE_MENU)
|
|
|
|
|
unblock_menuitem.set_image(icon)
|
|
|
|
|
unblock_menuitem.connect('activate', self.on_unblock, None, list_)
|
|
|
|
|
menu.append(unblock_menuitem)
|
|
|
|
|
else:
|
|
|
|
|
block_menuitem = gtk.ImageMenuItem(_('_Block'))
|
|
|
|
|
icon = gtk.image_new_from_stock(gtk.STOCK_NO, gtk.ICON_SIZE_MENU)
|
|
|
|
|
block_menuitem.set_image(icon)
|
|
|
|
|
block_menuitem.connect('activate', self.on_block, None, list_)
|
|
|
|
|
menu.append(block_menuitem)
|
2006-09-13 18:47:58 +02:00
|
|
|
|
# unsensitive if one account is not connected
|
|
|
|
|
if one_account_offline:
|
|
|
|
|
remove_item.set_sensitive(False)
|
|
|
|
|
|
|
|
|
|
event_button = gtkgui_helpers.get_possible_button_event(event)
|
|
|
|
|
|
|
|
|
|
menu.attach_to_widget(self.tree, None)
|
|
|
|
|
menu.connect('selection-done', gtkgui_helpers.destroy_widget)
|
|
|
|
|
menu.show_all()
|
|
|
|
|
menu.popup(None, None, None, event_button, event.time)
|
|
|
|
|
|
2006-03-29 18:42:06 +02:00
|
|
|
|
def make_group_menu(self, event, iter):
|
2005-06-12 17:14:07 +02:00
|
|
|
|
'''Make group's popup menu'''
|
|
|
|
|
model = self.tree.get_model()
|
|
|
|
|
path = model.get_path(iter)
|
2006-04-01 14:10:02 +02:00
|
|
|
|
group = model[iter][C_JID].decode('utf-8')
|
|
|
|
|
account = model[iter][C_ACCOUNT].decode('utf-8')
|
2005-12-06 18:43:21 +01:00
|
|
|
|
|
2005-06-12 17:14:07 +02:00
|
|
|
|
menu = gtk.Menu()
|
2006-11-18 21:52:28 +01:00
|
|
|
|
if not group in helpers.special_groups + (_('General'),):
|
2005-06-20 21:18:53 +02:00
|
|
|
|
|
2006-11-18 21:52:28 +01:00
|
|
|
|
rename_item = gtk.ImageMenuItem(_('Re_name'))
|
|
|
|
|
# add a special img for rename menuitem
|
|
|
|
|
path_to_kbd_input_img = os.path.join(gajim.DATA_DIR, 'pixmaps',
|
|
|
|
|
'kbd_input.png')
|
|
|
|
|
img = gtk.Image()
|
|
|
|
|
img.set_from_file(path_to_kbd_input_img)
|
|
|
|
|
rename_item.set_image(img)
|
|
|
|
|
menu.append(rename_item)
|
|
|
|
|
rename_item.connect('activate', self.on_rename, iter, path)
|
|
|
|
|
|
|
|
|
|
# Remove group
|
|
|
|
|
remove_item = gtk.ImageMenuItem(_('_Remove from Roster'))
|
|
|
|
|
icon = gtk.image_new_from_stock(gtk.STOCK_REMOVE, gtk.ICON_SIZE_MENU)
|
|
|
|
|
remove_item.set_image(icon)
|
|
|
|
|
menu.append(remove_item)
|
|
|
|
|
remove_item.connect('activate', self.on_remove_group_item_activated,
|
|
|
|
|
group, account)
|
|
|
|
|
|
|
|
|
|
# unsensitive if account is not connected
|
|
|
|
|
if gajim.connections[account].connected < 2:
|
|
|
|
|
rename_item.set_sensitive(False)
|
|
|
|
|
send_group_message_item = gtk.MenuItem(_('Send Group M_essage'))
|
2005-06-20 21:18:53 +02:00
|
|
|
|
|
2006-11-18 21:52:28 +01:00
|
|
|
|
send_group_message_submenu = gtk.Menu()
|
|
|
|
|
send_group_message_item.set_submenu(send_group_message_submenu)
|
|
|
|
|
menu.append(send_group_message_item)
|
|
|
|
|
|
|
|
|
|
group_message_to_all_item = gtk.MenuItem(_('To all users'))
|
|
|
|
|
send_group_message_submenu.append(group_message_to_all_item)
|
|
|
|
|
|
|
|
|
|
group_message_to_all_online_item = gtk.MenuItem(_('To all online users'))
|
|
|
|
|
send_group_message_submenu.append(group_message_to_all_online_item)
|
|
|
|
|
list_ = [] # list of (jid, account) tuples
|
|
|
|
|
list_online = [] # list of (jid, account) tuples
|
|
|
|
|
|
2006-11-20 23:22:30 +01:00
|
|
|
|
group = model[iter][C_JID]
|
2006-11-18 21:52:28 +01:00
|
|
|
|
for jid in gajim.contacts.get_jid_list(account):
|
|
|
|
|
contact = gajim.contacts.get_contact_with_highest_priority(account,
|
|
|
|
|
jid)
|
2006-11-20 08:53:58 +01:00
|
|
|
|
if group in contact.groups or (contact.groups == [] and group == \
|
|
|
|
|
_('General')):
|
2006-11-18 21:52:28 +01:00
|
|
|
|
if contact.show not in ('offline', 'error'):
|
|
|
|
|
list_online.append((contact, account))
|
|
|
|
|
list_.append((contact, account))
|
|
|
|
|
|
|
|
|
|
group_message_to_all_online_item.connect('activate',
|
|
|
|
|
self.on_send_single_message_menuitem_activate, account, list_online)
|
|
|
|
|
group_message_to_all_item.connect('activate',
|
|
|
|
|
self.on_send_single_message_menuitem_activate, account, list_)
|
2006-04-01 14:10:02 +02:00
|
|
|
|
|
2007-04-21 13:45:23 +02:00
|
|
|
|
send_custom_status_menuitem = gtk.ImageMenuItem(_('Send Cus_tom Status'))
|
|
|
|
|
# add a special img for this menuitem
|
|
|
|
|
icon = gtk.image_new_from_stock(gtk.STOCK_GO_UP, gtk.ICON_SIZE_MENU)
|
|
|
|
|
send_custom_status_menuitem.set_image(icon)
|
|
|
|
|
status_menuitems = gtk.Menu()
|
|
|
|
|
send_custom_status_menuitem.set_submenu(status_menuitems)
|
|
|
|
|
iconset = gajim.config.get('iconset')
|
|
|
|
|
path = os.path.join(gajim.DATA_DIR, 'iconsets', iconset, '16x16')
|
|
|
|
|
for s in ['online', 'chat', 'away', 'xa', 'dnd', 'offline']:
|
|
|
|
|
# icon MUST be different instance for every item
|
|
|
|
|
state_images = self.load_iconset(path)
|
|
|
|
|
status_menuitem = gtk.ImageMenuItem(helpers.get_uf_show(s))
|
|
|
|
|
status_menuitem.connect('activate', self.on_send_custom_status, list_,
|
|
|
|
|
s)
|
|
|
|
|
icon = state_images[s]
|
|
|
|
|
status_menuitem.set_image(icon)
|
|
|
|
|
status_menuitems.append(status_menuitem)
|
|
|
|
|
menu.append(send_custom_status_menuitem)
|
2007-04-24 21:56:24 +02:00
|
|
|
|
is_blocked = False
|
|
|
|
|
if self.regroup:
|
|
|
|
|
for g_account in gajim.connections:
|
|
|
|
|
if group in gajim.connections[g_account].blocked_groups:
|
|
|
|
|
is_blocked = True
|
|
|
|
|
else:
|
|
|
|
|
if group in gajim.connections[account].blocked_groups:
|
|
|
|
|
is_blocked = True
|
|
|
|
|
|
|
|
|
|
if group not in helpers.special_groups + (_('General'),):
|
|
|
|
|
if is_blocked:
|
|
|
|
|
unblock_menuitem = gtk.ImageMenuItem(_('_Unblock'))
|
2007-04-25 17:54:58 +02:00
|
|
|
|
icon = gtk.image_new_from_stock(gtk.STOCK_YES, gtk.ICON_SIZE_MENU)
|
2007-04-24 21:56:24 +02:00
|
|
|
|
unblock_menuitem.set_image(icon)
|
|
|
|
|
unblock_menuitem.connect('activate', self.on_unblock, iter, list_)
|
|
|
|
|
menu.append(unblock_menuitem)
|
|
|
|
|
else:
|
|
|
|
|
block_menuitem = gtk.ImageMenuItem(_('_Block'))
|
2007-04-25 17:54:58 +02:00
|
|
|
|
icon = gtk.image_new_from_stock(gtk.STOCK_NO, gtk.ICON_SIZE_MENU)
|
2007-04-24 21:56:24 +02:00
|
|
|
|
block_menuitem.set_image(icon)
|
|
|
|
|
block_menuitem.connect('activate', self.on_block, iter, list_)
|
|
|
|
|
menu.append(block_menuitem)
|
2007-04-21 13:45:23 +02:00
|
|
|
|
|
2006-03-29 18:42:06 +02:00
|
|
|
|
event_button = gtkgui_helpers.get_possible_button_event(event)
|
2005-12-06 18:43:21 +01:00
|
|
|
|
|
2006-04-07 17:51:17 +02:00
|
|
|
|
menu.attach_to_widget(self.tree, None)
|
|
|
|
|
menu.connect('selection-done', gtkgui_helpers.destroy_widget)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
menu.show_all()
|
2006-05-26 15:25:31 +02:00
|
|
|
|
menu.popup(None, None, None, event_button, event.time)
|
2005-12-06 18:43:21 +01:00
|
|
|
|
|
2006-03-29 18:42:06 +02:00
|
|
|
|
def make_transport_menu(self, event, iter):
|
|
|
|
|
'''Make transport's popup menu'''
|
2005-06-12 17:14:07 +02:00
|
|
|
|
model = self.tree.get_model()
|
2005-09-09 00:07:49 +02:00
|
|
|
|
jid = model[iter][C_JID].decode('utf-8')
|
2005-06-12 17:14:07 +02:00
|
|
|
|
path = model.get_path(iter)
|
2005-09-09 00:07:49 +02:00
|
|
|
|
account = model[iter][C_ACCOUNT].decode('utf-8')
|
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
|
|
|
|
contact = gajim.contacts.get_contact_with_highest_priority(account, jid)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
menu = gtk.Menu()
|
2005-12-06 18:43:21 +01:00
|
|
|
|
|
2005-07-04 23:29:22 +02:00
|
|
|
|
item = gtk.ImageMenuItem(_('_Log on'))
|
2005-07-08 00:22:13 +02:00
|
|
|
|
icon = gtk.image_new_from_stock(gtk.STOCK_YES, gtk.ICON_SIZE_MENU)
|
|
|
|
|
item.set_image(icon)
|
2005-06-20 21:18:53 +02:00
|
|
|
|
menu.append(item)
|
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
|
|
|
|
show = contact.show
|
2006-11-18 21:52:28 +01:00
|
|
|
|
if (show != 'offline' and show != 'error') or\
|
|
|
|
|
gajim.account_is_disconnected(account):
|
2005-06-12 17:14:07 +02:00
|
|
|
|
item.set_sensitive(False)
|
|
|
|
|
item.connect('activate', self.on_agent_logging, jid, None, account)
|
|
|
|
|
|
2005-07-04 23:29:22 +02:00
|
|
|
|
item = gtk.ImageMenuItem(_('Log _off'))
|
2005-07-06 16:34:59 +02:00
|
|
|
|
icon = gtk.image_new_from_stock(gtk.STOCK_NO, gtk.ICON_SIZE_MENU)
|
2005-07-04 23:29:22 +02:00
|
|
|
|
item.set_image(icon)
|
2005-06-20 21:18:53 +02:00
|
|
|
|
menu.append(item)
|
2006-11-18 21:52:28 +01:00
|
|
|
|
if show in ('offline', 'error') or gajim.account_is_disconnected(
|
|
|
|
|
account):
|
2005-06-12 17:14:07 +02:00
|
|
|
|
item.set_sensitive(False)
|
|
|
|
|
item.connect('activate', self.on_agent_logging, jid, 'unavailable',
|
2006-03-29 18:42:06 +02:00
|
|
|
|
account)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
2006-03-21 15:26:01 +01:00
|
|
|
|
item = gtk.SeparatorMenuItem() # separator
|
2005-06-12 17:14:07 +02:00
|
|
|
|
menu.append(item)
|
|
|
|
|
|
2005-11-04 16:08:49 +01:00
|
|
|
|
item = gtk.ImageMenuItem(_('_Edit'))
|
2005-07-06 16:34:59 +02:00
|
|
|
|
icon = gtk.image_new_from_stock(gtk.STOCK_PREFERENCES, gtk.ICON_SIZE_MENU)
|
2005-07-04 23:29:22 +02:00
|
|
|
|
item.set_image(icon)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
menu.append(item)
|
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
|
|
|
|
item.connect('activate', self.on_edit_agent, contact, account)
|
2006-11-18 21:52:28 +01:00
|
|
|
|
if gajim.account_is_disconnected(account):
|
2006-04-01 14:10:02 +02:00
|
|
|
|
item.set_sensitive(False)
|
2006-08-01 14:56:16 +02:00
|
|
|
|
|
|
|
|
|
item = gtk.ImageMenuItem(_('Execute Command...'))
|
|
|
|
|
icon = gtk.image_new_from_stock(gtk.STOCK_EXECUTE, gtk.ICON_SIZE_MENU)
|
|
|
|
|
item.set_image(icon)
|
|
|
|
|
menu.append(item)
|
|
|
|
|
item.connect('activate', self.on_execute_command, contact, account,
|
|
|
|
|
contact.resource)
|
2006-11-19 18:53:04 +01:00
|
|
|
|
if gajim.account_is_disconnected(account):
|
2006-08-01 14:56:16 +02:00
|
|
|
|
item.set_sensitive(False)
|
2006-08-07 18:18:01 +02:00
|
|
|
|
|
2006-03-29 18:42:06 +02:00
|
|
|
|
item = gtk.ImageMenuItem(_('_Rename'))
|
|
|
|
|
# add a special img for rename menuitem
|
2006-03-30 00:05:38 +02:00
|
|
|
|
path_to_kbd_input_img = os.path.join(gajim.DATA_DIR, 'pixmaps',
|
2006-03-29 18:44:40 +02:00
|
|
|
|
'kbd_input.png')
|
2006-03-29 18:42:06 +02:00
|
|
|
|
img = gtk.Image()
|
2006-03-30 00:05:38 +02:00
|
|
|
|
img.set_from_file(path_to_kbd_input_img)
|
2006-03-29 18:42:06 +02:00
|
|
|
|
item.set_image(img)
|
|
|
|
|
menu.append(item)
|
|
|
|
|
item.connect('activate', self.on_rename, iter, path)
|
2006-11-18 21:52:28 +01:00
|
|
|
|
if gajim.account_is_disconnected(account):
|
2006-04-01 14:10:02 +02:00
|
|
|
|
item.set_sensitive(False)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
2005-07-04 23:29:22 +02:00
|
|
|
|
item = gtk.ImageMenuItem(_('_Remove from Roster'))
|
2005-07-06 16:34:59 +02:00
|
|
|
|
icon = gtk.image_new_from_stock(gtk.STOCK_REMOVE, gtk.ICON_SIZE_MENU)
|
2005-07-04 23:29:22 +02:00
|
|
|
|
item.set_image(icon)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
menu.append(item)
|
2006-09-13 18:47:58 +02:00
|
|
|
|
item.connect('activate', self.on_remove_agent, [(contact, account)])
|
2006-11-18 21:52:28 +01:00
|
|
|
|
if gajim.account_is_disconnected(account):
|
2006-04-01 14:10:02 +02:00
|
|
|
|
item.set_sensitive(False)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
2006-03-29 18:42:06 +02:00
|
|
|
|
event_button = gtkgui_helpers.get_possible_button_event(event)
|
2005-07-17 22:29:44 +02:00
|
|
|
|
|
2006-04-07 17:51:17 +02:00
|
|
|
|
menu.attach_to_widget(self.tree, None)
|
|
|
|
|
menu.connect('selection-done', gtkgui_helpers.destroy_widget)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
menu.show_all()
|
2006-05-26 15:25:31 +02:00
|
|
|
|
menu.popup(None, None, None, event_button, event.time)
|
2005-07-04 23:29:22 +02:00
|
|
|
|
|
2005-06-12 17:14:07 +02:00
|
|
|
|
def on_edit_account(self, widget, account):
|
2005-11-13 16:08:47 +01:00
|
|
|
|
if gajim.interface.instances[account].has_key('account_modification'):
|
2006-03-29 18:42:06 +02:00
|
|
|
|
gajim.interface.instances[account]['account_modification'].\
|
|
|
|
|
window.present()
|
2005-06-12 17:14:07 +02:00
|
|
|
|
else:
|
2005-11-13 16:08:47 +01:00
|
|
|
|
gajim.interface.instances[account]['account_modification'] = \
|
2005-10-20 13:17:17 +02:00
|
|
|
|
config.AccountModificationWindow(account)
|
2005-12-06 18:43:21 +01:00
|
|
|
|
|
2006-11-18 21:52:28 +01:00
|
|
|
|
def on_zeroconf_properties(self, widget, account):
|
|
|
|
|
if gajim.interface.instances.has_key('zeroconf_properties'):
|
|
|
|
|
gajim.interface.instances['zeroconf_properties'].\
|
|
|
|
|
window.present()
|
2006-09-13 18:47:58 +02:00
|
|
|
|
else:
|
2006-11-18 21:52:28 +01:00
|
|
|
|
gajim.interface.instances['zeroconf_properties'] = \
|
|
|
|
|
config.ZeroconfPropertiesWindow()
|
|
|
|
|
|
|
|
|
|
def on_open_gmail_inbox(self, widget, account):
|
|
|
|
|
url = 'http://mail.google.com/mail?account_id=%s' % urllib.quote(
|
|
|
|
|
gajim.config.get_per('accounts', account, 'name'))
|
2006-09-13 18:47:58 +02:00
|
|
|
|
helpers.launch_browser_mailer('url', url)
|
|
|
|
|
|
2005-10-09 23:08:13 +02:00
|
|
|
|
def on_change_status_message_activate(self, widget, account):
|
2005-10-09 16:49:14 +02:00
|
|
|
|
show = gajim.SHOW_LIST[gajim.connections[account].connected]
|
2005-10-20 13:17:17 +02:00
|
|
|
|
dlg = dialogs.ChangeStatusMessageDialog(show)
|
2005-10-09 16:49:14 +02:00
|
|
|
|
message = dlg.run()
|
2005-10-10 23:45:59 +02:00
|
|
|
|
if message is not None: # None is if user pressed Cancel
|
2005-10-10 00:24:18 +02:00
|
|
|
|
self.send_status(account, show, message)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
2005-11-09 08:00:46 +01:00
|
|
|
|
def build_account_menu(self, account):
|
2005-06-20 21:18:53 +02:00
|
|
|
|
# we have to create our own set of icons for the menu
|
|
|
|
|
# using self.jabber_status_images is poopoo
|
|
|
|
|
iconset = gajim.config.get('iconset')
|
2005-12-12 16:13:31 +01:00
|
|
|
|
path = os.path.join(gajim.DATA_DIR, 'iconsets', iconset, '16x16')
|
2005-06-20 21:18:53 +02:00
|
|
|
|
state_images = self.load_iconset(path)
|
|
|
|
|
|
2006-11-18 21:52:28 +01:00
|
|
|
|
if not gajim.config.get_per('accounts', account, 'is_zeroconf'):
|
|
|
|
|
xml = gtkgui_helpers.get_glade('account_context_menu.glade')
|
|
|
|
|
account_context_menu = xml.get_widget('account_context_menu')
|
|
|
|
|
|
|
|
|
|
status_menuitem = xml.get_widget('status_menuitem')
|
2006-11-24 15:30:29 +01:00
|
|
|
|
join_group_chat_menuitem = xml.get_widget('join_group_chat_menuitem')
|
|
|
|
|
muc_icon = self.load_icon('muc_active')
|
|
|
|
|
if muc_icon:
|
|
|
|
|
join_group_chat_menuitem.set_image(muc_icon)
|
2006-11-18 21:52:28 +01:00
|
|
|
|
open_gmail_inbox_menuitem = xml.get_widget('open_gmail_inbox_menuitem')
|
|
|
|
|
new_message_menuitem = xml.get_widget('new_message_menuitem')
|
|
|
|
|
add_contact_menuitem = xml.get_widget('add_contact_menuitem')
|
2006-11-20 08:53:58 +01:00
|
|
|
|
service_discovery_menuitem = xml.get_widget(
|
|
|
|
|
'service_discovery_menuitem')
|
2006-11-18 21:52:28 +01:00
|
|
|
|
execute_command_menuitem = xml.get_widget('execute_command_menuitem')
|
|
|
|
|
edit_account_menuitem = xml.get_widget('edit_account_menuitem')
|
|
|
|
|
sub_menu = gtk.Menu()
|
|
|
|
|
status_menuitem.set_submenu(sub_menu)
|
2006-09-13 18:47:58 +02:00
|
|
|
|
|
2006-11-18 21:52:28 +01:00
|
|
|
|
for show in ('online', 'chat', 'away', 'xa', 'dnd', 'invisible'):
|
|
|
|
|
uf_show = helpers.get_uf_show(show, use_mnemonic = True)
|
|
|
|
|
item = gtk.ImageMenuItem(uf_show)
|
|
|
|
|
icon = state_images[show]
|
|
|
|
|
item.set_image(icon)
|
|
|
|
|
sub_menu.append(item)
|
|
|
|
|
item.connect('activate', self.change_status, account, show)
|
2005-06-20 21:18:53 +02:00
|
|
|
|
|
2006-11-18 21:52:28 +01:00
|
|
|
|
item = gtk.SeparatorMenuItem()
|
|
|
|
|
sub_menu.append(item)
|
|
|
|
|
|
|
|
|
|
item = gtk.ImageMenuItem(_('_Change Status Message'))
|
|
|
|
|
path = os.path.join(gajim.DATA_DIR, 'pixmaps', 'kbd_input.png')
|
|
|
|
|
img = gtk.Image()
|
|
|
|
|
img.set_from_file(path)
|
|
|
|
|
item.set_image(img)
|
|
|
|
|
sub_menu.append(item)
|
2006-11-20 08:53:58 +01:00
|
|
|
|
item.connect('activate', self.on_change_status_message_activate,
|
|
|
|
|
account)
|
2006-11-18 21:52:28 +01:00
|
|
|
|
if gajim.connections[account].connected < 2:
|
|
|
|
|
item.set_sensitive(False)
|
|
|
|
|
|
|
|
|
|
uf_show = helpers.get_uf_show('offline', use_mnemonic = True)
|
2005-10-09 18:08:18 +02:00
|
|
|
|
item = gtk.ImageMenuItem(uf_show)
|
2006-11-18 21:52:28 +01:00
|
|
|
|
icon = state_images['offline']
|
2005-07-04 18:59:43 +02:00
|
|
|
|
item.set_image(icon)
|
2005-06-20 21:18:53 +02:00
|
|
|
|
sub_menu.append(item)
|
2006-11-18 21:52:28 +01:00
|
|
|
|
item.connect('activate', self.change_status, account, 'offline')
|
2005-07-17 22:29:44 +02:00
|
|
|
|
|
2006-11-20 08:53:58 +01:00
|
|
|
|
if gajim.config.get_per('accounts', account, 'hostname') not in \
|
|
|
|
|
gajim.gmail_domains:
|
2006-11-18 21:52:28 +01:00
|
|
|
|
open_gmail_inbox_menuitem.set_no_show_all(True)
|
|
|
|
|
open_gmail_inbox_menuitem.hide()
|
|
|
|
|
else:
|
2006-11-20 08:53:58 +01:00
|
|
|
|
open_gmail_inbox_menuitem.connect('activate',
|
|
|
|
|
self.on_open_gmail_inbox, account)
|
2005-10-09 16:49:14 +02:00
|
|
|
|
|
2006-11-20 08:53:58 +01:00
|
|
|
|
edit_account_menuitem.connect('activate', self.on_edit_account,
|
|
|
|
|
account)
|
|
|
|
|
add_contact_menuitem.connect('activate', self.on_add_new_contact,
|
|
|
|
|
account)
|
2006-11-18 21:52:28 +01:00
|
|
|
|
service_discovery_menuitem.connect('activate',
|
|
|
|
|
self.on_service_disco_menuitem_activate, account)
|
|
|
|
|
hostname = gajim.config.get_per('accounts', account, 'hostname')
|
|
|
|
|
contact = gajim.contacts.create_contact(jid = hostname) # Fake contact
|
|
|
|
|
execute_command_menuitem.connect('activate',
|
|
|
|
|
self.on_execute_command, contact, account)
|
|
|
|
|
|
|
|
|
|
gc_sub_menu = gtk.Menu() # gc is always a submenu
|
|
|
|
|
join_group_chat_menuitem.set_submenu(gc_sub_menu)
|
|
|
|
|
self.add_bookmarks_list(gc_sub_menu, account)
|
|
|
|
|
new_message_menuitem.connect('activate',
|
|
|
|
|
self.on_new_message_menuitem_activate, account)
|
2005-10-09 16:49:14 +02:00
|
|
|
|
|
2006-11-18 21:52:28 +01:00
|
|
|
|
# make some items insensitive if account is offline
|
|
|
|
|
if gajim.connections[account].connected < 2:
|
|
|
|
|
for widget in [add_contact_menuitem, service_discovery_menuitem,
|
|
|
|
|
join_group_chat_menuitem, new_message_menuitem,
|
|
|
|
|
execute_command_menuitem]:
|
|
|
|
|
widget.set_sensitive(False)
|
2006-09-13 18:47:58 +02:00
|
|
|
|
else:
|
2006-11-18 21:52:28 +01:00
|
|
|
|
xml = gtkgui_helpers.get_glade('zeroconf_context_menu.glade')
|
|
|
|
|
account_context_menu = xml.get_widget('zeroconf_context_menu')
|
2006-09-13 18:47:58 +02:00
|
|
|
|
|
2006-11-18 21:52:28 +01:00
|
|
|
|
status_menuitem = xml.get_widget('status_menuitem')
|
|
|
|
|
new_message_menuitem = xml.get_widget('new_message_menuitem')
|
2006-11-20 08:53:58 +01:00
|
|
|
|
zeroconf_properties_menuitem = xml.get_widget(
|
|
|
|
|
'zeroconf_properties_menuitem')
|
2006-11-18 21:52:28 +01:00
|
|
|
|
sub_menu = gtk.Menu()
|
|
|
|
|
status_menuitem.set_submenu(sub_menu)
|
2006-08-07 18:18:01 +02:00
|
|
|
|
|
2006-11-18 21:52:28 +01:00
|
|
|
|
for show in ('online', 'away', 'dnd', 'invisible'):
|
|
|
|
|
uf_show = helpers.get_uf_show(show, use_mnemonic = True)
|
|
|
|
|
item = gtk.ImageMenuItem(uf_show)
|
|
|
|
|
icon = state_images[show]
|
|
|
|
|
item.set_image(icon)
|
|
|
|
|
sub_menu.append(item)
|
|
|
|
|
item.connect('activate', self.change_status, account, show)
|
2006-04-01 14:10:02 +02:00
|
|
|
|
|
2006-11-18 21:52:28 +01:00
|
|
|
|
item = gtk.SeparatorMenuItem()
|
|
|
|
|
sub_menu.append(item)
|
|
|
|
|
|
|
|
|
|
item = gtk.ImageMenuItem(_('_Change Status Message'))
|
|
|
|
|
path = os.path.join(gajim.DATA_DIR, 'pixmaps', 'kbd_input.png')
|
|
|
|
|
img = gtk.Image()
|
|
|
|
|
img.set_from_file(path)
|
|
|
|
|
item.set_image(img)
|
|
|
|
|
sub_menu.append(item)
|
2006-11-20 08:53:58 +01:00
|
|
|
|
item.connect('activate', self.on_change_status_message_activate,
|
|
|
|
|
account)
|
2006-11-18 21:52:28 +01:00
|
|
|
|
if gajim.connections[account].connected < 2:
|
|
|
|
|
item.set_sensitive(False)
|
|
|
|
|
|
|
|
|
|
uf_show = helpers.get_uf_show('offline', use_mnemonic = True)
|
|
|
|
|
item = gtk.ImageMenuItem(uf_show)
|
|
|
|
|
icon = state_images['offline']
|
|
|
|
|
item.set_image(icon)
|
|
|
|
|
sub_menu.append(item)
|
|
|
|
|
item.connect('activate', self.change_status, account, 'offline')
|
|
|
|
|
|
2006-11-20 08:53:58 +01:00
|
|
|
|
zeroconf_properties_menuitem.connect('activate',
|
|
|
|
|
self.on_zeroconf_properties, account)
|
2006-11-18 21:52:28 +01:00
|
|
|
|
#gc_sub_menu = gtk.Menu() # gc is always a submenu
|
|
|
|
|
#join_group_chat_menuitem.set_submenu(gc_sub_menu)
|
|
|
|
|
#self.add_bookmarks_list(gc_sub_menu, account)
|
|
|
|
|
#new_message_menuitem.connect('activate',
|
|
|
|
|
# self.on_new_message_menuitem_activate, account)
|
|
|
|
|
|
|
|
|
|
# make some items insensitive if account is offline
|
|
|
|
|
#if gajim.connections[account].connected < 2:
|
|
|
|
|
# for widget in [join_group_chat_menuitem, new_message_menuitem]:
|
|
|
|
|
# widget.set_sensitive(False)
|
|
|
|
|
# new_message_menuitem.set_sensitive(False)
|
2006-11-20 08:53:58 +01:00
|
|
|
|
|
2005-11-09 08:00:46 +01:00
|
|
|
|
return account_context_menu
|
|
|
|
|
|
2006-03-29 18:42:06 +02:00
|
|
|
|
def make_account_menu(self, event, iter):
|
2005-11-09 08:00:46 +01:00
|
|
|
|
'''Make account's popup menu'''
|
|
|
|
|
model = self.tree.get_model()
|
|
|
|
|
account = model[iter][C_ACCOUNT].decode('utf-8')
|
|
|
|
|
|
2006-11-18 21:52:28 +01:00
|
|
|
|
if account != 'all': # not in merged mode
|
2005-11-09 08:00:46 +01:00
|
|
|
|
menu = self.build_account_menu(account)
|
|
|
|
|
else:
|
|
|
|
|
menu = gtk.Menu()
|
|
|
|
|
iconset = gajim.config.get('iconset')
|
2005-12-12 16:13:31 +01:00
|
|
|
|
path = os.path.join(gajim.DATA_DIR, 'iconsets', iconset, '16x16')
|
2006-05-14 18:28:09 +02:00
|
|
|
|
accounts = [] # Put accounts in a list to sort them
|
2005-11-09 08:00:46 +01:00
|
|
|
|
for account in gajim.connections:
|
2006-05-14 18:28:09 +02:00
|
|
|
|
accounts.append(account)
|
|
|
|
|
accounts.sort()
|
|
|
|
|
for account in accounts:
|
2005-11-09 08:00:46 +01:00
|
|
|
|
state_images = self.load_iconset(path)
|
|
|
|
|
item = gtk.ImageMenuItem(account)
|
|
|
|
|
show = gajim.SHOW_LIST[gajim.connections[account].connected]
|
|
|
|
|
icon = state_images[show]
|
|
|
|
|
item.set_image(icon)
|
|
|
|
|
account_menu = self.build_account_menu(account)
|
|
|
|
|
item.set_submenu(account_menu)
|
|
|
|
|
menu.append(item)
|
|
|
|
|
|
2006-03-29 18:42:06 +02:00
|
|
|
|
event_button = gtkgui_helpers.get_possible_button_event(event)
|
2005-11-09 08:00:46 +01:00
|
|
|
|
|
2006-04-07 17:51:17 +02:00
|
|
|
|
menu.attach_to_widget(self.tree, None)
|
|
|
|
|
menu.connect('selection-done', gtkgui_helpers.destroy_widget)
|
2005-11-09 08:00:46 +01:00
|
|
|
|
menu.show_all()
|
2006-05-26 15:25:31 +02:00
|
|
|
|
menu.popup(None, self.tree, None, event_button, event.time)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
|
|
|
|
def on_add_to_roster(self, widget, contact, account):
|
2006-06-01 17:23:38 +02:00
|
|
|
|
dialogs.AddNewContactWindow(account, contact.jid, contact.name)
|
2005-11-09 08:00:46 +01:00
|
|
|
|
|
2005-06-12 17:14:07 +02:00
|
|
|
|
def authorize(self, widget, jid, account):
|
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
|
|
|
|
'''Authorize a contact (by re-sending auth menuitem)'''
|
2005-06-12 17:14:07 +02:00
|
|
|
|
gajim.connections[account].send_authorization(jid)
|
2005-06-15 01:32:04 +02:00
|
|
|
|
dialogs.InformationDialog(_('Authorization has been sent'),
|
2005-08-14 18:12:36 +02:00
|
|
|
|
_('Now "%s" will know your status.') %jid)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
2006-12-10 15:18:31 +01:00
|
|
|
|
def req_sub(self, widget, jid, txt, account, groups = [], nickname = None,
|
2006-03-08 11:46:36 +01:00
|
|
|
|
auto_auth = False):
|
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
|
|
|
|
'''Request subscription to a contact'''
|
2006-12-10 15:18:31 +01:00
|
|
|
|
gajim.connections[account].request_subscription(jid, txt, nickname,
|
|
|
|
|
groups, auto_auth, gajim.nicks[account])
|
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
|
|
|
|
contact = gajim.contacts.get_contact_with_highest_priority(account, jid)
|
|
|
|
|
if not contact:
|
2005-06-12 17:14:07 +02:00
|
|
|
|
keyID = ''
|
|
|
|
|
attached_keys = gajim.config.get_per('accounts', account,
|
|
|
|
|
'attached_gpg_keys').split()
|
|
|
|
|
if jid in attached_keys:
|
|
|
|
|
keyID = attached_keys[attached_keys.index(jid) + 1]
|
2006-12-10 15:18:31 +01:00
|
|
|
|
contact = gajim.contacts.create_contact(jid = jid, name = nickname,
|
|
|
|
|
groups = groups, show = 'requested', status = '', ask = 'none',
|
2005-06-25 23:18:07 +02:00
|
|
|
|
sub = 'subscribe', keyID = keyID)
|
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
|
|
|
|
gajim.contacts.add_contact(account, contact)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
else:
|
2006-01-19 22:55:01 +01:00
|
|
|
|
if not _('Not in Roster') in contact.groups:
|
2005-06-15 09:38:58 +02:00
|
|
|
|
dialogs.InformationDialog(_('Subscription request has been sent'),
|
2006-11-20 08:53:58 +01:00
|
|
|
|
_('If "%s" accepts this request you will know his or her status.'
|
|
|
|
|
) % jid)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
return
|
2006-12-10 15:18:31 +01:00
|
|
|
|
contact.groups = groups
|
|
|
|
|
if nickname:
|
|
|
|
|
contact.name = nickname
|
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
|
|
|
|
self.remove_contact(contact, account)
|
2005-07-07 18:38:36 +02:00
|
|
|
|
self.add_contact_to_roster(jid, account)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
2005-11-25 22:32:56 +01:00
|
|
|
|
def revoke_auth(self, widget, jid, account):
|
|
|
|
|
'''Revoke a contact's authorization'''
|
|
|
|
|
gajim.connections[account].refuse_authorization(jid)
|
|
|
|
|
dialogs.InformationDialog(_('Authorization has been removed'),
|
|
|
|
|
_('Now "%s" will always see you as offline.') %jid)
|
|
|
|
|
|
2005-07-09 00:26:46 +02:00
|
|
|
|
def on_roster_treeview_scroll_event(self, widget, event):
|
|
|
|
|
self.tooltip.hide_tooltip()
|
|
|
|
|
|
2005-06-12 17:14:07 +02:00
|
|
|
|
def on_roster_treeview_key_press_event(self, widget, event):
|
|
|
|
|
'''when a key is pressed in the treeviews'''
|
2005-07-09 00:26:46 +02:00
|
|
|
|
self.tooltip.hide_tooltip()
|
2006-11-19 20:45:43 +01:00
|
|
|
|
if event.keyval == gtk.keysyms.Escape:
|
2005-06-12 17:14:07 +02:00
|
|
|
|
self.tree.get_selection().unselect_all()
|
2006-02-27 00:29:49 +01:00
|
|
|
|
elif event.keyval == gtk.keysyms.F2:
|
2005-06-12 17:14:07 +02:00
|
|
|
|
treeselection = self.tree.get_selection()
|
2006-09-13 18:47:58 +02:00
|
|
|
|
model, list_of_paths = treeselection.get_selected_rows()
|
|
|
|
|
if len(list_of_paths) != 1:
|
2005-06-12 17:14:07 +02:00
|
|
|
|
return
|
2006-09-13 18:47:58 +02:00
|
|
|
|
path = list_of_paths[0]
|
2006-11-19 20:45:43 +01:00
|
|
|
|
type_ = model[path][C_TYPE]
|
|
|
|
|
if type_ in ('contact', 'group', 'agent'):
|
|
|
|
|
iter = model.get_iter(path)
|
|
|
|
|
self.on_rename(widget, iter, path)
|
2005-07-19 16:53:35 +02:00
|
|
|
|
|
2006-02-27 00:29:49 +01:00
|
|
|
|
elif event.keyval == gtk.keysyms.Delete:
|
2005-06-12 17:14:07 +02:00
|
|
|
|
treeselection = self.tree.get_selection()
|
2006-09-13 18:47:58 +02:00
|
|
|
|
model, list_of_paths = treeselection.get_selected_rows()
|
|
|
|
|
if not len(list_of_paths):
|
2005-06-12 17:14:07 +02:00
|
|
|
|
return
|
2007-01-02 18:43:32 +01:00
|
|
|
|
type_ = model[list_of_paths[0]][C_TYPE]
|
2006-11-18 21:52:28 +01:00
|
|
|
|
account = model[list_of_paths[0]][C_ACCOUNT]
|
2006-09-13 18:47:58 +02:00
|
|
|
|
list_ = []
|
|
|
|
|
for path in list_of_paths:
|
2007-01-02 18:43:32 +01:00
|
|
|
|
if model[path][C_TYPE] != type_:
|
2006-09-13 18:47:58 +02:00
|
|
|
|
return
|
|
|
|
|
jid = model[path][C_JID].decode('utf-8')
|
|
|
|
|
account = model[path][C_ACCOUNT].decode('utf-8')
|
|
|
|
|
contact = gajim.contacts.get_contact_with_highest_priority(account,
|
|
|
|
|
jid)
|
|
|
|
|
list_.append((contact, account))
|
2007-01-02 18:43:32 +01:00
|
|
|
|
if type_ in ('account', 'group', 'self_contact') or \
|
2006-11-20 08:53:58 +01:00
|
|
|
|
account == gajim.ZEROCONF_ACC_NAME:
|
2005-08-27 14:48:02 +02:00
|
|
|
|
return
|
2007-01-02 18:43:32 +01:00
|
|
|
|
if type_ == 'contact':
|
2006-09-13 18:47:58 +02:00
|
|
|
|
self.on_req_usub(widget, list_)
|
2007-01-02 18:43:32 +01:00
|
|
|
|
elif type_ == 'agent':
|
2006-09-13 18:47:58 +02:00
|
|
|
|
self.on_remove_agent(widget, list_)
|
2005-07-17 22:29:44 +02:00
|
|
|
|
|
2006-09-13 18:47:58 +02:00
|
|
|
|
def show_appropriate_context_menu(self, event, iters):
|
|
|
|
|
# iters must be all of the same type
|
2005-07-17 22:29:44 +02:00
|
|
|
|
model = self.tree.get_model()
|
2007-01-02 18:43:32 +01:00
|
|
|
|
type_ = model[iters[0]][C_TYPE]
|
2006-09-13 18:47:58 +02:00
|
|
|
|
for iter in iters[1:]:
|
2007-01-02 18:43:32 +01:00
|
|
|
|
if model[iter][C_TYPE] != type_:
|
2006-09-13 18:47:58 +02:00
|
|
|
|
return
|
2007-01-02 18:43:32 +01:00
|
|
|
|
if type_ == 'group' and len(iters) == 1:
|
2006-09-13 18:47:58 +02:00
|
|
|
|
self.make_group_menu(event, iters[0])
|
2007-01-02 18:43:32 +01:00
|
|
|
|
elif type_ == 'agent' and len(iters) == 1:
|
2006-09-13 18:47:58 +02:00
|
|
|
|
self.make_transport_menu(event, iters[0])
|
2007-01-02 18:43:32 +01:00
|
|
|
|
elif type_ in ('contact', 'self_contact') and len(iters) == 1:
|
2006-09-13 18:47:58 +02:00
|
|
|
|
self.make_contact_menu(event, iters[0])
|
2007-01-02 18:43:32 +01:00
|
|
|
|
elif type_ == 'contact':
|
2006-09-13 18:47:58 +02:00
|
|
|
|
self.make_multiple_contact_menu(event, iters)
|
2007-01-02 18:43:32 +01:00
|
|
|
|
elif type_ == 'account' and len(iters) == 1:
|
2006-09-13 18:47:58 +02:00
|
|
|
|
self.make_account_menu(event, iters[0])
|
2005-07-17 22:29:44 +02:00
|
|
|
|
|
2005-07-17 22:32:49 +02:00
|
|
|
|
def show_treeview_menu(self, event):
|
2005-07-17 22:29:44 +02:00
|
|
|
|
try:
|
2006-09-13 18:47:58 +02:00
|
|
|
|
model, list_of_paths = self.tree.get_selection().get_selected_rows()
|
2005-07-17 22:29:44 +02:00
|
|
|
|
except TypeError:
|
|
|
|
|
self.tree.get_selection().unselect_all()
|
|
|
|
|
return
|
2006-09-13 18:47:58 +02:00
|
|
|
|
if not len(list_of_paths):
|
2006-04-22 14:45:01 +02:00
|
|
|
|
# no row is selected
|
|
|
|
|
return
|
2006-09-13 18:47:58 +02:00
|
|
|
|
if len(list_of_paths) > 1:
|
|
|
|
|
iters = []
|
|
|
|
|
for path in list_of_paths:
|
|
|
|
|
iters.append(model.get_iter(path))
|
|
|
|
|
else:
|
|
|
|
|
path = list_of_paths[0]
|
|
|
|
|
iters = [model.get_iter(path)]
|
|
|
|
|
self.show_appropriate_context_menu(event, iters)
|
2005-12-06 18:43:21 +01:00
|
|
|
|
|
2005-07-17 22:29:44 +02:00
|
|
|
|
return True
|
|
|
|
|
|
2005-06-12 17:14:07 +02:00
|
|
|
|
def on_roster_treeview_button_press_event(self, widget, event):
|
2005-07-09 01:43:11 +02:00
|
|
|
|
# hide tooltip, no matter the button is pressed
|
2005-07-09 00:26:46 +02:00
|
|
|
|
self.tooltip.hide_tooltip()
|
2006-05-21 21:35:33 +02:00
|
|
|
|
try:
|
|
|
|
|
path, column, x, y = self.tree.get_path_at_pos(int(event.x),
|
|
|
|
|
int(event.y))
|
|
|
|
|
except TypeError:
|
|
|
|
|
self.tree.get_selection().unselect_all()
|
|
|
|
|
return False
|
|
|
|
|
|
2005-06-13 00:19:56 +02:00
|
|
|
|
if event.button == 3: # Right click
|
2006-09-13 18:47:58 +02:00
|
|
|
|
try:
|
|
|
|
|
model, list_of_paths = self.tree.get_selection().get_selected_rows()
|
|
|
|
|
except TypeError:
|
|
|
|
|
list_of_paths = []
|
|
|
|
|
pass
|
|
|
|
|
if path not in list_of_paths:
|
|
|
|
|
self.tree.get_selection().unselect_all()
|
|
|
|
|
self.tree.get_selection().select_path(path)
|
|
|
|
|
return self.show_treeview_menu(event)
|
2005-12-06 18:43:21 +01:00
|
|
|
|
|
2006-02-27 00:29:49 +01:00
|
|
|
|
elif event.button == 2: # Middle click
|
2006-09-13 18:47:58 +02:00
|
|
|
|
try:
|
|
|
|
|
model, list_of_paths = self.tree.get_selection().get_selected_rows()
|
|
|
|
|
except TypeError:
|
|
|
|
|
list_of_paths = []
|
|
|
|
|
pass
|
|
|
|
|
if list_of_paths != [path]:
|
|
|
|
|
self.tree.get_selection().unselect_all()
|
|
|
|
|
self.tree.get_selection().select_path(path)
|
2007-01-02 18:43:32 +01:00
|
|
|
|
type_ = model[path][C_TYPE]
|
|
|
|
|
if type_ in ('agent', 'contact', 'self_contact'):
|
2006-05-21 21:35:33 +02:00
|
|
|
|
self.on_roster_treeview_row_activated(widget, path)
|
2007-01-02 18:43:32 +01:00
|
|
|
|
elif type_ == 'account':
|
2006-09-13 18:47:58 +02:00
|
|
|
|
account = model[path][C_ACCOUNT].decode('utf-8')
|
2005-11-10 10:59:27 +01:00
|
|
|
|
if account != 'all':
|
|
|
|
|
show = gajim.connections[account].connected
|
|
|
|
|
if show > 1: # We are connected
|
|
|
|
|
self.on_change_status_message_activate(widget, account)
|
|
|
|
|
return True
|
|
|
|
|
show = helpers.get_global_show()
|
|
|
|
|
if show == 'offline':
|
|
|
|
|
return True
|
|
|
|
|
dlg = dialogs.ChangeStatusMessageDialog(show)
|
|
|
|
|
message = dlg.run()
|
|
|
|
|
if not message:
|
|
|
|
|
return True
|
|
|
|
|
for acct in gajim.connections:
|
|
|
|
|
if not gajim.config.get_per('accounts', acct,
|
2006-11-18 21:52:28 +01:00
|
|
|
|
'sync_with_global_status'):
|
2005-11-10 10:59:27 +01:00
|
|
|
|
continue
|
|
|
|
|
current_show = gajim.SHOW_LIST[gajim.connections[acct].connected]
|
|
|
|
|
self.send_status(acct, current_show, message)
|
2005-06-23 10:33:25 +02:00
|
|
|
|
return True
|
2005-12-06 18:43:21 +01:00
|
|
|
|
|
2006-02-27 00:29:49 +01:00
|
|
|
|
elif event.button == 1: # Left click
|
2005-06-13 00:19:56 +02:00
|
|
|
|
model = self.tree.get_model()
|
2007-01-02 18:43:32 +01:00
|
|
|
|
type_ = model[path][C_TYPE]
|
2007-04-26 18:44:00 +02:00
|
|
|
|
if gajim.single_click:
|
|
|
|
|
self.on_row_activated(widget, path)
|
|
|
|
|
else:
|
|
|
|
|
if type_ == 'group' and x < 27:
|
|
|
|
|
# first cell in 1st column (the arrow SINGLE clicked)
|
2005-06-13 00:19:56 +02:00
|
|
|
|
if (self.tree.row_expanded(path)):
|
|
|
|
|
self.tree.collapse_row(path)
|
|
|
|
|
else:
|
|
|
|
|
self.tree.expand_row(path, False)
|
2007-04-26 18:44:00 +02:00
|
|
|
|
|
|
|
|
|
elif type_ == 'contact' and x < 27:
|
|
|
|
|
account = model[path][C_ACCOUNT].decode('utf-8')
|
|
|
|
|
jid = model[path][C_JID].decode('utf-8')
|
|
|
|
|
# first cell in 1st column (the arrow SINGLE clicked)
|
|
|
|
|
iters = self.get_contact_iter(jid, account)
|
|
|
|
|
for iter in iters:
|
|
|
|
|
path = model.get_path(iter)
|
|
|
|
|
if (self.tree.row_expanded(path)):
|
|
|
|
|
self.tree.collapse_row(path)
|
|
|
|
|
else:
|
|
|
|
|
self.tree.expand_row(path, False)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
2006-09-13 18:47:58 +02:00
|
|
|
|
def on_req_usub(self, widget, list_):
|
|
|
|
|
'''Remove a contact. list_ is a list of (contact, account) tuples'''
|
|
|
|
|
def on_ok(widget, list_):
|
2006-04-02 18:11:21 +02:00
|
|
|
|
self.dialog.destroy()
|
2005-09-28 16:35:06 +02:00
|
|
|
|
remove_auth = True
|
2006-09-13 18:47:58 +02:00
|
|
|
|
if len(list_) == 1:
|
|
|
|
|
contact = list_[0][0]
|
|
|
|
|
if contact.sub != 'to' and self.dialog.is_checked():
|
|
|
|
|
remove_auth = False
|
|
|
|
|
for (contact, account) in list_:
|
|
|
|
|
gajim.connections[account].unsubscribe(contact.jid, remove_auth)
|
|
|
|
|
for c in gajim.contacts.get_contact(account, contact.jid):
|
|
|
|
|
self.remove_contact(c, account)
|
2007-03-28 16:20:50 +02:00
|
|
|
|
gajim.contacts.remove_jid(account, contact.jid)
|
2006-12-17 00:07:18 +01:00
|
|
|
|
# redraw group rows for contact numbers
|
2006-12-16 23:49:17 +01:00
|
|
|
|
for group in c.groups:
|
|
|
|
|
self.draw_group(group, account)
|
2006-12-17 00:07:18 +01:00
|
|
|
|
# redraw account rows for contact numbers
|
|
|
|
|
self.draw_account(account)
|
2006-09-13 18:47:58 +02:00
|
|
|
|
if not remove_auth and contact.sub == 'both':
|
|
|
|
|
contact.name = ''
|
|
|
|
|
contact.groups = []
|
|
|
|
|
contact.sub = 'from'
|
|
|
|
|
gajim.contacts.add_contact(account, contact)
|
|
|
|
|
self.add_contact_to_roster(contact.jid, account)
|
2006-12-26 14:30:35 +01:00
|
|
|
|
else:
|
2007-01-31 20:45:13 +01:00
|
|
|
|
if _('Not in Roster') in contact.groups:
|
|
|
|
|
gajim.events.remove_events(account, contact.jid)
|
2006-12-26 14:30:35 +01:00
|
|
|
|
self.readd_if_needed(contact, account)
|
2006-09-13 18:47:58 +02:00
|
|
|
|
if len(list_) == 1:
|
|
|
|
|
contact = list_[0][0]
|
|
|
|
|
account = list_[0][1]
|
|
|
|
|
pritext = _('Contact "%s" will be removed from your roster') % \
|
|
|
|
|
contact.get_shown_name()
|
|
|
|
|
if contact.sub == 'to':
|
|
|
|
|
self.dialog = dialogs.ConfirmationDialog(pritext,
|
2006-11-20 08:53:58 +01:00
|
|
|
|
_('By removing this contact you also remove authorization '
|
|
|
|
|
'resulting in him or her always seeing you as offline.'),
|
2006-09-13 18:47:58 +02:00
|
|
|
|
on_response_ok = (on_ok, list_))
|
|
|
|
|
else:
|
|
|
|
|
self.dialog = dialogs.ConfirmationDialogCheck(pritext,
|
2006-11-20 08:53:58 +01:00
|
|
|
|
_('By removing this contact you also by default remove '
|
|
|
|
|
'authorization resulting in him or her always seeing you as '
|
|
|
|
|
'offline.'),
|
2006-09-13 18:47:58 +02:00
|
|
|
|
_('I want this contact to know my status after removal'),
|
|
|
|
|
on_response_ok = (on_ok, list_))
|
2006-04-02 18:11:21 +02:00
|
|
|
|
else:
|
2006-09-13 18:47:58 +02:00
|
|
|
|
# several contact to remove at the same time
|
|
|
|
|
pritext = _('Contacts will be removed from your roster')
|
|
|
|
|
jids = ''
|
|
|
|
|
for (contact, account) in list_:
|
|
|
|
|
jids += '\n ' + contact.get_shown_name() + ','
|
2006-11-20 08:53:58 +01:00
|
|
|
|
sectext = _('By removing these contacts:%s\nyou also remove '
|
|
|
|
|
'authorization resulting in them always seeing you as offline.') % \
|
|
|
|
|
jids
|
2006-09-13 18:47:58 +02:00
|
|
|
|
self.dialog = dialogs.ConfirmationDialog(pritext, sectext,
|
|
|
|
|
on_response_ok = (on_ok, list_))
|
|
|
|
|
|
2005-12-06 18:43:21 +01:00
|
|
|
|
|
2005-06-12 17:14:07 +02:00
|
|
|
|
def forget_gpg_passphrase(self, keyid):
|
|
|
|
|
if self.gpg_passphrase.has_key(keyid):
|
|
|
|
|
del self.gpg_passphrase[keyid]
|
|
|
|
|
return False
|
|
|
|
|
|
2005-09-05 15:28:09 +02:00
|
|
|
|
def set_connecting_state(self, account):
|
|
|
|
|
model = self.tree.get_model()
|
|
|
|
|
accountIter = self.get_account_iter(account)
|
|
|
|
|
if accountIter:
|
2005-12-12 16:13:31 +01:00
|
|
|
|
model[accountIter][0] = self.jabber_state_images['16']['connecting']
|
2005-10-20 13:17:17 +02:00
|
|
|
|
if gajim.interface.systray_enabled:
|
|
|
|
|
gajim.interface.systray.change_status('connecting')
|
2005-09-05 15:28:09 +02:00
|
|
|
|
|
2007-04-21 13:29:55 +02:00
|
|
|
|
def send_status(self, account, status, txt, auto = False, to = None):
|
2005-09-12 13:51:29 +02:00
|
|
|
|
model = self.tree.get_model()
|
2005-09-05 20:12:47 +02:00
|
|
|
|
accountIter = self.get_account_iter(account)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
if status != 'offline':
|
|
|
|
|
if gajim.connections[account].connected < 2:
|
2005-09-05 15:28:09 +02:00
|
|
|
|
self.set_connecting_state(account)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
2006-02-27 00:29:49 +01:00
|
|
|
|
if not gajim.connections[account].password:
|
|
|
|
|
passphrase = ''
|
2006-12-28 11:01:15 +01:00
|
|
|
|
text = _('Enter your password for account %s') % account
|
|
|
|
|
if passwords.USER_HAS_GNOMEKEYRING and \
|
|
|
|
|
not passwords.USER_USES_GNOMEKEYRING:
|
2007-01-22 19:21:13 +01:00
|
|
|
|
text += '\n' + _('Gnome Keyring is installed but not correctly started (environment variable probably not correctly set)')
|
2006-12-28 11:01:15 +01:00
|
|
|
|
w = dialogs.PassphraseDialog(_('Password Required'), text,
|
2006-02-27 00:29:49 +01:00
|
|
|
|
_('Save password'))
|
|
|
|
|
passphrase, save = w.run()
|
|
|
|
|
if passphrase == -1:
|
|
|
|
|
if accountIter:
|
|
|
|
|
model[accountIter][0] = self.jabber_state_images['16']\
|
|
|
|
|
['offline']
|
|
|
|
|
if gajim.interface.systray_enabled:
|
|
|
|
|
gajim.interface.systray.change_status('offline')
|
|
|
|
|
self.update_status_combobox()
|
|
|
|
|
return
|
|
|
|
|
gajim.connections[account].password = passphrase
|
|
|
|
|
if save:
|
|
|
|
|
gajim.config.set_per('accounts', account, 'savepass', True)
|
2006-11-18 21:52:28 +01:00
|
|
|
|
passwords.save_password(account, passphrase)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
|
|
|
|
keyid = None
|
2005-08-30 23:10:14 +02:00
|
|
|
|
use_gpg_agent = gajim.config.get('use_gpg_agent')
|
|
|
|
|
# we don't need to bother with the passphrase if we use the agent
|
|
|
|
|
if use_gpg_agent:
|
|
|
|
|
save_gpg_pass = False
|
|
|
|
|
else:
|
2005-12-06 18:43:21 +01:00
|
|
|
|
save_gpg_pass = gajim.config.get_per('accounts', account,
|
2005-11-06 16:08:54 +01:00
|
|
|
|
'savegpgpass')
|
2005-06-12 17:14:07 +02:00
|
|
|
|
keyid = gajim.config.get_per('accounts', account, 'keyid')
|
2006-12-13 13:29:24 +01:00
|
|
|
|
if keyid and not gajim.config.get('usegpg'):
|
|
|
|
|
#TODO: make this string translatable
|
|
|
|
|
dialog = dialogs.WarningDialog('GPG is not usable', _('You will be connected to %s without OpenPGP.') % account)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
if keyid and gajim.connections[account].connected < 2 and \
|
|
|
|
|
gajim.config.get('usegpg'):
|
2005-12-06 18:43:21 +01:00
|
|
|
|
|
2005-08-30 23:10:14 +02:00
|
|
|
|
if use_gpg_agent:
|
|
|
|
|
self.gpg_passphrase[keyid] = None
|
2005-06-12 17:14:07 +02:00
|
|
|
|
else:
|
2005-08-30 23:10:14 +02:00
|
|
|
|
if save_gpg_pass:
|
2006-11-20 08:53:58 +01:00
|
|
|
|
passphrase = gajim.config.get_per('accounts', account,
|
|
|
|
|
'gpgpassword')
|
2005-06-12 17:14:07 +02:00
|
|
|
|
else:
|
2005-08-30 23:10:14 +02:00
|
|
|
|
if self.gpg_passphrase.has_key(keyid):
|
|
|
|
|
passphrase = self.gpg_passphrase[keyid]
|
|
|
|
|
save = False
|
|
|
|
|
else:
|
2006-01-21 22:19:14 +01:00
|
|
|
|
password_ok = False
|
|
|
|
|
count = 0
|
|
|
|
|
title = _('Passphrase Required')
|
|
|
|
|
second = _('Enter GPG key passphrase for account %s.') % \
|
|
|
|
|
account
|
|
|
|
|
while not password_ok and count < 3:
|
|
|
|
|
count += 1
|
|
|
|
|
w = dialogs.PassphraseDialog(title, second,
|
|
|
|
|
_('Save passphrase'))
|
|
|
|
|
passphrase, save = w.run()
|
|
|
|
|
if passphrase == -1:
|
|
|
|
|
passphrase = None
|
|
|
|
|
password_ok = True
|
|
|
|
|
else:
|
|
|
|
|
password_ok = gajim.connections[account].\
|
|
|
|
|
test_gpg_passphrase(passphrase)
|
|
|
|
|
title = _('Wrong Passphrase')
|
2006-11-20 08:53:58 +01:00
|
|
|
|
second = _('Please retype your GPG passphrase or '
|
|
|
|
|
'press Cancel.')
|
2006-01-21 22:19:14 +01:00
|
|
|
|
if passphrase != None:
|
|
|
|
|
self.gpg_passphrase[keyid] = passphrase
|
2006-11-20 08:53:58 +01:00
|
|
|
|
gobject.timeout_add(30000, self.forget_gpg_passphrase,
|
|
|
|
|
keyid)
|
2005-08-30 23:10:14 +02:00
|
|
|
|
if save:
|
2006-11-20 08:53:58 +01:00
|
|
|
|
gajim.config.set_per('accounts', account, 'savegpgpass',
|
|
|
|
|
True)
|
2005-12-06 18:43:21 +01:00
|
|
|
|
gajim.config.set_per('accounts', account, 'gpgpassword',
|
2006-11-20 08:53:58 +01:00
|
|
|
|
passphrase)
|
2005-08-30 23:10:14 +02:00
|
|
|
|
gajim.connections[account].gpg_passphrase(passphrase)
|
2005-12-06 18:43:21 +01:00
|
|
|
|
|
2007-04-01 14:28:03 +02:00
|
|
|
|
if gajim.account_is_connected(account):
|
|
|
|
|
if status == 'online' and gajim.interface.sleeper.getState() != \
|
|
|
|
|
common.sleepy.STATE_UNKNOWN:
|
|
|
|
|
gajim.sleeper_state[account] = 'online'
|
|
|
|
|
elif gajim.sleeper_state[account] not in ('autoaway', 'autoxa'):
|
|
|
|
|
gajim.sleeper_state[account] = 'off'
|
2007-04-22 21:45:19 +02:00
|
|
|
|
if to:
|
|
|
|
|
gajim.connections[account].send_custom_status(status, txt, to)
|
|
|
|
|
else:
|
|
|
|
|
gajim.connections[account].change_status(status, txt, auto)
|
2007-04-01 14:28:03 +02:00
|
|
|
|
|
2007-04-24 20:43:13 +02:00
|
|
|
|
for gc_control in gajim.interface.msg_win_mgr.get_controls(
|
|
|
|
|
message_control.TYPE_GC):
|
|
|
|
|
if gc_control.account == account:
|
|
|
|
|
if gajim.gc_connected[account][gc_control.room_jid]:
|
|
|
|
|
gajim.connections[account].send_gc_status(gc_control.nick,
|
|
|
|
|
gc_control.room_jid, status, txt)
|
|
|
|
|
else:
|
|
|
|
|
# for some reason, we are not connected to the room even if
|
|
|
|
|
# tab is opened, send initial join_gc()
|
|
|
|
|
gajim.connections[account].join_gc(gc_control.nick,
|
|
|
|
|
gc_control.room_jid, None)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
|
|
|
|
def get_status_message(self, show):
|
2006-09-13 18:47:58 +02:00
|
|
|
|
if show in gajim.config.get_per('defaultstatusmsg'):
|
|
|
|
|
if gajim.config.get_per('defaultstatusmsg', show, 'enabled'):
|
|
|
|
|
return gajim.config.get_per('defaultstatusmsg', show, 'message')
|
2005-06-12 17:14:07 +02:00
|
|
|
|
if (show == 'online' and not gajim.config.get('ask_online_status')) or \
|
2006-12-12 23:26:31 +01:00
|
|
|
|
(show in ('offline', 'invisible')
|
|
|
|
|
and not gajim.config.get('ask_offline_status')):
|
2005-09-08 09:10:59 +02:00
|
|
|
|
return ''
|
2005-10-20 13:17:17 +02:00
|
|
|
|
dlg = dialogs.ChangeStatusMessageDialog(show)
|
2006-11-18 21:52:28 +01:00
|
|
|
|
dlg.window.present() # show it on current workspace
|
2005-06-12 17:14:07 +02:00
|
|
|
|
message = dlg.run()
|
|
|
|
|
return message
|
|
|
|
|
|
2005-09-13 19:53:31 +02:00
|
|
|
|
def connected_rooms(self, account):
|
|
|
|
|
if True in gajim.gc_connected[account].values():
|
|
|
|
|
return True
|
|
|
|
|
return False
|
|
|
|
|
|
2005-06-12 17:14:07 +02:00
|
|
|
|
def change_status(self, widget, account, status):
|
2006-04-02 18:11:21 +02:00
|
|
|
|
def change(widget, account, status):
|
|
|
|
|
if self.dialog:
|
|
|
|
|
self.dialog.destroy()
|
|
|
|
|
message = self.get_status_message(status)
|
|
|
|
|
if message is None:
|
|
|
|
|
# user pressed Cancel to change status message dialog
|
|
|
|
|
return
|
|
|
|
|
self.send_status(account, status, message)
|
|
|
|
|
|
|
|
|
|
self.dialog = None
|
|
|
|
|
if status == 'invisible' and self.connected_rooms(account):
|
|
|
|
|
self.dialog = dialogs.ConfirmationDialog(
|
|
|
|
|
_('You are participating in one or more group chats'),
|
2006-11-20 08:53:58 +01:00
|
|
|
|
_('Changing your status to invisible will result in disconnection '
|
|
|
|
|
'from those group chats. Are you sure you want to go invisible?'),
|
2006-04-02 18:11:21 +02:00
|
|
|
|
on_response_ok = (change, account, status))
|
|
|
|
|
else:
|
|
|
|
|
change(None, account, status)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
2007-04-21 13:45:23 +02:00
|
|
|
|
def on_send_custom_status(self, widget, contact_list, show):
|
2007-04-21 13:29:55 +02:00
|
|
|
|
'''send custom status'''
|
|
|
|
|
dlg = dialogs.ChangeStatusMessageDialog(show)
|
|
|
|
|
message = dlg.run()
|
|
|
|
|
if message is not None: # None if user pressed Cancel
|
2007-04-21 13:45:23 +02:00
|
|
|
|
for (contact, account) in contact_list:
|
|
|
|
|
self.send_status(account, show, message, to = contact.jid)
|
2007-04-21 13:29:55 +02:00
|
|
|
|
|
2005-06-12 17:14:07 +02:00
|
|
|
|
def on_status_combobox_changed(self, widget):
|
2005-10-19 13:03:01 +02:00
|
|
|
|
'''When we change our status via the combobox'''
|
2005-06-12 17:14:07 +02:00
|
|
|
|
model = self.status_combobox.get_model()
|
|
|
|
|
active = self.status_combobox.get_active()
|
2005-07-31 19:16:39 +02:00
|
|
|
|
if active == -1: # no active item
|
2005-06-12 17:14:07 +02:00
|
|
|
|
return
|
2005-11-05 19:09:57 +01:00
|
|
|
|
if not self.combobox_callback_active:
|
|
|
|
|
self.previous_status_combobox_active = active
|
|
|
|
|
return
|
2005-06-12 17:14:07 +02:00
|
|
|
|
accounts = gajim.connections.keys()
|
|
|
|
|
if len(accounts) == 0:
|
2005-07-31 19:16:39 +02:00
|
|
|
|
dialogs.ErrorDialog(_('No account available'),
|
2006-04-02 18:11:21 +02:00
|
|
|
|
_('You must create an account before you can chat with other contacts.'))
|
2005-11-09 08:00:46 +01:00
|
|
|
|
self.update_status_combobox()
|
2005-06-12 17:14:07 +02:00
|
|
|
|
return
|
2005-08-26 02:52:44 +02:00
|
|
|
|
status = model[active][2].decode('utf-8')
|
2006-04-06 20:37:24 +02:00
|
|
|
|
|
2005-10-19 13:03:01 +02:00
|
|
|
|
if active == 7: # We choose change status message (7 is that)
|
|
|
|
|
# do not change show, just show change status dialog
|
2005-11-05 18:52:49 +01:00
|
|
|
|
status = model[self.previous_status_combobox_active][2].decode('utf-8')
|
|
|
|
|
dlg = dialogs.ChangeStatusMessageDialog(status)
|
2005-10-09 22:28:04 +02:00
|
|
|
|
message = dlg.run()
|
2005-10-10 00:24:18 +02:00
|
|
|
|
if message is not None: # None if user pressed Cancel
|
2006-11-18 21:52:28 +01:00
|
|
|
|
for account in accounts:
|
|
|
|
|
if not gajim.config.get_per('accounts', account,
|
2005-10-10 21:10:59 +02:00
|
|
|
|
'sync_with_global_status'):
|
|
|
|
|
continue
|
2006-11-18 21:52:28 +01:00
|
|
|
|
current_show = gajim.SHOW_LIST[
|
|
|
|
|
gajim.connections[account].connected]
|
|
|
|
|
self.send_status(account, current_show, message)
|
2005-11-05 19:09:57 +01:00
|
|
|
|
self.combobox_callback_active = False
|
2006-11-18 21:52:28 +01:00
|
|
|
|
self.status_combobox.set_active(
|
|
|
|
|
self.previous_status_combobox_active)
|
2005-11-05 19:09:57 +01:00
|
|
|
|
self.combobox_callback_active = True
|
2005-10-10 12:02:57 +02:00
|
|
|
|
return
|
2005-10-19 13:03:01 +02:00
|
|
|
|
# we are about to change show, so save this new show so in case
|
2005-10-26 19:33:37 +02:00
|
|
|
|
# after user chooses "Change status message" menuitem
|
|
|
|
|
# we can return to this show
|
2005-10-19 13:03:01 +02:00
|
|
|
|
self.previous_status_combobox_active = active
|
2006-04-09 20:14:59 +02:00
|
|
|
|
connected_accounts = gajim.get_number_of_connected_accounts()
|
2005-09-13 19:53:31 +02:00
|
|
|
|
if status == 'invisible':
|
|
|
|
|
bug_user = False
|
2006-11-18 21:52:28 +01:00
|
|
|
|
for account in accounts:
|
|
|
|
|
if connected_accounts < 1 or gajim.account_is_connected(account):
|
|
|
|
|
if not gajim.config.get_per('accounts', account,
|
2005-09-13 19:53:31 +02:00
|
|
|
|
'sync_with_global_status'):
|
|
|
|
|
continue
|
2005-10-11 00:46:28 +02:00
|
|
|
|
# We're going to change our status to invisible
|
2006-11-18 21:52:28 +01:00
|
|
|
|
if self.connected_rooms(account):
|
2005-09-13 19:53:31 +02:00
|
|
|
|
bug_user = True
|
|
|
|
|
break
|
|
|
|
|
if bug_user:
|
2005-09-13 23:29:38 +02:00
|
|
|
|
dialog = dialogs.ConfirmationDialog(
|
2006-11-20 08:53:58 +01:00
|
|
|
|
_('You are participating in one or more group chats'),
|
|
|
|
|
_('Changing your status to invisible will result in '
|
|
|
|
|
'disconnection from those group chats. Are you sure you want to '
|
|
|
|
|
'go invisible?'))
|
2005-09-13 19:53:31 +02:00
|
|
|
|
if dialog.get_response() != gtk.RESPONSE_OK:
|
2005-11-26 16:03:03 +01:00
|
|
|
|
self.update_status_combobox()
|
2005-09-13 19:53:31 +02:00
|
|
|
|
return
|
|
|
|
|
message = self.get_status_message(status)
|
2005-10-10 23:45:59 +02:00
|
|
|
|
if message is None: # user pressed Cancel to change status message dialog
|
2005-11-09 08:00:46 +01:00
|
|
|
|
self.update_status_combobox()
|
2005-09-13 19:53:31 +02:00
|
|
|
|
return
|
2006-03-26 15:07:11 +02:00
|
|
|
|
global_sync_accounts = []
|
|
|
|
|
for acct in accounts:
|
|
|
|
|
if gajim.config.get_per('accounts', acct, 'sync_with_global_status'):
|
|
|
|
|
global_sync_accounts.append(acct)
|
2006-04-08 12:28:53 +02:00
|
|
|
|
global_sync_connected_accounts = gajim.get_number_of_connected_accounts(
|
2006-03-26 15:07:11 +02:00
|
|
|
|
global_sync_accounts)
|
2006-11-18 21:52:28 +01:00
|
|
|
|
for account in accounts:
|
|
|
|
|
if not gajim.config.get_per('accounts', account,
|
|
|
|
|
'sync_with_global_status'):
|
2005-06-12 17:14:07 +02:00
|
|
|
|
continue
|
2005-10-11 00:49:20 +02:00
|
|
|
|
# we are connected (so we wanna change show and status)
|
2006-11-20 08:53:58 +01:00
|
|
|
|
# or no account is connected and we want to connect with new show and
|
|
|
|
|
# status
|
2006-04-06 20:37:24 +02:00
|
|
|
|
|
|
|
|
|
if not global_sync_connected_accounts > 0 or \
|
2006-11-18 21:52:28 +01:00
|
|
|
|
gajim.account_is_connected(account):
|
|
|
|
|
self.send_status(account, status, message)
|
2005-11-26 16:03:03 +01:00
|
|
|
|
self.update_status_combobox()
|
2005-12-06 18:43:21 +01:00
|
|
|
|
|
2006-11-18 21:52:28 +01:00
|
|
|
|
## enable setting status msg from currently playing music track
|
|
|
|
|
def enable_syncing_status_msg_from_current_music_track(self, enabled):
|
|
|
|
|
'''if enabled is True, we listen to events from music players about
|
|
|
|
|
currently played music track, and we update our
|
|
|
|
|
status message accordinly'''
|
|
|
|
|
if not dbus_support.supported:
|
|
|
|
|
# do nothing if user doesn't have D-Bus bindings
|
|
|
|
|
return
|
|
|
|
|
if enabled:
|
|
|
|
|
if self._music_track_changed_signal is None:
|
|
|
|
|
listener = MusicTrackListener.get()
|
|
|
|
|
self._music_track_changed_signal = listener.connect(
|
|
|
|
|
'music-track-changed', self._music_track_changed)
|
|
|
|
|
track = listener.get_playing_track()
|
|
|
|
|
self._music_track_changed(listener, track)
|
|
|
|
|
else:
|
|
|
|
|
if self._music_track_changed_signal is not None:
|
|
|
|
|
listener = MusicTrackListener.get()
|
|
|
|
|
listener.disconnect(self._music_track_changed_signal)
|
|
|
|
|
self._music_track_changed_signal = None
|
|
|
|
|
self._music_track_changed(None, None)
|
|
|
|
|
|
2007-04-21 14:31:44 +02:00
|
|
|
|
def _change_awn_icon_status(self, status):
|
2007-04-25 19:34:14 +02:00
|
|
|
|
if not dbus_support.supported:
|
|
|
|
|
# do nothing if user doesn't have D-Bus bindings
|
|
|
|
|
return
|
2007-04-21 14:31:44 +02:00
|
|
|
|
iconset = gajim.config.get('iconset')
|
|
|
|
|
prefix = os.path.join(gajim.DATA_DIR, 'iconsets', iconset, '32x32')
|
|
|
|
|
if status in ('chat', 'away', 'xa', 'dnd', 'invisible', 'offline'):
|
|
|
|
|
status = status + '.png'
|
|
|
|
|
elif status == 'online':
|
|
|
|
|
prefix = os.path.join(gajim.DATA_DIR, 'pixmaps')
|
|
|
|
|
status = 'gajim.png'
|
|
|
|
|
path = os.path.join(prefix, status)
|
|
|
|
|
try:
|
|
|
|
|
bus = dbus.SessionBus()
|
|
|
|
|
obj = bus.get_object('com.google.code.Awn', '/com/google/code/Awn')
|
|
|
|
|
awn = dbus.Interface(obj, 'com.google.code.Awn')
|
|
|
|
|
awn.SetTaskIconByName('Gajim', os.path.abspath(path))
|
|
|
|
|
except dbus.DBusException:
|
|
|
|
|
pass
|
|
|
|
|
|
2006-11-18 21:52:28 +01:00
|
|
|
|
def _music_track_changed(self, unused_listener, music_track_info):
|
|
|
|
|
accounts = gajim.connections.keys()
|
|
|
|
|
if music_track_info is None:
|
|
|
|
|
status_message = ''
|
|
|
|
|
else:
|
2007-03-09 20:58:21 +01:00
|
|
|
|
if hasattr(music_track_info, 'paused') and \
|
|
|
|
|
music_track_info.paused == 0:
|
|
|
|
|
status_message = ''
|
|
|
|
|
else:
|
|
|
|
|
status_message = '♪ ' + _('"%(title)s" by %(artist)s') % \
|
2006-11-18 21:52:28 +01:00
|
|
|
|
{'title': music_track_info.title,
|
2006-12-18 10:32:23 +01:00
|
|
|
|
'artist': music_track_info.artist } + ' ♪'
|
2006-11-18 21:52:28 +01:00
|
|
|
|
for account in accounts:
|
|
|
|
|
if not gajim.config.get_per('accounts', account,
|
|
|
|
|
'sync_with_global_status'):
|
|
|
|
|
continue
|
|
|
|
|
if not gajim.connections[account].connected:
|
|
|
|
|
continue
|
|
|
|
|
current_show = gajim.SHOW_LIST[gajim.connections[account].connected]
|
|
|
|
|
self.send_status(account, current_show, status_message)
|
|
|
|
|
|
|
|
|
|
|
2005-11-09 08:00:46 +01:00
|
|
|
|
def update_status_combobox(self):
|
2005-10-20 13:17:17 +02:00
|
|
|
|
# table to change index in connection.connected to index in combobox
|
2005-11-09 08:00:46 +01:00
|
|
|
|
table = {'offline':9, 'connecting':9, 'online':0, 'chat':1, 'away':2,
|
|
|
|
|
'xa':3, 'dnd':4, 'invisible':5}
|
|
|
|
|
show = helpers.get_global_show()
|
2005-10-11 00:46:28 +02:00
|
|
|
|
# temporarily block signal in order not to send status that we show
|
|
|
|
|
# in the combobox
|
2005-11-05 19:09:57 +01:00
|
|
|
|
self.combobox_callback_active = False
|
2005-11-09 08:00:46 +01:00
|
|
|
|
self.status_combobox.set_active(table[show])
|
2007-04-21 14:31:44 +02:00
|
|
|
|
self._change_awn_icon_status(show)
|
2005-11-05 19:09:57 +01:00
|
|
|
|
self.combobox_callback_active = True
|
2005-10-20 13:17:17 +02:00
|
|
|
|
if gajim.interface.systray_enabled:
|
2005-11-09 08:00:46 +01:00
|
|
|
|
gajim.interface.systray.change_status(show)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
2006-11-18 21:52:28 +01:00
|
|
|
|
def set_account_status_icon(self, account):
|
|
|
|
|
status = gajim.connections[account].connected
|
|
|
|
|
model = self.tree.get_model()
|
|
|
|
|
accountIter = self.get_account_iter(account)
|
|
|
|
|
if not accountIter:
|
|
|
|
|
return
|
|
|
|
|
if not self.regroup:
|
|
|
|
|
show = gajim.SHOW_LIST[status]
|
|
|
|
|
else: # accounts merged
|
|
|
|
|
show = helpers.get_global_show()
|
|
|
|
|
model[accountIter][C_IMG] = self.jabber_state_images['16'][show]
|
|
|
|
|
|
2005-06-12 17:14:07 +02:00
|
|
|
|
def on_status_changed(self, account, status):
|
|
|
|
|
'''the core tells us that our status has changed'''
|
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
|
|
|
|
if account not in gajim.contacts.get_accounts():
|
2005-06-12 17:14:07 +02:00
|
|
|
|
return
|
|
|
|
|
model = self.tree.get_model()
|
|
|
|
|
accountIter = self.get_account_iter(account)
|
2006-11-18 21:52:28 +01:00
|
|
|
|
self.set_account_status_icon(account)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
if status == 'offline':
|
2006-06-12 09:38:07 +02:00
|
|
|
|
if self.quit_on_next_offline > -1:
|
|
|
|
|
self.quit_on_next_offline -= 1
|
|
|
|
|
if self.quit_on_next_offline < 1:
|
|
|
|
|
self.quit_gtkgui_interface()
|
2005-07-24 17:42:19 +02:00
|
|
|
|
if accountIter:
|
2006-04-11 20:54:28 +02:00
|
|
|
|
model[accountIter][C_SECPIXBUF] = None
|
|
|
|
|
if gajim.con_types.has_key(account):
|
|
|
|
|
gajim.con_types[account] = None
|
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
|
|
|
|
for jid in gajim.contacts.get_jid_list(account):
|
|
|
|
|
lcontact = gajim.contacts.get_contact(account, jid)
|
|
|
|
|
lcontact_copy = []
|
|
|
|
|
for contact in lcontact:
|
|
|
|
|
lcontact_copy.append(contact)
|
|
|
|
|
for contact in lcontact_copy:
|
2006-02-01 21:12:37 +01:00
|
|
|
|
self.chg_contact_status(contact, 'offline', '', account)
|
2006-02-19 22:28:41 +01:00
|
|
|
|
self.actions_menu_needs_rebuild = True
|
2005-11-09 08:00:46 +01:00
|
|
|
|
self.update_status_combobox()
|
2005-12-06 18:43:21 +01:00
|
|
|
|
|
2006-03-14 14:10:09 +01:00
|
|
|
|
def new_chat(self, contact, account, private_chat = False, resource = None):
|
2005-12-31 08:35:14 +01:00
|
|
|
|
# Get target window, create a control, and associate it with the window
|
2006-01-06 07:59:55 +01:00
|
|
|
|
if not private_chat:
|
2007-01-02 18:43:32 +01:00
|
|
|
|
type_ = message_control.TYPE_CHAT
|
2006-01-06 07:59:55 +01:00
|
|
|
|
else:
|
2007-01-02 18:43:32 +01:00
|
|
|
|
type_ = message_control.TYPE_PM
|
2006-01-06 07:59:55 +01:00
|
|
|
|
|
2006-03-14 14:10:09 +01:00
|
|
|
|
fjid = contact.jid
|
|
|
|
|
if resource:
|
|
|
|
|
fjid += '/' + resource
|
|
|
|
|
mw = gajim.interface.msg_win_mgr.get_window(fjid, account)
|
2005-12-31 18:00:04 +01:00
|
|
|
|
if not mw:
|
2007-01-02 18:43:32 +01:00
|
|
|
|
mw = gajim.interface.msg_win_mgr.create_window(contact, account, type_)
|
2006-01-06 07:59:55 +01:00
|
|
|
|
|
|
|
|
|
if not private_chat:
|
2006-03-14 14:10:09 +01:00
|
|
|
|
chat_control = ChatControl(mw, contact, account, resource)
|
2006-01-06 07:59:55 +01:00
|
|
|
|
else:
|
|
|
|
|
chat_control = PrivateChatControl(mw, contact, account)
|
|
|
|
|
|
2005-12-30 21:47:59 +01:00
|
|
|
|
mw.new_tab(chat_control)
|
2006-01-06 07:59:55 +01:00
|
|
|
|
|
2006-09-13 18:47:58 +02:00
|
|
|
|
if len(gajim.events.get_events(account, fjid)):
|
2006-01-03 05:44:56 +01:00
|
|
|
|
# We call this here to avoid race conditions with widget validation
|
|
|
|
|
chat_control.read_queue()
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
2007-01-27 19:43:28 +01:00
|
|
|
|
def new_chat_from_jid(self, account, fjid):
|
|
|
|
|
jid, resource = gajim.get_room_and_nick_from_fjid(fjid)
|
|
|
|
|
if resource:
|
|
|
|
|
contact = gajim.contacts.get_contact(account, jid, resource)
|
|
|
|
|
else:
|
|
|
|
|
contact = gajim.contacts.get_contact_with_highest_priority(account,
|
|
|
|
|
jid)
|
2006-11-18 21:52:28 +01:00
|
|
|
|
added_to_roster = False
|
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
|
|
|
|
if not contact:
|
2006-11-18 21:52:28 +01:00
|
|
|
|
added_to_roster = True
|
2007-01-27 19:43:28 +01:00
|
|
|
|
contact = self.add_to_not_in_the_roster(account, jid,
|
|
|
|
|
resource = resource)
|
2005-06-30 18:45:14 +02:00
|
|
|
|
|
2007-01-27 19:43:28 +01:00
|
|
|
|
if not gajim.interface.msg_win_mgr.has_window(fjid, account):
|
|
|
|
|
self.new_chat(contact, account, resource = resource)
|
|
|
|
|
mw = gajim.interface.msg_win_mgr.get_window(fjid, account)
|
|
|
|
|
mw.set_active_tab(fjid, account)
|
2005-12-31 22:55:44 +01:00
|
|
|
|
mw.window.present()
|
2006-06-05 12:54:26 +02:00
|
|
|
|
# For JEP-0172
|
2006-11-18 21:52:28 +01:00
|
|
|
|
if added_to_roster:
|
2007-01-27 19:43:28 +01:00
|
|
|
|
mc = mw.get_control(fjid, account)
|
2006-06-19 01:38:02 +02:00
|
|
|
|
mc.user_nick = gajim.nicks[account]
|
2005-06-30 18:45:14 +02:00
|
|
|
|
|
2006-01-03 08:34:18 +01:00
|
|
|
|
def new_room(self, room_jid, nick, account):
|
2005-12-31 08:35:14 +01:00
|
|
|
|
# Get target window, create a control, and associate it with the window
|
2006-01-05 06:51:28 +01:00
|
|
|
|
contact = gajim.contacts.create_contact(jid = room_jid, name = nick)
|
2006-01-25 03:43:55 +01:00
|
|
|
|
mw = gajim.interface.msg_win_mgr.get_window(contact.jid, account)
|
2005-12-31 18:00:04 +01:00
|
|
|
|
if not mw:
|
|
|
|
|
mw = gajim.interface.msg_win_mgr.create_window(contact, account,
|
2005-12-31 08:35:14 +01:00
|
|
|
|
GroupchatControl.TYPE_ID)
|
2006-01-03 08:34:18 +01:00
|
|
|
|
gc_control = GroupchatControl(mw, contact, account)
|
2005-12-31 08:35:14 +01:00
|
|
|
|
mw.new_tab(gc_control)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
2005-10-10 23:45:59 +02:00
|
|
|
|
def on_message(self, jid, msg, tim, account, encrypted = False,
|
2006-06-01 17:23:38 +02:00
|
|
|
|
msg_type = '', subject = None, resource = '', msg_id = None,
|
2006-11-18 21:52:28 +01:00
|
|
|
|
user_nick = '', advanced_notif_num = None, xhtml = None):
|
2005-06-12 17:14:07 +02:00
|
|
|
|
'''when we receive a message'''
|
2006-03-15 09:40:19 +01:00
|
|
|
|
contact = None
|
2006-03-15 12:30:45 +01:00
|
|
|
|
# if chat window will be for specific resource
|
|
|
|
|
resource_for_chat = resource
|
2006-11-18 21:52:28 +01:00
|
|
|
|
fjid = jid
|
2006-03-15 09:40:19 +01:00
|
|
|
|
# Try to catch the contact with correct resource
|
|
|
|
|
if resource:
|
|
|
|
|
fjid = jid + '/' + resource
|
|
|
|
|
contact = gajim.contacts.get_contact(account, jid, resource)
|
2006-05-25 12:40:07 +02:00
|
|
|
|
highest_contact = gajim.contacts.get_contact_with_highest_priority(
|
|
|
|
|
account, jid)
|
2006-03-15 09:40:19 +01:00
|
|
|
|
if not contact:
|
2006-11-18 21:52:28 +01:00
|
|
|
|
# If there is another resource, it may be a message from an invisible
|
|
|
|
|
# resource
|
|
|
|
|
lcontact = gajim.contacts.get_contacts_from_jid(account, jid)
|
|
|
|
|
if (len(lcontact) > 1 or (lcontact and lcontact[0].resource and \
|
|
|
|
|
lcontact[0].show != 'offline')) and jid.find('@') > 0:
|
|
|
|
|
contact = gajim.contacts.copy_contact(highest_contact)
|
|
|
|
|
contact.resource = resource
|
|
|
|
|
if resource:
|
|
|
|
|
fjid = jid + '/' + resource
|
|
|
|
|
contact.priority = 0
|
|
|
|
|
contact.show = 'offline'
|
|
|
|
|
contact.status = ''
|
|
|
|
|
gajim.contacts.add_contact(account, contact)
|
|
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
# Default to highest prio
|
|
|
|
|
fjid = jid
|
|
|
|
|
resource_for_chat = None
|
|
|
|
|
contact = highest_contact
|
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
|
|
|
|
if not contact:
|
2006-05-25 12:26:55 +02:00
|
|
|
|
# contact is not in roster
|
2006-11-18 21:52:28 +01:00
|
|
|
|
contact = self.add_to_not_in_the_roster(account, jid, user_nick)
|
2005-07-05 23:35:37 +02:00
|
|
|
|
|
2006-11-18 21:52:28 +01:00
|
|
|
|
path = self.get_path(jid, account) # Try to get line of contact in roster
|
2005-10-16 15:18:34 +02:00
|
|
|
|
|
2006-03-15 12:30:45 +01:00
|
|
|
|
# Look for a chat control that has the given resource
|
|
|
|
|
ctrl = gajim.interface.msg_win_mgr.get_control(fjid, account)
|
|
|
|
|
if not ctrl:
|
|
|
|
|
# if not, if message comes from highest prio, get control or open one
|
|
|
|
|
# without resource
|
2006-09-13 18:47:58 +02:00
|
|
|
|
if highest_contact and contact.resource == highest_contact.resource \
|
|
|
|
|
and not jid == gajim.get_jid_from_account(account):
|
2006-03-15 12:30:45 +01:00
|
|
|
|
ctrl = gajim.interface.msg_win_mgr.get_control(jid, account)
|
|
|
|
|
fjid = jid
|
|
|
|
|
resource_for_chat = None
|
|
|
|
|
|
2005-07-05 23:35:37 +02:00
|
|
|
|
# Do we have a queue?
|
2006-09-13 18:47:58 +02:00
|
|
|
|
no_queue = len(gajim.events.get_events(account, fjid)) == 0
|
|
|
|
|
|
|
|
|
|
popup = helpers.allow_popup_window(account, advanced_notif_num)
|
2005-09-23 23:01:42 +02:00
|
|
|
|
|
2005-11-23 19:15:24 +01:00
|
|
|
|
if msg_type == 'normal' and popup: # it's single message to be autopopuped
|
|
|
|
|
dialogs.SingleMessageWindow(account, contact.jid,
|
|
|
|
|
action = 'receive', from_whom = jid, subject = subject,
|
2005-11-23 19:19:22 +01:00
|
|
|
|
message = msg, resource = resource)
|
2005-11-23 19:15:24 +01:00
|
|
|
|
return
|
2005-12-06 18:43:21 +01:00
|
|
|
|
|
2005-10-16 15:18:34 +02:00
|
|
|
|
# We print if window is opened and it's not a single message
|
2006-03-15 09:40:19 +01:00
|
|
|
|
if ctrl and msg_type != 'normal':
|
2006-01-08 01:15:54 +01:00
|
|
|
|
typ = ''
|
|
|
|
|
if msg_type == 'error':
|
|
|
|
|
typ = 'status'
|
2006-01-25 06:39:07 +01:00
|
|
|
|
ctrl.print_conversation(msg, typ, tim = tim, encrypted = encrypted,
|
2006-11-18 21:52:28 +01:00
|
|
|
|
subject = subject, xhtml = xhtml)
|
2006-04-11 00:08:02 +02:00
|
|
|
|
if msg_id:
|
|
|
|
|
gajim.logger.set_read_messages([msg_id])
|
2005-06-12 17:14:07 +02:00
|
|
|
|
return
|
2005-07-05 23:35:37 +02:00
|
|
|
|
|
2005-10-10 23:45:59 +02:00
|
|
|
|
# We save it in a queue
|
2006-09-13 18:47:58 +02:00
|
|
|
|
type_ = 'chat'
|
2006-11-18 21:52:28 +01:00
|
|
|
|
event_type = 'message_received'
|
2005-10-16 15:18:34 +02:00
|
|
|
|
if msg_type == 'normal':
|
2006-09-13 18:47:58 +02:00
|
|
|
|
type_ = 'normal'
|
2006-11-18 21:52:28 +01:00
|
|
|
|
event_type = 'single_message_received'
|
|
|
|
|
show_in_roster = notify.get_show_in_roster(event_type, account, contact)
|
|
|
|
|
show_in_systray = notify.get_show_in_systray(event_type, account, contact)
|
2006-09-13 18:47:58 +02:00
|
|
|
|
event = gajim.events.create_event(type_, (msg, subject, msg_type, tim,
|
2006-11-18 21:52:28 +01:00
|
|
|
|
encrypted, resource, msg_id, xhtml), show_in_roster = show_in_roster,
|
2006-09-13 18:47:58 +02:00
|
|
|
|
show_in_systray = show_in_systray)
|
|
|
|
|
gajim.events.add_event(account, fjid, event)
|
2005-10-16 15:18:34 +02:00
|
|
|
|
if popup:
|
2006-03-15 09:40:19 +01:00
|
|
|
|
if not ctrl:
|
2006-03-15 12:30:45 +01:00
|
|
|
|
self.new_chat(contact, account, resource = resource_for_chat)
|
2007-03-17 09:14:25 +01:00
|
|
|
|
if path and not self.dragging and gajim.config.get(
|
|
|
|
|
'scroll_roster_to_last_message'):
|
2006-05-25 12:26:55 +02:00
|
|
|
|
# we curently see contact in our roster OR he
|
|
|
|
|
# is not in the roster at all.
|
|
|
|
|
# show and select his line in roster
|
2006-12-29 18:41:13 +01:00
|
|
|
|
# do not change selection while DND'ing
|
2005-10-16 15:18:34 +02:00
|
|
|
|
self.tree.expand_row(path[0:1], False)
|
|
|
|
|
self.tree.expand_row(path[0:2], False)
|
|
|
|
|
self.tree.scroll_to_cell(path)
|
|
|
|
|
self.tree.set_cursor(path)
|
|
|
|
|
else:
|
2005-09-23 23:01:42 +02:00
|
|
|
|
if no_queue: # We didn't have a queue: we change icons
|
2005-06-12 17:14:07 +02:00
|
|
|
|
self.draw_contact(jid, account)
|
|
|
|
|
self.show_title() # we show the * or [n]
|
2006-11-18 21:52:28 +01:00
|
|
|
|
# Show contact in roster (if he is invisible for example) and select
|
|
|
|
|
# line
|
|
|
|
|
self.show_and_select_path(path, jid, account)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
|
|
|
|
def on_preferences_menuitem_activate(self, widget):
|
2006-03-05 13:18:47 +01:00
|
|
|
|
if gajim.interface.instances.has_key('preferences'):
|
2005-11-13 16:08:47 +01:00
|
|
|
|
gajim.interface.instances['preferences'].window.present()
|
2005-06-12 17:14:07 +02:00
|
|
|
|
else:
|
2006-03-05 13:18:47 +01:00
|
|
|
|
gajim.interface.instances['preferences'] = config.PreferencesWindow()
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
|
|
|
|
def on_add_new_contact(self, widget, account):
|
2005-10-20 13:17:17 +02:00
|
|
|
|
dialogs.AddNewContactWindow(account)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
|
|
|
|
def on_join_gc_activate(self, widget, account):
|
2005-11-16 11:21:43 +01:00
|
|
|
|
'''when the join gc menuitem is clicked, show the join gc window'''
|
2005-09-30 19:52:25 +02:00
|
|
|
|
invisible_show = gajim.SHOW_LIST.index('invisible')
|
|
|
|
|
if gajim.connections[account].connected == invisible_show:
|
2006-11-20 08:53:58 +01:00
|
|
|
|
dialogs.ErrorDialog(_('You cannot join a group chat while you are '
|
|
|
|
|
'invisible'))
|
2005-09-30 19:52:25 +02:00
|
|
|
|
return
|
2005-11-13 16:08:47 +01:00
|
|
|
|
if gajim.interface.instances[account].has_key('join_gc'):
|
|
|
|
|
gajim.interface.instances[account]['join_gc'].window.present()
|
2005-06-12 17:14:07 +02:00
|
|
|
|
else:
|
2005-10-11 00:46:28 +02:00
|
|
|
|
# c http://nkour.blogspot.com/2005/05/pythons-init-return-none-doesnt-return.html
|
2005-06-12 17:14:07 +02:00
|
|
|
|
try:
|
2005-11-13 16:08:47 +01:00
|
|
|
|
gajim.interface.instances[account]['join_gc'] = \
|
2005-10-20 13:17:17 +02:00
|
|
|
|
dialogs.JoinGroupchatWindow(account)
|
2006-11-18 21:52:28 +01:00
|
|
|
|
except GajimGeneralException:
|
2005-06-12 17:14:07 +02:00
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
def on_new_message_menuitem_activate(self, widget, account):
|
2006-04-09 20:14:59 +02:00
|
|
|
|
dialogs.SingleMessageWindow(account, action = 'send')
|
2006-04-18 17:17:07 +02:00
|
|
|
|
|
|
|
|
|
def on_new_chat_menuitem_activate(self, widget, account):
|
2006-05-24 20:17:51 +02:00
|
|
|
|
dialogs.NewChatDialog(account)
|
2005-12-06 18:43:21 +01:00
|
|
|
|
|
2005-10-07 01:34:23 +02:00
|
|
|
|
def on_contents_menuitem_activate(self, widget):
|
|
|
|
|
helpers.launch_browser_mailer('url', 'http://trac.gajim.org/wiki')
|
2005-12-06 18:43:21 +01:00
|
|
|
|
|
2005-10-07 01:34:23 +02:00
|
|
|
|
def on_faq_menuitem_activate(self, widget):
|
2006-11-20 08:53:58 +01:00
|
|
|
|
helpers.launch_browser_mailer('url',
|
|
|
|
|
'http://trac.gajim.org/wiki/GajimFaq')
|
2005-10-07 01:34:23 +02:00
|
|
|
|
|
2005-06-12 17:14:07 +02:00
|
|
|
|
def on_about_menuitem_activate(self, widget):
|
|
|
|
|
dialogs.AboutDialog()
|
|
|
|
|
|
|
|
|
|
def on_accounts_menuitem_activate(self, widget):
|
2005-11-13 16:08:47 +01:00
|
|
|
|
if gajim.interface.instances.has_key('accounts'):
|
|
|
|
|
gajim.interface.instances['accounts'].window.present()
|
2005-06-12 17:14:07 +02:00
|
|
|
|
else:
|
2005-12-06 18:43:21 +01:00
|
|
|
|
gajim.interface.instances['accounts'] = config.AccountsWindow()
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
2005-08-03 17:59:44 +02:00
|
|
|
|
def on_file_transfers_menuitem_activate(self, widget):
|
2006-11-20 08:53:58 +01:00
|
|
|
|
if gajim.interface.instances['file_transfers'].window.get_property(
|
|
|
|
|
'visible'):
|
2005-11-13 16:08:47 +01:00
|
|
|
|
gajim.interface.instances['file_transfers'].window.present()
|
2005-08-03 17:59:44 +02:00
|
|
|
|
else:
|
2005-11-13 16:08:47 +01:00
|
|
|
|
gajim.interface.instances['file_transfers'].window.show_all()
|
2005-08-03 17:59:44 +02:00
|
|
|
|
|
2006-11-18 21:52:28 +01:00
|
|
|
|
def on_show_transports_menuitem_activate(self, widget):
|
|
|
|
|
gajim.config.set('show_transports_group', widget.get_active())
|
|
|
|
|
self.draw_roster()
|
|
|
|
|
|
2005-08-07 14:55:59 +02:00
|
|
|
|
def on_manage_bookmarks_menuitem_activate(self, widget):
|
2005-10-20 13:17:17 +02:00
|
|
|
|
config.ManageBookmarksWindow()
|
2006-04-09 00:47:57 +02:00
|
|
|
|
|
|
|
|
|
def on_profile_avatar_menuitem_activate(self, widget, account):
|
|
|
|
|
gajim.interface.edit_own_details(account)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
2006-09-13 18:47:58 +02:00
|
|
|
|
def close_all_from_dict(self, dic):
|
2005-06-12 17:14:07 +02:00
|
|
|
|
'''close all the windows in the given dictionary'''
|
|
|
|
|
for w in dic.values():
|
|
|
|
|
if type(w) == type({}):
|
2006-09-13 18:47:58 +02:00
|
|
|
|
self.close_all_from_dict(w)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
else:
|
|
|
|
|
w.window.destroy()
|
2006-09-13 18:47:58 +02:00
|
|
|
|
|
2006-11-18 21:52:28 +01:00
|
|
|
|
def close_all(self, account, force = False):
|
|
|
|
|
'''close all the windows from an account
|
|
|
|
|
if force is True, do not ask confirmation before closing chat/gc windows
|
|
|
|
|
'''
|
2006-09-13 18:47:58 +02:00
|
|
|
|
self.close_all_from_dict(gajim.interface.instances[account])
|
|
|
|
|
for ctrl in gajim.interface.msg_win_mgr.get_controls(acct = account):
|
2007-03-31 14:12:12 +02:00
|
|
|
|
ctrl.parent_win.remove_tab(ctrl, ctrl.parent_win.CLOSE_CLOSE_BUTTON,
|
|
|
|
|
force = force)
|
2005-12-06 18:43:21 +01:00
|
|
|
|
|
2005-06-12 17:14:07 +02:00
|
|
|
|
def on_roster_window_delete_event(self, widget, event):
|
|
|
|
|
'''When we want to close the window'''
|
2006-11-20 08:53:58 +01:00
|
|
|
|
if gajim.interface.systray_enabled and not gajim.config.get(
|
|
|
|
|
'quit_on_roster_x_button'):
|
2005-07-07 23:27:53 +02:00
|
|
|
|
self.tooltip.hide_tooltip()
|
2005-06-12 17:14:07 +02:00
|
|
|
|
self.window.hide()
|
|
|
|
|
else:
|
|
|
|
|
accounts = gajim.connections.keys()
|
|
|
|
|
get_msg = False
|
2006-06-12 09:38:07 +02:00
|
|
|
|
self.quit_on_next_offline = 0
|
2005-06-12 17:14:07 +02:00
|
|
|
|
for acct in accounts:
|
|
|
|
|
if gajim.connections[acct].connected:
|
|
|
|
|
get_msg = True
|
|
|
|
|
break
|
|
|
|
|
if get_msg:
|
|
|
|
|
message = self.get_status_message('offline')
|
2006-11-20 08:53:58 +01:00
|
|
|
|
if message is None:
|
|
|
|
|
# user pressed Cancel to change status message dialog
|
2005-06-12 17:14:07 +02:00
|
|
|
|
message = ''
|
2006-06-12 09:38:07 +02:00
|
|
|
|
|
2005-06-12 17:14:07 +02:00
|
|
|
|
for acct in accounts:
|
|
|
|
|
if gajim.connections[acct].connected:
|
2006-06-12 09:38:07 +02:00
|
|
|
|
self.quit_on_next_offline += 1
|
2006-06-12 19:34:08 +02:00
|
|
|
|
self.send_status(acct, 'offline', message)
|
2006-06-12 09:38:07 +02:00
|
|
|
|
if not self.quit_on_next_offline:
|
|
|
|
|
self.quit_gtkgui_interface()
|
2005-06-12 17:14:07 +02:00
|
|
|
|
return True # do NOT destory the window
|
|
|
|
|
|
2005-09-04 18:57:09 +02:00
|
|
|
|
def on_roster_window_focus_in_event(self, widget, event):
|
2005-11-08 15:09:56 +01:00
|
|
|
|
# roster received focus, so if we had urgency REMOVE IT
|
|
|
|
|
# NOTE: we do not have to read the message to remove urgency
|
|
|
|
|
# so this functions does that
|
2006-01-23 01:03:28 +01:00
|
|
|
|
gtkgui_helpers.set_unset_urgency_hint(widget, False)
|
2005-12-06 18:43:21 +01:00
|
|
|
|
|
2005-11-08 15:09:56 +01:00
|
|
|
|
# if a contact row is selected, update colors (eg. for status msg)
|
|
|
|
|
# because gtk engines may differ in bg when window is selected
|
|
|
|
|
# or not
|
2006-09-13 18:47:58 +02:00
|
|
|
|
if len(self._last_selected_contact):
|
|
|
|
|
for (jid, account) in self._last_selected_contact:
|
|
|
|
|
self.draw_contact(jid, account, selected = True,
|
2006-01-08 08:50:26 +01:00
|
|
|
|
focus = True)
|
2005-11-08 15:09:56 +01:00
|
|
|
|
|
|
|
|
|
def on_roster_window_focus_out_event(self, widget, event):
|
|
|
|
|
# if a contact row is selected, update colors (eg. for status msg)
|
|
|
|
|
# because gtk engines may differ in bg when window is selected
|
|
|
|
|
# or not
|
2006-09-13 18:47:58 +02:00
|
|
|
|
if len(self._last_selected_contact):
|
|
|
|
|
for (jid, account) in self._last_selected_contact:
|
|
|
|
|
self.draw_contact(jid, account, selected = True,
|
2006-01-08 08:50:26 +01:00
|
|
|
|
focus = False)
|
2005-09-04 18:57:09 +02:00
|
|
|
|
|
2005-09-20 21:57:34 +02:00
|
|
|
|
def on_roster_window_key_press_event(self, widget, event):
|
|
|
|
|
if event.keyval == gtk.keysyms.Escape:
|
2006-09-13 18:47:58 +02:00
|
|
|
|
model, list_of_paths = self.tree.get_selection().get_selected_rows()
|
|
|
|
|
if not len(list_of_paths) and gajim.interface.systray_enabled and \
|
|
|
|
|
not gajim.config.get('quit_on_roster_x_button'):
|
2005-09-20 21:57:34 +02:00
|
|
|
|
self.tooltip.hide_tooltip()
|
|
|
|
|
self.window.hide()
|
|
|
|
|
|
2006-11-19 20:45:43 +01:00
|
|
|
|
def on_roster_window_popup_menu(self, widget):
|
|
|
|
|
event = gtk.gdk.Event(gtk.gdk.KEY_PRESS)
|
|
|
|
|
self.show_treeview_menu(event)
|
|
|
|
|
|
2005-10-20 13:17:17 +02:00
|
|
|
|
def quit_gtkgui_interface(self):
|
|
|
|
|
'''When we quit the gtk interface :
|
2005-06-12 17:14:07 +02:00
|
|
|
|
tell that to the core and exit gtk'''
|
|
|
|
|
if gajim.config.get('saveposition'):
|
2005-09-09 16:56:14 +02:00
|
|
|
|
# in case show_roster_on_start is False and roster is never shown
|
|
|
|
|
# window.window is None
|
|
|
|
|
if self.window.window is not None:
|
|
|
|
|
x, y = self.window.window.get_root_origin()
|
|
|
|
|
gajim.config.set('roster_x-position', x)
|
|
|
|
|
gajim.config.set('roster_y-position', y)
|
|
|
|
|
width, height = self.window.get_size()
|
|
|
|
|
gajim.config.set('roster_width', width)
|
|
|
|
|
gajim.config.set('roster_height', height)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
2007-02-13 21:12:52 +01:00
|
|
|
|
gajim.config.set('show_roster_on_startup',
|
|
|
|
|
self.window.get_property('visible'))
|
2006-01-12 06:45:30 +01:00
|
|
|
|
gajim.interface.msg_win_mgr.shutdown()
|
|
|
|
|
|
2005-06-12 17:14:07 +02:00
|
|
|
|
gajim.config.set('collapsed_rows', '\t'.join(self.collapsed_rows))
|
2005-10-20 13:17:17 +02:00
|
|
|
|
gajim.interface.save_config()
|
2005-06-12 17:14:07 +02:00
|
|
|
|
for account in gajim.connections:
|
|
|
|
|
gajim.connections[account].quit(True)
|
2006-09-13 18:47:58 +02:00
|
|
|
|
self.close_all(account)
|
2005-10-20 13:17:17 +02:00
|
|
|
|
if gajim.interface.systray_enabled:
|
|
|
|
|
gajim.interface.hide_systray()
|
2005-06-12 17:14:07 +02:00
|
|
|
|
gtk.main_quit()
|
|
|
|
|
|
|
|
|
|
def on_quit_menuitem_activate(self, widget):
|
|
|
|
|
accounts = gajim.connections.keys()
|
|
|
|
|
get_msg = False
|
|
|
|
|
for acct in accounts:
|
|
|
|
|
if gajim.connections[acct].connected:
|
|
|
|
|
get_msg = True
|
|
|
|
|
break
|
|
|
|
|
if get_msg:
|
|
|
|
|
message = self.get_status_message('offline')
|
2006-11-20 08:53:58 +01:00
|
|
|
|
if message is None:
|
|
|
|
|
# user pressed Cancel to change status message dialog
|
2005-06-12 17:14:07 +02:00
|
|
|
|
return
|
|
|
|
|
# check if we have unread or recent mesages
|
|
|
|
|
unread = False
|
|
|
|
|
recent = False
|
2006-09-13 18:47:58 +02:00
|
|
|
|
if gajim.events.get_nb_events() > 0:
|
2005-06-12 17:14:07 +02:00
|
|
|
|
unread = True
|
2006-01-02 02:23:40 +01:00
|
|
|
|
for win in gajim.interface.msg_win_mgr.windows():
|
2005-12-31 22:55:44 +01:00
|
|
|
|
unrd = 0
|
2006-01-25 06:39:07 +01:00
|
|
|
|
for ctrl in win.controls():
|
2006-02-08 05:55:06 +01:00
|
|
|
|
if ctrl.type_id == message_control.TYPE_GC:
|
|
|
|
|
if gajim.config.get('notify_on_all_muc_messages'):
|
2006-09-13 18:47:58 +02:00
|
|
|
|
unrd += ctrl.get_nb_unread()
|
2006-02-08 05:55:06 +01:00
|
|
|
|
else:
|
|
|
|
|
if ctrl.attention_flag:
|
|
|
|
|
unrd += 1
|
2005-12-31 22:55:44 +01:00
|
|
|
|
if unrd:
|
|
|
|
|
unread = True
|
|
|
|
|
break
|
2006-01-08 01:15:54 +01:00
|
|
|
|
|
2006-01-25 06:39:07 +01:00
|
|
|
|
for ctrl in win.controls():
|
2006-03-14 18:13:34 +01:00
|
|
|
|
fjid = ctrl.get_full_jid()
|
|
|
|
|
if gajim.last_message_time[acct].has_key(fjid):
|
|
|
|
|
if time.time() - gajim.last_message_time[acct][fjid] < 2:
|
2006-01-08 01:15:54 +01:00
|
|
|
|
recent = True
|
|
|
|
|
break
|
2005-06-12 17:14:07 +02:00
|
|
|
|
if unread:
|
|
|
|
|
dialog = dialogs.ConfirmationDialog(_('You have unread messages'),
|
2006-11-20 08:53:58 +01:00
|
|
|
|
_('Messages will only be available for reading them later if you'
|
|
|
|
|
' have history enabled.'))
|
2005-06-12 17:14:07 +02:00
|
|
|
|
if dialog.get_response() != gtk.RESPONSE_OK:
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
if recent:
|
2005-12-06 18:43:21 +01:00
|
|
|
|
dialog = dialogs.ConfirmationDialog(_('You have unread messages'),
|
2006-11-20 08:53:58 +01:00
|
|
|
|
_('Messages will only be available for reading them later if you'
|
|
|
|
|
' have history enabled.'))
|
2005-06-12 17:14:07 +02:00
|
|
|
|
if dialog.get_response() != gtk.RESPONSE_OK:
|
|
|
|
|
return
|
2006-06-12 09:38:07 +02:00
|
|
|
|
self.quit_on_next_offline = 0
|
2005-06-12 17:14:07 +02:00
|
|
|
|
for acct in accounts:
|
|
|
|
|
if gajim.connections[acct].connected:
|
2006-06-12 09:38:07 +02:00
|
|
|
|
self.quit_on_next_offline += 1
|
2006-06-12 19:34:08 +02:00
|
|
|
|
self.send_status(acct, 'offline', message)
|
2006-06-12 09:38:07 +02:00
|
|
|
|
else:
|
|
|
|
|
self.quit_on_next_offline = 0
|
|
|
|
|
if not self.quit_on_next_offline:
|
|
|
|
|
self.quit_gtkgui_interface()
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
2005-10-18 22:30:26 +02:00
|
|
|
|
def open_event(self, account, jid, event):
|
|
|
|
|
'''If an event was handled, return True, else return False'''
|
2006-09-13 18:47:58 +02:00
|
|
|
|
data = event.parameters
|
2005-11-13 16:08:47 +01:00
|
|
|
|
ft = gajim.interface.instances['file_transfers']
|
2006-09-13 18:47:58 +02:00
|
|
|
|
if event.type_ == 'normal':
|
2005-10-20 13:17:17 +02:00
|
|
|
|
dialogs.SingleMessageWindow(account, jid,
|
2005-10-18 22:30:26 +02:00
|
|
|
|
action = 'receive', from_whom = jid, subject = data[1],
|
2005-11-23 19:19:22 +01:00
|
|
|
|
message = data[0], resource = data[5])
|
2006-09-13 18:47:58 +02:00
|
|
|
|
gajim.interface.remove_first_event(account, jid, event.type_)
|
2005-10-18 22:30:26 +02:00
|
|
|
|
return True
|
2006-09-13 18:47:58 +02:00
|
|
|
|
elif event.type_ == 'file-request':
|
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
|
|
|
|
contact = gajim.contacts.get_contact_with_highest_priority(account,
|
|
|
|
|
jid)
|
2006-09-13 18:47:58 +02:00
|
|
|
|
gajim.interface.remove_first_event(account, jid, event.type_)
|
2005-12-19 21:01:32 +01:00
|
|
|
|
ft.show_file_request(account, contact, data)
|
2005-10-18 22:30:26 +02:00
|
|
|
|
return True
|
2006-09-13 18:47:58 +02:00
|
|
|
|
elif event.type_ in ('file-request-error', 'file-send-error'):
|
|
|
|
|
gajim.interface.remove_first_event(account, jid, event.type_)
|
2005-12-19 21:01:32 +01:00
|
|
|
|
ft.show_send_error(data)
|
2005-10-18 22:30:26 +02:00
|
|
|
|
return True
|
2006-09-13 18:47:58 +02:00
|
|
|
|
elif event.type_ in ('file-error', 'file-stopped'):
|
|
|
|
|
gajim.interface.remove_first_event(account, jid, event.type_)
|
2005-12-19 21:01:32 +01:00
|
|
|
|
ft.show_stopped(jid, data)
|
2005-10-19 22:16:22 +02:00
|
|
|
|
return True
|
2006-09-13 18:47:58 +02:00
|
|
|
|
elif event.type_ == 'file-completed':
|
|
|
|
|
gajim.interface.remove_first_event(account, jid, event.type_)
|
2005-12-19 21:01:32 +01:00
|
|
|
|
ft.show_completed(jid, data)
|
2005-10-19 23:14:51 +02:00
|
|
|
|
return True
|
2006-11-18 21:52:28 +01:00
|
|
|
|
elif event.type_ == 'gc-invitation':
|
|
|
|
|
dialogs.InvitationReceivedDialog(account, data[0], jid, data[2],
|
|
|
|
|
data[1])
|
|
|
|
|
gajim.interface.remove_first_event(account, jid, event.type_)
|
|
|
|
|
return True
|
2005-10-18 22:30:26 +02:00
|
|
|
|
return False
|
2005-10-16 15:18:34 +02:00
|
|
|
|
|
2006-06-23 00:49:39 +02:00
|
|
|
|
def on_execute_command(self, widget, contact, account, resource=None):
|
|
|
|
|
'''Execute command. Full JID needed; if it is other contact,
|
|
|
|
|
resource is necessary. Widget is unnecessary, only to be
|
|
|
|
|
able to make this a callback.'''
|
|
|
|
|
jid = contact.jid
|
|
|
|
|
if resource is not None:
|
2006-08-07 18:18:01 +02:00
|
|
|
|
jid = jid + u'/' + resource
|
2006-06-23 00:49:39 +02:00
|
|
|
|
adhoc_commands.CommandWindow(account, jid)
|
|
|
|
|
|
2006-03-14 14:10:09 +01:00
|
|
|
|
def on_open_chat_window(self, widget, contact, account, resource = None):
|
|
|
|
|
# Get the window containing the chat
|
|
|
|
|
fjid = contact.jid
|
|
|
|
|
if resource:
|
|
|
|
|
fjid += '/' + resource
|
|
|
|
|
win = gajim.interface.msg_win_mgr.get_window(fjid, account)
|
|
|
|
|
if not win:
|
|
|
|
|
self.new_chat(contact, account, resource = resource)
|
|
|
|
|
win = gajim.interface.msg_win_mgr.get_window(fjid, account)
|
2006-03-14 18:13:34 +01:00
|
|
|
|
ctrl = win.get_control(fjid, account)
|
|
|
|
|
# last message is long time ago
|
|
|
|
|
gajim.last_message_time[account][ctrl.get_full_jid()] = 0
|
2006-03-14 14:10:09 +01:00
|
|
|
|
win.set_active_tab(fjid, account)
|
2006-11-18 21:52:28 +01:00
|
|
|
|
if gajim.connections[account].is_zeroconf and \
|
|
|
|
|
gajim.connections[account].status in ('offline', 'invisible'):
|
|
|
|
|
win.get_control(fjid, account).got_disconnected()
|
|
|
|
|
|
2006-03-28 12:37:12 +02:00
|
|
|
|
win.window.present()
|
2006-03-14 14:10:09 +01:00
|
|
|
|
|
2007-04-26 18:44:00 +02:00
|
|
|
|
def on_row_activated(self, widget, path):
|
|
|
|
|
'''When an iter is activated (dubblick or single click if gnome is set
|
|
|
|
|
this way'''
|
2005-06-12 17:14:07 +02:00
|
|
|
|
model = self.tree.get_model()
|
2006-02-05 00:07:46 +01:00
|
|
|
|
account = model[path][C_ACCOUNT].decode('utf-8')
|
2007-01-02 18:43:32 +01:00
|
|
|
|
type_ = model[path][C_TYPE]
|
2006-02-05 00:07:46 +01:00
|
|
|
|
jid = model[path][C_JID].decode('utf-8')
|
2006-03-25 18:05:54 +01:00
|
|
|
|
resource = None
|
2006-02-20 18:09:14 +01:00
|
|
|
|
iter = model.get_iter(path)
|
2007-01-02 18:43:32 +01:00
|
|
|
|
if type_ in ('group', 'account'):
|
2005-06-12 17:14:07 +02:00
|
|
|
|
if self.tree.row_expanded(path):
|
|
|
|
|
self.tree.collapse_row(path)
|
|
|
|
|
else:
|
|
|
|
|
self.tree.expand_row(path, False)
|
|
|
|
|
else:
|
2006-09-13 18:47:58 +02:00
|
|
|
|
first_ev = gajim.events.get_first_event(account, jid)
|
2006-03-25 18:05:54 +01:00
|
|
|
|
if not first_ev:
|
|
|
|
|
# look in other resources
|
|
|
|
|
for c in gajim.contacts.get_contact(account, jid):
|
|
|
|
|
fjid = c.get_full_jid()
|
2006-09-13 18:47:58 +02:00
|
|
|
|
first_ev = gajim.events.get_first_event(account, fjid)
|
2006-03-25 18:05:54 +01:00
|
|
|
|
if first_ev:
|
|
|
|
|
resource = c.resource
|
|
|
|
|
break
|
2006-02-20 18:09:14 +01:00
|
|
|
|
if not first_ev and model.iter_has_child(iter):
|
|
|
|
|
child_iter = model.iter_children(iter)
|
|
|
|
|
while not first_ev and child_iter:
|
|
|
|
|
child_jid = model[child_iter][C_JID].decode('utf-8')
|
2006-09-13 18:47:58 +02:00
|
|
|
|
first_ev = gajim.events.get_first_event(account, child_jid)
|
2006-02-20 18:09:14 +01:00
|
|
|
|
if first_ev:
|
|
|
|
|
jid = child_jid
|
|
|
|
|
else:
|
|
|
|
|
child_iter = model.iter_next(child_iter)
|
2005-10-18 11:07:52 +02:00
|
|
|
|
if first_ev:
|
2006-03-25 18:05:54 +01:00
|
|
|
|
fjid = jid
|
|
|
|
|
if resource:
|
|
|
|
|
fjid += '/' + resource
|
|
|
|
|
if self.open_event(account, fjid, first_ev):
|
2005-10-16 15:18:34 +02:00
|
|
|
|
return
|
2006-11-18 21:52:28 +01:00
|
|
|
|
c = gajim.contacts.get_contact(account, jid, resource)
|
|
|
|
|
if not c or isinstance(c, list):
|
|
|
|
|
c = gajim.contacts.get_contact_with_highest_priority(account, jid)
|
2006-07-19 13:01:09 +02:00
|
|
|
|
if jid == gajim.get_jid_from_account(account):
|
|
|
|
|
resource = c.resource
|
2006-03-25 18:05:54 +01:00
|
|
|
|
self.on_open_chat_window(widget, c, account, resource = resource)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
2007-04-26 18:44:00 +02:00
|
|
|
|
def on_roster_treeview_row_activated(self, widget, path, col = 0):
|
|
|
|
|
'''When an iter is double clicked: open the first event window'''
|
|
|
|
|
if not gajim.single_click:
|
|
|
|
|
self.on_row_activated(widget, path)
|
|
|
|
|
|
2005-06-12 17:14:07 +02:00
|
|
|
|
def on_roster_treeview_row_expanded(self, widget, iter, path):
|
|
|
|
|
'''When a row is expanded change the icon of the arrow'''
|
|
|
|
|
model = self.tree.get_model()
|
2006-11-18 21:52:28 +01:00
|
|
|
|
if self.regroup: # merged accounts
|
2005-06-21 00:51:42 +02:00
|
|
|
|
accounts = gajim.connections.keys()
|
|
|
|
|
else:
|
2005-09-09 00:07:49 +02:00
|
|
|
|
accounts = [model[iter][C_ACCOUNT].decode('utf-8')]
|
2007-01-02 18:43:32 +01:00
|
|
|
|
type_ = model[iter][C_TYPE]
|
|
|
|
|
if type_ == 'group':
|
2005-12-12 16:13:31 +01:00
|
|
|
|
model.set_value(iter, 0, self.jabber_state_images['16']['opened'])
|
2005-09-09 00:07:49 +02:00
|
|
|
|
jid = model[iter][C_JID].decode('utf-8')
|
2005-06-21 00:51:42 +02:00
|
|
|
|
for account in accounts:
|
2005-07-18 23:08:31 +02:00
|
|
|
|
if gajim.groups[account].has_key(jid): # This account has this group
|
|
|
|
|
gajim.groups[account][jid]['expand'] = True
|
2005-06-21 00:51:42 +02:00
|
|
|
|
if account + jid in self.collapsed_rows:
|
|
|
|
|
self.collapsed_rows.remove(account + jid)
|
2007-01-02 18:43:32 +01:00
|
|
|
|
elif type_ == 'account':
|
2005-06-21 00:51:42 +02:00
|
|
|
|
account = accounts[0] # There is only one cause we don't use merge
|
2005-06-12 17:14:07 +02:00
|
|
|
|
if account in self.collapsed_rows:
|
|
|
|
|
self.collapsed_rows.remove(account)
|
2005-07-18 23:08:31 +02:00
|
|
|
|
for g in gajim.groups[account]:
|
2005-06-12 17:14:07 +02:00
|
|
|
|
groupIter = self.get_group_iter(g, account)
|
2005-07-18 23:08:31 +02:00
|
|
|
|
if groupIter and gajim.groups[account][g]['expand']:
|
2005-06-12 17:14:07 +02:00
|
|
|
|
pathG = model.get_path(groupIter)
|
|
|
|
|
self.tree.expand_row(pathG, False)
|
2006-09-13 18:47:58 +02:00
|
|
|
|
self.draw_account(account)
|
2007-01-02 18:43:32 +01:00
|
|
|
|
elif type_ == 'contact':
|
2006-01-26 12:23:15 +01:00
|
|
|
|
jid = model[iter][C_JID].decode('utf-8')
|
|
|
|
|
account = model[iter][C_ACCOUNT].decode('utf-8')
|
|
|
|
|
self.draw_contact(jid, account)
|
2005-07-18 23:08:31 +02:00
|
|
|
|
|
2005-06-12 17:14:07 +02:00
|
|
|
|
def on_roster_treeview_row_collapsed(self, widget, iter, path):
|
|
|
|
|
'''When a row is collapsed :
|
|
|
|
|
change the icon of the arrow'''
|
|
|
|
|
model = self.tree.get_model()
|
2006-11-18 21:52:28 +01:00
|
|
|
|
if self.regroup: # merged accounts
|
2005-06-21 00:51:42 +02:00
|
|
|
|
accounts = gajim.connections.keys()
|
|
|
|
|
else:
|
2005-09-09 00:07:49 +02:00
|
|
|
|
accounts = [model[iter][C_ACCOUNT].decode('utf-8')]
|
2007-01-02 18:43:32 +01:00
|
|
|
|
type_ = model[iter][C_TYPE]
|
|
|
|
|
if type_ == 'group':
|
2005-12-12 16:13:31 +01:00
|
|
|
|
model.set_value(iter, 0, self.jabber_state_images['16']['closed'])
|
2005-09-09 00:07:49 +02:00
|
|
|
|
jid = model[iter][C_JID].decode('utf-8')
|
2005-06-21 00:51:42 +02:00
|
|
|
|
for account in accounts:
|
2005-07-18 23:08:31 +02:00
|
|
|
|
if gajim.groups[account].has_key(jid): # This account has this group
|
|
|
|
|
gajim.groups[account][jid]['expand'] = False
|
2005-06-21 00:51:42 +02:00
|
|
|
|
if not account + jid in self.collapsed_rows:
|
|
|
|
|
self.collapsed_rows.append(account + jid)
|
2007-01-02 18:43:32 +01:00
|
|
|
|
elif type_ == 'account':
|
2005-06-21 00:51:42 +02:00
|
|
|
|
account = accounts[0] # There is only one cause we don't use merge
|
2005-06-12 17:14:07 +02:00
|
|
|
|
if not account in self.collapsed_rows:
|
|
|
|
|
self.collapsed_rows.append(account)
|
2006-09-13 18:47:58 +02:00
|
|
|
|
self.draw_account(account)
|
2007-01-02 18:43:32 +01:00
|
|
|
|
elif type_ == 'contact':
|
2006-01-26 12:23:15 +01:00
|
|
|
|
jid = model[iter][C_JID].decode('utf-8')
|
|
|
|
|
account = model[iter][C_ACCOUNT].decode('utf-8')
|
|
|
|
|
self.draw_contact(jid, account)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
|
|
|
|
def on_service_disco_menuitem_activate(self, widget, account):
|
2005-10-30 10:58:13 +01:00
|
|
|
|
server_jid = gajim.config.get_per('accounts', account, 'hostname')
|
2005-11-13 16:08:47 +01:00
|
|
|
|
if gajim.interface.instances[account]['disco'].has_key(server_jid):
|
2006-02-03 12:20:55 +01:00
|
|
|
|
gajim.interface.instances[account]['disco'][server_jid].\
|
|
|
|
|
window.present()
|
2005-06-12 17:14:07 +02:00
|
|
|
|
else:
|
|
|
|
|
try:
|
2005-10-30 10:58:13 +01:00
|
|
|
|
# Object will add itself to the window dict
|
2005-12-12 16:13:31 +01:00
|
|
|
|
disco.ServiceDiscoveryWindow(account, address_entry = True)
|
2006-11-18 21:52:28 +01:00
|
|
|
|
except GajimGeneralException:
|
2005-06-12 17:14:07 +02:00
|
|
|
|
pass
|
|
|
|
|
|
2006-02-26 16:08:59 +01:00
|
|
|
|
def load_iconset(self, path, pixbuf2 = None, transport = False):
|
2006-11-18 21:52:28 +01:00
|
|
|
|
'''load full iconset from the given path, and add
|
|
|
|
|
pixbuf2 on top left of each static images'''
|
2005-12-12 16:13:31 +01:00
|
|
|
|
path += '/'
|
2006-02-26 16:08:59 +01:00
|
|
|
|
if transport:
|
2006-02-27 01:07:42 +01:00
|
|
|
|
list = ('online', 'chat', 'away', 'xa', 'dnd', 'offline',
|
|
|
|
|
'not in roster')
|
2006-02-26 16:08:59 +01:00
|
|
|
|
else:
|
2006-01-30 23:52:34 +01:00
|
|
|
|
list = ('connecting', 'online', 'chat', 'away', 'xa', 'dnd',
|
2006-02-26 16:08:59 +01:00
|
|
|
|
'invisible', 'offline', 'error', 'requested', 'message', 'opened',
|
|
|
|
|
'closed', 'not in roster', 'muc_active', 'muc_inactive')
|
|
|
|
|
if pixbuf2:
|
|
|
|
|
list = ('connecting', 'online', 'chat', 'away', 'xa', 'dnd',
|
2006-02-27 01:07:42 +01:00
|
|
|
|
'offline', 'error', 'requested', 'message', 'not in roster')
|
2006-11-18 21:52:28 +01:00
|
|
|
|
return self._load_icon_list(list, path, pixbuf2)
|
|
|
|
|
|
|
|
|
|
def load_icon(self, icon_name):
|
|
|
|
|
'''load an icon from the iconset in 16x16'''
|
|
|
|
|
iconset = gajim.config.get('iconset')
|
|
|
|
|
path = os.path.join(gajim.DATA_DIR, 'iconsets', iconset, '16x16'+ '/')
|
|
|
|
|
icon_list = self._load_icon_list([icon_name], path)
|
|
|
|
|
return icon_list[icon_name]
|
|
|
|
|
|
|
|
|
|
def _load_icon_list(self, icons_list, path, pixbuf2 = None):
|
|
|
|
|
'''load icons in icons_list from the given path,
|
|
|
|
|
and add pixbuf2 on top left of each static images'''
|
|
|
|
|
imgs = {}
|
|
|
|
|
for icon in icons_list:
|
2005-06-12 17:14:07 +02:00
|
|
|
|
# try to open a pixfile with the correct method
|
2006-11-18 21:52:28 +01:00
|
|
|
|
icon_file = icon.replace(' ', '_')
|
2005-06-12 17:14:07 +02:00
|
|
|
|
files = []
|
2006-11-18 21:52:28 +01:00
|
|
|
|
files.append(path + icon_file + '.gif')
|
|
|
|
|
files.append(path + icon_file + '.png')
|
2005-06-12 17:14:07 +02:00
|
|
|
|
image = gtk.Image()
|
|
|
|
|
image.show()
|
2006-11-18 21:52:28 +01:00
|
|
|
|
imgs[icon] = image
|
2005-08-16 22:24:56 +02:00
|
|
|
|
for file in files: # loop seeking for either gif or png
|
2005-06-12 17:14:07 +02:00
|
|
|
|
if os.path.exists(file):
|
|
|
|
|
image.set_from_file(file)
|
2006-01-30 23:52:34 +01:00
|
|
|
|
if pixbuf2 and image.get_storage_type() == gtk.IMAGE_PIXBUF:
|
2006-02-26 15:33:15 +01:00
|
|
|
|
# add pixbuf2 on top-left corner of image
|
|
|
|
|
pixbuf1 = image.get_pixbuf()
|
2006-02-26 15:40:49 +01:00
|
|
|
|
pixbuf2.composite(pixbuf1, 0, 0,
|
|
|
|
|
pixbuf2.get_property('width'),
|
2006-01-31 11:53:24 +01:00
|
|
|
|
pixbuf2.get_property('height'), 0, 0, 1.0, 1.0,
|
2007-04-19 16:44:11 +02:00
|
|
|
|
gtk.gdk.INTERP_NEAREST, 255)
|
2006-02-26 15:33:15 +01:00
|
|
|
|
image.set_from_pixbuf(pixbuf1)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
break
|
|
|
|
|
return imgs
|
|
|
|
|
|
|
|
|
|
def make_jabber_state_images(self):
|
|
|
|
|
'''initialise jabber_state_images dict'''
|
|
|
|
|
iconset = gajim.config.get('iconset')
|
2006-11-18 21:52:28 +01:00
|
|
|
|
if iconset:
|
|
|
|
|
path = os.path.join(gajim.DATA_DIR, 'iconsets', iconset, '16x16')
|
|
|
|
|
if not os.path.exists(path):
|
|
|
|
|
iconset = gajim.config.DEFAULT_ICONSET
|
|
|
|
|
else:
|
|
|
|
|
iconset = gajim.config.DEFAULT_ICONSET
|
|
|
|
|
|
2005-12-12 16:13:31 +01:00
|
|
|
|
path = os.path.join(gajim.DATA_DIR, 'iconsets', iconset, '32x32')
|
2005-12-14 19:10:55 +01:00
|
|
|
|
self.jabber_state_images['32'] = self.load_iconset(path)
|
2005-12-12 16:13:31 +01:00
|
|
|
|
|
|
|
|
|
path = os.path.join(gajim.DATA_DIR, 'iconsets', iconset, '16x16')
|
|
|
|
|
self.jabber_state_images['16'] = self.load_iconset(path)
|
2006-02-01 00:00:51 +01:00
|
|
|
|
pixo = gtk.gdk.pixbuf_new_from_file(os.path.join(path, 'opened.png'))
|
|
|
|
|
self.jabber_state_images['opened'] = self.load_iconset(path, pixo)
|
|
|
|
|
pixc = gtk.gdk.pixbuf_new_from_file(os.path.join(path, 'closed.png'))
|
|
|
|
|
self.jabber_state_images['closed'] = self.load_iconset(path, pixc)
|
|
|
|
|
|
2006-04-20 19:27:55 +02:00
|
|
|
|
if gajim.config.get('use_transports_iconsets'):
|
|
|
|
|
# update opened and closed transport iconsets
|
|
|
|
|
# standard transport iconsets are loaded one time in init()
|
|
|
|
|
t_path = os.path.join(gajim.DATA_DIR, 'iconsets', 'transports')
|
|
|
|
|
folders = os.listdir(t_path)
|
|
|
|
|
for transport in folders:
|
|
|
|
|
if transport == '.svn':
|
|
|
|
|
continue
|
|
|
|
|
folder = os.path.join(t_path, transport, '16x16')
|
|
|
|
|
self.transports_state_images['opened'][transport] = \
|
|
|
|
|
self.load_iconset(folder, pixo, transport = True)
|
|
|
|
|
self.transports_state_images['closed'][transport] = \
|
|
|
|
|
self.load_iconset(folder, pixc, transport = True)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
|
|
|
|
def reload_jabber_state_images(self):
|
|
|
|
|
self.make_jabber_state_images()
|
|
|
|
|
# Update the roster
|
|
|
|
|
self.draw_roster()
|
|
|
|
|
# Update the status combobox
|
|
|
|
|
model = self.status_combobox.get_model()
|
|
|
|
|
iter = model.get_iter_root()
|
|
|
|
|
while iter:
|
2005-10-10 23:45:59 +02:00
|
|
|
|
if model[iter][2] != '':
|
|
|
|
|
# If it's not change status message iter
|
|
|
|
|
# eg. if it has show parameter not ''
|
2005-12-12 16:13:31 +01:00
|
|
|
|
model[iter][1] = self.jabber_state_images['16'][model[iter][2]]
|
2005-06-12 17:14:07 +02:00
|
|
|
|
iter = model.iter_next(iter)
|
|
|
|
|
# Update the systray
|
2006-11-18 21:52:28 +01:00
|
|
|
|
if gajim.interface.systray_enabled:
|
|
|
|
|
gajim.interface.systray.set_img()
|
2005-12-31 22:55:44 +01:00
|
|
|
|
|
2006-01-06 02:48:59 +01:00
|
|
|
|
for win in gajim.interface.msg_win_mgr.windows():
|
2006-05-09 15:03:52 +02:00
|
|
|
|
for ctrl in win.controls():
|
2006-01-25 06:39:07 +01:00
|
|
|
|
ctrl.update_ui()
|
|
|
|
|
win.redraw_tab(ctrl)
|
2005-12-31 22:55:44 +01:00
|
|
|
|
|
2005-11-09 08:00:46 +01:00
|
|
|
|
self.update_status_combobox()
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
|
|
|
|
def repaint_themed_widgets(self):
|
2005-11-07 11:50:40 +01:00
|
|
|
|
'''Notify windows that contain themed widgets to repaint them'''
|
2005-12-31 22:55:44 +01:00
|
|
|
|
for win in gajim.interface.msg_win_mgr.windows():
|
2005-12-31 01:50:33 +01:00
|
|
|
|
win.repaint_themed_widgets()
|
2005-06-12 17:14:07 +02:00
|
|
|
|
for account in gajim.connections:
|
2005-11-13 16:08:47 +01:00
|
|
|
|
for addr in gajim.interface.instances[account]['disco']:
|
|
|
|
|
gajim.interface.instances[account]['disco'][addr].paint_banner()
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
|
|
|
|
def on_show_offline_contacts_menuitem_activate(self, widget):
|
|
|
|
|
'''when show offline option is changed:
|
|
|
|
|
redraw the treeview'''
|
2005-07-07 17:41:03 +02:00
|
|
|
|
gajim.config.set('showoffline', not gajim.config.get('showoffline'))
|
2005-06-12 17:14:07 +02:00
|
|
|
|
self.draw_roster()
|
2006-04-11 22:02:40 +02:00
|
|
|
|
|
2006-04-11 23:04:38 +02:00
|
|
|
|
def set_renderer_color(self, renderer, style, set_background = True):
|
2006-04-11 22:02:40 +02:00
|
|
|
|
'''set style for treeview cell, using PRELIGHT system color'''
|
|
|
|
|
if set_background:
|
2006-04-11 23:04:38 +02:00
|
|
|
|
bgcolor = self.tree.style.bg[style]
|
2006-04-11 22:02:40 +02:00
|
|
|
|
renderer.set_property('cell-background-gdk', bgcolor)
|
|
|
|
|
else:
|
2006-04-11 23:04:38 +02:00
|
|
|
|
fgcolor = self.tree.style.fg[style]
|
2006-04-11 22:02:40 +02:00
|
|
|
|
renderer.set_property('foreground-gdk', fgcolor)
|
|
|
|
|
|
2005-06-12 17:14:07 +02:00
|
|
|
|
def iconCellDataFunc(self, column, renderer, model, iter, data = None):
|
|
|
|
|
'''When a row is added, set properties for icon renderer'''
|
2005-06-14 00:11:09 +02:00
|
|
|
|
theme = gajim.config.get('roster_theme')
|
2006-11-18 21:52:28 +01:00
|
|
|
|
type_ = model[iter][C_TYPE]
|
|
|
|
|
if type_ == 'account':
|
2005-09-16 23:30:30 +02:00
|
|
|
|
color = gajim.config.get_per('themes', theme, 'accountbgcolor')
|
|
|
|
|
if color:
|
|
|
|
|
renderer.set_property('cell-background', color)
|
2005-09-19 17:23:18 +02:00
|
|
|
|
else:
|
2006-04-11 23:04:38 +02:00
|
|
|
|
self.set_renderer_color(renderer, gtk.STATE_ACTIVE)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
renderer.set_property('xalign', 0)
|
2006-11-18 21:52:28 +01:00
|
|
|
|
elif type_ == 'group':
|
2005-09-16 23:30:30 +02:00
|
|
|
|
color = gajim.config.get_per('themes', theme, 'groupbgcolor')
|
|
|
|
|
if color:
|
|
|
|
|
renderer.set_property('cell-background', color)
|
2005-09-19 17:23:18 +02:00
|
|
|
|
else:
|
2006-04-11 23:04:38 +02:00
|
|
|
|
self.set_renderer_color(renderer, gtk.STATE_PRELIGHT)
|
2006-01-26 12:23:15 +01:00
|
|
|
|
renderer.set_property('xalign', 0.2)
|
2006-11-18 21:52:28 +01:00
|
|
|
|
elif type_: # prevent type_ = None, see http://trac.gajim.org/ticket/2534
|
|
|
|
|
if not model[iter][C_JID] or not model[iter][C_ACCOUNT]:
|
|
|
|
|
# This can append when at the moment we add the row
|
|
|
|
|
return
|
2005-09-09 00:07:49 +02:00
|
|
|
|
jid = model[iter][C_JID].decode('utf-8')
|
|
|
|
|
account = model[iter][C_ACCOUNT].decode('utf-8')
|
2005-07-18 23:08:31 +02:00
|
|
|
|
if jid in gajim.newly_added[account]:
|
2006-11-20 09:03:05 +01:00
|
|
|
|
renderer.set_property('cell-background', gajim.config.get(
|
|
|
|
|
'just_connected_bg_color'))
|
2005-07-18 23:08:31 +02:00
|
|
|
|
elif jid in gajim.to_be_removed[account]:
|
2006-11-20 09:03:05 +01:00
|
|
|
|
renderer.set_property('cell-background', gajim.config.get(
|
|
|
|
|
'just_disconnected_bg_color'))
|
2005-06-12 17:14:07 +02:00
|
|
|
|
else:
|
2005-09-16 23:30:30 +02:00
|
|
|
|
color = gajim.config.get_per('themes', theme, 'contactbgcolor')
|
|
|
|
|
if color:
|
|
|
|
|
renderer.set_property('cell-background', color)
|
2005-09-19 17:23:18 +02:00
|
|
|
|
else:
|
|
|
|
|
renderer.set_property('cell-background', None)
|
2006-01-26 12:23:15 +01:00
|
|
|
|
parent_iter = model.iter_parent(iter)
|
|
|
|
|
if model[parent_iter][C_TYPE] == 'contact':
|
|
|
|
|
renderer.set_property('xalign', 1)
|
|
|
|
|
else:
|
|
|
|
|
renderer.set_property('xalign', 0.4)
|
|
|
|
|
renderer.set_property('width', 26)
|
2005-12-06 18:43:21 +01:00
|
|
|
|
|
2005-06-12 17:14:07 +02:00
|
|
|
|
def nameCellDataFunc(self, column, renderer, model, iter, data = None):
|
|
|
|
|
'''When a row is added, set properties for name renderer'''
|
2005-06-14 00:11:09 +02:00
|
|
|
|
theme = gajim.config.get('roster_theme')
|
2006-11-18 21:52:28 +01:00
|
|
|
|
type_ = model[iter][C_TYPE]
|
|
|
|
|
if type_ == 'account':
|
2005-09-16 23:30:30 +02:00
|
|
|
|
color = gajim.config.get_per('themes', theme, 'accounttextcolor')
|
|
|
|
|
if color:
|
|
|
|
|
renderer.set_property('foreground', color)
|
2005-09-19 17:23:18 +02:00
|
|
|
|
else:
|
2006-04-11 23:04:38 +02:00
|
|
|
|
self.set_renderer_color(renderer, gtk.STATE_ACTIVE, False)
|
2005-09-16 23:30:30 +02:00
|
|
|
|
color = gajim.config.get_per('themes', theme, 'accountbgcolor')
|
|
|
|
|
if color:
|
|
|
|
|
renderer.set_property('cell-background', color)
|
2005-09-19 17:23:18 +02:00
|
|
|
|
else:
|
2006-04-11 23:04:38 +02:00
|
|
|
|
self.set_renderer_color(renderer, gtk.STATE_ACTIVE)
|
2005-12-06 18:43:21 +01:00
|
|
|
|
renderer.set_property('font',
|
2005-09-17 10:34:55 +02:00
|
|
|
|
gtkgui_helpers.get_theme_font_for_option(theme, 'accountfont'))
|
2005-06-12 17:14:07 +02:00
|
|
|
|
renderer.set_property('xpad', 0)
|
2005-06-29 17:10:10 +02:00
|
|
|
|
renderer.set_property('width', 3)
|
2006-11-18 21:52:28 +01:00
|
|
|
|
elif type_ == 'group':
|
2005-09-16 23:30:30 +02:00
|
|
|
|
color = gajim.config.get_per('themes', theme, 'grouptextcolor')
|
|
|
|
|
if color:
|
|
|
|
|
renderer.set_property('foreground', color)
|
2005-09-19 17:23:18 +02:00
|
|
|
|
else:
|
2006-04-11 23:04:38 +02:00
|
|
|
|
self.set_renderer_color(renderer, gtk.STATE_PRELIGHT, False)
|
2005-09-16 23:30:30 +02:00
|
|
|
|
color = gajim.config.get_per('themes', theme, 'groupbgcolor')
|
|
|
|
|
if color:
|
|
|
|
|
renderer.set_property('cell-background', color)
|
2005-09-19 17:23:18 +02:00
|
|
|
|
else:
|
2006-04-11 23:04:38 +02:00
|
|
|
|
self.set_renderer_color(renderer, gtk.STATE_PRELIGHT)
|
2005-06-14 00:11:09 +02:00
|
|
|
|
renderer.set_property('font',
|
2005-09-17 10:34:55 +02:00
|
|
|
|
gtkgui_helpers.get_theme_font_for_option(theme, 'groupfont'))
|
2005-06-12 17:14:07 +02:00
|
|
|
|
renderer.set_property('xpad', 4)
|
2006-11-18 21:52:28 +01:00
|
|
|
|
elif type_: # prevent type_ = None, see http://trac.gajim.org/ticket/2534
|
|
|
|
|
if not model[iter][C_JID] or not model[iter][C_ACCOUNT]:
|
|
|
|
|
# This can append when at the moment we add the row
|
|
|
|
|
return
|
2005-09-09 00:07:49 +02:00
|
|
|
|
jid = model[iter][C_JID].decode('utf-8')
|
|
|
|
|
account = model[iter][C_ACCOUNT].decode('utf-8')
|
2005-09-16 23:30:30 +02:00
|
|
|
|
color = gajim.config.get_per('themes', theme, 'contacttextcolor')
|
|
|
|
|
if color:
|
|
|
|
|
renderer.set_property('foreground', color)
|
2005-09-19 17:23:18 +02:00
|
|
|
|
else:
|
|
|
|
|
renderer.set_property('foreground', None)
|
2005-07-18 23:08:31 +02:00
|
|
|
|
if jid in gajim.newly_added[account]:
|
2006-11-20 09:03:05 +01:00
|
|
|
|
renderer.set_property('cell-background', gajim.config.get(
|
|
|
|
|
'just_connected_bg_color'))
|
2005-07-18 23:08:31 +02:00
|
|
|
|
elif jid in gajim.to_be_removed[account]:
|
2006-11-20 09:03:05 +01:00
|
|
|
|
renderer.set_property('cell-background', gajim.config.get(
|
|
|
|
|
'just_disconnected_bg_color'))
|
2005-06-12 17:14:07 +02:00
|
|
|
|
else:
|
2005-09-16 23:30:30 +02:00
|
|
|
|
color = gajim.config.get_per('themes', theme, 'contactbgcolor')
|
|
|
|
|
if color:
|
|
|
|
|
renderer.set_property('cell-background', color)
|
2005-09-19 17:23:18 +02:00
|
|
|
|
else:
|
|
|
|
|
renderer.set_property('cell-background', None)
|
2005-06-14 00:11:09 +02:00
|
|
|
|
renderer.set_property('font',
|
2005-09-17 10:34:55 +02:00
|
|
|
|
gtkgui_helpers.get_theme_font_for_option(theme, 'contactfont'))
|
2006-01-26 12:23:15 +01:00
|
|
|
|
parent_iter = model.iter_parent(iter)
|
|
|
|
|
if model[parent_iter][C_TYPE] == 'contact':
|
|
|
|
|
renderer.set_property('xpad', 16)
|
|
|
|
|
else:
|
|
|
|
|
renderer.set_property('xpad', 8)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
2006-11-20 08:53:58 +01:00
|
|
|
|
def fill_secondary_pixbuf_rederer(self, column, renderer, model, iter,
|
|
|
|
|
data = None):
|
|
|
|
|
'''When a row is added, set properties for secondary renderer (avatar or
|
|
|
|
|
padlock)'''
|
2005-06-29 14:57:46 +02:00
|
|
|
|
theme = gajim.config.get('roster_theme')
|
2006-11-18 21:52:28 +01:00
|
|
|
|
type_ = model[iter][C_TYPE]
|
|
|
|
|
if type_ == 'account':
|
2005-09-16 23:30:30 +02:00
|
|
|
|
color = gajim.config.get_per('themes', theme, 'accountbgcolor')
|
|
|
|
|
if color:
|
|
|
|
|
renderer.set_property('cell-background', color)
|
2005-09-19 17:23:18 +02:00
|
|
|
|
else:
|
2006-04-11 23:04:38 +02:00
|
|
|
|
self.set_renderer_color(renderer, gtk.STATE_ACTIVE)
|
2006-11-18 21:52:28 +01:00
|
|
|
|
elif type_ == 'group':
|
2005-09-16 23:30:30 +02:00
|
|
|
|
color = gajim.config.get_per('themes', theme, 'groupbgcolor')
|
|
|
|
|
if color:
|
|
|
|
|
renderer.set_property('cell-background', color)
|
2005-09-19 17:23:18 +02:00
|
|
|
|
else:
|
2006-04-11 23:04:38 +02:00
|
|
|
|
self.set_renderer_color(renderer, gtk.STATE_PRELIGHT)
|
2006-11-18 21:52:28 +01:00
|
|
|
|
elif type_: # prevent type_ = None, see http://trac.gajim.org/ticket/2534
|
|
|
|
|
if not model[iter][C_JID] or not model[iter][C_ACCOUNT]:
|
|
|
|
|
# This can append when at the moment we add the row
|
|
|
|
|
return
|
2005-09-09 00:07:49 +02:00
|
|
|
|
jid = model[iter][C_JID].decode('utf-8')
|
|
|
|
|
account = model[iter][C_ACCOUNT].decode('utf-8')
|
2005-07-18 23:08:31 +02:00
|
|
|
|
if jid in gajim.newly_added[account]:
|
2006-11-20 09:03:05 +01:00
|
|
|
|
renderer.set_property('cell-background', gajim.config.get(
|
|
|
|
|
'just_connected_bg_color'))
|
2005-07-18 23:08:31 +02:00
|
|
|
|
elif jid in gajim.to_be_removed[account]:
|
2006-11-20 09:03:05 +01:00
|
|
|
|
renderer.set_property('cell-background', gajim.config.get(
|
|
|
|
|
'just_disconnected_bg_color'))
|
2005-06-29 14:57:46 +02:00
|
|
|
|
else:
|
2005-09-16 23:30:30 +02:00
|
|
|
|
color = gajim.config.get_per('themes', theme, 'contactbgcolor')
|
|
|
|
|
if color:
|
|
|
|
|
renderer.set_property('cell-background', color)
|
2005-09-19 17:23:18 +02:00
|
|
|
|
else:
|
|
|
|
|
renderer.set_property('cell-background', None)
|
2005-11-08 15:25:23 +01:00
|
|
|
|
renderer.set_property('xalign', 1) # align pixbuf to the right
|
2005-06-29 14:57:46 +02:00
|
|
|
|
|
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
|
|
|
|
def get_show(self, lcontact):
|
|
|
|
|
prio = lcontact[0].priority
|
|
|
|
|
show = lcontact[0].show
|
|
|
|
|
for u in lcontact:
|
2005-06-12 17:14:07 +02:00
|
|
|
|
if u.priority > prio:
|
|
|
|
|
prio = u.priority
|
|
|
|
|
show = u.show
|
|
|
|
|
return show
|
|
|
|
|
|
|
|
|
|
def compareIters(self, model, iter1, iter2, data = None):
|
|
|
|
|
'''Compare two iters to sort them'''
|
2005-11-18 12:51:12 +01:00
|
|
|
|
name1 = model[iter1][C_NAME]
|
|
|
|
|
name2 = model[iter2][C_NAME]
|
2005-06-12 17:14:07 +02:00
|
|
|
|
if not name1 or not name2:
|
|
|
|
|
return 0
|
2005-12-13 14:27:04 +01:00
|
|
|
|
name1 = name1.decode('utf-8')
|
|
|
|
|
name2 = name2.decode('utf-8')
|
2005-11-18 12:51:12 +01:00
|
|
|
|
type1 = model[iter1][C_TYPE]
|
|
|
|
|
type2 = model[iter2][C_TYPE]
|
2006-07-19 13:01:09 +02:00
|
|
|
|
if type1 == 'self_contact':
|
|
|
|
|
return -1
|
|
|
|
|
if type2 == 'self_contact':
|
|
|
|
|
return 1
|
2005-06-12 17:14:07 +02:00
|
|
|
|
if type1 == 'group':
|
2006-11-20 23:02:08 +01:00
|
|
|
|
name1 = model[iter1][C_JID]
|
|
|
|
|
name2 = model[iter2][C_JID]
|
2005-07-07 19:25:04 +02:00
|
|
|
|
if name1 == _('Transports'):
|
2005-06-12 17:14:07 +02:00
|
|
|
|
return 1
|
2005-07-07 19:25:04 +02:00
|
|
|
|
if name2 == _('Transports'):
|
2005-06-12 17:14:07 +02:00
|
|
|
|
return -1
|
2006-01-19 22:55:01 +01:00
|
|
|
|
if name1 == _('Not in Roster'):
|
2005-06-12 17:14:07 +02:00
|
|
|
|
return 1
|
2006-01-19 22:55:01 +01:00
|
|
|
|
if name2 == _('Not in Roster'):
|
2005-06-12 17:14:07 +02:00
|
|
|
|
return -1
|
2005-12-08 19:10:46 +01:00
|
|
|
|
account1 = model[iter1][C_ACCOUNT]
|
|
|
|
|
account2 = model[iter2][C_ACCOUNT]
|
2005-12-13 14:27:04 +01:00
|
|
|
|
if not account1 or not account2:
|
|
|
|
|
return 0
|
|
|
|
|
account1 = account1.decode('utf-8')
|
|
|
|
|
account2 = account2.decode('utf-8')
|
2006-09-13 18:47:58 +02:00
|
|
|
|
if type1 == 'account':
|
|
|
|
|
if account1 < account2:
|
|
|
|
|
return -1
|
|
|
|
|
return 1
|
2005-12-13 14:27:04 +01:00
|
|
|
|
jid1 = model[iter1][C_JID].decode('utf-8')
|
|
|
|
|
jid2 = model[iter2][C_JID].decode('utf-8')
|
|
|
|
|
if type1 == 'contact':
|
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
|
|
|
|
lcontact1 = gajim.contacts.get_contact(account1, jid1)
|
|
|
|
|
contact1 = gajim.contacts.get_first_contact_from_jid(account1, jid1)
|
|
|
|
|
if not contact1:
|
|
|
|
|
return 0
|
2006-01-10 19:30:57 +01:00
|
|
|
|
name1 = contact1.get_shown_name()
|
2005-12-13 14:27:04 +01:00
|
|
|
|
if type2 == 'contact':
|
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
|
|
|
|
lcontact2 = gajim.contacts.get_contact(account2, jid2)
|
|
|
|
|
contact2 = gajim.contacts.get_first_contact_from_jid(account2, jid2)
|
|
|
|
|
if not contact2:
|
|
|
|
|
return 0
|
2006-01-10 19:30:57 +01:00
|
|
|
|
name2 = contact2.get_shown_name()
|
2006-02-01 13:48:00 +01:00
|
|
|
|
# We first compare by show if sort_by_show is True or if it's a child
|
|
|
|
|
# contact
|
2005-07-07 18:38:36 +02:00
|
|
|
|
if type1 == 'contact' and type2 == 'contact' and \
|
2006-03-24 13:55:56 +01:00
|
|
|
|
gajim.config.get('sort_by_show'):
|
2005-12-13 14:27:04 +01:00
|
|
|
|
cshow = {'online':0, 'chat': 1, 'away': 2, 'xa': 3, 'dnd': 4,
|
2006-02-20 12:02:35 +01:00
|
|
|
|
'invisible': 5, 'offline': 6, 'not in roster': 7, 'error': 8}
|
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
|
|
|
|
s = self.get_show(lcontact1)
|
2005-12-13 14:27:04 +01:00
|
|
|
|
if s in cshow:
|
|
|
|
|
show1 = cshow[s]
|
|
|
|
|
else:
|
|
|
|
|
show1 = 9
|
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
|
|
|
|
s = self.get_show(lcontact2)
|
2005-12-13 14:27:04 +01:00
|
|
|
|
if s in cshow:
|
|
|
|
|
show2 = cshow[s]
|
|
|
|
|
else:
|
|
|
|
|
show2 = 9
|
|
|
|
|
if show1 < show2:
|
|
|
|
|
return -1
|
|
|
|
|
elif show1 > show2:
|
|
|
|
|
return 1
|
2007-03-09 20:17:19 +01:00
|
|
|
|
if show1 == 6 and show2 == 6:
|
|
|
|
|
# If both are offline, and one has a status message, it is above
|
|
|
|
|
if contact1.status and not contact2.status:
|
|
|
|
|
return -1
|
|
|
|
|
elif contact2.status and not contact1.status:
|
|
|
|
|
return 1
|
2005-12-08 19:10:46 +01:00
|
|
|
|
# We compare names
|
2005-06-12 17:14:07 +02:00
|
|
|
|
if name1.lower() < name2.lower():
|
|
|
|
|
return -1
|
2005-11-18 12:51:12 +01:00
|
|
|
|
if name2.lower() < name1.lower():
|
2005-06-12 17:14:07 +02:00
|
|
|
|
return 1
|
2005-12-13 14:27:04 +01:00
|
|
|
|
if type1 == 'contact' and type2 == 'contact':
|
2005-12-08 19:10:46 +01:00
|
|
|
|
# We compare account names
|
|
|
|
|
if account1.lower() < account2.lower():
|
|
|
|
|
return -1
|
|
|
|
|
if account2.lower() < account1.lower():
|
|
|
|
|
return 1
|
|
|
|
|
# We compare jids
|
|
|
|
|
if jid1.lower() < jid2.lower():
|
|
|
|
|
return -1
|
|
|
|
|
if jid2.lower() < jid1.lower():
|
|
|
|
|
return 1
|
2005-06-12 17:14:07 +02:00
|
|
|
|
return 0
|
|
|
|
|
|
|
|
|
|
def drag_data_get_data(self, treeview, context, selection, target_id, etime):
|
2006-09-13 18:47:58 +02:00
|
|
|
|
model, list_of_paths = self.tree.get_selection().get_selected_rows()
|
|
|
|
|
if len(list_of_paths) != 1:
|
|
|
|
|
return
|
|
|
|
|
path = list_of_paths[0]
|
2005-06-12 17:14:07 +02:00
|
|
|
|
data = ''
|
2006-01-27 00:20:27 +01:00
|
|
|
|
if len(path) >= 3:
|
2006-09-13 18:47:58 +02:00
|
|
|
|
data = model[path][C_JID]
|
2005-06-12 17:14:07 +02:00
|
|
|
|
selection.set(selection.target, 8, data)
|
|
|
|
|
|
2006-12-29 18:41:13 +01:00
|
|
|
|
def drag_begin(self, treeview, context):
|
2006-12-29 22:23:24 +01:00
|
|
|
|
self.dragging = True
|
2006-12-29 18:41:13 +01:00
|
|
|
|
|
|
|
|
|
def drag_end(self, treeview, context):
|
2006-12-29 22:23:24 +01:00
|
|
|
|
self.dragging = False
|
2006-12-29 18:41:13 +01:00
|
|
|
|
|
2006-07-17 21:30:53 +02:00
|
|
|
|
def on_drop_in_contact(self, widget, account_source, c_source, account_dest,
|
|
|
|
|
c_dest, was_big_brother, context, etime):
|
2006-11-18 21:52:28 +01:00
|
|
|
|
if not gajim.connections[account_source].metacontacts_supported or not \
|
|
|
|
|
gajim.connections[account_dest].metacontacts_supported:
|
2006-11-20 08:53:58 +01:00
|
|
|
|
dialogs.WarningDialog(_('Metacontacts storage not supported by your '
|
|
|
|
|
'server'),
|
|
|
|
|
_('Your server does not support storing metacontacts information. '
|
|
|
|
|
'So those information will not be save on next reconnection.'))
|
2006-11-18 21:52:28 +01:00
|
|
|
|
def merge_contacts(widget = None):
|
|
|
|
|
if widget: # dialog has been shown
|
|
|
|
|
dlg.destroy()
|
|
|
|
|
if dlg.is_checked(): # user does not want to be asked again
|
|
|
|
|
gajim.config.set('confirm_metacontacts', 'no')
|
|
|
|
|
else:
|
|
|
|
|
gajim.config.set('confirm_metacontacts', 'yes')
|
|
|
|
|
# children must take the new tag too, so remember old tag
|
|
|
|
|
old_tag = gajim.contacts.get_metacontacts_tag(account_source,
|
|
|
|
|
c_source.jid)
|
|
|
|
|
# remove the source row
|
|
|
|
|
self.remove_contact(c_source, account_source)
|
|
|
|
|
# brother inherite big brother groups
|
|
|
|
|
c_source.groups = []
|
|
|
|
|
for g in c_dest.groups:
|
|
|
|
|
c_source.groups.append(g)
|
|
|
|
|
gajim.connections[account_source].update_contact(c_source.jid,
|
|
|
|
|
c_source.name, c_source.groups)
|
|
|
|
|
gajim.contacts.add_metacontact(account_dest, c_dest.jid,
|
|
|
|
|
account_source, c_source.jid)
|
|
|
|
|
if was_big_brother:
|
|
|
|
|
# add brothers too
|
|
|
|
|
all_jid = gajim.contacts.get_metacontacts_jids(old_tag)
|
|
|
|
|
for _account in all_jid:
|
|
|
|
|
for _jid in all_jid[_account]:
|
|
|
|
|
gajim.contacts.add_metacontact(account_dest, c_dest.jid,
|
|
|
|
|
_account, _jid)
|
|
|
|
|
_c = gajim.contacts.get_first_contact_from_jid(_account, _jid)
|
|
|
|
|
self.remove_contact(_c, _account)
|
|
|
|
|
self.add_contact_to_roster(_jid, _account)
|
|
|
|
|
self.draw_contact(_jid, _account)
|
|
|
|
|
self.add_contact_to_roster(c_source.jid, account_source)
|
|
|
|
|
self.draw_contact(c_dest.jid, account_dest)
|
|
|
|
|
|
|
|
|
|
context.finish(True, True, etime)
|
|
|
|
|
|
|
|
|
|
confirm_metacontacts = gajim.config.get('confirm_metacontacts')
|
|
|
|
|
if confirm_metacontacts == 'no':
|
|
|
|
|
merge_contacts()
|
|
|
|
|
return
|
2006-11-20 08:53:58 +01:00
|
|
|
|
pritext = _('You are about to create a metacontact. Are you sure you want'
|
|
|
|
|
' to continue?')
|
|
|
|
|
sectext = _('Metacontacts are a way to regroup several contacts in one '
|
2007-01-02 13:17:51 +01:00
|
|
|
|
'line. Generally it is used when the same person has several Jabber '
|
2006-11-20 08:53:58 +01:00
|
|
|
|
'accounts or transport accounts.')
|
2006-11-18 21:52:28 +01:00
|
|
|
|
dlg = dialogs.ConfirmationDialogCheck(pritext, sectext,
|
|
|
|
|
_('Do _not ask me again'), on_response_ok = merge_contacts)
|
|
|
|
|
if not confirm_metacontacts: # First time we see this window
|
|
|
|
|
dlg.checkbutton.set_active(True)
|
2006-02-03 22:02:47 +01:00
|
|
|
|
|
|
|
|
|
def on_drop_in_group(self, widget, account, c_source, grp_dest, context,
|
|
|
|
|
etime, grp_source = None):
|
|
|
|
|
if grp_source:
|
|
|
|
|
self.remove_contact_from_group(account, c_source, grp_source)
|
2006-03-24 13:55:56 +01:00
|
|
|
|
# remove tag
|
|
|
|
|
gajim.contacts.remove_metacontact(account, c_source.jid)
|
2006-02-03 22:02:47 +01:00
|
|
|
|
self.add_contact_to_group(account, c_source, grp_dest)
|
|
|
|
|
if context.action in (gtk.gdk.ACTION_MOVE, gtk.gdk.ACTION_COPY):
|
|
|
|
|
context.finish(True, True, etime)
|
|
|
|
|
|
|
|
|
|
def add_contact_to_group(self, account, contact, group):
|
|
|
|
|
model = self.tree.get_model()
|
|
|
|
|
if not group in contact.groups:
|
|
|
|
|
contact.groups.append(group)
|
|
|
|
|
# Remove all rows because add_contact_to_roster doesn't add it if one
|
|
|
|
|
# is already in roster
|
|
|
|
|
for i in self.get_contact_iter(contact.jid, account):
|
|
|
|
|
model.remove(i)
|
|
|
|
|
self.add_contact_to_roster(contact.jid, account)
|
|
|
|
|
gajim.connections[account].update_contact(contact.jid, contact.name,
|
|
|
|
|
contact.groups)
|
|
|
|
|
|
|
|
|
|
def remove_contact_from_group(self, account, contact, group):
|
|
|
|
|
# Make sure contact was in the group
|
2006-03-29 20:15:18 +02:00
|
|
|
|
if group in contact.groups:
|
|
|
|
|
contact.groups.remove(group)
|
2006-03-24 13:55:56 +01:00
|
|
|
|
self.remove_contact(contact, account)
|
2006-02-03 22:02:47 +01:00
|
|
|
|
|
2005-06-12 17:14:07 +02:00
|
|
|
|
def drag_data_received_data(self, treeview, context, x, y, selection, info,
|
|
|
|
|
etime):
|
|
|
|
|
model = treeview.get_model()
|
2005-08-30 22:58:40 +02:00
|
|
|
|
if not selection.data:
|
2005-06-12 17:14:07 +02:00
|
|
|
|
return
|
2005-11-28 16:22:12 +01:00
|
|
|
|
data = selection.data
|
2005-06-12 17:14:07 +02:00
|
|
|
|
drop_info = treeview.get_dest_row_at_pos(x, y)
|
|
|
|
|
if not drop_info:
|
|
|
|
|
return
|
|
|
|
|
path_dest, position = drop_info
|
2005-11-09 08:00:46 +01:00
|
|
|
|
if position == gtk.TREE_VIEW_DROP_BEFORE and len(path_dest) == 2 \
|
2005-11-09 11:55:42 +01:00
|
|
|
|
and path_dest[1] == 0: # dropped before the first group
|
2005-06-12 17:14:07 +02:00
|
|
|
|
return
|
Merged revisions 5017-5020,5022-5029 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r5017 | asterix | 2006-01-06 01:55:51 -0700 (Fri, 06 Jan 2006) | 2 lines
use escape for pango markup
........
r5018 | asterix | 2006-01-06 02:21:39 -0700 (Fri, 06 Jan 2006) | 2 lines
missing new contacts function
........
r5019 | asterix | 2006-01-06 11:03:07 -0700 (Fri, 06 Jan 2006) | 2 lines
handle the click on toggle_gpg_encryption menuitem
........
r5020 | asterix | 2006-01-06 11:14:14 -0700 (Fri, 06 Jan 2006) | 2 lines
use the saved size even if a chat window is already opened
........
r5022 | asterix | 2006-01-07 03:43:47 -0700 (Sat, 07 Jan 2006) | 2 lines
we can now resume filetransfert
........
r5023 | asterix | 2006-01-07 03:56:31 -0700 (Sat, 07 Jan 2006) | 2 lines
[Knuckles] Google E-Mail Notification
........
r5024 | asterix | 2006-01-07 04:02:16 -0700 (Sat, 07 Jan 2006) | 2 lines
better string
........
r5025 | asterix | 2006-01-07 04:14:32 -0700 (Sat, 07 Jan 2006) | 2 lines
fix a TB
........
r5026 | asterix | 2006-01-07 05:36:55 -0700 (Sat, 07 Jan 2006) | 2 lines
we can now drag a file on a contact in the roster to send him a file
........
r5027 | asterix | 2006-01-07 06:26:28 -0700 (Sat, 07 Jan 2006) | 2 lines
contact.groups is always a list, even if emtpy
........
r5028 | asterix | 2006-01-07 06:54:30 -0700 (Sat, 07 Jan 2006) | 2 lines
make all buttons insensitive on a category row in disco
........
r5029 | asterix | 2006-01-07 07:19:25 -0700 (Sat, 07 Jan 2006) | 2 lines
auto open groupchat configuration window when we create a new room
........
2006-01-07 18:25:35 +01:00
|
|
|
|
iter_dest = model.get_iter(path_dest)
|
2006-01-27 00:20:27 +01:00
|
|
|
|
type_dest = model[iter_dest][C_TYPE].decode('utf-8')
|
|
|
|
|
jid_dest = model[iter_dest][C_JID].decode('utf-8')
|
2006-07-17 21:30:53 +02:00
|
|
|
|
account_dest = model[iter_dest][C_ACCOUNT].decode('utf-8')
|
2006-04-01 14:26:10 +02:00
|
|
|
|
|
2006-09-13 18:47:58 +02:00
|
|
|
|
if account_dest == 'all':
|
|
|
|
|
# drop on account row in merged mode: we can't know which account it is
|
|
|
|
|
return
|
|
|
|
|
|
2006-04-01 14:26:10 +02:00
|
|
|
|
# if account is not connected, do nothing
|
2006-07-17 21:30:53 +02:00
|
|
|
|
if gajim.connections[account_dest].connected < 2:
|
2006-04-01 14:26:10 +02:00
|
|
|
|
return
|
Merged revisions 5017-5020,5022-5029 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r5017 | asterix | 2006-01-06 01:55:51 -0700 (Fri, 06 Jan 2006) | 2 lines
use escape for pango markup
........
r5018 | asterix | 2006-01-06 02:21:39 -0700 (Fri, 06 Jan 2006) | 2 lines
missing new contacts function
........
r5019 | asterix | 2006-01-06 11:03:07 -0700 (Fri, 06 Jan 2006) | 2 lines
handle the click on toggle_gpg_encryption menuitem
........
r5020 | asterix | 2006-01-06 11:14:14 -0700 (Fri, 06 Jan 2006) | 2 lines
use the saved size even if a chat window is already opened
........
r5022 | asterix | 2006-01-07 03:43:47 -0700 (Sat, 07 Jan 2006) | 2 lines
we can now resume filetransfert
........
r5023 | asterix | 2006-01-07 03:56:31 -0700 (Sat, 07 Jan 2006) | 2 lines
[Knuckles] Google E-Mail Notification
........
r5024 | asterix | 2006-01-07 04:02:16 -0700 (Sat, 07 Jan 2006) | 2 lines
better string
........
r5025 | asterix | 2006-01-07 04:14:32 -0700 (Sat, 07 Jan 2006) | 2 lines
fix a TB
........
r5026 | asterix | 2006-01-07 05:36:55 -0700 (Sat, 07 Jan 2006) | 2 lines
we can now drag a file on a contact in the roster to send him a file
........
r5027 | asterix | 2006-01-07 06:26:28 -0700 (Sat, 07 Jan 2006) | 2 lines
contact.groups is always a list, even if emtpy
........
r5028 | asterix | 2006-01-07 06:54:30 -0700 (Sat, 07 Jan 2006) | 2 lines
make all buttons insensitive on a category row in disco
........
r5029 | asterix | 2006-01-07 07:19:25 -0700 (Sat, 07 Jan 2006) | 2 lines
auto open groupchat configuration window when we create a new room
........
2006-01-07 18:25:35 +01:00
|
|
|
|
|
2006-07-19 13:08:25 +02:00
|
|
|
|
# drop on self contact row
|
|
|
|
|
if type_dest == 'self_contact':
|
|
|
|
|
return
|
|
|
|
|
|
Merged revisions 5017-5020,5022-5029 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r5017 | asterix | 2006-01-06 01:55:51 -0700 (Fri, 06 Jan 2006) | 2 lines
use escape for pango markup
........
r5018 | asterix | 2006-01-06 02:21:39 -0700 (Fri, 06 Jan 2006) | 2 lines
missing new contacts function
........
r5019 | asterix | 2006-01-06 11:03:07 -0700 (Fri, 06 Jan 2006) | 2 lines
handle the click on toggle_gpg_encryption menuitem
........
r5020 | asterix | 2006-01-06 11:14:14 -0700 (Fri, 06 Jan 2006) | 2 lines
use the saved size even if a chat window is already opened
........
r5022 | asterix | 2006-01-07 03:43:47 -0700 (Sat, 07 Jan 2006) | 2 lines
we can now resume filetransfert
........
r5023 | asterix | 2006-01-07 03:56:31 -0700 (Sat, 07 Jan 2006) | 2 lines
[Knuckles] Google E-Mail Notification
........
r5024 | asterix | 2006-01-07 04:02:16 -0700 (Sat, 07 Jan 2006) | 2 lines
better string
........
r5025 | asterix | 2006-01-07 04:14:32 -0700 (Sat, 07 Jan 2006) | 2 lines
fix a TB
........
r5026 | asterix | 2006-01-07 05:36:55 -0700 (Sat, 07 Jan 2006) | 2 lines
we can now drag a file on a contact in the roster to send him a file
........
r5027 | asterix | 2006-01-07 06:26:28 -0700 (Sat, 07 Jan 2006) | 2 lines
contact.groups is always a list, even if emtpy
........
r5028 | asterix | 2006-01-07 06:54:30 -0700 (Sat, 07 Jan 2006) | 2 lines
make all buttons insensitive on a category row in disco
........
r5029 | asterix | 2006-01-07 07:19:25 -0700 (Sat, 07 Jan 2006) | 2 lines
auto open groupchat configuration window when we create a new room
........
2006-01-07 18:25:35 +01:00
|
|
|
|
if info == self.TARGET_TYPE_URI_LIST:
|
|
|
|
|
# User dropped a file on the roster
|
|
|
|
|
if len(path_dest) < 3:
|
|
|
|
|
return
|
|
|
|
|
if type_dest != 'contact':
|
|
|
|
|
return
|
2006-07-17 21:30:53 +02:00
|
|
|
|
c_dest = gajim.contacts.get_contact_with_highest_priority(account_dest,
|
2006-03-01 22:00:59 +01:00
|
|
|
|
jid_dest)
|
Merged revisions 5017-5020,5022-5029 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r5017 | asterix | 2006-01-06 01:55:51 -0700 (Fri, 06 Jan 2006) | 2 lines
use escape for pango markup
........
r5018 | asterix | 2006-01-06 02:21:39 -0700 (Fri, 06 Jan 2006) | 2 lines
missing new contacts function
........
r5019 | asterix | 2006-01-06 11:03:07 -0700 (Fri, 06 Jan 2006) | 2 lines
handle the click on toggle_gpg_encryption menuitem
........
r5020 | asterix | 2006-01-06 11:14:14 -0700 (Fri, 06 Jan 2006) | 2 lines
use the saved size even if a chat window is already opened
........
r5022 | asterix | 2006-01-07 03:43:47 -0700 (Sat, 07 Jan 2006) | 2 lines
we can now resume filetransfert
........
r5023 | asterix | 2006-01-07 03:56:31 -0700 (Sat, 07 Jan 2006) | 2 lines
[Knuckles] Google E-Mail Notification
........
r5024 | asterix | 2006-01-07 04:02:16 -0700 (Sat, 07 Jan 2006) | 2 lines
better string
........
r5025 | asterix | 2006-01-07 04:14:32 -0700 (Sat, 07 Jan 2006) | 2 lines
fix a TB
........
r5026 | asterix | 2006-01-07 05:36:55 -0700 (Sat, 07 Jan 2006) | 2 lines
we can now drag a file on a contact in the roster to send him a file
........
r5027 | asterix | 2006-01-07 06:26:28 -0700 (Sat, 07 Jan 2006) | 2 lines
contact.groups is always a list, even if emtpy
........
r5028 | asterix | 2006-01-07 06:54:30 -0700 (Sat, 07 Jan 2006) | 2 lines
make all buttons insensitive on a category row in disco
........
r5029 | asterix | 2006-01-07 07:19:25 -0700 (Sat, 07 Jan 2006) | 2 lines
auto open groupchat configuration window when we create a new room
........
2006-01-07 18:25:35 +01:00
|
|
|
|
uri = data.strip()
|
|
|
|
|
uri_splitted = uri.split() # we may have more than one file dropped
|
2007-03-17 11:14:31 +01:00
|
|
|
|
nb_uri = len(uri_splitted)
|
|
|
|
|
prim_text = 'Send file?'
|
|
|
|
|
sec_text = i18n.ngettext('Do you want to send that file to %s:',
|
|
|
|
|
'Do you want to send those files to %s:', nb_uri) %\
|
|
|
|
|
c_dest.get_shown_name()
|
Merged revisions 5017-5020,5022-5029 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r5017 | asterix | 2006-01-06 01:55:51 -0700 (Fri, 06 Jan 2006) | 2 lines
use escape for pango markup
........
r5018 | asterix | 2006-01-06 02:21:39 -0700 (Fri, 06 Jan 2006) | 2 lines
missing new contacts function
........
r5019 | asterix | 2006-01-06 11:03:07 -0700 (Fri, 06 Jan 2006) | 2 lines
handle the click on toggle_gpg_encryption menuitem
........
r5020 | asterix | 2006-01-06 11:14:14 -0700 (Fri, 06 Jan 2006) | 2 lines
use the saved size even if a chat window is already opened
........
r5022 | asterix | 2006-01-07 03:43:47 -0700 (Sat, 07 Jan 2006) | 2 lines
we can now resume filetransfert
........
r5023 | asterix | 2006-01-07 03:56:31 -0700 (Sat, 07 Jan 2006) | 2 lines
[Knuckles] Google E-Mail Notification
........
r5024 | asterix | 2006-01-07 04:02:16 -0700 (Sat, 07 Jan 2006) | 2 lines
better string
........
r5025 | asterix | 2006-01-07 04:14:32 -0700 (Sat, 07 Jan 2006) | 2 lines
fix a TB
........
r5026 | asterix | 2006-01-07 05:36:55 -0700 (Sat, 07 Jan 2006) | 2 lines
we can now drag a file on a contact in the roster to send him a file
........
r5027 | asterix | 2006-01-07 06:26:28 -0700 (Sat, 07 Jan 2006) | 2 lines
contact.groups is always a list, even if emtpy
........
r5028 | asterix | 2006-01-07 06:54:30 -0700 (Sat, 07 Jan 2006) | 2 lines
make all buttons insensitive on a category row in disco
........
r5029 | asterix | 2006-01-07 07:19:25 -0700 (Sat, 07 Jan 2006) | 2 lines
auto open groupchat configuration window when we create a new room
........
2006-01-07 18:25:35 +01:00
|
|
|
|
for uri in uri_splitted:
|
|
|
|
|
path = helpers.get_file_path_from_dnd_dropped_uri(uri)
|
2007-03-17 11:14:31 +01:00
|
|
|
|
sec_text += '\n' + os.path.basename(path)
|
2007-03-20 13:32:01 +01:00
|
|
|
|
def _on_send_files(widget, account, jid, uri):
|
|
|
|
|
dialog.destroy()
|
|
|
|
|
c = gajim.contacts.get_contact_with_highest_priority(account, jid)
|
|
|
|
|
uri_splitted = uri.split() # we may have more than one file dropped
|
|
|
|
|
for uri in uri_splitted:
|
|
|
|
|
path = helpers.get_file_path_from_dnd_dropped_uri(uri)
|
|
|
|
|
if os.path.isfile(path): # is it file?
|
|
|
|
|
gajim.interface.instances['file_transfers'].send_file(
|
|
|
|
|
account, c, path)
|
|
|
|
|
|
2007-03-17 11:14:31 +01:00
|
|
|
|
dialog = dialogs.NonModalConfirmationDialog(prim_text, sec_text,
|
2007-03-20 13:32:01 +01:00
|
|
|
|
on_response_ok = (_on_send_files, account_dest, jid_dest, uri))
|
2007-03-17 11:14:31 +01:00
|
|
|
|
dialog.popup()
|
Merged revisions 5017-5020,5022-5029 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r5017 | asterix | 2006-01-06 01:55:51 -0700 (Fri, 06 Jan 2006) | 2 lines
use escape for pango markup
........
r5018 | asterix | 2006-01-06 02:21:39 -0700 (Fri, 06 Jan 2006) | 2 lines
missing new contacts function
........
r5019 | asterix | 2006-01-06 11:03:07 -0700 (Fri, 06 Jan 2006) | 2 lines
handle the click on toggle_gpg_encryption menuitem
........
r5020 | asterix | 2006-01-06 11:14:14 -0700 (Fri, 06 Jan 2006) | 2 lines
use the saved size even if a chat window is already opened
........
r5022 | asterix | 2006-01-07 03:43:47 -0700 (Sat, 07 Jan 2006) | 2 lines
we can now resume filetransfert
........
r5023 | asterix | 2006-01-07 03:56:31 -0700 (Sat, 07 Jan 2006) | 2 lines
[Knuckles] Google E-Mail Notification
........
r5024 | asterix | 2006-01-07 04:02:16 -0700 (Sat, 07 Jan 2006) | 2 lines
better string
........
r5025 | asterix | 2006-01-07 04:14:32 -0700 (Sat, 07 Jan 2006) | 2 lines
fix a TB
........
r5026 | asterix | 2006-01-07 05:36:55 -0700 (Sat, 07 Jan 2006) | 2 lines
we can now drag a file on a contact in the roster to send him a file
........
r5027 | asterix | 2006-01-07 06:26:28 -0700 (Sat, 07 Jan 2006) | 2 lines
contact.groups is always a list, even if emtpy
........
r5028 | asterix | 2006-01-07 06:54:30 -0700 (Sat, 07 Jan 2006) | 2 lines
make all buttons insensitive on a category row in disco
........
r5029 | asterix | 2006-01-07 07:19:25 -0700 (Sat, 07 Jan 2006) | 2 lines
auto open groupchat configuration window when we create a new room
........
2006-01-07 18:25:35 +01:00
|
|
|
|
return
|
2006-03-24 13:55:56 +01:00
|
|
|
|
|
2006-11-18 21:52:28 +01:00
|
|
|
|
if gajim.config.get_per('accounts', account_dest, 'is_zeroconf'):
|
|
|
|
|
# drop on zeroconf account, no contact adds possible
|
|
|
|
|
return
|
|
|
|
|
|
2005-11-09 08:00:46 +01:00
|
|
|
|
if position == gtk.TREE_VIEW_DROP_BEFORE and len(path_dest) == 2:
|
2005-11-09 11:55:42 +01:00
|
|
|
|
# dropped before a group : we drop it in the previous group
|
Merged revisions 5017-5020,5022-5029 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r5017 | asterix | 2006-01-06 01:55:51 -0700 (Fri, 06 Jan 2006) | 2 lines
use escape for pango markup
........
r5018 | asterix | 2006-01-06 02:21:39 -0700 (Fri, 06 Jan 2006) | 2 lines
missing new contacts function
........
r5019 | asterix | 2006-01-06 11:03:07 -0700 (Fri, 06 Jan 2006) | 2 lines
handle the click on toggle_gpg_encryption menuitem
........
r5020 | asterix | 2006-01-06 11:14:14 -0700 (Fri, 06 Jan 2006) | 2 lines
use the saved size even if a chat window is already opened
........
r5022 | asterix | 2006-01-07 03:43:47 -0700 (Sat, 07 Jan 2006) | 2 lines
we can now resume filetransfert
........
r5023 | asterix | 2006-01-07 03:56:31 -0700 (Sat, 07 Jan 2006) | 2 lines
[Knuckles] Google E-Mail Notification
........
r5024 | asterix | 2006-01-07 04:02:16 -0700 (Sat, 07 Jan 2006) | 2 lines
better string
........
r5025 | asterix | 2006-01-07 04:14:32 -0700 (Sat, 07 Jan 2006) | 2 lines
fix a TB
........
r5026 | asterix | 2006-01-07 05:36:55 -0700 (Sat, 07 Jan 2006) | 2 lines
we can now drag a file on a contact in the roster to send him a file
........
r5027 | asterix | 2006-01-07 06:26:28 -0700 (Sat, 07 Jan 2006) | 2 lines
contact.groups is always a list, even if emtpy
........
r5028 | asterix | 2006-01-07 06:54:30 -0700 (Sat, 07 Jan 2006) | 2 lines
make all buttons insensitive on a category row in disco
........
r5029 | asterix | 2006-01-07 07:19:25 -0700 (Sat, 07 Jan 2006) | 2 lines
auto open groupchat configuration window when we create a new room
........
2006-01-07 18:25:35 +01:00
|
|
|
|
path_dest = (path_dest[0], path_dest[1]-1)
|
2006-09-13 18:47:58 +02:00
|
|
|
|
path_source = treeview.get_selection().get_selected_rows()[1][0]
|
|
|
|
|
iter_source = model.get_iter(path_source)
|
2006-01-27 00:20:27 +01:00
|
|
|
|
type_source = model[iter_source][C_TYPE]
|
2006-07-17 21:30:53 +02:00
|
|
|
|
account_source = model[iter_source][C_ACCOUNT].decode('utf-8')
|
2006-01-27 00:20:27 +01:00
|
|
|
|
if type_source != 'contact': # source is not a contact
|
2005-06-12 17:14:07 +02:00
|
|
|
|
return
|
2006-07-17 21:30:53 +02:00
|
|
|
|
if type_dest == 'account' and account_source == account_dest:
|
|
|
|
|
return
|
2006-11-18 21:52:28 +01:00
|
|
|
|
if gajim.config.get_per('accounts', account_source, 'is_zeroconf'):
|
|
|
|
|
return
|
2006-01-27 00:20:27 +01:00
|
|
|
|
it = iter_source
|
|
|
|
|
while model[it][C_TYPE] == 'contact':
|
|
|
|
|
it = model.iter_parent(it)
|
|
|
|
|
grp_source = model[it][C_JID].decode('utf-8')
|
2006-03-30 23:35:43 +02:00
|
|
|
|
if grp_source in helpers.special_groups:
|
2005-06-12 17:14:07 +02:00
|
|
|
|
return
|
2006-01-27 00:20:27 +01:00
|
|
|
|
jid_source = data.decode('utf-8')
|
2006-07-17 21:30:53 +02:00
|
|
|
|
c_source = gajim.contacts.get_contact_with_highest_priority(
|
|
|
|
|
account_source, jid_source)
|
|
|
|
|
|
|
|
|
|
grp_dest = None
|
2005-06-12 17:14:07 +02:00
|
|
|
|
if type_dest == 'group':
|
2005-09-12 23:56:50 +02:00
|
|
|
|
grp_dest = model[iter_dest][C_JID].decode('utf-8')
|
2006-07-17 21:30:53 +02:00
|
|
|
|
elif type_dest in ('contact', 'agent'):
|
|
|
|
|
it = iter_dest
|
|
|
|
|
while model[it][C_TYPE] != 'group':
|
|
|
|
|
it = model.iter_parent(it)
|
|
|
|
|
grp_dest = model[it][C_JID].decode('utf-8')
|
|
|
|
|
|
|
|
|
|
if (type_dest == 'account' or not self.regroup) and \
|
|
|
|
|
account_source != account_dest:
|
|
|
|
|
# add contact to this account in that group
|
|
|
|
|
dialogs.AddNewContactWindow(account = account_dest, jid = jid_source,
|
|
|
|
|
user_nick = c_source.name, group = grp_dest)
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
# Get destination group
|
|
|
|
|
if type_dest == 'group':
|
2006-03-30 23:35:43 +02:00
|
|
|
|
if grp_dest in helpers.special_groups:
|
2006-02-20 00:05:00 +01:00
|
|
|
|
return
|
2006-03-24 13:55:56 +01:00
|
|
|
|
if context.action == gtk.gdk.ACTION_COPY:
|
2006-07-17 21:30:53 +02:00
|
|
|
|
self.on_drop_in_group(None, account_source, c_source, grp_dest,
|
|
|
|
|
context, etime)
|
2006-02-05 12:30:17 +01:00
|
|
|
|
return
|
2006-07-17 21:30:53 +02:00
|
|
|
|
self.on_drop_in_group(None, account_source, c_source, grp_dest,
|
|
|
|
|
context, etime, grp_source)
|
2006-03-24 13:55:56 +01:00
|
|
|
|
return
|
2006-03-30 23:35:43 +02:00
|
|
|
|
if grp_dest in helpers.special_groups:
|
2005-11-28 16:26:17 +01:00
|
|
|
|
return
|
2006-03-05 22:32:33 +01:00
|
|
|
|
if jid_source == jid_dest:
|
2006-07-17 21:30:53 +02:00
|
|
|
|
if grp_source == grp_dest and account_source == account_dest:
|
2006-03-05 22:32:33 +01:00
|
|
|
|
return
|
2005-06-12 17:14:07 +02:00
|
|
|
|
if grp_source == grp_dest:
|
2006-01-27 00:20:27 +01:00
|
|
|
|
# Add meta contact
|
2006-03-29 19:28:16 +02:00
|
|
|
|
#FIXME: doesn't work under windows:
|
|
|
|
|
# http://bugzilla.gnome.org/show_bug.cgi?id=329797
|
2006-02-03 16:38:00 +01:00
|
|
|
|
# if context.action == gtk.gdk.ACTION_COPY:
|
|
|
|
|
# # Keep only MOVE
|
|
|
|
|
# return
|
2006-07-17 21:30:53 +02:00
|
|
|
|
c_dest = gajim.contacts.get_contact_with_highest_priority(account_dest,
|
2006-03-05 11:19:36 +01:00
|
|
|
|
jid_dest)
|
2006-03-29 22:06:12 +02:00
|
|
|
|
is_big_brother = False
|
|
|
|
|
if model.iter_has_child(iter_source):
|
|
|
|
|
is_big_brother = True
|
2006-05-31 13:45:04 +02:00
|
|
|
|
if not c_dest:
|
|
|
|
|
# c_dest is None if jid_dest doesn't belong to account
|
|
|
|
|
return
|
2006-07-17 21:30:53 +02:00
|
|
|
|
self.on_drop_in_contact(treeview, account_source, c_source,
|
|
|
|
|
account_dest, c_dest, is_big_brother, context, etime)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
return
|
|
|
|
|
# We upgrade only the first user because user2.groups is a pointer to
|
|
|
|
|
# user1.groups
|
2006-02-03 22:02:47 +01:00
|
|
|
|
if context.action == gtk.gdk.ACTION_COPY:
|
2006-07-17 21:30:53 +02:00
|
|
|
|
self.on_drop_in_group(None, account_source, c_source, grp_dest,
|
|
|
|
|
context, etime)
|
2006-02-03 22:02:47 +01:00
|
|
|
|
else:
|
|
|
|
|
menu = gtk.Menu()
|
|
|
|
|
item = gtk.MenuItem(_('Drop %s in group %s') % (c_source.name,
|
|
|
|
|
grp_dest))
|
2006-11-20 08:53:58 +01:00
|
|
|
|
item.connect('activate', self.on_drop_in_group, account_source,
|
|
|
|
|
c_source, grp_dest, context, etime, grp_source)
|
2006-02-03 22:02:47 +01:00
|
|
|
|
menu.append(item)
|
2006-07-17 21:30:53 +02:00
|
|
|
|
c_dest = gajim.contacts.get_contact_with_highest_priority(
|
|
|
|
|
account_dest, jid_dest)
|
2006-11-18 21:52:28 +01:00
|
|
|
|
item = gtk.MenuItem(_('Make %s and %s metacontacts') %
|
|
|
|
|
(c_source.get_shown_name(), c_dest.get_shown_name()))
|
2006-07-17 21:30:53 +02:00
|
|
|
|
is_big_brother = False
|
|
|
|
|
if model.iter_has_child(iter_source):
|
|
|
|
|
is_big_brother = True
|
|
|
|
|
item.connect('activate', self.on_drop_in_contact, account_source,
|
|
|
|
|
c_source, account_dest, c_dest, is_big_brother, context, etime)
|
2006-05-14 17:12:17 +02:00
|
|
|
|
|
2006-02-03 22:02:47 +01:00
|
|
|
|
menu.append(item)
|
|
|
|
|
|
2006-04-07 17:51:17 +02:00
|
|
|
|
menu.attach_to_widget(self.tree, None)
|
|
|
|
|
menu.connect('selection-done', gtkgui_helpers.destroy_widget)
|
2006-02-03 22:02:47 +01:00
|
|
|
|
menu.show_all()
|
2006-05-26 15:25:31 +02:00
|
|
|
|
menu.popup(None, None, None, 1, etime)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
|
|
|
|
def show_title(self):
|
|
|
|
|
change_title_allowed = gajim.config.get('change_roster_title')
|
2006-11-18 21:52:28 +01:00
|
|
|
|
nb_unread = 0
|
2005-06-12 17:14:07 +02:00
|
|
|
|
if change_title_allowed:
|
|
|
|
|
start = ''
|
2006-11-18 21:52:28 +01:00
|
|
|
|
for account in gajim.connections:
|
|
|
|
|
# Count events in roster title only if we don't auto open them
|
|
|
|
|
if not helpers.allow_popup_window(account):
|
|
|
|
|
nb_unread += gajim.events.get_nb_events(['chat', 'normal',
|
|
|
|
|
'file-request', 'file-error', 'file-completed',
|
|
|
|
|
'file-request-error', 'file-send-error', 'file-stopped',
|
|
|
|
|
'printed_chat'], account)
|
2006-09-13 18:47:58 +02:00
|
|
|
|
if nb_unread > 1:
|
|
|
|
|
start = '[' + str(nb_unread) + '] '
|
|
|
|
|
elif nb_unread == 1:
|
2005-06-12 17:14:07 +02:00
|
|
|
|
start = '* '
|
|
|
|
|
self.window.set_title(start + 'Gajim')
|
2005-12-06 18:43:21 +01:00
|
|
|
|
|
2006-09-13 18:47:58 +02:00
|
|
|
|
gtkgui_helpers.set_unset_urgency_hint(self.window, nb_unread)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
2005-10-09 22:28:04 +02:00
|
|
|
|
def iter_is_separator(self, model, iter):
|
2005-10-10 00:24:18 +02:00
|
|
|
|
if model[iter][0] == 'SEPARATOR':
|
2005-10-09 22:28:04 +02:00
|
|
|
|
return True
|
|
|
|
|
return False
|
|
|
|
|
|
2005-11-07 11:50:40 +01:00
|
|
|
|
def iter_contact_rows(self):
|
|
|
|
|
'''iterate over all contact rows in the tree model'''
|
|
|
|
|
model = self.tree.get_model()
|
|
|
|
|
account_iter = model.get_iter_root()
|
|
|
|
|
while account_iter:
|
|
|
|
|
group_iter = model.iter_children(account_iter)
|
|
|
|
|
while group_iter:
|
|
|
|
|
contact_iter = model.iter_children(group_iter)
|
|
|
|
|
while contact_iter:
|
|
|
|
|
yield model[contact_iter]
|
|
|
|
|
contact_iter = model.iter_next(contact_iter)
|
|
|
|
|
group_iter = model.iter_next(group_iter)
|
|
|
|
|
account_iter = model.iter_next(account_iter)
|
|
|
|
|
|
2005-11-08 15:09:56 +01:00
|
|
|
|
def on_roster_treeview_style_set(self, treeview, style):
|
2005-11-07 11:50:40 +01:00
|
|
|
|
'''When style (theme) changes, redraw all contacts'''
|
|
|
|
|
for contact in self.iter_contact_rows():
|
2005-11-28 16:22:12 +01:00
|
|
|
|
self.draw_contact(contact[C_JID].decode('utf-8'),
|
|
|
|
|
contact[C_ACCOUNT].decode('utf-8'))
|
2005-11-07 11:50:40 +01:00
|
|
|
|
|
|
|
|
|
def _on_treeview_selection_changed(self, selection):
|
2006-09-13 18:47:58 +02:00
|
|
|
|
model, list_of_paths = selection.get_selected_rows()
|
|
|
|
|
if len(self._last_selected_contact):
|
|
|
|
|
# update unselected rows
|
|
|
|
|
for (jid, account) in self._last_selected_contact:
|
|
|
|
|
try:
|
|
|
|
|
self.draw_contact(jid, account)
|
|
|
|
|
except:
|
|
|
|
|
# This can fail when last selected row was on an account we just
|
|
|
|
|
# removed. So we don't care if that fail
|
|
|
|
|
pass
|
|
|
|
|
self._last_selected_contact = []
|
|
|
|
|
if len(list_of_paths) == 0:
|
2005-11-07 11:50:40 +01:00
|
|
|
|
return
|
2006-09-13 18:47:58 +02:00
|
|
|
|
for path in list_of_paths:
|
|
|
|
|
row = model[path]
|
|
|
|
|
if row[C_TYPE] != 'contact':
|
|
|
|
|
self._last_selected_contact = []
|
|
|
|
|
return
|
|
|
|
|
jid = row[C_JID].decode('utf-8')
|
|
|
|
|
account = row[C_ACCOUNT].decode('utf-8')
|
|
|
|
|
self._last_selected_contact.append((jid, account))
|
|
|
|
|
self.draw_contact(jid, account, selected = True)
|
2005-11-07 11:50:40 +01:00
|
|
|
|
|
2005-10-20 13:17:17 +02:00
|
|
|
|
def __init__(self):
|
2006-05-02 17:53:25 +02:00
|
|
|
|
self.xml = gtkgui_helpers.get_glade('roster_window.glade')
|
2005-06-12 17:14:07 +02:00
|
|
|
|
self.window = self.xml.get_widget('roster_window')
|
2006-11-18 21:52:28 +01:00
|
|
|
|
self._music_track_changed_signal = None
|
2005-12-31 07:27:22 +01:00
|
|
|
|
gajim.interface.msg_win_mgr = MessageWindowMgr()
|
2006-04-07 23:50:27 +02:00
|
|
|
|
self.advanced_menus = [] # We keep them to destroy them
|
2005-12-27 21:27:02 +01:00
|
|
|
|
if gajim.config.get('roster_window_skip_taskbar'):
|
|
|
|
|
self.window.set_property('skip-taskbar-hint', True)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
self.tree = self.xml.get_widget('roster_treeview')
|
2006-09-13 18:47:58 +02:00
|
|
|
|
sel = self.tree.get_selection()
|
|
|
|
|
sel.set_mode(gtk.SELECTION_MULTIPLE)
|
|
|
|
|
sel.connect('changed',
|
2005-11-07 11:50:40 +01:00
|
|
|
|
self._on_treeview_selection_changed)
|
2005-12-06 18:43:21 +01:00
|
|
|
|
|
2006-09-13 18:47:58 +02:00
|
|
|
|
self._last_selected_contact = [] # holds a list of (jid, account) tupples
|
2006-01-31 14:52:54 +01:00
|
|
|
|
self.jabber_state_images = {'16': {}, '32': {}, 'opened': {},
|
|
|
|
|
'closed': {}}
|
|
|
|
|
self.transports_state_images = {'16': {}, '32': {}, 'opened': {},
|
|
|
|
|
'closed': {}}
|
2007-01-02 12:43:57 +01:00
|
|
|
|
|
2005-07-30 16:40:58 +02:00
|
|
|
|
self.last_save_dir = None
|
2005-07-23 00:50:25 +02:00
|
|
|
|
self.editing_path = None # path of row with cell in edit mode
|
2005-06-12 17:14:07 +02:00
|
|
|
|
self.add_new_contact_handler_id = False
|
|
|
|
|
self.service_disco_handler_id = False
|
2006-04-18 17:17:07 +02:00
|
|
|
|
self.new_chat_menuitem_handler_id = False
|
2006-04-09 00:47:57 +02:00
|
|
|
|
self.profile_avatar_menuitem_handler_id = False
|
2006-02-19 22:28:41 +01:00
|
|
|
|
self.actions_menu_needs_rebuild = True
|
2005-06-12 17:14:07 +02:00
|
|
|
|
self.regroup = gajim.config.get('mergeaccounts')
|
2006-01-18 20:31:25 +01:00
|
|
|
|
if len(gajim.connections) < 2: # Do not merge accounts if only one exists
|
|
|
|
|
self.regroup = False
|
2005-07-05 22:47:25 +02:00
|
|
|
|
#FIXME: When list_accel_closures will be wrapped in pygtk
|
|
|
|
|
# no need of this variable
|
2006-04-18 17:17:07 +02:00
|
|
|
|
self.have_new_chat_accel = False # Is the "Ctrl+N" shown ?
|
2005-06-12 17:14:07 +02:00
|
|
|
|
if gajim.config.get('saveposition'):
|
2005-10-26 18:40:59 +02:00
|
|
|
|
gtkgui_helpers.move_window(self.window,
|
|
|
|
|
gajim.config.get('roster_x-position'),
|
2005-08-28 12:57:08 +02:00
|
|
|
|
gajim.config.get('roster_y-position'))
|
2005-10-26 18:40:59 +02:00
|
|
|
|
gtkgui_helpers.resize_window(self.window,
|
|
|
|
|
gajim.config.get('roster_width'),
|
2005-07-21 23:19:08 +02:00
|
|
|
|
gajim.config.get('roster_height'))
|
2005-06-21 16:45:23 +02:00
|
|
|
|
|
2005-06-12 17:14:07 +02:00
|
|
|
|
self.popups_notification_height = 0
|
|
|
|
|
self.popup_notification_windows = []
|
|
|
|
|
self.gpg_passphrase = {}
|
2005-11-06 15:30:17 +01:00
|
|
|
|
|
2005-06-29 14:57:46 +02:00
|
|
|
|
#(icon, name, type, jid, account, editable, secondary_pixbuf)
|
2006-11-19 20:45:43 +01:00
|
|
|
|
model = gtk.TreeStore(gtk.Image, str, str, str, str, gtk.gdk.Pixbuf)
|
2005-11-06 15:30:17 +01:00
|
|
|
|
|
2005-06-12 17:14:07 +02:00
|
|
|
|
model.set_sort_func(1, self.compareIters)
|
|
|
|
|
model.set_sort_column_id(1, gtk.SORT_ASCENDING)
|
|
|
|
|
self.tree.set_model(model)
|
2006-06-12 09:38:07 +02:00
|
|
|
|
# when this value become 0 we quit main application
|
|
|
|
|
self.quit_on_next_offline = -1
|
2005-06-12 17:14:07 +02:00
|
|
|
|
self.make_jabber_state_images()
|
2005-12-06 18:43:21 +01:00
|
|
|
|
|
2005-12-02 14:09:43 +01:00
|
|
|
|
path = os.path.join(gajim.DATA_DIR, 'iconsets', 'transports')
|
2005-06-12 17:14:07 +02:00
|
|
|
|
folders = os.listdir(path)
|
|
|
|
|
for transport in folders:
|
|
|
|
|
if transport == '.svn':
|
|
|
|
|
continue
|
2005-12-12 16:13:31 +01:00
|
|
|
|
folder = os.path.join(path, transport, '32x32')
|
2006-01-31 19:23:13 +01:00
|
|
|
|
self.transports_state_images['32'][transport] = self.load_iconset(
|
2006-02-26 16:08:59 +01:00
|
|
|
|
folder, transport = True)
|
2005-12-12 16:13:31 +01:00
|
|
|
|
folder = os.path.join(path, transport, '16x16')
|
2006-01-31 19:23:13 +01:00
|
|
|
|
self.transports_state_images['16'][transport] = self.load_iconset(
|
2006-02-26 16:08:59 +01:00
|
|
|
|
folder, transport = True)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
2005-10-10 23:45:59 +02:00
|
|
|
|
# uf_show, img, show, sensitive
|
|
|
|
|
liststore = gtk.ListStore(str, gtk.Image, str, bool)
|
2005-06-21 16:45:23 +02:00
|
|
|
|
self.status_combobox = self.xml.get_widget('status_combobox')
|
2005-10-09 22:28:04 +02:00
|
|
|
|
|
Merged revisions 5030-5031,5033-5038 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r5030 | asterix | 2006-01-07 10:04:18 -0700 (Sat, 07 Jan 2006) | 2 lines
when we add a bookmark, we add our nick by default
........
r5031 | nicfit | 2006-01-07 10:24:50 -0700 (Sat, 07 Jan 2006) | 2 lines
Grammatical fix
........
r5033 | asterix | 2006-01-07 11:36:56 -0700 (Sat, 07 Jan 2006) | 2 lines
cell_renderer_image now take in argument the index of the column and the index in the model
........
r5034 | asterix | 2006-01-07 11:37:28 -0700 (Sat, 07 Jan 2006) | 2 lines
typo
........
r5035 | asterix | 2006-01-07 11:38:18 -0700 (Sat, 07 Jan 2006) | 2 lines
don't show header in emoticonManager so that cellrenderer correctly compute the area to redraw
........
r5036 | asterix | 2006-01-07 11:39:41 -0700 (Sat, 07 Jan 2006) | 2 lines
prevent a TB
........
r5037 | nicfit | 2006-01-07 13:26:08 -0700 (Sat, 07 Jan 2006) | 2 lines
Increment later
........
r5038 | nicfit | 2006-01-07 13:29:05 -0700 (Sat, 07 Jan 2006) | 2 lines
Fixed syntax error
........
2006-01-07 21:47:06 +01:00
|
|
|
|
cell = cell_renderer_image.CellRendererImage(0, 1)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
self.status_combobox.pack_start(cell, False)
|
2005-12-06 18:43:21 +01:00
|
|
|
|
|
2005-10-26 18:40:59 +02:00
|
|
|
|
# img to show is in in 2nd column of liststore
|
2005-06-12 17:14:07 +02:00
|
|
|
|
self.status_combobox.add_attribute(cell, 'image', 1)
|
2005-10-26 18:40:59 +02:00
|
|
|
|
# if it will be sensitive or not it is in the fourth column
|
|
|
|
|
# all items in the 'row' must have sensitive to False
|
|
|
|
|
# if we want False (so we add it for img_cell too)
|
|
|
|
|
self.status_combobox.add_attribute(cell, 'sensitive', 3)
|
2005-10-09 22:28:04 +02:00
|
|
|
|
|
2005-06-12 17:14:07 +02:00
|
|
|
|
cell = gtk.CellRendererText()
|
|
|
|
|
cell.set_property('xpad', 5) # padding for status text
|
|
|
|
|
self.status_combobox.pack_start(cell, True)
|
2005-10-10 23:45:59 +02:00
|
|
|
|
# text to show is in in first column of liststore
|
2005-06-12 17:14:07 +02:00
|
|
|
|
self.status_combobox.add_attribute(cell, 'text', 0)
|
2005-10-10 23:45:59 +02:00
|
|
|
|
# if it will be sensitive or not it is in the fourth column
|
|
|
|
|
self.status_combobox.add_attribute(cell, 'sensitive', 3)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
2005-10-09 22:28:04 +02:00
|
|
|
|
self.status_combobox.set_row_separator_func(self.iter_is_separator)
|
|
|
|
|
|
2005-10-27 15:15:03 +02:00
|
|
|
|
for show in ('online', 'chat', 'away', 'xa', 'dnd', 'invisible'):
|
2005-06-12 17:14:07 +02:00
|
|
|
|
uf_show = helpers.get_uf_show(show)
|
2006-11-20 08:53:58 +01:00
|
|
|
|
liststore.append([uf_show, self.jabber_state_images['16'][show], show,
|
|
|
|
|
True])
|
2005-10-10 00:24:18 +02:00
|
|
|
|
# Add a Separator (self.iter_is_separator() checks on string SEPARATOR)
|
2005-10-10 23:45:59 +02:00
|
|
|
|
liststore.append(['SEPARATOR', None, '', True])
|
2005-10-09 22:28:04 +02:00
|
|
|
|
|
2006-03-29 18:42:06 +02:00
|
|
|
|
path = os.path.join(gajim.DATA_DIR, 'pixmaps', 'kbd_input.png')
|
2005-10-09 22:57:32 +02:00
|
|
|
|
img = gtk.Image()
|
|
|
|
|
img.set_from_file(path)
|
2005-10-10 23:45:59 +02:00
|
|
|
|
# sensitivity to False because by default we're offline
|
|
|
|
|
self.status_message_menuitem_iter = liststore.append(
|
|
|
|
|
[_('Change Status Message...'), img, '', False])
|
2005-10-19 13:13:41 +02:00
|
|
|
|
# Add a Separator (self.iter_is_separator() checks on string SEPARATOR)
|
2005-10-10 23:45:59 +02:00
|
|
|
|
liststore.append(['SEPARATOR', None, '', True])
|
2005-10-09 22:28:04 +02:00
|
|
|
|
|
|
|
|
|
uf_show = helpers.get_uf_show('offline')
|
2005-12-12 16:13:31 +01:00
|
|
|
|
liststore.append([uf_show, self.jabber_state_images['16']['offline'],
|
2005-10-10 23:45:59 +02:00
|
|
|
|
'offline', True])
|
2005-12-06 18:43:21 +01:00
|
|
|
|
|
2006-11-20 08:53:58 +01:00
|
|
|
|
status_combobox_items = ['online', 'chat', 'away', 'xa', 'dnd',
|
|
|
|
|
'invisible', 'separator1', 'change_status_msg', 'separator2',
|
|
|
|
|
'offline']
|
2005-06-12 17:14:07 +02:00
|
|
|
|
self.status_combobox.set_model(liststore)
|
2005-12-06 18:43:21 +01:00
|
|
|
|
|
2005-10-19 13:03:01 +02:00
|
|
|
|
# default to offline
|
|
|
|
|
number_of_menuitem = status_combobox_items.index('offline')
|
|
|
|
|
self.status_combobox.set_active(number_of_menuitem)
|
2005-12-06 18:43:21 +01:00
|
|
|
|
|
2005-10-19 13:03:01 +02:00
|
|
|
|
# holds index to previously selected item so if "change status message..."
|
|
|
|
|
# is selected we can fallback to previously selected item and not stay
|
|
|
|
|
# with that item selected
|
|
|
|
|
self.previous_status_combobox_active = number_of_menuitem
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
|
|
|
|
showOffline = gajim.config.get('showoffline')
|
2005-07-07 18:38:36 +02:00
|
|
|
|
self.xml.get_widget('show_offline_contacts_menuitem').set_active(
|
|
|
|
|
showOffline)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
2006-11-18 21:52:28 +01:00
|
|
|
|
show_transports_group = gajim.config.get('show_transports_group')
|
|
|
|
|
self.xml.get_widget('show_transports_menuitem').set_active(
|
|
|
|
|
show_transports_group)
|
|
|
|
|
|
2005-10-10 23:45:59 +02:00
|
|
|
|
# columns
|
2005-12-06 18:43:21 +01:00
|
|
|
|
|
2006-03-14 00:25:00 +01:00
|
|
|
|
# this col has 3 cells:
|
|
|
|
|
# first one img, second one text, third is sec pixbuf
|
2005-06-12 17:14:07 +02:00
|
|
|
|
col = gtk.TreeViewColumn()
|
2005-12-06 18:43:21 +01:00
|
|
|
|
|
2006-11-20 08:53:58 +01:00
|
|
|
|
render_image = cell_renderer_image.CellRendererImage(0, 0)
|
|
|
|
|
# show img or +-
|
2005-06-29 14:57:46 +02:00
|
|
|
|
col.pack_start(render_image, expand = False)
|
2005-09-19 17:23:18 +02:00
|
|
|
|
col.add_attribute(render_image, 'image', C_IMG)
|
2005-06-29 14:57:46 +02:00
|
|
|
|
col.set_cell_data_func(render_image, self.iconCellDataFunc, None)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
2005-06-29 14:57:46 +02:00
|
|
|
|
render_text = gtk.CellRendererText() # contact or group or account name
|
2005-06-12 17:14:07 +02:00
|
|
|
|
col.pack_start(render_text, expand = True)
|
2005-11-06 15:30:17 +01:00
|
|
|
|
col.add_attribute(render_text, 'markup', C_NAME) # where we hold the name
|
2005-06-12 17:14:07 +02:00
|
|
|
|
col.set_cell_data_func(render_text, self.nameCellDataFunc, None)
|
2005-12-06 18:43:21 +01:00
|
|
|
|
|
2005-06-29 14:57:46 +02:00
|
|
|
|
render_pixbuf = gtk.CellRendererPixbuf() # tls or avatar img
|
|
|
|
|
col.pack_start(render_pixbuf, expand = False)
|
2005-09-19 17:23:18 +02:00
|
|
|
|
col.add_attribute(render_pixbuf, 'pixbuf', C_SECPIXBUF)
|
2005-06-29 14:57:46 +02:00
|
|
|
|
col.set_cell_data_func(render_pixbuf, self.fill_secondary_pixbuf_rederer,
|
|
|
|
|
None)
|
|
|
|
|
|
2005-06-12 17:14:07 +02:00
|
|
|
|
self.tree.append_column(col)
|
2005-12-06 18:43:21 +01:00
|
|
|
|
|
2005-06-12 17:14:07 +02:00
|
|
|
|
#do not show gtk arrows workaround
|
|
|
|
|
col = gtk.TreeViewColumn()
|
|
|
|
|
render_pixbuf = gtk.CellRendererPixbuf()
|
|
|
|
|
col.pack_start(render_pixbuf, expand = False)
|
|
|
|
|
self.tree.append_column(col)
|
|
|
|
|
col.set_visible(False)
|
|
|
|
|
self.tree.set_expander_column(col)
|
2006-01-26 12:23:15 +01:00
|
|
|
|
|
2005-06-12 17:14:07 +02:00
|
|
|
|
#signals
|
Merged revisions 5017-5020,5022-5029 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r5017 | asterix | 2006-01-06 01:55:51 -0700 (Fri, 06 Jan 2006) | 2 lines
use escape for pango markup
........
r5018 | asterix | 2006-01-06 02:21:39 -0700 (Fri, 06 Jan 2006) | 2 lines
missing new contacts function
........
r5019 | asterix | 2006-01-06 11:03:07 -0700 (Fri, 06 Jan 2006) | 2 lines
handle the click on toggle_gpg_encryption menuitem
........
r5020 | asterix | 2006-01-06 11:14:14 -0700 (Fri, 06 Jan 2006) | 2 lines
use the saved size even if a chat window is already opened
........
r5022 | asterix | 2006-01-07 03:43:47 -0700 (Sat, 07 Jan 2006) | 2 lines
we can now resume filetransfert
........
r5023 | asterix | 2006-01-07 03:56:31 -0700 (Sat, 07 Jan 2006) | 2 lines
[Knuckles] Google E-Mail Notification
........
r5024 | asterix | 2006-01-07 04:02:16 -0700 (Sat, 07 Jan 2006) | 2 lines
better string
........
r5025 | asterix | 2006-01-07 04:14:32 -0700 (Sat, 07 Jan 2006) | 2 lines
fix a TB
........
r5026 | asterix | 2006-01-07 05:36:55 -0700 (Sat, 07 Jan 2006) | 2 lines
we can now drag a file on a contact in the roster to send him a file
........
r5027 | asterix | 2006-01-07 06:26:28 -0700 (Sat, 07 Jan 2006) | 2 lines
contact.groups is always a list, even if emtpy
........
r5028 | asterix | 2006-01-07 06:54:30 -0700 (Sat, 07 Jan 2006) | 2 lines
make all buttons insensitive on a category row in disco
........
r5029 | asterix | 2006-01-07 07:19:25 -0700 (Sat, 07 Jan 2006) | 2 lines
auto open groupchat configuration window when we create a new room
........
2006-01-07 18:25:35 +01:00
|
|
|
|
self.TARGET_TYPE_URI_LIST = 80
|
2005-06-12 17:14:07 +02:00
|
|
|
|
TARGETS = [('MY_TREE_MODEL_ROW', gtk.TARGET_SAME_WIDGET, 0)]
|
Merged revisions 5017-5020,5022-5029 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r5017 | asterix | 2006-01-06 01:55:51 -0700 (Fri, 06 Jan 2006) | 2 lines
use escape for pango markup
........
r5018 | asterix | 2006-01-06 02:21:39 -0700 (Fri, 06 Jan 2006) | 2 lines
missing new contacts function
........
r5019 | asterix | 2006-01-06 11:03:07 -0700 (Fri, 06 Jan 2006) | 2 lines
handle the click on toggle_gpg_encryption menuitem
........
r5020 | asterix | 2006-01-06 11:14:14 -0700 (Fri, 06 Jan 2006) | 2 lines
use the saved size even if a chat window is already opened
........
r5022 | asterix | 2006-01-07 03:43:47 -0700 (Sat, 07 Jan 2006) | 2 lines
we can now resume filetransfert
........
r5023 | asterix | 2006-01-07 03:56:31 -0700 (Sat, 07 Jan 2006) | 2 lines
[Knuckles] Google E-Mail Notification
........
r5024 | asterix | 2006-01-07 04:02:16 -0700 (Sat, 07 Jan 2006) | 2 lines
better string
........
r5025 | asterix | 2006-01-07 04:14:32 -0700 (Sat, 07 Jan 2006) | 2 lines
fix a TB
........
r5026 | asterix | 2006-01-07 05:36:55 -0700 (Sat, 07 Jan 2006) | 2 lines
we can now drag a file on a contact in the roster to send him a file
........
r5027 | asterix | 2006-01-07 06:26:28 -0700 (Sat, 07 Jan 2006) | 2 lines
contact.groups is always a list, even if emtpy
........
r5028 | asterix | 2006-01-07 06:54:30 -0700 (Sat, 07 Jan 2006) | 2 lines
make all buttons insensitive on a category row in disco
........
r5029 | asterix | 2006-01-07 07:19:25 -0700 (Sat, 07 Jan 2006) | 2 lines
auto open groupchat configuration window when we create a new room
........
2006-01-07 18:25:35 +01:00
|
|
|
|
TARGETS2 = [('MY_TREE_MODEL_ROW', gtk.TARGET_SAME_WIDGET, 0),
|
|
|
|
|
('text/uri-list', 0, self.TARGET_TYPE_URI_LIST)]
|
|
|
|
|
self.tree.enable_model_drag_source(gtk.gdk.BUTTON1_MASK, TARGETS,
|
2005-11-01 23:52:04 +01:00
|
|
|
|
gtk.gdk.ACTION_DEFAULT | gtk.gdk.ACTION_MOVE | gtk.gdk.ACTION_COPY)
|
Merged revisions 5017-5020,5022-5029 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r5017 | asterix | 2006-01-06 01:55:51 -0700 (Fri, 06 Jan 2006) | 2 lines
use escape for pango markup
........
r5018 | asterix | 2006-01-06 02:21:39 -0700 (Fri, 06 Jan 2006) | 2 lines
missing new contacts function
........
r5019 | asterix | 2006-01-06 11:03:07 -0700 (Fri, 06 Jan 2006) | 2 lines
handle the click on toggle_gpg_encryption menuitem
........
r5020 | asterix | 2006-01-06 11:14:14 -0700 (Fri, 06 Jan 2006) | 2 lines
use the saved size even if a chat window is already opened
........
r5022 | asterix | 2006-01-07 03:43:47 -0700 (Sat, 07 Jan 2006) | 2 lines
we can now resume filetransfert
........
r5023 | asterix | 2006-01-07 03:56:31 -0700 (Sat, 07 Jan 2006) | 2 lines
[Knuckles] Google E-Mail Notification
........
r5024 | asterix | 2006-01-07 04:02:16 -0700 (Sat, 07 Jan 2006) | 2 lines
better string
........
r5025 | asterix | 2006-01-07 04:14:32 -0700 (Sat, 07 Jan 2006) | 2 lines
fix a TB
........
r5026 | asterix | 2006-01-07 05:36:55 -0700 (Sat, 07 Jan 2006) | 2 lines
we can now drag a file on a contact in the roster to send him a file
........
r5027 | asterix | 2006-01-07 06:26:28 -0700 (Sat, 07 Jan 2006) | 2 lines
contact.groups is always a list, even if emtpy
........
r5028 | asterix | 2006-01-07 06:54:30 -0700 (Sat, 07 Jan 2006) | 2 lines
make all buttons insensitive on a category row in disco
........
r5029 | asterix | 2006-01-07 07:19:25 -0700 (Sat, 07 Jan 2006) | 2 lines
auto open groupchat configuration window when we create a new room
........
2006-01-07 18:25:35 +01:00
|
|
|
|
self.tree.enable_model_drag_dest(TARGETS2, gtk.gdk.ACTION_DEFAULT)
|
2006-12-29 18:41:13 +01:00
|
|
|
|
self.tree.connect('drag_begin', self.drag_begin)
|
|
|
|
|
self.tree.connect('drag_end', self.drag_end)
|
2005-06-12 17:14:07 +02:00
|
|
|
|
self.tree.connect('drag_data_get', self.drag_data_get_data)
|
|
|
|
|
self.tree.connect('drag_data_received', self.drag_data_received_data)
|
2006-12-29 22:23:24 +01:00
|
|
|
|
self.dragging = False
|
2005-06-12 17:14:07 +02:00
|
|
|
|
self.xml.signal_autoconnect(self)
|
2005-11-05 19:09:57 +01:00
|
|
|
|
self.combobox_callback_active = True
|
2005-06-12 17:14:07 +02:00
|
|
|
|
|
|
|
|
|
self.collapsed_rows = gajim.config.get('collapsed_rows').split('\t')
|
2005-10-20 13:17:17 +02:00
|
|
|
|
self.tooltip = tooltips.RosterTooltip()
|
2005-06-12 17:14:07 +02:00
|
|
|
|
self.draw_roster()
|
2005-06-21 16:45:23 +02:00
|
|
|
|
|
2006-11-18 21:52:28 +01:00
|
|
|
|
## Music Track notifications
|
|
|
|
|
## FIXME: we use a timeout because changing status of
|
|
|
|
|
## accounts has no effect until they are connected.
|
|
|
|
|
gobject.timeout_add(1000,
|
|
|
|
|
self.enable_syncing_status_msg_from_current_music_track,
|
|
|
|
|
gajim.config.get('set_status_msg_from_current_music_track'))
|
|
|
|
|
|
2005-06-21 16:45:23 +02:00
|
|
|
|
if gajim.config.get('show_roster_on_startup'):
|
|
|
|
|
self.window.show_all()
|
|
|
|
|
else:
|
|
|
|
|
if not gajim.config.get('trayicon'):
|
2005-12-29 04:20:06 +01:00
|
|
|
|
# cannot happen via GUI, but I put this incase user touches
|
|
|
|
|
# config. without trayicon, he or she should see the roster!
|
|
|
|
|
self.window.show_all()
|
2005-06-21 16:45:23 +02:00
|
|
|
|
gajim.config.set('show_roster_on_startup', True)
|
2005-07-21 16:56:39 +02:00
|
|
|
|
|
|
|
|
|
if len(gajim.connections) == 0: # if we have no account
|
2005-11-13 21:05:03 +01:00
|
|
|
|
gajim.interface.instances['account_creation_wizard'] = \
|
2005-11-03 10:27:45 +01:00
|
|
|
|
config.AccountCreationWizardWindow()
|