*** empty log message ***
[m17n/m17n-im-config.git] / src / variable.c
1 #include <gtk/gtk.h>
2 #include <m17n.h>
3 #include <stdio.h>
4 #include <string.h>
5
6 static void
7 entry_cb (GtkWidget *entry, gpointer data)
8 {
9   const gchar *text = gtk_entry_get_text (GTK_ENTRY (entry));
10   MSymbol lang, name, variable, key;
11   MPlist *plist = mplist ();
12
13   lang = g_object_get_data (G_OBJECT (entry), "mim_lang");
14   name = g_object_get_data (G_OBJECT (entry), "mim_name");
15   variable = g_object_get_data (G_OBJECT (entry), "mim_variable");
16   key = g_object_get_data (G_OBJECT (entry), "mim_key");
17
18   if (key == Msymbol)
19     {
20       mplist_add (plist, Msymbol, msymbol (text));
21       minput_config_variable (lang, name, variable, plist);
22     }
23   else if (key == Mtext)
24     {
25       MText *mt;
26
27       mt = mtext_from_data (text, strlen (text), MTEXT_FORMAT_UTF_8);
28       mplist_add (plist, Mtext, mt);
29       minput_config_variable (lang, name, variable, plist);
30       m17n_object_unref (mt);
31     }
32   else if (key == Minteger)
33     {
34       int i;
35       gchar buf[32];
36
37       if (sscanf (text, "%d", &i) == 1)
38         {
39           mplist_add (plist, Minteger, (void *) i);
40             minput_config_variable (lang, name, variable, plist);
41         }
42       else
43         {
44           printf ("Invalid value\n");
45         }
46       sprintf (buf, "%d", (int) mplist_value (plist));
47       gtk_entry_set_text (GTK_ENTRY (entry), buf);
48       gtk_editable_set_position (GTK_EDITABLE (entry), -1);
49     }
50   m17n_object_unref (plist);
51 }
52
53 static void
54 combo_cb (GtkWidget *combo, gpointer data)
55 {
56   gchar *text = gtk_combo_box_get_active_text (GTK_COMBO_BOX (combo));
57   MSymbol lang, name, variable, key;
58   MPlist *plist = mplist ();
59
60   lang = g_object_get_data (G_OBJECT (combo), "mim_lang");
61   name = g_object_get_data (G_OBJECT (combo), "mim_name");
62   variable = g_object_get_data (G_OBJECT (combo), "mim_variable");
63   key = g_object_get_data (G_OBJECT (combo), "mim_key");
64
65   if (key == Msymbol)
66     {
67       mplist_add (plist, Msymbol, msymbol (text));
68       minput_config_variable (lang, name, variable, plist);
69     }
70   else if (key == Mtext)
71     {
72       MText *mt;
73
74       mt = mtext_from_data (text, strlen (text), MTEXT_FORMAT_UTF_8);
75       mplist_add (plist, Mtext, mt);
76       minput_config_variable (lang, name, variable, plist);
77       m17n_object_unref (mt);
78     }
79   else if (key == Minteger)
80     {
81       int i;
82       gchar buf[32];
83
84       if (sscanf (text, "%d", &i) == 1)
85         {
86           mplist_add (plist, Minteger, (void *) i);
87           minput_config_variable (lang, name, variable, plist);
88         }
89       else
90         {
91           printf ("Invalid value\n");
92         }
93     }
94   m17n_object_unref (plist);
95 }
96
97 static void
98 spin_cb (GtkWidget *spin, gpointer data)
99 {
100   MSymbol lang, name, variable;
101   MPlist *plist = mplist ();
102
103   lang = g_object_get_data (G_OBJECT (spin), "mim_lang");
104   name = g_object_get_data (G_OBJECT (spin), "mim_name");
105   variable = g_object_get_data (G_OBJECT (spin), "mim_variable");
106
107   mplist_add
108     (plist, Minteger,
109      (void *) gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin)));
110   minput_config_variable (lang, name, variable, plist);
111   m17n_object_unref (plist);
112 }
113
114 void
115 create_variable_entries (GtkWidget *frame, GtkTooltips *tip,
116                          MSymbol lang, MSymbol name)
117 {
118   GtkWidget *table;
119   MPlist *plist;
120   gint row;
121
122   plist = minput_get_variable (lang, name, Mnil);
123   if (! plist)
124     {
125       GtkWidget *message;
126
127       message = gtk_label_new ("No variables for this method");
128       gtk_container_add (GTK_CONTAINER (frame), message);
129       return;
130     }
131
132   /*
133    * plist == ((variable description status value [valid-value ...])
134    *           (variable description status value [valid-value ...])
135    *           ...)
136    */
137   table = gtk_table_new (2, mplist_length (plist), FALSE);
138   gtk_container_add (GTK_CONTAINER (frame), table);
139
140   for (row = 0; plist && mplist_key (plist) == Mplist;
141        row++, plist = mplist_next (plist))
142     {
143       GtkWidget *label, *widget;
144       MPlist *pl, *data;
145       MSymbol variable, key;
146       void *value;
147       gchar *desc;
148
149       pl = mplist_value (plist);
150       variable = mplist_value (pl);
151       label = gtk_label_new (msymbol_name (variable));
152       gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, row, row + 1);
153
154       pl = mplist_next (pl);
155       if (mplist_key (pl) == Mtext)
156         /* Fixme : Assuming the return value is in UTF-8 */
157         desc = mtext_data (mplist_value (pl), NULL, NULL, NULL, NULL);
158       else
159         desc = NULL;
160
161       pl = mplist_next (mplist_next (pl)); /* ignore status */
162       key = mplist_key (pl);
163       value = mplist_value (pl);
164       pl = mplist_next (pl);
165
166       if (key == Msymbol)
167         {
168           if (mplist_key (pl) == Msymbol)
169             {
170               int i, nth = -1;
171
172               widget = gtk_combo_box_new_text ();
173               for (i = 0; pl && mplist_key (pl) == Msymbol;
174                    pl = mplist_next (pl), i++)
175                 {
176                   if (mplist_value (pl) == value)
177                     nth = i;
178                   gtk_combo_box_append_text (GTK_COMBO_BOX (widget),
179                                              msymbol_name (mplist_value (pl)));
180                 }
181               if (nth != -1)
182                 gtk_combo_box_set_active (GTK_COMBO_BOX (widget), nth);
183               g_signal_connect (G_OBJECT (widget), "changed",
184                                 G_CALLBACK (combo_cb), NULL);
185             }
186           else
187             {
188               widget = gtk_entry_new ();
189               gtk_entry_set_text (GTK_ENTRY (widget), msymbol_name (value));
190               gtk_editable_set_editable (GTK_EDITABLE (widget), TRUE);
191               g_signal_connect (G_OBJECT (widget), "activate",
192                                 G_CALLBACK (entry_cb), NULL);
193             }
194         }
195       
196       else if (key == Mtext)
197         {
198           if (mplist_key (pl) == Mtext)
199             {
200               int i, nth = -1;
201
202               widget = gtk_combo_box_new_text ();
203               for (i = 0; pl && mplist_key (pl) == Mtext;
204                    pl = mplist_next (pl), i++)
205                 {
206                   if (! mtext_cmp (mplist_value (pl), value))
207                     nth = i;
208                   /* Fixme : Assuming the return value is in UTF-8 */
209                   gtk_combo_box_append_text
210                     (GTK_COMBO_BOX (widget),
211                      mtext_data (mplist_value (pl), NULL, NULL, NULL, NULL));
212                 }
213               if (nth != -1)
214                 gtk_combo_box_set_active (GTK_COMBO_BOX (widget), nth);
215               g_signal_connect (G_OBJECT (widget), "changed",
216                                 G_CALLBACK (combo_cb), NULL);
217             }
218           else
219             {
220               widget = gtk_entry_new ();
221               /* Fixme : Assuming the return value is in UTF-8 */
222               gtk_entry_set_text (GTK_ENTRY (widget),
223                                   mtext_data (value, NULL, NULL, NULL, NULL));
224               gtk_editable_set_editable (GTK_EDITABLE (widget), TRUE);
225               g_signal_connect (G_OBJECT (widget), "activate",
226                                 G_CALLBACK (entry_cb), NULL);
227             }
228         }
229
230       else if (key == Minteger)
231         {
232           if (mplist_key (pl) == Minteger)
233             {
234               int i, nth = -1;
235
236               widget = gtk_combo_box_new_text ();
237               for (i = 0; pl && mplist_key (pl) == Minteger;
238                    pl = mplist_next (pl), i++)
239                 {
240                   gchar buf[32];
241
242                   if (mplist_value (pl) == value)
243                     nth = i;
244                   snprintf (buf, 31, "%d", (int) mplist_value (pl));
245                   gtk_combo_box_append_text (GTK_COMBO_BOX (widget), buf);
246                 }
247               if (nth != -1)
248                 gtk_combo_box_set_active (GTK_COMBO_BOX (widget), nth);
249               g_signal_connect (G_OBJECT (widget), "changed",
250                                 G_CALLBACK (combo_cb), NULL);
251             }
252           else if (mplist_key (pl) == Mplist)
253             {
254               GtkAdjustment *adj;
255               gdouble lower, upper;
256
257               pl = mplist_value (pl);
258               lower = (gdouble) (int) mplist_value (pl);
259               pl = mplist_next (pl);
260               upper = (gdouble) (int) mplist_value (pl);
261               adj = (GtkAdjustment *)
262                 gtk_adjustment_new ((gdouble) (int) value, (gdouble) lower,
263                                     (gdouble) upper, 1.0, 10.0, 0);
264               widget = gtk_spin_button_new (adj, 0, 0);
265               gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (widget), TRUE);
266               gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (widget),
267                                                  GTK_UPDATE_IF_VALID);
268               g_signal_connect (G_OBJECT (widget), "value_changed",
269                                 G_CALLBACK (spin_cb), NULL);
270             }
271           else
272             {
273               gchar buf[32];
274
275               widget = gtk_entry_new ();
276               snprintf (buf, 31, "%d", (int) value);
277               gtk_entry_set_text (GTK_ENTRY (widget), buf);
278               gtk_editable_set_editable (GTK_EDITABLE (widget), TRUE);
279               g_signal_connect (G_OBJECT (widget), "activate",
280                                 G_CALLBACK (entry_cb), NULL);
281             }
282         }
283
284       else
285         {
286           widget = gtk_entry_new ();
287           gtk_entry_set_text (GTK_ENTRY (widget), "???");
288           gtk_editable_set_editable (GTK_EDITABLE (widget), TRUE);
289           g_signal_connect (G_OBJECT (widget), "activate",
290                             G_CALLBACK (entry_cb), NULL);
291         }
292
293       gtk_tooltips_set_tip (tip, widget, desc, NULL);
294       g_object_set_data (G_OBJECT (widget), "mim_lang", lang);
295       g_object_set_data (G_OBJECT (widget), "mim_name", name);
296       g_object_set_data (G_OBJECT (widget), "mim_variable", variable);
297       g_object_set_data (G_OBJECT (widget), "mim_key", key);
298       gtk_table_attach_defaults (GTK_TABLE (table), widget,
299                                  1, 2, row, row + 1);
300     }
301 }