2005-07-22 14:47:58 +02:00
## groupchat_window.py
2005-03-11 18:57:35 +01:00
##
## Gajim Team:
2005-05-20 19:25:21 +02:00
## - Yann Le Boulanger <asterix@lagaule.org>
## - Vincent Hanquez <tab@snarc.org>
## - Nikos Kouremenos <kourem@gmail.com>
2005-03-11 18:57:35 +01:00
##
2005-05-20 19:25:21 +02:00
## Copyright (C) 2003-2005 Gajim Team
2005-03-11 18:57:35 +01: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 gtk . glade
import pango
import gobject
import time
2005-04-14 19:07:55 +02:00
import dialogs
import chat
2005-04-18 18:40:10 +02:00
import cell_renderer_image
2005-07-23 15:13:15 +02:00
import gtkgui_helpers
2005-08-04 16:30:41 +02:00
import history_window
2005-08-24 14:58:03 +02:00
import tooltips
2005-07-23 15:13:15 +02:00
2005-06-24 16:28:00 +02:00
from gajim import Contact
2005-04-18 16:05:30 +02:00
from common import gajim
2005-06-10 17:25:48 +02:00
from common import helpers
2005-08-03 01:03:21 +02:00
from gettext import ngettext
2005-03-11 18:57:35 +01:00
from common import i18n
_ = i18n . _
2005-08-13 00:32:35 +02:00
Q_ = i18n . Q_
2005-03-11 18:57:35 +01:00
APP = i18n . APP
gtk . glade . bindtextdomain ( APP , i18n . DIR )
gtk . glade . textdomain ( APP )
2005-04-22 01:20:18 +02:00
GTKGUI_GLADE = ' gtkgui.glade '
2005-03-11 18:57:35 +01:00
2005-06-11 00:45:50 +02:00
class GroupchatWindow ( chat . Chat ) :
2005-03-13 18:04:57 +01:00
""" Class for Groupchat window """
2005-03-12 22:30:50 +01:00
def __init__ ( self , room_jid , nick , plugin , account ) :
2005-04-14 19:07:55 +02:00
chat . Chat . __init__ ( self , plugin , account , ' groupchat_window ' )
2005-07-19 13:57:50 +02:00
# alphanum sorted
2005-09-14 09:34:17 +02:00
self . muc_cmds = [ ' ban ' , ' chat ' , ' query ' , ' clear ' , ' close ' , ' compact ' , ' help ' , ' invite ' ,
' join ' , ' kick ' , ' leave ' , ' me ' , ' msg ' , ' nick ' , ' part ' , ' topic ' ]
2005-07-19 13:57:50 +02:00
2005-06-19 15:09:06 +02:00
self . nicks = { } # our nick for each groupchat we are in
2005-03-12 22:30:50 +01:00
self . list_treeview = { }
self . subjects = { }
2005-06-10 22:06:01 +02:00
self . name_labels = { }
2005-06-15 11:59:44 +02:00
self . subject_tooltip = { }
2005-06-04 15:25:26 +02:00
self . room_creation = { }
2005-06-19 19:06:41 +02:00
self . nick_hits = { } # possible candidates for nick completion
self . cmd_hits = { } # possible candidates for command completion
2005-06-10 17:15:47 +02:00
self . last_key_tabs = { }
2005-06-13 14:20:34 +02:00
self . hpaneds = { } # used for auto positioning
self . hpaned_position = gajim . config . get ( ' gc-hpaned-position ' )
2005-06-17 00:21:02 +02:00
self . gc_refer_to_nick_char = gajim . config . get ( ' gc_refer_to_nick_char ' )
2005-04-23 16:26:04 +02:00
self . new_room ( room_jid , nick )
2005-03-12 22:30:50 +01:00
self . show_title ( )
2005-08-24 14:58:03 +02:00
self . tooltip = tooltips . GCTooltip ( plugin )
2005-08-07 17:19:21 +02:00
# NOTE: if it not a window event, connect in new_room function
signal_dict = {
' on_groupchat_window_destroy ' : self . on_groupchat_window_destroy ,
' on_groupchat_window_delete_event ' : self . on_groupchat_window_delete_event ,
' on_groupchat_window_focus_in_event ' : self . on_groupchat_window_focus_in_event ,
' on_groupchat_window_focus_out_event ' : self . on_groupchat_window_focus_out_event ,
' on_chat_notebook_key_press_event ' : self . on_chat_notebook_key_press_event ,
2005-09-14 02:51:26 +02:00
' on_chat_notebook_switch_page ' : self . on_chat_notebook_switch_page ,
2005-08-07 17:19:21 +02:00
}
self . xml . signal_autoconnect ( signal_dict )
#FIXME: 0.9 implement you lost focus of MUC room here (Psi has a <hr/>)
# DO NOT CONNECT ABOVE but in glade..
#'on_chat_notebook_switch_page'
#'on_groupchat_popup_menu_destroy'
2005-06-13 14:20:34 +02:00
# get size and position from config
if gajim . config . get ( ' saveposition ' ) :
2005-08-28 12:57:08 +02:00
gtkgui_helpers . move_window ( self . window , gajim . config . get ( ' gc-x-position ' ) ,
gajim . config . get ( ' gc-y-position ' ) )
2005-08-28 13:02:59 +02:00
gtkgui_helpers . resize_window ( self . window , gajim . config . get ( ' gc-width ' ) ,
2005-06-13 14:20:34 +02:00
gajim . config . get ( ' gc-height ' ) )
2005-04-28 17:48:20 +02:00
self . window . show_all ( )
2005-07-20 13:52:43 +02:00
def save_var ( self , room_jid ) :
if not room_jid in self . nicks :
2005-04-28 17:48:20 +02:00
return { }
return {
2005-07-20 13:52:43 +02:00
' nick ' : self . nicks [ room_jid ] ,
' model ' : self . list_treeview [ room_jid ] . get_model ( ) ,
' subject ' : self . subjects [ room_jid ] ,
2005-08-09 21:24:44 +02:00
' contacts ' : gajim . gc_contacts [ self . account ] [ room_jid ] ,
' connected ' : gajim . gc_connected [ self . account ] [ room_jid ] ,
2005-04-28 17:48:20 +02:00
}
2005-07-20 13:52:43 +02:00
def load_var ( self , room_jid , var ) :
if not self . xmls . has_key ( room_jid ) :
2005-04-28 17:48:20 +02:00
return
2005-07-20 13:52:43 +02:00
self . list_treeview [ room_jid ] . set_model ( var [ ' model ' ] )
self . list_treeview [ room_jid ] . expand_all ( )
self . set_subject ( room_jid , var [ ' subject ' ] )
2005-07-25 22:04:24 +02:00
self . subjects [ room_jid ] = var [ ' subject ' ]
2005-08-09 21:24:44 +02:00
gajim . gc_contacts [ self . account ] [ room_jid ] = var [ ' contacts ' ]
gajim . gc_connected [ self . account ] [ room_jid ] = var [ ' connected ' ]
if gajim . gc_connected [ self . account ] [ room_jid ] :
self . got_connected ( room_jid )
2005-03-12 22:30:50 +01:00
2005-03-11 18:57:35 +01:00
def on_groupchat_window_delete_event ( self , widget , event ) :
""" close window """
2005-08-03 11:23:36 +02:00
# whether to ask for comfirmation before closing muc
if gajim . config . get ( ' confirm_close_muc ' ) :
names = [ ]
for room_jid in self . xmls :
if gajim . gc_connected [ self . account ] [ room_jid ] :
names . append ( gajim . get_nick_from_jid ( room_jid ) )
2005-09-03 18:37:01 +02:00
rooms_no = len ( names )
if rooms_no > = 2 : # if we are in many rooms
pritext = _ ( ' Are you sure you want to leave rooms " %s " ? ' ) % ' , ' . join ( names )
2005-09-03 18:38:19 +02:00
sectext = _ ( ' If you close this window, you will be disconnected from these rooms. ' )
2005-09-03 18:37:01 +02:00
elif rooms_no == 1 : # just in one room
pritext = _ ( ' Are you sure you want to leave room " %s " ? ' ) % names [ 0 ]
2005-09-03 18:38:19 +02:00
sectext = _ ( ' If you close this window, you will be disconnected from this room. ' )
2005-08-03 01:03:21 +02:00
2005-09-03 18:37:01 +02:00
if rooms_no > 0 :
2005-08-03 11:23:36 +02:00
dialog = dialogs . ConfirmationDialogCheck ( pritext , sectext ,
_ ( ' Do not ask me again ' ) )
2005-08-03 01:03:21 +02:00
2005-08-03 11:23:36 +02:00
if dialog . get_response ( ) != gtk . RESPONSE_OK :
return True # stop propagation of the delete event
2005-08-03 01:03:21 +02:00
2005-08-03 11:23:36 +02:00
if dialog . is_checked ( ) :
gajim . config . set ( ' confirm_close_muc ' , False )
dialog . destroy ( )
2005-08-03 01:03:21 +02:00
2005-03-11 18:57:35 +01:00
for room_jid in self . xmls :
2005-08-03 11:23:36 +02:00
if gajim . gc_connected [ self . account ] [ room_jid ] :
gajim . connections [ self . account ] . send_gc_status ( self . nicks [ room_jid ] ,
room_jid , ' offline ' , ' offline ' )
2005-06-13 14:20:34 +02:00
if gajim . config . get ( ' saveposition ' ) :
2005-08-03 01:03:21 +02:00
# save window position and size
2005-06-13 14:20:34 +02:00
gajim . config . set ( ' gc-hpaned-position ' , self . hpaned_position )
x , y = self . window . get_position ( )
gajim . config . set ( ' gc-x-position ' , x )
gajim . config . set ( ' gc-y-position ' , y )
width , height = self . window . get_size ( )
gajim . config . set ( ' gc-width ' , width )
gajim . config . set ( ' gc-height ' , height )
2005-04-28 17:48:20 +02:00
def on_groupchat_window_destroy ( self , widget ) :
2005-04-14 19:07:55 +02:00
chat . Chat . on_window_destroy ( self , widget , ' gc ' )
2005-08-06 12:15:56 +02:00
for room_jid in self . xmls :
del gajim . gc_contacts [ self . account ] [ room_jid ]
del gajim . gc_connected [ self . account ] [ room_jid ]
2005-03-12 22:30:50 +01:00
def on_groupchat_window_focus_in_event ( self , widget , event ) :
2005-08-07 17:19:21 +02:00
''' When window gets focus '''
2005-04-14 19:07:55 +02:00
chat . Chat . on_chat_window_focus_in_event ( self , widget , event )
2005-03-12 22:30:50 +01:00
2005-08-07 17:19:21 +02:00
def on_groupchat_window_focus_out_event ( self , widget , event ) :
''' When window loses focus '''
#chat.Chat.on_chat_window_focus_out_event(self, widget, event)
#FIXME: merge with on_tabbed_chat_window_focus_out_event in chat.py
#do the you were here in MUC conversation thing
pass
2005-06-22 21:39:19 +02:00
2005-03-12 22:30:50 +01:00
def on_chat_notebook_key_press_event ( self , widget , event ) :
2005-04-14 19:07:55 +02:00
chat . Chat . on_chat_notebook_key_press_event ( self , widget , event )
2005-03-16 21:48:56 +01:00
def on_chat_notebook_switch_page ( self , notebook , page , page_num ) :
2005-09-14 02:51:26 +02:00
old_child = notebook . get_nth_page ( notebook . get_current_page ( ) )
2005-03-16 21:48:56 +01:00
new_child = notebook . get_nth_page ( page_num )
2005-09-14 02:51:26 +02:00
old_jid = ' '
2005-03-16 21:48:56 +01:00
new_jid = ' '
2005-07-20 13:52:43 +02:00
for room_jid in self . xmls :
2005-09-14 02:51:26 +02:00
if self . childs [ room_jid ] == new_child :
2005-07-20 13:52:43 +02:00
new_jid = room_jid
2005-09-14 02:51:26 +02:00
self . redraw_tab ( new_jid , ' active ' )
elif self . childs [ room_jid ] == old_child :
old_jid = room_jid
self . redraw_tab ( old_jid , ' active ' )
if old_jid != ' ' and new_jid != ' ' : # we found both jids
break # so stop looping
2005-06-14 12:00:29 +02:00
2005-09-14 02:51:26 +02:00
subject = self . subjects [ new_jid ]
2005-08-24 14:41:42 +02:00
subject = gtkgui_helpers . escape_for_pango_markup ( subject )
new_jid = gtkgui_helpers . escape_for_pango_markup ( new_jid )
2005-06-14 12:00:29 +02:00
2005-06-10 22:06:01 +02:00
name_label = self . name_labels [ new_jid ]
2005-09-14 02:51:26 +02:00
name_label . set_markup ( ' <span weight= " heavy " size= " x-large " > %s </span> \n %s ' % \
( new_jid , subject ) )
2005-06-15 11:59:44 +02:00
event_box = name_label . get_parent ( )
2005-06-24 16:20:24 +02:00
if subject == ' ' :
subject = _ ( ' This room has no subject ' )
2005-06-15 11:59:44 +02:00
self . subject_tooltip [ new_jid ] . set_tip ( event_box , subject )
2005-09-14 02:51:26 +02:00
2005-04-14 19:07:55 +02:00
chat . Chat . on_chat_notebook_switch_page ( self , notebook , page , page_num )
2005-03-11 18:57:35 +01:00
def get_role_iter ( self , room_jid , role ) :
model = self . list_treeview [ room_jid ] . get_model ( )
fin = False
iter = model . get_iter_root ( )
if not iter :
return None
while not fin :
2005-08-26 02:52:44 +02:00
role_name = model . get_value ( iter , 1 ) . decode ( ' utf-8 ' )
2005-06-27 11:10:29 +02:00
if role == role_name :
2005-03-11 18:57:35 +01:00
return iter
iter = model . iter_next ( iter )
if not iter :
fin = True
return None
2005-07-07 18:38:36 +02:00
def get_contact_iter ( self , room_jid , nick ) :
2005-03-11 18:57:35 +01:00
model = self . list_treeview [ room_jid ] . get_model ( )
fin = False
role_iter = model . get_iter_root ( )
if not role_iter :
return None
while not fin :
fin2 = False
user_iter = model . iter_children ( role_iter )
if not user_iter :
2005-04-22 01:20:18 +02:00
fin2 = True
2005-03-11 18:57:35 +01:00
while not fin2 :
2005-08-26 02:52:44 +02:00
if nick == model . get_value ( user_iter , 1 ) . decode ( ' utf-8 ' ) :
2005-03-11 18:57:35 +01:00
return user_iter
user_iter = model . iter_next ( user_iter )
if not user_iter :
fin2 = True
role_iter = model . iter_next ( role_iter )
if not role_iter :
fin = True
return None
def get_nick_list ( self , room_jid ) :
2005-06-19 15:09:06 +02:00
''' get nicks of contacts in a room '''
2005-07-25 22:04:24 +02:00
return gajim . gc_contacts [ self . account ] [ room_jid ] . keys ( )
2005-03-11 18:57:35 +01:00
2005-07-21 19:54:58 +02:00
def remove_contact ( self , room_jid , nick ) :
2005-07-21 00:15:35 +02:00
""" Remove a user from the contacts_list """
2005-03-11 18:57:35 +01:00
model = self . list_treeview [ room_jid ] . get_model ( )
2005-07-07 18:38:36 +02:00
iter = self . get_contact_iter ( room_jid , nick )
2005-03-11 18:57:35 +01:00
if not iter :
return
2005-07-25 22:04:24 +02:00
if gajim . gc_contacts [ self . account ] [ room_jid ] . has_key ( nick ) :
del gajim . gc_contacts [ self . account ] [ room_jid ] [ nick ]
2005-03-11 18:57:35 +01:00
parent_iter = model . iter_parent ( iter )
model . remove ( iter )
if model . iter_n_children ( parent_iter ) == 0 :
model . remove ( parent_iter )
2005-06-27 11:10:29 +02:00
def escape ( self , s ) :
return s . replace ( ' & ' , ' & ' ) . replace ( ' < ' , ' < ' ) . replace ( ' > ' , ' > ' )
2005-03-11 18:57:35 +01:00
2005-09-03 19:30:49 +02:00
def add_contact_to_roster ( self , room_jid , nick , show , role , jid , affiliation , status ) :
2005-03-11 18:57:35 +01:00
model = self . list_treeview [ room_jid ] . get_model ( )
2005-04-23 03:37:05 +02:00
image = self . plugin . roster . jabber_state_images [ show ]
2005-06-26 21:40:57 +02:00
resource = ' '
2005-08-24 16:08:35 +02:00
role_name = helpers . get_uf_role ( role , plural = True )
2005-07-18 16:14:40 +02:00
2005-06-26 21:40:57 +02:00
if jid :
2005-07-20 13:52:43 +02:00
jids = jid . split ( ' / ' , 1 )
2005-06-26 21:40:57 +02:00
j = jids [ 0 ]
if len ( jids ) > 1 :
resource = jids [ 1 ]
else :
2005-07-20 13:53:30 +02:00
j = ' '
2005-03-11 18:57:35 +01:00
role_iter = self . get_role_iter ( room_jid , role )
2005-07-22 14:47:58 +02:00
if not role_iter :
2005-04-23 03:37:05 +02:00
role_iter = model . append ( None ,
2005-06-27 11:10:29 +02:00
( self . plugin . roster . jabber_state_images [ ' closed ' ] , role ,
2005-07-22 14:47:58 +02:00
' <b> %s </b> ' % role_name ) )
2005-06-27 11:10:29 +02:00
iter = model . append ( role_iter , ( image , nick , self . escape ( nick ) ) )
2005-07-25 22:04:24 +02:00
gajim . gc_contacts [ self . account ] [ room_jid ] [ nick ] = \
Contact ( jid = j , name = nick , show = show , resource = resource ,
2005-09-03 19:30:49 +02:00
role = role , affiliation = affiliation , status = status )
2005-08-03 11:23:36 +02:00
if nick == self . nicks [ room_jid ] : # we became online
2005-08-04 13:14:52 +02:00
self . got_connected ( room_jid )
2005-06-10 15:11:34 +02:00
self . list_treeview [ room_jid ] . expand_row ( ( model . get_path ( role_iter ) ) ,
2005-03-11 18:57:35 +01:00
False )
return iter
2005-06-26 21:40:57 +02:00
def get_role ( self , room_jid , nick ) :
2005-07-25 22:04:24 +02:00
if gajim . gc_contacts [ self . account ] [ room_jid ] . has_key ( nick ) :
return gajim . gc_contacts [ self . account ] [ room_jid ] [ nick ] . role
2005-06-30 23:33:12 +02:00
else :
return ' visitor '
2005-03-11 18:57:35 +01:00
2005-04-23 03:37:05 +02:00
def update_state_images ( self ) :
roster = self . plugin . roster
2005-03-31 21:21:48 +02:00
for room_jid in self . list_treeview :
model = self . list_treeview [ room_jid ] . get_model ( )
role_iter = model . get_iter_root ( )
if not role_iter :
continue
while role_iter :
user_iter = model . iter_children ( role_iter )
if not user_iter :
continue
while user_iter :
2005-08-26 02:52:44 +02:00
nick = model . get_value ( user_iter , 1 ) . decode ( ' utf-8 ' )
2005-07-25 22:04:24 +02:00
show = gajim . gc_contacts [ self . account ] [ room_jid ] [ nick ] . show
2005-04-23 03:37:05 +02:00
state_images = roster . get_appropriate_state_images ( room_jid )
image = state_images [ show ] #FIXME: always Jabber why?
model . set_value ( user_iter , 0 , image )
2005-03-31 21:21:48 +02:00
user_iter = model . iter_next ( user_iter )
role_iter = model . iter_next ( role_iter )
2005-07-19 21:40:36 +02:00
def chg_contact_status ( self , room_jid , nick , show , status , role , affiliation ,
2005-06-19 00:09:31 +02:00
jid , reason , actor , statusCode , new_nick , account ) :
2005-05-14 03:29:53 +02:00
""" When a user changes his status """
2005-06-30 17:16:57 +02:00
if show == ' invisible ' :
return
2005-05-07 11:08:54 +02:00
if not role :
2005-05-15 11:29:45 +02:00
role = ' visitor '
2005-03-11 18:57:35 +01:00
model = self . list_treeview [ room_jid ] . get_model ( )
2005-07-23 16:12:59 +02:00
if show in ( ' offline ' , ' error ' ) :
2005-03-11 18:57:35 +01:00
if statusCode == ' 307 ' :
2005-09-12 12:54:10 +02:00
if actor is None : # do not print 'kicked by None'
s = _ ( ' %(nick)s has been kicked: %(reason)s ' ) % {
' nick ' : nick ,
' reason ' : reason }
else :
s = _ ( ' %(nick)s has been kicked by %(who)s : %(reason)s ' ) % {
' nick ' : nick ,
' who ' : actor ,
' reason ' : reason }
2005-09-03 18:30:01 +02:00
self . print_conversation ( s , room_jid )
#FIXME: this produced foo has been kicked by JID: reason
# Should we show the JID to everyone? the same for ban
# I propose we use nick
2005-07-22 19:04:24 +02:00
elif statusCode == ' 301 ' :
2005-09-12 12:54:10 +02:00
if actor is None : # do not print 'banned by None'
s = _ ( ' %(nick)s has been banned: %(reason)s ' ) % {
' nick ' : nick ,
' reason ' : reason }
else :
s = _ ( ' %(nick)s has been banned by %(who)s : %(reason)s ' ) % {
' nick ' : nick ,
' who ' : actor ,
' reason ' : reason }
2005-09-03 18:30:01 +02:00
self . print_conversation ( s , room_jid )
2005-06-19 00:09:31 +02:00
elif statusCode == ' 303 ' : # Someone changed his nick
2005-06-19 01:44:33 +02:00
if nick == self . nicks [ room_jid ] : # We changed our nick
2005-06-19 00:09:31 +02:00
self . nicks [ room_jid ] = new_nick
2005-09-03 18:30:01 +02:00
s = _ ( ' You are now known as %s ' ) % new_nick
else :
s = _ ( ' %s is now known as %s ' ) % ( nick , new_nick )
self . print_conversation ( s , room_jid )
2005-07-21 19:54:58 +02:00
self . remove_contact ( room_jid , nick )
2005-06-19 00:09:31 +02:00
if nick == self . nicks [ room_jid ] and statusCode != ' 303 ' : # We became offline
2005-08-03 11:23:36 +02:00
self . got_disconnected ( room_jid )
2005-03-11 18:57:35 +01:00
else :
2005-07-07 18:38:36 +02:00
iter = self . get_contact_iter ( room_jid , nick )
2005-03-11 18:57:35 +01:00
if not iter :
2005-08-24 16:08:35 +02:00
iter = self . add_contact_to_roster ( room_jid , nick , show , role , jid ,
2005-09-03 19:30:49 +02:00
affiliation , status )
2005-03-11 18:57:35 +01:00
else :
2005-06-26 21:40:57 +02:00
actual_role = self . get_role ( room_jid , nick )
2005-03-11 18:57:35 +01:00
if role != actual_role :
2005-07-21 19:54:58 +02:00
self . remove_contact ( room_jid , nick )
2005-07-18 16:14:40 +02:00
self . add_contact_to_roster ( room_jid , nick , show , role , jid ,
2005-09-03 19:30:49 +02:00
affiliation , status )
2005-03-11 18:57:35 +01:00
else :
2005-07-25 22:04:24 +02:00
c = gajim . gc_contacts [ self . account ] [ room_jid ] [ nick ]
2005-07-19 21:40:36 +02:00
if c . show == show and c . status == status and \
c . affiliation == affiliation : #no change
2005-07-19 21:43:34 +02:00
return
2005-07-19 21:40:36 +02:00
c . show = show
c . affiliation = affiliation
2005-09-03 19:30:49 +02:00
c . status = status
2005-04-23 03:37:05 +02:00
roster = self . plugin . roster
2005-06-26 21:40:57 +02:00
state_images = roster . get_appropriate_state_images ( jid )
2005-04-23 15:39:15 +02:00
image = state_images [ show ]
2005-04-23 03:37:05 +02:00
model . set_value ( iter , 0 , image )
2005-06-04 15:25:26 +02:00
if ( time . time ( ) - self . room_creation [ room_jid ] ) > 30 and \
2005-06-19 00:09:31 +02:00
nick != self . nicks [ room_jid ] and statusCode != ' 303 ' :
2005-06-08 00:49:17 +02:00
if show == ' offline ' :
st = _ ( ' %s has left ' ) % nick
else :
2005-06-10 17:25:48 +02:00
st = _ ( ' %s is now %s ' ) % ( nick , helpers . get_uf_show ( show ) )
2005-06-08 00:49:17 +02:00
if status :
st + = ' ( ' + status + ' ) '
self . print_conversation ( st , room_jid )
2005-06-04 15:25:26 +02:00
2005-03-11 18:57:35 +01:00
def set_subject ( self , room_jid , subject ) :
self . subjects [ room_jid ] = subject
2005-06-10 22:06:01 +02:00
name_label = self . name_labels [ room_jid ]
2005-08-01 17:25:11 +02:00
full_subject = None
2005-09-11 15:56:38 +02:00
subject = gtkgui_helpers . reduce_chars_newlines ( subject , 0 , 2 )
2005-07-23 15:09:36 +02:00
subject = gtkgui_helpers . escape_for_pango_markup ( subject )
2005-08-08 11:09:30 +02:00
name_label . set_markup (
' <span weight= " heavy " size= " x-large " > %s </span> \n %s ' % ( room_jid , subject ) )
2005-06-15 11:59:44 +02:00
event_box = name_label . get_parent ( )
2005-06-24 16:20:24 +02:00
if subject == ' ' :
subject = _ ( ' This room has no subject ' )
2005-08-01 17:25:11 +02:00
if full_subject is not None :
subject = full_subject # tooltip must always hold ALL the subject
2005-06-15 11:59:44 +02:00
self . subject_tooltip [ room_jid ] . set_tip ( event_box , subject )
2005-03-11 18:57:35 +01:00
2005-08-08 00:10:29 +02:00
2005-05-14 03:29:53 +02:00
def on_change_subject_menuitem_activate ( self , widget ) :
2005-03-11 18:57:35 +01:00
room_jid = self . get_active_jid ( )
2005-07-23 01:25:29 +02:00
subject = self . subjects [ room_jid ]
2005-06-19 01:50:54 +02:00
instance = dialogs . InputDialog ( _ ( ' Changing Subject ' ) ,
2005-06-11 16:38:23 +02:00
_ ( ' Please specify the new subject: ' ) , subject )
2005-06-19 01:44:33 +02:00
response = instance . get_response ( )
2005-05-14 03:29:53 +02:00
if response == gtk . RESPONSE_OK :
2005-08-26 02:52:44 +02:00
subject = instance . input_entry . get_text ( ) . decode ( ' utf-8 ' )
2005-05-14 03:29:53 +02:00
gajim . connections [ self . account ] . send_gc_subject ( room_jid , subject )
2005-06-19 00:09:31 +02:00
def on_change_nick_menuitem_activate ( self , widget ) :
room_jid = self . get_active_jid ( )
nick = self . nicks [ room_jid ]
2005-06-19 01:50:54 +02:00
instance = dialogs . InputDialog ( _ ( ' Changing Nickname ' ) ,
2005-06-19 00:09:31 +02:00
_ ( ' Please specify the new nickname you want to use: ' ) , nick )
2005-06-26 21:40:57 +02:00
response = instance . get_response ( )
2005-06-19 00:09:31 +02:00
if response == gtk . RESPONSE_OK :
2005-08-26 02:52:44 +02:00
nick = instance . input_entry . get_text ( ) . decode ( ' utf-8 ' )
2005-09-04 00:09:55 +02:00
self . nicks [ room_jid ] = nick
2005-06-19 01:44:33 +02:00
gajim . connections [ self . account ] . change_gc_nick ( room_jid , nick )
2005-08-03 12:40:29 +02:00
2005-05-14 03:29:53 +02:00
def on_configure_room_menuitem_activate ( self , widget ) :
2005-04-20 12:21:33 +02:00
room_jid = self . get_active_jid ( )
gajim . connections [ self . account ] . request_gc_config ( room_jid )
2005-06-13 14:20:34 +02:00
def on_bookmark_room_menuitem_activate ( self , widget ) :
2005-06-07 20:21:36 +02:00
room_jid = self . get_active_jid ( )
2005-07-19 13:57:50 +02:00
bm = {
' name ' : room_jid ,
2005-08-14 18:12:36 +02:00
' jid ' : room_jid ,
' autojoin ' : ' 0 ' ,
' password ' : ' ' ,
' nick ' : self . nicks [ room_jid ]
}
2005-06-08 00:02:51 +02:00
for bookmark in gajim . connections [ self . account ] . bookmarks :
if bookmark [ ' jid ' ] == bm [ ' jid ' ] :
2005-06-10 23:14:16 +02:00
dialogs . ErrorDialog (
2005-06-11 18:15:01 +02:00
_ ( ' Bookmark already set ' ) ,
_ ( ' Room " %s " is already in your bookmarks. ' ) % bm [ ' jid ' ] ) . get_response ( )
2005-06-08 00:02:51 +02:00
return
2005-06-07 20:21:36 +02:00
gajim . connections [ self . account ] . bookmarks . append ( bm )
gajim . connections [ self . account ] . store_bookmarks ( )
2005-06-19 00:09:31 +02:00
2005-06-12 13:21:50 +02:00
self . plugin . roster . make_menu ( )
2005-06-07 20:21:36 +02:00
2005-06-12 13:54:08 +02:00
dialogs . InformationDialog (
_ ( ' Bookmark has been added successfully ' ) ,
2005-08-14 18:12:36 +02:00
_ ( ' You can manage your bookmarks via Actions menu in your roster. ' ) )
2005-06-12 13:54:08 +02:00
2005-03-11 18:57:35 +01:00
def on_message_textview_key_press_event ( self , widget , event ) :
""" When a key is pressed:
2005-06-10 15:11:34 +02:00
if enter is pressed without the shift key , message ( if not empty ) is sent
and printed in the conversation . Tab does autocomplete in nicknames """
2005-04-23 20:03:17 +02:00
room_jid = self . get_active_jid ( )
conversation_textview = self . xmls [ room_jid ] . get_widget (
' conversation_textview ' )
2005-06-07 18:25:55 +02:00
message_buffer = widget . get_buffer ( )
start_iter , end_iter = message_buffer . get_bounds ( )
2005-08-26 02:52:44 +02:00
message = message_buffer . get_text ( start_iter , end_iter , False ) . decode ( ' utf-8 ' )
2005-06-07 18:25:55 +02:00
2005-05-15 22:58:04 +02:00
if event . keyval == gtk . keysyms . ISO_Left_Tab : # SHIFT + TAB
if ( event . state & gtk . gdk . CONTROL_MASK ) : # CTRL + SHIFT + TAB
2005-04-12 17:30:09 +02:00
self . notebook . emit ( ' key_press_event ' , event )
2005-05-15 22:58:04 +02:00
elif event . keyval == gtk . keysyms . Tab : # TAB
if event . state & gtk . gdk . CONTROL_MASK : # CTRL + TAB
2005-04-12 17:30:09 +02:00
self . notebook . emit ( ' key_press_event ' , event )
2005-04-18 23:41:23 +02:00
else :
cursor_position = message_buffer . get_insert ( )
end_iter = message_buffer . get_iter_at_mark ( cursor_position )
2005-08-26 02:52:44 +02:00
text = message_buffer . get_text ( start_iter , end_iter , False ) . decode ( ' utf-8 ' )
2005-05-20 19:25:21 +02:00
if not text or text . endswith ( ' ' ) :
2005-06-10 17:15:47 +02:00
if not self . last_key_tabs [ room_jid ] : # if we are nick cycling, last char will always be space
return False
2005-06-19 19:06:41 +02:00
2005-06-20 10:14:06 +02:00
splitted_text = text . split ( )
2005-06-19 19:06:41 +02:00
# command completion
2005-06-20 10:14:06 +02:00
if text . startswith ( ' / ' ) and len ( splitted_text ) == 1 :
text = splitted_text [ 0 ]
2005-06-19 19:06:41 +02:00
if len ( text ) == 1 : # user wants to cycle all commands
self . cmd_hits [ room_jid ] = self . muc_cmds
else :
# cycle possible commands depending on what the user typed
if self . last_key_tabs [ room_jid ] and \
self . cmd_hits [ room_jid ] [ 0 ] . startswith ( text . lstrip ( ' / ' ) ) :
self . cmd_hits [ room_jid ] . append ( self . cmd_hits [ room_jid ] [ 0 ] )
self . cmd_hits [ room_jid ] . pop ( 0 )
else : # find possible commands
self . cmd_hits [ room_jid ] = [ ]
for cmd in self . muc_cmds :
if cmd . startswith ( text . lstrip ( ' / ' ) ) :
self . cmd_hits [ room_jid ] . append ( cmd )
2005-06-20 00:45:33 +02:00
if len ( self . cmd_hits [ room_jid ] ) :
message_buffer . delete ( start_iter , end_iter )
message_buffer . insert_at_cursor ( ' / ' + \
2005-06-20 10:14:06 +02:00
self . cmd_hits [ room_jid ] [ 0 ] + ' ' )
2005-06-20 00:45:33 +02:00
self . last_key_tabs [ room_jid ] = True
2005-06-19 19:06:41 +02:00
return True
# nick completion
2005-06-11 00:04:59 +02:00
# check if tab is pressed with empty message
if len ( splitted_text ) : # if there are any words
begin = splitted_text [ - 1 ] # last word we typed
2005-06-10 17:15:47 +02:00
2005-09-07 19:08:32 +02:00
if len ( self . nick_hits [ room_jid ] ) and \
self . nick_hits [ room_jid ] [ 0 ] . startswith ( begin . replace (
self . gc_refer_to_nick_char , ' ' ) ) and \
self . last_key_tabs [ room_jid ] : # we should cycle
self . nick_hits [ room_jid ] . append ( self . nick_hits [ room_jid ] [ 0 ] )
self . nick_hits [ room_jid ] . pop ( 0 )
2005-06-10 17:15:47 +02:00
else :
2005-09-07 19:08:32 +02:00
self . nick_hits [ room_jid ] = [ ] # clear the hit list
list_nick = self . get_nick_list ( room_jid )
for nick in list_nick :
if nick . lower ( ) . startswith ( begin . lower ( ) ) : # the word is the begining of a nick
self . nick_hits [ room_jid ] . append ( nick )
if len ( self . nick_hits [ room_jid ] ) :
if len ( splitted_text ) == 1 : # This is the 1st word of the line
add = self . gc_refer_to_nick_char + ' '
else :
add = ' '
start_iter = end_iter . copy ( )
if self . last_key_tabs [ room_jid ] and begin . endswith ( ' , ' ) :
# have to accomodate for the added space from last completion
start_iter . backward_chars ( len ( begin ) + 2 )
elif self . last_key_tabs [ room_jid ] :
# have to accomodate for the added space from last completion
start_iter . backward_chars ( len ( begin ) + 1 )
else :
start_iter . backward_chars ( len ( begin ) )
2005-06-10 17:15:47 +02:00
2005-09-07 19:08:32 +02:00
message_buffer . delete ( start_iter , end_iter )
message_buffer . insert_at_cursor ( self . nick_hits [ room_jid ] [ 0 ] + add )
self . last_key_tabs [ room_jid ] = True
return True
2005-06-10 17:15:47 +02:00
self . last_key_tabs [ room_jid ] = False
2005-05-15 19:49:40 +02:00
return False
2005-04-03 11:13:14 +02:00
elif event . keyval == gtk . keysyms . Page_Down : # PAGE DOWN
if event . state & gtk . gdk . CONTROL_MASK : # CTRL + PAGE DOWN
self . notebook . emit ( ' key_press_event ' , event )
elif event . state & gtk . gdk . SHIFT_MASK : # SHIFT + PAGE DOWN
conversation_textview . emit ( ' key_press_event ' , event )
elif event . keyval == gtk . keysyms . Page_Up : # PAGE UP
if event . state & gtk . gdk . CONTROL_MASK : # CTRL + PAGE UP
self . notebook . emit ( ' key_press_event ' , event )
elif event . state & gtk . gdk . SHIFT_MASK : # SHIFT + PAGE UP
conversation_textview . emit ( ' key_press_event ' , event )
elif event . keyval == gtk . keysyms . Return or \
event . keyval == gtk . keysyms . KP_Enter : # ENTER
2005-03-11 18:57:35 +01:00
if ( event . state & gtk . gdk . SHIFT_MASK ) :
2005-06-10 17:15:47 +02:00
self . last_key_tabs [ room_jid ] = False
2005-04-12 17:30:09 +02:00
return False
2005-06-11 00:04:59 +02:00
self . send_gc_message ( message )
2005-07-19 19:11:33 +02:00
message_buffer . set_text ( ' ' )
2005-04-12 17:30:09 +02:00
return True
2005-06-07 18:25:55 +02:00
elif event . keyval == gtk . keysyms . Up :
if event . state & gtk . gdk . CONTROL_MASK : #Ctrl+UP
self . sent_messages_scroll ( room_jid , ' up ' , widget . get_buffer ( ) )
2005-06-26 15:10:37 +02:00
return True # override the default gtk+ thing for ctrl+up
2005-06-07 18:25:55 +02:00
elif event . keyval == gtk . keysyms . Down :
if event . state & gtk . gdk . CONTROL_MASK : #Ctrl+Down
self . sent_messages_scroll ( room_jid , ' down ' , widget . get_buffer ( ) )
2005-06-26 15:10:37 +02:00
return True # override the default gtk+ thing for ctrl+down
2005-06-10 17:15:47 +02:00
else :
self . last_key_tabs [ room_jid ] = False
2005-03-11 18:57:35 +01:00
2005-06-11 00:04:59 +02:00
def on_send_button_clicked ( self , widget ) :
""" When send button is pressed: send the current message """
room_jid = self . get_active_jid ( )
message_textview = self . xmls [ room_jid ] . get_widget (
' message_textview ' )
message_buffer = message_textview . get_buffer ( )
start_iter = message_buffer . get_start_iter ( )
end_iter = message_buffer . get_end_iter ( )
2005-08-26 02:52:44 +02:00
message = message_buffer . get_text ( start_iter , end_iter , 0 ) . decode ( ' utf-8 ' )
2005-06-11 00:04:59 +02:00
# send the message
self . send_gc_message ( message )
2005-07-19 19:11:33 +02:00
message_buffer . set_text ( ' ' )
2005-06-11 00:04:59 +02:00
def send_gc_message ( self , message ) :
2005-06-19 15:09:06 +02:00
''' call this function to send our message '''
2005-06-21 22:04:23 +02:00
if not message :
return
2005-06-11 00:04:59 +02:00
room_jid = self . get_active_jid ( )
message_textview = self . xmls [ room_jid ] . get_widget (
' message_textview ' )
2005-06-20 12:01:19 +02:00
conversation_textview = self . xmls [ room_jid ] . get_widget (
' conversation_textview ' )
2005-06-11 00:04:59 +02:00
message_buffer = message_textview . get_buffer ( )
if message != ' ' or message != ' \n ' :
self . save_sent_message ( room_jid , message )
2005-07-31 19:15:42 +02:00
2005-09-14 09:34:17 +02:00
if message . startswith ( ' / ' ) and not message . startswith ( ' /me ' ) :
message = message [ 1 : ]
message_array = message . split ( ' ' , 1 )
command = message_array . pop ( 0 ) . lower ( )
if command == ' clear ' :
self . on_clear ( None , conversation_textview )
self . on_clear ( None , message_textview )
elif command == ' compact ' :
self . set_compact_view ( not self . compact_view_current_state )
self . on_clear ( None , message_textview )
elif command == ' nick ' :
# example: /nick foo
if len ( message_array ) :
gajim . connections [ self . account ] . change_gc_nick ( room_jid ,
nick )
else :
self . get_command_help ( command )
elif command == ' query ' or command == ' chat ' :
# example: /query foo
if len ( message_array ) :
nick = message_array . pop ( 0 )
nicks = self . get_nick_list ( room_jid )
if nick in nicks :
self . on_send_pm ( nick = nick )
else :
self . print_conversation ( ' Nick not found: %s ' % nick , room_jid )
else :
self . get_command_help ( command )
elif command == ' msg ' :
# example: /msg foo Hey, what's up?
if len ( message_array ) :
message_array = message_array [ 0 ] . split ( )
nick = message_array . pop ( 0 )
room_nicks = self . get_nick_list ( room_jid )
if nick in room_nicks :
privmsg = ' ' . join ( message_array )
self . on_send_pm ( nick = nick , msg = privmsg )
else :
self . print_conversation ( ' Nick not found: %s ' % nick , room_jid )
else :
self . get_command_help ( command )
elif command == ' topic ' :
# example: /topic : print topic
# /topic foo : change topic to foo
if len ( message_array ) :
new_topic = message_array . pop ( 0 )
gajim . connections [ self . account ] . send_gc_subject ( room_jid , new_topic )
else :
self . print_conversation ( self . subjects [ room_jid ] , room_jid )
elif command == ' invite ' :
# example: /invite user@example.com reason
if len ( message_array ) :
message_array = message_array [ 0 ] . split ( )
invitee = message_array . pop ( 0 )
if invitee . find ( ' @ ' ) > = 0 :
reason = ' ' . join ( message_array )
gajim . connections [ self . account ] . send_invite ( room_jid , invitee , reason )
self . print_conversation ( ' invited %s . ' % invitee , room_jid )
else :
self . print_conversation ( ' %s doesn \' t appear to be a JID ' % invitee , room_jid )
else :
self . get_command_help ( command )
elif command == ' join ' :
# example: /join room@conference.example.com/nick
if len ( message_array ) :
message_array = message_array [ 0 ]
if message_array . find ( ' @ ' ) > = 0 :
room , servernick = message_array . split ( ' @ ' )
if servernick . find ( ' / ' ) > = 0 :
server , nick = servernick . split ( ' / ' , 1 )
else :
server = servernick
nick = ' '
if self . plugin . windows [ self . account ] . has_key ( ' join_gc ' ) :
self . plugin . windows [ self . account ] [ ' join_gc ' ] . window . present ( )
else :
try :
self . plugin . windows [ self . account ] [ ' join_gc ' ] = dialogs . JoinGroupchatWindow ( self . plugin , self . account , server = server , room = room , nick = nick )
except RuntimeError :
pass
else :
self . print_conversation ( ' %s doesn \' t appear to be a JID ' % message_array , room_jid )
else :
self . get_command_help ( command )
elif command == ' leave ' or command == ' part ' or command == ' close ' :
# FIXME: This doesn't work, we don't leave the room. ick.
self . remove_tab ( room_jid )
elif command == ' ban ' :
if len ( message_array ) :
message_array = message_array [ 0 ] . split ( )
nick = message_array . pop ( 0 )
room_nicks = self . get_nick_list ( room_jid )
reason = ' ' . join ( message_array )
if nick in room_nicks :
ban_jid = gajim . construct_fjid ( room_jid , nick )
gajim . connections [ self . account ] . gc_set_affiliation ( room_jid , ban_jid , ' outcast ' , reason )
elif nick . find ( ' @ ' ) > = 0 :
gajim . connections [ self . account ] . gc_set_affiliation ( room_jid , nick , ' outcast ' , reason )
else :
self . print_conversation ( ' Nick not found: %s ' % nick , room_jid )
else :
self . get_command_help ( command )
elif command == ' kick ' :
if len ( message_array ) :
message_array = message_array [ 0 ] . split ( )
nick = message_array . pop ( 0 )
room_nicks = self . get_nick_list ( room_jid )
reason = ' ' . join ( message_array )
if nick in room_nicks :
gajim . connections [ self . account ] . gc_set_role ( room_jid , nick , ' none ' , reason )
else :
self . print_conversation ( ' Nick not found: %s ' % nick , room_jid )
else :
self . get_command_help ( command )
elif command == ' help ' :
if len ( message_array ) :
subcommand = message_array . pop ( 0 )
self . get_command_help ( subcommand )
else :
self . get_command_help ( command )
elif command == ' me ' :
if len ( message_array ) :
gajim . connections [ self . account ] . send_gc_message ( room_jid , ' / ' + message )
else :
self . get_command_help ( command )
2005-07-23 18:32:04 +02:00
else :
2005-09-14 09:34:17 +02:00
self . print_conversation ( ' No such command: / %s ' % command , room_jid )
2005-07-31 19:15:42 +02:00
return # don't print the command
2005-06-11 00:04:59 +02:00
gajim . connections [ self . account ] . send_gc_message ( room_jid , message )
message_textview . grab_focus ( )
2005-09-14 09:34:17 +02:00
def get_command_help ( self , command ) :
room_jid = self . get_active_jid ( )
if command == ' help ' :
self . print_conversation ( ' Commands: %s ' % self . muc_cmds , room_jid )
elif command == ' ban ' :
self . print_conversation ( ' Usage: / %s <nick|JID> [reason], bans the JID from the room. A nick may be used if present. If user is currently in the room, he/she/it will also be kicked. Does NOT support spaces in nick. ' % command , room_jid )
elif command == ' chat ' or command == ' query ' :
self . print_conversation ( ' Usage: / %s <nick>, opens a private chat window to the specified user. ' % command , room_jid )
elif command == ' clear ' :
self . print_conversation ( ' Usage: / %s , clears the text window. ' % command , room_jid )
elif command == ' close ' or command == ' leave ' or command == ' part ' :
self . print_conversation ( ' Usage: / %s , closes the current window or tab. ' % command , room_jid )
elif command == ' compact ' :
self . print_conversation ( ' Usage: / %s , sets the groupchat window to compact mode. ' % command , room_jid )
elif command == ' invite ' :
self . print_conversation ( ' Usage: / %s <JID> [reason], invites JID to the current room with optional reason. ' % command , room_jid )
elif command == ' join ' :
self . print_conversation ( ' Usage: / %s <room>@<server>[/nick], offers to join room@server optionally using nick. ' % command , room_jid )
elif command == ' kick ' :
self . print_conversation ( ' Usage: / %s <nick> [reason], removes the user specified by nick from the room with optional reason. Does NOT support spaces in nick. ' % command , room_jid )
elif command == ' me ' :
self . print_conversation ( ' Usage: / %s <action>, sends the action to the current room. Use third person (e.g. / %s explodes) ' % ( command , command ) , room_jid )
elif command == ' msg ' :
self . print_conversation ( ' Usage: / %s <nick> [message], opens a private message window and sends message to nick. ' % command , room_jid )
elif command == ' nick ' :
self . print_conversation ( ' Usage: / %s <nick>, changes your nickname. ' % command , room_jid )
elif command == ' topic ' :
self . print_conversation ( ' Usage: / %s [topic], displays the current room topic or changes it if specified. ' % command , room_jid )
else :
self . print_conversation ( ' No help info for / %s ' % command , room_jid )
2005-03-11 18:57:35 +01:00
def print_conversation ( self , text , room_jid , contact = ' ' , tim = None ) :
2005-05-13 18:53:30 +02:00
""" Print a line in the conversation:
if contact is set : it ' s a message from someone
if contact is not set : it ' s a message from the server " " "
2005-08-24 14:45:24 +02:00
if type ( text ) == str :
text = unicode ( text , ' utf-8 ' )
2005-03-16 18:22:20 +01:00
other_tags_for_name = [ ]
2005-06-16 21:14:07 +02:00
other_tags_for_text = [ ]
2005-03-11 18:57:35 +01:00
if contact :
2005-06-17 17:31:21 +02:00
if contact == self . nicks [ room_jid ] : # it's us
2005-03-16 18:22:20 +01:00
kind = ' outgoing '
2005-03-11 18:57:35 +01:00
else :
2005-03-16 18:22:20 +01:00
kind = ' incoming '
2005-09-14 02:51:26 +02:00
# muc-specific chatstate
self . redraw_tab ( room_jid , ' newmsg ' )
2005-03-11 18:57:35 +01:00
else :
2005-03-16 18:22:20 +01:00
kind = ' status '
2005-03-11 18:57:35 +01:00
2005-08-24 14:45:24 +02:00
nick = self . nicks [ room_jid ]
2005-09-14 02:51:26 +02:00
if kind == ' incoming ' and text . lower ( ) . find ( nick . lower ( ) ) != - 1 :
# muc-specific chatstate
self . redraw_tab ( room_jid , ' attention ' )
2005-03-16 18:22:20 +01:00
other_tags_for_name . append ( ' bold ' )
2005-06-16 21:14:07 +02:00
other_tags_for_text . append ( ' marked ' )
2005-06-19 01:44:33 +02:00
2005-06-02 21:38:22 +02:00
chat . Chat . print_conversation_line ( self , text , room_jid , kind , contact ,
2005-06-16 21:14:07 +02:00
tim , other_tags_for_name , [ ] , other_tags_for_text )
2005-03-11 18:57:35 +01:00
def kick ( self , widget , room_jid , nick ) :
""" kick a user """
2005-07-02 20:33:51 +02:00
# ask for reason
instance = dialogs . InputDialog ( _ ( ' Kicking %s ' ) % nick ,
2005-07-19 13:57:50 +02:00
_ ( ' You may specify a reason below: ' ) )
2005-07-02 20:33:51 +02:00
response = instance . get_response ( )
if response == gtk . RESPONSE_OK :
2005-08-26 02:52:44 +02:00
reason = instance . input_entry . get_text ( ) . decode ( ' utf-8 ' )
2005-07-02 20:33:51 +02:00
else :
return # stop kicking procedure
2005-07-19 13:57:50 +02:00
gajim . connections [ self . account ] . gc_set_role ( room_jid , nick , ' none ' ,
reason )
2005-03-11 18:57:35 +01:00
def grant_voice ( self , widget , room_jid , nick ) :
""" grant voice privilege to a user """
2005-04-14 11:38:08 +02:00
gajim . connections [ self . account ] . gc_set_role ( room_jid , nick , ' participant ' )
2005-03-11 18:57:35 +01:00
def revoke_voice ( self , widget , room_jid , nick ) :
""" revoke voice privilege to a user """
2005-04-14 11:38:08 +02:00
gajim . connections [ self . account ] . gc_set_role ( room_jid , nick , ' visitor ' )
2005-03-11 18:57:35 +01:00
def grant_moderator ( self , widget , room_jid , nick ) :
""" grant moderator privilege to a user """
2005-04-14 11:38:08 +02:00
gajim . connections [ self . account ] . gc_set_role ( room_jid , nick , ' moderator ' )
2005-03-11 18:57:35 +01:00
def revoke_moderator ( self , widget , room_jid , nick ) :
""" revoke moderator privilege to a user """
2005-04-14 11:38:08 +02:00
gajim . connections [ self . account ] . gc_set_role ( room_jid , nick , ' participant ' )
2005-03-11 18:57:35 +01:00
def ban ( self , widget , room_jid , jid ) :
""" ban a user """
2005-07-22 14:50:14 +02:00
# to ban we know the real jid. so jid is not fakejid
2005-07-22 16:30:35 +02:00
nick = gajim . get_nick_from_jid ( jid )
2005-07-02 20:33:51 +02:00
# ask for reason
instance = dialogs . InputDialog ( _ ( ' Banning %s ' ) % nick ,
2005-07-19 13:57:50 +02:00
_ ( ' You may specify a reason below: ' ) )
2005-07-02 20:33:51 +02:00
response = instance . get_response ( )
if response == gtk . RESPONSE_OK :
2005-08-26 02:52:44 +02:00
reason = instance . input_entry . get_text ( ) . decode ( ' utf-8 ' )
2005-07-02 20:33:51 +02:00
else :
return # stop banning procedure
2005-07-19 13:57:50 +02:00
gajim . connections [ self . account ] . gc_set_affiliation ( room_jid , jid ,
' outcast ' , reason )
2005-03-11 18:57:35 +01:00
def grant_membership ( self , widget , room_jid , jid ) :
""" grant membership privilege to a user """
2005-06-13 14:20:34 +02:00
gajim . connections [ self . account ] . gc_set_affiliation ( room_jid , jid ,
2005-04-14 11:38:08 +02:00
' member ' )
2005-03-11 18:57:35 +01:00
def revoke_membership ( self , widget , room_jid , jid ) :
""" revoke membership privilege to a user """
2005-06-13 14:20:34 +02:00
gajim . connections [ self . account ] . gc_set_affiliation ( room_jid , jid ,
2005-04-14 11:38:08 +02:00
' none ' )
2005-03-11 18:57:35 +01:00
def grant_admin ( self , widget , room_jid , jid ) :
""" grant administrative privilege to a user """
2005-04-14 11:38:08 +02:00
gajim . connections [ self . account ] . gc_set_affiliation ( room_jid , jid , ' admin ' )
2005-03-11 18:57:35 +01:00
def revoke_admin ( self , widget , room_jid , jid ) :
""" revoke administrative privilege to a user """
2005-06-13 14:20:34 +02:00
gajim . connections [ self . account ] . gc_set_affiliation ( room_jid , jid ,
2005-04-14 11:38:08 +02:00
' member ' )
2005-03-11 18:57:35 +01:00
def grant_owner ( self , widget , room_jid , jid ) :
""" grant owner privilege to a user """
2005-04-14 11:38:08 +02:00
gajim . connections [ self . account ] . gc_set_affiliation ( room_jid , jid , ' owner ' )
2005-03-11 18:57:35 +01:00
def revoke_owner ( self , widget , room_jid , jid ) :
""" revoke owner privilege to a user """
2005-04-14 11:38:08 +02:00
gajim . connections [ self . account ] . gc_set_affiliation ( room_jid , jid , ' admin ' )
2005-03-11 18:57:35 +01:00
2005-06-26 21:40:57 +02:00
def on_info ( self , widget , room_jid , nick ) :
2005-03-11 18:57:35 +01:00
""" Call vcard_information_window class to display user ' s information """
2005-07-25 22:04:24 +02:00
c = gajim . gc_contacts [ self . account ] [ room_jid ] [ nick ]
2005-08-04 16:30:41 +02:00
if c . jid and c . resource :
# on GC, we know resource only if we're mod and up
2005-06-26 21:40:57 +02:00
jid = c . jid
fjid = c . jid + ' / ' + c . resource
else :
2005-07-22 16:30:35 +02:00
fjid = gajim . construct_fjid ( room_jid , nick )
2005-06-26 21:40:57 +02:00
jid = fjid
2005-05-12 18:59:51 +02:00
if self . plugin . windows [ self . account ] [ ' infos ' ] . has_key ( jid ) :
2005-05-13 18:53:30 +02:00
self . plugin . windows [ self . account ] [ ' infos ' ] [ jid ] . window . present ( )
2005-05-12 18:59:51 +02:00
else :
2005-07-20 14:48:11 +02:00
# we copy contact because c.jid must contain the fakeJid for vcard
c2 = Contact ( jid = jid , name = c . name , groups = c . groups ,
show = c . show , status = c . status , sub = c . sub ,
resource = c . resource , role = c . role , affiliation = c . affiliation )
2005-03-11 18:57:35 +01:00
self . plugin . windows [ self . account ] [ ' infos ' ] [ jid ] = \
2005-07-20 14:48:11 +02:00
dialogs . VcardWindow ( c2 , self . plugin , self . account , False )
2005-03-11 18:57:35 +01:00
2005-08-04 16:30:41 +02:00
def on_history ( self , widget , room_jid , nick ) :
c = gajim . gc_contacts [ self . account ] [ room_jid ] [ nick ]
if c . jid and c . resource :
# on GC, we know resource only if we're mod and up
jid = c . jid
fjid = c . jid + ' / ' + c . resource
else :
fjid = gajim . construct_fjid ( room_jid , nick )
jid = fjid
self . on_history_menuitem_clicked ( jid = jid )
2005-06-08 11:45:32 +02:00
def on_add_to_roster ( self , widget , jid ) :
2005-06-10 23:14:16 +02:00
dialogs . AddNewContactWindow ( self . plugin , self . account , jid )
2005-06-08 11:45:32 +02:00
2005-06-19 15:09:06 +02:00
def on_send_pm ( self , widget = None , model = None , iter = None , nick = None , msg = None ) :
2005-07-22 14:50:14 +02:00
''' opens a chat window and msg is not None sends private message to a
2005-06-19 15:09:06 +02:00
contact in a room '''
if nick is None :
2005-08-26 02:52:44 +02:00
nick = model [ iter ] [ 1 ] . decode ( ' utf-8 ' )
2005-06-08 00:31:01 +02:00
room_jid = self . get_active_jid ( )
2005-07-22 16:30:35 +02:00
fjid = gajim . construct_fjid ( room_jid , nick ) # 'fake' jid
2005-06-08 00:31:01 +02:00
if not self . plugin . windows [ self . account ] [ ' chats ' ] . has_key ( fjid ) :
2005-07-25 22:04:24 +02:00
show = gajim . gc_contacts [ self . account ] [ room_jid ] [ nick ] . show
2005-06-25 11:18:39 +02:00
u = Contact ( jid = fjid , name = nick , groups = [ ' none ' ] , show = show ,
2005-06-26 21:40:57 +02:00
sub = ' none ' )
2005-06-08 00:31:01 +02:00
self . plugin . roster . new_chat ( u , self . account )
2005-07-18 19:18:25 +02:00
#make active here in case we need to send a message
self . plugin . windows [ self . account ] [ ' chats ' ] [ fjid ] . set_active_tab ( fjid )
2005-06-19 15:09:06 +02:00
if msg :
self . plugin . windows [ self . account ] [ ' chats ' ] [ fjid ] . send_message ( msg )
2005-06-08 00:31:01 +02:00
self . plugin . windows [ self . account ] [ ' chats ' ] [ fjid ] . window . present ( )
2005-07-02 18:35:27 +02:00
def on_voice_checkmenuitem_activate ( self , widget , room_jid , nick ) :
if widget . get_active ( ) :
self . grant_voice ( widget , room_jid , nick )
else :
self . revoke_voice ( widget , room_jid , nick )
def on_moderator_checkmenuitem_activate ( self , widget , room_jid , nick ) :
if widget . get_active ( ) :
self . grant_moderator ( widget , room_jid , nick )
else :
self . revoke_moderator ( widget , room_jid , nick )
def on_member_checkmenuitem_activate ( self , widget , room_jid , jid ) :
if widget . get_active ( ) :
self . grant_membership ( widget , room_jid , jid )
else :
self . revoke_membership ( widget , room_jid , jid )
def on_admin_checkmenuitem_activate ( self , widget , room_jid , jid ) :
if widget . get_active ( ) :
self . grant_admin ( widget , room_jid , jid )
else :
self . revoke_admin ( widget , room_jid , jid )
def on_owner_checkmenuitem_activate ( self , widget , room_jid , jid ) :
if widget . get_active ( ) :
self . grant_owner ( widget , room_jid , jid )
else :
self . revoke_owner ( widget , room_jid , jid )
2005-03-11 18:57:35 +01:00
def mk_menu ( self , room_jid , event , iter ) :
2005-08-07 17:19:21 +02:00
''' Make contact ' s popup menu '''
2005-03-11 18:57:35 +01:00
model = self . list_treeview [ room_jid ] . get_model ( )
2005-08-26 02:52:44 +02:00
nick = model [ iter ] [ 1 ] . decode ( ' utf-8 ' )
2005-07-25 22:04:24 +02:00
c = gajim . gc_contacts [ self . account ] [ room_jid ] [ nick ]
2005-06-26 21:40:57 +02:00
jid = c . jid
target_affiliation = c . affiliation
target_role = c . role
2005-06-20 18:27:06 +02:00
# looking for user's affiliation and role
2005-06-26 21:40:57 +02:00
user_nick = self . nicks [ room_jid ]
2005-07-25 22:04:24 +02:00
user_affiliation = gajim . gc_contacts [ self . account ] [ room_jid ] [ user_nick ] . \
affiliation
2005-06-26 21:40:57 +02:00
user_role = self . get_role ( room_jid , user_nick )
2005-03-11 18:57:35 +01:00
2005-07-02 18:35:27 +02:00
# making menu from glade
xml = gtk . glade . XML ( GTKGUI_GLADE , ' gc_occupants_menu ' , APP )
2005-06-20 18:27:06 +02:00
# these conditions were taken from JEP 0045
2005-07-02 18:35:27 +02:00
item = xml . get_widget ( ' kick_menuitem ' )
item . connect ( ' activate ' , self . kick , room_jid , nick )
2005-09-07 23:25:00 +02:00
if user_role != ' moderator ' or \
( user_affiliation == ' admin ' and target_affiliation == ' owner ' ) or \
( user_affiliation == ' member ' and target_affiliation in ( ' admin ' , ' owner ' ) ) or \
( user_affiliation == ' none ' and target_affiliation != ' none ' ) :
2005-07-02 18:35:27 +02:00
item . set_sensitive ( False )
item = xml . get_widget ( ' voice_checkmenuitem ' )
item . set_active ( target_role != ' visitor ' )
if user_role != ' moderator ' or \
user_affiliation == ' none ' or \
( user_affiliation == ' member ' and target_affiliation != ' none ' ) or \
2005-07-18 16:14:40 +02:00
target_affiliation in ( ' admin ' , ' owner ' ) :
2005-07-02 18:35:27 +02:00
item . set_sensitive ( False )
2005-07-19 13:57:50 +02:00
item . connect ( ' activate ' , self . on_voice_checkmenuitem_activate , room_jid ,
nick )
2005-07-02 18:35:27 +02:00
item = xml . get_widget ( ' moderator_checkmenuitem ' )
item . set_active ( target_role == ' moderator ' )
2005-07-18 16:14:40 +02:00
if not user_affiliation in ( ' admin ' , ' owner ' ) or \
target_affiliation in ( ' admin ' , ' owner ' ) :
2005-07-02 18:35:27 +02:00
item . set_sensitive ( False )
2005-07-19 13:57:50 +02:00
item . connect ( ' activate ' , self . on_moderator_checkmenuitem_activate ,
room_jid , nick )
2005-07-02 18:35:27 +02:00
item = xml . get_widget ( ' ban_menuitem ' )
2005-07-18 16:14:40 +02:00
if not user_affiliation in ( ' admin ' , ' owner ' ) or \
2005-07-19 13:57:50 +02:00
( target_affiliation in ( ' admin ' , ' owner ' ) and \
user_affiliation != ' owner ' ) :
2005-07-02 18:35:27 +02:00
item . set_sensitive ( False )
item . connect ( ' activate ' , self . ban , room_jid , jid )
item = xml . get_widget ( ' member_checkmenuitem ' )
item . set_active ( target_affiliation != ' none ' )
2005-07-18 16:14:40 +02:00
if not user_affiliation in ( ' admin ' , ' owner ' ) or \
2005-07-02 18:35:27 +02:00
( user_affiliation != ' owner ' and target_affiliation in ( ' admin ' , ' owner ' ) ) :
item . set_sensitive ( False )
2005-07-19 13:57:50 +02:00
item . connect ( ' activate ' , self . on_member_checkmenuitem_activate ,
room_jid , jid )
2005-07-02 18:35:27 +02:00
item = xml . get_widget ( ' admin_checkmenuitem ' )
2005-07-18 16:14:40 +02:00
item . set_active ( target_affiliation in ( ' admin ' , ' owner ' ) )
2005-07-02 18:35:27 +02:00
if not user_affiliation == ' owner ' :
item . set_sensitive ( False )
2005-07-19 13:57:50 +02:00
item . connect ( ' activate ' , self . on_admin_checkmenuitem_activate ,
room_jid , jid )
2005-07-02 18:35:27 +02:00
item = xml . get_widget ( ' owner_checkmenuitem ' )
item . set_active ( target_affiliation == ' owner ' )
if not user_affiliation == ' owner ' :
item . set_sensitive ( False )
2005-07-19 13:57:50 +02:00
item . connect ( ' activate ' , self . on_owner_checkmenuitem_activate ,
room_jid , jid )
2005-07-02 18:35:27 +02:00
item = xml . get_widget ( ' information_menuitem ' )
2005-06-26 21:40:57 +02:00
item . connect ( ' activate ' , self . on_info , room_jid , nick )
2005-08-04 16:30:41 +02:00
item = xml . get_widget ( ' history_menuitem ' )
item . connect ( ' activate ' , self . on_history , room_jid , nick )
2005-06-08 11:45:32 +02:00
2005-07-02 18:35:27 +02:00
item = xml . get_widget ( ' add_to_roster_menuitem ' )
if not jid :
item . set_sensitive ( False )
item . connect ( ' activate ' , self . on_add_to_roster , jid )
item = xml . get_widget ( ' send_private_message_menuitem ' )
2005-06-08 10:08:32 +02:00
item . connect ( ' activate ' , self . on_send_pm , model , iter )
2005-07-02 18:35:27 +02:00
# show the popup now!
menu = xml . get_widget ( ' gc_occupants_menu ' )
2005-03-11 18:57:35 +01:00
menu . popup ( None , None , None , event . button , event . time )
2005-08-07 17:19:21 +02:00
self . popup_is_shown = True
menu . connect ( ' deactivate ' , self . on_popup_deactivate )
2005-03-11 18:57:35 +01:00
menu . show_all ( )
2005-06-22 21:39:19 +02:00
2005-03-11 18:57:35 +01:00
def remove_tab ( self , room_jid ) :
2005-04-14 19:07:55 +02:00
chat . Chat . remove_tab ( self , room_jid , ' gc ' )
2005-03-12 22:30:50 +01:00
if len ( self . xmls ) > 0 :
2005-06-13 14:20:34 +02:00
gajim . connections [ self . account ] . send_gc_status ( self . nicks [ room_jid ] ,
2005-04-14 11:38:08 +02:00
room_jid , ' offline ' , ' offline ' )
2005-08-03 13:36:00 +02:00
del self . nicks [ room_jid ]
2005-08-08 09:25:23 +02:00
# They can already be removed by the destroy function
if gajim . gc_contacts [ self . account ] . has_key ( room_jid ) :
del gajim . gc_contacts [ self . account ] [ room_jid ]
del gajim . gc_connected [ self . account ] [ room_jid ]
2005-08-03 13:36:00 +02:00
del self . list_treeview [ room_jid ]
del self . subjects [ room_jid ]
del self . name_labels [ room_jid ]
del self . hpaneds [ room_jid ]
2005-03-11 18:57:35 +01:00
2005-08-04 13:14:52 +02:00
def got_connected ( self , room_jid ) :
gajim . gc_connected [ self . account ] [ room_jid ] = True
self . xmls [ room_jid ] . get_widget ( ' message_textview ' ) . set_sensitive ( True )
self . xmls [ room_jid ] . get_widget ( ' send_button ' ) . set_sensitive ( True )
2005-08-03 11:23:36 +02:00
def got_disconnected ( self , room_jid ) :
model = self . list_treeview [ room_jid ] . get_model ( )
model . clear ( )
gajim . gc_contacts [ self . account ] [ room_jid ] = { }
gajim . gc_connected [ self . account ] [ room_jid ] = False
2005-08-04 13:14:52 +02:00
self . xmls [ room_jid ] . get_widget ( ' message_textview ' ) . set_sensitive ( False )
self . xmls [ room_jid ] . get_widget ( ' send_button ' ) . set_sensitive ( False )
2005-08-03 11:23:36 +02:00
2005-04-23 16:26:04 +02:00
def new_room ( self , room_jid , nick ) :
2005-03-12 22:30:50 +01:00
self . names [ room_jid ] = room_jid . split ( ' @ ' ) [ 0 ]
self . xmls [ room_jid ] = gtk . glade . XML ( GTKGUI_GLADE , ' gc_vbox ' , APP )
self . childs [ room_jid ] = self . xmls [ room_jid ] . get_widget ( ' gc_vbox ' )
2005-04-14 19:07:55 +02:00
chat . Chat . new_tab ( self , room_jid )
2005-08-26 02:52:44 +02:00
self . nicks [ room_jid ] = nick
2005-03-11 18:57:35 +01:00
self . subjects [ room_jid ] = ' '
2005-06-04 15:25:26 +02:00
self . room_creation [ room_jid ] = time . time ( )
2005-06-10 17:15:47 +02:00
self . nick_hits [ room_jid ] = [ ]
2005-06-19 19:06:41 +02:00
self . cmd_hits [ room_jid ] = [ ]
2005-06-10 17:15:47 +02:00
self . last_key_tabs [ room_jid ] = False
2005-06-13 14:20:34 +02:00
self . hpaneds [ room_jid ] = self . xmls [ room_jid ] . get_widget ( ' hpaned ' )
2005-04-23 16:26:04 +02:00
self . list_treeview [ room_jid ] = self . xmls [ room_jid ] . get_widget (
2005-05-13 19:58:54 +02:00
' list_treeview ' )
2005-06-15 11:59:44 +02:00
self . subject_tooltip [ room_jid ] = gtk . Tooltips ( )
2005-06-13 14:20:34 +02:00
# we want to know when the the widget resizes, because that is
# an indication that the hpaned has moved...
2005-06-15 11:59:44 +02:00
# FIXME: Find a better indicator that the hpaned has moved.
2005-07-18 16:14:40 +02:00
self . list_treeview [ room_jid ] . connect ( ' size-allocate ' ,
self . on_treeview_size_allocate )
2005-04-23 16:26:04 +02:00
conversation_textview = self . xmls [ room_jid ] . get_widget (
2005-05-13 19:58:54 +02:00
' conversation_textview ' )
2005-06-10 22:06:01 +02:00
self . name_labels [ room_jid ] = self . xmls [ room_jid ] . get_widget (
' banner_name_label ' )
2005-06-14 00:11:09 +02:00
self . paint_banner ( room_jid )
2005-06-11 11:50:23 +02:00
2005-06-11 00:04:59 +02:00
# connect the menuitems to their respective functions
2005-06-30 15:31:31 +02:00
xm = gtk . glade . XML ( GTKGUI_GLADE , ' gc_popup_menu ' , APP )
2005-06-13 14:49:42 +02:00
xm . signal_autoconnect ( self )
2005-06-30 15:31:31 +02:00
self . gc_popup_menu = xm . get_widget ( ' gc_popup_menu ' )
2005-06-11 00:04:59 +02:00
2005-06-27 11:10:29 +02:00
#status_image, nickname, shown_nick
store = gtk . TreeStore ( gtk . Image , str , str )
2005-05-15 19:36:43 +02:00
store . set_sort_column_id ( 1 , gtk . SORT_ASCENDING )
2005-03-11 18:57:35 +01:00
column = gtk . TreeViewColumn ( ' contacts ' )
2005-04-18 16:05:30 +02:00
renderer_image = cell_renderer_image . CellRendererImage ( )
2005-04-05 17:06:11 +02:00
renderer_image . set_property ( ' width ' , 20 )
column . pack_start ( renderer_image , expand = False )
column . add_attribute ( renderer_image , ' image ' , 0 )
renderer_text = gtk . CellRendererText ( )
column . pack_start ( renderer_text , expand = True )
2005-06-27 11:10:29 +02:00
column . set_attributes ( renderer_text , markup = 2 )
2005-06-11 12:53:54 +02:00
column . set_cell_data_func ( renderer_image , self . tree_cell_data_func , None )
column . set_cell_data_func ( renderer_text , self . tree_cell_data_func , None )
2005-03-11 18:57:35 +01:00
self . list_treeview [ room_jid ] . append_column ( column )
self . list_treeview [ room_jid ] . set_model ( store )
2005-04-05 17:06:11 +02:00
# workaround to avoid gtk arrows to be shown
column = gtk . TreeViewColumn ( ) # 2nd COLUMN
renderer = gtk . CellRendererPixbuf ( )
column . pack_start ( renderer , expand = False )
2005-03-11 18:57:35 +01:00
self . list_treeview [ room_jid ] . append_column ( column )
column . set_visible ( False )
self . list_treeview [ room_jid ] . set_expander_column ( column )
2005-06-13 14:20:34 +02:00
# set the position of the current hpaned
2005-08-04 16:30:41 +02:00
self . hpaneds [ room_jid ] = self . xmls [ room_jid ] . get_widget ( ' hpaned ' )
2005-06-13 14:20:34 +02:00
self . hpaneds [ room_jid ] . set_position ( self . hpaned_position )
2005-03-11 18:57:35 +01:00
self . redraw_tab ( room_jid )
self . show_title ( )
2005-08-04 16:30:41 +02:00
# set an empty subject to show the room_jid
self . set_subject ( room_jid , ' ' )
2005-08-03 11:23:36 +02:00
self . got_disconnected ( room_jid ) #init some variables
2005-05-14 18:34:07 +02:00
conversation_textview . grab_focus ( )
2005-07-01 19:55:41 +02:00
self . childs [ room_jid ] . show_all ( )
2005-09-05 01:30:40 +02:00
def set_state_image ( self , jid ) :
# FIXME: Tab notifications?
pass
2005-08-24 14:58:03 +02:00
def on_list_treeview_motion_notify_event ( self , widget , event ) :
model = widget . get_model ( )
props = widget . get_path_at_pos ( int ( event . x ) , int ( event . y ) )
if self . tooltip . timeout > 0 :
if not props or self . tooltip . id != props [ 0 ] :
self . tooltip . hide_tooltip ( )
if props :
[ row , col , x , y ] = props
iter = None
try :
iter = model . get_iter ( row )
except :
self . tooltip . hide_tooltip ( )
return
room_jid = self . get_active_jid ( )
2005-08-26 02:52:44 +02:00
nick = model [ iter ] [ 1 ] . decode ( ' utf-8 ' )
2005-09-11 19:37:45 +02:00
# FIXME: UGLY!!!! see http://trac.gajim.org/ticket/920
2005-08-24 22:29:12 +02:00
if nick != ' moderator ' and nick != ' participant ' :
2005-08-24 14:58:03 +02:00
account = self . account
img = model [ iter ] [ 0 ]
if self . tooltip . timeout == 0 or self . tooltip . id != props [ 0 ] :
self . tooltip . id = row
self . tooltip . timeout = gobject . timeout_add ( 500 ,
self . show_tooltip , gajim . gc_contacts [ account ] [ room_jid ] [ nick ] )
def on_list_treeview_leave_notify_event ( self , widget , event ) :
model = widget . get_model ( )
props = widget . get_path_at_pos ( int ( event . x ) , int ( event . y ) )
if self . tooltip . timeout > 0 :
if not props or self . tooltip . id == props [ 0 ] :
self . tooltip . hide_tooltip ( )
def show_tooltip ( self , contact ) :
room_jid = self . get_active_jid ( )
pointer = self . list_treeview [ room_jid ] . get_pointer ( )
props = self . list_treeview [ room_jid ] . get_path_at_pos ( pointer [ 0 ] , pointer [ 1 ] )
if props and self . tooltip . id == props [ 0 ] :
# check if the current pointer is at the same path
# as it was before setting the timeout
rect = self . list_treeview [ room_jid ] . get_cell_area ( props [ 0 ] , props [ 1 ] )
2005-08-24 19:29:15 +02:00
position = self . list_treeview [ room_jid ] . window . get_origin ( )
2005-08-24 14:58:03 +02:00
pointer = self . window . get_pointer ( )
2005-08-24 19:29:15 +02:00
self . tooltip . show_tooltip ( contact , ( 0 , rect . height ) ,
( self . window . get_screen ( ) . get_display ( ) . get_pointer ( ) [ 1 ] ,
position [ 1 ] + rect . y ) )
2005-08-24 14:58:03 +02:00
else :
self . tooltip . hide_tooltip ( )
2005-06-13 14:20:34 +02:00
def on_treeview_size_allocate ( self , widget , allocation ) :
""" The MUC treeview has resized. Move the hpaneds in all tabs to match """
thisroom_jid = self . get_active_jid ( )
self . hpaned_position = self . hpaneds [ thisroom_jid ] . get_position ( )
for room_jid in self . xmls :
self . hpaneds [ room_jid ] . set_position ( self . hpaned_position )
2005-06-11 12:53:54 +02:00
def tree_cell_data_func ( self , column , renderer , model , iter , data = None ) :
2005-06-29 23:13:38 +02:00
theme = gajim . config . get ( ' roster_theme ' )
2005-06-11 15:45:48 +02:00
if model . iter_parent ( iter ) :
2005-06-29 23:13:38 +02:00
bgcolor = gajim . config . get_per ( ' themes ' , theme , ' contactbgcolor ' )
2005-06-11 15:45:48 +02:00
else : # it is root (eg. group)
2005-06-29 23:13:38 +02:00
bgcolor = gajim . config . get_per ( ' themes ' , theme , ' groupbgcolor ' )
renderer . set_property ( ' cell-background ' , bgcolor )
2005-06-11 00:04:59 +02:00
2005-03-11 18:57:35 +01:00
def on_list_treeview_button_press_event ( self , widget , event ) :
""" popup user ' s group ' s or agent menu """
2005-06-26 21:40:57 +02:00
room_jid = self . get_active_jid ( )
2005-06-10 18:45:54 +02:00
if event . button == 3 : # right click
try :
path , column , x , y = widget . get_path_at_pos ( int ( event . x ) ,
int ( event . y ) )
except TypeError :
widget . get_selection ( ) . unselect_all ( )
2005-08-07 17:19:21 +02:00
return
2005-06-10 18:45:54 +02:00
widget . get_selection ( ) . select_path ( path )
model = widget . get_model ( )
iter = model . get_iter ( path )
if len ( path ) == 2 :
self . mk_menu ( room_jid , event , iter )
return True
2005-08-07 17:19:21 +02:00
elif event . button == 2 : # middle click
2005-06-23 10:33:25 +02:00
try :
path , column , x , y = widget . get_path_at_pos ( int ( event . x ) ,
int ( event . y ) )
except TypeError :
widget . get_selection ( ) . unselect_all ( )
2005-08-07 17:19:21 +02:00
return
2005-06-23 10:33:25 +02:00
widget . get_selection ( ) . select_path ( path )
model = widget . get_model ( )
iter = model . get_iter ( path )
if len ( path ) == 2 :
2005-08-26 02:52:44 +02:00
nick = model [ iter ] [ 1 ] . decode ( ' utf-8 ' )
2005-07-22 16:30:35 +02:00
fjid = gajim . construct_fjid ( room_jid , nick )
2005-06-23 10:33:25 +02:00
if not self . plugin . windows [ self . account ] [ ' chats ' ] . has_key ( fjid ) :
2005-07-25 22:04:24 +02:00
show = gajim . gc_contacts [ self . account ] [ room_jid ] [ nick ] . show
2005-06-25 11:18:39 +02:00
u = Contact ( jid = fjid , name = nick , groups = [ ' none ' ] ,
show = show , sub = ' none ' )
2005-06-23 10:33:25 +02:00
self . plugin . roster . new_chat ( u , self . account )
self . plugin . windows [ self . account ] [ ' chats ' ] [ fjid ] . set_active_tab ( fjid )
self . plugin . windows [ self . account ] [ ' chats ' ] [ fjid ] . window . present ( )
return True
2005-08-07 17:19:21 +02:00
elif event . button == 1 : # left click
2005-06-10 18:45:54 +02:00
try :
path , column , x , y = widget . get_path_at_pos ( int ( event . x ) ,
int ( event . y ) )
except TypeError :
widget . get_selection ( ) . unselect_all ( )
2005-08-07 17:19:21 +02:00
return
2005-06-10 18:45:54 +02:00
model = widget . get_model ( )
iter = model . get_iter ( path )
2005-08-26 02:52:44 +02:00
nick = model [ iter ] [ 1 ] . decode ( ' utf-8 ' )
2005-07-25 22:04:24 +02:00
if not nick in gajim . gc_contacts [ self . account ] [ room_jid ] : #it's a group
2005-06-10 18:45:54 +02:00
if x < 20 : # first cell in 1st column (the arrow SINGLE clicked)
if ( widget . row_expanded ( path ) ) :
widget . collapse_row ( path )
else :
widget . expand_row ( path , False )
2005-03-11 18:57:35 +01:00
2005-03-26 21:46:23 +01:00
def on_list_treeview_key_press_event ( self , widget , event ) :
2005-05-10 14:19:24 +02:00
if event . keyval == gtk . keysyms . Escape :
widget . get_selection ( ) . unselect_all ( )
2005-03-11 18:57:35 +01:00
2005-04-22 01:20:18 +02:00
def on_list_treeview_row_activated ( self , widget , path , col = 0 ) :
2005-04-05 17:06:11 +02:00
""" When an iter is double clicked: open the chat window """
2005-03-11 18:57:35 +01:00
model = widget . get_model ( )
iter = model . get_iter ( path )
2005-06-07 18:52:24 +02:00
if len ( path ) == 1 : # It's a group
2005-03-11 18:57:35 +01:00
if ( widget . row_expanded ( path ) ) :
widget . collapse_row ( path )
else :
widget . expand_row ( path , False )
2005-06-07 18:52:24 +02:00
else : # We want to send a private message
room_jid = self . get_active_jid ( )
2005-08-26 02:52:44 +02:00
nick = model [ iter ] [ 1 ] . decode ( ' utf-8 ' )
2005-07-22 16:30:35 +02:00
fjid = gajim . construct_fjid ( room_jid , nick )
2005-06-07 18:52:24 +02:00
if not self . plugin . windows [ self . account ] [ ' chats ' ] . has_key ( fjid ) :
2005-07-25 22:04:24 +02:00
show = gajim . gc_contacts [ self . account ] [ room_jid ] [ nick ] . show
2005-06-26 21:40:57 +02:00
u = Contact ( jid = fjid , name = nick , groups = [ ' none ' ] , show = show ,
sub = ' none ' )
2005-06-07 18:52:24 +02:00
self . plugin . roster . new_chat ( u , self . account )
self . plugin . windows [ self . account ] [ ' chats ' ] [ fjid ] . set_active_tab ( fjid )
self . plugin . windows [ self . account ] [ ' chats ' ] [ fjid ] . window . present ( )
2005-03-11 18:57:35 +01:00
def on_list_treeview_row_expanded ( self , widget , iter , path ) :
2005-04-05 17:06:11 +02:00
""" When a row is expanded: change the icon of the arrow """
2005-03-11 18:57:35 +01:00
model = widget . get_model ( )
2005-04-23 15:18:47 +02:00
image = self . plugin . roster . jabber_state_images [ ' opened ' ]
2005-04-23 03:37:05 +02:00
model . set_value ( iter , 0 , image )
2005-03-11 18:57:35 +01:00
def on_list_treeview_row_collapsed ( self , widget , iter , path ) :
2005-04-05 17:06:11 +02:00
""" When a row is collapsed: change the icon of the arrow """
2005-03-11 18:57:35 +01:00
model = widget . get_model ( )
2005-04-23 15:18:47 +02:00
image = self . plugin . roster . jabber_state_images [ ' closed ' ]
2005-04-23 03:37:05 +02:00
model . set_value ( iter , 0 , image )