Fixed some compilation errors
[modest] / src / maemo / modest-msg-view-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 #include <glib/gi18n.h>
30 #include <string.h>
31 #include <tny-account-store.h>
32 #include <tny-simple-list.h>
33 #include <modest-tny-msg.h>
34 #include <modest-msg-view-window.h>
35 #include <modest-main-window-ui.h>
36 #include <modest-widget-memory.h>
37 #include <modest-runtime.h>
38 #include <modest-window-priv.h>
39
40 static void  modest_msg_view_window_class_init   (ModestMsgViewWindowClass *klass);
41 static void  modest_msg_view_window_init         (ModestMsgViewWindow *obj);
42 static void  modest_msg_view_window_finalize     (GObject *obj);
43
44 /* list my signals */
45 enum {
46         /* MY_SIGNAL_1, */
47         /* MY_SIGNAL_2, */
48         LAST_SIGNAL
49 };
50
51 typedef struct _ModestMsgViewWindowPrivate ModestMsgViewWindowPrivate;
52 struct _ModestMsgViewWindowPrivate {
53
54         GtkWidget   *toolbar;
55         GtkWidget   *menubar;
56         GtkWidget   *msg_view;
57 };
58
59 #define MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(o)      (G_TYPE_INSTANCE_GET_PRIVATE((o), \
60                                                     MODEST_TYPE_MSG_VIEW_WINDOW, \
61                                                     ModestMsgViewWindowPrivate))
62 /* globals */
63 static GtkWindowClass *parent_class = NULL;
64
65 /* uncomment the following if you have defined any signals */
66 /* static guint signals[LAST_SIGNAL] = {0}; */
67
68 GType
69 modest_msg_view_window_get_type (void)
70 {
71         static GType my_type = 0;
72         if (!my_type) {
73                 static const GTypeInfo my_info = {
74                         sizeof(ModestMsgViewWindowClass),
75                         NULL,           /* base init */
76                         NULL,           /* base finalize */
77                         (GClassInitFunc) modest_msg_view_window_class_init,
78                         NULL,           /* class finalize */
79                         NULL,           /* class data */
80                         sizeof(ModestMsgViewWindow),
81                         1,              /* n_preallocs */
82                         (GInstanceInitFunc) modest_msg_view_window_init,
83                         NULL
84                 };
85                 my_type = g_type_register_static (MODEST_TYPE_WINDOW,
86                                                   "ModestMsgViewWindow",
87                                                   &my_info, 0);
88         }
89         return my_type;
90 }
91
92 static void
93 modest_msg_view_window_class_init (ModestMsgViewWindowClass *klass)
94 {
95         GObjectClass *gobject_class;
96         gobject_class = (GObjectClass*) klass;
97
98         parent_class            = g_type_class_peek_parent (klass);
99         gobject_class->finalize = modest_msg_view_window_finalize;
100
101         g_type_class_add_private (gobject_class, sizeof(ModestMsgViewWindowPrivate));
102 }
103
104 static void
105 modest_msg_view_window_init (ModestMsgViewWindow *obj)
106 {
107         ModestMsgViewWindowPrivate *priv;
108         priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(obj);
109
110         priv->toolbar       = NULL;
111         priv->menubar       = NULL;
112         priv->msg_view      = NULL;
113 }
114
115 static void
116 save_settings (ModestMsgViewWindow *self)
117 {
118         modest_widget_memory_save (modest_runtime_get_conf (),
119                                     G_OBJECT(self), "modest-msg-view-window");
120 }
121
122
123 static void
124 restore_settings (ModestMsgViewWindow *self)
125 {
126         modest_widget_memory_restore (modest_runtime_get_conf (),
127                                       G_OBJECT(self), "modest-msg-view-window");
128 }
129
130
131
132 static GtkWidget *
133 menubar_to_menu (GtkUIManager *ui_manager)
134 {
135         GtkWidget *main_menu;
136         GtkWidget *menubar;
137         GList *iter;
138
139         /* Create new main menu */
140         main_menu = gtk_menu_new();
141
142         /* Get the menubar from the UI manager */
143         menubar = gtk_ui_manager_get_widget (ui_manager, "/MenuBar");
144
145         iter = gtk_container_get_children (GTK_CONTAINER (menubar));
146         while (iter) {
147                 GtkWidget *menu;
148
149                 menu = GTK_WIDGET (iter->data);
150                 gtk_widget_reparent(menu, main_menu);
151
152                 iter = g_list_next (iter);
153         }
154         return main_menu;
155 }
156
157
158 static void
159 init_window (ModestMsgViewWindow *obj, TnyMsg *msg)
160 {
161         GtkWidget *main_vbox;
162         ModestMsgViewWindowPrivate *priv;
163         ModestWindowPrivate *parent_priv;
164         
165         priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(obj);
166         parent_priv = MODEST_WINDOW_GET_PRIVATE(obj);
167
168         priv->msg_view = modest_msg_view_new (msg);
169         main_vbox = gtk_vbox_new  (FALSE, 6);
170
171         /* Toolbar / Menubar */
172         
173         parent_priv->menubar = menubar_to_menu (parent_priv->ui_manager);
174         gtk_widget_show_all (GTK_WIDGET(parent_priv->menubar));
175         hildon_window_set_menu    (HILDON_WINDOW(obj), GTK_MENU(parent_priv->menubar));
176
177         parent_priv->toolbar = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar");
178         gtk_widget_show_all (GTK_WIDGET(parent_priv->toolbar));
179         hildon_window_add_toolbar (HILDON_WINDOW(obj), GTK_TOOLBAR(parent_priv->toolbar));
180
181         gtk_box_pack_start (GTK_BOX(main_vbox), priv->msg_view, TRUE, TRUE, 6);
182         gtk_container_add   (GTK_CONTAINER(obj), main_vbox);
183         
184         gtk_widget_show_all (GTK_WIDGET(main_vbox));
185 }       
186
187
188 static void
189 modest_msg_view_window_finalize (GObject *obj)
190 {
191         G_OBJECT_CLASS(parent_class)->finalize (obj);
192 }
193
194
195
196 static gboolean
197 on_delete_event (GtkWidget *widget, GdkEvent *event, ModestMsgViewWindow *self)
198 {
199         save_settings (self);
200         return FALSE;
201 }
202
203
204
205 ModestWindow *
206 modest_msg_view_window_new (TnyMsg *msg, const gchar *account_name)
207 {
208         GObject *obj;
209         ModestMsgViewWindowPrivate *priv;
210         ModestWindowPrivate *parent_priv;
211         GtkActionGroup *action_group;
212         GError *error = NULL;
213
214         g_return_val_if_fail (msg, NULL);
215         
216         obj = g_object_new(MODEST_TYPE_MSG_VIEW_WINDOW, NULL);
217         priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(obj);
218         parent_priv = MODEST_WINDOW_GET_PRIVATE(obj);
219         
220         parent_priv->ui_manager = gtk_ui_manager_new();
221         action_group = gtk_action_group_new ("ModestMsgViewWindowActions");
222
223         /* Add common actions */
224         gtk_action_group_add_actions (action_group,
225                                       modest_action_entries,
226                                       G_N_ELEMENTS (modest_action_entries),
227                                       obj);
228         gtk_ui_manager_insert_action_group (parent_priv->ui_manager, action_group, 0);
229         g_object_unref (action_group);
230
231         /* Load the UI definition */
232         gtk_ui_manager_add_ui_from_file (parent_priv->ui_manager, MODEST_UIDIR "modest-msg-view-window-ui.xml",
233                                          &error);
234         if (error) {
235                 g_printerr ("modest: could not merge modest-msg-view-window-ui.xml: %s\n", error->message);
236                 g_error_free (error);
237                 error = NULL;
238         }
239         /* ****** */
240
241         /* Add accelerators */
242         gtk_window_add_accel_group (GTK_WINDOW (obj), 
243                                     gtk_ui_manager_get_accel_group (parent_priv->ui_manager));
244         
245         /* Init window */
246         init_window (MODEST_MSG_VIEW_WINDOW(obj), msg);
247         restore_settings (MODEST_MSG_VIEW_WINDOW(obj));
248         
249         gtk_window_set_title (GTK_WINDOW(obj), "Modest");
250         gtk_window_set_icon_from_file (GTK_WINDOW(obj), MODEST_APP_ICON, NULL);
251
252         g_signal_connect (G_OBJECT(obj), "delete-event", G_CALLBACK(on_delete_event), obj);
253
254         modest_window_set_active_account (MODEST_WINDOW(obj), account_name);
255         return MODEST_WINDOW(obj);
256 }
257
258
259
260 TnyMsg*
261 modest_msg_view_window_get_message (ModestMsgViewWindow *self)
262 {
263         ModestMsgView *msg_view;
264         ModestMsgViewWindowPrivate *priv;
265
266         g_return_val_if_fail (self, NULL);
267
268         priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(self);
269
270         msg_view = MODEST_MSG_VIEW (priv->msg_view);
271
272         return modest_msg_view_get_message (msg_view);
273 }