1 /* Copyright (c) 2006, Nokia Corporation
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
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.
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.
29 #include <glib/gi18n.h>
31 #include <tny-account-store.h>
32 #include <tny-simple-list.h>
33 #include <modest-tny-msg.h>
34 #include "modest-icon-names.h"
35 #include "modest-ui-actions.h"
36 #include <modest-widget-memory.h>
37 #include <modest-runtime.h>
38 #include <modest-main-window-ui.h>
39 #include "modest-msg-view-window-ui-dimming.h"
41 #include <widgets/modest-msg-view-window.h>
42 #include <widgets/modest-window-priv.h>
43 #include "widgets/modest-msg-view.h"
44 #include "modest-ui-dimming-manager.h"
47 static void modest_msg_view_window_class_init (ModestMsgViewWindowClass *klass);
48 static void modest_msg_view_window_init (ModestMsgViewWindow *obj);
49 static void modest_msg_view_window_finalize (GObject *obj);
51 static void modest_msg_view_window_toggle_find_toolbar (GtkToggleAction *toggle,
61 typedef struct _ModestMsgViewWindowPrivate ModestMsgViewWindowPrivate;
62 struct _ModestMsgViewWindowPrivate {
70 #define MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \
71 MODEST_TYPE_MSG_VIEW_WINDOW, \
72 ModestMsgViewWindowPrivate))
74 static GtkWindowClass *parent_class = NULL;
76 static const GtkToggleActionEntry msg_view_toggle_action_entries [] = {
77 { "FindInMessage", GTK_STOCK_FIND, N_("mcen_me_viewer_find"), NULL, NULL, G_CALLBACK (modest_msg_view_window_toggle_find_toolbar), FALSE },
78 { "ToolsFindInMessage", NULL, N_("mcen_me_viewer_find"), "<CTRL>F", NULL, G_CALLBACK (modest_msg_view_window_toggle_find_toolbar), FALSE },
81 static const GtkRadioActionEntry msg_view_zoom_action_entries [] = {
82 { "Zoom50", NULL, N_("mcen_me_viewer_50"), NULL, NULL, 50 },
83 { "Zoom80", NULL, N_("mcen_me_viewer_80"), NULL, NULL, 80 },
84 { "Zoom100", NULL, N_("mcen_me_viewer_100"), NULL, NULL, 100 },
85 { "Zoom120", NULL, N_("mcen_me_viewer_120"), NULL, NULL, 120 },
86 { "Zoom150", NULL, N_("mcen_me_viewer_150"), NULL, NULL, 150 },
87 { "Zoom200", NULL, N_("mcen_me_viewer_200"), NULL, NULL, 200 }
91 modest_msg_view_window_get_type (void)
93 static GType my_type = 0;
95 static const GTypeInfo my_info = {
96 sizeof(ModestMsgViewWindowClass),
98 NULL, /* base finalize */
99 (GClassInitFunc) modest_msg_view_window_class_init,
100 NULL, /* class finalize */
101 NULL, /* class data */
102 sizeof(ModestMsgViewWindow),
104 (GInstanceInitFunc) modest_msg_view_window_init,
107 my_type = g_type_register_static (MODEST_TYPE_WINDOW,
108 "ModestMsgViewWindow",
115 save_state (ModestWindow *self)
117 modest_widget_memory_save (modest_runtime_get_conf (),
119 MODEST_CONF_MSG_VIEW_WINDOW_KEY);
124 restore_settings (ModestWindow *self)
126 modest_widget_memory_restore (modest_runtime_get_conf (),
128 MODEST_CONF_MSG_VIEW_WINDOW_KEY);
132 modest_msg_view_window_class_init (ModestMsgViewWindowClass *klass)
134 GObjectClass *gobject_class;
135 gobject_class = (GObjectClass*) klass;
137 parent_class = g_type_class_peek_parent (klass);
138 gobject_class->finalize = modest_msg_view_window_finalize;
140 g_type_class_add_private (gobject_class, sizeof(ModestMsgViewWindowPrivate));
142 ModestWindowClass *modest_window_class = (ModestWindowClass *) klass;
143 modest_window_class->save_state_func = save_state;
147 modest_msg_view_window_init (ModestMsgViewWindow *obj)
149 ModestMsgViewWindowPrivate *priv;
150 priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(obj);
152 priv->toolbar = NULL;
153 priv->menubar = NULL;
154 priv->msg_view = NULL;
155 priv->msg_uid = NULL;
160 init_window (ModestMsgViewWindow *obj, TnyMsg *msg)
162 GtkWidget *main_vbox, *scrolled_window;
163 ModestMsgViewWindowPrivate *priv;
164 ModestWindowPrivate *parent_priv;
166 priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(obj);
167 parent_priv = MODEST_WINDOW_GET_PRIVATE(obj);
169 priv->msg_view = GTK_WIDGET (tny_platform_factory_new_msg_view (modest_tny_platform_factory_get_instance ()));
170 tny_msg_view_set_msg (TNY_MSG_VIEW (priv->msg_view), msg);
171 main_vbox = gtk_vbox_new (FALSE, 0);
173 gtk_box_pack_start (GTK_BOX(main_vbox), priv->menubar, FALSE, FALSE, 0);
174 gtk_box_pack_start (GTK_BOX(main_vbox), priv->toolbar, FALSE, FALSE, 0);
175 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
176 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
177 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
178 gtk_container_add (GTK_CONTAINER (scrolled_window),
180 gtk_box_pack_start (GTK_BOX(main_vbox), scrolled_window, TRUE, TRUE, 0);
182 gtk_widget_show_all (GTK_WIDGET(main_vbox));
183 gtk_container_add (GTK_CONTAINER(obj), main_vbox);
188 modest_msg_view_window_finalize (GObject *obj)
190 ModestMsgViewWindowPrivate *priv;
192 priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(obj);
194 G_OBJECT_CLASS(parent_class)->finalize (obj);
200 on_delete_event (GtkWidget *widget, GdkEvent *event, ModestMsgViewWindow *self)
202 modest_window_save_state (MODEST_WINDOW(self));
208 modest_msg_view_window_new_for_attachment (TnyMsg *msg,
209 const gchar *modest_account_name,
210 const gchar *msg_uid)
213 ModestMsgViewWindowPrivate *priv;
214 ModestWindowPrivate *parent_priv;
215 GtkActionGroup *action_group;
216 GError *error = NULL;
217 TnyHeader *header = NULL;
218 gchar *subject = NULL;
219 ModestDimmingRulesGroup *menu_rules_group = NULL;
220 ModestDimmingRulesGroup *toolbar_rules_group = NULL;
221 ModestDimmingRulesGroup *clipboard_rules_group = NULL;
223 g_return_val_if_fail (msg, NULL);
225 obj = g_object_new(MODEST_TYPE_MSG_VIEW_WINDOW, NULL);
226 priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(obj);
227 parent_priv = MODEST_WINDOW_GET_PRIVATE(obj);
229 priv->msg_uid = g_strdup (msg_uid);
231 modest_window_set_active_account (MODEST_WINDOW(obj), modest_account_name);
233 parent_priv->ui_manager = gtk_ui_manager_new();
234 action_group = gtk_action_group_new ("ModestMsgViewWindowActions");
235 gtk_action_group_set_translation_domain (action_group, GETTEXT_PACKAGE);
237 /* Add common actions */
238 gtk_action_group_add_actions (action_group,
239 modest_action_entries,
240 G_N_ELEMENTS (modest_action_entries),
242 gtk_action_group_add_toggle_actions (action_group,
243 modest_toggle_action_entries,
244 G_N_ELEMENTS (modest_toggle_action_entries),
246 gtk_action_group_add_toggle_actions (action_group,
247 msg_view_toggle_action_entries,
248 G_N_ELEMENTS (msg_view_toggle_action_entries),
250 gtk_action_group_add_radio_actions (action_group,
251 msg_view_zoom_action_entries,
252 G_N_ELEMENTS (msg_view_zoom_action_entries),
254 G_CALLBACK (modest_ui_actions_on_change_zoom),
256 gtk_ui_manager_insert_action_group (parent_priv->ui_manager, action_group, 0);
257 g_object_unref (action_group);
260 /* Load the UI definition */
261 gtk_ui_manager_add_ui_from_file (parent_priv->ui_manager,
262 MODEST_UIDIR "modest-msg-view-window-ui.xml",
265 g_printerr ("modest: could not merge modest-msg-view-window-ui.xml: %s\n", error->message);
266 g_error_free (error);
271 /* Add accelerators */
272 gtk_window_add_accel_group (GTK_WINDOW (obj),
273 gtk_ui_manager_get_accel_group (parent_priv->ui_manager));
275 /* Toolbar / Menubar */
276 priv->toolbar = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar");
277 priv->menubar = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/MenuBar");
279 gtk_toolbar_set_tooltips (GTK_TOOLBAR (priv->toolbar), TRUE);
282 init_window (MODEST_MSG_VIEW_WINDOW(obj), msg);
283 restore_settings (MODEST_WINDOW(obj));
285 header = tny_msg_get_header (msg);
287 subject = tny_header_dup_subject (header);
290 gtk_window_set_title (GTK_WINDOW (obj), subject);
292 gtk_window_set_title (GTK_WINDOW(obj), "Modest");
296 g_object_unref (header);
298 gtk_window_set_icon_from_file (GTK_WINDOW(obj), MODEST_APP_ICON, NULL);
300 parent_priv->ui_dimming_manager = modest_ui_dimming_manager_new();
302 menu_rules_group = modest_dimming_rules_group_new (MODEST_DIMMING_RULES_MENU, FALSE);
303 toolbar_rules_group = modest_dimming_rules_group_new (MODEST_DIMMING_RULES_TOOLBAR, TRUE);
304 clipboard_rules_group = modest_dimming_rules_group_new (MODEST_DIMMING_RULES_CLIPBOARD, FALSE);
306 /* Add common dimming rules */
307 modest_dimming_rules_group_add_rules (menu_rules_group,
308 modest_msg_view_menu_dimming_entries,
309 G_N_ELEMENTS (modest_msg_view_menu_dimming_entries),
310 MODEST_WINDOW (obj));
311 modest_dimming_rules_group_add_rules (toolbar_rules_group,
312 modest_msg_view_toolbar_dimming_entries,
313 G_N_ELEMENTS (modest_msg_view_toolbar_dimming_entries),
314 MODEST_WINDOW (obj));
315 modest_dimming_rules_group_add_rules (clipboard_rules_group,
316 modest_msg_view_clipboard_dimming_entries,
317 G_N_ELEMENTS (modest_msg_view_clipboard_dimming_entries),
318 MODEST_WINDOW (obj));
320 /* Insert dimming rules group for this window */
321 modest_ui_dimming_manager_insert_rules_group (parent_priv->ui_dimming_manager, menu_rules_group);
322 modest_ui_dimming_manager_insert_rules_group (parent_priv->ui_dimming_manager, toolbar_rules_group);
323 modest_ui_dimming_manager_insert_rules_group (parent_priv->ui_dimming_manager, clipboard_rules_group);
324 g_object_unref (menu_rules_group);
325 g_object_unref (toolbar_rules_group);
326 g_object_unref (clipboard_rules_group);
328 g_signal_connect (G_OBJECT(obj), "delete-event", G_CALLBACK(on_delete_event), obj);
330 return MODEST_WINDOW(obj);
335 modest_msg_view_window_get_message (ModestMsgViewWindow *self)
338 g_return_val_if_fail (self, NULL);
340 msg_view = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(self)->msg_view;
342 return tny_msg_view_get_msg (TNY_MSG_VIEW(msg_view));
346 modest_msg_view_window_get_message_uid (ModestMsgViewWindow *self)
348 ModestMsgViewWindowPrivate *priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (self);
351 const gchar *retval = NULL;
353 msg = tny_msg_view_get_msg (TNY_MSG_VIEW (priv->msg_view));
354 msg = modest_msg_view_window_get_message (self);
359 header = tny_msg_get_header (msg);
360 g_free (priv->msg_uid);
362 priv->msg_uid = tny_header_dup_uid (header);
363 g_object_unref (header);
365 g_object_unref (msg);
367 return priv->msg_uid;
371 modest_msg_view_window_new_with_header_model (TnyMsg *msg,
372 const gchar *modest_account_name,
373 const gchar *msg_uid,
375 GtkTreeRowReference *row_reference)
377 /* Currently we simply redirect to new constructor. It should store a
378 reference to the header list model, to enable next/prev message
380 g_message ("partially implemented %s", __FUNCTION__);
382 return modest_msg_view_window_new_for_attachment (msg, modest_account_name, msg_uid);
387 modest_msg_view_window_select_next_message (ModestMsgViewWindow *window)
389 g_message ("not implemented %s", __FUNCTION__);
394 modest_msg_view_window_select_previous_message (ModestMsgViewWindow *window)
396 g_message ("not implemented %s", __FUNCTION__);
401 modest_msg_view_window_view_attachment (ModestMsgViewWindow *window, TnyMimePart *mime_part)
403 g_message ("not implemented %s", __FUNCTION__);
407 modest_msg_view_window_save_attachments (ModestMsgViewWindow *window, TnyList *mime_parts)
409 g_message ("not implemented %s", __FUNCTION__);
412 modest_msg_view_window_remove_attachments (ModestMsgViewWindow *window, gboolean get_all)
414 g_message ("not implemented %s", __FUNCTION__);
418 modest_msg_view_window_get_header (ModestMsgViewWindow *self)
421 TnyHeader *header = NULL;
423 msg = modest_msg_view_window_get_message (self);
425 header = tny_msg_get_header (msg);
426 g_object_unref (msg);
432 modest_msg_view_window_get_folder_type (ModestMsgViewWindow *window)
434 ModestMsgViewWindowPrivate *priv;
436 TnyFolderType folder_type;
438 priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
440 folder_type = TNY_FOLDER_TYPE_UNKNOWN;
442 msg = tny_msg_view_get_msg (TNY_MSG_VIEW (priv->msg_view));
446 folder = tny_msg_get_folder (msg);
448 folder_type = tny_folder_get_folder_type (folder);
449 g_object_unref (folder);
451 g_object_unref (msg);
457 /* NOT IMPLEMENTED METHODS */
460 modest_msg_view_window_last_message_selected (ModestMsgViewWindow *window)
462 g_message ("NOT IMPLEMENTED %s", __FUNCTION__);
467 modest_msg_view_window_first_message_selected (ModestMsgViewWindow *window)
469 g_message ("NOT IMPLEMENTED %s", __FUNCTION__);
474 modest_msg_view_window_transfer_mode_enabled (ModestMsgViewWindow *self)
476 g_message ("NOT IMPLEMENTED %s", __FUNCTION__);
481 modest_msg_view_window_toolbar_on_transfer_mode (ModestMsgViewWindow *self)
483 g_message ("NOT IMPLEMENTED %s", __FUNCTION__);
489 modest_msg_view_window_get_attachments (ModestMsgViewWindow *win)
493 result = tny_simple_list_new ();
494 g_message ("NOT IMPLEMENTED %s", __FUNCTION__);
499 modest_msg_view_window_is_search_result (ModestMsgViewWindow *window)
501 g_message ("NOT IMPLEMENTED %s", __FUNCTION__);
506 modest_msg_view_window_has_headers_model (ModestMsgViewWindow *window)
508 g_message ("NOT IMPLEMENTED %s", __FUNCTION__);
513 modest_msg_view_window_toggle_find_toolbar (GtkToggleAction *toggle,
516 g_message ("NOT IMPLEMENTED %s", __FUNCTION__);