eef6429b0b0d166b064709ea6f475edf3ae32f8d
[modest] / src / maemo / modest-signature-editor-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 #include "modest-signature-editor-dialog.h"
31 #include "widgets/modest-ui-constants.h"
32 #include "modest-hildon-includes.h"
33 #include "widgets/modest-serversecurity-combo-box.h"
34 #include "widgets/modest-secureauth-combo-box.h"
35 #include "widgets/modest-validating-entry.h"
36 #include "modest-runtime.h"
37 #include <modest-account-mgr-helpers.h>
38 #include <gtk/gtkcheckbutton.h>
39 #include <gtk/gtkhbox.h>
40 #include <gtk/gtkvbox.h>
41 #include <gtk/gtktextview.h>
42 #include <gtk/gtklabel.h>
43 #include <gtk/gtkscrolledwindow.h>
44 #include <gtk/gtkstock.h>
45
46 #include <glib/gi18n.h>
47
48 G_DEFINE_TYPE (ModestSignatureEditorDialog, modest_signature_editor_dialog, GTK_TYPE_DIALOG);
49
50 #define SIGNATURE_EDITOR_DIALOG_GET_PRIVATE(o) \
51         (G_TYPE_INSTANCE_GET_PRIVATE ((o), MODEST_TYPE_SIGNATURE_EDITOR_DIALOG, ModestSignatureEditorDialogPrivate))
52
53 typedef struct _ModestSignatureEditorDialogPrivate ModestSignatureEditorDialogPrivate;
54
55 struct _ModestSignatureEditorDialogPrivate
56 {
57         GtkWidget *checkbox_use;
58         GtkWidget *label;
59         GtkWidget *scrolledwindow;
60         GtkWidget *textview;
61 };
62
63 static void
64 modest_signature_editor_dialog_get_property (GObject *object, guint property_id,
65                                                                                                                         GValue *value, GParamSpec *pspec)
66 {
67         switch (property_id) {
68         default:
69                 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
70         }
71 }
72
73 static void
74 modest_signature_editor_dialog_set_property (GObject *object, guint property_id,
75                                                                                                                         const GValue *value, GParamSpec *pspec)
76 {
77         switch (property_id) {
78         default:
79                 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
80         }
81 }
82
83 static void
84 modest_signature_editor_dialog_dispose (GObject *object)
85 {
86         if (G_OBJECT_CLASS (modest_signature_editor_dialog_parent_class)->dispose)
87                 G_OBJECT_CLASS (modest_signature_editor_dialog_parent_class)->dispose (object);
88 }
89
90 static void
91 modest_signature_editor_dialog_finalize (GObject *object)
92 {
93         G_OBJECT_CLASS (modest_signature_editor_dialog_parent_class)->finalize (object);
94 }
95
96 static void
97 modest_signature_editor_dialog_class_init (ModestSignatureEditorDialogClass *klass)
98 {
99         GObjectClass *object_class = G_OBJECT_CLASS (klass);
100
101         g_type_class_add_private (klass, sizeof (ModestSignatureEditorDialogPrivate));
102
103         object_class->get_property = modest_signature_editor_dialog_get_property;
104         object_class->set_property = modest_signature_editor_dialog_set_property;
105         object_class->dispose = modest_signature_editor_dialog_dispose;
106         object_class->finalize = modest_signature_editor_dialog_finalize;
107 }
108
109 static void
110 enable_widgets (ModestSignatureEditorDialog *self)
111 {
112         ModestSignatureEditorDialogPrivate *priv = 
113                 SIGNATURE_EDITOR_DIALOG_GET_PRIVATE (self);
114                 
115         const gboolean enable = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->checkbox_use));
116         gtk_widget_set_sensitive (priv->label, enable);
117         gtk_widget_set_sensitive (priv->scrolledwindow, enable);
118         gtk_text_view_set_editable (GTK_TEXT_VIEW (priv->textview), enable);
119 }
120
121 static void
122 on_toggle_button_changed (GtkToggleButton *togglebutton, gpointer user_data)
123 {
124         ModestSignatureEditorDialog *self = MODEST_SIGNATURE_EDITOR_DIALOG (user_data);
125         enable_widgets (self);
126 }
127
128 static void
129 modest_signature_editor_dialog_init (ModestSignatureEditorDialog *self)
130 {
131         ModestSignatureEditorDialogPrivate *priv = 
132                 SIGNATURE_EDITOR_DIALOG_GET_PRIVATE (self);
133         
134         gtk_window_set_title (GTK_WINDOW (self), _("mcen_ti_email_signatures_edit_title"));
135                 
136         GtkWidget *box = GTK_DIALOG(self)->vbox; /* gtk_vbox_new (FALSE, MODEST_MARGIN_HALF); */
137         gtk_container_set_border_width (GTK_CONTAINER (box), MODEST_MARGIN_HALF);
138         
139         priv->checkbox_use = gtk_check_button_new_with_label (
140                 _("mcen_fi_email_signatures_use_signature"));
141         gtk_box_pack_start (GTK_BOX (box), priv->checkbox_use, FALSE, FALSE, MODEST_MARGIN_HALF);
142         gtk_widget_show (priv->checkbox_use);
143         
144         g_signal_connect (G_OBJECT (priv->checkbox_use), "toggled",
145                 G_CALLBACK (on_toggle_button_changed), self);
146                 
147         
148         priv->label = gtk_label_new (""); /* Set in modest_signature_editor_dialog_set_settings(). */
149         gtk_box_pack_start (GTK_BOX (box), priv->label, FALSE, FALSE, MODEST_MARGIN_HALF);
150         gtk_widget_show (priv->label);
151         
152         priv->scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
153         gtk_container_set_border_width (GTK_CONTAINER (priv->scrolledwindow), MODEST_MARGIN_DEFAULT);
154         gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (priv->scrolledwindow), 
155                 GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
156         gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (priv->scrolledwindow), GTK_SHADOW_IN);
157         gtk_box_pack_start (GTK_BOX (box), priv->scrolledwindow, FALSE, FALSE, MODEST_MARGIN_HALF);
158         gtk_widget_show (priv->scrolledwindow);
159                 
160         priv->textview = gtk_text_view_new ();
161         gtk_container_add (GTK_CONTAINER (priv->scrolledwindow), priv->textview);
162         gtk_widget_show (priv->textview);
163         GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (priv->textview));
164         gtk_text_buffer_set_text (buffer, "--\n", -1); /* Default, as per the UI spec. */
165         
166         /* Add the buttons: */
167         gtk_dialog_add_button (GTK_DIALOG (self), _("mcen_bd_dialog_ok"), GTK_RESPONSE_OK);
168         gtk_dialog_add_button (GTK_DIALOG (self), _("mcen_bd_dialog_cancel"), GTK_RESPONSE_CANCEL);
169         
170         
171         gtk_widget_show (box);
172         
173         /* When this window is shown, hibernation should not be possible, 
174          * because there is no sensible way to save the state: */
175     modest_window_mgr_prevent_hibernation_while_window_is_shown (
176         modest_runtime_get_window_mgr (), GTK_WINDOW (self)); 
177 }
178
179 ModestSignatureEditorDialog*
180 modest_signature_editor_dialog_new (void)
181 {
182         return g_object_new (MODEST_TYPE_SIGNATURE_EDITOR_DIALOG, NULL);
183 }
184
185 void
186 modest_signature_editor_dialog_set_settings (
187         ModestSignatureEditorDialog *window, gboolean use_signature, const gchar* signature, 
188         const gchar* account_title)
189 {
190         ModestSignatureEditorDialogPrivate *priv = 
191                 SIGNATURE_EDITOR_DIALOG_GET_PRIVATE (window);
192
193         /* This causes a warning because of the %s in the translation, but not in the original string: */
194         gchar* label_text = g_strdup_printf (_("mcen_ia_email_signatures_edit_dlg_label"), 
195                 account_title);
196         gtk_label_set_text (GTK_LABEL (priv->label), label_text);
197         g_free (label_text);
198         
199         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->checkbox_use), use_signature);
200         
201         GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (priv->textview));
202         if (signature)
203                 gtk_text_buffer_set_text (buffer, signature, -1);
204         else
205                 gtk_text_buffer_set_text (buffer, "--\n", -1); /* Default, as per the UI spec. */
206                 
207         enable_widgets (window);
208 }
209
210 /*
211  * The result must be freed with g_free(). */
212 gchar*
213 modest_signature_editor_dialog_get_settings (
214         ModestSignatureEditorDialog *window, gboolean* use_signature)
215 {
216         ModestSignatureEditorDialogPrivate *priv = 
217                 SIGNATURE_EDITOR_DIALOG_GET_PRIVATE (window);
218                 
219         g_assert(use_signature);
220         
221         *use_signature = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->checkbox_use));
222                         
223         GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (priv->textview));
224         
225         GtkTextIter start, end;
226         gtk_text_buffer_get_bounds (buffer, &start, &end);
227         return gtk_text_buffer_get_text (buffer, &start, &end, TRUE);
228 }