2c38e8e7f05f8f2ac96fc8ddfe23445bb04314d3
[slovak-l10n] / ukeyboard / cpanel / langset.c
1 /*
2  *  Copyright (c) 2008 Jiri Benc <jbenc@upir.cz>
3  *
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.
7  *
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.
12  *
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
16  */
17
18 #include <stdio.h>
19 #include <string.h>
20 #include <glib.h>
21 #include <gtk/gtk.h>
22 #include <hildon/hildon-caption.h>
23 #include <libosso.h>
24 #include <gconf/gconf.h>
25 #include <gconf/gconf-client.h>
26
27 #ifdef HAVE_MAEMO5
28 #define GETTEXT_PACKAGE "osso-applet-textinput"
29
30 #include <hildon/hildon.h>
31 #include <glib/gi18n-lib.h>
32 #endif
33
34 #include "prefs.h"
35 #include "lang.h"
36 #include "langset.h"
37
38 #define L_CONF_DIR      "/apps/osso/inputmethod/hildon-im-languages"
39
40 #ifdef HAVE_MAEMO5
41 gboolean get_l_bool(GConfClient *client, char *lang, char *key)
42 #else
43 static gboolean get_l_bool(GConfClient *client, char *lang, char *key)
44 #endif
45 {
46         char *tmp = g_strjoin("/", L_CONF_DIR, lang, key, NULL);
47         gboolean res;
48
49         res = gconf_client_get_bool(client, tmp, NULL);
50         g_free(tmp);
51         return res;
52 }
53
54 #ifdef HAVE_MAEMO5
55 void set_l_bool(GConfClient *client, char *lang, char *key, gboolean val)
56 #else
57 static void set_l_bool(GConfClient *client, char *lang, char *key, gboolean val)
58 #endif
59 {
60         char *tmp = g_strjoin("/", L_CONF_DIR, lang, key, NULL);
61
62         g_debug("%s %d\n", tmp, val);
63
64         gconf_client_set_bool(client, tmp, val, NULL);
65         g_free(tmp);
66 }
67
68 #ifdef HAVE_MAEMO5
69 gchar *get_l_str(GConfClient *client, char *lang, char *key)
70 #else
71 static gchar *get_l_str(GConfClient *client, char *lang, char *key)
72 #endif
73 {
74         char *tmp = g_strjoin("/", L_CONF_DIR, lang, key, NULL);
75         GConfValue *val;
76         gchar *res;
77
78         val = gconf_client_get_without_default(client, tmp, NULL);
79         g_free(tmp);
80         if (!val)
81                 return NULL;
82         if (val->type != GCONF_VALUE_STRING) {
83                 gconf_value_free(val);
84                 return NULL;
85         }
86         res = g_strdup(gconf_value_get_string(val));
87         gconf_value_free(val);
88         return res;
89 }
90
91 #ifdef HAVE_MAEMO5
92 void set_l_str(GConfClient *client, char *lang, char *key, gchar *val)
93 #else
94 static void set_l_str(GConfClient *client, char *lang, char *key, gchar *val)
95 #endif
96 {
97         char *tmp = g_strjoin("/", L_CONF_DIR, lang, key, NULL);
98
99         gconf_client_set_string(client, tmp, val, NULL);
100         g_free(tmp);
101 }
102
103 #ifdef HAVE_MAEMO5
104 void fill_dict(HildonTouchSelector *combo, GList *langs, gchar *deflang)
105 {
106         GList *item;
107         struct lang *lang;
108         unsigned i;
109
110         for (item = langs, i = 0; item; item = g_list_next(item)) {
111                 lang = item->data;
112                 if (lang->ext)
113                         continue;
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);
117                 i++;
118         }
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);
122 }
123 #else
124 static void fill_dict(GtkComboBox *combo, GList *langs, gchar *deflang)
125 {
126         GList *item;
127         struct lang *lang;
128         unsigned i;
129
130         for (item = langs, i = 0; item; item = g_list_next(item)) {
131                 lang = item->data;
132                 if (lang->ext)
133                         continue;
134                 gtk_combo_box_append_text(combo, lang->desc);
135                 if (deflang && !strcmp(lang->code, deflang))
136                         gtk_combo_box_set_active(combo, i);
137                 i++;
138         }
139         gtk_combo_box_append_text(combo, "Custom/Empty");
140         if (!deflang || !*deflang)
141                 gtk_combo_box_set_active(combo, i);
142 }
143
144 void lang_settings(GConfClient *client, GtkWidget *win, GList *langs, int n)
145 {
146         GtkDialog *dialog;
147         GtkBox *vbox;
148         GtkSizeGroup *group;
149         GtkToggleButton *auto_cap, *word_compl, *word_pred, *sp_after;
150         GtkComboBox *dict;
151         struct lang *lang;
152         gchar *code, *tmp;
153         int res;
154
155         if (n < 0)
156                 return;
157         lang = g_list_nth_data(langs, n);
158         if (!lang)
159                 return;
160         code = lang->code;
161
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);
166         g_free(tmp);
167         gtk_dialog_set_has_separator(dialog, FALSE);
168         gtk_window_set_modal(GTK_WINDOW(dialog), TRUE);
169
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);
172
173         vbox = GTK_BOX(gtk_vbox_new(FALSE, 0));
174         group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
175
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));
180
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));
185
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));
190
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));
195
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);
202         if (tmp)
203                 g_free(tmp);
204         gtk_box_pack_start_defaults(vbox, hildon_caption_new(group, "Dictionary",
205                 GTK_WIDGET(dict), NULL, HILDON_CAPTION_MANDATORY));
206
207         g_object_unref(G_OBJECT(group));
208
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);
218                 if (res >= 0) {
219                         lang = g_list_nth_data(langs, res);
220                         tmp = (lang && !lang->ext) ? lang->code : "";
221                         set_l_str(client, code, "dictionary", tmp);
222                 }
223         }
224         gtk_widget_destroy(GTK_WIDGET(dialog));
225 }
226 #endif