5c5e5d8606d53660d7b15b89623106da21548b70
[modest] / src / maemo / modest-maemo-global-settings-dialog.c
1 /* Copyright (c) 2006, Nokia Corporation
2  * All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are
6  * met:
7  *
8  * * Redistributions of source code must retain the above copyright
9  *   notice, this list of conditions and the following disclaimer.
10  * * Redistributions in binary form must reproduce the above copyright
11  *   notice, this list of conditions and the following disclaimer in the
12  *   documentation and/or other materials provided with the distribution.
13  * * Neither the name of the Nokia Corporation nor the names of its
14  *   contributors may be used to endorse or promote products derived from
15  *   this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
18  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
19  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
20  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
21  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
24  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
25  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
26  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  */
29
30 #ifdef HAVE_CONFIG_H
31 #include <config.h>
32 #endif /*HAVE_CONFIG_H*/
33
34 #ifdef MODEST_HILDON_VERSION_0
35 #include <hildon-widgets/hildon-caption.h>
36 #include <hildon-widgets/hildon-number-editor.h>
37 #include <hildon-widgets/hildon-banner.h>
38 #else
39 #include <hildon/hildon-caption.h>
40 #include <hildon/hildon-number-editor.h>
41 #include <hildon/hildon-banner.h>
42 #endif /*MODEST_HILDON_VERSION_0*/
43
44 #include <glib/gi18n.h>
45 #include <gtk/gtkbox.h>
46 #include <gtk/gtkvbox.h>
47 #include <gtk/gtknotebook.h>
48 #include <gtk/gtklabel.h>
49 #include <gtk/gtkcheckbutton.h>
50 #include <gtk/gtkhseparator.h>
51 #include "widgets/modest-global-settings-dialog-priv.h"
52 #include "widgets/modest-combo-box.h"
53 #include "maemo/modest-maemo-global-settings-dialog.h"
54 #include "widgets/modest-ui-constants.h"
55
56 #define MSG_SIZE_MAX_VAL 5000
57 #define MSG_SIZE_DEF_VAL 1000
58 #define MSG_SIZE_MIN_VAL 1
59
60 /* 'private'/'protected' functions */
61 static void modest_maemo_global_settings_dialog_class_init (ModestMaemoGlobalSettingsDialogClass *klass);
62 static void modest_maemo_global_settings_dialog_init       (ModestMaemoGlobalSettingsDialog *obj);
63 static void modest_maemo_global_settings_dialog_finalize   (GObject *obj);
64
65 /* list my signals  */
66 enum {
67         /* MY_SIGNAL_1, */
68         /* MY_SIGNAL_2, */
69         LAST_SIGNAL
70 };
71
72 static GtkWidget* create_updating_page  (ModestMaemoGlobalSettingsDialog *self);
73 static GtkWidget* create_composing_page (ModestMaemoGlobalSettingsDialog *self);
74
75 static gboolean   on_range_error        (HildonNumberEditor *editor, 
76                                          HildonNumberEditorErrorType type,
77                                          gpointer user_data);
78
79 typedef struct _ModestMaemoGlobalSettingsDialogPrivate ModestMaemoGlobalSettingsDialogPrivate;
80 struct _ModestMaemoGlobalSettingsDialogPrivate {
81 };
82 #define MODEST_MAEMO_GLOBAL_SETTINGS_DIALOG_GET_PRIVATE(o)      (G_TYPE_INSTANCE_GET_PRIVATE((o), \
83                                                            MODEST_TYPE_MAEMO_GLOBAL_SETTINGS_DIALOG, \
84                                                            ModestMaemoGlobalSettingsDialogPrivate))
85 /* globals */
86 static GtkDialogClass *parent_class = NULL;
87
88 /* uncomment the following if you have defined any signals */
89 /* static guint signals[LAST_SIGNAL] = {0}; */
90
91 GType
92 modest_maemo_global_settings_dialog_get_type (void)
93 {
94         static GType my_type = 0;
95         if (!my_type) {
96                 static const GTypeInfo my_info = {
97                         sizeof(ModestMaemoGlobalSettingsDialogClass),
98                         NULL,           /* base init */
99                         NULL,           /* base finalize */
100                         (GClassInitFunc) modest_maemo_global_settings_dialog_class_init,
101                         NULL,           /* class finalize */
102                         NULL,           /* class data */
103                         sizeof(ModestMaemoGlobalSettingsDialog),
104                         1,              /* n_preallocs */
105                         (GInstanceInitFunc) modest_maemo_global_settings_dialog_init,
106                         NULL
107                 };
108                 my_type = g_type_register_static (MODEST_TYPE_GLOBAL_SETTINGS_DIALOG,
109                                                   "ModestMaemoGlobalSettingsDialog",
110                                                   &my_info, 0);
111         }
112         return my_type;
113 }
114
115 static void
116 modest_maemo_global_settings_dialog_class_init (ModestMaemoGlobalSettingsDialogClass *klass)
117 {
118         GObjectClass *gobject_class;
119         gobject_class = (GObjectClass*) klass;
120
121         parent_class            = g_type_class_peek_parent (klass);
122         gobject_class->finalize = modest_maemo_global_settings_dialog_finalize;
123
124         g_type_class_add_private (gobject_class, sizeof(ModestMaemoGlobalSettingsDialogPrivate));
125 }
126
127 static void
128 modest_maemo_global_settings_dialog_init (ModestMaemoGlobalSettingsDialog *self)
129 {
130         ModestGlobalSettingsDialogPrivate *ppriv;
131 /*      GdkGeometry *geometry; */
132
133         ppriv = MODEST_GLOBAL_SETTINGS_DIALOG_GET_PRIVATE (self);
134
135         ppriv->updating_page = create_updating_page (self);
136         ppriv->composing_page = create_composing_page (self);
137     
138         /* Add the notebook pages: */
139         gtk_notebook_append_page (GTK_NOTEBOOK (ppriv->notebook), ppriv->updating_page, 
140                 gtk_label_new (_("mcen_ti_options_updating")));
141         gtk_notebook_append_page (GTK_NOTEBOOK (ppriv->notebook), ppriv->composing_page, 
142                 gtk_label_new (_("mcen_ti_options_composing")));
143                 
144         gtk_container_add (GTK_CONTAINER (GTK_DIALOG (self)->vbox), ppriv->notebook);
145         gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (self)->vbox), MODEST_MARGIN_HALF);
146
147         /* Load current config */
148         _modest_global_settings_dialog_load_conf (ppriv);
149         gtk_widget_show_all (ppriv->notebook);
150 }
151
152 static void
153 modest_maemo_global_settings_dialog_finalize (GObject *obj)
154 {
155 /*      free/unref instance resources here */
156         G_OBJECT_CLASS(parent_class)->finalize (obj);
157 }
158
159 GtkWidget*
160 modest_maemo_global_settings_dialog_new (void)
161 {
162         return GTK_WIDGET(g_object_new(MODEST_TYPE_MAEMO_GLOBAL_SETTINGS_DIALOG, NULL));
163 }
164
165
166 /*
167  * Creates the updating page
168  */
169 static GtkWidget*
170 create_updating_page (ModestMaemoGlobalSettingsDialog *self)
171 {
172         GtkWidget *vbox, *vbox_update, *vbox_limit, *caption;
173         GtkSizeGroup *size_group;
174         ModestPairList *list;
175         ModestGlobalSettingsDialogPrivate *ppriv;
176
177         ppriv = MODEST_GLOBAL_SETTINGS_DIALOG_GET_PRIVATE (self);
178
179         vbox = gtk_vbox_new (FALSE, MODEST_MARGIN_DEFAULT);
180
181         vbox_update = gtk_vbox_new (FALSE, MODEST_MARGIN_DEFAULT);
182         size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
183
184         /* Auto update */
185         ppriv->auto_update = gtk_check_button_new ();
186         caption = hildon_caption_new (size_group, 
187                                       _("mcen_fi_options_autoupdate"), 
188                                       ppriv->auto_update, 
189                                       NULL, 
190                                       HILDON_CAPTION_MANDATORY);
191         gtk_box_pack_start (GTK_BOX (vbox_update), caption, FALSE, FALSE, MODEST_MARGIN_HALF);
192
193         /* Connected via */
194         list = _modest_global_settings_dialog_get_connected_via ();
195         ppriv->connect_via = modest_combo_box_new (list, g_int_equal);
196         modest_pair_list_free (list);
197         caption = hildon_caption_new (size_group, 
198                                       _("mcen_fi_options_connectiontype"),
199                                       ppriv->connect_via, 
200                                       NULL, 
201                                       HILDON_CAPTION_MANDATORY);
202         gtk_box_pack_start (GTK_BOX (vbox_update), caption, FALSE, FALSE, MODEST_MARGIN_HALF);
203
204         /* Update interval */
205         list = _modest_global_settings_dialog_get_update_interval ();
206         ppriv->update_interval = modest_combo_box_new (list, g_int_equal);
207         modest_pair_list_free (list);
208         caption = hildon_caption_new (size_group, 
209                                       _("mcen_fi_options_updateinterval"),
210                                       ppriv->update_interval, 
211                                       NULL, 
212                                       HILDON_CAPTION_MANDATORY);
213         gtk_box_pack_start (GTK_BOX (vbox_update), caption, FALSE, FALSE, MODEST_MARGIN_HALF);
214
215         /* Add to vbox */
216         gtk_box_pack_start (GTK_BOX (vbox), vbox_update, FALSE, FALSE, MODEST_MARGIN_HALF);
217
218         /* Separator */
219         gtk_box_pack_start (GTK_BOX (vbox), gtk_hseparator_new (), FALSE, FALSE, MODEST_MARGIN_HALF);
220
221         /* Limits */
222         vbox_limit = gtk_vbox_new (FALSE, MODEST_MARGIN_DEFAULT);
223         size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
224
225         /* Size limit */
226         ppriv->size_limit = hildon_number_editor_new (MSG_SIZE_MIN_VAL, MSG_SIZE_MAX_VAL);;
227         hildon_number_editor_set_value (HILDON_NUMBER_EDITOR (ppriv->size_limit), MSG_SIZE_DEF_VAL);;
228         g_signal_connect (ppriv->size_limit, "range_error", G_CALLBACK (on_range_error), self);
229         caption = hildon_caption_new (size_group, 
230                                       _("mcen_fi_advsetup_sizelimit"), 
231                                       ppriv->size_limit, 
232                                       NULL, 
233                                       HILDON_CAPTION_MANDATORY);
234         gtk_box_pack_start (GTK_BOX (vbox_limit), caption, FALSE, FALSE, MODEST_MARGIN_HALF);
235
236         /* Play sound */
237         ppriv->play_sound = gtk_check_button_new ();
238         caption = hildon_caption_new (size_group, 
239                                       _("mcen_fi_options_playsound"), 
240                                       ppriv->play_sound, 
241                                       NULL, 
242                                       HILDON_CAPTION_MANDATORY);
243         gtk_box_pack_start (GTK_BOX (vbox_limit), caption, FALSE, FALSE, MODEST_MARGIN_HALF);
244
245         /* Add to vbox */
246         gtk_box_pack_start (GTK_BOX (vbox), vbox_limit, FALSE, FALSE, MODEST_MARGIN_HALF);
247
248         return vbox;
249 }
250
251 /*
252  * Creates the composing page
253  */
254 static GtkWidget* 
255 create_composing_page (ModestMaemoGlobalSettingsDialog *self)
256 {
257         GtkWidget *vbox;
258         GtkSizeGroup *size_group;
259         ModestGlobalSettingsDialogPrivate *ppriv;
260         ModestPairList *list;
261         GtkWidget *caption;
262
263         ppriv = MODEST_GLOBAL_SETTINGS_DIALOG_GET_PRIVATE (self);
264         size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
265         vbox = gtk_vbox_new (FALSE, MODEST_MARGIN_DEFAULT);
266
267         /* Update interval */
268         list = _modest_global_settings_dialog_get_msg_formats ();
269         ppriv->msg_format = modest_combo_box_new (list, g_int_equal);
270         modest_pair_list_free (list);
271         caption = hildon_caption_new (size_group, 
272                                       _("mcen_fi_options_messageformat"),
273                                       ppriv->msg_format, 
274                                       NULL, 
275                                       HILDON_CAPTION_MANDATORY);
276         gtk_box_pack_start (GTK_BOX (vbox), caption, FALSE, FALSE, MODEST_MARGIN_HALF);
277
278         /* Reply */
279         ppriv->include_reply = gtk_check_button_new ();
280         caption = hildon_caption_new (size_group, 
281                                       _("mcen_va_options_include_original_inreply"), 
282                                       ppriv->include_reply, 
283                                       NULL, 
284                                       HILDON_CAPTION_MANDATORY);
285         gtk_box_pack_start (GTK_BOX (vbox), caption, FALSE, FALSE, MODEST_MARGIN_HALF);
286
287         return vbox;
288 }
289
290 static gboolean
291 on_range_error (HildonNumberEditor *editor, 
292                 HildonNumberEditorErrorType type,
293                 gpointer user_data)
294 {
295         gchar *msg;
296         gint new_val;
297
298         switch (type) {
299         case MAXIMUM_VALUE_EXCEED:
300                 msg = g_strdup_printf (_("ckct_ib_maximum_value"), MSG_SIZE_MAX_VAL);
301                 new_val = MSG_SIZE_MAX_VAL;
302                 break;
303         case MINIMUM_VALUE_EXCEED:
304                 msg = g_strdup_printf (_("ckct_ib_minimum_value"), MSG_SIZE_MIN_VAL);
305                 new_val = MSG_SIZE_MIN_VAL;
306                 break;
307         case ERRONEOUS_VALUE:
308                 msg = g_strdup_printf (_("ckct_ib_set_a_value_within_range"), 
309                                        MSG_SIZE_MIN_VAL, 
310                                        MSG_SIZE_MAX_VAL);
311                 /* FIXME: use the previous */
312                 new_val = MSG_SIZE_DEF_VAL;
313                 break;
314         default:
315                 g_return_val_if_reached (FALSE);
316         }
317
318         /* Restore value */
319         hildon_number_editor_set_value (editor, new_val);
320
321         /* Show error */
322         hildon_banner_show_information (GTK_WIDGET (user_data), NULL, msg);
323
324         /* Free */
325         g_free (msg);
326
327         return TRUE;
328 }