2005-04-18 14:05:30 +00:00
## roster_window.py
2005-03-11 17:57:35 +00:00
##
## Gajim Team:
## - Yann Le Boulanger <asterix@lagaule.org>
## - Vincent Hanquez <tab@snarc.org>
## - Nikos Kouremenos <kourem@gmail.com>
##
## Copyright (C) 2003-2005 Gajim Team
##
## 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 gtk . glade
import pango
import gobject
import os
2005-04-18 21:35:39 +00:00
import time
2005-03-11 17:57:35 +00:00
import Queue
import common . sleepy
2005-04-14 17:07:55 +00:00
import tabbed_chat_window
import groupchat_window
import history_window
2005-04-14 09:38:08 +00:00
import dialogs
2005-04-14 17:07:55 +00:00
import config
2005-04-18 16:40:10 +00:00
import cell_renderer_image
2005-03-11 17:57:35 +00:00
2005-04-18 16:54:49 +00:00
from gajim import User
2005-04-18 14:05:30 +00:00
from common import gajim
2005-05-20 15:58:23 +00:00
from common import helpers
2005-03-11 17:57:35 +00:00
from common import i18n
_ = i18n . _
APP = i18n . APP
gtk . glade . bindtextdomain ( APP , i18n . DIR )
gtk . glade . textdomain ( APP )
2005-04-21 23:20:18 +00:00
GTKGUI_GLADE = ' gtkgui.glade '
2005-03-11 17:57:35 +00:00
2005-03-26 21:09:49 +00:00
class Roster_window :
2005-04-18 12:17:43 +00:00
''' Class for main window of gtkgui plugin '''
2005-03-11 17:57:35 +00:00
def get_account_iter ( self , name ) :
if self . regroup :
return None
model = self . tree . get_model ( )
account = model . get_iter_root ( )
2005-04-22 01:35:36 +00:00
while account :
2005-03-11 17:57:35 +00:00
account_name = model . get_value ( account , 3 )
if name == account_name :
2005-04-22 01:35:36 +00:00
break
2005-03-11 17:57:35 +00:00
account = model . iter_next ( account )
2005-04-22 01:35:36 +00:00
return account
2005-03-11 17:57:35 +00:00
def get_group_iter ( self , name , account ) :
model = self . tree . get_model ( )
root = self . get_account_iter ( account )
group = model . iter_children ( root )
2005-04-22 01:35:36 +00:00
while group :
2005-03-11 17:57:35 +00:00
group_name = model . get_value ( group , 3 )
if name == group_name :
2005-04-22 01:35:36 +00:00
break
2005-03-11 17:57:35 +00:00
group = model . iter_next ( group )
2005-04-22 01:35:36 +00:00
return group
2005-03-11 17:57:35 +00:00
def get_user_iter ( self , jid , account ) :
model = self . tree . get_model ( )
acct = self . get_account_iter ( account )
found = [ ]
fin = False
group = model . iter_children ( acct )
2005-04-22 01:35:36 +00:00
while group :
2005-03-11 17:57:35 +00:00
user = model . iter_children ( group )
2005-04-22 01:35:36 +00:00
while user :
2005-03-11 17:57:35 +00:00
if jid == model . get_value ( user , 3 ) :
found . append ( user )
user = model . iter_next ( user )
group = model . iter_next ( group )
return found
def add_account_to_roster ( self , account ) :
if self . regroup :
return
model = self . tree . get_model ( )
if self . get_account_iter ( account ) :
return
2005-05-04 17:32:23 +00:00
statuss = [ ' offline ' , ' connecting ' , ' online ' , ' chat ' ,
2005-04-22 01:35:36 +00:00
' away ' , ' xa ' , ' dnd ' , ' invisible ' ]
2005-04-14 07:20:14 +00:00
status = statuss [ gajim . connections [ account ] . connected ]
2005-04-23 01:37:05 +00:00
model . append ( None , ( self . jabber_state_images [ status ] , account ,
2005-04-22 01:35:36 +00:00
' account ' , account , account , False ) )
2005-03-11 17:57:35 +00:00
2005-04-04 23:03:26 +00:00
def remove_newly_added ( self , jid , account ) :
if jid in self . newly_added [ account ] :
self . newly_added [ account ] . remove ( jid )
2005-04-23 00:37:51 +00:00
self . draw_contact ( jid , account )
2005-04-04 23:03:26 +00:00
2005-03-11 17:57:35 +00:00
def add_user_to_roster ( self , jid , account ) :
2005-04-18 12:17:43 +00:00
''' Add a user to the roster and add groups if they aren ' t in roster '''
2005-04-12 21:09:06 +00:00
showOffline = gajim . config . get ( ' showoffline ' )
2005-03-11 17:57:35 +00:00
if not self . contacts [ account ] . has_key ( jid ) :
return
users = self . contacts [ account ] [ jid ]
user = users [ 0 ]
2005-04-29 15:39:16 +00:00
if user . jid . find ( ' @ ' ) < = 0 : # if not '@' or '@' starts the jid ==> agent
2005-05-12 13:52:09 +00:00
user . groups = [ ' Transports ' ]
2005-03-16 13:40:10 +00:00
elif user . groups == [ ] :
user . groups . append ( ' General ' )
2005-03-11 17:57:35 +00:00
2005-04-22 01:35:36 +00:00
if ( user . show == ' offline ' or user . show == ' error ' ) and \
2005-05-25 18:25:39 +00:00
not showOffline and ( not ' Transports ' in user . groups or \
gajim . connections [ account ] . connected < 2 ) and \
2005-04-22 01:35:36 +00:00
not self . plugin . queues [ account ] . has_key ( user . jid ) :
2005-03-11 17:57:35 +00:00
return
model = self . tree . get_model ( )
for g in user . groups :
iterG = self . get_group_iter ( g , account )
if not iterG :
IterAcct = self . get_account_iter ( account )
2005-04-20 23:27:33 +00:00
iterG = model . append ( IterAcct ,
2005-04-23 01:37:05 +00:00
( self . jabber_state_images [ ' closed ' ] , g , ' group ' , g , account , False ) )
2005-03-11 17:57:35 +00:00
if not self . groups [ account ] . has_key ( g ) : #It can probably never append
2005-05-18 16:30:59 +00:00
if account + g in self . collapsed_rows :
2005-04-22 01:35:36 +00:00
ishidden = False
2005-03-11 17:57:35 +00:00
else :
2005-04-22 01:35:36 +00:00
ishidden = True
self . groups [ account ] [ g ] = { ' expand ' : ishidden }
2005-05-18 16:30:59 +00:00
if not account in self . collapsed_rows and \
2005-04-22 01:35:36 +00:00
not gajim . config . get ( ' mergeaccounts ' ) :
2005-03-11 17:57:35 +00:00
self . tree . expand_row ( ( model . get_path ( iterG ) [ 0 ] ) , False )
typestr = ' user '
2005-05-12 13:52:09 +00:00
if g == ' Transports ' :
2005-03-11 17:57:35 +00:00
typestr = ' agent '
2005-04-23 01:37:05 +00:00
model . append ( iterG , ( self . jabber_state_images [ user . show ] , user . name ,
2005-04-22 01:35:36 +00:00
typestr , user . jid , account , False ) )
2005-03-11 17:57:35 +00:00
if self . groups [ account ] [ g ] [ ' expand ' ] :
2005-04-22 01:35:36 +00:00
self . tree . expand_row ( model . get_path ( iterG ) ,
False )
2005-04-23 00:37:51 +00:00
self . draw_contact ( jid , account )
2005-03-11 17:57:35 +00:00
2005-04-04 23:03:26 +00:00
def really_remove_user ( self , user , account ) :
2005-05-07 15:23:02 +00:00
if user . jid in self . newly_added [ account ] :
return
2005-05-25 18:25:39 +00:00
if user . jid . find ( ' @ ' ) < 1 and gajim . connections [ account ] . connected > 1 : # It's an agent
return
2005-04-04 23:03:26 +00:00
if user . jid in self . to_be_removed [ account ] :
self . to_be_removed [ account ] . remove ( user . jid )
2005-05-08 16:56:14 +00:00
if gajim . config . get ( ' showoffline ' ) :
self . draw_contact ( user . jid , account )
return
2005-04-13 09:41:44 +00:00
self . remove_user ( user , account )
2005-04-04 23:03:26 +00:00
2005-03-11 17:57:35 +00:00
def remove_user ( self , user , account ) :
2005-04-18 12:17:43 +00:00
''' Remove a user from the roster '''
2005-04-04 23:03:26 +00:00
if user . jid in self . to_be_removed [ account ] :
return
2005-03-11 17:57:35 +00:00
model = self . tree . get_model ( )
for i in self . get_user_iter ( user . jid , account ) :
parent_i = model . iter_parent ( i )
2005-03-19 11:32:29 +00:00
group = model . get_value ( parent_i , 3 )
2005-03-11 17:57:35 +00:00
model . remove ( i )
if model . iter_n_children ( parent_i ) == 0 :
model . remove ( parent_i )
2005-03-19 11:32:29 +00:00
# We need to check all contacts, even offline contacts
group_empty = True
for jid in self . contacts [ account ] :
if group in self . contacts [ account ] [ jid ] [ 0 ] . groups :
group_empty = False
break
if group_empty :
del self . groups [ account ] [ group ]
2005-03-11 17:57:35 +00:00
2005-04-23 01:37:05 +00:00
def get_appropriate_state_images ( self , jid ) :
''' check jid and return the appropriate state images dict '''
2005-05-25 17:13:50 +00:00
if not jid or not gajim . config . get ( ' use_transports_iconsets ' ) :
2005-05-25 10:28:27 +00:00
return self . jabber_state_images
host = jid . split ( ' @ ' ) [ - 1 ]
2005-06-06 10:52:51 +00:00
if host . startswith ( ' aim ' ) :
2005-05-25 10:28:27 +00:00
state_images = self . transports_state_images [ ' aim ' ]
2005-06-06 10:52:51 +00:00
elif host . startswith ( ' gadugadu ' ) :
2005-05-25 10:28:27 +00:00
state_images = self . transports_state_images [ ' gadugadu ' ]
2005-06-06 10:52:51 +00:00
elif host . startswith ( ' irc ' ) :
2005-05-27 16:56:46 +00:00
state_images = self . transports_state_images [ ' irc ' ]
2005-06-06 10:52:51 +00:00
elif host . startswith ( ' icq ' ) : # abc@icqsucks.org will match as ICQ, but what to do..
2005-05-25 10:28:27 +00:00
state_images = self . transports_state_images [ ' icq ' ]
2005-06-06 10:52:51 +00:00
elif host . startswith ( ' msn ' ) :
2005-05-25 10:28:27 +00:00
state_images = self . transports_state_images [ ' msn ' ]
2005-06-06 10:52:51 +00:00
elif host . startswith ( ' sms ' ) :
2005-05-27 16:56:46 +00:00
state_images = self . transports_state_images [ ' sms ' ]
2005-06-06 10:52:51 +00:00
elif host . startswith ( ' yahoo ' ) :
2005-05-25 10:28:27 +00:00
state_images = self . transports_state_images [ ' yahoo ' ]
else :
2005-05-04 16:22:07 +00:00
state_images = self . jabber_state_images
2005-04-23 01:37:05 +00:00
return state_images
2005-04-23 00:37:51 +00:00
def draw_contact ( self , jid , account ) :
''' draw the correct state image and name '''
2005-03-11 17:57:35 +00:00
model = self . tree . get_model ( )
iters = self . get_user_iter ( jid , account )
if len ( iters ) == 0 :
return
users = self . contacts [ account ] [ jid ]
name = users [ 0 ] . name
if len ( users ) > 1 :
2005-04-18 12:17:43 +00:00
name + = ' ( ' + str ( len ( users ) ) + ' ) '
2005-03-11 17:57:35 +00:00
prio = 0
user = users [ 0 ]
for u in users :
if u . priority > prio :
prio = u . priority
user = u
2005-04-23 01:37:05 +00:00
2005-05-25 10:28:27 +00:00
state_images = self . get_appropriate_state_images ( jid )
if self . plugin . queues [ account ] . has_key ( jid ) :
img = state_images [ ' message ' ]
elif jid . find ( ' @ ' ) < = 0 : # if not '@' or '@' starts the jid ==> agent
img = state_images [ user . show ]
else :
if user . sub == ' both ' :
img = state_images [ user . show ]
2005-03-11 17:57:35 +00:00
else :
2005-05-25 10:28:27 +00:00
if user . ask == ' subscribe ' :
img = state_images [ ' requested ' ]
2005-03-11 17:57:35 +00:00
else :
2005-05-25 10:28:27 +00:00
img = state_images [ ' not in the roster ' ]
for iter in iters :
2005-03-11 17:57:35 +00:00
model . set_value ( iter , 0 , img )
model . set_value ( iter , 1 , name )
2005-03-18 00:47:50 +00:00
def make_menu ( self ) :
2005-04-18 12:17:43 +00:00
''' create the main_window ' s menus '''
2005-03-11 17:57:35 +00:00
new_message_menuitem = self . xml . get_widget ( ' new_message_menuitem ' )
join_gc_menuitem = self . xml . get_widget ( ' join_gc_menuitem ' )
2005-03-28 01:39:12 +00:00
add_new_contact_menuitem = self . xml . get_widget ( ' add_new_contact_menuitem ' )
2005-03-23 13:25:48 +00:00
service_disco_menuitem = self . xml . get_widget ( ' service_disco_menuitem ' )
2005-03-28 01:39:12 +00:00
if self . add_new_contact_handler_id :
add_new_contact_menuitem . handler_disconnect ( self . add_new_contact_handler_id )
self . add_new_contact_handler_id = None
2005-03-23 13:25:48 +00:00
if self . service_disco_handler_id :
2005-04-20 23:27:33 +00:00
service_disco_menuitem . handler_disconnect (
2005-04-21 17:43:47 +00:00
self . service_disco_handler_id )
2005-03-23 13:25:48 +00:00
self . service_disco_handler_id = None
2005-03-14 18:23:50 +00:00
if self . join_gc_handler_id :
join_gc_menuitem . handler_disconnect ( self . join_gc_handler_id )
self . join_gc_handler_id = None
if self . new_message_menuitem_handler_id :
2005-04-20 23:27:33 +00:00
new_message_menuitem . handler_disconnect (
2005-04-21 17:43:47 +00:00
self . new_message_menuitem_handler_id )
2005-03-14 18:23:50 +00:00
self . new_message_menuitem_handler_id = None
#remove the existing submenus
2005-03-28 01:39:12 +00:00
if add_new_contact_menuitem . get_submenu ( ) :
add_new_contact_menuitem . remove_submenu ( )
2005-03-23 13:25:48 +00:00
if service_disco_menuitem . get_submenu ( ) :
service_disco_menuitem . remove_submenu ( )
2005-03-14 18:23:50 +00:00
if join_gc_menuitem . get_submenu ( ) :
join_gc_menuitem . remove_submenu ( )
if new_message_menuitem . get_submenu ( ) :
new_message_menuitem . remove_submenu ( )
2005-04-14 07:05:10 +00:00
if len ( gajim . connections ) > 0 :
2005-03-11 17:57:35 +00:00
new_message_menuitem . set_sensitive ( True )
join_gc_menuitem . set_sensitive ( True )
2005-03-28 01:39:12 +00:00
add_new_contact_menuitem . set_sensitive ( True )
2005-03-23 13:25:48 +00:00
service_disco_menuitem . set_sensitive ( True )
2005-03-11 17:57:35 +00:00
else :
new_message_menuitem . set_sensitive ( False )
join_gc_menuitem . set_sensitive ( False )
2005-03-28 01:39:12 +00:00
add_new_contact_menuitem . set_sensitive ( False )
2005-03-23 13:25:48 +00:00
service_disco_menuitem . set_sensitive ( False )
2005-04-14 07:05:10 +00:00
if len ( gajim . connections ) > = 2 : # 2 or more accounts? make submenus
2005-03-11 17:57:35 +00:00
#add
sub_menu = gtk . Menu ( )
2005-03-28 01:39:12 +00:00
add_new_contact_menuitem . set_submenu ( sub_menu )
2005-04-14 07:05:10 +00:00
for account in gajim . connections :
2005-03-27 19:39:50 +00:00
item = gtk . MenuItem ( _ ( ' to ' ) + account + _ ( ' account ' ) )
2005-03-11 17:57:35 +00:00
sub_menu . append ( item )
2005-04-14 07:05:10 +00:00
item . connect ( ' activate ' , self . on_add_new_contact , account )
2005-03-11 17:57:35 +00:00
sub_menu . show_all ( )
2005-03-27 19:39:50 +00:00
#disco
2005-03-11 17:57:35 +00:00
sub_menu = gtk . Menu ( )
2005-03-23 13:25:48 +00:00
service_disco_menuitem . set_submenu ( sub_menu )
2005-04-14 07:05:10 +00:00
for account in gajim . connections :
our_jid = gajim . config . get_per ( ' accounts ' , account , ' name ' ) + ' @ ' + \
gajim . config . get_per ( ' accounts ' , account , ' hostname ' )
2005-03-27 21:17:16 +00:00
item = gtk . MenuItem ( _ ( ' using ' ) + account + _ ( ' account ' ) )
2005-03-11 17:57:35 +00:00
sub_menu . append ( item )
2005-03-23 13:25:48 +00:00
item . connect ( ' activate ' , self . on_service_disco_menuitem_activate , account )
2005-03-11 17:57:35 +00:00
sub_menu . show_all ( )
#join gc
sub_menu = gtk . Menu ( )
join_gc_menuitem . set_submenu ( sub_menu )
2005-04-14 07:05:10 +00:00
for account in gajim . connections :
our_jid = gajim . config . get_per ( ' accounts ' , account , ' name ' ) + ' @ ' + \
gajim . config . get_per ( ' accounts ' , account , ' hostname ' )
2005-03-27 20:30:00 +00:00
item = gtk . MenuItem ( _ ( ' as ' ) + our_jid )
2005-03-11 17:57:35 +00:00
sub_menu . append ( item )
2005-04-14 07:05:10 +00:00
item . connect ( ' activate ' , self . on_join_gc_activate , account )
2005-03-11 17:57:35 +00:00
sub_menu . show_all ( )
#new message
sub_menu = gtk . Menu ( )
new_message_menuitem . set_submenu ( sub_menu )
2005-04-14 07:05:10 +00:00
for account in gajim . connections :
our_jid = gajim . config . get_per ( ' accounts ' , account , ' name ' ) + ' @ ' + \
gajim . config . get_per ( ' accounts ' , account , ' hostname ' )
2005-03-27 20:30:00 +00:00
item = gtk . MenuItem ( _ ( ' as ' ) + our_jid )
2005-03-11 17:57:35 +00:00
sub_menu . append ( item )
2005-04-20 23:27:33 +00:00
item . connect ( ' activate ' , self . on_new_message_menuitem_activate ,
2005-04-21 17:43:47 +00:00
account )
2005-03-11 17:57:35 +00:00
sub_menu . show_all ( )
2005-04-14 07:05:10 +00:00
elif len ( gajim . connections ) == 1 : # one account
2005-03-11 17:57:35 +00:00
#add
2005-03-28 01:39:12 +00:00
if not self . add_new_contact_handler_id :
2005-04-20 23:27:33 +00:00
self . add_new_contact_handler_id = add_new_contact_menuitem . connect (
2005-04-21 17:43:47 +00:00
' activate ' , self . on_add_new_contact , gajim . connections . keys ( ) [ 0 ] )
2005-03-27 19:39:50 +00:00
#disco
2005-03-23 13:25:48 +00:00
if not self . service_disco_handler_id :
2005-04-20 23:27:33 +00:00
self . service_disco_handler_id = service_disco_menuitem . connect (
' activate ' , self . on_service_disco_menuitem_activate ,
2005-04-14 07:05:10 +00:00
gajim . connections . keys ( ) [ 0 ] )
2005-03-11 17:57:35 +00:00
#join_gc
if not self . join_gc_handler_id :
2005-04-20 23:27:33 +00:00
self . join_gc_handler_id = join_gc_menuitem . connect (
2005-04-21 17:43:47 +00:00
' activate ' , self . on_join_gc_activate ,
gajim . connections . keys ( ) [ 0 ] )
2005-03-11 17:57:35 +00:00
if not self . new_message_menuitem_handler_id :
2005-04-20 23:27:33 +00:00
self . new_message_menuitem_handler_id = new_message_menuitem . \
connect ( ' activate ' , self . on_new_message_menuitem_activate ,
2005-04-14 07:05:10 +00:00
gajim . connections . keys ( ) [ 0 ] )
2005-03-11 17:57:35 +00:00
def draw_roster ( self ) :
2005-04-18 12:17:43 +00:00
''' Clear and draw roster '''
2005-03-18 00:47:50 +00:00
self . make_menu ( )
2005-03-11 17:57:35 +00:00
self . tree . get_model ( ) . clear ( )
2005-04-14 11:06:58 +00:00
for acct in gajim . connections :
2005-03-11 17:57:35 +00:00
self . add_account_to_roster ( acct )
for jid in self . contacts [ acct ] . keys ( ) :
self . add_user_to_roster ( jid , acct )
def mklists ( self , array , account ) :
2005-04-18 12:17:43 +00:00
''' fill self.contacts and self.groups '''
2005-03-11 17:57:35 +00:00
if not self . contacts . has_key ( account ) :
self . contacts [ account ] = { }
if not self . groups . has_key ( account ) :
self . groups [ account ] = { }
for jid in array . keys ( ) :
jids = jid . split ( ' / ' )
#get jid
ji = jids [ 0 ]
#get resource
resource = ' '
if len ( jids ) > 1 :
2005-05-11 09:12:18 +00:00
resource = ' / ' . join ( jids [ 1 : ] )
2005-03-11 17:57:35 +00:00
#get name
name = array [ jid ] [ ' name ' ]
if not name :
2005-04-18 12:17:43 +00:00
if ji . find ( ' @ ' ) < = 0 :
2005-03-11 17:57:35 +00:00
name = ji
else :
name = jid . split ( ' @ ' ) [ 0 ]
2005-04-26 18:47:14 +00:00
show = ' offline ' # show is offline by default
status = ' ' #no status message by default
2005-03-11 17:57:35 +00:00
2005-05-29 21:34:01 +00: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 ]
2005-04-26 18:47:14 +00:00
user1 = User ( ji , name , array [ jid ] [ ' groups ' ] , show , status , \
2005-05-29 21:34:01 +00:00
array [ jid ] [ ' subscription ' ] , array [ jid ] [ ' ask ' ] , resource , 0 ,
keyID )
2005-04-22 01:35:36 +00:00
2005-05-31 17:48:22 +00:00
# when we draw the roster, we avoid having the same contact
# more than once (eg. we avoid showing it twice with 2 resources)
2005-03-11 17:57:35 +00:00
self . contacts [ account ] [ ji ] = [ user1 ]
for g in array [ jid ] [ ' groups ' ] :
2005-04-22 01:35:36 +00:00
if g in self . groups [ account ] . keys ( ) :
continue
2005-05-18 16:30:59 +00:00
if account + g in self . collapsed_rows :
2005-04-22 01:35:36 +00:00
ishidden = False
else :
ishidden = True
self . groups [ account ] [ g ] = { ' expand ' : ishidden }
2005-03-11 17:57:35 +00:00
def chg_user_status ( self , user , show , status , account ) :
2005-04-18 12:17:43 +00:00
''' When a user change his status '''
2005-04-12 21:09:06 +00:00
showOffline = gajim . config . get ( ' showoffline ' )
2005-03-11 17:57:35 +00:00
model = self . tree . get_model ( )
2005-03-31 07:03:46 +00:00
luser = self . contacts [ account ] [ user . jid ]
user . show = show
user . status = status
2005-03-30 21:52:43 +00:00
if ( show == ' offline ' or show == ' error ' ) and \
2005-04-22 01:35:36 +00:00
not self . plugin . queues [ account ] . has_key ( user . jid ) :
2005-03-31 07:03:46 +00:00
if len ( luser ) > 1 :
luser . remove ( user )
2005-04-23 00:37:51 +00:00
self . draw_contact ( user . jid , account )
2005-03-30 21:52:43 +00:00
elif not showOffline :
2005-03-11 17:57:35 +00:00
self . remove_user ( user , account )
2005-03-30 21:52:43 +00:00
else :
2005-04-23 00:37:51 +00:00
self . draw_contact ( user . jid , account )
2005-03-11 17:57:35 +00:00
else :
if not self . get_user_iter ( user . jid , account ) :
self . add_user_to_roster ( user . jid , account )
2005-04-23 00:37:51 +00:00
self . draw_contact ( user . jid , account )
2005-05-27 15:12:58 +00:00
#print status in chat window and update status/GPG image
2005-03-11 17:57:35 +00:00
if self . plugin . windows [ account ] [ ' chats ' ] . has_key ( user . jid ) :
2005-05-03 16:39:27 +00:00
jid = user . jid
self . plugin . windows [ account ] [ ' chats ' ] [ jid ] . set_state_image ( jid )
2005-03-11 17:57:35 +00:00
name = user . name
if user . resource != ' ' :
2005-04-21 23:20:18 +00:00
name + = ' / ' + user . resource
2005-05-20 16:31:52 +00:00
uf_show = helpers . get_uf_show ( show )
2005-05-03 16:39:27 +00:00
self . plugin . windows [ account ] [ ' chats ' ] [ jid ] . print_conversation (
2005-05-20 16:04:12 +00:00
_ ( ' %s is now %s ( %s ) ' ) % ( name , uf_show , status ) , jid , ' status ' )
2005-03-11 17:57:35 +00:00
def on_info ( self , widget , user , account ) :
2005-04-18 12:17:43 +00:00
''' Call vcard_information_window class to display user ' s information '''
2005-04-22 01:35:36 +00:00
info = self . plugin . windows [ account ] [ ' infos ' ]
if info . has_key ( user . jid ) :
info [ user . jid ] . window . present ( )
2005-04-12 15:30:09 +00:00
else :
2005-04-22 01:47:03 +00:00
info [ user . jid ] = dialogs . Vcard_window ( user , self . plugin ,
account )
2005-03-11 17:57:35 +00:00
def on_agent_logging ( self , widget , jid , state , account ) :
2005-04-18 12:17:43 +00:00
''' When an agent is requested to log in or off '''
2005-04-14 09:38:08 +00:00
gajim . connections [ account ] . send_agent_status ( jid , state )
2005-03-11 17:57:35 +00:00
2005-05-25 22:15:28 +00:00
def on_edit_agent ( self , widget , user , account ) :
''' When we want to modify the agent registration '''
gajim . connections [ account ] . request_register_agent_info ( user . jid )
2005-05-11 09:12:18 +00:00
def on_remove_agent ( self , widget , user , account ) :
2005-04-18 12:17:43 +00:00
''' When an agent is requested to log in or off '''
2005-06-06 21:40:32 +00:00
window = dialogs . Confirmation_dialog ( _ ( ' Are you sure you want to unregister from " %s " transport? \n Contacts from that transport will also be removed ' ) % user . jid )
2005-03-11 17:57:35 +00:00
if window . get_response ( ) == gtk . RESPONSE_YES :
2005-05-11 09:12:18 +00:00
gajim . connections [ account ] . unsubscribe_agent ( user . jid + ' / ' \
+ user . resource )
2005-06-06 21:40:32 +00:00
# remove transport from listview
2005-05-11 09:12:18 +00:00
self . remove_user ( user , account )
2005-06-06 21:40:32 +00:00
# remove transport's contacts from listview
for jid , contacts in self . contacts [ account ] . items ( ) :
contact = contacts [ 0 ]
if jid . endswith ( ' @ ' + user . jid ) :
gajim . log . debug ( ' REMOVE user %s due to unregistered transport %s ' % ( contact . jid , user . name ) )
self . remove_user ( contact , account )
2005-05-11 09:12:18 +00:00
del self . contacts [ account ] [ user . jid ]
2005-03-11 17:57:35 +00:00
def on_rename ( self , widget , iter , path ) :
model = self . tree . get_model ( )
model . set_value ( iter , 5 , True )
self . tree . set_cursor ( path , self . tree . get_column ( 0 ) , True )
2005-05-29 21:34:01 +00:00
def on_assign_pgp_key ( self , widget , user , account ) :
attached_keys = gajim . config . get_per ( ' accounts ' , account ,
' attached_gpg_keys ' ) . split ( )
keys = { }
keyID = ' None '
for i in range ( 0 , len ( attached_keys ) / 2 ) :
keys [ attached_keys [ 2 * i ] ] = attached_keys [ 2 * i + 1 ]
if attached_keys [ 2 * i ] == user . jid :
keyID = attached_keys [ 2 * i + 1 ]
public_keys = gajim . connections [ account ] . ask_gpg_keys ( )
public_keys [ ' None ' ] = ' None '
w = dialogs . choose_gpg_key_dialog ( public_keys , keyID )
keyID = w . run ( )
if keyID == - 1 :
return
if keyID [ 0 ] == ' None ' and user . jid in keys :
del keys [ user . jid ]
else :
keys [ user . jid ] = keyID [ 0 ]
for u in self . contacts [ account ] [ user . jid ] :
u . keyID = keyID [ 0 ]
if self . plugin . windows [ account ] [ ' chats ' ] . has_key ( user . jid ) :
self . plugin . windows [ account ] [ ' chats ' ] [ user . jid ] . draw_widgets ( user )
keys_str = ' '
for jid in keys :
keys_str + = jid + ' ' + keys [ jid ]
gajim . config . set_per ( ' accounts ' , account , ' attached_gpg_keys ' , keys_str )
2005-03-17 17:41:09 +00:00
def on_edit_groups ( self , widget , user , account ) :
2005-04-14 17:07:55 +00:00
dlg = dialogs . Edit_groups_dialog ( user , account , self . plugin )
2005-03-17 17:41:09 +00:00
dlg . run ( )
2005-03-11 17:57:35 +00:00
def on_history ( self , widget , user ) :
2005-05-13 16:53:30 +00:00
''' When history menuitem is activated: call log window '''
if self . plugin . windows [ ' logs ' ] . has_key ( user . jid ) :
self . plugin . windows [ ' logs ' ] [ user . jid ] . window . present ( )
else :
2005-04-14 17:07:55 +00:00
self . plugin . windows [ ' logs ' ] [ user . jid ] = history_window . \
2005-05-13 16:53:30 +00:00
History_window ( self . plugin , user . jid )
2005-03-11 17:57:35 +00:00
def mk_menu_user ( self , event , iter ) :
2005-04-18 12:17:43 +00:00
''' Make user ' s popup menu '''
2005-03-11 17:57:35 +00:00
model = self . tree . get_model ( )
jid = model . get_value ( iter , 3 )
path = model . get_path ( iter )
account = model . get_value ( iter , 4 )
user = self . contacts [ account ] [ jid ] [ 0 ]
menu = gtk . Menu ( )
2005-03-17 17:41:09 +00:00
item = gtk . MenuItem ( _ ( ' Start chat ' ) )
menu . append ( item )
item . connect ( ' activate ' , self . on_roster_treeview_row_activated , path )
item = gtk . MenuItem ( _ ( ' Rename ' ) )
2005-03-11 17:57:35 +00:00
menu . append ( item )
2005-03-17 17:41:09 +00:00
item . connect ( ' activate ' , self . on_rename , iter , path )
2005-03-31 15:32:18 +00:00
if not ' not in the roster ' in user . groups :
2005-05-13 16:53:30 +00:00
item = gtk . MenuItem ( _ ( ' Edit Groups ' ) )
2005-03-31 15:32:18 +00:00
menu . append ( item )
item . connect ( ' activate ' , self . on_edit_groups , user , account )
2005-04-25 20:16:25 +00:00
item = gtk . MenuItem ( )
menu . append ( item )
2005-05-29 21:34:01 +00:00
if gajim . config . get ( ' usegpg ' ) :
item = gtk . MenuItem ( _ ( ' Assign OpenPGP key ' ) )
menu . append ( item )
item . connect ( ' activate ' , self . on_assign_pgp_key , user , account )
item = gtk . MenuItem ( )
menu . append ( item )
2005-04-25 20:16:25 +00:00
item = gtk . MenuItem ( _ ( ' Subscription ' ) )
menu . append ( item )
sub_menu = gtk . Menu ( )
item . set_submenu ( sub_menu )
2005-05-13 16:53:30 +00:00
item = gtk . MenuItem ( _ ( ' Resend Authorization to ' ) )
2005-04-25 20:16:25 +00:00
sub_menu . append ( item )
item . connect ( ' activate ' , self . authorize , jid , account )
2005-05-13 16:53:30 +00:00
item = gtk . MenuItem ( _ ( ' Rerequest Authorization from ' ) )
2005-04-25 20:16:25 +00:00
sub_menu . append ( item )
item . connect ( ' activate ' , self . req_sub , jid ,
2005-05-17 11:55:30 +00:00
_ ( ' I would like to add you to my roster ' ) , account )
2005-04-25 20:16:25 +00:00
else :
item = gtk . MenuItem ( )
menu . append ( item )
2005-05-13 16:53:30 +00:00
item = gtk . MenuItem ( _ ( ' Add to Roster ' ) )
2005-04-25 20:16:25 +00:00
menu . append ( item )
item . connect ( ' activate ' , self . on_add_to_roster , user , account )
2005-03-17 17:41:09 +00:00
item = gtk . MenuItem ( _ ( ' Remove ' ) )
2005-03-11 17:57:35 +00:00
menu . append ( item )
2005-03-17 17:41:09 +00:00
item . connect ( ' activate ' , self . on_req_usub , user , account )
2005-03-11 17:57:35 +00:00
item = gtk . MenuItem ( )
menu . append ( item )
2005-03-17 17:41:09 +00:00
item = gtk . MenuItem ( _ ( ' Information ' ) )
2005-03-11 17:57:35 +00:00
menu . append ( item )
2005-03-17 17:41:09 +00:00
item . connect ( ' activate ' , self . on_info , user , account )
item = gtk . MenuItem ( _ ( ' History ' ) )
2005-03-11 17:57:35 +00:00
menu . append ( item )
2005-03-17 17:41:09 +00:00
item . connect ( ' activate ' , self . on_history , user )
2005-03-11 17:57:35 +00:00
menu . popup ( None , None , None , event . button , event . time )
menu . show_all ( )
menu . reposition ( )
def mk_menu_g ( self , event , iter ) :
2005-04-18 12:17:43 +00:00
''' Make group ' s popup menu '''
2005-03-11 17:57:35 +00:00
model = self . tree . get_model ( )
path = model . get_path ( iter )
menu = gtk . Menu ( )
item = gtk . MenuItem ( _ ( ' Rename ' ) )
menu . append ( item )
item . connect ( ' activate ' , self . on_rename , iter , path )
menu . popup ( None , None , None , event . button , event . time )
menu . show_all ( )
menu . reposition ( )
def mk_menu_agent ( self , event , iter ) :
2005-04-18 12:17:43 +00:00
''' Make agent ' s popup menu '''
2005-03-11 17:57:35 +00:00
model = self . tree . get_model ( )
jid = model . get_value ( iter , 3 )
path = model . get_path ( iter )
account = model . get_value ( iter , 4 )
2005-05-11 09:12:18 +00:00
user = self . contacts [ account ] [ jid ] [ 0 ]
2005-03-11 17:57:35 +00:00
menu = gtk . Menu ( )
2005-06-03 10:31:21 +00:00
item = gtk . MenuItem ( _ ( ' _Log on ' ) )
2005-05-25 10:28:27 +00:00
show = self . contacts [ account ] [ jid ] [ 0 ] . show
if show != ' offline ' and show != ' error ' :
2005-03-11 17:57:35 +00:00
item . set_sensitive ( False )
menu . append ( item )
2005-06-03 22:49:07 +00:00
item . connect ( ' activate ' , self . on_agent_logging , jid , None , account )
2005-03-11 17:57:35 +00:00
2005-06-03 10:31:21 +00:00
item = gtk . MenuItem ( _ ( ' Log _off ' ) )
2005-05-25 10:28:27 +00:00
if show == ' offline ' or show == ' error ' :
2005-03-11 17:57:35 +00:00
item . set_sensitive ( False )
menu . append ( item )
2005-04-20 23:27:33 +00:00
item . connect ( ' activate ' , self . on_agent_logging , jid , ' unavailable ' ,
2005-04-21 17:43:47 +00:00
account )
2005-03-11 17:57:35 +00:00
item = gtk . MenuItem ( )
menu . append ( item )
2005-05-25 22:15:28 +00:00
item = gtk . MenuItem ( _ ( ' _Edit ' ) )
menu . append ( item )
item . connect ( ' activate ' , self . on_edit_agent , user , account )
item = gtk . MenuItem ( _ ( ' _Remove ' ) )
2005-03-11 17:57:35 +00:00
menu . append ( item )
2005-05-11 09:12:18 +00:00
item . connect ( ' activate ' , self . on_remove_agent , user , account )
2005-03-11 17:57:35 +00:00
menu . popup ( None , None , None , event . button , event . time )
menu . show_all ( )
menu . reposition ( )
def on_edit_account ( self , widget , account ) :
2005-04-20 16:35:40 +00:00
if self . plugin . windows [ account ] . has_key ( ' account_modification ' ) :
self . plugin . windows [ account ] [ ' account_modification ' ] . window . present ( )
2005-04-17 18:36:09 +00:00
else :
2005-04-20 16:35:40 +00:00
self . plugin . windows [ account ] [ ' account_modification ' ] = \
2005-04-14 23:00:25 +00:00
config . Account_modification_window ( self . plugin , account )
2005-03-11 17:57:35 +00:00
def mk_menu_account ( self , event , iter ) :
2005-04-18 12:17:43 +00:00
''' Make account ' s popup menu '''
2005-03-11 17:57:35 +00:00
model = self . tree . get_model ( )
account = model . get_value ( iter , 3 )
menu = gtk . Menu ( )
2005-03-27 18:01:41 +00:00
item = gtk . MenuItem ( _ ( ' Status ' ) )
2005-03-11 17:57:35 +00:00
menu . append ( item )
sub_menu = gtk . Menu ( )
item . set_submenu ( sub_menu )
2005-03-27 18:01:41 +00:00
item = gtk . MenuItem ( _ ( ' Online ' ) )
2005-03-11 17:57:35 +00:00
sub_menu . append ( item )
2005-03-27 18:01:41 +00:00
item . connect ( ' activate ' , self . change_status , account , ' online ' )
2005-04-18 23:55:13 +00:00
item = gtk . MenuItem ( _ ( ' Free for chat ' ) )
sub_menu . append ( item )
item . connect ( ' activate ' , self . change_status , account , ' chat ' )
2005-03-27 18:01:41 +00:00
item = gtk . MenuItem ( _ ( ' Away ' ) )
2005-03-11 17:57:35 +00:00
sub_menu . append ( item )
2005-03-27 18:01:41 +00:00
item . connect ( ' activate ' , self . change_status , account , ' away ' )
2005-05-13 16:53:30 +00:00
item = gtk . MenuItem ( _ ( ' Not Available ' ) )
2005-03-11 17:57:35 +00:00
sub_menu . append ( item )
2005-03-27 18:01:41 +00:00
item . connect ( ' activate ' , self . change_status , account , ' xa ' )
2005-04-18 23:55:13 +00:00
item = gtk . MenuItem ( _ ( ' Busy ' ) )
2005-03-11 17:57:35 +00:00
sub_menu . append ( item )
2005-03-27 18:01:41 +00:00
item . connect ( ' activate ' , self . change_status , account , ' dnd ' )
item = gtk . MenuItem ( _ ( ' Invisible ' ) )
2005-03-11 17:57:35 +00:00
sub_menu . append ( item )
2005-03-27 18:01:41 +00:00
item . connect ( ' activate ' , self . change_status , account , ' invisible ' )
2005-03-11 17:57:35 +00:00
item = gtk . MenuItem ( )
sub_menu . append ( item )
2005-03-27 18:01:41 +00:00
item = gtk . MenuItem ( _ ( ' Offline ' ) )
2005-03-11 17:57:35 +00:00
sub_menu . append ( item )
2005-03-27 18:01:41 +00:00
item . connect ( ' activate ' , self . change_status , account , ' offline ' )
2005-03-11 17:57:35 +00:00
item = gtk . MenuItem ( )
menu . append ( item )
2005-05-13 16:53:30 +00:00
item = gtk . MenuItem ( _ ( ' _Edit Account ' ) )
2005-03-11 17:57:35 +00:00
menu . append ( item )
2005-03-27 18:01:41 +00:00
item . connect ( ' activate ' , self . on_edit_account , account )
2005-05-13 16:53:30 +00:00
item = gtk . MenuItem ( _ ( ' _Service Discovery ' ) )
2005-03-11 17:57:35 +00:00
menu . append ( item )
2005-03-27 18:01:41 +00:00
item . connect ( ' activate ' , self . on_service_disco_menuitem_activate , account )
2005-05-13 16:53:30 +00:00
item = gtk . MenuItem ( _ ( ' _Add Contact ' ) )
2005-03-11 17:57:35 +00:00
menu . append ( item )
2005-03-28 01:39:12 +00:00
item . connect ( ' activate ' , self . on_add_new_contact , account )
2005-05-13 16:53:30 +00:00
item = gtk . MenuItem ( _ ( ' Join _Groupchat ' ) )
2005-03-16 17:08:38 +00:00
menu . append ( item )
2005-03-27 18:01:41 +00:00
item . connect ( ' activate ' , self . on_join_gc_activate , account )
2005-05-13 16:53:30 +00:00
item = gtk . MenuItem ( _ ( ' _New Message ' ) )
2005-03-11 17:57:35 +00:00
menu . append ( item )
2005-03-27 18:01:41 +00:00
item . connect ( ' activate ' , self . on_new_message_menuitem_activate , account )
2005-03-16 17:08:38 +00:00
2005-03-11 17:57:35 +00:00
menu . popup ( None , None , None , event . button , event . time )
menu . show_all ( )
menu . reposition ( )
2005-04-25 20:16:25 +00:00
def on_add_to_roster ( self , widget , user , account ) :
dialogs . Add_new_contact_window ( self . plugin , account , user . jid )
2005-03-11 17:57:35 +00:00
def authorize ( self , widget , jid , account ) :
2005-04-18 12:17:43 +00:00
''' Authorize a user '''
2005-04-14 09:38:08 +00:00
gajim . connections [ account ] . send_authorization ( jid )
2005-03-11 17:57:35 +00:00
2005-04-21 23:20:18 +00:00
def req_sub ( self , widget , jid , txt , account , group = None , pseudo = None ) :
2005-04-18 12:17:43 +00:00
''' Request subscription to a user '''
2005-03-11 17:57:35 +00:00
if not pseudo :
pseudo = jid
2005-04-14 09:38:08 +00:00
gajim . connections [ account ] . request_subscription ( jid , txt )
2005-04-25 20:16:25 +00:00
if not group :
group = ' General '
2005-03-11 17:57:35 +00:00
if not self . contacts [ account ] . has_key ( jid ) :
2005-05-29 21:34:01 +00: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 ]
2005-04-21 17:43:47 +00:00
user1 = User ( jid , pseudo , [ group ] , ' requested ' , ' requested ' ,
2005-05-29 21:34:01 +00:00
' none ' , ' subscribe ' , ' ' , 0 , keyID )
2005-03-11 17:57:35 +00:00
self . contacts [ account ] [ jid ] = [ user1 ]
2005-04-25 20:16:25 +00:00
else :
user1 = self . contacts [ account ] [ jid ] [ 0 ]
if not ' not in the roster ' in user1 . groups :
return
user1 . groups = [ group ]
user1 . name = pseudo
self . remove_user ( user1 , account )
self . add_user_to_roster ( jid , account )
2005-03-11 17:57:35 +00:00
2005-03-26 20:46:23 +00:00
def on_roster_treeview_key_press_event ( self , widget , event ) :
2005-04-18 12:17:43 +00:00
''' when a key is pressed in the treeviews '''
2005-03-11 17:57:35 +00:00
if event . keyval == gtk . keysyms . Escape :
self . tree . get_selection ( ) . unselect_all ( )
if event . keyval == gtk . keysyms . F2 :
treeselection = self . tree . get_selection ( )
model , iter = treeselection . get_selected ( )
if not iter :
return
type = model . get_value ( iter , 2 )
if type == ' user ' or type == ' group ' :
path = model . get_path ( iter )
model . set_value ( iter , 5 , True )
self . tree . set_cursor ( path , self . tree . get_column ( 0 ) , True )
if event . keyval == gtk . keysyms . Delete :
treeselection = self . tree . get_selection ( )
model , iter = treeselection . get_selected ( )
if not iter :
return
jid = model . get_value ( iter , 3 )
account = model . get_value ( iter , 4 )
type = model . get_value ( iter , 2 )
if type == ' user ' :
user = self . contacts [ account ] [ jid ] [ 0 ]
self . on_req_usub ( widget , user , account )
elif type == ' agent ' :
self . on_remove_agent ( widget , jid , account )
return False
def on_roster_treeview_button_press_event ( self , widget , event ) :
2005-05-18 01:00:13 +00:00
''' popup contact ' s, group ' s or agent ' s menu '''
2005-03-11 17:57:35 +00:00
if event . type == gtk . gdk . BUTTON_PRESS :
2005-03-26 20:46:23 +00:00
if event . button == 3 : # Right click
2005-03-11 17:57:35 +00:00
try :
2005-04-20 23:27:33 +00:00
path , column , x , y = self . tree . get_path_at_pos ( int ( event . x ) ,
2005-05-18 00:44:39 +00:00
int ( event . y ) )
2005-03-11 17:57:35 +00:00
except TypeError :
self . tree . get_selection ( ) . unselect_all ( )
return
2005-05-18 00:44:39 +00:00
self . tree . get_selection ( ) . select_path ( path )
2005-03-11 17:57:35 +00:00
model = self . tree . get_model ( )
iter = model . get_iter ( path )
type = model . get_value ( iter , 2 )
if type == ' group ' :
self . mk_menu_g ( event , iter )
elif type == ' agent ' :
self . mk_menu_agent ( event , iter )
elif type == ' user ' :
self . mk_menu_user ( event , iter )
elif type == ' account ' :
self . mk_menu_account ( event , iter )
2005-05-18 00:44:39 +00:00
return True
2005-03-26 20:46:23 +00:00
if event . button == 1 : # Left click
2005-03-11 17:57:35 +00:00
try :
2005-04-20 23:27:33 +00:00
path , column , x , y = self . tree . get_path_at_pos ( int ( event . x ) ,
2005-05-18 01:00:13 +00:00
int ( event . y ) )
2005-03-11 17:57:35 +00:00
except TypeError :
self . tree . get_selection ( ) . unselect_all ( )
return False
model = self . tree . get_model ( )
iter = model . get_iter ( path )
type = model . get_value ( iter , 2 )
2005-04-05 15:06:11 +00:00
if ( type == ' group ' ) :
2005-04-01 00:28:45 +00:00
if x < 20 : # first cell in 1st column (the arrow SINGLE clicked)
2005-03-11 17:57:35 +00:00
if ( self . tree . row_expanded ( path ) ) :
self . tree . collapse_row ( path )
else :
self . tree . expand_row ( path , False )
def on_req_usub ( self , widget , user , account ) :
2005-04-18 12:17:43 +00:00
''' Remove a user '''
window = dialogs . Confirmation_dialog ( _ ( ' Are you sure you want to remove %s ( %s ) from your roster? ' ) % ( user . name , user . jid ) )
2005-03-11 17:57:35 +00:00
if window . get_response ( ) == gtk . RESPONSE_YES :
2005-04-14 09:38:08 +00:00
gajim . connections [ account ] . unsubscribe ( user . jid )
2005-03-11 17:57:35 +00:00
for u in self . contacts [ account ] [ user . jid ] :
self . remove_user ( u , account )
del self . contacts [ account ] [ u . jid ]
2005-05-30 20:16:29 +00:00
def forget_gpg_passphrase ( self , keyid ) :
if self . gpg_passphrase . has_key ( keyid ) :
del self . gpg_passphrase [ keyid ]
return False
2005-03-11 17:57:35 +00:00
2005-05-12 00:22:36 +00:00
def send_status ( self , account , status , txt ) :
2005-03-11 17:57:35 +00:00
if status != ' offline ' :
2005-04-14 07:20:14 +00:00
if gajim . connections [ account ] . connected < 2 :
2005-03-11 17:57:35 +00:00
model = self . tree . get_model ( )
accountIter = self . get_account_iter ( account )
if accountIter :
2005-04-23 01:37:05 +00:00
model . set_value ( accountIter , 0 , self . jabber_state_images [ ' connecting ' ] )
2005-03-29 17:57:07 +00:00
if self . plugin . systray_enabled :
self . plugin . systray . set_status ( ' connecting ' )
2005-03-11 17:57:35 +00:00
2005-04-14 07:05:10 +00:00
save_pass = gajim . config . get_per ( ' accounts ' , account , ' savepass ' )
2005-04-14 07:20:14 +00:00
if not save_pass and gajim . connections [ account ] . connected < 2 :
2005-03-11 17:57:35 +00:00
passphrase = ' '
2005-04-21 17:43:47 +00:00
w = dialogs . Passphrase_dialog (
2005-06-03 10:28:53 +00:00
_ ( ' Password Required ' ) ,
2005-04-21 17:43:47 +00:00
_ ( ' Enter your password for account %s ' ) % account ,
2005-06-03 10:28:53 +00:00
_ ( ' Save password ' ) )
2005-03-15 10:20:10 +00:00
passphrase , save = w . run ( )
2005-03-11 17:57:35 +00:00
if passphrase == - 1 :
if accountIter :
2005-04-23 01:37:05 +00:00
model . set_value ( accountIter , 0 , self . jabber_state_images [ ' offline ' ] )
2005-04-14 11:06:58 +00:00
# gajim.connections[account].connected = 0
2005-06-03 17:35:48 +00:00
if self . plugin . systray_enabled :
self . plugin . systray . set_status ( ' offline ' )
2005-03-31 23:26:05 +00:00
self . update_status_comboxbox ( )
2005-03-11 17:57:35 +00:00
return
2005-04-14 09:38:08 +00:00
gajim . connections [ account ] . password = passphrase
2005-03-11 17:57:35 +00:00
if save :
2005-04-14 07:05:10 +00:00
gajim . config . set_per ( ' accounts ' , account , ' savepass ' , True )
gajim . config . set_per ( ' accounts ' , account , ' password ' , passphrase )
2005-03-11 17:57:35 +00:00
keyid = None
save_gpg_pass = 0
2005-04-20 23:27:33 +00:00
save_gpg_pass = gajim . config . get_per ( ' accounts ' , account ,
2005-04-14 07:05:10 +00:00
' savegpgpass ' )
keyid = gajim . config . get_per ( ' accounts ' , account , ' keyid ' )
2005-04-14 07:20:14 +00:00
if keyid and gajim . connections [ account ] . connected < 2 and \
2005-04-12 21:09:06 +00:00
gajim . config . get ( ' usegpg ' ) :
2005-03-11 17:57:35 +00:00
if save_gpg_pass :
2005-04-20 23:27:33 +00:00
passphrase = gajim . config . get_per ( ' accounts ' , account ,
2005-04-21 17:43:47 +00:00
' gpgpassword ' )
2005-03-11 17:57:35 +00:00
else :
2005-05-30 20:16:29 +00:00
if self . gpg_passphrase . has_key ( keyid ) :
passphrase = self . gpg_passphrase [ keyid ]
save = False
else :
w = dialogs . Passphrase_dialog (
2005-06-03 10:28:53 +00:00
_ ( ' Passphrase Required ' ) ,
2005-05-30 20:16:29 +00:00
_ ( ' Enter GPG key passphrase for account %s ' ) % account ,
2005-06-03 10:28:53 +00:00
_ ( ' Save passphrase ' ) )
2005-05-30 20:16:29 +00:00
passphrase , save = w . run ( )
2005-03-11 17:57:35 +00:00
if passphrase == - 1 :
passphrase = ' '
2005-05-30 20:16:29 +00:00
else :
self . gpg_passphrase [ keyid ] = passphrase
gobject . timeout_add ( 30000 , self . forget_gpg_passphrase , keyid )
2005-03-11 17:57:35 +00:00
if save :
2005-04-14 07:05:10 +00:00
gajim . config . set_per ( ' accounts ' , account , ' savegpgpass ' , True )
2005-04-20 23:27:33 +00:00
gajim . config . set_per ( ' accounts ' , account , ' gpgpassword ' ,
2005-04-21 17:43:47 +00:00
passphrase )
2005-04-14 09:38:08 +00:00
gajim . connections [ account ] . gpg_passphrase ( passphrase )
gajim . connections [ account ] . change_status ( status , txt )
2005-03-11 17:57:35 +00:00
for room_jid in self . plugin . windows [ account ] [ ' gc ' ] :
if room_jid != ' tabbed ' :
nick = self . plugin . windows [ account ] [ ' gc ' ] [ room_jid ] . nicks [ room_jid ]
2005-04-20 23:27:33 +00:00
gajim . connections [ account ] . send_gc_status ( nick , room_jid , status ,
2005-04-21 17:43:47 +00:00
txt )
2005-03-11 17:57:35 +00:00
if status == ' online ' and self . plugin . sleeper . getState ( ) != \
common . sleepy . STATE_UNKNOWN :
self . plugin . sleeper_state [ account ] = 1
else :
self . plugin . sleeper_state [ account ] = 0
2005-05-27 05:56:17 +00:00
def get_status_message ( self , show ) :
if ( show == ' online ' and not gajim . config . get ( ' ask_online_status ' ) ) or \
( show == ' offline ' and not gajim . config . get ( ' ask_offline_status ' ) ) :
lowered_uf_status_msg = helpers . get_uf_show ( show ) . lower ( )
2005-06-05 23:17:59 +00:00
return _ ( " I ' m %s " ) % lowered_uf_status_msg
2005-05-27 05:56:17 +00:00
dlg = dialogs . Change_status_message_dialog ( self . plugin , show )
2005-03-16 01:27:37 +00:00
message = dlg . run ( )
2005-03-11 17:57:35 +00:00
return message
def change_status ( self , widget , account , status ) :
message = self . get_status_message ( status )
if message == - 1 :
return
self . send_status ( account , status , message )
2005-03-31 23:26:05 +00:00
def on_status_combobox_changed ( self , widget ) :
2005-04-18 12:17:43 +00:00
''' When we change our status '''
2005-03-31 23:26:05 +00:00
model = self . status_combobox . get_model ( )
active = self . status_combobox . get_active ( )
2005-03-11 17:57:35 +00:00
if active < 0 :
return
2005-04-14 07:05:10 +00:00
accounts = gajim . connections . keys ( )
2005-03-11 17:57:35 +00:00
if len ( accounts ) == 0 :
2005-04-14 17:07:55 +00:00
dialogs . Error_dialog ( _ ( ' You must create an account before connecting to jabber network. ' ) )
2005-03-31 23:26:05 +00:00
self . update_status_comboxbox ( )
2005-03-11 17:57:35 +00:00
return
2005-03-30 19:20:20 +00:00
status = model [ active ] [ 2 ]
2005-03-11 17:57:35 +00:00
message = self . get_status_message ( status )
if message == - 1 :
2005-03-31 23:26:05 +00:00
self . update_status_comboxbox ( )
2005-03-11 17:57:35 +00:00
return
for acct in accounts :
2005-04-20 23:27:33 +00:00
if not gajim . config . get_per ( ' accounts ' , acct ,
2005-04-21 17:43:47 +00:00
' sync_with_global_status ' ) :
2005-04-14 07:05:10 +00:00
continue
2005-03-11 17:57:35 +00:00
self . send_status ( acct , status , message )
2005-03-31 23:26:05 +00:00
def update_status_comboxbox ( self ) :
2005-03-11 17:57:35 +00:00
#table to change index in plugin.connected to index in combobox
2005-04-18 22:25:22 +00:00
table = { 0 : 6 , 1 : 6 , 2 : 0 , 3 : 1 , 4 : 2 , 5 : 3 , 6 : 4 , 7 : 5 }
2005-03-11 17:57:35 +00:00
maxi = 0
2005-04-14 07:20:14 +00:00
for account in gajim . connections :
if gajim . connections [ account ] . connected > maxi :
maxi = gajim . connections [ account ] . connected
2005-03-11 17:57:35 +00:00
#temporarily block signal in order not to send status that we show
#in the combobox
2005-03-31 23:26:05 +00:00
self . status_combobox . handler_block ( self . id_signal_cb )
self . status_combobox . set_active ( table [ maxi ] )
self . status_combobox . handler_unblock ( self . id_signal_cb )
2005-04-21 17:43:47 +00:00
statuss = [ ' offline ' , ' connecting ' , ' online ' , ' chat ' , ' away ' ,
' xa ' , ' dnd ' , ' invisible ' ]
2005-03-29 17:57:07 +00:00
if self . plugin . systray_enabled :
self . plugin . systray . set_status ( statuss [ maxi ] )
2005-03-11 17:57:35 +00:00
def on_status_changed ( self , account , status ) :
2005-04-18 12:17:43 +00:00
''' the core tells us that our status has changed '''
2005-03-11 17:57:35 +00:00
if not self . contacts . has_key ( account ) :
return
model = self . tree . get_model ( )
accountIter = self . get_account_iter ( account )
if accountIter :
2005-04-23 01:37:05 +00:00
model . set_value ( accountIter , 0 , self . jabber_state_images [ status ] )
2005-03-11 17:57:35 +00:00
if status == ' offline ' :
for jid in self . contacts [ account ] :
luser = self . contacts [ account ] [ jid ]
2005-03-31 07:03:46 +00:00
luser_copy = [ ]
2005-03-11 17:57:35 +00:00
for user in luser :
2005-03-31 07:03:46 +00:00
luser_copy . append ( user )
for user in luser_copy :
2005-03-11 17:57:35 +00:00
self . chg_user_status ( user , ' offline ' , ' Disconnected ' , account )
2005-03-31 23:26:05 +00:00
self . update_status_comboxbox ( )
2005-03-11 17:57:35 +00:00
def new_chat ( self , user , account ) :
2005-04-12 21:09:06 +00:00
if gajim . config . get ( ' usetabbedchat ' ) :
2005-03-11 17:57:35 +00:00
if not self . plugin . windows [ account ] [ ' chats ' ] . has_key ( ' tabbed ' ) :
self . plugin . windows [ account ] [ ' chats ' ] [ ' tabbed ' ] = \
2005-04-14 17:07:55 +00:00
tabbed_chat_window . Tabbed_chat_window ( user , self . plugin , account )
2005-03-11 17:57:35 +00:00
else :
self . plugin . windows [ account ] [ ' chats ' ] [ ' tabbed ' ] . new_user ( user )
2005-03-12 15:50:13 +00:00
2005-03-11 17:57:35 +00:00
self . plugin . windows [ account ] [ ' chats ' ] [ user . jid ] = \
self . plugin . windows [ account ] [ ' chats ' ] [ ' tabbed ' ]
else :
self . plugin . windows [ account ] [ ' chats ' ] [ user . jid ] = \
2005-04-14 17:07:55 +00:00
tabbed_chat_window . Tabbed_chat_window ( user , self . plugin , account )
2005-03-11 17:57:35 +00:00
2005-04-23 14:26:04 +00:00
def new_room ( self , jid , nick , account ) :
2005-04-12 21:09:06 +00:00
if gajim . config . get ( ' usetabbedchat ' ) :
2005-03-11 17:57:35 +00:00
if not self . plugin . windows [ account ] [ ' gc ' ] . has_key ( ' tabbed ' ) :
self . plugin . windows [ account ] [ ' gc ' ] [ ' tabbed ' ] = \
2005-04-20 23:27:33 +00:00
groupchat_window . Groupchat_window ( jid , nick , self . plugin ,
2005-04-21 17:43:47 +00:00
account )
2005-03-11 17:57:35 +00:00
else :
2005-04-23 14:26:04 +00:00
self . plugin . windows [ account ] [ ' gc ' ] [ ' tabbed ' ] . new_room ( jid , nick )
2005-03-11 17:57:35 +00:00
self . plugin . windows [ account ] [ ' gc ' ] [ jid ] = \
self . plugin . windows [ account ] [ ' gc ' ] [ ' tabbed ' ]
else :
2005-03-20 09:47:15 +00:00
self . plugin . windows [ account ] [ ' gc ' ] [ jid ] = \
2005-04-14 17:07:55 +00:00
groupchat_window . Groupchat_window ( jid , nick , self . plugin , account )
2005-03-11 17:57:35 +00:00
2005-05-30 10:41:55 +00:00
def on_message ( self , jid , msg , tim , account , encrypted = False ) :
2005-04-18 12:17:43 +00:00
''' when we receive a message '''
2005-03-11 17:57:35 +00:00
if not self . contacts [ account ] . has_key ( jid ) :
2005-05-29 21:34:01 +00: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 ]
2005-04-21 17:43:47 +00:00
user1 = User ( jid , jid , [ ' not in the roster ' ] , ' not in the roster ' ,
2005-05-29 21:34:01 +00:00
' not in the roster ' , ' none ' , None , ' ' , 0 , keyID )
2005-05-31 17:48:22 +00:00
self . contacts [ account ] [ jid ] = [ user1 ]
2005-03-11 17:57:35 +00:00
self . add_user_to_roster ( jid , account )
iters = self . get_user_iter ( jid , account )
if iters :
path = self . tree . get_model ( ) . get_path ( iters [ 0 ] )
else :
path = None
2005-04-12 21:09:06 +00:00
autopopup = gajim . config . get ( ' autopopup ' )
autopopupaway = gajim . config . get ( ' autopopupaway ' )
2005-06-03 20:07:00 +00:00
# Do we have a queue ?
no_queue = True
if self . plugin . queues [ account ] . has_key ( jid ) :
no_queue = False
2005-06-03 21:24:59 +00:00
if self . plugin . windows [ account ] [ ' chats ' ] . has_key ( jid ) :
self . plugin . windows [ account ] [ ' chats ' ] [ jid ] . print_conversation ( msg ,
jid , tim = tim , encrypted = encrypted )
return
2005-06-03 20:07:00 +00:00
#We save it in a queue
if not self . plugin . queues [ account ] . has_key ( jid ) :
self . plugin . queues [ account ] [ jid ] = Queue . Queue ( 50 )
self . plugin . queues [ account ] [ jid ] . put ( ( msg , tim , encrypted ) )
self . nb_unread + = 1
2005-04-17 21:31:18 +00:00
if ( not autopopup or ( not autopopupaway and \
2005-04-14 07:20:14 +00:00
gajim . connections [ account ] . connected > 2 ) ) and not \
2005-03-11 17:57:35 +00:00
self . plugin . windows [ account ] [ ' chats ' ] . has_key ( jid ) :
2005-06-03 20:07:00 +00:00
if no_queue : #We didn't have a queue: we change icons
2005-03-11 17:57:35 +00:00
model = self . tree . get_model ( )
2005-04-23 00:37:51 +00:00
self . draw_contact ( jid , account )
2005-03-29 16:16:42 +00:00
if self . plugin . systray_enabled :
self . plugin . systray . add_jid ( jid , account )
2005-06-03 20:07:00 +00:00
self . show_title ( ) # we show the * or [n]
2005-03-11 17:57:35 +00:00
if not path :
self . add_user_to_roster ( jid , account )
iters = self . get_user_iter ( jid , account )
path = self . tree . get_model ( ) . get_path ( iters [ 0 ] )
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 :
if not self . plugin . windows [ account ] [ ' chats ' ] . has_key ( jid ) :
self . new_chat ( self . contacts [ account ] [ jid ] [ 0 ] , account )
if path :
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 )
def on_preferences_menuitem_activate ( self , widget ) :
2005-03-26 21:09:49 +00:00
if self . plugin . windows [ ' preferences ' ] . window . get_property ( ' visible ' ) :
2005-04-06 19:46:39 +00:00
self . plugin . windows [ ' preferences ' ] . window . present ( )
2005-03-26 21:09:49 +00:00
else :
self . plugin . windows [ ' preferences ' ] . window . show_all ( )
2005-03-11 17:57:35 +00:00
2005-03-28 01:39:12 +00:00
def on_add_new_contact ( self , widget , account ) :
2005-04-14 17:07:55 +00:00
dialogs . Add_new_contact_window ( self . plugin , account )
2005-03-11 17:57:35 +00:00
2005-03-16 17:08:38 +00:00
def on_join_gc_activate ( self , widget , account ) :
2005-04-21 18:53:16 +00:00
if self . plugin . windows [ account ] . has_key ( ' join_gc ' ) :
self . plugin . windows [ account ] [ ' join_gc ' ] . window . present ( )
2005-04-07 11:25:59 +00:00
else :
2005-05-12 00:00:40 +00:00
try :
self . plugin . windows [ account ] [ ' join_gc ' ] = dialogs . Join_groupchat_window ( self . plugin , account )
except RuntimeError :
pass
2005-04-21 18:53:16 +00:00
2005-03-11 17:57:35 +00:00
def on_new_message_menuitem_activate ( self , widget , account ) :
2005-04-14 17:07:55 +00:00
dialogs . New_message_dialog ( self . plugin , account )
2005-03-11 17:57:35 +00:00
def on_about_menuitem_activate ( self , widget ) :
2005-04-14 17:07:55 +00:00
dialogs . About_dialog ( )
2005-03-11 17:57:35 +00:00
def on_accounts_menuitem_activate ( self , widget ) :
2005-04-04 19:27:06 +00:00
if self . plugin . windows . has_key ( ' accounts ' ) :
2005-04-17 18:36:09 +00:00
self . plugin . windows [ ' accounts ' ] . window . present ( )
2005-04-04 19:27:06 +00:00
else :
2005-04-14 17:07:55 +00:00
self . plugin . windows [ ' accounts ' ] = config . Accounts_window ( self . plugin )
2005-03-11 17:57:35 +00:00
def close_all ( self , dic ) :
2005-04-18 12:17:43 +00:00
''' close all the windows in the given dictionary '''
2005-03-11 17:57:35 +00:00
for w in dic . values ( ) :
if type ( w ) == type ( { } ) :
self . close_all ( w )
else :
w . window . destroy ( )
2005-03-21 12:34:20 +00:00
def on_roster_window_delete_event ( self , widget , event ) :
2005-04-18 12:17:43 +00:00
''' When we want to close the window '''
2005-03-28 01:20:47 +00:00
if self . plugin . systray_enabled :
2005-03-16 00:03:45 +00:00
self . window . hide ( )
2005-03-11 17:57:35 +00:00
else :
2005-04-14 07:05:10 +00:00
accounts = gajim . connections . keys ( )
2005-03-17 18:01:06 +00:00
get_msg = False
2005-03-17 09:33:57 +00:00
for acct in accounts :
2005-04-14 07:20:14 +00:00
if gajim . connections [ acct ] . connected :
2005-03-17 18:01:06 +00:00
get_msg = True
break
if get_msg :
message = self . get_status_message ( ' offline ' )
if message == - 1 :
message = ' '
for acct in accounts :
2005-04-14 07:42:26 +00:00
if gajim . connections [ acct ] . connected :
2005-03-17 18:01:06 +00:00
self . send_status ( acct , ' offline ' , message )
2005-03-11 17:57:35 +00:00
self . quit_gtkgui_plugin ( )
2005-03-27 19:39:50 +00:00
return True # do NOT destory the window
2005-03-11 17:57:35 +00:00
def quit_gtkgui_plugin ( self ) :
2005-04-18 12:17:43 +00:00
''' When we quit the gtk plugin :
tell that to the core and exit gtk '''
2005-04-16 17:36:27 +00:00
if gajim . config . get ( ' saveposition ' ) :
x , y = self . window . get_position ( )
gajim . config . set ( ' x-position ' , x )
gajim . config . set ( ' y-position ' , y )
width , height = self . window . get_size ( )
gajim . config . set ( ' width ' , width )
gajim . config . set ( ' height ' , height )
2005-03-11 17:57:35 +00:00
2005-05-18 16:30:59 +00:00
gajim . config . set ( ' collapsed_rows ' , ' \t ' . join ( self . collapsed_rows ) )
2005-04-12 15:30:09 +00:00
self . plugin . save_config ( )
2005-04-14 09:38:08 +00:00
for account in gajim . connections :
gajim . connections [ account ] . quit ( True )
2005-03-11 17:57:35 +00:00
self . close_all ( self . plugin . windows )
2005-03-29 21:28:58 +00:00
if self . plugin . systray_enabled :
self . plugin . hide_systray ( )
2005-03-11 17:57:35 +00:00
gtk . main_quit ( )
def on_quit_menuitem_activate ( self , widget ) :
2005-04-14 07:05:10 +00:00
accounts = gajim . connections . keys ( )
2005-03-17 18:01:06 +00:00
get_msg = False
2005-03-17 09:33:57 +00:00
for acct in accounts :
2005-04-14 07:20:14 +00:00
if gajim . connections [ acct ] . connected :
2005-03-17 18:01:06 +00:00
get_msg = True
break
if get_msg :
message = self . get_status_message ( ' offline ' )
if message == - 1 :
2005-03-31 12:48:57 +00:00
return
2005-05-13 20:50:49 +00:00
# check if we have unread or recent mesages
unread = False
recent = False
if self . nb_unread > 0 :
unread = True
for account in accounts :
if self . plugin . windows [ account ] [ ' chats ' ] . has_key ( ' tabbed ' ) :
wins = [ self . plugin . windows [ account ] [ ' chats ' ] [ ' tabbed ' ] ]
else :
wins = self . plugin . windows [ account ] [ ' chats ' ] . values ( )
for win in wins :
unrd = 0
for jid in win . nb_unread :
unrd + = win . nb_unread [ jid ]
if unrd :
unread = True
break
for jid in win . users :
if time . time ( ) - win . last_message_time [ jid ] < 2 :
recent = True
break
if unread :
dialog = dialogs . Confirmation_dialog ( _ ( ' You have unread messages. \n Are you sure you want to quit Gajim? ' ) )
if dialog . get_response ( ) != gtk . RESPONSE_YES :
return
2005-06-03 17:35:48 +00:00
2005-05-13 20:50:49 +00:00
if recent :
dialog = dialogs . Confirmation_dialog ( _ ( ' You received a message in the last two seconds. \n Are you sure you want to quit Gajim? ' ) )
if dialog . get_response ( ) != gtk . RESPONSE_YES :
return
2005-03-17 18:01:06 +00:00
for acct in accounts :
2005-04-14 07:20:14 +00:00
if gajim . connections [ acct ] . connected :
2005-03-17 18:01:06 +00:00
self . send_status ( acct , ' offline ' , message )
2005-03-11 17:57:35 +00:00
self . quit_gtkgui_plugin ( )
2005-04-21 23:20:18 +00:00
def on_roster_treeview_row_activated ( self , widget , path , col = 0 ) :
2005-04-18 12:25:19 +00:00
''' When an iter is double clicked: open the chat window '''
2005-03-11 17:57:35 +00:00
model = self . tree . get_model ( )
iter = model . get_iter ( path )
account = model . get_value ( iter , 4 )
type = model . get_value ( iter , 2 )
jid = model . get_value ( iter , 3 )
if ( type == ' group ' ) or ( type == ' account ' ) :
if ( self . tree . row_expanded ( path ) ) :
self . tree . collapse_row ( path )
else :
self . tree . expand_row ( path , False )
else :
if self . plugin . windows [ account ] [ ' chats ' ] . has_key ( jid ) :
2005-05-03 16:39:27 +00:00
self . plugin . windows [ account ] [ ' chats ' ] [ jid ] . set_active_tab ( jid )
2005-03-11 17:57:35 +00:00
elif self . contacts [ account ] . has_key ( jid ) :
self . new_chat ( self . contacts [ account ] [ jid ] [ 0 ] , account )
2005-05-03 16:39:27 +00:00
self . plugin . windows [ account ] [ ' chats ' ] [ jid ] . set_active_tab ( jid )
2005-04-27 19:09:34 +00:00
self . plugin . windows [ account ] [ ' chats ' ] [ jid ] . window . present ( )
2005-03-11 17:57:35 +00:00
def on_roster_treeview_row_expanded ( self , widget , iter , path ) :
2005-04-18 12:17:43 +00:00
''' When a row is expanded change the icon of the arrow '''
2005-03-11 17:57:35 +00:00
model = self . tree . get_model ( )
account = model . get_value ( iter , 4 )
type = model . get_value ( iter , 2 )
if type == ' group ' :
2005-04-23 01:37:05 +00:00
model . set_value ( iter , 0 , self . jabber_state_images [ ' opened ' ] )
2005-03-11 17:57:35 +00:00
jid = model . get_value ( iter , 3 )
self . groups [ account ] [ jid ] [ ' expand ' ] = True
2005-05-18 16:30:59 +00:00
if account + jid in self . collapsed_rows :
self . collapsed_rows . remove ( account + jid )
2005-03-11 17:57:35 +00:00
elif type == ' account ' :
2005-05-18 16:30:59 +00:00
if account in self . collapsed_rows :
self . collapsed_rows . remove ( account )
2005-03-11 17:57:35 +00:00
for g in self . groups [ account ] :
groupIter = self . get_group_iter ( g , account )
if groupIter and self . groups [ account ] [ g ] [ ' expand ' ] :
pathG = model . get_path ( groupIter )
self . tree . expand_row ( pathG , False )
def on_roster_treeview_row_collapsed ( self , widget , iter , path ) :
2005-04-18 12:17:43 +00:00
''' When a row is collapsed :
change the icon of the arrow '''
2005-03-11 17:57:35 +00:00
model = self . tree . get_model ( )
account = model . get_value ( iter , 4 )
type = model . get_value ( iter , 2 )
if type == ' group ' :
2005-04-23 01:37:05 +00:00
model . set_value ( iter , 0 , self . jabber_state_images [ ' closed ' ] )
2005-03-11 17:57:35 +00:00
jid = model . get_value ( iter , 3 )
self . groups [ account ] [ jid ] [ ' expand ' ] = False
2005-05-18 16:30:59 +00:00
if not account + jid in self . collapsed_rows :
self . collapsed_rows . append ( account + jid )
2005-03-11 17:57:35 +00:00
elif type == ' account ' :
2005-05-18 16:30:59 +00:00
if not account in self . collapsed_rows :
self . collapsed_rows . append ( account )
2005-03-11 17:57:35 +00:00
def on_editing_canceled ( self , cell ) :
2005-04-18 12:17:43 +00:00
''' editing has been canceled '''
2005-03-11 17:57:35 +00:00
#TODO: get iter
#model.set_value(iter, 5, False)
pass
2005-05-31 17:48:22 +00:00
def on_cell_edited ( self , cell , row , new_text ) :
2005-04-18 12:17:43 +00:00
''' When an iter is editer :
if text has changed , rename the user '''
2005-03-11 17:57:35 +00:00
model = self . tree . get_model ( )
iter = model . get_iter_from_string ( row )
path = model . get_path ( iter )
account = model . get_value ( iter , 4 )
jid = model . get_value ( iter , 3 )
type = model . get_value ( iter , 2 )
if type == ' user ' :
old_text = self . contacts [ account ] [ jid ] [ 0 ] . name
if old_text != new_text :
for u in self . contacts [ account ] [ jid ] :
u . name = new_text
2005-04-14 09:38:08 +00:00
gajim . connections [ account ] . update_user ( jid , new_text , u . groups )
2005-04-23 00:37:51 +00:00
self . draw_contact ( jid , account )
2005-03-11 17:57:35 +00:00
elif type == ' group ' :
old_name = model . get_value ( iter , 1 )
#get all users in that group
for jid in self . contacts [ account ] :
user = self . contacts [ account ] [ jid ] [ 0 ]
if old_name in user . groups :
#set them in the new one and remove it from the old
self . remove_user ( user , account )
user . groups . remove ( old_name )
user . groups . append ( new_text )
self . add_user_to_roster ( user . jid , account )
2005-04-20 23:27:33 +00:00
gajim . connections [ account ] . update_user ( user . jid , user . name ,
2005-04-21 17:43:47 +00:00
user . groups )
2005-03-11 17:57:35 +00:00
model . set_value ( iter , 5 , False )
2005-03-23 13:25:48 +00:00
def on_service_disco_menuitem_activate ( self , widget , account ) :
2005-04-04 15:51:29 +00:00
if self . plugin . windows [ account ] . has_key ( ' disco ' ) :
2005-04-17 18:36:09 +00:00
self . plugin . windows [ account ] [ ' disco ' ] . window . present ( )
2005-04-04 15:51:29 +00:00
else :
2005-05-15 11:47:15 +00:00
try :
self . plugin . windows [ account ] [ ' disco ' ] = \
config . Service_discovery_window ( self . plugin , account )
except RuntimeError :
pass
2005-03-11 17:57:35 +00:00
2005-04-26 22:11:03 +00:00
def load_iconset ( self , path ) :
imgs = { }
2005-04-22 01:35:36 +00:00
for state in ( ' connecting ' , ' online ' , ' chat ' , ' away ' , ' xa ' ,
2005-04-26 22:11:03 +00:00
' dnd ' , ' invisible ' , ' offline ' , ' error ' , ' requested ' ,
' message ' , ' opened ' , ' closed ' , ' not in the roster ' ) :
2005-03-11 17:57:35 +00:00
# try to open a pixfile with the correct method
2005-03-30 12:29:48 +00:00
state_file = state . replace ( ' ' , ' _ ' )
2005-03-11 17:57:35 +00:00
files = [ ]
2005-04-26 22:11:03 +00:00
files . append ( path + state_file + ' .gif ' )
files . append ( path + state_file + ' .png ' )
files . append ( path + state_file + ' .xpm ' )
2005-03-11 17:57:35 +00:00
image = gtk . Image ( )
image . show ( )
2005-04-26 22:11:03 +00:00
imgs [ state ] = image
2005-03-11 17:57:35 +00:00
for file in files :
2005-03-30 12:29:48 +00:00
if os . path . exists ( file ) :
image . set_from_file ( file )
break
2005-04-26 22:11:03 +00:00
return imgs
2005-03-11 17:57:35 +00:00
2005-04-26 22:11:03 +00:00
def make_jabber_state_images ( self ) :
''' initialise jabber_state_images dict '''
iconset = gajim . config . get ( ' iconset ' )
if not iconset :
iconset = ' sun '
2005-05-17 17:37:50 +00:00
self . path = os . path . join ( gajim . DATA_DIR , ' iconsets/ ' + iconset + ' / ' )
2005-04-26 22:11:03 +00:00
self . jabber_state_images = self . load_iconset ( self . path )
2005-04-20 23:27:33 +00:00
2005-04-23 01:37:05 +00:00
def reload_jabber_state_images ( self ) :
self . make_jabber_state_images ( )
2005-03-31 19:21:48 +00:00
# Update the roster
self . draw_roster ( )
# Update the status combobox
2005-03-31 23:26:05 +00:00
model = self . status_combobox . get_model ( )
2005-03-31 19:21:48 +00:00
iter = model . get_iter_root ( )
while iter :
2005-04-23 01:37:05 +00:00
model . set_value ( iter , 1 , self . jabber_state_images [ model . get_value ( iter , 2 ) ] )
2005-03-31 19:21:48 +00:00
iter = model . iter_next ( iter )
# Update the systray
if self . plugin . systray_enabled :
self . plugin . systray . set_img ( )
2005-04-14 07:20:14 +00:00
for account in gajim . connections :
2005-03-31 19:21:48 +00:00
# Update opened chat windows
for jid in self . plugin . windows [ account ] [ ' chats ' ] :
if jid != ' tabbed ' :
2005-04-23 01:37:05 +00:00
self . plugin . windows [ account ] [ ' chats ' ] [ jid ] . set_state_image ( jid )
2005-03-31 19:21:48 +00:00
# Update opened groupchat windows
for jid in self . plugin . windows [ account ] [ ' gc ' ] :
if jid != ' tabbed ' :
2005-05-06 18:01:07 +00:00
self . plugin . windows [ account ] [ ' gc ' ] [ jid ] . update_state_images ( )
2005-04-01 19:58:54 +00:00
self . update_status_comboxbox ( )
2005-03-31 19:21:48 +00:00
2005-03-11 17:57:35 +00:00
def on_show_offline_contacts_menuitem_activate ( self , widget ) :
2005-04-18 12:17:43 +00:00
''' when show offline option is changed:
redraw the treeview '''
2005-04-12 21:09:06 +00:00
gajim . config . set ( ' showoffline ' , 1 - gajim . config . get ( ' showoffline ' ) )
2005-03-11 17:57:35 +00:00
self . draw_roster ( )
2005-04-21 23:20:18 +00:00
def iconCellDataFunc ( self , column , renderer , model , iter , data = None ) :
2005-04-18 12:17:43 +00:00
''' When a row is added, set properties for icon renderer '''
2005-03-11 17:57:35 +00:00
if model . get_value ( iter , 2 ) == ' account ' :
2005-04-20 23:27:33 +00:00
renderer . set_property ( ' cell-background ' ,
2005-04-12 21:09:06 +00:00
gajim . config . get ( ' accountbgcolor ' ) )
2005-03-11 17:57:35 +00:00
renderer . set_property ( ' xalign ' , 0 )
elif model . get_value ( iter , 2 ) == ' group ' :
2005-04-20 23:27:33 +00:00
renderer . set_property ( ' cell-background ' ,
2005-04-12 21:09:06 +00:00
gajim . config . get ( ' groupbgcolor ' ) )
2005-04-01 00:28:45 +00:00
renderer . set_property ( ' xalign ' , 0.5 )
2005-03-11 17:57:35 +00:00
else :
2005-04-05 09:38:52 +00:00
jid = model . get_value ( iter , 3 )
account = model . get_value ( iter , 4 )
if jid in self . newly_added [ account ] :
renderer . set_property ( ' cell-background ' , ' #adc3c6 ' )
elif jid in self . to_be_removed [ account ] :
renderer . set_property ( ' cell-background ' , ' #ab6161 ' )
else :
2005-04-20 23:27:33 +00:00
renderer . set_property ( ' cell-background ' ,
2005-04-12 21:09:06 +00:00
gajim . config . get ( ' userbgcolor ' ) )
2005-03-11 17:57:35 +00:00
renderer . set_property ( ' xalign ' , 1 )
2005-04-01 00:28:45 +00:00
renderer . set_property ( ' width ' , 20 )
2005-03-11 17:57:35 +00:00
2005-04-21 23:20:18 +00:00
def nameCellDataFunc ( self , column , renderer , model , iter , data = None ) :
2005-04-18 12:17:43 +00:00
''' When a row is added, set properties for name renderer '''
2005-03-11 17:57:35 +00:00
if model . get_value ( iter , 2 ) == ' account ' :
2005-04-20 23:27:33 +00:00
renderer . set_property ( ' foreground ' ,
2005-04-12 21:09:06 +00:00
gajim . config . get ( ' accounttextcolor ' ) )
2005-04-20 23:27:33 +00:00
renderer . set_property ( ' cell-background ' ,
2005-04-12 21:09:06 +00:00
gajim . config . get ( ' accountbgcolor ' ) )
renderer . set_property ( ' font ' , gajim . config . get ( ' accountfont ' ) )
2005-04-01 00:28:45 +00:00
renderer . set_property ( ' xpad ' , 0 )
2005-03-11 17:57:35 +00:00
elif model . get_value ( iter , 2 ) == ' group ' :
2005-04-20 23:27:33 +00:00
renderer . set_property ( ' foreground ' ,
2005-04-12 21:09:06 +00:00
gajim . config . get ( ' grouptextcolor ' ) )
2005-04-20 23:27:33 +00:00
renderer . set_property ( ' cell-background ' ,
2005-04-12 21:09:06 +00:00
gajim . config . get ( ' groupbgcolor ' ) )
renderer . set_property ( ' font ' , gajim . config . get ( ' groupfont ' ) )
2005-04-01 00:28:45 +00:00
renderer . set_property ( ' xpad ' , 4 )
2005-03-11 17:57:35 +00:00
else :
2005-04-04 23:03:26 +00:00
jid = model . get_value ( iter , 3 )
account = model . get_value ( iter , 4 )
2005-04-20 23:27:33 +00:00
renderer . set_property ( ' foreground ' ,
2005-04-12 21:09:06 +00:00
gajim . config . get ( ' usertextcolor ' ) )
2005-04-04 23:03:26 +00:00
if jid in self . newly_added [ account ] :
2005-04-05 09:38:52 +00:00
renderer . set_property ( ' cell-background ' , ' #adc3c6 ' )
2005-04-04 23:03:26 +00:00
elif jid in self . to_be_removed [ account ] :
2005-04-05 09:38:52 +00:00
renderer . set_property ( ' cell-background ' , ' #ab6161 ' )
2005-04-04 23:03:26 +00:00
else :
2005-04-20 23:27:33 +00:00
renderer . set_property ( ' cell-background ' ,
2005-04-12 21:09:06 +00:00
gajim . config . get ( ' userbgcolor ' ) )
renderer . set_property ( ' font ' , gajim . config . get ( ' userfont ' ) )
2005-04-01 00:28:45 +00:00
renderer . set_property ( ' xpad ' , 8 )
2005-03-11 17:57:35 +00:00
2005-05-29 18:41:13 +00:00
def get_show ( self , luser ) :
prio = luser [ 0 ] . priority
show = luser [ 0 ] . show
for u in luser :
if u . priority > prio :
prio = u . priority
show = u . show
return show
2005-03-11 17:57:35 +00:00
def compareIters ( self , model , iter1 , iter2 , data = None ) :
2005-04-18 12:17:43 +00:00
''' Compare two iters to sort them '''
2005-03-11 17:57:35 +00:00
name1 = model . get_value ( iter1 , 1 )
name2 = model . get_value ( iter2 , 1 )
if not name1 or not name2 :
return 0
2005-05-29 18:41:13 +00:00
type1 = model . get_value ( iter1 , 2 )
type2 = model . get_value ( iter2 , 2 )
if type1 == ' group ' :
2005-05-12 13:52:09 +00:00
if name1 == ' Transports ' :
2005-03-11 17:57:35 +00:00
return 1
2005-05-12 13:52:09 +00:00
if name2 == ' Transports ' :
2005-03-11 17:57:35 +00:00
return - 1
2005-06-01 20:14:09 +00:00
if name1 == ' not in the roster ' :
return 1
if name2 == ' not in the roster ' :
return - 1
2005-05-29 18:41:13 +00:00
if type1 == ' user ' and type2 == ' user ' and \
gajim . config . get ( ' sort_by_show ' ) :
account = model . get_value ( iter1 , 4 )
if account and model . get_value ( iter2 , 4 ) == account :
jid1 = model . get_value ( iter1 , 3 )
jid2 = model . get_value ( iter2 , 3 )
luser1 = self . contacts [ account ] [ jid1 ]
luser2 = self . contacts [ account ] [ jid2 ]
2005-05-30 09:50:14 +00:00
cshow = { ' online ' : 0 , ' chat ' : 1 , ' away ' : 2 , ' xa ' : 3 , ' dnd ' : 4 ,
2005-05-30 19:00:49 +00:00
' invisible ' : 5 , ' offline ' : 6 , ' not in the roster ' : 7 , ' error ' : 8 }
2005-06-01 12:22:05 +00:00
s = self . get_show ( luser1 )
if s in cshow :
show1 = cshow [ s ]
else :
show1 = 9
s = self . get_show ( luser2 )
if s in cshow :
show2 = cshow [ s ]
else :
show2 = 9
2005-05-29 18:41:13 +00:00
if show1 < show2 :
return - 1
elif show1 > show2 :
return 1
2005-03-11 17:57:35 +00:00
if name1 . lower ( ) < name2 . lower ( ) :
return - 1
if name2 . lower < name1 . lower ( ) :
return 1
return 0
def drag_data_get_data ( self , treeview , context , selection , target_id , etime ) :
treeselection = treeview . get_selection ( )
model , iter = treeselection . get_selected ( )
path = model . get_path ( iter )
2005-04-18 12:17:43 +00:00
data = ' '
2005-03-11 17:57:35 +00:00
if len ( path ) == 3 :
data = model . get_value ( iter , 3 )
selection . set ( selection . target , 8 , data )
def drag_data_received_data ( self , treeview , context , x , y , selection , info ,
etime ) :
2005-03-28 22:17:14 +00:00
merge = 0
2005-04-12 21:09:06 +00:00
if gajim . config . get ( ' mergeaccounts ' ) :
2005-03-28 22:17:14 +00:00
merge = 1
2005-03-11 17:57:35 +00:00
model = treeview . get_model ( )
data = selection . data
if not data :
return
drop_info = treeview . get_dest_row_at_pos ( x , y )
if not drop_info :
return
path_dest , position = drop_info
2005-03-28 22:17:14 +00:00
if position == gtk . TREE_VIEW_DROP_BEFORE and len ( path_dest ) == 2 - merge \
and path_dest [ 1 - merge ] == 0 : #droped before the first group
2005-03-11 17:57:35 +00:00
return
2005-03-28 22:17:14 +00:00
if position == gtk . TREE_VIEW_DROP_BEFORE and len ( path_dest ) == 2 - merge :
2005-03-11 17:57:35 +00:00
#droped before a group : we drop it in the previous group
2005-03-28 22:17:14 +00:00
path_dest = ( path_dest [ 1 - merge ] , path_dest [ 1 - merge ] - 1 )
2005-03-11 17:57:35 +00:00
iter_dest = model . get_iter ( path_dest )
iter_source = treeview . get_selection ( ) . get_selected ( ) [ 1 ]
path_source = model . get_path ( iter_source )
2005-03-28 22:17:14 +00:00
if len ( path_dest ) == 1 and not merge : #droped on an account
2005-03-11 17:57:35 +00:00
return
2005-03-28 22:17:14 +00:00
if path_dest [ 0 ] != path_source [ 0 ] and not merge :
#droped in another account
2005-03-11 17:57:35 +00:00
return
2005-03-28 22:17:14 +00:00
iter_group_source = model . iter_parent ( iter_source )
grp_source = model . get_value ( iter_group_source , 3 )
2005-05-12 13:52:09 +00:00
if grp_source == ' Transports ' or grp_source == ' not in the roster ' :
2005-03-11 17:57:35 +00:00
return
2005-03-28 22:17:14 +00:00
account = model . get_value ( iter_dest , 4 )
type_dest = model . get_value ( iter_dest , 2 )
if type_dest == ' group ' :
2005-03-11 17:57:35 +00:00
grp_dest = model . get_value ( iter_dest , 3 )
2005-03-28 22:17:14 +00:00
else :
2005-03-11 17:57:35 +00:00
grp_dest = model . get_value ( model . iter_parent ( iter_dest ) , 3 )
if grp_source == grp_dest :
return
2005-04-05 09:10:16 +00:00
# We upgrade only the first user because user2.groups is a pointer to
# user1.groups
u = self . contacts [ account ] [ data ] [ 0 ]
u . groups . remove ( grp_source )
2005-03-28 22:17:14 +00:00
if model . iter_n_children ( iter_group_source ) == 1 : #this was the only child
model . remove ( iter_group_source )
#delete the group if it is empty (need to look for offline users too)
group_empty = True
for jid in self . contacts [ account ] :
if grp_source in self . contacts [ account ] [ jid ] [ 0 ] . groups :
group_empty = False
break
if group_empty :
del self . groups [ account ] [ grp_source ]
2005-05-23 17:29:55 +00:00
if not grp_dest in u . groups :
u . groups . append ( grp_dest )
self . add_user_to_roster ( data , account )
gajim . connections [ account ] . update_user ( u . jid , u . name , u . groups )
2005-03-11 17:57:35 +00:00
if context . action == gtk . gdk . ACTION_MOVE :
context . finish ( True , True , etime )
return
def show_title ( self ) :
2005-05-13 18:00:13 +00:00
change_title_allowed = gajim . config . get ( ' change_roster_title ' )
2005-04-18 12:25:19 +00:00
if change_title_allowed :
start = ' '
if self . nb_unread > 1 :
start = ' [ ' + str ( self . nb_unread ) + ' ] '
elif self . nb_unread == 1 :
start = ' * '
self . window . set_title ( start + ' Gajim ' )
2005-03-11 17:57:35 +00:00
def __init__ ( self , plugin ) :
2005-03-21 12:34:20 +00:00
self . xml = gtk . glade . XML ( GTKGUI_GLADE , ' roster_window ' , APP )
self . window = self . xml . get_widget ( ' roster_window ' )
2005-03-11 17:57:35 +00:00
self . tree = self . xml . get_widget ( ' roster_treeview ' )
self . plugin = plugin
self . nb_unread = 0
2005-03-28 01:39:12 +00:00
self . add_new_contact_handler_id = False
2005-03-23 13:25:48 +00:00
self . service_disco_handler_id = False
2005-03-14 17:30:52 +00:00
self . join_gc_handler_id = False
self . new_message_menuitem_handler_id = False
2005-03-11 17:57:35 +00:00
self . regroup = 0
2005-04-12 21:09:06 +00:00
self . regroup = gajim . config . get ( ' mergeaccounts ' )
if gajim . config . get ( ' saveposition ' ) :
self . window . move ( gajim . config . get ( ' x-position ' ) , \
gajim . config . get ( ' y-position ' ) )
self . window . resize ( gajim . config . get ( ' width ' ) , \
gajim . config . get ( ' height ' ) )
2005-06-06 13:12:12 +00:00
2005-06-05 23:17:59 +00:00
if gajim . config . get ( ' show_roster_on_startup ' ) :
self . window . show_all ( )
else :
if not gajim . config . get ( ' trayicon ' ) :
# cannot happen via GUI, but I put this incase user touches config
self . window . show_all ( ) # without trayicon, he should see the roster!
2005-06-06 13:12:12 +00:00
gajim . config . set ( ' show_roster_on_startup ' , True )
2005-06-05 23:17:59 +00:00
2005-03-11 17:57:35 +00:00
self . groups = { }
self . contacts = { }
2005-04-04 23:03:26 +00:00
self . newly_added = { }
self . to_be_removed = { }
2005-04-21 21:30:56 +00:00
self . popups_notification_height = 0
self . popup_notification_windows = [ ]
2005-05-30 20:16:29 +00:00
self . gpg_passphrase = { }
2005-04-14 07:05:10 +00:00
for a in gajim . connections :
2005-03-11 17:57:35 +00:00
self . contacts [ a ] = { }
self . groups [ a ] = { }
2005-04-04 23:03:26 +00:00
self . newly_added [ a ] = [ ]
self . to_be_removed [ a ] = [ ]
2005-03-11 17:57:35 +00:00
#(icon, name, type, jid, account, editable)
model = gtk . TreeStore ( gtk . Image , str , str , str , str , gobject . TYPE_BOOLEAN )
model . set_sort_func ( 1 , self . compareIters )
model . set_sort_column_id ( 1 , gtk . SORT_ASCENDING )
self . tree . set_model ( model )
2005-04-23 01:37:05 +00:00
self . make_jabber_state_images ( )
2005-05-27 16:56:46 +00:00
self . transports_state_images = { ' aim ' : { } , ' gadugadu ' : { } , ' irc ' : { } , ' icq ' : { } , ' msn ' : { } , ' sms ' : { } , ' yahoo ' : { } }
2005-04-23 00:37:51 +00:00
2005-05-17 17:37:50 +00:00
path = os . path . join ( gajim . DATA_DIR , ' iconsets/transports ' )
folders = os . listdir ( path )
2005-04-26 22:11:03 +00:00
for transport in folders :
if transport == ' .svn ' :
2005-04-23 00:37:51 +00:00
continue
2005-04-26 22:11:03 +00:00
folder = os . path . join ( path , transport )
self . transports_state_images [ transport ] = self . load_iconset ( folder + \
' / ' )
2005-03-11 17:57:35 +00:00
2005-04-20 23:27:33 +00:00
liststore = gtk . ListStore ( gobject . TYPE_STRING , gtk . Image ,
2005-03-30 19:20:20 +00:00
gobject . TYPE_STRING )
2005-03-31 23:26:05 +00:00
self . status_combobox = gtk . ComboBox ( )
2005-05-31 17:48:22 +00:00
roster_vbox = self . xml . get_widget ( ' roster_vbox ' )
roster_vbox . pack_end ( self . status_combobox , False )
2005-04-18 14:05:30 +00:00
cell = cell_renderer_image . CellRendererImage ( )
2005-03-31 23:26:05 +00:00
self . status_combobox . pack_start ( cell , False )
self . status_combobox . add_attribute ( cell , ' image ' , 1 )
2005-03-11 17:57:35 +00:00
cell = gtk . CellRendererText ( )
2005-03-31 23:26:05 +00:00
cell . set_property ( ' xpad ' , 5 ) # padding for status text
self . status_combobox . pack_start ( cell , True )
self . status_combobox . add_attribute ( cell , ' text ' , 0 )
2005-05-20 16:31:52 +00:00
for show in [ ' online ' , ' chat ' , ' away ' , ' xa ' , ' dnd ' , ' invisible ' ,
2005-05-12 09:14:31 +00:00
' offline ' ] :
2005-05-20 16:31:52 +00:00
uf_show = helpers . get_uf_show ( show )
iter = liststore . append ( [ uf_show , self . jabber_state_images [ show ] ,
show ] )
2005-03-31 23:26:05 +00:00
self . status_combobox . show_all ( )
self . status_combobox . set_model ( liststore )
2005-04-18 23:55:13 +00:00
self . status_combobox . set_active ( 6 ) # default to offline
2005-03-11 17:57:35 +00:00
2005-04-12 21:09:06 +00:00
showOffline = gajim . config . get ( ' showoffline ' )
2005-03-11 17:57:35 +00:00
self . xml . get_widget ( ' show_offline_contacts_menuitem ' ) . set_active ( showOffline )
#columns
2005-04-01 00:28:45 +00:00
#this col has two cells: first one img, second one text
2005-03-11 17:57:35 +00:00
col = gtk . TreeViewColumn ( )
2005-04-18 14:05:30 +00:00
render_pixbuf = cell_renderer_image . CellRendererImage ( )
2005-03-11 17:57:35 +00:00
col . pack_start ( render_pixbuf , expand = False )
col . add_attribute ( render_pixbuf , ' image ' , 0 )
col . set_cell_data_func ( render_pixbuf , self . iconCellDataFunc , None )
render_text = gtk . CellRendererText ( )
render_text . connect ( ' edited ' , self . on_cell_edited )
2005-04-01 00:28:45 +00:00
render_text . connect ( ' editing-canceled ' , self . on_editing_canceled )
2005-03-11 17:57:35 +00:00
col . pack_start ( render_text , expand = True )
col . add_attribute ( render_text , ' text ' , 1 )
2005-05-18 00:44:39 +00:00
col . add_attribute ( render_text , ' editable ' , 5 )
2005-03-11 17:57:35 +00:00
col . set_cell_data_func ( render_text , self . nameCellDataFunc , None )
2005-04-01 00:28:45 +00:00
self . tree . append_column ( col )
2005-03-11 17:57:35 +00:00
2005-04-01 00:28:45 +00:00
#do not show gtk arrows workaround
2005-03-11 17:57:35 +00:00
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 )
#signals
TARGETS = [ ( ' MY_TREE_MODEL_ROW ' , gtk . TARGET_SAME_WIDGET , 0 ) ]
self . tree . enable_model_drag_source ( gtk . gdk . BUTTON1_MASK , TARGETS ,
gtk . gdk . ACTION_DEFAULT | gtk . gdk . ACTION_MOVE )
self . tree . enable_model_drag_dest ( TARGETS , gtk . gdk . ACTION_DEFAULT )
2005-04-18 12:17:43 +00:00
self . tree . connect ( ' drag_data_get ' , self . drag_data_get_data )
self . tree . connect ( ' drag_data_received ' , self . drag_data_received_data )
2005-03-11 17:57:35 +00:00
self . xml . signal_autoconnect ( self )
2005-04-20 23:27:33 +00:00
self . id_signal_cb = self . status_combobox . connect ( ' changed ' ,
2005-05-18 00:44:39 +00:00
self . on_status_combobox_changed )
2005-03-11 17:57:35 +00:00
2005-05-18 16:30:59 +00:00
self . collapsed_rows = gajim . config . get ( ' collapsed_rows ' ) . split ( ' \t ' )
2005-03-11 17:57:35 +00:00
self . draw_roster ( )
2005-04-14 07:05:10 +00:00
if len ( gajim . connections ) == 0 : # if no account
2005-04-04 15:51:29 +00:00
self . plugin . windows [ ' account_modification ' ] = \
2005-04-14 23:00:25 +00:00
config . Account_modification_window ( self . plugin )