root/branches/gajim_0.3/plugins/gtkgui/dialogs.py

Revision 332, 14.5 kB (checked in by asterix, 4 years ago)

no need of shellbang line

Line 
1##      plugins/dialogs.py
2##
3## Gajim Team:
4##      - Yann Le Boulanger <asterix@crans.org>
5##      - Vincent Hanquez <tab@snarc.org>
6##
7##      Copyright (C) 2003 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
19import pygtk
20pygtk.require('2.0')
21import gtk
22from gtk import TRUE, FALSE
23import gtk.glade,gobject
24import string
25from common import i18n
26_ = i18n._
27APP = i18n.APP
28gtk.glade.bindtextdomain (APP, i18n.DIR)
29gtk.glade.textdomain (APP)
30
31GTKGUI_GLADE='plugins/gtkgui/gtkgui.glade'
32
33
34class 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
215class 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                self.win.destroy()
225                return msg
226
227        def on_key_pressed(self, widget, event):
228                if event.keyval == gtk.keysyms.Return:
229                        if self.autoconnect:
230                                self.on_ok_clicked(widget)
231                        else:
232                                self.win.response(gtk.RESPONSE_OK)
233
234        def on_ok_clicked(self, widget):
235                if self.autoconnect:
236                        self.msg = self.entry.get_text()
237                        gtk.main_quit()
238       
239        def on_cancel_clicked(self, widget):
240                if self.autoconnect:
241                        gtk.main_quit()
242       
243        def get_pass(self):
244                self.autoconnect = 0
245                self.win.destroy()
246                return self.msg
247               
248        def delete_event(self, widget=None):
249                """close window"""
250                if self.autoconnect:
251                        gtk.main_quit()
252
253        def __init__(self, txt, autoconnect=0):
254                self.xml = gtk.glade.XML(GTKGUI_GLADE, 'Passphrase', APP)
255                self.win = self.xml.get_widget("Passphrase")
256                self.entry = self.xml.get_widget("entry")
257                self.msg = -1
258                self.autoconnect = autoconnect
259                self.xml.get_widget("label").set_text(txt)
260                self.xml.signal_connect('gtk_widget_destroy', self.delete_event)
261                self.xml.signal_connect('on_ok_clicked', self.on_ok_clicked)
262                self.xml.signal_connect('on_cancel_clicked', self.on_cancel_clicked)
263                self.xml.signal_connect('on_Passphrase_key_press_event', \
264                        self.on_key_pressed)
265
266class choose_gpg_Window:
267        """Class for Away Message Window"""
268        def run(self):
269                """Wait for Ok button to be pressed and return the selected key"""
270                rep = self.xml.get_widget("Choose_gpg_key").run()
271                if rep == gtk.RESPONSE_OK:
272                        selection = self.treeview.get_selection()
273                        (model, iter) = selection.get_selected()
274                        keyID = [model.get_value(iter, 0), model.get_value(iter, 1)]
275                else:
276                        keyID = -1
277                self.xml.get_widget("Choose_gpg_key").destroy()
278                return keyID
279
280        def fill_tree(self, list):
281                model = self.treeview.get_model()
282                for keyID in list.keys():
283                        model.append((keyID, list[keyID]))
284       
285        def __init__(self):
286                #list : {keyID: userName, ...}
287                self.xml = gtk.glade.XML(GTKGUI_GLADE, 'Choose_gpg_key', APP)
288                self.window = self.xml.get_widget("Choose_gpg_key")
289                self.treeview = self.xml.get_widget("treeview")
290                model = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING)
291                self.treeview.set_model(model)
292                #columns
293                renderer = gtk.CellRendererText()
294                self.treeview.insert_column_with_attributes(-1, _('KeyID'), renderer, \
295                        text=0)
296                renderer = gtk.CellRendererText()
297                self.treeview.insert_column_with_attributes(-1, _('User name'), renderer,\
298                        text=1)
299
300class awayMsg_Window:
301        """Class for Away Message Window"""
302        def on_ok(self):
303                """When Ok button is clicked"""
304                beg, end = self.txtBuffer.get_bounds()
305                self.msg = self.txtBuffer.get_text(beg, end, 0)
306                self.xml.get_widget("Away_msg").destroy()
307       
308        def run(self):
309                """Wait for Ok button to be pressed and return away messsage"""
310                rep = self.xml.get_widget("Away_msg").run()
311                if rep == gtk.RESPONSE_OK:
312                        beg, end = self.txtBuffer.get_bounds()
313                        msg = self.txtBuffer.get_text(beg, end, 0)
314                        self.plugin.config['last_msg'] = msg
315                else:
316                        msg = -1
317                self.xml.get_widget("Away_msg").destroy()
318                return msg
319
320        def on_entry_changed(self, widget, data=None):
321                model = widget.get_model()
322                active = widget.get_active()
323                if active < 0:
324                        return None
325                name = model[active][0]
326                self.txtBuffer.set_text(self.values[name])
327       
328        def __init__(self, plugin):
329                self.xml = gtk.glade.XML(GTKGUI_GLADE, 'Away_msg', APP)
330                self.plugin = plugin
331                txt = self.xml.get_widget("textview")
332                self.txtBuffer = txt.get_buffer()
333                self.txtBuffer.set_text(self.plugin.config['last_msg'])
334                self.values = {'':''}
335                i = 0
336                while self.plugin.config.has_key('msg%s_name' % i):
337                        self.values[self.plugin.config['msg%s_name' % i]] = \
338                                self.plugin.config['msg%s' % i]
339                        i += 1
340                liststore = gtk.ListStore(str, str)
341                cb = self.xml.get_widget('comboboxentry')
342                cb.set_model(liststore)
343                cb.set_text_column(0)
344                for val in self.values.keys():
345                        cb.append_text(val)
346                self.xml.signal_connect('on_comboboxentry_changed', self.on_entry_changed)
347
348class addContact_Window:
349        """Class for Add user window"""
350        def delete_event(self, widget):
351                """close window"""
352                del self.plugin.windows['add']
353
354        def on_cancel(self, widget):
355                """When Cancel button is clicked"""
356                widget.get_toplevel().destroy()
357
358        def on_subscribe(self, widget):
359                """When Subscribe button is clicked"""
360                textview_sub = self.xml.get_widget("textview_sub")
361                entry_who = self.xml.get_widget('entry_who')
362                who = entry_who.get_text()
363                if not who:
364                        return
365                if who.find('@') < 0:
366                        warning_Window(_("The contact's name must be something like login@hostname"))
367                        return
368                buf = textview_sub.get_buffer()
369                start_iter = buf.get_start_iter()
370                end_iter = buf.get_end_iter()
371                txt = buf.get_text(start_iter, end_iter, 0)
372                self.plugin.roster.req_sub(self, who, txt, self.account)
373                widget.get_toplevel().destroy()
374               
375        def __init__(self, plugin, account, jid=None):
376                self.plugin = plugin
377                self.account = account
378                self.xml = gtk.glade.XML(GTKGUI_GLADE, 'Add', APP)
379                self.window = self.xml.get_widget('Add')
380                if jid:
381                        self.xml.get_widget('entry_who').set_text(jid)
382                self.xml.signal_connect('gtk_widget_destroy', self.delete_event)
383                self.xml.signal_connect('on_button_sub_clicked', self.on_subscribe)
384                self.xml.signal_connect('on_cancel_clicked', self.on_cancel)
385
386class warning_Window:
387        """Class for warning window : print a warning message"""
388        def on_close(self, widget):
389                """When Close button is clicked"""
390                widget.get_toplevel().destroy()
391
392        def __init__(self, txt):
393                xml = gtk.glade.XML(GTKGUI_GLADE, 'Warning', APP)
394                xml.get_widget('label').set_text(txt)
395                xml.signal_connect('on_close_clicked', self.on_close)
396
397class about_Window:
398        """Class for about window"""
399        def delete_event(self, widget):
400                """close window"""
401                del self.plugin.windows['about']
402               
403        def on_close(self, widget):
404                """When Close button is clicked"""
405                widget.get_toplevel().destroy()
406
407        def __init__(self, plugin):
408                xml = gtk.glade.XML(GTKGUI_GLADE, 'About', APP)
409                self.window = xml.get_widget('About')
410                self.plugin = plugin
411                xml.signal_connect('gtk_widget_destroy', self.delete_event)
412                xml.signal_connect('on_close_clicked', self.on_close)
413
414
415class confirm_Window:
416        """Class for confirmation window"""
417        def wait(self):
418                out = self.win.run()
419                self.win.destroy()
420                return out
421
422        def __init__(self, label):
423                xml = gtk.glade.XML(GTKGUI_GLADE, 'Confirm', APP)
424                xml.get_widget('label_confirm').set_text(label)
425                self.win = xml.get_widget('Confirm')
426
427class authorize_Window:
428        """Class for authorization window :
429        window that appears when a user wants to add us to his/her roster"""
430        def on_close(self, widget):
431                """When Close button is clicked"""
432                widget.get_toplevel().destroy()
433               
434        def auth(self, widget):
435                """Accept the request"""
436                self.plugin.send('AUTH', self.account, self.jid)
437                widget.get_toplevel().destroy()
438                if not self.plugin.roster.contacts[self.account].has_key(self.jid):
439                        addContact_Window(self.plugin, self.account, self.jid)
440       
441        def deny(self, widget):
442                """refuse the request"""
443                self.plugin.send('DENY', self.account, self.jid)
444                widget.get_toplevel().destroy()
445       
446        def __init__(self, plugin, jid, txt, account):
447                xml = gtk.glade.XML(GTKGUI_GLADE, 'Sub_req', APP)
448                self.plugin = plugin
449                self.jid = jid
450                self.account = account
451                xml.get_widget('label').set_text(_("Subscription request from %s") % self.jid)
452                xml.get_widget("textview").get_buffer().set_text(txt)
453                xml.signal_connect('on_button_auth_clicked', self.auth)
454                xml.signal_connect('on_button_deny_clicked', self.deny)
455                xml.signal_connect('on_button_close_clicked', self.on_close)
Note: See TracBrowser for help on using the browser.