*** empty log message ***
[m17n/m17n-im-config.git] / src / main.c
1 #include <stdlib.h>
2 #include <string.h>
3 #include <libintl.h>
4 #define _(String) gettext (String)
5 #include <gtk/gtk.h>
6 #include <m17n-im-config.h>
7
8 struct ConfigSaveRevert
9 {
10   GtkWidget *config, *save, *revert;
11 };
12
13 void
14 status_changed_cb (gboolean modified, gpointer data)
15 {
16   struct ConfigSaveRevert *config_save_revert = data;
17
18   if (GTK_WIDGET_SENSITIVE (config_save_revert->save))
19     {
20       if (! modified)
21         {
22           gtk_widget_set_sensitive (config_save_revert->save, FALSE);
23           gtk_widget_set_sensitive (config_save_revert->revert, FALSE);
24         }
25     }
26  else
27    {
28       if (modified)
29         {
30           gtk_widget_set_sensitive (config_save_revert->save, TRUE);
31           gtk_widget_set_sensitive (config_save_revert->revert, TRUE);
32         }
33    }
34 }
35
36 static gboolean
37 delete (GtkWidget *widget, GdkEvent *event, gpointer data)
38 {
39   gtk_main_quit ();
40   return FALSE;
41 }
42
43
44 static void
45 revert_clicked_cb (GtkButton *button, gpointer data)
46 {
47   struct ConfigSaveRevert *config_save_revert = data;
48
49   mim_config_revert (config_save_revert->config);
50   status_changed_cb (FALSE, data);
51 }
52
53 static void
54 save_clicked_cb (GtkButton *button, gpointer data)
55 {
56   struct ConfigSaveRevert *config_save_revert = data;
57
58   mim_config_save (config_save_revert->config);
59   status_changed_cb (FALSE, data);
60 }
61
62 static void
63 quit_clicked_cb (GtkButton *button, gpointer data)
64 {
65   struct ConfigSaveRevert *config_save_revert = data;
66
67   if (mim_config_modified (config_save_revert->config))
68     {
69       GtkWidget *dialog, *label;
70       gint response;
71
72       dialog = (gtk_dialog_new_with_buttons
73                 ("confirmation",
74                  GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (button))),
75                  GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR,
76                  GTK_STOCK_NO, GTK_RESPONSE_NO,
77                  GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
78                  GTK_STOCK_SAVE, GTK_RESPONSE_YES,
79                  NULL));
80       label = gtk_label_new (_("Save configuration?"));
81       gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), label);
82       gtk_widget_show_all (dialog);
83       response = gtk_dialog_run (GTK_DIALOG (dialog));
84       gtk_widget_destroy (dialog);
85       if (response == GTK_RESPONSE_CANCEL)
86         return;
87       if (response == GTK_RESPONSE_YES)
88         mim_config_save (config_save_revert->config);
89     }
90   gtk_main_quit ();      
91 }
92
93
94 static void
95 ok_clicked_cb (GtkButton *button, gpointer data)
96 {
97   struct ConfigSaveRevert *config_save_revert = data;
98
99   if (mim_config_modified (config_save_revert->config))
100     mim_config_save (config_save_revert->config);
101   gtk_main_quit ();      
102 }
103
104 int
105 main (int argc, char **argv)
106 {
107   GtkWidget *window, *vbox, *config, *hbox;
108   GtkWidget *revert, *save, *ok, *quit;
109   struct ConfigSaveRevert config_save_revert;
110   MimConfigCallback callback;
111     
112 #if ENABLE_NLS
113   bindtextdomain ("m17n-im-config", GETTEXTDIR);
114   bind_textdomain_codeset ("m17n-im-config", "UTF-8");
115 #endif
116   gtk_init (&argc, &argv);
117   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
118   gtk_widget_set_size_request (window, 400, 300);
119   gtk_window_set_title (GTK_WINDOW (window), _("M17N-IM Configuration"));
120   g_signal_connect (G_OBJECT (window), "delete_event",
121                     G_CALLBACK (delete), NULL);
122     
123   /* We create these widgets:
124      +-vbox----------------------------------+
125      |+-config------------------------------+|
126      ||                                     ||
127      ||                                     ||
128      ||  M17N-IM Configuration              ||
129      ||                                     ||
130      ||                                     ||
131      |+-------------------------------------+|
132      |+-hbox--------------------------------+|
133      ||          +------+ +-----++----+ +--+||
134      ||          |revert| |save| |quit| |ok|||
135      ||          +------+ +-----++----+ +--+||
136      |+-------------------------------------+|
137      +---------------------------------------+
138   */
139
140   vbox = gtk_vbox_new (FALSE, 10);
141   gtk_container_add (GTK_CONTAINER (window), vbox);
142
143   revert = gtk_button_new_from_stock (GTK_STOCK_REVERT_TO_SAVED);
144   gtk_widget_set_sensitive (revert, FALSE);
145   save = gtk_button_new_from_stock (GTK_STOCK_SAVE);
146   gtk_widget_set_sensitive (save, FALSE);
147   quit = gtk_button_new_from_stock (GTK_STOCK_QUIT);
148   ok = gtk_button_new_from_stock (GTK_STOCK_OK);
149
150   config_save_revert.save = save;
151   config_save_revert.revert = revert;
152   callback.func = status_changed_cb;
153   callback.arg = &config_save_revert;
154   config = mim_config_widget (&callback);
155   config_save_revert.config = config;
156   gtk_box_pack_start (GTK_BOX (vbox), config, TRUE, TRUE, 0);
157
158   g_signal_connect (G_OBJECT (revert), "clicked",
159                     G_CALLBACK (revert_clicked_cb), &config_save_revert);
160   g_signal_connect (G_OBJECT (save), "clicked",
161                     G_CALLBACK (save_clicked_cb), &config_save_revert);
162   g_signal_connect (G_OBJECT (quit), "clicked",
163                     G_CALLBACK (quit_clicked_cb), &config_save_revert);
164   g_signal_connect (G_OBJECT (ok), "clicked",
165                     G_CALLBACK (ok_clicked_cb), &config_save_revert);
166
167   hbox = gtk_hbutton_box_new ();
168   gtk_button_box_set_layout (GTK_BUTTON_BOX (hbox), GTK_BUTTONBOX_END);
169   gtk_box_set_spacing (GTK_BOX (hbox), 10);
170   gtk_container_add (GTK_CONTAINER (hbox), revert);
171   gtk_container_add (GTK_CONTAINER (hbox), save);
172   gtk_container_add (GTK_CONTAINER (hbox), quit);
173   gtk_container_add (GTK_CONTAINER (hbox), ok);
174   gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
175
176   gtk_widget_show_all (window);
177   gtk_main ();
178
179   return 0;
180 }