* refactored account setup wizard (assistant), with specifics for transport/store
[modest] / src / gtk2 / modest-edit-msg-window.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-edit-msg-window.h"
31 #include <widgets/modest-msg-view.h>
32 #include <modest-widget-memory.h>
33
34 /* 'private'/'protected' functions */
35 static void  modest_edit_msg_window_class_init   (ModestEditMsgWindowClass *klass);
36 static void  modest_edit_msg_window_init         (ModestEditMsgWindow *obj);
37 static void  modest_edit_msg_window_finalize     (GObject *obj);
38
39 /* list my signals */
40 enum {
41         /* MY_SIGNAL_1, */
42         /* MY_SIGNAL_2, */
43         LAST_SIGNAL
44 };
45
46 typedef struct _ModestEditMsgWindowPrivate ModestEditMsgWindowPrivate;
47 struct _ModestEditMsgWindowPrivate {
48
49         ModestConf *conf;
50         
51         GtkWidget  *msg_body;
52         GtkWidget  *to_field, *cc_field, *bcc_field,
53                    *subject_field;
54 };
55 #define MODEST_EDIT_MSG_WINDOW_GET_PRIVATE(o)      (G_TYPE_INSTANCE_GET_PRIVATE((o), \
56                                                     MODEST_TYPE_EDIT_MSG_WINDOW, \
57                                                     ModestEditMsgWindowPrivate))
58 /* globals */
59 static GtkWindowClass *parent_class = NULL;
60
61 /* uncomment the following if you have defined any signals */
62 /* static guint signals[LAST_SIGNAL] = {0}; */
63
64 GType
65 modest_edit_msg_window_get_type (void)
66 {
67         static GType my_type = 0;
68         if (!my_type) {
69                 static const GTypeInfo my_info = {
70                         sizeof(ModestEditMsgWindowClass),
71                         NULL,           /* base init */
72                         NULL,           /* base finalize */
73                         (GClassInitFunc) modest_edit_msg_window_class_init,
74                         NULL,           /* class finalize */
75                         NULL,           /* class data */
76                         sizeof(ModestEditMsgWindow),
77                         1,              /* n_preallocs */
78                         (GInstanceInitFunc) modest_edit_msg_window_init,
79                 };
80                 my_type = g_type_register_static (GTK_TYPE_WINDOW,
81                                                   "ModestEditMsgWindow",
82                                                   &my_info, 0);
83         }
84         return my_type;
85 }
86
87 static void
88 modest_edit_msg_window_class_init (ModestEditMsgWindowClass *klass)
89 {
90         GObjectClass *gobject_class;
91         gobject_class = (GObjectClass*) klass;
92
93         parent_class            = g_type_class_peek_parent (klass);
94         gobject_class->finalize = modest_edit_msg_window_finalize;
95
96         g_type_class_add_private (gobject_class, sizeof(ModestEditMsgWindowPrivate));
97
98         /* signal definitions go here, e.g.: */
99 /*      signals[MY_SIGNAL_1] = */
100 /*              g_signal_new ("my_signal_1",....); */
101 /*      signals[MY_SIGNAL_2] = */
102 /*              g_signal_new ("my_signal_2",....); */
103 /*      etc. */
104 }
105
106 static void
107 modest_edit_msg_window_init (ModestEditMsgWindow *obj)
108 {
109         GtkWidget *to_button, *cc_button, *bcc_button, *subject_label; 
110         GtkWidget *header_table;
111         GtkWidget *main_vbox;
112         
113         ModestEditMsgWindowPrivate *priv;
114         priv = MODEST_EDIT_MSG_WINDOW_GET_PRIVATE(obj);
115
116         to_button     = gtk_button_new_with_label (_("To..."));
117         cc_button     = gtk_button_new_with_label (_("Cc..."));
118         bcc_button    = gtk_button_new_with_label (_("Bcc..."));
119         subject_label = gtk_label_new (_("Subject:"));
120         
121         priv->to_field      = gtk_entry_new_with_max_length (40);
122         priv->cc_field      = gtk_entry_new_with_max_length (40);
123         priv->bcc_field     = gtk_entry_new_with_max_length (40);
124         priv->subject_field = gtk_entry_new_with_max_length (40);
125
126         header_table = gtk_table_new (4,2, FALSE);
127         gtk_table_attach (GTK_TABLE(header_table), to_button,     0,1,0,1,
128                           GTK_SHRINK, 0, 0, 0);
129         gtk_table_attach (GTK_TABLE(header_table), cc_button,     0,1,1,2,
130                           GTK_SHRINK, 0, 0, 0);
131         gtk_table_attach (GTK_TABLE(header_table), bcc_button,    0,1,2,3,
132                           GTK_SHRINK, 0, 0, 0);
133         gtk_table_attach (GTK_TABLE(header_table), subject_label, 0,1,3,4,
134                           GTK_SHRINK, 0, 0, 0);
135  
136         gtk_table_attach_defaults (GTK_TABLE(header_table), priv->to_field,     1,2,0,1);
137         gtk_table_attach_defaults (GTK_TABLE(header_table), priv->cc_field,     1,2,1,2);
138         gtk_table_attach_defaults (GTK_TABLE(header_table), priv->bcc_field,    1,2,2,3);
139         gtk_table_attach_defaults (GTK_TABLE(header_table), priv->subject_field,1,2,3,4);
140
141         priv->msg_body = gtk_text_view_new ();
142         
143         main_vbox = gtk_vbox_new  (FALSE, 6);
144
145         gtk_box_pack_start (GTK_BOX(main_vbox), header_table, FALSE, FALSE, 6);
146         gtk_box_pack_start (GTK_BOX(main_vbox), priv->msg_body, TRUE, TRUE, 6);
147
148         gtk_widget_show_all (GTK_WIDGET(main_vbox));
149         gtk_container_add (GTK_CONTAINER(obj), main_vbox);
150 }
151
152 static void
153 modest_edit_msg_window_finalize (GObject *obj)
154 {
155         ModestEditMsgWindowPrivate *priv;
156
157         priv = MODEST_EDIT_MSG_WINDOW_GET_PRIVATE(obj);
158
159         g_object_unref (G_OBJECT(priv->conf));
160         priv->conf = NULL;
161
162         G_OBJECT_CLASS(parent_class)->finalize (obj);
163
164 }
165
166 static gboolean
167 on_delete_event (GtkWidget *widget, GdkEvent *event, ModestEditMsgWindow *self)
168 {
169         ModestEditMsgWindowPrivate *priv;
170         priv = MODEST_EDIT_MSG_WINDOW_GET_PRIVATE(self);
171
172         modest_widget_memory_save_settings (priv->conf,
173                                             GTK_WIDGET(priv->msg_body),
174                                             "modest-edit-msg-body");
175         gtk_widget_destroy (GTK_WIDGET(self));
176         return TRUE;
177 }
178
179
180
181
182 GtkWidget*
183 modest_edit_msg_window_new (ModestConf *conf, ModestEditType type,
184                             TnyMsgIface *msg)
185 {
186         GObject *obj;
187         ModestEditMsgWindowPrivate *priv;
188
189         g_return_val_if_fail (conf, NULL);
190         g_return_val_if_fail (type >= 0 && type < MODEST_EDIT_TYPE_NUM, NULL);
191         g_return_val_if_fail (!(type==MODEST_EDIT_TYPE_NEW && msg), NULL); 
192         g_return_val_if_fail (!(type!=MODEST_EDIT_TYPE_NEW && !msg), NULL); 
193         
194         
195         obj = g_object_new(MODEST_TYPE_EDIT_MSG_WINDOW, NULL);
196         priv = MODEST_EDIT_MSG_WINDOW_GET_PRIVATE(obj);
197
198         g_object_ref (G_OBJECT(conf));
199         priv->conf = conf;
200         
201         modest_widget_memory_restore_settings (priv->conf, GTK_WIDGET(priv->msg_body),
202                                                "modest-edit-msg-body");
203
204         g_signal_connect (G_OBJECT(obj), "delete-event",
205                           G_CALLBACK(on_delete_event), obj);
206         
207         return GTK_WIDGET (obj);
208 }