| 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 | |
|---|
| 22 | import gobject |
|---|
| 23 | import gtk |
|---|
| 24 | |
|---|
| 25 | from common import gajim, dataforms |
|---|
| 26 | |
|---|
| 27 | import gtkgui_helpers |
|---|
| 28 | import dialogs |
|---|
| 29 | import vcard |
|---|
| 30 | import config |
|---|
| 31 | import dataforms_widget |
|---|
| 32 | |
|---|
| 33 | class 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: |
|---|