X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fgnome%2Fmodest-msg-view-window.c;h=000f0901dc875e9c3be822e6911d77fc51bf28a7;hp=d3b453aed8a31f62c3743012f4622f07ca37ccf9;hb=62fb96863939aea81ed8e45e1b2043d892e0978d;hpb=0d381d656787eec15e9e82b6018e985c70569376 diff --git a/src/gnome/modest-msg-view-window.c b/src/gnome/modest-msg-view-window.c index d3b453a..000f090 100644 --- a/src/gnome/modest-msg-view-window.c +++ b/src/gnome/modest-msg-view-window.c @@ -35,16 +35,22 @@ #include "modest-ui-actions.h" #include #include - +#include +#include "modest-msg-view-window-ui-dimming.h" +#include "modest-defs.h" #include #include #include "widgets/modest-msg-view.h" +#include "modest-ui-dimming-manager.h" static void modest_msg_view_window_class_init (ModestMsgViewWindowClass *klass); static void modest_msg_view_window_init (ModestMsgViewWindow *obj); static void modest_msg_view_window_finalize (GObject *obj); +static void modest_msg_view_window_toggle_find_toolbar (GtkToggleAction *toggle, + gpointer data); + /* list my signals */ enum { /* MY_SIGNAL_1, */ @@ -57,6 +63,9 @@ struct _ModestMsgViewWindowPrivate { GtkWidget *toolbar; GtkWidget *menubar; GtkWidget *msg_view; + + gchar *msg_uid; + TnyMimePart *other_body; }; #define MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \ @@ -65,36 +74,19 @@ struct _ModestMsgViewWindowPrivate { /* globals */ static GtkWindowClass *parent_class = NULL; -/* Action entries */ -static const GtkActionEntry modest_action_entries [] = { - - /* Toplevel menus */ - { "Edit", NULL, N_("_Edit") }, - { "Actions", NULL, N_("_Actions") }, - { "Help", NULL, N_("_Help") }, - - /* EDIT */ - { "EditUndo", GTK_STOCK_UNDO, N_("_Undo"), "Z", N_("Undo last action"), NULL }, - { "EditRedo", GTK_STOCK_REDO, N_("_Redo"), "Z", N_("Redo previous action"), NULL }, - { "EditCut", GTK_STOCK_CUT, N_("Cut"), "X", N_("_Cut"), NULL }, - { "EditCopy", GTK_STOCK_COPY, N_("Copy"), "C", N_("Copy"), NULL }, - { "EditPaste", GTK_STOCK_PASTE, N_("Paste"), "V", N_("Paste"), NULL }, - { "EditDelete", GTK_STOCK_DELETE, N_("_Delete"), "Q", N_("Delete"), NULL }, - { "EditSelectAll", NULL, N_("Select all"), "A", N_("Select all"), NULL }, - { "EditDeselectAll", NULL, N_("Deselect all"), "A", N_("Deselect all"), NULL }, - - /* ACTIONS */ - { "ActionsReply", MODEST_STOCK_REPLY, N_("_Reply"), NULL, N_("Reply to a message"), G_CALLBACK (modest_ui_actions_on_reply) }, - { "ActionsReplyAll", MODEST_STOCK_REPLY_ALL, N_("Reply to all"), NULL, N_("Reply to all"), G_CALLBACK (modest_ui_actions_on_reply_all) }, - { "ActionsForward", MODEST_STOCK_FORWARD, N_("_Forward"), NULL, N_("Forward a message"), G_CALLBACK (modest_ui_actions_on_forward) }, - { "ActionsBounce", NULL, N_("_Bounce"), NULL, N_("Bounce a message"), NULL }, - { "ActionsSendReceive", GTK_STOCK_REFRESH, N_("Send/Receive"), NULL, N_("Send and receive messages"), NULL }, - { "ActionsDelete", MODEST_STOCK_DELETE, N_("Delete message"), NULL, N_("Delete messages"), G_CALLBACK (modest_ui_actions_on_delete) }, - - /* HELP */ - { "HelpAbout", GTK_STOCK_ABOUT, N_("About"), NULL, N_("About Modest"), G_CALLBACK (modest_ui_actions_on_about) }, +static const GtkToggleActionEntry msg_view_toggle_action_entries [] = { + { "FindInMessage", GTK_STOCK_FIND, N_("mcen_me_viewer_find"), NULL, NULL, G_CALLBACK (modest_msg_view_window_toggle_find_toolbar), FALSE }, + { "ToolsFindInMessage", NULL, N_("mcen_me_viewer_find"), "F", NULL, G_CALLBACK (modest_msg_view_window_toggle_find_toolbar), FALSE }, }; +static const GtkRadioActionEntry msg_view_zoom_action_entries [] = { + { "Zoom50", NULL, N_("mcen_me_viewer_50"), NULL, NULL, 50 }, + { "Zoom80", NULL, N_("mcen_me_viewer_80"), NULL, NULL, 80 }, + { "Zoom100", NULL, N_("mcen_me_viewer_100"), NULL, NULL, 100 }, + { "Zoom120", NULL, N_("mcen_me_viewer_120"), NULL, NULL, 120 }, + { "Zoom150", NULL, N_("mcen_me_viewer_150"), NULL, NULL, 150 }, + { "Zoom200", NULL, N_("mcen_me_viewer_200"), NULL, NULL, 200 } +}; GType modest_msg_view_window_get_type (void) @@ -121,6 +113,23 @@ modest_msg_view_window_get_type (void) } static void +save_state (ModestWindow *self) +{ + modest_widget_memory_save (modest_runtime_get_conf (), + G_OBJECT(self), + MODEST_CONF_MSG_VIEW_WINDOW_KEY); +} + + +static void +restore_settings (ModestWindow *self) +{ + modest_widget_memory_restore (modest_runtime_get_conf (), + G_OBJECT(self), + MODEST_CONF_MSG_VIEW_WINDOW_KEY); +} + +static void modest_msg_view_window_class_init (ModestMsgViewWindowClass *klass) { GObjectClass *gobject_class; @@ -130,6 +139,9 @@ modest_msg_view_window_class_init (ModestMsgViewWindowClass *klass) gobject_class->finalize = modest_msg_view_window_finalize; g_type_class_add_private (gobject_class, sizeof(ModestMsgViewWindowPrivate)); + + ModestWindowClass *modest_window_class = (ModestWindowClass *) klass; + modest_window_class->save_state_func = save_state; } static void @@ -138,29 +150,16 @@ modest_msg_view_window_init (ModestMsgViewWindow *obj) ModestMsgViewWindowPrivate *priv; priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(obj); - priv->toolbar = NULL; - priv->menubar = NULL; - priv->msg_view = NULL; -} - -static void -save_settings (ModestMsgViewWindow *self) -{ - modest_widget_memory_save (modest_runtime_get_conf (), - G_OBJECT(self), "modest-msg-view-window"); -} - - -static void -restore_settings (ModestMsgViewWindow *self) -{ - modest_widget_memory_restore (modest_runtime_get_conf (), - G_OBJECT(self), "modest-msg-view-window"); + priv->toolbar = NULL; + priv->menubar = NULL; + priv->msg_view = NULL; + priv->msg_uid = NULL; + priv->other_body = NULL; } static void -init_window (ModestMsgViewWindow *obj, TnyMsg *msg) +init_window (ModestMsgViewWindow *obj, TnyMsg *msg, TnyMimePart *other_body) { GtkWidget *main_vbox, *scrolled_window; ModestMsgViewWindowPrivate *priv; @@ -169,17 +168,23 @@ init_window (ModestMsgViewWindow *obj, TnyMsg *msg) priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(obj); parent_priv = MODEST_WINDOW_GET_PRIVATE(obj); - priv->msg_view = modest_msg_view_new (msg); - main_vbox = gtk_vbox_new (FALSE, 6); + priv->msg_view = GTK_WIDGET (tny_platform_factory_new_msg_view (modest_tny_platform_factory_get_instance ())); + if (other_body) { + priv->other_body = g_object_ref (other_body); + modest_msg_view_set_msg_with_other_body (MODEST_MSG_VIEW (priv->msg_view), msg, other_body); + } else { + tny_msg_view_set_msg (TNY_MSG_VIEW (priv->msg_view), msg); + } + main_vbox = gtk_vbox_new (FALSE, 0); gtk_box_pack_start (GTK_BOX(main_vbox), priv->menubar, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX(main_vbox), priv->toolbar, FALSE, FALSE, 0); scrolled_window = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), - priv->msg_view); - gtk_box_pack_start (GTK_BOX(main_vbox), scrolled_window, TRUE, TRUE, 6); + gtk_container_add (GTK_CONTAINER (scrolled_window), + priv->msg_view); + gtk_box_pack_start (GTK_BOX(main_vbox), scrolled_window, TRUE, TRUE, 0); gtk_widget_show_all (GTK_WIDGET(main_vbox)); gtk_container_add (GTK_CONTAINER(obj), main_vbox); @@ -188,7 +193,16 @@ init_window (ModestMsgViewWindow *obj, TnyMsg *msg) static void modest_msg_view_window_finalize (GObject *obj) -{ +{ + ModestMsgViewWindowPrivate *priv; + + priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(obj); + + if (priv->other_body != NULL) { + g_object_unref (priv->other_body); + priv->other_body = NULL; + } + G_OBJECT_CLASS(parent_class)->finalize (obj); } @@ -197,19 +211,39 @@ modest_msg_view_window_finalize (GObject *obj) static gboolean on_delete_event (GtkWidget *widget, GdkEvent *event, ModestMsgViewWindow *self) { - save_settings (self); + modest_window_save_state (MODEST_WINDOW(self)); return FALSE; } +gboolean +modest_msg_view_window_is_other_body (ModestMsgViewWindow *self) +{ + ModestMsgViewWindowPrivate *priv = NULL; + + g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (self), FALSE); + priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (self); + + return (priv->other_body != NULL); +} + ModestWindow * -modest_msg_view_window_new (TnyMsg *msg, const gchar *account) +modest_msg_view_window_new_with_other_body (TnyMsg *msg, + TnyMimePart *other_body, + const gchar *modest_account_name, + const gchar *mailbox, /* ignored */ + const gchar *msg_uid) { GObject *obj; ModestMsgViewWindowPrivate *priv; ModestWindowPrivate *parent_priv; GtkActionGroup *action_group; GError *error = NULL; + TnyHeader *header = NULL; + gchar *subject = NULL; + ModestDimmingRulesGroup *menu_rules_group = NULL; + ModestDimmingRulesGroup *toolbar_rules_group = NULL; + ModestDimmingRulesGroup *clipboard_rules_group = NULL; g_return_val_if_fail (msg, NULL); @@ -217,16 +251,33 @@ modest_msg_view_window_new (TnyMsg *msg, const gchar *account) priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(obj); parent_priv = MODEST_WINDOW_GET_PRIVATE(obj); - modest_window_set_active_account (MODEST_WINDOW(obj), account); + priv->msg_uid = g_strdup (msg_uid); + + modest_window_set_active_account (MODEST_WINDOW(obj), modest_account_name); parent_priv->ui_manager = gtk_ui_manager_new(); action_group = gtk_action_group_new ("ModestMsgViewWindowActions"); + gtk_action_group_set_translation_domain (action_group, GETTEXT_PACKAGE); /* Add common actions */ gtk_action_group_add_actions (action_group, modest_action_entries, G_N_ELEMENTS (modest_action_entries), obj); + gtk_action_group_add_toggle_actions (action_group, + modest_toggle_action_entries, + G_N_ELEMENTS (modest_toggle_action_entries), + obj); + gtk_action_group_add_toggle_actions (action_group, + msg_view_toggle_action_entries, + G_N_ELEMENTS (msg_view_toggle_action_entries), + obj); + gtk_action_group_add_radio_actions (action_group, + msg_view_zoom_action_entries, + G_N_ELEMENTS (msg_view_zoom_action_entries), + 100, + G_CALLBACK (modest_ui_actions_on_change_zoom), + obj); gtk_ui_manager_insert_action_group (parent_priv->ui_manager, action_group, 0); g_object_unref (action_group); @@ -253,17 +304,79 @@ modest_msg_view_window_new (TnyMsg *msg, const gchar *account) gtk_toolbar_set_tooltips (GTK_TOOLBAR (priv->toolbar), TRUE); /* Init window */ - init_window (MODEST_MSG_VIEW_WINDOW(obj), msg); - restore_settings (MODEST_MSG_VIEW_WINDOW(obj)); + init_window (MODEST_MSG_VIEW_WINDOW(obj), msg, other_body); + restore_settings (MODEST_WINDOW(obj)); + + header = tny_msg_get_header (msg); + if (other_body) { + gchar *description; + + description = modest_tny_mime_part_get_header_value (other_body, "Content-Description"); + if (description) { + g_strstrip (description); + subject = description; + } + } else { + if (header) + subject = tny_header_dup_subject (header); + } + - gtk_window_set_title (GTK_WINDOW(obj), "Modest"); + if (subject != NULL) + gtk_window_set_title (GTK_WINDOW (obj), subject); + else + gtk_window_set_title (GTK_WINDOW(obj), "Modest"); + g_free (subject); + + if (header) + g_object_unref (header); + gtk_window_set_icon_from_file (GTK_WINDOW(obj), MODEST_APP_ICON, NULL); + parent_priv->ui_dimming_manager = modest_ui_dimming_manager_new(); + + menu_rules_group = modest_dimming_rules_group_new (MODEST_DIMMING_RULES_MENU, FALSE); + toolbar_rules_group = modest_dimming_rules_group_new (MODEST_DIMMING_RULES_TOOLBAR, TRUE); + clipboard_rules_group = modest_dimming_rules_group_new (MODEST_DIMMING_RULES_CLIPBOARD, FALSE); + + /* Add common dimming rules */ + modest_dimming_rules_group_add_rules (menu_rules_group, + modest_msg_view_menu_dimming_entries, + G_N_ELEMENTS (modest_msg_view_menu_dimming_entries), + MODEST_WINDOW (obj)); + modest_dimming_rules_group_add_rules (toolbar_rules_group, + modest_msg_view_toolbar_dimming_entries, + G_N_ELEMENTS (modest_msg_view_toolbar_dimming_entries), + MODEST_WINDOW (obj)); + modest_dimming_rules_group_add_rules (clipboard_rules_group, + modest_msg_view_clipboard_dimming_entries, + G_N_ELEMENTS (modest_msg_view_clipboard_dimming_entries), + MODEST_WINDOW (obj)); + + /* Insert dimming rules group for this window */ + modest_ui_dimming_manager_insert_rules_group (parent_priv->ui_dimming_manager, menu_rules_group); + modest_ui_dimming_manager_insert_rules_group (parent_priv->ui_dimming_manager, toolbar_rules_group); + modest_ui_dimming_manager_insert_rules_group (parent_priv->ui_dimming_manager, clipboard_rules_group); + g_object_unref (menu_rules_group); + g_object_unref (toolbar_rules_group); + g_object_unref (clipboard_rules_group); + g_signal_connect (G_OBJECT(obj), "delete-event", G_CALLBACK(on_delete_event), obj); return MODEST_WINDOW(obj); } +ModestWindow * +modest_msg_view_window_new_for_attachment (TnyMsg *msg, + const gchar *modest_account_name, + const gchar *mailbox, /* ignored */ + const gchar *msg_uid) +{ + + return modest_msg_view_window_new_with_other_body (msg, NULL, modest_account_name, mailbox, msg_uid); + +} + TnyMsg* modest_msg_view_window_get_message (ModestMsgViewWindow *self) @@ -273,5 +386,223 @@ modest_msg_view_window_get_message (ModestMsgViewWindow *self) msg_view = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(self)->msg_view; - return modest_msg_view_get_message (MODEST_MSG_VIEW(msg_view)); + return tny_msg_view_get_msg (TNY_MSG_VIEW(msg_view)); +} + +const gchar* +modest_msg_view_window_get_message_uid (ModestMsgViewWindow *self) +{ + ModestMsgViewWindowPrivate *priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (self); + TnyMsg *msg; + TnyHeader *header; + const gchar *retval = NULL; + + msg = tny_msg_view_get_msg (TNY_MSG_VIEW (priv->msg_view)); + msg = modest_msg_view_window_get_message (self); + + if (!msg) + return NULL; + + header = tny_msg_get_header (msg); + g_free (priv->msg_uid); + if (header) { + priv->msg_uid = tny_header_dup_uid (header); + g_object_unref (header); + } + g_object_unref (msg); + + return priv->msg_uid; +} + +ModestWindow * +modest_msg_view_window_new_from_uid (const gchar *modest_account_name, + const gchar *mailbox, + const gchar *msg_uid) +{ + /* NOT IMPLEMENTED */ + return NULL; +} + +ModestWindow* +modest_msg_view_window_new_with_header_model (TnyMsg *msg, + const gchar *modest_account_name, + const gchar *mailbox, /*ignored*/ + const gchar *msg_uid, + GtkTreeModel *model, + GtkTreeRowReference *row_reference) +{ + /* Currently we simply redirect to new constructor. It should store a + reference to the header list model, to enable next/prev message + actions */ + g_debug ("partially implemented %s", __FUNCTION__); + + return modest_msg_view_window_new_for_attachment (msg, modest_account_name, NULL, msg_uid); +} + + +gboolean +modest_msg_view_window_select_next_message (ModestMsgViewWindow *window) +{ + g_warning ("not implemented %s", __FUNCTION__); + return FALSE; +} + +gboolean +modest_msg_view_window_select_previous_message (ModestMsgViewWindow *window) +{ + g_warning ("not implemented %s", __FUNCTION__); + return FALSE; +} + +void +modest_msg_view_window_view_attachment (ModestMsgViewWindow *window, TnyMimePart *mime_part) +{ + g_warning ("not implemented %s", __FUNCTION__); +} + +void +modest_msg_view_window_save_attachments (ModestMsgViewWindow *window, TnyList *mime_parts) +{ + g_warning ("not implemented %s", __FUNCTION__); +} +void +modest_msg_view_window_remove_attachments (ModestMsgViewWindow *window, gboolean get_all) +{ + g_warning ("not implemented %s", __FUNCTION__); +} + +TnyHeader * +modest_msg_view_window_get_header (ModestMsgViewWindow *self) +{ + TnyMsg *msg; + TnyHeader *header = NULL; + + msg = modest_msg_view_window_get_message (self); + if (msg) { + header = tny_msg_get_header (msg); + g_object_unref (msg); + } + return header; +} + +TnyFolderType +modest_msg_view_window_get_folder_type (ModestMsgViewWindow *window) +{ + ModestMsgViewWindowPrivate *priv; + TnyMsg *msg; + TnyFolderType folder_type; + + priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window); + + folder_type = TNY_FOLDER_TYPE_UNKNOWN; + + msg = tny_msg_view_get_msg (TNY_MSG_VIEW (priv->msg_view)); + if (msg) { + TnyFolder *folder; + + folder = tny_msg_get_folder (msg); + if (folder) { + folder_type = tny_folder_get_folder_type (folder); + g_object_unref (folder); + } + g_object_unref (msg); + } + + return folder_type; +} + +/* NOT IMPLEMENTED METHODS */ + +gboolean +modest_msg_view_window_last_message_selected (ModestMsgViewWindow *window) +{ + g_warning ("NOT IMPLEMENTED %s", __FUNCTION__); + return TRUE; +} + +gboolean +modest_msg_view_window_first_message_selected (ModestMsgViewWindow *window) +{ + g_warning ("NOT IMPLEMENTED %s", __FUNCTION__); + return TRUE; +} + +gboolean +modest_msg_view_window_transfer_mode_enabled (ModestMsgViewWindow *self) +{ + g_warning ("NOT IMPLEMENTED %s", __FUNCTION__); + return FALSE; +} + +gboolean +modest_msg_view_window_toolbar_on_transfer_mode (ModestMsgViewWindow *self) +{ + g_warning ("NOT IMPLEMENTED %s", __FUNCTION__); + return FALSE; +} + + +TnyList * +modest_msg_view_window_get_attachments (ModestMsgViewWindow *win) +{ + TnyList *result; + + result = tny_simple_list_new (); + g_warning ("NOT IMPLEMENTED %s", __FUNCTION__); + return result; +} + +gboolean +modest_msg_view_window_is_search_result (ModestMsgViewWindow *window) +{ + g_warning ("NOT IMPLEMENTED %s", __FUNCTION__); + return FALSE; +} + +gboolean +modest_msg_view_window_has_headers_model (ModestMsgViewWindow *window) +{ + g_warning ("NOT IMPLEMENTED %s", __FUNCTION__); + return FALSE; +} + +static void +modest_msg_view_window_toggle_find_toolbar (GtkToggleAction *toggle, + gpointer data) +{ + g_warning ("NOT IMPLEMENTED %s", __FUNCTION__); + return FALSE; +} + +void +modest_msg_view_window_add_to_contacts (ModestMsgViewWindow *self) +{ + modest_ui_actions_on_add_to_contacts (NULL, MODEST_WINDOW (self)); +} + +void +modest_msg_view_window_fetch_images (ModestMsgViewWindow *self) +{ + ModestMsgViewWindowPrivate *priv; + priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (self); + + modest_msg_view_request_fetch_images (MODEST_MSG_VIEW (priv->msg_view)); +} + +gboolean +modest_msg_view_window_has_blocked_external_images (ModestMsgViewWindow *self) +{ + ModestMsgViewWindowPrivate *priv; + priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (self); + + g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (self), FALSE); + + return modest_msg_view_has_blocked_external_images (MODEST_MSG_VIEW (priv->msg_view)); +} + +void +modest_msg_view_window_reload (ModestMsgViewWindow *self) +{ + /* Not implemented */ + return; }