* src/widgets/modest-msg-view.[ch]:
[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         GtkWidget *scrolled_window;
165         
166         priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(obj);
167         parent_priv = MODEST_WINDOW_GET_PRIVATE(obj);
168
169         priv->msg_view = modest_msg_view_new (msg);
170         main_vbox = gtk_vbox_new  (FALSE, 6);
171
172         /* Toolbar / Menubar */
173         
174         parent_priv->menubar = menubar_to_menu (parent_priv->ui_manager);
175         gtk_widget_show_all (GTK_WIDGET(parent_priv->menubar));
176         hildon_window_set_menu    (HILDON_WINDOW(obj), GTK_MENU(parent_priv->menubar));
177
178         parent_priv->toolbar = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar");
179         gtk_widget_show_all (GTK_WIDGET(parent_priv->toolbar));
180         hildon_window_add_toolbar (HILDON_WINDOW(obj), GTK_TOOLBAR(parent_priv->toolbar));
181
182         scrolled_window = gtk_scrolled_window_new (NULL, NULL);
183         gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
184         gtk_container_add (GTK_CONTAINER (scrolled_window), priv->msg_view);
185         gtk_box_pack_start (GTK_BOX(main_vbox), scrolled_window, TRUE, TRUE, 6);
186         gtk_container_add   (GTK_CONTAINER(obj), main_vbox);
187         
188         gtk_widget_show_all (GTK_WIDGET(main_vbox));
189 }       
190
191
192 static void
193 modest_msg_view_window_finalize (GObject *obj)
194 {
195         G_OBJECT_CLASS(parent_class)->finalize (obj);
196 }
197
198
199
200 static gboolean
201 on_delete_event (GtkWidget *widget, GdkEvent *event, ModestMsgViewWindow *self)
202 {
203         save_settings (self);
204         return FALSE;
205 }
206
207
208
209 ModestWindow *
210 modest_msg_view_window_new (TnyMsg *msg, const gchar *account_name)
211 {
212         GObject *obj;
213         ModestMsgViewWindowPrivate *priv;
214         ModestWindowPrivate *parent_priv;
215         GtkActionGroup *action_group;
216         GError *error = NULL;
217
218         g_return_val_if_fail (msg, NULL);
219         
220         obj = g_object_new(MODEST_TYPE_MSG_VIEW_WINDOW, NULL);
221         priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(obj);
222         parent_priv = MODEST_WINDOW_GET_PRIVATE(obj);
223         
224         parent_priv->ui_manager = gtk_ui_manager_new();
225         action_group = gtk_action_group_new ("ModestMsgViewWindowActions");
226
227         /* Add common actions */
228         gtk_action_group_add_actions (action_group,
229                                       modest_action_entries,
230                                       G_N_ELEMENTS (modest_action_entries),
231                                       obj);
232         gtk_ui_manager_insert_action_group (parent_priv->ui_manager, action_group, 0);
233         g_object_unref (action_group);
234
235         /* Load the UI definition */
236         gtk_ui_manager_add_ui_from_file (parent_priv->ui_manager, MODEST_UIDIR "modest-msg-view-window-ui.xml",
237                                          &error);
238         if (error) {
239                 g_printerr ("modest: could not merge modest-msg-view-window-ui.xml: %s\n", error->message);
240                 g_error_free (error);
241                 error = NULL;
242         }
243         /* ****** */
244
245         /* Add accelerators */
246         gtk_window_add_accel_group (GTK_WINDOW (obj), 
247                                     gtk_ui_manager_get_accel_group (parent_priv->ui_manager));
248         
249         /* Init window */
250         init_window (MODEST_MSG_VIEW_WINDOW(obj), msg);
251         restore_settings (MODEST_MSG_VIEW_WINDOW(obj));
252         
253         gtk_window_set_title (GTK_WINDOW(obj), "Modest");
254         gtk_window_set_icon_from_file (GTK_WINDOW(obj), MODEST_APP_ICON, NULL);
255
256         g_signal_connect (G_OBJECT(obj), "delete-event", G_CALLBACK(on_delete_event), obj);
257
258         modest_window_set_active_account (MODEST_WINDOW(obj), account_name);
259         return MODEST_WINDOW(obj);
260 }
261
262
263
264 TnyMsg*
265 modest_msg_view_window_get_message (ModestMsgViewWindow *self)
266 {
267         ModestMsgView *msg_view;
268         ModestMsgViewWindowPrivate *priv;
269
270         g_return_val_if_fail (self, NULL);
271
272         priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(self);
273
274         msg_view = MODEST_MSG_VIEW (priv->msg_view);
275
276         return modest_msg_view_get_message (msg_view);
277 }