2 * ISF(Input Service Framework)
4 * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable.
5 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
7 * Contact: Shuo Liu <shuo0805.liu@samsung.com>, Hengliang Luo <hl.luo@samsung.com>
9 * This library is free software; you can redistribute it and/or modify it under
10 * the terms of the GNU Lesser General Public License as published by the
11 * Free Software Foundation; either version 2.1 of the License, or (at your option)
14 * This library is distributed in the hope that it will be useful, but WITHOUT ANY
15 * WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
17 * License for more details.
19 * You should have received a copy of the GNU Lesser General Public License
20 * along with this library; if not, write to the Free Software Foundation, Inc., 51
21 * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25 #define Uses_SCIM_CONFIG_PATH
26 #define Uses_SCIM_IMENGINE_MODULE
27 #define Uses_SCIM_PANEL_AGENT
33 #include "scim_private.h"
35 #include "isf_setup_win.h"
36 #include "isf_setup_utility.h"
37 #include "scim_setup_module.h"
38 #include "isf_ise_setup_win.h"
39 #include "isf_help_win.h"
40 #include "isf_lang_win.h"
42 #define LIST_ICON_SIZE 20
45 FACTORY_LIST_ENABLE = 0,
48 FACTORY_LIST_MODULE_NAME,
51 FACTORY_LIST_OPTION_PIX,
52 FACTORY_LIST_HELP_PIX,
53 FACTORY_LIST_NUM_COLUMNS
56 static SetupUI *_setup_ui = 0;
57 static ISFHelpWin *_ise_help_win = 0;
58 static ISFLangWin *_isf_lang_win = 0;
59 static GtkListStore *_app_list_store = 0;
60 static GtkListStore *_factory_list_store = 0;
61 static GtkTreePath *_app_combo_default_path = 0;
62 static GtkWidget *_combo_app = 0;
63 static GtkWidget *_main_window = 0;
64 static int _display_selected_items = 0;
65 static ConfigPointer _config;
67 extern std::vector<String> _isf_app_list;
68 extern MapStringVectorSizeT _groups;
69 extern std::vector < String > _uuids;
70 extern std::vector < String > _names;
71 extern std::vector < String > _module_names;
72 extern std::vector < String > _langs;
73 extern std::vector < String > _icons;
74 extern std::vector <TOOLBAR_MODE_T> _modes;
75 extern MapStringString _keyboard_ise_help_map;
76 extern MapStringVectorString _disabled_ise_map;
77 extern std::vector <String> _disabled_langs;
78 extern MapStringVectorString _disabled_ise_map_bak;
79 extern std::vector <String> _disabled_langs_bak;
80 extern gboolean _lang_selected_changed;
81 extern gboolean _ise_list_changed;
82 extern gboolean _setup_enable_changed;
83 extern int _screen_width;
84 extern float _width_rate;
85 extern float _height_rate;
88 ISFSetupWin::ISFSetupWin (const ConfigPointer & config)
93 _main_window = gtk_main_window_new (GTK_WIN_STYLE_DEFAULT);
94 gtk_main_window_set_title_style (GTK_MAIN_WINDOW (_main_window), GTK_WIN_TITLE_STYLE_TEXT_ICON);
96 GtkWidget *form = gtk_form_new (TRUE);
97 gtk_form_set_title (GTK_FORM (form), "ISF Setup");
99 GtkWidget *isf_setup = create_isf_setup_widget ();
101 gtk_container_add (GTK_CONTAINER (form), isf_setup);
103 #ifdef USING_ISF_SWITCH_BUTTON
104 GtkWidget *softkey = GTK_WIDGET (gtk_form_get_softkey_bar (GTK_FORM (form)));
105 gtk_softkey_bar_use_ise_switch (GTK_SOFTKEY_BAR (softkey), false);
107 gtk_softkey_bar_set_softkey (GTK_SOFTKEY_BAR (softkey), SOFTKEY1,
109 (SoftkeyActionType) SOFTKEY_CALLBACK,
110 (gpointer) (isf_setup_save_callback),
113 gtk_softkey_bar_set_softkey (GTK_SOFTKEY_BAR (softkey), SOFTKEY4,
115 (SoftkeyActionType) SOFTKEY_CALLBACK,
116 (gpointer) (isf_setup_back_callback),
119 gtk_form_add_softkey (GTK_FORM (form), "Save", NULL, SOFTKEY_CALLBACK, (void *)isf_setup_save_callback, NULL);
120 gtk_form_add_softkey (GTK_FORM (form), "Exit", NULL, SOFTKEY_CALLBACK, (void *)isf_setup_back_callback, NULL);
123 gtk_main_window_add_form (GTK_MAIN_WINDOW (_main_window), GTK_FORM (form));
124 gtk_main_window_set_current_form (GTK_MAIN_WINDOW (_main_window), GTK_FORM (form));
126 gtk_widget_show_all (form);
131 ISFSetupWin::~ISFSetupWin ()
134 gtk_widget_destroy (_main_window);
142 delete _ise_help_win;
146 delete _isf_lang_win;
151 void ISFSetupWin::show_window (void)
154 gtk_tree_model_get_iter (GTK_TREE_MODEL (_app_list_store), &it,
155 _app_combo_default_path);
156 gtk_combo_box_set_active_iter ((GtkComboBox *) _combo_app, &it);
158 update_factory_list_store ();
160 gtk_widget_show_all (_main_window);
161 gtk_window_present (GTK_WINDOW (_main_window));
166 void ISFSetupWin::app_selection_changed_callback (GtkComboBox * combo, gpointer data)
168 ISFSetupWin *obj = (ISFSetupWin *)data;
169 obj->update_factory_list_store ();
173 void ISFSetupWin::on_language_button_clicked_callback (GtkButton * button,
176 ISFSetupWin *obj = (ISFSetupWin *)user_data;
179 _isf_lang_win = new ISFLangWin ();
181 _isf_lang_win->show_window ();
183 if (_lang_selected_changed) {
184 _ise_list_changed = true;
185 obj->update_factory_list_store ();
189 GtkWidget *ISFSetupWin::create_isf_setup_widget (void)
191 GtkWidget *language_button = NULL, *hbox = NULL, *vbox = NULL, *scroll = NULL;
193 GtkTreeIter iter, it;
194 GtkCellRenderer *cell = NULL;
196 vbox = gtk_vbox_new (FALSE, 0);
197 gtk_widget_show (vbox);
199 hbox = gtk_hbox_new (FALSE, 0);
200 gtk_widget_show (hbox);
201 gtk_box_pack_start (GTK_BOX (vbox), hbox, false, false, 0);
202 gtk_widget_set_size_request (hbox, _screen_width, (int)(40*_height_rate));
203 gtk_container_set_border_width (GTK_CONTAINER (hbox),(int)( 5*_height_rate));
205 // Create application list combox
206 _combo_app = gtk_combo_box_new ();
207 cell = gtk_cell_renderer_text_new ();
208 _app_list_store = gtk_list_store_new (1, G_TYPE_STRING);
210 for (unsigned int i = 0; i < _isf_app_list.size (); i++) {
211 gtk_list_store_prepend (_app_list_store, &iter);
212 gtk_list_store_set (_app_list_store, &iter, 0, _isf_app_list[_isf_app_list.size () - i - 1].c_str (), -1);
215 _app_combo_default_path = gtk_tree_model_get_path (GTK_TREE_MODEL (_app_list_store), &iter);
217 gtk_cell_layout_pack_start ((GtkCellLayout *) _combo_app, cell, TRUE);
218 gtk_cell_layout_set_attributes ((GtkCellLayout *) _combo_app, cell, "text", 0, NULL);
219 gtk_combo_box_set_model ((GtkComboBox *) _combo_app, (GtkTreeModel *) _app_list_store);
220 gtk_tree_model_get_iter (GTK_TREE_MODEL (_app_list_store), &it, _app_combo_default_path);
221 gtk_combo_box_set_active_iter ((GtkComboBox *) _combo_app, &it);
222 // gtk_widget_show (_combo_app); //hide the app list combox temp
223 g_signal_connect ((gpointer) _combo_app, "changed",
224 G_CALLBACK (app_selection_changed_callback), (gpointer)this);
226 // Create language button
227 language_button = gtk_button_new_with_label ("Language");
228 GtkStyle *style1 = gtk_rc_get_style (language_button);
229 GtkWidget *newlabel = gtk_label_new ("Language");
231 GtkWidget * old = gtk_bin_get_child (GTK_BIN (language_button));
233 gtk_container_remove (GTK_CONTAINER (language_button), old);
234 gtk_container_add (GTK_CONTAINER (language_button), newlabel);
238 gtk_widget_modify_font (language_button, style1->font_desc);
240 gtk_widget_show (language_button);
241 gtk_box_pack_start (GTK_BOX (hbox), language_button, true, true, 0);
242 g_signal_connect ((gpointer) language_button, "clicked",
243 G_CALLBACK (on_language_button_clicked_callback), (gpointer)this);
245 // Create ISE list view
246 scroll = gtk_scrolled_window_new (NULL, NULL);
247 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll),
248 GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
249 gtk_container_add (GTK_CONTAINER (vbox), scroll);
250 gtk_widget_show (scroll);
252 GtkWidget *view = create_factory_list_view ();
253 create_and_fill_factory_list_store ();
254 gtk_tree_view_set_model (GTK_TREE_VIEW (view), GTK_TREE_MODEL (_factory_list_store));
255 gtk_container_add (GTK_CONTAINER (scroll), view);
256 gtk_widget_show (view);
261 // Show all ISEs in the view
262 void ISFSetupWin::create_and_fill_factory_list_store (void)
264 _factory_list_store = gtk_list_store_new (FACTORY_LIST_NUM_COLUMNS, G_TYPE_BOOLEAN,
265 GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING,
266 G_TYPE_STRING, G_TYPE_INT, GDK_TYPE_PIXBUF, GDK_TYPE_PIXBUF);
267 update_factory_list_store ();
270 void ISFSetupWin::update_factory_list_store (void)
274 GdkPixbuf *icon = NULL, *icon2 = NULL;
275 GtkWidget *pix = NULL, *pix2 = NULL;
277 _display_selected_items = 0;
278 pix = gtk_image_new_from_file (ISE_SETUP_ICON_FILE);
279 icon = gtk_image_get_pixbuf (GTK_IMAGE (pix));
280 pix2 = gtk_image_new_from_file (ISE_HELP_ICON_FILE);
281 icon2 = gtk_image_get_pixbuf (GTK_IMAGE (pix2));
283 String _app_name = gtk_combo_box_get_active_text ((GtkComboBox *) _combo_app);
285 gtk_list_store_clear (_factory_list_store);
286 std::vector<String> f_show;
287 for (MapStringVectorSizeT::iterator it = _groups.begin (); it != _groups.end (); ++it) {
289 lang_name = scim_get_language_name (it->first);
290 if (std::find (_disabled_langs.begin (), _disabled_langs.end (), lang_name) == _disabled_langs.end ()) {
291 for (size_t i = 0; i < it->second.size (); i++) {
292 // protect from add the same ise more than once in case of multiple langs.-->f_show list
293 if (std::find (f_show.begin (), f_show.end (), _uuids[it->second[i]]) == f_show.end ()) {
294 gtk_list_store_append (_factory_list_store, &iter);
295 gtk_list_store_set (_factory_list_store, &iter,
297 _names[it->second[i]].c_str (),
298 FACTORY_LIST_MODULE_NAME,
299 _module_names[it->second[i]].c_str (),
301 _uuids[it->second[i]].c_str (),
302 FACTORY_LIST_TYPE, (gint)_modes[it->second[i]],
303 FACTORY_LIST_OPTION_PIX, icon,
304 FACTORY_LIST_HELP_PIX,icon2,
306 f_show.push_back (_uuids[it->second[i]]);
309 if (std::find (_disabled_ise_map[_app_name].begin (), _disabled_ise_map[_app_name].end (), _uuids[it->second[i]])
310 ==_disabled_ise_map[_app_name].end ()) {
311 gtk_list_store_set (_factory_list_store, &iter, FACTORY_LIST_ENABLE, true, -1);
312 _display_selected_items++;
314 gtk_list_store_set (_factory_list_store, &iter, FACTORY_LIST_ENABLE, false, -1);
322 gdk_pixbuf_unref (icon);
326 gdk_pixbuf_unref (icon2);
331 GtkWidget * ISFSetupWin::create_factory_list_view (void)
333 GtkCellRenderer* renderer = NULL;
334 GtkTreeViewColumn* column = NULL;
336 GtkWidget *tv = gtk_tree_view_new ();
337 g_object_set (tv, "enable-grid-lines", GTK_TREE_VIEW_GRID_LINES_NONE, NULL);
338 column = gtk_tree_view_column_new ();
341 renderer = gtk_cell_renderer_toggle_new ();
342 g_object_set (renderer, "activatable", TRUE, NULL);
343 gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (column), renderer, FALSE);
344 gtk_cell_renderer_set_fixed_size (renderer, _screen_width/8, (gint)(40*_height_rate));
345 g_object_set (renderer, "xalign", 0.5, NULL);
346 g_object_set (renderer, "radio", 0, NULL);
347 g_object_set (renderer, "indicator-size", (gint)(26*(_width_rate < _height_rate ? _width_rate : _height_rate)), NULL);
348 gtk_tree_view_column_set_attributes (column, renderer, "active", FACTORY_LIST_ENABLE, NULL);
349 g_signal_connect (G_OBJECT (renderer), "toggled", G_CALLBACK (on_factory_enable_box_clicked), (gpointer) NULL);
352 renderer = gtk_cell_renderer_text_new ();
353 gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (column), renderer, FALSE);
354 gtk_tree_view_column_set_attributes (column, renderer, "text", FACTORY_LIST_NAME, NULL);
355 gtk_cell_renderer_set_fixed_size (renderer, (gint)(_screen_width*5/8), (gint)(40*_height_rate));
356 g_object_set (renderer, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
357 g_object_set (renderer, "xalign", 0.0, NULL);
359 gtk_cell_renderer_set_cell_flag (tv, renderer, GTK_CELL_RENDERER_MAINCELL);
361 gtk_tree_view_append_column (GTK_TREE_VIEW (tv), column);
364 column = gtk_tree_view_column_new ();
365 renderer = gtk_cell_renderer_pixbuf_new ();
367 renderer->cell_type = GTK_CELL_RENDERER_ICONCELL;
369 gtk_tree_view_column_pack_start (column, renderer, FALSE);
370 gtk_tree_view_column_set_attributes (column, renderer, "pixbuf", FACTORY_LIST_HELP_PIX, NULL);
371 gtk_cell_renderer_set_fixed_size (renderer, _screen_width/11, _screen_width/10);
372 g_object_set (renderer, "xalign", 0.5, NULL);
373 g_object_set (renderer, "yalign", 0.5, NULL);
374 gtk_tree_view_append_column (GTK_TREE_VIEW (tv), column);
377 column = gtk_tree_view_column_new ();
378 renderer = gtk_cell_renderer_pixbuf_new ();
380 renderer->cell_type = GTK_CELL_RENDERER_ICONCELL;
382 gtk_tree_view_column_pack_start (column, renderer, FALSE);
383 gtk_tree_view_column_set_attributes (column, renderer, "pixbuf", FACTORY_LIST_OPTION_PIX, NULL);
384 gtk_cell_renderer_set_fixed_size (renderer, _screen_width/11, _screen_width/10);
385 g_object_set (renderer, "yalign", 0.5, NULL);
386 g_object_set (renderer, "xalign", 0.5, NULL);
387 gtk_tree_view_append_column (GTK_TREE_VIEW (tv), column);
390 gtk_tree_view_set_special_row_selection_indicator (GTK_TREE_VIEW (tv), TRUE);
392 gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (tv), false);
393 g_signal_connect (GTK_TREE_VIEW (tv), "button_press_event", G_CALLBACK (button_press_cb), this);
394 gtk_widget_show_all (tv);
399 gboolean ISFSetupWin::button_press_cb (GtkWidget *widget, GdkEventButton *event, gpointer data)
401 ISFSetupWin *obj = (ISFSetupWin *)data;
402 GtkTreePath *path = NULL;
403 GtkTreeModel *model = GTK_TREE_MODEL (_factory_list_store);
405 gchar *module_name = NULL, *title = NULL;
409 GtkTreeViewColumn *column = NULL;
410 if (!gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (widget),
411 (gint)event->x, (gint)event->y,
412 &path, &column, &cell_x, &cell_y))
413 return (gboolean)FALSE;
416 gtk_tree_model_get_iter (model, &iter, path);
417 gtk_tree_path_free (path);
418 gtk_tree_model_get (model, &iter, FACTORY_LIST_MODULE_NAME,
419 &module_name, FACTORY_LIST_NAME, &title, FACTORY_LIST_TYPE, &type, -1);
421 GtkTreeView *tree_view = NULL;
422 tree_view = GTK_TREE_VIEW (widget);
423 if (event->window == gtk_tree_view_get_bin_window (tree_view)) {
424 if (event->type == GDK_BUTTON_PRESS) {
425 if (column == gtk_tree_view_get_column (tree_view, 1)) {
426 obj->create_ise_help_main (type, module_name, title);
427 return (gboolean)TRUE;
428 } else if (column == gtk_tree_view_get_column (tree_view, 2)) {
429 obj->create_ise_option_main (module_name);
430 return (gboolean)TRUE;
435 return (gboolean)FALSE;
438 void ISFSetupWin::create_ise_option_main (const char *str)
441 _setup_ui = new SetupUI (_config);
445 String setup_module_name;
446 setup_module_name = utf8_wcstombs (utf8_mbstowcs (str)) + String ("-imengine-setup");
448 SetupModule *setup_module = new SetupModule (setup_module_name);
451 _setup_ui->add_module (setup_module);
457 void ISFSetupWin::create_ise_help_main (gint type, char *name, char *title)
460 _ise_help_win = new ISFHelpWin ();
464 TOOLBAR_MODE_T mode = TOOLBAR_MODE_T (type);
465 // for mutually exclusive ISEs
466 if (TOOLBAR_HELPER_MODE == mode) {
467 String help_filename, help_line;
469 if (TOOLBAR_HELPER_MODE == mode) {
470 help_filename = String (SCIM_MODULE_PATH) + String (SCIM_PATH_DELIM_STRING)
471 + String (SCIM_BINARY_VERSION) + String (SCIM_PATH_DELIM_STRING) + String ("Helper")
472 + String (SCIM_PATH_DELIM_STRING) + String (name)
476 std::ifstream helpfile (help_filename.c_str ());
478 std::cerr << "Can't open help file : " << help_filename << "!!!!!!!!!! \n";
480 help_line = String (_("Input Service Framework ")) +
481 String (_("\n(C) 2008 SAMSUNG")) +
482 String (_("\n\n Help file is needed!!"));
484 /* FIXME -- 256 char per line for now -- */
486 while (helpfile.getline (str, sizeof (str))) {
487 help_line = help_line + String (str) + String("\n");
491 _ise_help_win->show_help (title, (char *)help_line.c_str ());
494 _ise_help_win->show_help (title, (char *)_keyboard_ise_help_map[String(name)].c_str ());
499 int ISFSetupWin::get_app_active_ise_number (String app_name)
501 if (app_name.length () <= 0)
507 for (MapStringVectorSizeT::iterator it = _groups.begin (); it != _groups.end (); ++it) {
508 lang_name = scim_get_language_name (it->first);
509 if (std::find (_disabled_langs.begin (), _disabled_langs.end (), lang_name) == _disabled_langs.end ()) {
510 for (size_t i = 0; i < it->second.size (); i++) {
511 if (std::find (_disabled_ise_map_bak[app_name].begin (), _disabled_ise_map_bak[app_name].end (), _uuids[it->second[i]])
512 ==_disabled_ise_map_bak[app_name].end ()) {
521 void ISFSetupWin::isf_setup_save_callback (GtkWidget *softkey, gpointer user_data)
523 if (_display_selected_items == 0) {
524 GtkWidget *dialog = gtk_message_dialog_new (GTK_WINDOW (_main_window),
528 _("At least select one ISE!\n"));
529 gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER);
530 gtk_dialog_run (GTK_DIALOG (dialog));
531 gtk_widget_destroy (dialog);
535 for (size_t i = 0; i < _isf_app_list.size (); i++) {
536 String app = _isf_app_list[i];
537 _disabled_ise_map_bak[app].clear ();
538 if (_disabled_ise_map[app].size ()) {
539 for (size_t j = 0; j < _disabled_ise_map[app].size (); j++) {
540 _disabled_ise_map_bak[app].push_back (_disabled_ise_map[app][j]);
545 if (_setup_enable_changed) {
546 for (size_t i = 0; i < _isf_app_list.size (); i++) {
547 String app = _isf_app_list[i];
548 scim_global_config_write (String (SCIM_GLOBAL_CONFIG_DISABLED_IMENGINE_FACTORIES
549 "/") + _isf_app_list[i], _disabled_ise_map[app]);
551 scim_global_config_flush ();
553 gtk_widget_hide (_main_window);
557 void ISFSetupWin::isf_setup_back_callback (GtkWidget *softkey, gpointer user_data)
559 if (get_app_active_ise_number (_isf_app_list[0]) == 0) {
560 GtkWidget *dialog = gtk_message_dialog_new (GTK_WINDOW (_main_window),
564 _("Please select ISE, then save.\n"));
565 gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER);
566 gtk_dialog_run (GTK_DIALOG (dialog));
567 gtk_widget_destroy (dialog);
570 _setup_enable_changed = false;
571 for (size_t i = 0; i < _isf_app_list.size (); i++) {
572 String app = _isf_app_list[i];
573 _disabled_ise_map[app].clear ();
574 if (_disabled_ise_map_bak[app].size ()) {
575 for (size_t j = 0; j < _disabled_ise_map_bak[app].size (); j++) {
576 _disabled_ise_map[app].push_back (_disabled_ise_map_bak[app][j]);
581 gtk_widget_hide (_main_window);
585 void ISFSetupWin::on_factory_enable_box_clicked (GtkCellRendererToggle *cell, gchar *arg1, gpointer data)
587 GtkTreePath *path = 0;
591 std::vector < String >::iterator it;
593 _setup_enable_changed = true;
595 path = gtk_tree_path_new_from_string (arg1);
596 if (gtk_tree_model_get_iter (GTK_TREE_MODEL (_factory_list_store), &iter, path)) {
597 gtk_tree_model_get (GTK_TREE_MODEL (_factory_list_store), &iter,
598 FACTORY_LIST_ENABLE, &enable, -1);
599 gtk_list_store_set (GTK_LIST_STORE (_factory_list_store), &iter,
600 FACTORY_LIST_ENABLE, !enable, -1);
602 _display_selected_items--;
604 _display_selected_items++;
607 gtk_tree_path_free (path);
613 gtk_tree_model_get (GTK_TREE_MODEL (_factory_list_store),
614 &iter, FACTORY_LIST_UUID,
616 uuid = (String)cuuid;
621 String _app_name = gtk_combo_box_get_active_text ((GtkComboBox *) _combo_app);
622 it = std::find (_disabled_ise_map[_app_name].begin (), _disabled_ise_map[_app_name].end (), uuid);
624 if (it != _disabled_ise_map[_app_name].end ())
625 _disabled_ise_map[_app_name].erase (it);
627 _disabled_ise_map[_app_name].push_back (uuid);
631 vi:ts=4:nowrap:ai:expandtab