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

Revision 361, 14.7 kB (checked in by asterix, 4 years ago)

when we make Ctrl+Enter in away message window, it validates it

Line 
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
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                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
268class 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
302class 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
350class 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
388class 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
399class 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
417class 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
429class 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)
Note: See TracBrowser for help on using the browser.