From 3a6a69cc5707adead58499b33b5f98cf9f61df04 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Thu, 18 Mar 2004 16:38:14 +0000 Subject: [PATCH] cleanup the rest of the code --- core/core.py | 3 +- plugins/gtkgui/gtkgui.glade | 35 +- plugins/gtkgui/gtkgui.py | 817 +++++++++++++++++++----------------- 3 files changed, 457 insertions(+), 398 deletions(-) diff --git a/core/core.py b/core/core.py index 3d8c6237b..8fe110d29 100644 --- a/core/core.py +++ b/core/core.py @@ -177,7 +177,8 @@ class GajimCore: password = self.cfgParser.tab[account]["password"] ressource = self.cfgParser.tab[account]["ressource"] con = common.jabber.Client(host = hostname, \ - debug = [common.jabber.DBG_ALWAYS], log = sys.stderr, \ + debug = [], log = sys.stderr, \ +# debug = [common.jabber.DBG_ALWAYS], log = sys.stderr, \ connection=common.xmlstream.TCP, port=5222) #debug = [common.jabber.DBG_ALWAYS], log = sys.stderr, \ #connection=common.xmlstream.TCP_SSL, port=5223) diff --git a/plugins/gtkgui/gtkgui.glade b/plugins/gtkgui/gtkgui.glade index 2be428448..c0d3d5f0e 100644 --- a/plugins/gtkgui/gtkgui.glade +++ b/plugins/gtkgui/gtkgui.glade @@ -39,7 +39,7 @@ True - + True gtk-convert 1 @@ -61,7 +61,7 @@ - + True gtk-preferences 1 @@ -82,7 +82,7 @@ - + True gtk-select-color 1 @@ -103,7 +103,7 @@ - + True gtk-find 1 @@ -127,10 +127,9 @@ True Add True - - + True gtk-add 1 @@ -167,7 +166,7 @@ - + True gtk-help 1 @@ -189,7 +188,7 @@ - + True gtk-quit 1 @@ -804,6 +803,7 @@ False True False + @@ -1511,7 +1511,7 @@ on the server. gtk-close True GTK_RELIEF_NORMAL - + @@ -1774,7 +1774,7 @@ on the server. gtk-cancel True GTK_RELIEF_NORMAL - + @@ -1818,7 +1818,7 @@ on the server. True GTK_RELIEF_NORMAL -6 - + @@ -2303,7 +2303,7 @@ on the server. True True GTK_RELIEF_NORMAL - + @@ -2518,7 +2518,7 @@ on the server. True True GTK_RELIEF_NORMAL - + @@ -2618,7 +2618,7 @@ on the server. True GTK_RELIEF_NORMAL -7 - + @@ -2684,7 +2684,7 @@ on the server. - + True Préférences GTK_WINDOW_TOPLEVEL @@ -2692,7 +2692,7 @@ on the server. False True False - + @@ -3576,7 +3576,7 @@ when NOT onlie gtk-cancel True GTK_RELIEF_NORMAL - + @@ -3781,6 +3781,7 @@ when NOT onlie False True False + diff --git a/plugins/gtkgui/gtkgui.py b/plugins/gtkgui/gtkgui.py index 0b68c501c..f449f37b3 100644 --- a/plugins/gtkgui/gtkgui.py +++ b/plugins/gtkgui/gtkgui.py @@ -24,8 +24,6 @@ from gtk import TRUE, FALSE import gtk.glade,gobject import os,string,time,Queue import common.optparser,common.sleepy -browserWindow = 0 -accountsWindow = 0 GTKGUI_GLADE='plugins/gtkgui/gtkgui.glade' @@ -52,28 +50,31 @@ class user: class vCard_Window: """Class for window that show vCard information""" - def delete_event(self, widget): + def delete_event(self, widget=None): """close window""" - del self.r.tab_vcard[self.jid] - self.xml.get_widget("vcard").destroy() + del self.plugin.windows[self.account]['infos'][self.jid] + + def on_close(self, widget): + """When Close button is clicked""" + widget.get_toplevel().destroy() + + def set_value(self, entry_name, value): + try: + self.xml.get_widget(entry_name).set_text(value) + except AttributeError, e: + pass def set_values(self, vcard): for i in vcard.keys(): if type(vcard[i]) == type({}): for j in vcard[i].keys(): - try: - self.xml.get_widget('entry_'+i+'_'+j).set_text(vcard[i][j]) - except AttributeError, e: - pass + self.set_value('entry_'+i+'_'+j, vcard[i][j]) else: if i == 'DESC': self.xml.get_widget('textview_DESC').get_buffer().\ set_text(vcard[i], 0) else: - try: - self.xml.get_widget('entry_'+i).set_text(vcard[i]) - except AttributeError, e: - pass + self.set_value('entry_'+i, vcard[i]) def add_to_vcard(self, vcard, entry, txt): """Add an information to the vCard dictionary""" @@ -107,36 +108,34 @@ class vCard_Window: def on_retrieve(self, widget): - acct = self.plugin.accts.which_account(self.user) - if self.plugin.connected[acct]: - self.plugin.send('ASK_VCARD', acct, self.jid) + if self.plugin.connected[self.account]: + self.plugin.send('ASK_VCARD', self.account, self.jid) else: warning_Window("You must be connected to get your informations") def on_publish(self, widget): - acct = self.plugin.accts.which_account(self.user) - if not self.plugin.connected[acct]: + if not self.plugin.connected[self.account]: warning_Window("You must be connected to publish your informations") return vcard = self.make_vcard() - self.plugin.send('VCARD', acct, vcard) + self.plugin.send('VCARD', self.account, vcard) - def __init__(self, plugin, user): + def __init__(self, jid, plugin, account): self.xml = gtk.glade.XML(GTKGUI_GLADE, 'vcard') - self.user = user + self.jid = jid self.plugin = plugin + self.account = account self.xml.signal_connect('gtk_widget_destroy', self.delete_event) - self.xml.signal_connect('on_close_clicked', self.delete_event) + self.xml.signal_connect('on_close_clicked', self.on_close) self.xml.signal_connect('on_retrieve_clicked', self.on_retrieve) self.xml.signal_connect('on_publish_clicked', self.on_publish) class infoUser_Window: """Class for user's information window""" - def delete_event(self, widget): + def delete_event(self, widget=None): """close window""" - del self.r.tab_vcard[self.user.jid] - self.window.destroy() + del self.plugin.windows[self.account]['infos'][self.user.jid] def add_grp_to_user(self, model, path, iter): """Insert user to the group in inter""" @@ -147,19 +146,11 @@ class infoUser_Window: #update: to know if things have changed to send things # to server only if changes are done update = 0 - #update user.name if it's not "" - newName = self.entry_name.get_text() - if newName != self.user.name: - update = 1 - if newName != '': - self.user.name = newName #update user.groups and redraw the user in the roster old_groups = self.user.groups - self.r.remove_user(self.user) self.user.groups = [] model = self.list2.get_model() model.foreach(self.add_grp_to_user) - self.r.add_user(self.user) for g in old_groups: if not g in self.user.groups: update = 1 @@ -170,9 +161,22 @@ class infoUser_Window: update = 1 break if update: - self.r.queueOUT.put(('UPDUSER', (self.user.jid, self.user.name, \ - self.user.groups))) - self.delete_event(self) + new_groups = self.user.groups + self.user.groups = old_groups + self.plugin.roster.remove_user(self.user, self.account) + self.user.groups = new_groups + self.plugin.roster.add_user_to_roster(self.user, self.account) + #update user.name if it's not "" + entry_name = self.xml.get_widget('entry_name') + newName = entry_name.get_text() + if newName != self.user.name: + update = 1 + if newName != '': + self.user.name = newName + if update: + self.plugin.send('UPDUSER', self.account, (self.user.jid, \ + self.user.name, self.user.groups)) + widget.get_toplevel().destroy() def add_grp(self, model, path, iter, stors): """Transfert the iter from stors[0] to stors[1]""" @@ -195,39 +199,39 @@ class infoUser_Window: def on_new_key_pressed(self, widget, event): """If enter is pressed in new group entry, add the group""" if event.keyval == gtk.keysyms.Return: + entry_new = self.xml.get_widget("entry_new") model = self.list1.get_model() - txt = self.entry_new.get_text() + txt = entry_new.get_text() iter = model.append() model.set(iter, 0, txt) - self.entry_new.set_text('') + entry_new.set_text('') return 1 else: return 0 + def set_value(self, entry_name, value): + try: + self.xml.get_widget(entry_name).set_text(value) + except AttributeError, e: + pass + def set_values(self, vcard): - self.vc = vcard for i in vcard.keys(): if type(vcard[i]) == type({}): for j in vcard[i].keys(): - try: - self.xml.get_widget('entry_'+i+'_'+j).set_text(vcard[i][j]) - except AttributeError, e: - pass + self.set_value('entry_'+i+'_'+j, vcard[i][j]) else: if i == 'DESC': self.xml.get_widget('textview_DESC').get_buffer().\ set_text(vcard[i], 0) else: - try: - self.xml.get_widget('entry_'+i).set_text(vcard[i]) - except AttributeError, e: - pass + self.set_value('entry_'+i, vcard[i]) def init_lists(self): """Initialize both available and current listStores""" #list available store = gtk.ListStore(gobject.TYPE_STRING) - for g in self.r.l_group.keys(): + for g in self.plugin.roster.groups[self.account].keys(): if g != 'Agents' and g not in self.user.groups: iter = store.append() store.set(iter, 0, g) @@ -244,27 +248,25 @@ class infoUser_Window: column = gtk.TreeViewColumn('Available', gtk.CellRendererText(), text=0) self.list2.append_column(column) - def __init__(self, user, roster): + def __init__(self, user, plugin, account): self.xml = gtk.glade.XML(GTKGUI_GLADE, 'Info_user') - self.window = self.xml.get_widget("Info_user") - self.r = roster + self.plugin = plugin self.user = user + self.account = account self.list1 = self.xml.get_widget("treeview_available") self.list2 = self.xml.get_widget("treeview_current") - self.entry_new = self.xml.get_widget("entry_new") self.xml.get_widget('label_name').set_text(user.name) self.xml.get_widget('label_id').set_text(user.jid) self.xml.get_widget('label_resource').set_text(user.resource) self.xml.get_widget('label_sub').set_text(user.sub) - self.entry_name = self.xml.get_widget('entry_name') - self.entry_name.set_text(user.name) + self.xml.get_widget('entry_name').set_text(user.name) if not user.status: user.status = '' self.xml.get_widget('label_status').set_text(user.show + ' : ' + \ user.status) self.init_lists() - self.r.queueOUT.put(('ASK_VCARD', self.user.jid)) + plugin.send('ASK_VCARD', account, self.user.jid) self.xml.signal_connect('gtk_widget_destroy', self.delete_event) self.xml.signal_connect('on_close_clicked', self.on_close) @@ -278,7 +280,11 @@ class preference_Window: """Class for Preferences window""" def delete_event(self, widget): """close window""" - self.window.destroy() + del self.plugin.windows['preferences'] + + def on_cancel(self, widget): + """When Cancel button is clicked""" + widget.get_toplevel().destroy() def on_color_button_clicked(self, widget): """Open a ColorSelectionDialog and change button's color""" @@ -311,64 +317,65 @@ class preference_Window: def write_cfg(self): """Save preferences in config File and apply them""" #Color for incomming messages - colSt = '#'+(hex(self.colorIn.red)+'0')[2:4]\ + colSt_in = '#'+(hex(self.colorIn.red)+'0')[2:4]\ +(hex(self.colorIn.green)+'0')[2:4]\ +(hex(self.colorIn.blue)+'0')[2:4] - self.r.plugin.config['inmsgcolor'] = colSt - for j in self.r.tab_messages.keys(): - self.r.tab_messages[j].tagIn.set_property("foreground", colSt) + self.plugin.config['inmsgcolor'] = colSt_in #Color for outgoing messages - colSt = '#'+(hex(self.colorOut.red)+'0')[2:4]\ + colSt_out = '#'+(hex(self.colorOut.red)+'0')[2:4]\ +(hex(self.colorOut.green)+'0')[2:4]\ +(hex(self.colorOut.blue)+'0')[2:4] - self.r.plugin.config['outmsgcolor'] = colSt - for j in self.r.tab_messages.keys(): - self.r.tab_messages[j].tagOut.set_property("foreground", colSt) + self.plugin.config['outmsgcolor'] = colSt_out #Color for status messages - colSt = '#'+(hex(self.colorStatus.red)+'0')[2:4]\ + colSt_status = '#'+(hex(self.colorStatus.red)+'0')[2:4]\ +(hex(self.colorStatus.green)+'0')[2:4]\ +(hex(self.colorStatus.blue)+'0')[2:4] - self.r.plugin.config['statusmsgcolor'] = colSt - for j in self.r.tab_messages.keys(): - self.r.tab_messages[j].tagStatus.set_property("foreground", colSt) + self.plugin.config['statusmsgcolor'] = colSt_status + #update opened chat windows + for a in self.plugin.accounts.keys(): + for w in self.plugin.windows[a]['chats'].keys(): + self.plugin.windows[a]['chats'][w].tagIn.\ + set_property("foreground", colSt_in) + self.plugin.windows[a]['chats'][w].tagIn.\ + set_property("foreground", colSt_out) + self.plugin.windows[a]['chats'][w].tagIn.\ + set_property("foreground", colSt_status) #IconStyle ist = self.combo_iconstyle.entry.get_text() - self.r.plugin.config['iconstyle'] = ist - self.r.iconstyle = ist - self.r.mkpixbufs() + self.plugin.config['iconstyle'] = ist + self.plugin.roster.mkpixbufs() #autopopup pp = self.chk_autopp.get_active() if pp == True: - self.r.plugin.config['autopopup'] = 1 + self.plugin.config['autopopup'] = 1 else: - self.r.plugin.config['autopopup'] = 0 + self.plugin.config['autopopup'] = 0 #autoaway aw = self.chk_autoaway.get_active() if aw == True: - self.r.plugin.config['autoaway'] = 1 + self.plugin.config['autoaway'] = 1 else: - self.r.plugin.config['autoaway'] = 0 + self.plugin.config['autoaway'] = 0 aat = self.spin_autoawaytime.get_value_as_int() - self.r.plugin.config['autoawaytime'] = aat + self.plugin.config['autoawaytime'] = aat #autoxa xa = self.chk_autoxa.get_active() if xa == True: - self.r.plugin.config['autoxa'] = 1 + self.plugin.config['autoxa'] = 1 else: - self.r.plugin.config['autoxa'] = 0 + self.plugin.config['autoxa'] = 0 axt = self.spin_autoxatime.get_value_as_int() - self.r.plugin.config['autoxatime'] = axt - if self.r.plugin.sleeper: - self.r.plugin.sleeper = common.sleepy.Sleepy(\ - self.r.plugin.autoawaytime*60, self.r.plugin.autoxatime*60) - self.r.queueOUT.put(('CONFIG', ('GtkGui', self.r.plugin.config))) - - self.r.redraw_roster() + self.plugin.config['autoxatime'] = axt + if self.plugin.sleeper: + self.plugin.sleeper = common.sleepy.Sleepy(\ + self.plugin['autoawaytime']*60, self.plugin['autoxatime']*60) + self.plugin.send('CONFIG', None, ('GtkGui', self.plugin.config)) + self.plugin.roster.draw_roster() def on_ok(self, widget): """When Ok button is clicked""" self.write_cfg() - self.window.destroy() + self.xml.get_widget('Preferences').destroy() def change_notebook_page(self, number): self.notebook.set_current_page(number) @@ -382,31 +389,30 @@ class preference_Window: def on_presence_button_clicked(self, widget, data=None): self.change_notebook_page(2) - def __init__(self, roster): + def __init__(self, plugin): """Initialize Preference window""" - xml = gtk.glade.XML(GTKGUI_GLADE, 'preferences_window') - self.window = xml.get_widget('preferences_window') - self.r = roster - self.da_in = xml.get_widget('drawing_in') - self.da_out = xml.get_widget('drawing_out') - self.da_status = xml.get_widget('drawing_status') - self.combo_iconstyle = xml.get_widget('combo_iconstyle') - self.chk_autopp = xml.get_widget('chk_autopopup') - self.chk_autoaway = xml.get_widget('chk_autoaway') - self.spin_autoawaytime = xml.get_widget('spin_autoawaytime') - self.chk_autoxa = xml.get_widget('chk_autoxa') - self.spin_autoxatime = xml.get_widget('spin_autoxatime') - self.notebook = xml.get_widget('preferences_notebook') + self.xml = gtk.glade.XML(GTKGUI_GLADE, 'Preferences') + self.plugin = plugin + self.da_in = self.xml.get_widget('drawing_in') + self.da_out = self.xml.get_widget('drawing_out') + self.da_status = self.xml.get_widget('drawing_status') + self.combo_iconstyle = self.xml.get_widget('combo_iconstyle') + self.chk_autopp = self.xml.get_widget('chk_autopopup') + self.chk_autoaway = self.xml.get_widget('chk_autoaway') + self.spin_autoawaytime = self.xml.get_widget('spin_autoawaytime') + self.chk_autoxa = self.xml.get_widget('chk_autoxa') + self.spin_autoxatime = self.xml.get_widget('spin_autoxatime') + self.notebook = self.xml.get_widget('preferences_notebook') - button = xml.get_widget('lookfeel_button') + button = self.xml.get_widget('lookfeel_button') button.connect('clicked', self.on_lookfeel_button_clicked) - button = xml.get_widget('events_button') + button = self.xml.get_widget('events_button') button.connect('clicked', self.on_events_button_clicked) - button = xml.get_widget('presence_button') + button = self.xml.get_widget('presence_button') button.connect('clicked', self.on_presence_button_clicked) #Color for incomming messages - colSt = self.r.plugin.config['inmsgcolor'] + colSt = self.plugin.config['inmsgcolor'] if not colSt: colSt = '#ff0000' cmapIn = self.da_in.get_colormap() @@ -414,7 +420,7 @@ class preference_Window: self.da_in.window.set_background(self.colorIn) #Color for outgoing messages - colSt = self.r.plugin.config['outmsgcolor'] + colSt = self.plugin.config['outmsgcolor'] if not colSt: colSt = '#0000ff' cmapOut = self.da_out.get_colormap() @@ -422,7 +428,7 @@ class preference_Window: self.da_out.window.set_background(self.colorOut) #Color for status messages - colSt = self.r.plugin.config['statusmsgcolor'] + colSt = self.plugin.config['statusmsgcolor'] if not colSt: colSt = '#00ff00' cmapStatus = self.da_status.get_colormap() @@ -438,144 +444,157 @@ class preference_Window: if l.count == 0: l.append(" ") self.combo_iconstyle.set_popdown_strings(l) - if self.r.iconstyle in l: - self.combo_iconstyle.entry.set_text(self.r.iconstyle) + if self.plugin.config['iconstyle'] in l: + self.combo_iconstyle.entry.set_text(self.plugin.config['iconstyle']) #Autopopup st = 0 - if self.r.plugin.config.has_key('autopopup'): - st = self.r.plugin.config['autopopup'] + if self.plugin.config.has_key('autopopup'): + st = self.plugin.config['autopopup'] self.chk_autopp.set_active(st) #Autoaway st = 1 - if self.r.plugin.config.has_key('autoaway'): - st = self.r.plugin.config['autoaway'] + if self.plugin.config.has_key('autoaway'): + st = self.plugin.config['autoaway'] self.chk_autoaway.set_active(st) #Autoawaytime st = 10 - if self.r.plugin.config.has_key('autoawaytime'): - st = self.r.plugin.config['autoawaytime'] + if self.plugin.config.has_key('autoawaytime'): + st = self.plugin.config['autoawaytime'] self.spin_autoawaytime.set_value(st) #Autoxa st = 1 - if self.r.plugin.config.has_key('autoxa'): - st = self.r.plugin.config['autoxa'] + if self.plugin.config.has_key('autoxa'): + st = self.plugin.config['autoxa'] self.chk_autoxa.set_active(st) #Autoxatime st = 20 - if self.r.plugin.config.has_key('autoxatime'): - st = self.r.plugin.config['autoxatime'] + if self.plugin.config.has_key('autoxatime'): + st = self.plugin.config['autoxatime'] self.spin_autoxatime.set_value(st) - xml.signal_connect('gtk_widget_destroy', self.delete_event) - xml.signal_connect('on_but_col_clicked', \ + self.xml.signal_connect('gtk_widget_destroy', self.delete_event) + self.xml.signal_connect('on_but_col_clicked', \ self.on_color_button_clicked) - xml.signal_connect('on_ok_clicked', self.on_ok) + self.xml.signal_connect('on_ok_clicked', self.on_ok) + self.xml.signal_connect('on_cancel_clicked', self.on_cancel) class awayMsg_Window: """Class for Away Message Window""" - def delete_event(self, widget): - """close window""" - self.window.destroy() - def on_ok(self): """When Ok button is clicked""" beg, end = self.txtBuffer.get_bounds() self.msg = self.txtBuffer.get_text(beg, end, 0) - self.window.destroy() + self.xml.get_widget("Away_msg").destroy() def run(self): """Wait for Ok button to be pressed and return away messsage""" - rep = self.window.run() + rep = self.xml.get_widget("Away_msg").run() msg = '' if rep == gtk.RESPONSE_OK: beg, end = self.txtBuffer.get_bounds() msg = self.txtBuffer.get_text(beg, end, 0) - self.window.destroy() + self.xml.get_widget("Away_msg").destroy() return msg def __init__(self): - xml = gtk.glade.XML(GTKGUI_GLADE, 'Away_msg') - self.window = xml.get_widget("Away_msg") - txt = xml.get_widget("textview") + self.xml = gtk.glade.XML(GTKGUI_GLADE, 'Away_msg') + txt = self.xml.get_widget("textview") self.txtBuffer = txt.get_buffer() - xml.signal_connect('gtk_widget_destroy', self.delete_event) class addContact_Window: """Class for Add user window""" def delete_event(self, widget): """close window""" - self.Wadd.destroy() + del self.plugin.windows['add'] + + def on_cancel(self, widget): + """When Cancel button is clicked""" + widget.get_toplevel().destroy() def on_subscribe(self, widget): """When Subscribe button is clicked""" - who = self.entry_who.get_text() - buf = self.textview_sub.get_buffer() + textview_sub = self.xml.get_widget("textview_sub") + entry_who = self.xml.get_widget('entry_who') + who = entry_who.get_text() + buf = textview_sub.get_buffer() start_iter = buf.get_start_iter() end_iter = buf.get_end_iter() txt = buf.get_text(start_iter, end_iter, 0) - self.r.req_sub(self, who, txt) - self.delete_event(self) + self.plugin.roster.req_sub(self, who, txt, self.account) + widget.get_toplevel().destroy() - def __init__(self, roster, jid=None): - self.r = roster - xml = gtk.glade.XML(GTKGUI_GLADE, 'Add') - self.entry_who = xml.get_widget('entry_who') - self.textview_sub = xml.get_widget("textview_sub") + def __init__(self, plugin, account, jid=None): + self.plugin = plugin + self.account = account + self.xml = gtk.glade.XML(GTKGUI_GLADE, 'Add') if jid: - self.entry_who.set_text(jid) - self.Wadd = xml.get_widget("Add") - xml.signal_connect('gtk_widget_destroy', self.delete_event) - xml.signal_connect('on_button_sub_clicked', self.on_subscribe) + self.xml.get_widget('entry_who').set_text(jid) + self.xml.signal_connect('gtk_widget_destroy', self.delete_event) + self.xml.signal_connect('on_button_sub_clicked', self.on_subscribe) + self.xml.signal_connect('on_cancel_clicked', self.on_cancel) class warning_Window: """Class for warning window : print a warning message""" - def delete_event(self, widget): - """close window""" - self.window.destroy() - + def on_close(self, widget): + """When Close button is clicked""" + widget.get_toplevel().destroy() + def __init__(self, txt): xml = gtk.glade.XML(GTKGUI_GLADE, 'Warning') - self.window = xml.get_widget("Warning") xml.get_widget('label').set_text(txt) - xml.signal_connect('gtk_widget_destroy', self.delete_event) + xml.signal_connect('on_close_clicked', self.on_close) class about_Window: """Class for about window""" def delete_event(self, widget): """close window""" - self.Wabout.destroy() + del self.plugin.windows['about'] + def on_close(self, widget): + """When Close button is clicked""" + widget.get_toplevel().destroy() + def __init__(self): xml = gtk.glade.XML(GTKGUI_GLADE, 'About') - self.Wabout = xml.get_widget("About") xml.signal_connect('gtk_widget_destroy', self.delete_event) + xml.signal_connect('on_close_clicked', self.on_close) + class accountPreference_Window: """Class for account informations""" def delete_event(self, widget): """close window""" - self.window.destroy() + del self.plugin.windows['accountPreference'] + def on_close(self, widget): + """When Close button is clicked""" + widget.get_toplevel().destroy() + def init_account(self, infos): """Initialize window with defaults values""" if infos.has_key('name'): - self.entryName.set_text(infos['name']) + self.xml.get_widget("entry_name").set_text(infos['name']) if infos.has_key('jid'): - self.entryJid.set_text(infos['jid']) + self.xml.get_widget("entry_jid").set_text(infos['jid']) if infos.has_key('password'): - self.entryPass.set_text(infos['password']) + self.xml.get_widget("entry_password").set_text(infos['password']) if infos.has_key('ressource'): - self.entryRessource.set_text(infos['ressource']) + self.xml.get_widget("entry_ressource").set_text(infos['ressource']) def on_save_clicked(self, widget): """When save button is clicked : Save informations in config file""" - name = self.entryName.get_text() - jid = self.entryJid.get_text() + entryPass = self.xml.get_widget("entry_password") + entryRessource = self.xml.get_widget("entry_ressource") + check = self.xml.get_widget("checkbutton") + entryName = self.xml.get_widget("entry_name") + entryJid = self.xml.get_widget("entry_jid") + name = entryName.get_text() + jid = entryJid.get_text() if (name == ''): warning_Window('You must enter a name for this account') return 0 @@ -586,117 +605,121 @@ class accountPreference_Window: else: (login, hostname) = string.split(jid, '@') #if we are modifying an account - if self.mod: + if self.modify: #if we modify the name of the account - if name != self.acc: - del self.accs.r.plugin.accounts[self.acc] + if name != self.account: + del self.plugin.accounts[self.account] + #TODO: update many variables #if it's a new account else: - if name in self.accs.r.plugin.accounts: + if name in self.plugin.accounts.keys(): warning_Window('An account already has this name') return 0 #if we neeed to register a new account - if self.check.get_active(): - self.accs.r.queueOUT.put(('NEW_ACC', (hostname, login, \ - self.entryPass.get_text(), name, \ - self.entryRessource.get_text()))) - self.check.set_active(FALSE) + if check.get_active(): + self.plugin.send('NEW_ACC', None, (hostname, login, \ + entryPass.get_text(), name, entryRessource.get_text())) + check.set_active(FALSE) return 1 - self.accs.r.plugin.accounts[name] = {'name': login, 'hostname': hostname,\ - 'password': self.entryPass.get_text(), 'ressource': \ - self.entryRessource.get_text()} - self.accs.r.queueOUT.put(('CONFIG', ('accounts', \ - self.accs.r.plugin.accounts))) - self.accs.init_accounts() - self.delete_event(self) + self.plugin.accounts[name] = {'name': login, 'hostname': hostname,\ + 'password': entryPass.get_text(), 'ressource': \ + entryRessource.get_text()} + self.plugin.send('CONFIG', None, ('accounts', self.plugin.accounts)) + #refresh accounts window + if self.plugin.windows.has_key('accounts'): + self.plugin.windows['accounts'].init_accounts() + widget.get_toplevel().destroy() def on_edit_details_clicked(self, widget): - if not self.accs.r.tab_vcard.has_key(self.entryJid.get_text()): - self.accs.r.tab_vcard[self.entryJid.get_text()] = vCard_Window(self, self.entryJid.get_text()) - if self.accs.r.connected: - self.accs.r.queueOUT.put(('ASK_VCARD', self.entryJid.get_text())) + entryJid = self.xml.get_widget("entry_jid") + if not self.plugin.windows.has_key('vcard'): + self.plugin.windows[self.account]['infos'][entryJid.get_text()] = \ + vCard_Window(entryJid.get_text(), self.plugin, self.account) + if self.plugin.connected[self.account]: + self.plugin.send('ASK_VCARD', self.account, entryJid.get_text()) else: warning_Window("You must be connected to get your informations") #info must be a dictionnary - def __init__(self, accs, infos = {}): - xml = gtk.glade.XML(GTKGUI_GLADE, 'Account') - self.window = xml.get_widget("Account") - self.entryPass = xml.get_widget("entry_password") - self.entryRessource = xml.get_widget("entry_ressource") - self.check = xml.get_widget("checkbutton") - self.entryName = xml.get_widget("entry_name") - self.entryJid = xml.get_widget("entry_jid") - self.accs = accs - self.mod = FALSE + def __init__(self, plugin, infos = {}): + self.xml = gtk.glade.XML(GTKGUI_GLADE, 'Account') + self.plugin = plugin + self.account = '' + self.modify = False if infos: - self.mod = TRUE - self.acc = infos['name'] + self.modify = True + self.account = infos['name'] self.init_account(infos) - self.check.set_sensitive(FALSE) - xml.signal_connect('gtk_widget_destroy', self.delete_event) - xml.signal_connect('on_save_clicked', self.on_save_clicked) - xml.signal_connect('on_edit_details_clicked', self.on_edit_details_clicked) + self.xml.get_widget("checkbutton").set_sensitive(FALSE) + self.xml.signal_connect('gtk_widget_destroy', self.delete_event) + self.xml.signal_connect('on_save_clicked', self.on_save_clicked) + self.xml.signal_connect('on_edit_details_clicked', \ + self.on_edit_details_clicked) + self.xml.signal_connect('on_close_clicked', self.on_close) class accounts_Window: """Class for accounts window : lists of accounts""" def delete_event(self, widget): """close window""" - global accountsWindow - accountsWindow = 0 - self.window.destroy() + del self.plugin.windows['accounts'] + +#Not for the moment ... but maybe one day there will be a button +# def on_close(self, widget): +# """When Close button is clicked""" +# widget.get_toplevel().destroy() def init_accounts(self): """initialize listStore with existing accounts""" + self.xml.get_widget("modify_button").set_sensitive(False) + self.xml.get_widget("delete_button").set_sensitive(False) model = self.treeview.get_model() model.clear() - for account in self.r.plugin.accounts.keys(): + for account in self.plugin.accounts: iter = model.append() model.set(iter, 0, account, 1, \ - self.r.plugin.accounts[account]["hostname"]) + self.plugin.accounts[account]["hostname"]) def on_row_activated(self, widget): """Activate delete and modify buttons when a row is selected""" - self.modButt.set_sensitive(TRUE) - self.delButt.set_sensitive(TRUE) + self.xml.get_widget("modify_button").set_sensitive(True) + self.xml.get_widget("delete_button").set_sensitive(True) def on_new_clicked(self, widget): """When new button is clicked : open an account information window""" - accountPreference_Window(self) + if not self.plugin.windows.has_key('accountPreference'): + self.plugin.windows['accountPreference'] = \ + accountPreference_Window(self.plugin) def on_delete_clicked(self, widget): """When delete button is clicked : Remove an account from the listStore and from the config file""" sel = self.treeview.get_selection() - (mod, iter) = sel.get_selected() - model = self.treeview.get_model() + (model, iter) = sel.get_selected() account = model.get_value(iter, 0) - del self.r.plugin.accounts[account] - self.r.queueOUT.put(('CONFIG', ('accounts', self.r.plugin.accounts))) + del self.plugin.accounts[account] + self.plugin.put('CONFIG', None, ('accounts', self.plugin.accounts)) self.init_accounts() def on_modify_clicked(self, widget): """When modify button is clicked : open the account information window for this account""" - infos = {} - sel = self.treeview.get_selection() - model = self.treeview.get_model() - (mod, iter) = sel.get_selected() - account = model.get_value(iter, 0) - infos['name'] = account - infos['jid'] = self.r.plugin.accounts[account]["name"] + \ - '@' + self.r.plugin.accounts[account]["hostname"] - infos['password'] = self.r.plugin.accounts[account]["password"] - infos['ressource'] = self.r.plugin.accounts[account]["ressource"] - accountPreference_Window(self, infos) + if not self.plugin.windows.has_key('accountPreference'): + infos = {} + sel = self.treeview.get_selection() + (model, iter) = sel.get_selected() + account = model.get_value(iter, 0) + infos['name'] = account + infos['jid'] = self.plugin.accounts[account]["name"] + \ + '@' + self.plugin.accounts[account]["hostname"] + infos['password'] = self.plugin.accounts[account]["password"] + infos['ressource'] = self.plugin.accounts[account]["ressource"] + self.plugin.windows['accountPreference'] = \ + accountPreference_Window(self.plugin, infos) - def __init__(self, roster): - self.r = roster - xml = gtk.glade.XML(GTKGUI_GLADE, 'Accounts') - self.window = xml.get_widget("Accounts") - self.treeview = xml.get_widget("treeview") - self.modButt = xml.get_widget("modify_button") - self.delButt = xml.get_widget("delete_button") + def __init__(self, plugin): + self.plugin = plugin + self.xml = gtk.glade.XML(GTKGUI_GLADE, 'Accounts') + self.treeview = self.xml.get_widget("treeview") model = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING) self.treeview.set_model(model) #columns @@ -707,131 +730,130 @@ class accounts_Window: renderer.set_data('column', 1) self.treeview.insert_column_with_attributes(-1, 'Server', \ renderer, text=1) - xml.signal_connect('gtk_widget_destroy', self.delete_event) - xml.signal_connect('on_row_activated', self.on_row_activated) - xml.signal_connect('on_new_clicked', self.on_new_clicked) - xml.signal_connect('on_delete_clicked', self.on_delete_clicked) - xml.signal_connect('on_modify_clicked', self.on_modify_clicked) + self.xml.signal_connect('gtk_widget_destroy', self.delete_event) + self.xml.signal_connect('on_row_activated', self.on_row_activated) + self.xml.signal_connect('on_new_clicked', self.on_new_clicked) + self.xml.signal_connect('on_delete_clicked', self.on_delete_clicked) + self.xml.signal_connect('on_modify_clicked', self.on_modify_clicked) self.init_accounts() class confirm_Window: """Class for confirmation window : window that appears to confirm the removal of a contact""" - def delete_event(self, widget): - """close window""" - self.window.destroy() - + def on_cancel(self, widget): + """When Cancel button is clicked""" + widget.get_toplevel().destroy() + def req_usub(self, widget): """When Ok button is clicked : Send a message to the core to remove the user and remove it from the roster""" - model = self.r.tree.get_model() - jid = model.get_value(self.iter, 2) - self.r.queueOUT.put(('UNSUB', jid)) - self.r.remove_user(self.r.l_contact[jid]['user']) - del self.r.l_contact[jid] - self.delete_event(self) + self.plugin.send('UNSUB', self.account, self.user.jid) + self.plugin.roster.remove_user(self.user, self.account) + del self.plugin.roster.contacts[self.account][self.user.jid] + widget.get_toplevel().destroy() - def __init__(self, roster, iter): + def __init__(self, plugin, user, account): xml = gtk.glade.XML(GTKGUI_GLADE, 'Confirm') - self.window = xml.get_widget('Confirm') - self.r = roster - self.iter = iter - jid = self.r.tree.get_model().get_value(iter, 2) + self.plugin = plugin + self.user = user + self.account = account xml.get_widget('label_confirm').set_text(\ - 'Are you sure you want to remove ' + jid + ' from your roster ?') + 'Are you sure you want to remove ' + user.name + ' (' + user.jid + ') from your roster ?') xml.signal_connect('on_okbutton_clicked', self.req_usub) - xml.signal_connect('gtk_widget_destroy', self.delete_event) + xml.signal_connect('on_cancel_clicked', self.on_cancel) class authorize_Window: """Class for authorization window : window that appears when a user wants to add us to his/her roster""" - def delete_event(self, widget): - """close window""" - self.window.destroy() + def on_close(self, widget): + """When Close button is clicked""" + widget.get_toplevel().destroy() def auth(self, widget): """Accept the request""" - self.r.queueOUT.put(('AUTH', self.jid)) - self.delete_event(self) - if not self.r.l_contact.has_key(self.jid): - addContact_Window(self.r, self.jid) + self.plugin.send('AUTH', self.account, self.jid) + widget.get_toplevel().destroy() + if not self.plugin.roster.contacts[self.account].has_key(self.jid): + addContact_Window(self.plugin, self.account, self.jid) def deny(self, widget): """refuse the request""" - self.r.queueOUT.put(('DENY', self.jid)) - self.delete_event(self) + self.plugin.send('DENY', self.account, self.jid) + widget.get_toplevel().destroy() - def __init__(self, roster, jid, txt): + def __init__(self, plugin, jid, txt, account): xml = gtk.glade.XML(GTKGUI_GLADE, 'Sub_req') - self.window = xml.get_widget('Sub_req') - self.r = roster + self.plugin = plugin self.jid = jid + self.account = account xml.get_widget('label').set_text('Subscription request from ' + self.jid) xml.get_widget("textview_sub").get_buffer().set_text(txt) xml.signal_connect('on_button_auth_clicked', self.auth) xml.signal_connect('on_button_deny_clicked', self.deny) - xml.signal_connect('on_button_close_clicked', self.delete_event) + xml.signal_connect('on_button_close_clicked', self.on_close) class agentRegistration_Window: """Class for agent registration window : window that appears when we want to subscribe to an agent""" - def delete_event(self, widget): - """close window""" - self.window.destroy() - def draw_table(self): """Draw the table in the window""" nbrow = 0 + table = self.xml.get_widget('table') for name in self.infos.keys(): if name != 'key' and name != 'instructions' and name != 'x': nbrow = nbrow + 1 - self.table.resize(rows=nbrow, columns=2) + table.resize(rows=nbrow, columns=2) label = gtk.Label(name) - self.table.attach(label, 0, 1, nbrow-1, nbrow, 0, 0, 0, 0) + table.attach(label, 0, 1, nbrow-1, nbrow, 0, 0, 0, 0) entry = gtk.Entry() entry.set_text(self.infos[name]) - self.table.attach(entry, 1, 2, nbrow-1, nbrow, 0, 0, 0, 0) + table.attach(entry, 1, 2, nbrow-1, nbrow, 0, 0, 0, 0) self.entries[name] = entry if nbrow == 1: entry.grab_focus() - self.table.show_all() + table.show_all() def on_ok(self, widget): """When Ok button is clicked : send registration info to the core""" for name in self.entries.keys(): self.infos[name] = self.entries[name].get_text() - self.r.queueOUT.put(('REG_AGENT', self.agent)) - self.delete_event(self) + self.plugin.send('REG_AGENT', self.account, self.agent) + widget.get_toplevel().destroy() - def __init__(self, agent, infos, roster): - xml = gtk.glade.XML(GTKGUI_GLADE, 'agent_reg') + def __init__(self, agent, infos, plugin, account): + self.xml = gtk.glade.XML(GTKGUI_GLADE, 'agent_reg') self.agent = agent self.infos = infos - self.r = roster - self.window = xml.get_widget('agent_reg') - self.table = xml.get_widget('table') - self.window.set_title('Register to ' + agent) - xml.get_widget('label').set_text(infos['instructions']) + self.plugin = plugin + self.account = account + self.xml.get_widget('agent_reg').set_title('Register to ' + agent) + self.xml.get_widget('label').set_text(infos['instructions']) self.entries = {} self.draw_table() - xml.signal_connect('gtk_widget_destroy', self.delete_event) - xml.signal_connect('on_button_cancel_clicked', self.delete_event) - xml.signal_connect('on_button_ok_clicked', self.on_ok) + self.xml.signal_connect('gtk_widget_destroy', self.delete_event) + self.xml.signal_connect('on_cancel_clicked', self.on_cancel) + self.xml.signal_connect('on_button_ok_clicked', self.on_ok) class browseAgent_Window: """Class for bowser agent window : to know the agents on the selected server""" def delete_event(self, widget): """close window""" - global browserWindow - browserWindow = 0 - self.window.destroy() + del self.plugin.windows['browser'] + def on_cancel(self, widget): + """When Cancel button is clicked""" + widget.get_toplevel().destroy() + + def on_close(self, widget): + """When Close button is clicked""" + widget.get_toplevel().destroy() + def browse(self): """Send a request to the core to know the available agents""" - self.r.queueOUT.put(('REQ_AGENTS', None)) + self.plugin.send('REQ_AGENTS', self.account, None) def agents(self, agents): """When list of available agent arrive : @@ -854,14 +876,14 @@ class browseAgent_Window: model = self.treeview.get_model() iter = model.get_iter(path) service = model.get_value(iter, 1) - self.r.queueOUT.put(('REQ_AGENT_INFO', service)) - self.delete_event(self) + self.plugin.send('REQ_AGENT_INFO', self.account, service) + widget.get_toplevel().destroy() - def __init__(self, roster): + def __init__(self, plugin, roster): xml = gtk.glade.XML(GTKGUI_GLADE, 'browser') - self.window = xml.get_widget('browser') self.treeview = xml.get_widget('treeview') - self.r = roster + self.plugin = plugin + self.account = account model = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING) self.treeview.set_model(model) #columns @@ -876,7 +898,8 @@ class browseAgent_Window: xml.signal_connect('gtk_widget_destroy', self.delete_event) xml.signal_connect('on_refresh_clicked', self.on_refresh) xml.signal_connect('on_row_activated', self.on_row_activated) - if self.r.connected: + xml.signal_connect('on_close_clicked', self.on_close) + if self.plugin.connected[account]: self.browse() else: warning_Window("You must be connected to view Agents") @@ -885,15 +908,15 @@ class message_Window: """Class for chat window""" def delete_event(self, widget): """close window""" - del self.r.tab_messages[self.user.jid] - self.window.destroy() + del self.plugin.windows[self.account]['chats'][self.user.jid] def print_conversation(self, txt, contact = None, tim = None): """Print a line in the conversation : if contact is set to status : it's a status message if contact is set to another value : it's an outgoing message if contact is not set : it's an incomming message""" - buffer = self.conversation.get_buffer() + conversation = self.xml.get_widget('conversation') + buffer = conversation.get_buffer() if not txt: txt = "" end_iter = buffer.get_end_iter() @@ -912,19 +935,18 @@ class message_Window: self.user.name + '> ', 'incoming') buffer.insert(end_iter, txt+'\n') #scroll to the end of the textview - self.conversation.scroll_to_mark(\ - buffer.get_mark('end'), 0.1, 0, 0, 0) + conversation.scroll_to_mark(buffer.get_mark('end'), 0.1, 0, 0, 0) def read_queue(self, q): """read queue and print messages containted in it""" while not q.empty(): evt = q.get() self.print_conversation(evt[0], tim = evt[1]) - del self.r.tab_queues[self.user.jid] - for i in self.r.l_contact[self.user.jid]['iter']: - if self.r.pixbufs.has_key(self.user.show): - self.r.tree.get_model().set_value(i, 0, \ - self.r.pixbufs[self.user.show]) + del self.plugin.queues[self.account][self.user.jid] + for i in self.plugin.roster.get_user_iter(self.user.jid, self.account): + if self.plugin.roster.pixbufs.has_key(self.user.show): + self.plugin.roster.tree.get_model().set_value(i, 0, \ + self.plugin.roster.pixbufs[self.user.show]) def on_msg_key_press_event(self, widget, event): """When a key is pressed : @@ -938,7 +960,7 @@ class message_Window: end_iter = txt_buffer.get_end_iter() txt = txt_buffer.get_text(start_iter, end_iter, 0) if txt != '': - self.r.queueOUT.put(('MSG',(self.user.jid, txt))) + self.plugin.send('MSG', self.account, (self.user.jid, txt)) txt_buffer.set_text('', -1) self.print_conversation(txt, self.user.jid) widget.grab_focus() @@ -948,47 +970,51 @@ class message_Window: def on_clear(self, widget): """When clear button is pressed : clear the conversation""" - buffer = self.conversation.get_buffer() + buffer = self.xml.get_widget('conversation').get_buffer() deb, end = buffer.get_bounds() buffer.delete(deb, end) - def __init__(self, user, roster): + def __init__(self, user, plugin, account): self.user = user - self.r = roster - xml = gtk.glade.XML(GTKGUI_GLADE, 'Chat') - self.hbox = xml.get_widget('hbox1') - self.hbox.set_property('resize-mode', 2) - self.window = xml.get_widget('Chat') - self.window.set_title('Chat with ' + user.name) - self.img = xml.get_widget('image') - self.img.set_from_pixbuf(self.r.pixbufs[user.show]) - xml.get_widget('button_contact').set_label(user.name + ' <'\ + self.plugin = plugin + self.account = account + self.xml = gtk.glade.XML(GTKGUI_GLADE, 'Chat') +# hbox = xml.get_widget('hbox1') +# hbox.set_property('resize-mode', 2) + self.xml.get_widget('Chat').set_title('Chat with ' + user.name) + self.img = self.xml.get_widget('image') + self.img.set_from_pixbuf(self.plugin.roster.pixbufs[user.show]) + self.xml.get_widget('button_contact').set_label(user.name + ' <'\ + user.jid + '>') - xml.get_widget('button_contact').set_resize_mode(gtk.RESIZE_QUEUE) - self.message = xml.get_widget('message') - self.message.grab_focus() - self.conversation = xml.get_widget('conversation') - buffer = self.conversation.get_buffer() + self.xml.get_widget('button_contact').set_resize_mode(gtk.RESIZE_QUEUE) + message = self.xml.get_widget('message') + message.grab_focus() + conversation = self.xml.get_widget('conversation') + buffer = conversation.get_buffer() end_iter = buffer.get_end_iter() buffer.create_mark('end', end_iter, 0) - xml.signal_connect('gtk_widget_destroy', self.delete_event) - xml.signal_connect('on_clear_button_clicked', self.on_clear) - xml.signal_connect('on_msg_key_press_event', self.on_msg_key_press_event) + self.xml.signal_connect('gtk_widget_destroy', self.delete_event) + self.xml.signal_connect('on_clear_button_clicked', self.on_clear) + self.xml.signal_connect('on_msg_key_press_event', \ + self.on_msg_key_press_event) self.tagIn = buffer.create_tag("incoming") - color = self.r.plugin.config['inmsgcolor'] + color = self.plugin.config['inmsgcolor'] if not color: color = '#ff0000' #red self.tagIn.set_property("foreground", color) self.tagOut = buffer.create_tag("outgoing") - color = self.r.plugin.config['outmsgcolor'] + color = self.plugin.config['outmsgcolor'] if not color: color = '#0000ff' #blue self.tagOut.set_property("foreground", color) self.tagStatus = buffer.create_tag("status") - color = self.r.plugin.config['statusmsgcolor'] + color = self.plugin.config['statusmsgcolor'] if not color: color = '#00ff00' #green self.tagStatus.set_property("foreground", color) + #print queued messages + if plugin.queues[account].has_key(user.jid): + self.read_queue(plugin.queues[account][user.jid]) class roster_Window: """Class for main gtk window""" @@ -1003,7 +1029,8 @@ class roster_Window: account_name = model.get_value(account, 3) if name == account_name: return account - if not model.iter_next(account): + account = model.iter_next(account) + if not account: fin = True return None @@ -1018,7 +1045,8 @@ class roster_Window: group_name = model.get_value(group, 3) if name == group_name: return group - if not model.iter_next(group): + group = model.iter_next(group) + if not group: fin = True return None @@ -1038,9 +1066,11 @@ class roster_Window: while not fin2: if jid == model.get_value(user, 3): found.append(user) - if not model.iter_next(user): + user = model.iter_next(user) + if not user: fin2 = True - if not model.iter_next(group): + group = model.iter_next(group) + if not group: fin = True return found @@ -1055,7 +1085,8 @@ class roster_Window: """Add a user to the roster and add groups if they aren't in roster""" newgrp = 0 showOffline = self.plugin.config['showoffline'] -# self.contacts[account][user.jid] = user + if not self.contacts[account].has_key(user.jid): + self.contacts[account][user.jid] = user if user.groups == []: if string.find(user.jid, "@") <= 0: user.groups.append('Agents') @@ -1071,12 +1102,14 @@ class roster_Window: iterG = model.append(self.get_account_iter(account), \ (self.pixbufs['closed'], g, 'group', g, FALSE)) newgrp = 1 + self.tree.expand_row((model.get_path(iterG)[0]), False) if g == 'Agents': model.append(iterG, (self.pixbufs[user.show], \ user.name, 'agent', user.jid, TRUE)) else: model.append(iterG, (self.pixbufs[user.show], \ user.name, 'user', user.jid, TRUE)) + if newgrp == 1: #expand new groups self.tree.expand_row(model.get_path(iterG), FALSE) @@ -1145,15 +1178,17 @@ class roster_Window: user.show = show user.status = status #Print status in chat window - if self.plugin.windows[account].has_key(user.jid): - self.plugin.windows[account][user.jid].img.set_from_pixbuf(self.pixbufs[show]) - self.plugin.windows[account][user.jid].print_conversation(\ + if self.plugin.windows[account]['chats'].has_key(user.jid): + self.plugin.windows[account]['chats'][user.jid].\ + img.set_from_pixbuf(self.pixbufs[show]) + self.plugin.windows[account]['chats'][user.jid].print_conversation(\ "%s is now %s (%s)" % (user.name, show, status), 'status') def on_info(self, widget, user, account): """Call infoUser_Window class to display user's information""" - if not self.plugin.windows[account].has_key('infos'+user.jid): - self.plugin.windows[account]['infos'+user.jid] = infoUser_Window(user, self.plugin) + if not self.plugin.windows[account]['infos'].has_key(user.jid): + self.plugin.windows[account]['infos'][user.jid] = \ + infoUser_Window(user, self.plugin, account) def on_agent_logging(self, widget, jid, state, account): """When an agent is requested to log in or off""" @@ -1164,6 +1199,10 @@ class roster_Window: model = self.tree.get_model() jid = model.get_value(iter, 3) path = model.get_path(iter) + acct_iter = model.get_iter((path[0])) + account = model.get_value(acct_iter, 3) + user = self.contacts[account][jid] + menu = gtk.Menu() item = gtk.MenuItem("Start chat") menu.append(item) @@ -1184,19 +1223,19 @@ class roster_Window: item = gtk.MenuItem("Rerequest authorization from") menu_sub.append(item) item.connect("activate", self.req_sub, jid, \ - 'I would like to add you to my contact list, please.') + 'I would like to add you to my contact list, please.', account) item = gtk.MenuItem() menu.append(item) item = gtk.MenuItem("Remove") menu.append(item) - item.connect("activate", self.on_req_usub, iter) + item.connect("activate", self.on_req_usub, user, account) item = gtk.MenuItem() menu.append(item) item = gtk.MenuItem("Informations") menu.append(item) - item.connect("activate", self.on_info, jid) + item.connect("activate", self.on_info, user, account) menu.popup(None, None, None, event.button, event.time) menu.show_all() @@ -1256,18 +1295,18 @@ class roster_Window: model = self.tree.get_model() iter = model.get_iter(path) type = model.get_value(iter, 2) - if data == 'group': + if type == 'group': self.mk_menu_g(event) - elif data == 'agent': + elif type == 'agent': self.mk_menu_agent(event, iter) - elif data == 'user': + elif type == 'user': self.mk_menu_user(event, iter) return gtk.TRUE return gtk.FALSE - def on_req_usub(self, widget, iter): + def on_req_usub(self, widget, user, account): """Remove a user""" - window_confirm = confirm_Window(self, iter) + confirm_Window(self.plugin, user, account) def on_optionmenu_changed(self, widget): """When we change our status""" @@ -1296,8 +1335,8 @@ class roster_Window: if status == 'offline': self.plugin.connected[account] = 0 self.plugin.sleeper = None - for jid in self.contacts.keys(): - user = self.contacts[jid] + for jid in self.contacts[account]: + user = self.contacts[account][jid] self.chg_user_status(user, 'offline', 'Disconnected', account) elif self.plugin.connected[account] == 0: self.plugin.connected[account] = 1 @@ -1312,7 +1351,8 @@ class roster_Window: 'not in list', 'not in list', 'none', '') self.add_user_to_roster(user1, account) autopopup = self.plugin.config['autopopup'] - if autopopup == 0 and not self.plugin.windows[account].has_key(jid): + if autopopup == 0 and not \ + self.plugin.windows[account]['chats'].has_key(jid): #We save it in a queue if not self.plugin.queues[account].has_key(jid): model = self.tree.get_model() @@ -1322,21 +1362,21 @@ class roster_Window: tim = time.strftime("[%H:%M:%S]") self.plugin.queues[account][jid].put((msg, tim)) else: - if not self.plugin.windows[account].has_key(jid): - self.plugin.windows[account][jid] = \ + if not self.plugin.windows[account]['chats'].has_key(jid): + self.plugin.windows[account]['chats'][jid] = \ message_Window(self.contacts[account][jid], self) - self.plugin.windows[account][jid].print_conversation(msg) + self.plugin.windows[account]['chats'][jid].print_conversation(msg) def on_prefs(self, widget): """When preferences is selected : call the preference_Window class""" if not self.plugin.windows.has_key('preferences'): - self.plugin.windows['preferences'] = preference_Window(self) + self.plugin.windows['preferences'] = preference_Window(self.plugin) - def on_add(self, widget): + def on_add(self, widget, account): """When add user is selected : call the add class""" - addContact_Window(self) + addContact_Window(self, account) def on_about(self, widget): """When about is selected : @@ -1348,7 +1388,7 @@ class roster_Window: """When accounts is seleted : call the accounts class to modify accounts""" if not self.plugin.windows.has_key('accounts'): - self.plugin.windows['accounts'] = accounts_Window(self) + self.plugin.windows['accounts'] = accounts_Window(self.plugin) def on_quit(self, widget): """When we quit the gtk plugin : @@ -1372,14 +1412,11 @@ class roster_Window: else: self.tree.expand_row(path, FALSE) else: - if self.plugin.windows[account].has_key(jid): - self.plugin.windows[account][jid].window.present() + if self.plugin.windows[account]['chats'].has_key(jid): + self.plugin.windows[account]['chats'][jid].window.present() elif self.contacts[account].has_key(jid): - self.plugin.windows[account][jid] = \ - message_Window(self.contacts[account][jid], self) - if self.plugin.queues[account].has_key(jid): - self.plugin.windows[account][jid].read_queue(\ - self.plugin.queues[account][jid]) + self.plugin.windows[account]['chats'][jid] = \ + message_Window(self.contacts[account][jid], self.plugin, account) def on_row_expanded(self, widget, iter, path): """When a row is expanded : @@ -1397,21 +1434,24 @@ class roster_Window: else open chat window""" model = self.tree.get_model() iter = model.get_iter_from_string(row) - jid = model.get_value(iter, 2) - old_text = self.l_contact[jid]['user'].name - #If it is a double click, old_text == new_text + path = model.get_path(iter) + acct_iter = model.get_iter((path[0])) + account = model.get_value(acct_iter, 3) + jid = model.get_value(iter, 3) + old_text = self.contacts[account][jid].name + #FIXME:If it is a double click, old_text == new_text if old_text == new_text: - if self.tab_messages.has_key(jid): - self.tab_messages[jid].window.present() - elif self.l_contact.has_key(jid): - self.tab_messages[jid] = message_Window(self.l_contact[jid]['user'], self) - if self.tab_queues.has_key(jid): - self.tab_messages[jid].read_queue(self.tab_queues[jid]) + if self.plugin.windows[account]['chats'].has_key(jid): + chat = self.plugin.windows[account]['chats'][jid] + chat.xml.get_widget('Chat').present() + elif self.contacts[account].has_key(jid): + self.plugin.windows[account]['chats'][jid] = \ + message_Window(self.contacts[account][jid], self.plugin, account) else: model.set_value(iter, 1, new_text) - self.l_contact[jid]['user'].name = new_text - self.queueOUT.put(('UPDUSER', (jid, new_text, \ - self.l_contact[jid]['user'].groups))) + self.contacts[account][jid].name = new_text + self.plugin.send('UPDUSER', account, (jid, new_text, \ + self.contacts[account][jid].groups)) def on_browse(self, widget): """When browse agent is selected : @@ -1486,6 +1526,19 @@ class roster_Window: showOffline = self.plugin.config['showoffline'] self.xml.get_widget('show_offline').set_active(showOffline) + #Menu + if len(self.plugin.accounts.keys()): + menu_sub = gtk.Menu() + self.xml.get_widget('add').set_submenu(menu_sub) + for a in self.plugin.accounts.keys(): + item = gtk.MenuItem(a) + menu_sub.append(item) + item.connect("activate", self.on_add, a) + menu_sub.show_all() + else: + self.xml.get_widget('add').connect("activate", self.on_add, \ + self.plugin.accounts.keys()[0]) + #columns col = gtk.TreeViewColumn() render_pixbuf = gtk.CellRendererPixbuf() @@ -1509,17 +1562,19 @@ class roster_Window: self.xml.signal_connect('on_preferences_activate', self.on_prefs) self.xml.signal_connect('on_accounts_activate', self.on_accounts) self.xml.signal_connect('on_browse_agents_activate', self.on_browse) - self.xml.signal_connect('on_add_activate', self.on_add) self.xml.signal_connect('on_show_offline_activate', self.on_show_off) self.xml.signal_connect('on_about_activate', self.on_about) self.xml.signal_connect('on_quit_activate', self.on_quit) self.xml.signal_connect('on_treeview_event', self.on_treeview_event) self.xml.signal_connect('on_status_changed', self.on_status_changed) - self.xml.signal_connect('on_optionmenu_changed', self.on_optionmenu_changed) + self.xml.signal_connect('on_optionmenu_changed', \ + self.on_optionmenu_changed) self.xml.signal_connect('on_row_activated', self.on_row_activated) self.xml.signal_connect('on_row_expanded', self.on_row_expanded) self.xml.signal_connect('on_row_collapsed', self.on_row_collapsed) + self.draw_roster() + class plugin: """Class called by the core in a new thread""" @@ -1614,7 +1669,7 @@ class plugin: #Update existing iter for i in self.roster.get_user_iter(ji, ev[1]): if self.roster.pixbufs.has_key(ev[2][1]): - model.set_value(i, 0, self.r.pixbufs[ev[2][1]]) + model.set_value(i, 0, self.roster.pixbufs[ev[2][1]]) elif self.roster.contacts[ev[1]].has_key(ji): #It isn't an agent self.roster.chg_user_status(user, ev[2][1], ev[2][2], ev[1]) @@ -1625,9 +1680,9 @@ class plugin: else: jid = ev[2][0] self.roster.on_message(jid, ev[2][1], ev[1]) - + #('SUBSCRIBE', account, (jid, text)) elif ev[0] == 'SUBSCRIBE': - authorize_Window(self.roster, ev[2][0], ev[2][1]) + authorize_Window(self, ev[2][0], ev[2][1], ev[1]) #('SUBSCRIBED', account, (jid, nom, resource)) elif ev[0] == 'SUBSCRIBED': if self.roster.l_contact.has_key(ev[2][0]): @@ -1653,7 +1708,7 @@ class plugin: if not ev[2][1].has_key('instructions'): warning_Window('error contacting %s' % ev[2][0]) else: - agentRegistration_Window(ev[2][0], ev[2][1], self.roster) + agentRegistration_Window(ev[2][0], ev[2][1], self.plugin, ev[1]) #('ACC_OK', account, (hostname, login, pasword, name, ressource)) elif ev[0] == 'ACC_OK': self.accounts[ev[2][3]] = {'ressource': ev[2][4], \ @@ -1664,8 +1719,8 @@ class plugin: elif ev[0] == 'QUIT': self.roster.on_quit(self) elif ev[0] == 'VCARD': - if self.roster.tab_vcard.has_key(ev[2]['jid']): - self.roster.tab_vcard[ev[2]['jid']].set_values(ev[2]) + if self.windows[ev[1]]['infos'].has_key(ev[2]['jid']): + self.windows[ev[1]]['infos'][ev[2]['jid']].set_values(ev[2]) return 1 def read_sleepy(self): @@ -1714,6 +1769,8 @@ class plugin: self.connected = {} for a in self.accounts.keys(): self.windows[a] = {} + self.windows[a]['infos'] = {} + self.windows[a]['chats'] = {} self.queues[a] = {} self.connected[a] = 0 self.roster = roster_Window(self)