2 * Copyright (c) 2008 Jiri Benc <jbenc@upir.cz>
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22 #include <hildon/hildon-caption.h>
24 #include <gconf/gconf.h>
25 #include <gconf/gconf-client.h>
28 #define GETTEXT_PACKAGE "osso-applet-textinput"
30 #include <hildon/hildon.h>
31 #include <glib/gi18n-lib.h>
38 #define L_CONF_DIR "/apps/osso/inputmethod/hildon-im-languages"
41 gboolean get_l_bool(GConfClient *client, char *lang, char *key)
43 static gboolean get_l_bool(GConfClient *client, char *lang, char *key)
46 char *tmp = g_strjoin("/", L_CONF_DIR, lang, key, NULL);
49 res = gconf_client_get_bool(client, tmp, NULL);
55 void set_l_bool(GConfClient *client, char *lang, char *key, gboolean val)
57 static void set_l_bool(GConfClient *client, char *lang, char *key, gboolean val)
60 char *tmp = g_strjoin("/", L_CONF_DIR, lang, key, NULL);
62 g_debug("%s %d\n", tmp, val);
64 gconf_client_set_bool(client, tmp, val, NULL);
69 gchar *get_l_str(GConfClient *client, char *lang, char *key)
71 static gchar *get_l_str(GConfClient *client, char *lang, char *key)
74 char *tmp = g_strjoin("/", L_CONF_DIR, lang, key, NULL);
78 val = gconf_client_get_without_default(client, tmp, NULL);
82 if (val->type != GCONF_VALUE_STRING) {
83 gconf_value_free(val);
86 res = g_strdup(gconf_value_get_string(val));
87 gconf_value_free(val);
92 void set_l_str(GConfClient *client, char *lang, char *key, gchar *val)
94 static void set_l_str(GConfClient *client, char *lang, char *key, gchar *val)
97 char *tmp = g_strjoin("/", L_CONF_DIR, lang, key, NULL);
99 gconf_client_set_string(client, tmp, val, NULL);
104 void fill_dict(HildonTouchSelector *combo, GList *langs, gchar *deflang)
110 for (item = langs, i = 0; item; item = g_list_next(item)) {
114 hildon_touch_selector_append_text(combo, lang->desc);
115 if (deflang && !strcmp(lang->code, deflang))
116 hildon_touch_selector_set_active(combo, 0, i);
119 hildon_touch_selector_append_text(combo, _("tein_fi_word_completion_language_empty"));
120 if (!deflang || !*deflang)
121 hildon_touch_selector_set_active(combo, 0, i);
124 static void fill_dict(GtkComboBox *combo, GList *langs, gchar *deflang)
130 for (item = langs, i = 0; item; item = g_list_next(item)) {
134 gtk_combo_box_append_text(combo, lang->desc);
135 if (deflang && !strcmp(lang->code, deflang))
136 gtk_combo_box_set_active(combo, i);
139 gtk_combo_box_append_text(combo, "Custom/Empty");
140 if (!deflang || !*deflang)
141 gtk_combo_box_set_active(combo, i);
144 void lang_settings(GConfClient *client, GtkWidget *win, GList *langs, int n)
149 GtkToggleButton *auto_cap, *word_compl, *word_pred, *sp_after;
157 lang = g_list_nth_data(langs, n);
162 dialog = GTK_DIALOG(gtk_dialog_new());
163 gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(win));
164 tmp = g_strconcat("On-screen text input: ", lang->desc, NULL);
165 gtk_window_set_title(GTK_WINDOW(dialog), tmp);
167 gtk_dialog_set_has_separator(dialog, FALSE);
168 gtk_window_set_modal(GTK_WINDOW(dialog), TRUE);
170 gtk_dialog_add_action_widget(dialog, gtk_button_new_with_label("OK"), GTK_RESPONSE_ACCEPT);
171 gtk_dialog_add_action_widget(dialog, gtk_button_new_with_label("Cancel"), GTK_RESPONSE_REJECT);
173 vbox = GTK_BOX(gtk_vbox_new(FALSE, 0));
174 group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
176 auto_cap = GTK_TOGGLE_BUTTON(gtk_check_button_new());
177 gtk_toggle_button_set_active(auto_cap, get_l_bool(client, code, "auto-capitalisation"));
178 gtk_box_pack_start_defaults(vbox, hildon_caption_new(group, "Auto-capitalisation",
179 GTK_WIDGET(auto_cap), NULL, HILDON_CAPTION_MANDATORY));
181 word_compl = GTK_TOGGLE_BUTTON(gtk_check_button_new());
182 gtk_toggle_button_set_active(word_compl, get_l_bool(client, code, "word-completion"));
183 gtk_box_pack_start_defaults(vbox, hildon_caption_new(group, "Word completion",
184 GTK_WIDGET(word_compl), NULL, HILDON_CAPTION_MANDATORY));
186 word_pred = GTK_TOGGLE_BUTTON(gtk_check_button_new());
187 gtk_toggle_button_set_active(word_pred, get_l_bool(client, code, "next-word-prediction"));
188 gtk_box_pack_start_defaults(vbox, hildon_caption_new(group, "Next word prediction",
189 GTK_WIDGET(word_pred), NULL, HILDON_CAPTION_MANDATORY));
191 sp_after = GTK_TOGGLE_BUTTON(gtk_check_button_new());
192 gtk_toggle_button_set_active(sp_after, get_l_bool(client, code, "insert-space-after-word"));
193 gtk_box_pack_start_defaults(vbox, hildon_caption_new(group, "Insert space after word",
194 GTK_WIDGET(sp_after), NULL, HILDON_CAPTION_MANDATORY));
196 dict = GTK_COMBO_BOX(gtk_combo_box_new_text());
197 tmp = get_l_str(client, code, "dictionary");
198 /* If tmp is NULL (i.e. the gconf key is unset), try to use the same
199 * dictionary as the keyboard. But don't do this if the keyboard is
200 * from our package. */
201 fill_dict(dict, langs, (tmp || lang->ext) ? tmp : code);
204 gtk_box_pack_start_defaults(vbox, hildon_caption_new(group, "Dictionary",
205 GTK_WIDGET(dict), NULL, HILDON_CAPTION_MANDATORY));
207 g_object_unref(G_OBJECT(group));
209 gtk_container_add(GTK_CONTAINER(dialog->vbox), GTK_WIDGET(vbox));
210 gtk_widget_show_all(GTK_WIDGET(dialog));
211 res = gtk_dialog_run(dialog);
212 if (res == GTK_RESPONSE_ACCEPT) {
213 set_l_bool(client, code, "auto-capitalisation", gtk_toggle_button_get_active(auto_cap));
214 set_l_bool(client, code, "word-completion", gtk_toggle_button_get_active(word_compl));
215 set_l_bool(client, code, "next-word-prediction", gtk_toggle_button_get_active(word_pred));
216 set_l_bool(client, code, "insert-space-after-word", gtk_toggle_button_get_active(sp_after));
217 res = gtk_combo_box_get_active(dict);
219 lang = g_list_nth_data(langs, res);
220 tmp = (lang && !lang->ext) ? lang->code : "";
221 set_l_str(client, code, "dictionary", tmp);
224 gtk_widget_destroy(GTK_WIDGET(dialog));