| 1 | ## plugins/dialogs.py |
|---|
| 2 | ## |
|---|
| 3 | ## Gajim Team: |
|---|
| 4 | ## - Yann Le Boulanger <asterix@lagaule.org> |
|---|
| 5 | ## - Vincent Hanquez <tab@snarc.org> |
|---|
| 6 | ## |
|---|
| 7 | ## Copyright (C) 2003-2005 Gajim Team |
|---|
| 8 | ## |
|---|
| 9 | ## This program is free software; you can redistribute it and/or modify |
|---|
| 10 | ## it under the terms of the GNU General Public License as published |
|---|
| 11 | ## by the Free Software Foundation; version 2 only. |
|---|
| 12 | ## |
|---|
| 13 | ## This program is distributed in the hope that it will be useful, |
|---|
| 14 | ## but WITHOUT ANY WARRANTY; without even the implied warranty of |
|---|
| 15 | ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|---|
| 16 | ## GNU General Public License for more details. |
|---|
| 17 | ## |
|---|
| 18 | |
|---|
| 19 | import pygtk |
|---|
| 20 | pygtk.require('2.0') |
|---|
| 21 | import gtk |
|---|
| 22 | from gtk import TRUE, FALSE |
|---|
| 23 | import gtk.glade,gobject |
|---|
| 24 | import string |
|---|
| 25 | from common import i18n |
|---|
| 26 | _ = i18n._ |
|---|
| 27 | APP = i18n.APP |
|---|
| 28 | gtk.glade.bindtextdomain (APP, i18n.DIR) |
|---|
| 29 | gtk.glade.textdomain (APP) |
|---|
| 30 | |
|---|
| 31 | GTKGUI_GLADE='plugins/gtkgui/gtkgui.glade' |
|---|
| 32 | |
|---|
| 33 | |
|---|
| 34 | class infoUser_Window: |
|---|
| 35 | """Class for user's information window""" |
|---|
| 36 | def delete_event(self, widget=None): |
|---|
| 37 | """close window""" |
|---|
| 38 | del self.plugin.windows[self.account]['infos'][self.user.jid] |
|---|
| 39 | |
|---|
| 40 | def add_grp_to_user(self, model, path, iter): |
|---|
| 41 | """Insert user to the group in inter""" |
|---|
| 42 | self.user.groups.append(model.get_value(iter, 0)) |
|---|
| 43 | |
|---|
| 44 | def on_close(self, widget): |
|---|
| 45 | """Save user's informations and update the roster on the Jabber server""" |
|---|
| 46 | #update: to know if things have changed to send things |
|---|
| 47 | # to server only if changes are done |
|---|
| 48 | update = 0 |
|---|
| 49 | #update user.groups and redraw the user in the roster |
|---|
| 50 | old_groups = self.user.groups |
|---|
| 51 | self.user.groups = [] |
|---|
| 52 | model = self.list2.get_model() |
|---|
| 53 | model.foreach(self.add_grp_to_user) |
|---|
| 54 | for g in old_groups: |
|---|
| 55 | if not g in self.user.groups: |
|---|
| 56 | update = 1 |
|---|
| 57 | break |
|---|
| 58 | if not update: |
|---|
| 59 | for g in self.user.groups: |
|---|
| 60 | if not g in old_groups: |
|---|
| 61 | update = 1 |
|---|
| 62 | break |
|---|
| 63 | if update: |
|---|
| 64 | new_groups = self.user.groups |
|---|
| 65 | self.user.groups = old_groups |
|---|
| 66 | self.plugin.roster.remove_user(self.user, self.account) |
|---|
| 67 | self.user.groups = new_groups |
|---|
| 68 | self.plugin.roster.add_user_to_roster(self.user.jid, self.account) |
|---|
| 69 | #update user.name if it's not "" |
|---|
| 70 | entry_name = self.xml.get_widget('entry_name') |
|---|
| 71 | newName = entry_name.get_text() |
|---|
| 72 | if newName != self.user.name and newName != '': |
|---|
| 73 | update = 1 |
|---|
| 74 | self.user.name = newName |
|---|
| 75 | for i in self.plugin.roster.get_user_iter(self.user.jid, self.account): |
|---|
| 76 | self.plugin.roster.tree.get_model().set_value(i, 1, newName) |
|---|
| 77 | if update: |
|---|
| 78 | self.plugin.send('UPDUSER', self.account, (self.user.jid, \ |
|---|
| 79 | self.user.name, self.user.groups)) |
|---|
| 80 | #log history ? |
|---|
| 81 | acct = self.plugin.accounts[self.account] |
|---|
| 82 | oldlog = 1 |
|---|
| 83 | no_log_for = [] |
|---|
| 84 | if acct.has_key('no_log_for'): |
|---|
| 85 | no_log_for = acct['no_log_for'].split(' ') |
|---|
| 86 | if self.user.jid in no_log_for: |
|---|
| 87 | oldlog = 0 |
|---|
| 88 | log = self.xml.get_widget('chk_log').get_active() |
|---|
| 89 | if not log and not self.user.jid in no_log_for: |
|---|
| 90 | no_log_for.append(self.user.jid) |
|---|
| 91 | if log and self.user.jid in no_log_for: |
|---|
| 92 | no_log_for.remove(self.user.jid) |
|---|
| 93 | if oldlog != log: |
|---|
| 94 | acct['no_log_for'] = string.join(no_log_for, ' ') |
|---|
| 95 | self.plugin.accounts[self.account] = acct |
|---|
| 96 | self.plugin.send('CONFIG', None, ('accounts', self.plugin.accounts, \ |
|---|
| 97 | 'Gtkgui')) |
|---|
| 98 | widget.get_toplevel().destroy() |
|---|
| 99 | |
|---|
| 100 | def add_grp(self, model, path, iter, stors): |
|---|
| 101 | """Transfert the iter from stors[0] to stors[1]""" |
|---|
| 102 | i = stors[1].append() |
|---|
| 103 | stors[1].set(i, 0, stors[0].get_value(iter, 0)) |
|---|
| 104 | stors[0].remove(iter) |
|---|
| 105 | |
|---|
| 106 | def on_add(self, widget): |
|---|
| 107 | """When Add button is clicked""" |
|---|
| 108 | model = self.list1.get_model() |
|---|
| 109 | select = self.list1.get_selection() |
|---|
| 110 | select.selected_foreach(self.add_grp, (model, self.list2.get_model())) |
|---|
| 111 | |
|---|
| 112 | def on_remove(self, widget): |
|---|
| 113 | """When Remove button is clicked""" |
|---|
| 114 | model = self.list2.get_model() |
|---|
| 115 | select = self.list2.get_selection() |
|---|
| 116 | select.selected_foreach(self.add_grp, (model, self.list1.get_model())) |
|---|
| 117 | |
|---|
| 118 | def on_new_key_pressed(self, widget, event): |
|---|
| 119 | """If enter is pressed in new group entry, add the group""" |
|---|
| 120 | if event.keyval == gtk.keysyms.Return: |
|---|
| 121 | entry_new = self.xml.get_widget("entry_new") |
|---|
| 122 | model = self.list1.get_model() |
|---|
| 123 | txt = entry_new.get_text() |
|---|
| 124 | iter = model.append() |
|---|
| 125 | model.set(iter, 0, txt) |
|---|
| 126 | entry_new.set_text('') |
|---|
| 127 | return 1 |
|---|
| 128 | else: |
|---|
| 129 | return 0 |
|---|
| 130 | |
|---|
| 131 | def set_value(self, entry_name, value): |
|---|
| 132 | try: |
|---|
| 133 | self.xml.get_widget(entry_name).set_text(value) |
|---|
| 134 | except AttributeError, e: |
|---|
| 135 | pass |
|---|
| 136 | |
|---|
| 137 | def set_values(self, vcard): |
|---|
| 138 | for i in vcard.keys(): |
|---|
| 139 | if type(vcard[i]) == type({}): |
|---|
| 140 | for j in vcard[i].keys(): |
|---|
| 141 | self.set_value('entry_'+i+'_'+j, vcard[i][j]) |
|---|
| 142 | else: |
|---|
| 143 | if i == 'DESC': |
|---|
| 144 | self.xml.get_widget('textview_DESC').get_buffer().\ |
|---|
| 145 | set_text(vcard[i], 0) |
|---|
| 146 | else: |
|---|
| 147 | self.set_value('entry_'+i, vcard[i]) |
|---|
| 148 | |
|---|
| 149 | def init_lists(self): |
|---|
| 150 | """Initialize both available and current listStores""" |
|---|
| 151 | #list available |
|---|
| 152 | store = gtk.ListStore(gobject.TYPE_STRING) |
|---|
| 153 | for g in self.plugin.roster.groups[self.account].keys(): |
|---|
| 154 | if g != 'Agents' and g not in self.user.groups: |
|---|
| 155 | iter = store.append() |
|---|
| 156 | store.set(iter, 0, g) |
|---|
| 157 | self.list1.set_model(store) |
|---|
| 158 | column = gtk.TreeViewColumn('Available', gtk.CellRendererText(), text=0) |
|---|
| 159 | self.list1.append_column(column) |
|---|
| 160 | |
|---|
| 161 | #list_current |
|---|
| 162 | store = gtk.ListStore(gobject.TYPE_STRING) |
|---|
| 163 | for g in self.user.groups: |
|---|
| 164 | iter = store.append() |
|---|
| 165 | store.set(iter, 0, g) |
|---|
| 166 | self.list2.set_model(store) |
|---|
| 167 | column = gtk.TreeViewColumn('Available', gtk.CellRendererText(), text=0) |
|---|
| 168 | self.list2.append_column(column) |
|---|
| 169 | |
|---|
| 170 | def __init__(self, user, plugin, account): |
|---|
| 171 | self.xml = gtk.glade.XML(GTKGUI_GLADE, 'Info_user', APP) |
|---|
| 172 | self.window = self.xml.get_widget("Info_user") |
|---|
| 173 | self.plugin = plugin |
|---|
| 174 | self.user = user |
|---|
| 175 | self.account = account |
|---|
| 176 | self.list1 = self.xml.get_widget("treeview_available") |
|---|
| 177 | self.list2 = self.xml.get_widget("treeview_current") |
|---|
| 178 | |
|---|
| 179 | self.xml.get_widget('label_name').set_text(user.name) |
|---|
| 180 | self.xml.get_widget('label_id').set_text(user.jid) |
|---|
| 181 | self.xml.get_widget('label_sub').set_text(user.sub) |
|---|
| 182 | if user.ask: |
|---|
| 183 | self.xml.get_widget('label_ask').set_text(user.ask) |
|---|
| 184 | else: |
|---|
| 185 | self.xml.get_widget('label_ask').set_text('None') |
|---|
| 186 | self.xml.get_widget('entry_name').set_text(user.name) |
|---|
| 187 | acct = self.plugin.accounts[account] |
|---|
| 188 | log = 1 |
|---|
| 189 | if acct.has_key('no_log_for'): |
|---|
| 190 | if user.jid in acct['no_log_for'].split(' '): |
|---|
| 191 | log = 0 |
|---|
| 192 | self.xml.get_widget('chk_log').set_active(log) |
|---|
| 193 | resources = user.resource + ' (' + str(user.priority) + ')' |
|---|
| 194 | if not user.status: |
|---|
| 195 | user.status = '' |
|---|
| 196 | stats = user.show + ' : ' + user.status |
|---|
| 197 | for u in self.plugin.roster.contacts[account][user.jid]: |
|---|
| 198 | if u.resource != user.resource: |
|---|
| 199 | resources += '\n' + u.resource + ' (' + str(u.priority) + ')' |
|---|
| 200 | if not u.status: |
|---|
| 201 | u.status = '' |
|---|
| 202 | stats += '\n' + u.show + ' : ' + u.status |
|---|
| 203 | self.xml.get_widget('label_resource').set_text(resources) |
|---|
| 204 | self.xml.get_widget('label_status').set_text(stats) |
|---|
| 205 | self.init_lists() |
|---|
| 206 | plugin.send('ASK_VCARD', account, self.user.jid) |
|---|
| 207 | |
|---|
| 208 | self.xml.signal_connect('gtk_widget_destroy', self.delete_event) |
|---|
| 209 | self.xml.signal_connect('on_close_clicked', self.on_close) |
|---|
| 210 | self.xml.signal_connect('on_add_clicked', self.on_add) |
|---|
| 211 | self.xml.signal_connect('on_remove_clicked', self.on_remove) |
|---|
| 212 | self.xml.signal_connect('on_entry_new_key_press_event', \ |
|---|
| 213 | self.on_new_key_pressed) |
|---|
| 214 | |
|---|
| 215 | class passphrase_Window: |
|---|
| 216 | """Class for Passphrase Window""" |
|---|
| 217 | def run(self): |
|---|
| 218 | """Wait for Ok button to be pressed and return passphrase""" |
|---|
| 219 | rep = self.win.run() |
|---|
| 220 | if rep == gtk.RESPONSE_OK: |
|---|
| 221 | msg = self.entry.get_text() |
|---|
| 222 | else: |
|---|
| 223 | msg = -1 |
|---|
| 224 | chk = self.xml.get_widget("save_checkbutton") |
|---|
| 225 | self.win.destroy() |
|---|
| 226 | return msg, chk.get_active() |
|---|
| 227 | |
|---|
| 228 | def on_key_pressed(self, widget, event): |
|---|
| 229 | if event.keyval == gtk.keysyms.Return: |
|---|
| 230 | if self.autoconnect: |
|---|
| 231 | self.on_ok_clicked(widget) |
|---|
| 232 | else: |
|---|
| 233 | self.win.response(gtk.RESPONSE_OK) |
|---|
| 234 | |
|---|
| 235 | def on_ok_clicked(self, widget): |
|---|
| 236 | if self.autoconnect: |
|---|
| 237 | self.msg = self.entry.get_text() |
|---|
| 238 | gtk.main_quit() |
|---|
| 239 | |
|---|
| 240 | def on_cancel_clicked(self, widget): |
|---|
| 241 | if self.autoconnect: |
|---|
| 242 | gtk.main_quit() |
|---|
| 243 | |
|---|
| 244 | def get_pass(self): |
|---|
| 245 | self.autoconnect = 0 |
|---|
| 246 | chk = self.xml.get_widget("save_checkbutton") |
|---|
| 247 | self.win.destroy() |
|---|
| 248 | return self.msg, chk.get_active() |
|---|
| 249 | |
|---|
| 250 | def delete_event(self, widget=None): |
|---|
| 251 | """close window""" |
|---|
| 252 | if self.autoconnect: |
|---|
| 253 | gtk.main_quit() |
|---|
| 254 | |
|---|
| 255 | def __init__(self, txt, autoconnect=0): |
|---|
| 256 | self.xml = gtk.glade.XML(GTKGUI_GLADE, 'Passphrase', APP) |
|---|
| 257 | self.win = self.xml.get_widget("Passphrase") |
|---|
| 258 | self.entry = self.xml.get_widget("entry") |
|---|
| 259 | self.msg = -1 |
|---|
| 260 | self.autoconnect = autoconnect |
|---|
| 261 | self.xml.get_widget("label").set_text(txt) |
|---|
| 262 | self.xml.signal_connect('gtk_widget_destroy', self.delete_event) |
|---|
| 263 | self.xml.signal_connect('on_ok_clicked', self.on_ok_clicked) |
|---|
| 264 | self.xml.signal_connect('on_cancel_clicked', self.on_cancel_clicked) |
|---|
| 265 | self.xml.signal_connect('on_Passphrase_key_press_event', \ |
|---|
| 266 | self.on_key_pressed) |
|---|
| 267 | |
|---|
| 268 | class choose_gpg_Window: |
|---|
| 269 | """Class for Away Message Window""" |
|---|
| 270 | def run(self): |
|---|
| 271 | """Wait for Ok button to be pressed and return the selected key""" |
|---|
| 272 | rep = self.xml.get_widget("Choose_gpg_key").run() |
|---|
| 273 | if rep == gtk.RESPONSE_OK: |
|---|
| 274 | selection = self.treeview.get_selection() |
|---|
| 275 | (model, iter) = selection.get_selected() |
|---|
| 276 | keyID = [model.get_value(iter, 0), model.get_value(iter, 1)] |
|---|
| 277 | else: |
|---|
| 278 | keyID = -1 |
|---|
| 279 | self.xml.get_widget("Choose_gpg_key").destroy() |
|---|
| 280 | return keyID |
|---|
| 281 | |
|---|
| 282 | def fill_tree(self, list): |
|---|
| 283 | model = self.treeview.get_model() |
|---|
| 284 | for keyID in list.keys(): |
|---|
| 285 | model.append((keyID, list[keyID])) |
|---|
| 286 | |
|---|
| 287 | def __init__(self): |
|---|
| 288 | #list : {keyID: userName, ...} |
|---|
| 289 | self.xml = gtk.glade.XML(GTKGUI_GLADE, 'Choose_gpg_key', APP) |
|---|
| 290 | self.window = self.xml.get_widget("Choose_gpg_key") |
|---|
| 291 | self.treeview = self.xml.get_widget("treeview") |
|---|
| 292 | model = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING) |
|---|
| 293 | self.treeview.set_model(model) |
|---|
| 294 | #columns |
|---|
| 295 | renderer = gtk.CellRendererText() |
|---|
| 296 | self.treeview.insert_column_with_attributes(-1, _('KeyID'), renderer, \ |
|---|
| 297 | text=0) |
|---|
| 298 | renderer = gtk.CellRendererText() |
|---|
| 299 | self.treeview.insert_column_with_attributes(-1, _('User name'), renderer,\ |
|---|
| 300 | text=1) |
|---|
| 301 | |
|---|
| 302 | class awayMsg_Window: |
|---|
| 303 | """Class for Away Message Window""" |
|---|
| 304 | def run(self): |
|---|
| 305 | """Wait for Ok button to be pressed and return away messsage""" |
|---|
| 306 | rep = self.xml.get_widget("Away_msg").run() |
|---|
| 307 | if rep == gtk.RESPONSE_OK: |
|---|
| 308 | beg, end = self.txtBuffer.get_bounds() |
|---|
| 309 | msg = self.txtBuffer.get_text(beg, end, 0) |
|---|
| 310 | self.plugin.config['last_msg'] = msg |
|---|
| 311 | else: |
|---|
| 312 | msg = -1 |
|---|
| 313 | self.xml.get_widget("Away_msg").destroy() |
|---|
| 314 | return msg |
|---|
| 315 | |
|---|
| 316 | def on_entry_changed(self, widget, data=None): |
|---|
| 317 | model = widget.get_model() |
|---|
| 318 | active = widget.get_active() |
|---|
| 319 | if active < 0: |
|---|
| 320 | return None |
|---|
| 321 | name = model[active][0] |
|---|
| 322 | self.txtBuffer.set_text(self.values[name]) |
|---|
| 323 | |
|---|
| 324 | def on_key_pressed(self, widget, event): |
|---|
| 325 | if event.keyval == gtk.keysyms.Return: |
|---|
| 326 | if (event.state & gtk.gdk.CONTROL_MASK): |
|---|
| 327 | self.xml.get_widget("Away_msg").response(gtk.RESPONSE_OK) |
|---|
| 328 | |
|---|
| 329 | def __init__(self, plugin): |
|---|
| 330 | self.xml = gtk.glade.XML(GTKGUI_GLADE, 'Away_msg', APP) |
|---|
| 331 | self.plugin = plugin |
|---|
| 332 | txt = self.xml.get_widget("textview") |
|---|
| 333 | self.txtBuffer = txt.get_buffer() |
|---|
| 334 | self.txtBuffer.set_text(self.plugin.config['last_msg']) |
|---|
| 335 | self.values = {'':''} |
|---|
| 336 | i = 0 |
|---|
| 337 | while self.plugin.config.has_key('msg%s_name' % i): |
|---|
| 338 | self.values[self.plugin.config['msg%s_name' % i]] = \ |
|---|
| 339 | self.plugin.config['msg%s' % i] |
|---|
| 340 | i += 1 |
|---|
| 341 | liststore = gtk.ListStore(str, str) |
|---|
| 342 | cb = self.xml.get_widget('comboboxentry') |
|---|
| 343 | cb.set_model(liststore) |
|---|
| 344 | cb.set_text_column(0) |
|---|
| 345 | for val in self.values.keys(): |
|---|
| 346 | cb.append_text(val) |
|---|
| 347 | self.xml.signal_connect('on_comboboxentry_changed', self.on_entry_changed) |
|---|
| 348 | self.xml.signal_connect('on_key_press_event', self.on_key_pressed) |
|---|
| 349 | |
|---|
| 350 | class addContact_Window: |
|---|
| 351 | """Class for Add user window""" |
|---|
| 352 | def delete_event(self, widget): |
|---|
| 353 | """close window""" |
|---|
| 354 | del self.plugin.windows['add'] |
|---|
| 355 | |
|---|
| 356 | def on_cancel(self, widget): |
|---|
| 357 | """When Cancel button is clicked""" |
|---|
| 358 | widget.get_toplevel().destroy() |
|---|
| 359 | |
|---|
| 360 | def on_subscribe(self, widget): |
|---|
| 361 | """When Subscribe button is clicked""" |
|---|
| 362 | textview_sub = self.xml.get_widget("textview_sub") |
|---|
| 363 | entry_who = self.xml.get_widget('entry_who') |
|---|
| 364 | who = entry_who.get_text() |
|---|
| 365 | if not who: |
|---|
| 366 | return |
|---|
| 367 | if who.find('@') < 0: |
|---|
| 368 | warning_Window(_("The contact's name must be something like login@hostname")) |
|---|
| 369 | return |
|---|
| 370 | buf = textview_sub.get_buffer() |
|---|
| 371 | start_iter = buf.get_start_iter() |
|---|
| 372 | end_iter = buf.get_end_iter() |
|---|
| 373 | txt = buf.get_text(start_iter, end_iter, 0) |
|---|
| 374 | self.plugin.roster.req_sub(self, who, txt, self.account) |
|---|
| 375 | widget.get_toplevel().destroy() |
|---|
| 376 | |
|---|
| 377 | def __init__(self, plugin, account, jid=None): |
|---|
| 378 | self.plugin = plugin |
|---|
| 379 | self.account = account |
|---|
| 380 | self.xml = gtk.glade.XML(GTKGUI_GLADE, 'Add', APP) |
|---|
| 381 | self.window = self.xml.get_widget('Add') |
|---|
| 382 | if jid: |
|---|
| 383 | self.xml.get_widget('entry_who').set_text(jid) |
|---|
| 384 | self.xml.signal_connect('gtk_widget_destroy', self.delete_event) |
|---|
| 385 | self.xml.signal_connect('on_button_sub_clicked', self.on_subscribe) |
|---|
| 386 | self.xml.signal_connect('on_cancel_clicked', self.on_cancel) |
|---|
| 387 | |
|---|
| 388 | class warning_Window: |
|---|
| 389 | """Class for warning window : print a warning message""" |
|---|
| 390 | def on_close(self, widget): |
|---|
| 391 | """When Close button is clicked""" |
|---|
| 392 | widget.get_toplevel().destroy() |
|---|
| 393 | |
|---|
| 394 | def __init__(self, txt): |
|---|
| 395 | xml = gtk.glade.XML(GTKGUI_GLADE, 'Warning', APP) |
|---|
| 396 | xml.get_widget('label').set_text(txt) |
|---|
| 397 | xml.signal_connect('on_close_clicked', self.on_close) |
|---|
| 398 | |
|---|
| 399 | class about_Window: |
|---|
| 400 | """Class for about window""" |
|---|
| 401 | def delete_event(self, widget): |
|---|
| 402 | """close window""" |
|---|
| 403 | del self.plugin.windows['about'] |
|---|
| 404 | |
|---|
| 405 | def on_close(self, widget): |
|---|
| 406 | """When Close button is clicked""" |
|---|
| 407 | widget.get_toplevel().destroy() |
|---|
| 408 | |
|---|
| 409 | def __init__(self, plugin): |
|---|
| 410 | xml = gtk.glade.XML(GTKGUI_GLADE, 'About', APP) |
|---|
| 411 | self.window = xml.get_widget('About') |
|---|
| 412 | self.plugin = plugin |
|---|
| 413 | xml.signal_connect('gtk_widget_destroy', self.delete_event) |
|---|
| 414 | xml.signal_connect('on_close_clicked', self.on_close) |
|---|
| 415 | |
|---|
| 416 | |
|---|
| 417 | class confirm_Window: |
|---|
| 418 | """Class for confirmation window""" |
|---|
| 419 | def wait(self): |
|---|
| 420 | out = self.win.run() |
|---|
| 421 | self.win.destroy() |
|---|
| 422 | return out |
|---|
| 423 | |
|---|
| 424 | def __init__(self, label): |
|---|
| 425 | xml = gtk.glade.XML(GTKGUI_GLADE, 'Confirm', APP) |
|---|
| 426 | xml.get_widget('label_confirm').set_text(label) |
|---|
| 427 | self.win = xml.get_widget('Confirm') |
|---|
| 428 | |
|---|
| 429 | class authorize_Window: |
|---|
| 430 | """Class for authorization window : |
|---|
| 431 | window that appears when a user wants to add us to his/her roster""" |
|---|
| 432 | def on_close(self, widget): |
|---|
| 433 | """When Close button is clicked""" |
|---|
| 434 | widget.get_toplevel().destroy() |
|---|
| 435 | |
|---|
| 436 | def auth(self, widget): |
|---|
| 437 | """Accept the request""" |
|---|
| 438 | self.plugin.send('AUTH', self.account, self.jid) |
|---|
| 439 | widget.get_toplevel().destroy() |
|---|
| 440 | if not self.plugin.roster.contacts[self.account].has_key(self.jid): |
|---|
| 441 | addContact_Window(self.plugin, self.account, self.jid) |
|---|
| 442 | |
|---|
| 443 | def deny(self, widget): |
|---|
| 444 | """refuse the request""" |
|---|
| 445 | self.plugin.send('DENY', self.account, self.jid) |
|---|
| 446 | widget.get_toplevel().destroy() |
|---|
| 447 | |
|---|
| 448 | def __init__(self, plugin, jid, txt, account): |
|---|
| 449 | xml = gtk.glade.XML(GTKGUI_GLADE, 'Sub_req', APP) |
|---|
| 450 | self.plugin = plugin |
|---|
| 451 | self.jid = jid |
|---|
| 452 | self.account = account |
|---|
| 453 | xml.get_widget('label').set_text(_("Subscription request from %s") % self.jid) |
|---|
| 454 | xml.get_widget("textview").get_buffer().set_text(txt) |
|---|
| 455 | xml.signal_connect('on_button_auth_clicked', self.auth) |
|---|
| 456 | xml.signal_connect('on_button_deny_clicked', self.deny) |
|---|
| 457 | xml.signal_connect('on_button_close_clicked', self.on_close) |
|---|