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"
40 #include "modest-defs.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 {
68 TnyMimePart *other_body;
71 #define MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \
72 MODEST_TYPE_MSG_VIEW_WINDOW, \
73 ModestMsgViewWindowPrivate))
75 static GtkWindowClass *parent_class = NULL;
77 static const GtkToggleActionEntry msg_view_toggle_action_entries [] = {
78 { "FindInMessage", GTK_STOCK_FIND, N_("mcen_me_viewer_find"), NULL, NULL, G_CALLBACK (modest_msg_view_window_toggle_find_toolbar), FALSE },
79 { "ToolsFindInMessage", NULL, N_("mcen_me_viewer_find"), "<CTRL>F", NULL, G_CALLBACK (modest_msg_view_window_toggle_find_toolbar), FALSE },
82 static const GtkRadioActionEntry msg_view_zoom_action_entries [] = {
83 { "Zoom50", NULL, N_("mcen_me_viewer_50"), NULL, NULL, 50 },
84 { "Zoom80", NULL, N_("mcen_me_viewer_80"), NULL, NULL, 80 },
85 { "Zoom100", NULL, N_("mcen_me_viewer_100"), NULL, NULL, 100 },
86 { "Zoom120", NULL, N_("mcen_me_viewer_120"), NULL, NULL, 120 },
87 { "Zoom150", NULL, N_("mcen_me_viewer_150"), NULL, NULL, 150 },
88 { "Zoom200", NULL, N_("mcen_me_viewer_200"), NULL, NULL, 200 }
92 modest_msg_view_window_get_type (void)
94 static GType my_type = 0;
96 static const GTypeInfo my_info = {
97 sizeof(ModestMsgViewWindowClass),
99 NULL, /* base finalize */
100 (GClassInitFunc) modest_msg_view_window_class_init,
101 NULL, /* class finalize */
102 NULL, /* class data */
103 sizeof(ModestMsgViewWindow),
105 (GInstanceInitFunc) modest_msg_view_window_init,
108 my_type = g_type_register_static (MODEST_TYPE_WINDOW,
109 "ModestMsgViewWindow",
116 save_state (ModestWindow *self)
118 modest_widget_memory_save (modest_runtime_get_conf (),
120 MODEST_CONF_MSG_VIEW_WINDOW_KEY);
125 restore_settings (ModestWindow *self)
127 modest_widget_memory_restore (modest_runtime_get_conf (),
129 MODEST_CONF_MSG_VIEW_WINDOW_KEY);
133 modest_msg_view_window_class_init (ModestMsgViewWindowClass *klass)
135 GObjectClass *gobject_class;
136 gobject_class = (GObjectClass*) klass;
138 parent_class = g_type_class_peek_parent (klass);
139 gobject_class->finalize = modest_msg_view_window_finalize;
141 g_type_class_add_private (gobject_class, sizeof(ModestMsgViewWindowPrivate));
143 ModestWindowClass *modest_window_class = (ModestWindowClass *) klass;
144 modest_window_class->save_state_func = save_state;
148 modest_msg_view_window_init (ModestMsgViewWindow *obj)
150 ModestMsgViewWindowPrivate *priv;
151 priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(obj);
153 priv->toolbar = NULL;
154 priv->menubar = NULL;
155 priv->msg_view = NULL;
156 priv->msg_uid = NULL;
157 priv->other_body = NULL;
162 init_window (ModestMsgViewWindow *obj, TnyMsg *msg, TnyMimePart *other_body)
164 GtkWidget *main_vbox, *scrolled_window;
165 ModestMsgViewWindowPrivate *priv;
166 ModestWindowPrivate *parent_priv;
168 priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(obj);
169 parent_priv = MODEST_WINDOW_GET_PRIVATE(obj);
171 priv->msg_view = GTK_WIDGET (tny_platform_factory_new_msg_view (modest_tny_platform_factory_get_instance ()));
173 priv->other_body = g_object_ref (other_body);
174 modest_msg_view_set_msg_with_other_body (MODEST_MSG_VIEW (priv->msg_view), msg, other_body);
176 tny_msg_view_set_msg (TNY_MSG_VIEW (priv->msg_view), msg);
178 main_vbox = gtk_vbox_new (FALSE, 0);
180 gtk_box_pack_start (GTK_BOX(main_vbox), priv->menubar, FALSE, FALSE, 0);
181 gtk_box_pack_start (GTK_BOX(main_vbox), priv->toolbar, FALSE, FALSE, 0);
182 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
183 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
184 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
185 gtk_container_add (GTK_CONTAINER (scrolled_window),
187 gtk_box_pack_start (GTK_BOX(main_vbox), scrolled_window, TRUE, TRUE, 0);
189 gtk_widget_show_all (GTK_WIDGET(main_vbox));
190 gtk_container_add (GTK_CONTAINER(obj), main_vbox);
195 modest_msg_view_window_finalize (GObject *obj)
197 ModestMsgViewWindowPrivate *priv;
199 priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(obj);
201 if (priv->other_body != NULL) {
202 g_object_unref (priv->other_body);
203 priv->other_body = NULL;
206 G_OBJECT_CLASS(parent_class)->finalize (obj);
212 on_delete_event (GtkWidget *widget, GdkEvent *event, ModestMsgViewWindow *self)
214 modest_window_save_state (MODEST_WINDOW(self));
220 modest_msg_view_window_is_other_body (ModestMsgViewWindow *self)
222 ModestMsgViewWindowPrivate *priv = NULL;
224 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (self), FALSE);
225 priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (self);
227 return (priv->other_body != NULL);
231 modest_msg_view_window_new_with_other_body (TnyMsg *msg,
232 TnyMimePart *other_body,
233 const gchar *modest_account_name,
234 const gchar *mailbox, /* ignored */
235 const gchar *msg_uid)
238 ModestMsgViewWindowPrivate *priv;
239 ModestWindowPrivate *parent_priv;
240 GtkActionGroup *action_group;
241 GError *error = NULL;
242 TnyHeader *header = NULL;
243 gchar *subject = NULL;
244 ModestDimmingRulesGroup *menu_rules_group = NULL;
245 ModestDimmingRulesGroup *toolbar_rules_group = NULL;
246 ModestDimmingRulesGroup *clipboard_rules_group = NULL;
248 g_return_val_if_fail (msg, NULL);
250 obj = g_object_new(MODEST_TYPE_MSG_VIEW_WINDOW, NULL);
251 priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(obj);
252 parent_priv = MODEST_WINDOW_GET_PRIVATE(obj);
254 priv->msg_uid = g_strdup (msg_uid);
256 modest_window_set_active_account (MODEST_WINDOW(obj), modest_account_name);
258 parent_priv->ui_manager = gtk_ui_manager_new();
259 action_group = gtk_action_group_new ("ModestMsgViewWindowActions");
260 gtk_action_group_set_translation_domain (action_group, GETTEXT_PACKAGE);
262 /* Add common actions */
263 gtk_action_group_add_actions (action_group,
264 modest_action_entries,
265 G_N_ELEMENTS (modest_action_entries),
267 gtk_action_group_add_toggle_actions (action_group,
268 modest_toggle_action_entries,
269 G_N_ELEMENTS (modest_toggle_action_entries),
271 gtk_action_group_add_toggle_actions (action_group,
272 msg_view_toggle_action_entries,
273 G_N_ELEMENTS (msg_view_toggle_action_entries),
275 gtk_action_group_add_radio_actions (action_group,
276 msg_view_zoom_action_entries,
277 G_N_ELEMENTS (msg_view_zoom_action_entries),
279 G_CALLBACK (modest_ui_actions_on_change_zoom),
281 gtk_ui_manager_insert_action_group (parent_priv->ui_manager, action_group, 0);
282 g_object_unref (action_group);
285 /* Load the UI definition */
286 gtk_ui_manager_add_ui_from_file (parent_priv->ui_manager,
287 MODEST_UIDIR "modest-msg-view-window-ui.xml",
290 g_printerr ("modest: could not merge modest-msg-view-window-ui.xml: %s\n", error->message);
291 g_error_free (error);
296 /* Add accelerators */
297 gtk_window_add_accel_group (GTK_WINDOW (obj),
298 gtk_ui_manager_get_accel_group (parent_priv->ui_manager));
300 /* Toolbar / Menubar */
301 priv->toolbar = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar");
302 priv->menubar = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/MenuBar");
304 gtk_toolbar_set_tooltips (GTK_TOOLBAR (priv->toolbar), TRUE);
307 init_window (MODEST_MSG_VIEW_WINDOW(obj), msg, other_body);
308 restore_settings (MODEST_WINDOW(obj));
310 header = tny_msg_get_header (msg);
314 description = modest_tny_mime_part_get_header_value (other_body, "Content-Description");
316 g_strstrip (description);
317 subject = description;
321 subject = tny_header_dup_subject (header);
326 gtk_window_set_title (GTK_WINDOW (obj), subject);
328 gtk_window_set_title (GTK_WINDOW(obj), "Modest");
332 g_object_unref (header);
334 gtk_window_set_icon_from_file (GTK_WINDOW(obj), MODEST_APP_ICON, NULL);
336 parent_priv->ui_dimming_manager = modest_ui_dimming_manager_new();
338 menu_rules_group = modest_dimming_rules_group_new (MODEST_DIMMING_RULES_MENU, FALSE);
339 toolbar_rules_group = modest_dimming_rules_group_new (MODEST_DIMMING_RULES_TOOLBAR, TRUE);
340 clipboard_rules_group = modest_dimming_rules_group_new (MODEST_DIMMING_RULES_CLIPBOARD, FALSE);
342 /* Add common dimming rules */
343 modest_dimming_rules_group_add_rules (menu_rules_group,
344 modest_msg_view_menu_dimming_entries,
345 G_N_ELEMENTS (modest_msg_view_menu_dimming_entries),
346 MODEST_WINDOW (obj));
347 modest_dimming_rules_group_add_rules (toolbar_rules_group,
348 modest_msg_view_toolbar_dimming_entries,
349 G_N_ELEMENTS (modest_msg_view_toolbar_dimming_entries),
350 MODEST_WINDOW (obj));
351 modest_dimming_rules_group_add_rules (clipboard_rules_group,
352 modest_msg_view_clipboard_dimming_entries,
353 G_N_ELEMENTS (modest_msg_view_clipboard_dimming_entries),
354 MODEST_WINDOW (obj));
356 /* Insert dimming rules group for this window */
357 modest_ui_dimming_manager_insert_rules_group (parent_priv->ui_dimming_manager, menu_rules_group);
358 modest_ui_dimming_manager_insert_rules_group (parent_priv->ui_dimming_manager, toolbar_rules_group);
359 modest_ui_dimming_manager_insert_rules_group (parent_priv->ui_dimming_manager, clipboard_rules_group);
360 g_object_unref (menu_rules_group);
361 g_object_unref (toolbar_rules_group);
362 g_object_unref (clipboard_rules_group);
364 g_signal_connect (G_OBJECT(obj), "delete-event", G_CALLBACK(on_delete_event), obj);
366 return MODEST_WINDOW(obj);
370 modest_msg_view_window_new_for_attachment (TnyMsg *msg,
371 const gchar *modest_account_name,
372 const gchar *mailbox, /* ignored */
373 const gchar *msg_uid)
376 return modest_msg_view_window_new_with_other_body (msg, NULL, modest_account_name, mailbox, msg_uid);
382 modest_msg_view_window_get_message (ModestMsgViewWindow *self)
385 g_return_val_if_fail (self, NULL);
387 msg_view = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(self)->msg_view;
389 return tny_msg_view_get_msg (TNY_MSG_VIEW(msg_view));
393 modest_msg_view_window_get_message_uid (ModestMsgViewWindow *self)
395 ModestMsgViewWindowPrivate *priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (self);
398 const gchar *retval = NULL;
400 msg = tny_msg_view_get_msg (TNY_MSG_VIEW (priv->msg_view));
401 msg = modest_msg_view_window_get_message (self);
406 header = tny_msg_get_header (msg);
407 g_free (priv->msg_uid);
409 priv->msg_uid = tny_header_dup_uid (header);
410 g_object_unref (header);
412 g_object_unref (msg);
414 return priv->msg_uid;
418 modest_msg_view_window_new_with_header_model (TnyMsg *msg,
419 const gchar *modest_account_name,
420 const gchar *mailbox, /*ignored*/
421 const gchar *msg_uid,
423 GtkTreeRowReference *row_reference)
425 /* Currently we simply redirect to new constructor. It should store a
426 reference to the header list model, to enable next/prev message
428 g_debug ("partially implemented %s", __FUNCTION__);
430 return modest_msg_view_window_new_for_attachment (msg, modest_account_name, NULL, msg_uid);
435 modest_msg_view_window_select_next_message (ModestMsgViewWindow *window)
437 g_warning ("not implemented %s", __FUNCTION__);
442 modest_msg_view_window_select_previous_message (ModestMsgViewWindow *window)
444 g_warning ("not implemented %s", __FUNCTION__);
449 modest_msg_view_window_view_attachment (ModestMsgViewWindow *window, TnyMimePart *mime_part)
451 g_warning ("not implemented %s", __FUNCTION__);
455 modest_msg_view_window_save_attachments (ModestMsgViewWindow *window, TnyList *mime_parts)
457 g_warning ("not implemented %s", __FUNCTION__);
460 modest_msg_view_window_remove_attachments (ModestMsgViewWindow *window, gboolean get_all)
462 g_warning ("not implemented %s", __FUNCTION__);
466 modest_msg_view_window_get_header (ModestMsgViewWindow *self)
469 TnyHeader *header = NULL;
471 msg = modest_msg_view_window_get_message (self);
473 header = tny_msg_get_header (msg);
474 g_object_unref (msg);
480 modest_msg_view_window_get_folder_type (ModestMsgViewWindow *window)
482 ModestMsgViewWindowPrivate *priv;
484 TnyFolderType folder_type;
486 priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
488 folder_type = TNY_FOLDER_TYPE_UNKNOWN;
490 msg = tny_msg_view_get_msg (TNY_MSG_VIEW (priv->msg_view));
494 folder = tny_msg_get_folder (msg);
496 folder_type = tny_folder_get_folder_type (folder);
497 g_object_unref (folder);
499 g_object_unref (msg);
505 /* NOT IMPLEMENTED METHODS */
508 modest_msg_view_window_last_message_selected (ModestMsgViewWindow *window)
510 g_warning ("NOT IMPLEMENTED %s", __FUNCTION__);
515 modest_msg_view_window_first_message_selected (ModestMsgViewWindow *window)
517 g_warning ("NOT IMPLEMENTED %s", __FUNCTION__);
522 modest_msg_view_window_transfer_mode_enabled (ModestMsgViewWindow *self)
524 g_warning ("NOT IMPLEMENTED %s", __FUNCTION__);
529 modest_msg_view_window_toolbar_on_transfer_mode (ModestMsgViewWindow *self)
531 g_warning ("NOT IMPLEMENTED %s", __FUNCTION__);
537 modest_msg_view_window_get_attachments (ModestMsgViewWindow *win)
541 result = tny_simple_list_new ();
542 g_warning ("NOT IMPLEMENTED %s", __FUNCTION__);
547 modest_msg_view_window_is_search_result (ModestMsgViewWindow *window)
549 g_warning ("NOT IMPLEMENTED %s", __FUNCTION__);
554 modest_msg_view_window_has_headers_model (ModestMsgViewWindow *window)
556 g_warning ("NOT IMPLEMENTED %s", __FUNCTION__);
561 modest_msg_view_window_toggle_find_toolbar (GtkToggleAction *toggle,
564 g_warning ("NOT IMPLEMENTED %s", __FUNCTION__);
569 modest_msg_view_window_add_to_contacts (ModestMsgViewWindow *self)
571 modest_ui_actions_on_add_to_contacts (NULL, MODEST_WINDOW (self));
575 modest_msg_view_window_fetch_images (ModestMsgViewWindow *self)
577 ModestMsgViewWindowPrivate *priv;
578 priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (self);
580 modest_msg_view_request_fetch_images (MODEST_MSG_VIEW (priv->msg_view));
584 modest_msg_view_window_has_blocked_external_images (ModestMsgViewWindow *self)
586 ModestMsgViewWindowPrivate *priv;
587 priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (self);
589 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (self), FALSE);
591 return modest_msg_view_has_blocked_external_images (MODEST_MSG_VIEW (priv->msg_view));
595 modest_msg_view_window_reload (ModestMsgViewWindow *self)
597 /* Not implemented */