Use custom dialog to display engine information
[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-2008 Huang Peng <shawn.p.huang@gmail.com>
6 #
7 # This library is free software; you can redistribute it and/or
8 # modify it under the terms of the GNU Lesser General Public
9 # License as published by the Free Software Foundation; either
10 # version 2 of the License, or (at your option) any later version.
11 #
12 # This library is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 # GNU Lesser General Public License for more details.
16 #
17 # You should have received a copy of the GNU Lesser General Public
18 # License along with this program; if not, write to the
19 # Free Software Foundation, Inc., 59 Temple Place, Suite 330,
20 # Boston, MA  02111-1307  USA
21
22 import gtk
23 import gobject
24 import ibus
25 import gettext
26 from icon import load_icon
27
28 _ = lambda a : gettext.dgettext("ibus", a)
29
30 class EngineComboBox(gtk.ComboBox):
31     def __init__(self, engines):
32         super(EngineComboBox, self).__init__()
33
34         self.__model = gtk.TreeStore(gobject.TYPE_PYOBJECT)
35
36         iter1 = self.__model.append(None)
37         self.__model.set(iter1, 0, 0)
38         lang = {}
39         for e in engines:
40             l = ibus.get_language_name(e.language)
41             if l not in lang:
42                 lang[l] = []
43             lang[l].append(e)
44
45         keys = lang.keys()
46         keys.sort()
47         if ibus.get_language_name("Other") in keys:
48             keys.remove( ibus.get_language_name("Other"))
49             keys += [ibus.get_language_name("Other")]
50         for l in keys:
51             iter1 = self.__model.append(None)
52             self.__model.set(iter1, 0, l)
53             for e in lang[l]:
54                 iter2 = self.__model.append(iter1)
55                 self.__model.set(iter2, 0, e)
56
57         self.set_model(self.__model)
58
59         renderer = gtk.CellRendererPixbuf()
60         renderer.set_property("xalign", 0)
61         self.pack_start(renderer, False)
62         self.set_cell_data_func(renderer, self.__icon_cell_data_cb)
63
64         renderer = gtk.CellRendererText()
65         renderer.set_property("xalign", 0)
66         self.pack_start(renderer, True)
67         self.set_cell_data_func(renderer, self.__name_cell_data_cb)
68
69         self.set_active(0)
70
71     def __icon_cell_data_cb(self, celllayout, renderer, model, iter):
72         engine = self.__model.get_value(iter, 0)
73
74         icon_size = gtk.icon_size_lookup(gtk.ICON_SIZE_LARGE_TOOLBAR)[0]
75         if isinstance(engine, str) or isinstance (engine, unicode):
76             renderer.set_property("visible", False)
77             renderer.set_property("sensitive", False)
78         elif isinstance(engine, int):
79             renderer.set_property("visible", False)
80             renderer.set_property("sensitive", False)
81         else:
82             renderer.set_property("visible", True)
83             renderer.set_property("sensitive", True)
84             pixbuf = load_icon(engine.icon, gtk.ICON_SIZE_LARGE_TOOLBAR)
85             if pixbuf == None:
86                 pixbuf = load_icon("engine-default", gtk.ICON_SIZE_LARGE_TOOLBAR)
87             if pixbuf == None:
88                 pixbuf = load_icon("gtk-missing-image", gtk.ICON_SIZE_LARGE_TOOLBAR)
89             renderer.set_property("pixbuf", pixbuf)
90
91     def __name_cell_data_cb(self, celllayout, renderer, model, iter):
92         engine = self.__model.get_value(iter, 0)
93
94         if isinstance (engine, str) or isinstance (engine, unicode):
95             renderer.set_property("sensitive", False)
96             renderer.set_property("text", engine)
97         elif isinstance(engine, int):
98             renderer.set_property("sensitive", True)
99             renderer.set_property("text", _("Select an input method"))
100         else:
101             renderer.set_property("sensitive", True)
102             renderer.set_property("text", engine.longname)
103
104     def get_active_engine(self):
105         i = self.get_active()
106         iter = self.get_active_iter()
107         if i == 0 or i == -1:
108             return None
109         return self.get_model()[iter][0]
110