root/trunk/src/search_window.py

Revision 10497, 7.1 kB (checked in by asterix, 8 weeks ago)

[thorstenp] replace has_key by key in dict. Fixes #4392

Line 
1# -*- coding: utf-8 -*-
2## src/search_window.py
3##
4## Copyright (C) 2007 Stephan Erb <steve-e AT h3c.de>
5## Copyright (C) 2007-2008 Yann Leboulanger <asterix AT lagaule.org>
6##
7## This file is part of Gajim.
8##
9## Gajim 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 3 only.
12##
13## Gajim 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## You should have received a copy of the GNU General Public License
19## along with Gajim. If not, see <http://www.gnu.org/licenses/>.
20##
21
22import gobject
23import gtk
24
25from common import gajim, dataforms
26
27import gtkgui_helpers
28import dialogs
29import vcard
30import config
31import dataforms_widget
32
33class SearchWindow:
34        def __init__(self, account, jid):
35                '''Create new window.'''
36
37                # an account object
38                self.account = account
39                self.jid = jid
40
41                # retrieving widgets from xml
42                self.xml = gtkgui_helpers.get_glade('search_window.glade')
43                self.window = self.xml.get_widget('search_window')
44                for name in ('label', 'progressbar', 'search_vbox', 'search_button',
45                'add_contact_button', 'information_button'):
46                        self.__dict__[name] = self.xml.get_widget(name)
47
48                # displaying the window
49                self.xml.signal_autoconnect(self)
50                self.window.show_all()
51                self.request_form()
52                self.pulse_id = gobject.timeout_add(80, self.pulse_callback)
53
54                self.is_form = None
55
56                # Is there a jid column in results ? if -1: no, else column number
57                self.jid_column = -1
58
59        def request_form(self):
60                gajim.connections[self.account].request_search_fields(self.jid)
61       
62        def pulse_callback(self):
63                self.progressbar.pulse()
64                return True
65
66        def on_search_window_key_press_event(self, widget, event):
67                if event.keyval == gtk.keysyms.Escape:
68                        self.window.destroy()
69
70        def on_search_window_destroy(self, widget):
71                if self.pulse_id:
72                        gobject.source_remove(self.pulse_id)
73                del gajim.interface.instances[self.account]['search'][self.jid]
74
75        def on_close_button_clicked(self, button):
76                self.window.destroy()
77
78        def on_search_button_clicked(self, button):
79                if self.is_form:
80                        self.data_form_widget.data_form.type = 'submit'
81                        gajim.connections[self.account].send_search_form(self.jid,
82                                self.data_form_widget.data_form.get_purged(), True)
83                else:
84                        infos = self.data_form_widget.get_infos()
85                        if 'instructions' in infos:
86                                del infos['instructions']
87                        gajim.connections[self.account].send_search_form(self.jid, infos,
88                                False)
89
90                self.search_vbox.remove(self.data_form_widget)
91
92                self.progressbar.show()
93                self.label.set_text(_('Waiting for results'))
94                self.label.show()
95                self.pulse_id = gobject.timeout_add(80, self.pulse_callback)
96                self.search_button.hide()
97
98        def on_add_contact_button_clicked(self, widget):
99                (model, iter) = self.result_treeview.get_selection().get_selected()
100                if not iter:
101                        return
102                jid = model[iter][self.jid_column]
103                dialogs.AddNewContactWindow(self.account, jid)
104       
105        def on_information_button_clicked(self, widget):
106                (model, iter) = self.result_treeview.get_selection().get_selected()
107                if not iter:
108                        return
109                jid = model[iter][self.jid_column]
110                if jid in gajim.interface.instances[self.account]['infos']:
111                        gajim.interface.instances[self.account]['infos'][jid].window.present()
112                else:
113                        contact = gajim.contacts.create_contact(jid = jid, name='', groups=[],
114                                show='', status='', sub='', ask='', resource='', priority=0,
115                                keyID='', our_chatstate=None, chatstate=None)
116                        gajim.interface.instances[self.account]['infos'][jid] = \
117                                vcard.VcardWindow(contact, self.account)
118
119        def on_form_arrived(self, form, is_form):
120                if self.pulse_id:
121                        gobject.source_remove(self.pulse_id)
122                self.progressbar.hide()
123                self.label.hide()
124
125                if is_form:
126                        self.is_form = True
127                        self.data_form_widget = dataforms_widget.DataFormWidget()
128                        self.dataform = dataforms.ExtendForm(node = form)
129                        self.data_form_widget.set_sensitive(True)
130                        try:
131                                self.data_form_widget.data_form = self.dataform
132                        except dataforms.Error:
133                                self.label.set_text(_('Error in received dataform'))
134                                self.label.show()
135                                return
136                        if self.data_form_widget.title:
137                                self.window.set_title('%s - Search - Gajim' % \
138                                        self.data_form_widget.title)
139                else:
140                        self.is_form = False
141                        self.data_form_widget = config.FakeDataForm(form)
142
143                self.data_form_widget.show_all()
144                self.search_vbox.pack_start(self.data_form_widget)
145
146        def on_result_treeview_cursor_changed(self, treeview):
147                if self.jid_column == -1:
148                        return
149                (model, iter) = treeview.get_selection().get_selected()
150                if not iter:
151                        return
152                if model[iter][self.jid_column]:
153                        self.add_contact_button.set_sensitive(True)
154                        self.information_button.set_sensitive(True)
155                else:
156                        self.add_contact_button.set_sensitive(False)
157                        self.information_button.set_sensitive(False)
158
159        def on_result_arrived(self, form, is_form):
160                if self.pulse_id:
161                        gobject.source_remove(self.pulse_id)
162                self.progressbar.hide()
163                self.label.hide()
164
165                if not is_form:
166                        if not form:
167                                self.label.set_text(_('No result'))
168                                self.label.show()
169                                return
170                        # We suppose all items have the same fields
171                        sw = gtk.ScrolledWindow()
172                        sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
173                        self.result_treeview = gtk.TreeView()
174                        self.result_treeview.connect('cursor-changed',
175                                self.on_result_treeview_cursor_changed)
176                        sw.add(self.result_treeview)
177                        # Create model
178                        fieldtypes = [str]*len(form[0])
179                        model = gtk.ListStore(*fieldtypes)
180                        # Copy data to model
181                        for item in form:
182                                model.append(item.values())
183                        # Create columns
184                        counter = 0
185                        for field in form[0].keys():
186                                self.result_treeview.append_column(
187                                        gtk.TreeViewColumn(field, gtk.CellRendererText(),
188                                        text = counter))
189                                if field == 'jid':
190                                        self.jid_column = counter
191                                counter += 1
192                        self.result_treeview.set_model(model)
193                        sw.show_all()
194                        self.search_vbox.pack_start(sw)
195                        if self.jid_column > -1:
196                                self.add_contact_button.show()
197                                self.information_button.show()
198                        return
199
200                self.dataform = dataforms.ExtendForm(node = form)
201                if len(self.dataform.items) == 0:
202                        # No result
203                        self.label.set_text(_('No result'))
204                        self.label.show()
205                        return
206
207                self.data_form_widget.set_sensitive(True)
208                try:
209                        self.data_form_widget.data_form = self.dataform
210                except dataforms.Error:
211                        self.label.set_text(_('Error in received dataform'))
212                        self.label.show()
213                        return
214
215                self.result_treeview = self.data_form_widget.records_treeview
216                selection = self.result_treeview.get_selection()
217                selection.set_mode(gtk.SELECTION_SINGLE)
218                self.result_treeview.connect('cursor-changed',
219                        self.on_result_treeview_cursor_changed)
220
221                counter = 0
222                for field in self.dataform.items[0].fields:
223                        if field.var == 'jid':
224                                self.jid_column = counter
225                                break
226                        counter += 1
227                self.search_vbox.pack_start(self.data_form_widget)
228                self.data_form_widget.show()
229                if self.jid_column > -1:
230                        self.add_contact_button.show()
231                        self.information_button.show()
232                if self.data_form_widget.title:
233                        self.window.set_title('%s - Search - Gajim' % \
234                                self.data_form_widget.title)
235
236
237# vim: se ts=3:
Note: See TracBrowser for help on using the browser.