| 1 | ## src/advanced.py |
|---|
| 2 | ## |
|---|
| 3 | ## Gajim Team: |
|---|
| 4 | ## - Yann Le Boulanger <asterix@lagaule.org> |
|---|
| 5 | ## - Vincent Hanquez <tab@snarc.org> |
|---|
| 6 | ## - Nikos Kouremenos <kourem@gmail.com> |
|---|
| 7 | ## |
|---|
| 8 | ## Copyright (C) 2003-2005 Gajim Team |
|---|
| 9 | ## |
|---|
| 10 | ## This program is free software; you can redistribute it and/or modify |
|---|
| 11 | ## it under the terms of the GNU General Public License as published |
|---|
| 12 | ## by the Free Software Foundation; version 2 only. |
|---|
| 13 | ## |
|---|
| 14 | ## This program is distributed in the hope that it will be useful, |
|---|
| 15 | ## but WITHOUT ANY WARRANTY; without even the implied warranty of |
|---|
| 16 | ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|---|
| 17 | ## GNU General Public License for more details. |
|---|
| 18 | ## |
|---|
| 19 | |
|---|
| 20 | import gtk |
|---|
| 21 | import gtk.glade |
|---|
| 22 | import gobject |
|---|
| 23 | |
|---|
| 24 | from common import gajim |
|---|
| 25 | from common import i18n |
|---|
| 26 | |
|---|
| 27 | _ = i18n._ |
|---|
| 28 | APP = i18n.APP |
|---|
| 29 | gtk.glade.bindtextdomain(APP, i18n.DIR) |
|---|
| 30 | gtk.glade.textdomain(APP) |
|---|
| 31 | |
|---|
| 32 | OPT_TYPE = 0 |
|---|
| 33 | OPT_VAL = 1 |
|---|
| 34 | |
|---|
| 35 | GTKGUI_GLADE = 'gtkgui.glade' |
|---|
| 36 | |
|---|
| 37 | class Advanced_configuration_window: |
|---|
| 38 | def on_config_edited(self, cell, row, text): |
|---|
| 39 | modelrow = self.model[row] |
|---|
| 40 | if gajim.config.set(modelrow[0], text): |
|---|
| 41 | return |
|---|
| 42 | self.plugin.save_config() |
|---|
| 43 | modelrow[1] = text |
|---|
| 44 | |
|---|
| 45 | def on_advanced_configuration_window_destroy(self, widget): |
|---|
| 46 | del self.plugin.windows['advanced_config'] |
|---|
| 47 | |
|---|
| 48 | def on_advanced_close_button_clicked(self, widget): |
|---|
| 49 | self.window.destroy() |
|---|
| 50 | |
|---|
| 51 | def find_iter(self, model, parent_iter, name): |
|---|
| 52 | if not parent_iter: |
|---|
| 53 | iter = model.get_iter_root() |
|---|
| 54 | else: |
|---|
| 55 | iter = model.iter_children(parent_iter) |
|---|
| 56 | while iter: |
|---|
| 57 | if model.get_value(iter, 0) == name: |
|---|
| 58 | break |
|---|
| 59 | iter = model.iter_next(iter) |
|---|
| 60 | return iter |
|---|
| 61 | |
|---|
| 62 | def fill(self, model, name, parents, val): |
|---|
| 63 | iter = None |
|---|
| 64 | if parents: |
|---|
| 65 | for p in parents: |
|---|
| 66 | iter2 = self.find_iter(model, iter, p) |
|---|
| 67 | if iter2: |
|---|
| 68 | iter = iter2 |
|---|
| 69 | |
|---|
| 70 | if not val: |
|---|
| 71 | model.append(iter, [name, '', '']) |
|---|
| 72 | return |
|---|
| 73 | type = '' |
|---|
| 74 | if val[OPT_TYPE]: |
|---|
| 75 | type = val[OPT_TYPE][0] |
|---|
| 76 | model.append(iter, [name, val[OPT_VAL], type]) |
|---|
| 77 | |
|---|
| 78 | def visible_func(self, model, iter): |
|---|
| 79 | str = self.entry.get_text() |
|---|
| 80 | if str is None or str == '': |
|---|
| 81 | return True # show all |
|---|
| 82 | name = model.get_value(iter, 0) |
|---|
| 83 | if name.find(str) != -1: |
|---|
| 84 | return True |
|---|
| 85 | return False |
|---|
| 86 | |
|---|
| 87 | def on_advanced_entry_changed(self, widget): |
|---|
| 88 | text = widget.get_text() |
|---|
| 89 | self.modelfilter.refilter() |
|---|
| 90 | |
|---|
| 91 | def __init__(self, plugin): |
|---|
| 92 | self.plugin = plugin |
|---|
| 93 | |
|---|
| 94 | self.xml = gtk.glade.XML(GTKGUI_GLADE, 'advanced_configuration_window', None) |
|---|
| 95 | self.window = self.xml.get_widget('advanced_configuration_window') |
|---|
| 96 | self.entry = self.xml.get_widget('advanced_entry') |
|---|
| 97 | |
|---|
| 98 | self.xml.signal_autoconnect(self) |
|---|
| 99 | |
|---|
| 100 | treeview = self.xml.get_widget('advanced_treeview') |
|---|
| 101 | self.model = gtk.TreeStore(str, str, str) |
|---|
| 102 | self.model.set_sort_column_id(0, gtk.SORT_ASCENDING) |
|---|
| 103 | self.modelfilter = self.model.filter_new() |
|---|
| 104 | self.modelfilter.set_visible_func(self.visible_func) |
|---|
| 105 | |
|---|
| 106 | renderer_text = gtk.CellRendererText() |
|---|
| 107 | col = treeview.insert_column_with_attributes(-1, _('Preference Name'), |
|---|
| 108 | renderer_text, text = 0) |
|---|
| 109 | col.set_resizable(True) |
|---|
| 110 | |
|---|
| 111 | renderer_text = gtk.CellRendererText() |
|---|
| 112 | renderer_text.set_property('editable', 1) |
|---|
| 113 | renderer_text.connect('edited', self.on_config_edited) |
|---|
| 114 | col = treeview.insert_column_with_attributes(-1, _('Value'), |
|---|
| 115 | renderer_text, text = 1) |
|---|
| 116 | |
|---|
| 117 | #col.set_resizable(True) DO NOT REMOVE |
|---|
| 118 | # GTK+ bug http://bugzilla.gnome.org/show_bug.cgi?id=304139 |
|---|
| 119 | col.set_max_width(250) |
|---|
| 120 | |
|---|
| 121 | renderer_text = gtk.CellRendererText() |
|---|
| 122 | treeview.insert_column_with_attributes(-1, _('Type'), |
|---|
| 123 | renderer_text, text = 2) |
|---|
| 124 | |
|---|
| 125 | # add data to model |
|---|
| 126 | gajim.config.foreach(self.fill, self.model) |
|---|
| 127 | |
|---|
| 128 | treeview.set_model(self.modelfilter) |
|---|
| 129 | |
|---|
| 130 | self.plugin.windows['advanced_config'] = self |
|---|
| 131 | self.window.show_all() |
|---|