8d1424b85a8b822142721eff87f2ac5d2193cdac
[platform/upstream/ibus.git] / setup / enginecombobox.py
1 # vim:set et sts=4 sw=4:
2 #
3 # ibus - The Input Bus
4 #
5 # Copyright (c) 2007-2010 Peng Huang <shawn.p.huang@gmail.com>
6 # Copyright (c) 2007-2010 Red Hat, Inc.
7 #
8 # This library is free software; you can redistribute it and/or
9 # modify it under the terms of the GNU Lesser General Public
10 # License as published by the Free Software Foundation; either
11 # version 2 of the License, or (at your option) any later version.
12 #
13 # This library 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 Lesser General Public License for more details.
17 #
18 # You should have received a copy of the GNU Lesser General Public
19 # License along with this program; if not, write to the
20 # Free Software Foundation, Inc., 59 Temple Place, Suite 330,
21 # Boston, MA  02111-1307  USA
22
23 import locale
24
25 from gi.repository import GObject
26 from gi.repository import Gtk
27 from gi.repository import IBus
28 from gi.repository import Pango
29
30 from icon import load_icon
31 from i18n import _, N_
32
33 class EngineComboBox(Gtk.ComboBox):
34     __gtype_name__ = 'EngineComboBox'
35     __gproperties__ = {
36         'active-engine' : (
37             object,
38             'selected engine',
39             'selected engine',
40             GObject.ParamFlags.READABLE)
41     }
42
43     def __init__(self):
44         super(EngineComboBox, self).__init__()
45         self.connect("notify::active", self.__notify_active_cb)
46
47         self.__model = None
48
49         renderer = Gtk.CellRendererPixbuf()
50         renderer.set_property("xalign", 0)
51         renderer.set_property("xpad", 2)
52         self.pack_start(renderer, False)
53         self.set_cell_data_func(renderer, self.__icon_cell_data_cb, None)
54
55         renderer = Gtk.CellRendererText()
56         renderer.set_property("xalign", 0)
57         renderer.set_property("xpad", 2)
58         self.pack_start(renderer, True)
59         self.set_cell_data_func(renderer, self.__name_cell_data_cb, None)
60
61     def set_engines(self, engines):
62         self.__model = Gtk.TreeStore(object)
63
64         iter1 = self.__model.append(None)
65         self.__model.set(iter1, 0, 0)
66         langs = {}
67         for e in engines:
68             print e.get_language()
69             l = IBus.get_language_name(e.get_language())
70             if l == None:
71                 l = ""
72             if l not in langs:
73                 langs[l] = []
74             langs[l].append(e)
75
76         keys = langs.keys()
77         keys.sort(locale.strcoll)
78         current_lang = IBus.get_language_name(locale.getlocale()[0])
79         # move current language to the first place
80         if current_lang in keys:
81             keys.remove(current_lang)
82             keys.insert(0, current_lang)
83
84         #add "Others" to the end of the combo box
85         if IBus.get_language_name("Other") in keys:
86             keys.remove(IBus.get_language_name("Other"))
87             keys += [IBus.get_language_name("Other")]
88         for l in keys:
89             iter1 = self.__model.append(None)
90             self.__model.set(iter1, 0, l)
91             def cmp_engine(a, b):
92                 if a.get_rank() == b.get_rank():
93                     return locale.strcoll(a.get_longname(), b.get_longname())
94                 return int(b.get_rank() - a.get_rank())
95             langs[l].sort(cmp_engine)
96             for e in langs[l]:
97                 iter2 = self.__model.append(iter1)
98                 self.__model.set(iter2, 0, e)
99
100         self.set_model(self.__model)
101         self.set_active(0)
102
103     def __icon_cell_data_cb(self, celllayout, renderer, model, iter, data):
104         engine = self.__model.get_value(iter, 0)
105
106         if isinstance(engine, str) or isinstance (engine, unicode):
107             renderer.set_property("visible", False)
108             renderer.set_property("sensitive", False)
109         elif isinstance(engine, int):
110             renderer.set_property("visible", False)
111             renderer.set_property("sensitive", False)
112         else:
113             renderer.set_property("visible", True)
114             renderer.set_property("sensitive", True)
115             pixbuf = load_icon(engine.get_icon(), Gtk.IconSize.LARGE_TOOLBAR)
116             if pixbuf == None:
117                 pixbuf = load_icon("ibus-engine", Gtk.IconSize.LARGE_TOOLBAR)
118             if pixbuf == None:
119                 pixbuf = load_icon(Gtk.STOCK_MISSING_IMAGE,
120                         Gtk.IconSize.LARGE_TOOLBAR)
121             renderer.set_property("pixbuf", pixbuf)
122
123     def __name_cell_data_cb(self, celllayout, renderer, model, iter, data):
124         engine = self.__model.get_value(iter, 0)
125
126         if isinstance (engine, str) or isinstance (engine, unicode):
127             renderer.set_property("sensitive", False)
128             renderer.set_property("text", engine)
129             renderer.set_property("weight", Pango.Weight.NORMAL)
130         elif isinstance(engine, int):
131             renderer.set_property("sensitive", True)
132             renderer.set_property("text", _("Select an input method"))
133             renderer.set_property("weight", Pango.Weight.NORMAL)
134         else:
135             renderer.set_property("sensitive", True)
136             renderer.set_property("text", engine.get_longname())
137             renderer.set_property("weight",
138                     Pango.Weight.BOLD if engine.get_rank() > 0 else Pango.Weight.NORMAL)
139
140     def __notify_active_cb(self, combobox, property):
141         self.notify("active-engine")
142
143     def do_get_property(self, property):
144         if property.name == "active-engine":
145             i = self.get_active()
146             if i == 0 or i == -1:
147                 return None
148             iter = self.get_active_iter()
149             return self.get_model()[iter][0]
150         else:
151             raise AttributeError, 'unknown property %s' % property.name
152
153     def get_active_engine(self):
154         return self.get_property("active-engine")
155
156 if __name__ == "__main__":
157     combo = EngineComboBox()
158     combo.set_engines([IBus.EngineDesc(language="zh")])
159     w = Gtk.Window()
160     w.add(combo)
161     w.show_all()
162     Gtk.main()