From fcbac814e10741c98a721bf4198b4238d64e57d8 Mon Sep 17 00:00:00 2001 From: Javier Fernandez Garcia-Boente Date: Tue, 12 Jun 2007 14:29:46 +0000 Subject: [PATCH] * Fixed bug in empty_view of headers treeview when selected folder is empty. * Fixes: NB#60141, NB#60144 pmo-trunk-r2183 --- src/maemo/modest-main-window-ui.h | 14 +- src/maemo/modest-main-window.c | 41 ++++ src/maemo/modest-msg-view-window-ui-dimming.h | 18 +- src/maemo/modest-msg-view-window.c | 200 +++------------- src/modest-mail-operation.c | 48 +++- src/modest-tny-msg.c | 38 +-- src/modest-ui-actions.c | 56 +++-- src/modest-ui-actions.h | 12 + src/modest-ui-dimming-rules.c | 307 +++++++++++++++++++++---- src/modest-ui-dimming-rules.h | 6 + src/widgets/modest-header-view.c | 138 +++++++++-- src/widgets/modest-header-view.h | 11 +- src/widgets/modest-main-window.h | 1 + src/widgets/modest-msg-view-window.h | 46 +++- 14 files changed, 638 insertions(+), 298 deletions(-) diff --git a/src/maemo/modest-main-window-ui.h b/src/maemo/modest-main-window-ui.h index 00fc7a2..dc30576 100644 --- a/src/maemo/modest-main-window-ui.h +++ b/src/maemo/modest-main-window-ui.h @@ -40,13 +40,13 @@ G_BEGIN_DECLS static const GtkActionEntry modest_action_entries [] = { /* Toplevel menus */ - { "Email", NULL, N_("mcen_me_inbox_email"), NULL, NULL, G_CALLBACK (modest_ui_actions_on_email_menu_activated) }, - { "Edit", NULL, N_("mcen_me_inbox_edit"), NULL, NULL, G_CALLBACK (modest_ui_actions_on_edit_menu_activated) }, - { "View", NULL, N_("mcen_me_inbox_view") }, - { "Tools", NULL, N_("mcen_me_inbox_tools") }, - { "Attachments", NULL, N_("mcen_me_viewer_attachments") }, - { "Close", NULL, N_("mcen_me_inbox_close") }, - { "Zoom", NULL, N_("Zoom") }, + { "Email", NULL, N_("mcen_me_inbox_email"), NULL, NULL, G_CALLBACK (modest_ui_actions_on_email_menu_activated) }, + { "Edit", NULL, N_("mcen_me_inbox_edit"), NULL, NULL, G_CALLBACK (modest_ui_actions_on_edit_menu_activated) }, + { "View", NULL, N_("mcen_me_inbox_view"), NULL, NULL, G_CALLBACK (modest_ui_actions_on_view_menu_activated) }, + { "Tools", NULL, N_("mcen_me_inbox_tools"), NULL, NULL, G_CALLBACK (modest_ui_actions_on_tools_menu_activated) }, + { "Attachments", NULL, N_("mcen_me_viewer_attachments"), NULL, NULL, G_CALLBACK (modest_ui_actions_on_attachment_menu_activated) }, + { "Close", NULL, N_("mcen_me_inbox_close") }, + { "Zoom", NULL, N_("Zoom") }, /* Zoom and fullscreen keyboard actions*/ { "ZoomPlus", NULL, N_("Zoom +"), "F7", NULL, G_CALLBACK (modest_ui_actions_on_zoom_plus) }, diff --git a/src/maemo/modest-main-window.c b/src/maemo/modest-main-window.c index 79a9f49..63191d5 100644 --- a/src/maemo/modest-main-window.c +++ b/src/maemo/modest-main-window.c @@ -123,6 +123,12 @@ static void on_refresh_account_action_activated (GtkAction *action, static void on_send_receive_csm_activated (GtkMenuItem *item, gpointer user_data); +static void +_on_msg_count_changed (ModestHeaderView *header_view, + TnyFolder *folder, + TnyFolderChange *change, + ModestMainWindow *main_window); + static GtkWidget * create_empty_view (void); @@ -518,6 +524,8 @@ connect_signals (ModestMainWindow *self) G_CALLBACK(modest_ui_actions_on_item_not_found), self); g_signal_connect (G_OBJECT(priv->header_view), "key-press-event", G_CALLBACK(on_inner_widgets_key_pressed), self); + g_signal_connect (G_OBJECT(priv->header_view), "msg_count_changed", + G_CALLBACK(_on_msg_count_changed), self); /* Header view CSM */ menu = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/HeaderViewCSM"); @@ -1425,6 +1433,39 @@ modest_main_window_notify_send_receive_completed (ModestMainWindow *self) } +static void +_on_msg_count_changed (ModestHeaderView *header_view, + TnyFolder *folder, + TnyFolderChange *change, + ModestMainWindow *main_window) +{ + gboolean folder_empty = FALSE; + TnyFolderChangeChanged changed; + + g_return_if_fail (MODEST_IS_MAIN_WINDOW (main_window)); + g_return_if_fail (TNY_IS_FOLDER(folder)); + g_return_if_fail (TNY_IS_FOLDER_CHANGE(change)); + + changed = tny_folder_change_get_changed (change); + + /* If something changes */ + if ((changed) & TNY_FOLDER_CHANGE_CHANGED_ALL_COUNT) + folder_empty = (tny_folder_change_get_new_all_count (change) == 0); + else + folder_empty = (tny_folder_get_all_count (TNY_FOLDER (folder)) == 0); + + /* Set contents style of headers view */ + if (folder_empty) { + modest_main_window_set_contents_style (main_window, + MODEST_MAIN_WINDOW_CONTENTS_STYLE_EMPTY); + } + else { + modest_main_window_set_contents_style (main_window, + MODEST_MAIN_WINDOW_CONTENTS_STYLE_HEADERS); + } + +} + void modest_main_window_set_contents_style (ModestMainWindow *self, ModestMainWindowContentsStyle style) diff --git a/src/maemo/modest-msg-view-window-ui-dimming.h b/src/maemo/modest-msg-view-window-ui-dimming.h index 7ed4e13..3f2cba2 100644 --- a/src/maemo/modest-msg-view-window-ui-dimming.h +++ b/src/maemo/modest-msg-view-window-ui-dimming.h @@ -21,7 +21,7 @@ static const ModestDimmingEntry modest_msg_view_menu_dimming_entries [] = { /* Edit Menu */ { "/MenuBar/EditMenu", NULL }, { "/MenuBar/EditMenu/EditCutMenu", G_CALLBACK(modest_ui_dimming_rules_always_dimmed) }, - { "/MenuBar/EditMenu/EditCopyMenu", NULL }, + { "/MenuBar/EditMenu/EditCopyMenu", G_CALLBACK(modest_ui_dimming_rules_on_copy) }, { "/MenuBar/EditMenu/EditPasteMenu", G_CALLBACK(modest_ui_dimming_rules_always_dimmed) }, { "/MenuBar/EditMenu/EditSelectAllMenu", NULL }, { "/MenuBar/EditMenu/EditMoveToMenu", G_CALLBACK(modest_ui_dimming_rules_on_move_to) }, @@ -30,18 +30,18 @@ static const ModestDimmingEntry modest_msg_view_menu_dimming_entries [] = { { "/MenuBar/ViewMenu", NULL }, { "/MenuBar/ViewMenu/ZoomMenu", NULL }, { "/MenuBar/ViewMenu/ViewToggleFullscreenMenu", NULL }, - { "/MenuBar/ViewMenu/ViewPreviousMessageMenu", NULL }, - { "/MenuBar/ViewMenu/ViewNextMessageMenu", NULL }, + { "/MenuBar/ViewMenu/ViewPreviousMessageMenu", G_CALLBACK(modest_ui_dimming_rules_on_view_previous) }, + { "/MenuBar/ViewMenu/ViewNextMessageMenu", G_CALLBACK(modest_ui_dimming_rules_on_view_next)}, /* Attachments Menu */ { "/MenuBar/AttachmentsMenu", NULL }, - { "/MenuBar/AttachmentsMenu/ViewAttachmentMenu", NULL }, - { "/MenuBar/AttachmentsMenu/SaveAttachmentMenu", NULL }, - { "/MenuBar/AttachmentsMenu/RemoveAttachmentMenu", NULL }, + { "/MenuBar/AttachmentsMenu/ViewAttachmentMenu", G_CALLBACK(modest_ui_dimming_rules_on_view_attachments) }, + { "/MenuBar/AttachmentsMenu/SaveAttachmentMenu", G_CALLBACK(modest_ui_dimming_rules_on_view_attachments) }, + { "/MenuBar/AttachmentsMenu/RemoveAttachmentMenu", G_CALLBACK(modest_ui_dimming_rules_on_remove_attachments) }, /* Tools Menu */ { "/MenuBar/ToolsMenu", NULL }, - { "/MenuBar/ToolsMenu/ToolsContactsMenu", NULL }, + { "/MenuBar/ToolsMenu/ToolsContactsMenu", }, /* Close Menu */ { "/MenuBar/CloseMenu", NULL }, @@ -64,8 +64,8 @@ static const ModestDimmingEntry modest_msg_view_toolbar_dimming_entries [] = { { "/Toolbar/ToolbarDeleteMessage", G_CALLBACK(modest_ui_dimming_rules_on_delete_msg) }, { "/Toolbar/ToolbarMoveTo", G_CALLBACK(modest_ui_dimming_rules_on_move_to) }, { "/Toolbar/ToolbarFindInMessage", NULL }, - { "/Toolbar/ToolbarMessageBack", NULL }, - { "/Toolbar/ToolbarMessageNext", NULL }, + { "/Toolbar/ToolbarMessageBack", G_CALLBACK(modest_ui_dimming_rules_on_view_previous) }, + { "/Toolbar/ToolbarMessageNext", G_CALLBACK(modest_ui_dimming_rules_on_view_next) }, { "/Toolbar/ToolbarCancel", NULL }, }; diff --git a/src/maemo/modest-msg-view-window.c b/src/maemo/modest-msg-view-window.c index 14e9e1b..50d001b 100644 --- a/src/maemo/modest-msg-view-window.c +++ b/src/maemo/modest-msg-view-window.c @@ -77,10 +77,6 @@ static gboolean modest_msg_view_window_window_state_event (GtkWidget *widget, gpointer userdata); static void modest_msg_view_window_scroll_up (ModestWindow *window); static void modest_msg_view_window_scroll_down (ModestWindow *window); -static gboolean modest_msg_view_window_is_last_message (ModestMsgViewWindow *window); -static gboolean modest_msg_view_window_is_first_message (ModestMsgViewWindow *window); -static TnyFolderType modest_msg_view_window_get_folder_type (ModestMsgViewWindow *window); -static void modest_msg_view_window_update_dimmed (ModestMsgViewWindow *window); static void modest_msg_view_window_update_priority (ModestMsgViewWindow *window); static void modest_msg_view_window_show_toolbar (ModestWindow *window, @@ -105,8 +101,6 @@ static void set_toolbar_mode (ModestMsgViewWindow *self, static gboolean set_toolbar_transfer_mode (ModestMsgViewWindow *self); -static void view_attachment_insensitive_press (GtkWidget *widget, ModestMsgViewWindow *window); -static void save_attachment_insensitive_press (GtkWidget *widget, ModestMsgViewWindow *window); static void update_window_title (ModestMsgViewWindow *window); @@ -494,8 +488,6 @@ modest_msg_view_window_new_with_header_model (TnyMsg *msg, modest_msg_view_window_update_priority (window); - modest_msg_view_window_update_dimmed (window); - return MODEST_WINDOW(window); } @@ -514,8 +506,6 @@ modest_msg_view_window_new (TnyMsg *msg, GtkActionGroup *action_group = NULL; GError *error = NULL; GdkPixbuf *window_icon = NULL; - GtkAction *action = NULL; - GtkWidget *widget = NULL; g_return_val_if_fail (msg, NULL); @@ -623,29 +613,12 @@ modest_msg_view_window_new (TnyMsg *msg, priv->last_search = NULL; - modest_msg_view_window_update_dimmed (MODEST_MSG_VIEW_WINDOW (obj)); /* Set window icon */ window_icon = modest_platform_get_icon (MODEST_APP_MSG_VIEW_ICON); gtk_window_set_icon (GTK_WINDOW (obj), window_icon); /* Init the clipboard actions dim status */ - action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/EditMenu/EditCopyMenu"); - gtk_action_set_sensitive (action, FALSE); - - action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/EditMenu/EditCutMenu"); - gtk_action_set_sensitive (action, FALSE); - - /* also set the add to contacts status to false as it depends on clipboard status */ - action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/ToolsMenu/ToolsAddToContactsMenu"); - gtk_action_set_sensitive (action, FALSE); - - /* insensitive handlers */ - widget = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/MenuBar/AttachmentsMenu/ViewAttachmentMenu"); - g_signal_connect (G_OBJECT (widget), "insensitive-press", G_CALLBACK (view_attachment_insensitive_press), self); - widget = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/MenuBar/AttachmentsMenu/SaveAttachmentMenu"); - g_signal_connect (G_OBJECT (widget), "insensitive-press", G_CALLBACK (save_attachment_insensitive_press), self); - gtk_widget_grab_focus (priv->msg_view); update_window_title (MODEST_MSG_VIEW_WINDOW (obj)); @@ -887,8 +860,8 @@ modest_msg_view_window_scroll_down (ModestWindow *window) g_signal_emit_by_name (G_OBJECT (priv->main_scroll), "scroll-child", GTK_SCROLL_STEP_DOWN, FALSE); } -static gboolean -modest_msg_view_window_is_last_message (ModestMsgViewWindow *window) +gboolean +modest_msg_view_window_last_message_selected (ModestMsgViewWindow *window) { GtkTreePath *path; ModestMsgViewWindowPrivate *priv; @@ -922,8 +895,19 @@ modest_msg_view_window_is_last_message (ModestMsgViewWindow *window) } -static gboolean -modest_msg_view_window_is_first_message (ModestMsgViewWindow *window) +gboolean +modest_msg_view_window_has_headers_model (ModestMsgViewWindow *window) +{ + ModestMsgViewWindowPrivate *priv; + + g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (window), TRUE); + priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window); + + return priv->header_model != NULL; +} + +gboolean +modest_msg_view_window_first_message_selected (ModestMsgViewWindow *window) { GtkTreePath *path; ModestMsgViewWindowPrivate *priv; @@ -1139,13 +1123,12 @@ view_msg_cb (ModestMailOperation *mail_op, /* Set new message */ modest_msg_view_set_message (MODEST_MSG_VIEW (priv->msg_view), msg); - modest_msg_view_window_update_dimmed (self); modest_msg_view_window_update_priority (self); update_window_title (MODEST_MSG_VIEW_WINDOW (self)); gtk_widget_grab_focus (priv->msg_view); } -static TnyFolderType +TnyFolderType modest_msg_view_window_get_folder_type (ModestMsgViewWindow *window) { ModestMsgViewWindowPrivate *priv; @@ -1178,77 +1161,6 @@ modest_msg_view_window_get_folder_type (ModestMsgViewWindow *window) return folder_type; } -static void -modest_msg_view_window_update_dimmed (ModestMsgViewWindow *window) -{ - ModestWindowPrivate *parent_priv; - ModestMsgViewWindowPrivate *priv; - GtkAction *widget; - gboolean is_first, is_last; - TnyFolderType folder_type; - gboolean is_not_sent; - GList *attachments, *node; - gint n_selected; - gboolean selected_messages = FALSE; - gboolean nested_attachments = FALSE; - - parent_priv = MODEST_WINDOW_GET_PRIVATE (window); - priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window); - - is_first = modest_msg_view_window_is_first_message (window); - is_last = modest_msg_view_window_is_last_message (window); - - widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarMessageBack"); - gtk_action_set_sensitive (widget, !is_first); - widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/ViewMenu/ViewPreviousMessageMenu"); - gtk_action_set_sensitive (widget, !is_first); - - widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarMessageNext"); - gtk_action_set_sensitive (widget, !is_last); - widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/ViewMenu/ViewNextMessageMenu"); - gtk_action_set_sensitive (widget, !is_last); - - folder_type = modest_msg_view_window_get_folder_type (MODEST_MSG_VIEW_WINDOW (window)); - is_not_sent = ((folder_type == TNY_FOLDER_TYPE_DRAFTS)||(folder_type == TNY_FOLDER_TYPE_OUTBOX)); - widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarMessageReply"); - gtk_action_set_sensitive (widget, !is_not_sent); - widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/MessageMenu/MessageReplyMenu"); - gtk_action_set_sensitive (widget, !is_not_sent); - widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/MessageMenu/MessageReplyAllMenu"); - gtk_action_set_sensitive (widget, !is_not_sent); - widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/MessageMenu/MessageForwardMenu"); - gtk_action_set_sensitive (widget, !is_not_sent); - - /* Attachment actions dimming */ - attachments = modest_msg_view_get_selected_attachments (MODEST_MSG_VIEW (priv->msg_view)); - n_selected = g_list_length (attachments); - for (node = attachments; node != NULL; node = g_list_next (node)) { - TnyMimePart *mime_part = TNY_MIME_PART (node->data); - TnyList *nested_list = tny_simple_list_new (); - if (!tny_mime_part_is_attachment (mime_part)) { - selected_messages = TRUE; - break; - } - tny_mime_part_get_parts (mime_part, nested_list); - if (tny_list_get_length (nested_list) > 0) - nested_attachments = TRUE; - g_object_unref (nested_list); - } - g_list_free (attachments); - - widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/AttachmentsMenu/ViewAttachmentMenu"); - gtk_action_set_sensitive (widget, n_selected == 1); - widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/AttachmentsMenu/SaveAttachmentMenu"); - gtk_action_set_sensitive (widget, (n_selected > 0) && (!selected_messages) && (!nested_attachments)); - - /* Dimming depending of message being an attachment or not. It's not an attachment if - * we opened it outside a folder view */ - widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/MessageMenu/MessageDeleteMenu"); - gtk_action_set_sensitive (widget, priv->header_model != NULL); - widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/EditMenu/EditMoveToMenu"); - gtk_action_set_sensitive (widget, priv->header_model != NULL); - -} static void modest_msg_view_window_update_priority (ModestMsgViewWindow *window) @@ -1404,7 +1316,7 @@ modest_msg_view_window_clipboard_owner_change (GtkClipboard *clipboard, ModestMsgViewWindow *window) { ModestWindowPrivate *parent_priv; - GtkAction *action; +/* GtkAction *action; */ gboolean is_address; gchar *selection; GtkWidget *focused; @@ -1414,19 +1326,19 @@ modest_msg_view_window_clipboard_owner_change (GtkClipboard *clipboard, is_address = ((selection != NULL) && (modest_text_utils_validate_recipient (selection))); - action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/ToolsMenu/ToolsAddToContactsMenu"); - gtk_action_set_sensitive (action, is_address); +/* action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/ToolsMenu/ToolsAddToContactsMenu"); */ +/* gtk_action_set_sensitive (action, is_address); */ focused = gtk_window_get_focus (GTK_WINDOW (window)); - action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/EditMenu/EditCopyMenu"); - gtk_action_set_sensitive (action, (selection != NULL) && (!MODEST_IS_ATTACHMENTS_VIEW (focused))); +/* action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/EditMenu/EditCopyMenu"); */ +/* gtk_action_set_sensitive (action, (selection != NULL) && (!MODEST_IS_ATTACHMENTS_VIEW (focused))); */ - action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/EditMenu/EditCutMenu"); - gtk_action_set_sensitive (action, (selection != NULL) && (!MODEST_IS_ATTACHMENTS_VIEW (focused))); +/* action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/EditMenu/EditCutMenu"); */ +/* gtk_action_set_sensitive (action, (selection != NULL) && (!MODEST_IS_ATTACHMENTS_VIEW (focused))); */ g_free (selection); - modest_msg_view_window_update_dimmed (window); +/* modest_msg_view_window_update_dimmed (window); */ } @@ -1532,6 +1444,20 @@ on_queue_changed (ModestMailOperationQueue *queue, } } +GList * +modest_msg_view_window_get_attachments (ModestMsgViewWindow *win) +{ + ModestMsgViewWindowPrivate *priv; + GList *selected_attachments = NULL; + + g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), NULL); + priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (win); + + selected_attachments = modest_msg_view_get_selected_attachments (MODEST_MSG_VIEW (priv->msg_view)); + + return selected_attachments; +} + void modest_msg_view_window_view_attachment (ModestMsgViewWindow *window, TnyMimePart *mime_part) { @@ -1746,56 +1672,6 @@ modest_msg_view_window_remove_attachments (ModestMsgViewWindow *window, GList *m /* g_message ("not implemented %s", __FUNCTION__); */ } -static void -view_attachment_insensitive_press (GtkWidget *widget, ModestMsgViewWindow *window) -{ - GList *attachments = NULL; - ModestMsgViewWindowPrivate *priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window); - - attachments = modest_msg_view_get_selected_attachments (MODEST_MSG_VIEW (priv->msg_view)); - if (g_list_length (attachments) > 1) - hildon_banner_show_information (NULL, NULL, _("mcen_ib_unable_to_display_more")); - - g_list_free (attachments); - -} - -static void -save_attachment_insensitive_press (GtkWidget *widget, ModestMsgViewWindow *window) -{ - GList *attachments = NULL; - ModestMsgViewWindowPrivate *priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window); - gboolean selected_messages = FALSE; - gboolean nested_attachments = FALSE; - gint n_selected = 0; - GList *node = NULL; - - attachments = modest_msg_view_get_selected_attachments (MODEST_MSG_VIEW (priv->msg_view)); - n_selected = g_list_length (attachments); - for (node = attachments; node != NULL; node = g_list_next (node)) { - TnyMimePart *mime_part = TNY_MIME_PART (node->data); - TnyList *nested_list = tny_simple_list_new (); - if (!tny_mime_part_is_attachment (mime_part)) { - selected_messages = TRUE; - break; - } - tny_mime_part_get_parts (mime_part, nested_list); - if (tny_list_get_length (nested_list) > 0) - nested_attachments = TRUE; - g_object_unref (nested_list); - } - g_list_free (attachments); - if (selected_messages) { - hildon_banner_show_information (NULL, NULL, _("mcen_ib_unable_to_save_attach_mail")); - } else if (nested_attachments) { - hildon_banner_show_information (NULL, NULL, _("FIXME:unable to save attachments with nested elements")); - } else if (n_selected == 0) { - hildon_banner_show_information (NULL, NULL, _("FIXME:no attachment selected")); - } - - return ; - -} static void update_window_title (ModestMsgViewWindow *window) diff --git a/src/modest-mail-operation.c b/src/modest-mail-operation.c index b645273..2ff8baa 100644 --- a/src/modest-mail-operation.c +++ b/src/modest-mail-operation.c @@ -109,6 +109,12 @@ typedef struct _GetMsgAsyncHelper { gpointer user_data; } GetMsgAsyncHelper; +typedef struct _RefreshAsyncHelper { + ModestMailOperation *mail_op; + RefreshAsyncUserCallback user_callback; + gpointer user_data; +} RefreshAsyncHelper; + typedef struct _XFerMsgAsyncHelper { ModestMailOperation *mail_op; @@ -336,7 +342,7 @@ modest_mail_operation_cancel (ModestMailOperation *self) priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self); /* cancel current operation in account */ - tny_account_cancel (priv->account); + //tny_account_cancel (priv->account); did_a_cancel = TRUE; @@ -1976,10 +1982,12 @@ on_refresh_folder (TnyFolder *folder, GError **error, gpointer user_data) { - ModestMailOperation *self; - ModestMailOperationPrivate *priv; + RefreshAsyncHelper *helper = NULL; + ModestMailOperation *self = NULL; + ModestMailOperationPrivate *priv = NULL; - self = MODEST_MAIL_OPERATION (user_data); + helper = (RefreshAsyncHelper *) user_data; + self = helper->mail_op; priv = MODEST_MAIL_OPERATION_GET_PRIVATE(self); if (*error) { @@ -1999,8 +2007,14 @@ on_refresh_folder (TnyFolder *folder, priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS; + /* Call user defined callback, if it exists */ + if (helper->user_callback) + helper->user_callback (priv->source, folder, helper->user_data); + out: /* Free */ + g_object_unref (helper->mail_op); + g_slice_free (RefreshAsyncHelper, helper); g_object_unref (folder); /* Notify about operation end */ @@ -2012,14 +2026,19 @@ on_refresh_folder_status_update (GObject *obj, TnyStatus *status, gpointer user_data) { - ModestMailOperation *self; - ModestMailOperationPrivate *priv; + RefreshAsyncHelper *helper = NULL; + ModestMailOperation *self = NULL; + ModestMailOperationPrivate *priv = NULL; ModestMailOperationState *state; + g_return_if_fail (user_data != NULL); g_return_if_fail (status != NULL); g_return_if_fail (status->code == TNY_FOLDER_STATUS_CODE_REFRESH); - self = MODEST_MAIL_OPERATION (user_data); + helper = (RefreshAsyncHelper *) user_data; + self = helper->mail_op; + g_return_if_fail (MODEST_IS_MAIL_OPERATION(self)); + priv = MODEST_MAIL_OPERATION_GET_PRIVATE(self); priv->done = status->position; @@ -2032,9 +2051,12 @@ on_refresh_folder_status_update (GObject *obj, void modest_mail_operation_refresh_folder (ModestMailOperation *self, - TnyFolder *folder) + TnyFolder *folder, + RefreshAsyncUserCallback user_callback, + gpointer user_data) { - ModestMailOperationPrivate *priv; + ModestMailOperationPrivate *priv = NULL; + RefreshAsyncHelper *helper = NULL; priv = MODEST_MAIL_OPERATION_GET_PRIVATE(self); @@ -2046,13 +2068,19 @@ modest_mail_operation_refresh_folder (ModestMailOperation *self, /* Get account and set it into mail_operation */ priv->account = modest_tny_folder_get_account (folder); + /* Create the helper */ + helper = g_slice_new0 (RefreshAsyncHelper); + helper->mail_op = g_object_ref(self); + helper->user_callback = user_callback; + helper->user_data = user_data; + /* Refresh the folder. TODO: tinymail could issue a status updates before the callback call then this could happen. We must review the design */ tny_folder_refresh_async (folder, on_refresh_folder, on_refresh_folder_status_update, - self); + helper); } /** diff --git a/src/modest-tny-msg.c b/src/modest-tny-msg.c index 675fce3..52890f3 100644 --- a/src/modest-tny-msg.c +++ b/src/modest-tny-msg.c @@ -66,13 +66,18 @@ modest_tny_msg_new (const gchar* mailto, const gchar* from, const gchar *cc, new_msg = tny_platform_factory_new_msg (fact); header = tny_msg_get_header (new_msg); - tny_header_set_from (TNY_HEADER (header), from); - tny_header_set_replyto (TNY_HEADER (header), from); - tny_header_set_to (TNY_HEADER (header), mailto); - tny_header_set_cc (TNY_HEADER (header), cc); - tny_header_set_bcc (TNY_HEADER (header), bcc); - - if (subject) + if ((from != NULL) && (strlen(from) > 0)) { + tny_header_set_from (TNY_HEADER (header), from); + tny_header_set_replyto (TNY_HEADER (header), from); + } + if ((mailto != NULL) && (strlen(mailto) > 0)) + tny_header_set_to (TNY_HEADER (header), mailto); + if ((cc != NULL) && (strlen(cc) > 0)) + tny_header_set_cc (TNY_HEADER (header), cc); + if ((bcc != NULL) && (strlen(bcc) > 0)) + tny_header_set_bcc (TNY_HEADER (header), bcc); + + if ((subject != NULL) && (strlen(subject) > 0)) tny_header_set_subject (TNY_HEADER (header), subject); content_type = get_content_type(body); @@ -105,12 +110,19 @@ modest_tny_msg_new_html_plain (const gchar* mailto, const gchar* from, const gch new_msg = tny_platform_factory_new_msg (fact); header = tny_msg_get_header (new_msg); - tny_header_set_from (TNY_HEADER (header), from); - tny_header_set_replyto (TNY_HEADER (header), from); - tny_header_set_to (TNY_HEADER (header), mailto); - tny_header_set_cc (TNY_HEADER (header), cc); - tny_header_set_bcc (TNY_HEADER (header), bcc); - tny_header_set_subject (TNY_HEADER (header), subject); + if ((from != NULL) && (strlen(from) > 0)) { + tny_header_set_from (TNY_HEADER (header), from); + tny_header_set_replyto (TNY_HEADER (header), from); + } + if ((mailto != NULL) && (strlen(mailto) > 0)) + tny_header_set_to (TNY_HEADER (header), mailto); + if ((cc != NULL) && (strlen(cc) > 0)) + tny_header_set_cc (TNY_HEADER (header), cc); + if ((bcc != NULL) && (strlen(bcc) > 0)) + tny_header_set_bcc (TNY_HEADER (header), bcc); + + if ((subject != NULL) && (strlen(subject) > 0)) + tny_header_set_subject (TNY_HEADER (header), subject); content_type = get_content_type(plain_body); diff --git a/src/modest-ui-actions.c b/src/modest-ui-actions.c index 98593ab..1e6d467 100644 --- a/src/modest-ui-actions.c +++ b/src/modest-ui-actions.c @@ -1233,7 +1233,6 @@ modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view, { ModestConf *conf; GtkWidget *header_view; - gboolean folder_empty = FALSE; g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window)); @@ -1258,24 +1257,21 @@ modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view, set_active_account_from_tny_account (account, MODEST_WINDOW (main_window)); g_object_unref (account); } - - + /* Set folder on header view */ modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view), TNY_FOLDER (folder_store)); - + + /* Resore configuration */ + modest_widget_memory_restore (conf, G_OBJECT(header_view), + MODEST_CONF_HEADER_VIEW_KEY); + /* Set main view style */ - folder_empty = tny_folder_get_all_count (TNY_FOLDER (folder_store)) == 0; - if (folder_empty) { - modest_main_window_set_contents_style (main_window, - MODEST_MAIN_WINDOW_CONTENTS_STYLE_EMPTY); - } - else { - modest_main_window_set_contents_style (main_window, - MODEST_MAIN_WINDOW_CONTENTS_STYLE_HEADERS); - modest_widget_memory_restore (conf, G_OBJECT(header_view), - MODEST_CONF_HEADER_VIEW_KEY); - } +/* modest_main_window_set_contents_style (main_window, */ +/* MODEST_MAIN_WINDOW_CONTENTS_STYLE_HEADERS); */ +/* modest_widget_memory_restore (conf, G_OBJECT(header_view), */ +/* MODEST_CONF_HEADER_VIEW_KEY); */ + } else { /* Update the active account */ modest_window_set_active_account (MODEST_WINDOW (main_window), NULL); @@ -3012,6 +3008,36 @@ modest_ui_actions_on_edit_menu_activated (GtkAction *action, } void +modest_ui_actions_on_view_menu_activated (GtkAction *action, + ModestWindow *window) +{ + g_return_if_fail (MODEST_IS_WINDOW (window)); + + /* Update dimmed */ + modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules"); +} + +void +modest_ui_actions_on_tools_menu_activated (GtkAction *action, + ModestWindow *window) +{ + g_return_if_fail (MODEST_IS_WINDOW (window)); + + /* Update dimmed */ + modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules"); +} + +void +modest_ui_actions_on_attachment_menu_activated (GtkAction *action, + ModestWindow *window) +{ + g_return_if_fail (MODEST_IS_WINDOW (window)); + + /* Update dimmed */ + modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules"); +} + +void modest_ui_actions_on_toolbar_csm_menu_activated (GtkAction *action, ModestWindow *window) { diff --git a/src/modest-ui-actions.h b/src/modest-ui-actions.h index 69b4784..a770e78 100644 --- a/src/modest-ui-actions.h +++ b/src/modest-ui-actions.h @@ -343,6 +343,18 @@ modest_ui_actions_on_edit_menu_activated (GtkAction *action, ModestWindow *window); void +modest_ui_actions_on_view_menu_activated (GtkAction *action, + ModestWindow *window); + +void +modest_ui_actions_on_tools_menu_activated (GtkAction *action, + ModestWindow *window); + +void +modest_ui_actions_on_attachment_menu_activated (GtkAction *action, + ModestWindow *window); + +void modest_ui_actions_on_toolbar_csm_menu_activated (GtkAction *action, ModestWindow *window); diff --git a/src/modest-ui-dimming-rules.c b/src/modest-ui-dimming-rules.c index d81658a..b1379ec 100644 --- a/src/modest-ui-dimming-rules.c +++ b/src/modest-ui-dimming-rules.c @@ -35,15 +35,19 @@ #include "modest-ui-dimming-rules.h" #include "modest-dimming-rule.h" #include "modest-tny-folder.h" +#include #include +#include static gboolean _folder_is_any_of_type (TnyFolder *folder, TnyFolderType types[], guint ntypes); static gboolean _invalid_msg_selected (ModestMainWindow *win, gboolean unique, ModestDimmingRule *rule); +static gboolean _invalid_attach_selected (ModestMsgViewWindow *win, gboolean unique, ModestDimmingRule *rule); +static gboolean _invalid_clipboard_selected (ModestMsgViewWindow *win); static gboolean _already_opened_msg (ModestWindow *win); static gboolean _selected_msg_marked_as (ModestWindow *win, TnyHeaderFlags mask, gboolean opposite); static gboolean _selected_folder_not_writeable (ModestMainWindow *win); -static gboolean _selected_folder_is_any_of_type (ModestMainWindow *win, TnyFolderType types[], guint ntypes); +static gboolean _selected_folder_is_any_of_type (ModestWindow *win, TnyFolderType types[], guint ntypes); static gboolean _selected_folder_is_root_or_inbox (ModestMainWindow *win); static gboolean _selected_folder_is_root (ModestMainWindow *win); static gboolean _selected_folder_is_empty (ModestMainWindow *win); @@ -193,7 +197,7 @@ modest_ui_dimming_rules_on_reply_msg (ModestWindow *win, gpointer user_data) /* Check dimmed rule */ if (!dimmed) { - dimmed = _selected_folder_is_any_of_type (MODEST_MAIN_WINDOW(win), types, 3); + dimmed = _selected_folder_is_any_of_type (win, types, 3); if (dimmed) modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_reply")); } @@ -253,35 +257,42 @@ modest_ui_dimming_rules_on_delete_msg (ModestWindow *win, gpointer user_data) ModestDimmingRule *rule = NULL; gboolean dimmed = FALSE; - g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE); + g_return_val_if_fail (MODEST_IS_MAIN_WINDOW (win), FALSE); g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE); rule = MODEST_DIMMING_RULE (user_data); - /* Check dimmed rule */ - if (!dimmed) { - dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win)); - if (dimmed) - modest_dimming_rule_set_notification (rule, _("mcen_ib_nothing_to_del")); - } - if (!dimmed) { - dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data); - if (dimmed) - modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected")); - } - if (!dimmed) { - dimmed = _already_opened_msg (win); - if (dimmed) - modest_dimming_rule_set_notification (rule, _("mcen_nc_unable_to_delete_n_messages")); - } - if (!dimmed) { - dimmed = _marked_as_deleted (win); - if (dimmed) - modest_dimming_rule_set_notification (rule, _("mcen_ib_message_unableto_delete")); - } - if (!dimmed) { - dimmed = _msg_sent_in_progress (win); - if (dimmed) - modest_dimming_rule_set_notification (rule, _("mcen_ib_message_unableto_delete")); + /* Check dimmed rule */ + if (MODEST_IS_MAIN_WINDOW (win)) { + if (!dimmed) { + dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win)); + if (dimmed) + modest_dimming_rule_set_notification (rule, _("mcen_ib_nothing_to_del")); + } + if (!dimmed) { + dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data); + if (dimmed) + modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected")); + } + if (!dimmed) { + dimmed = _already_opened_msg (win); + if (dimmed) + modest_dimming_rule_set_notification (rule, _("mcen_nc_unable_to_delete_n_messages")); + } + if (!dimmed) { + dimmed = _marked_as_deleted (win); + if (dimmed) + modest_dimming_rule_set_notification (rule, _("mcen_ib_message_unableto_delete")); + } + if (!dimmed) { + dimmed = _msg_sent_in_progress (win); + if (dimmed) + modest_dimming_rule_set_notification (rule, _("mcen_ib_message_unableto_delete")); + } + } + else if (MODEST_IS_MSG_VIEW_WINDOW (win)) { + if (!dimmed) { + dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW(win)); + } } return dimmed; @@ -367,8 +378,8 @@ modest_ui_dimming_rules_on_move_to (ModestWindow *win, gpointer user_data) if (MODEST_IS_MAIN_WINDOW (win)) dimmed = modest_ui_dimming_rules_on_main_window_move_to (win, user_data); - else - dimmed = modest_ui_dimming_rules_on_view_window_move_to (win, user_data); + else if (MODEST_IS_MSG_VIEW_WINDOW (win)) + dimmed = modest_ui_dimming_rules_on_view_window_move_to (win, user_data); return dimmed; } @@ -413,6 +424,12 @@ modest_ui_dimming_rules_on_view_window_move_to (ModestWindow *win, gpointer user { gboolean dimmed = FALSE; + g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE); + + /* Check dimmed rule */ + if (!dimmed) + dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW(win)); + return dimmed; } @@ -430,7 +447,7 @@ modest_ui_dimming_rules_on_paste_msgs (ModestWindow *win, gpointer user_data) /* Check dimmed rule */ if (!dimmed) - dimmed = _selected_folder_is_any_of_type (MODEST_MAIN_WINDOW(win), types, 3); + dimmed = _selected_folder_is_any_of_type (win, types, 3); return dimmed; } @@ -451,7 +468,7 @@ modest_ui_dimming_rules_on_delete_msgs (ModestWindow *win, gpointer user_data) /* Check dimmed rule */ if (!dimmed) - dimmed = _selected_folder_is_any_of_type (MODEST_MAIN_WINDOW(win), types, 5); + dimmed = _selected_folder_is_any_of_type (win, types, 5); return dimmed; } @@ -461,6 +478,8 @@ modest_ui_dimming_rules_on_select_all (ModestWindow *win, gpointer user_data) { gboolean dimmed = FALSE; + g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE); + /* Check dimmed rule */ if (!dimmed) dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win)); @@ -468,6 +487,101 @@ modest_ui_dimming_rules_on_select_all (ModestWindow *win, gpointer user_data) return dimmed; } +gboolean +modest_ui_dimming_rules_on_view_attachments (ModestWindow *win, gpointer user_data) +{ + ModestDimmingRule *rule = NULL; + gboolean dimmed = FALSE; + + g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE); + g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE); + rule = MODEST_DIMMING_RULE (user_data); + + /* Check dimmed rule */ + if (!dimmed) + dimmed = _invalid_attach_selected (MODEST_MSG_VIEW_WINDOW(win), TRUE, rule); + + return dimmed; +} + +gboolean +modest_ui_dimming_rules_on_save_attachments (ModestWindow *win, gpointer user_data) +{ + ModestDimmingRule *rule = NULL; + gboolean dimmed = FALSE; + + g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE); + g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE); + rule = MODEST_DIMMING_RULE (user_data); + + /* Check dimmed rule */ + if (!dimmed) + dimmed = _invalid_attach_selected (MODEST_MSG_VIEW_WINDOW(win), FALSE, rule); + + return dimmed; +} + +gboolean +modest_ui_dimming_rules_on_remove_attachments (ModestWindow *win, gpointer user_data) +{ + ModestDimmingRule *rule = NULL; + gboolean dimmed = FALSE; + + g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE); + g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE); + rule = MODEST_DIMMING_RULE (user_data); + + /* Check dimmed rule */ + if (!dimmed) { + dimmed = _invalid_attach_selected (MODEST_MSG_VIEW_WINDOW(win), FALSE, NULL); + modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_display_more")); + } + + return dimmed; +} + +gboolean +modest_ui_dimming_rules_on_copy (ModestWindow *win, gpointer user_data) +{ + gboolean dimmed = FALSE; + + g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE); + + /* Check dimmed rule */ + if (!dimmed) + dimmed = _invalid_clipboard_selected (MODEST_MSG_VIEW_WINDOW(win)); + + return dimmed; +} + +gboolean +modest_ui_dimming_rules_on_view_previous (ModestWindow *win, gpointer user_data) +{ + gboolean dimmed = FALSE; + + g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE); + + /* Check dimmed rule */ + if (!dimmed) + dimmed = modest_msg_view_window_first_message_selected (MODEST_MSG_VIEW_WINDOW(win)); + + return dimmed; +} + +gboolean +modest_ui_dimming_rules_on_view_next (ModestWindow *win, gpointer user_data) +{ + gboolean dimmed = FALSE; + + g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE); + + /* Check dimmed rule */ + if (!dimmed) + dimmed = modest_msg_view_window_last_message_selected (MODEST_MSG_VIEW_WINDOW(win)); + + return dimmed; +} + gboolean modest_ui_dimming_rules_on_tools_smtp_servers (ModestWindow *win, gpointer user_data) { @@ -541,7 +655,7 @@ _selected_folder_is_root_or_inbox (ModestMainWindow *win) types[1] = TNY_FOLDER_TYPE_INBOX; /* Check folder type */ - result = _selected_folder_is_any_of_type (win, types, 2); + result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 2); if (!result) { GtkWidget *folder_view = NULL; @@ -587,7 +701,7 @@ _selected_folder_is_root (ModestMainWindow *win) types[0] = TNY_FOLDER_TYPE_ROOT; /* Check folder type */ - result = _selected_folder_is_any_of_type (win, types, 1); + result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 1); return result; } @@ -624,30 +738,42 @@ _selected_folder_is_empty (ModestMainWindow *win) } static gboolean -_selected_folder_is_any_of_type (ModestMainWindow *win, +_selected_folder_is_any_of_type (ModestWindow *win, TnyFolderType types[], guint ntypes) { GtkWidget *folder_view = NULL; TnyFolderStore *folder = NULL; + TnyFolderType folder_type; + guint i=0; gboolean result = FALSE; - g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE); + /*Get curent folder */ + if (MODEST_IS_MAIN_WINDOW(win)) { - /* Get folder view */ - folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win), - MODEST_WIDGET_TYPE_FOLDER_VIEW); - /* If no folder view, always dimmed */ - if (!folder_view) - return TRUE; - - /* Get selected folder as parent of new folder to create */ - folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view)); - if (!(folder && TNY_IS_FOLDER(folder))) - return TRUE; + /* Get folder view */ + folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win), + MODEST_WIDGET_TYPE_FOLDER_VIEW); + /* If no folder view, always dimmed */ + if (!folder_view) + return TRUE; - /* Check folder type */ - result = _folder_is_any_of_type (TNY_FOLDER(folder), types, ntypes); + /* Get selected folder as parent of new folder to create */ + folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view)); + + if (!(folder && TNY_IS_FOLDER(folder))) + return TRUE; + + /* Check folder type */ + result = _folder_is_any_of_type (TNY_FOLDER(folder), types, ntypes); + } + else if (MODEST_IS_MSG_VIEW_WINDOW(win)) { + folder_type = modest_msg_view_window_get_folder_type (MODEST_MSG_VIEW_WINDOW (win)); + for (i=0; i < ntypes; i++) { + result = result || folder_type == types[i]; + } + } + /* free */ g_object_unref (folder); @@ -683,6 +809,83 @@ _folder_is_any_of_type (TnyFolder *folder, static gboolean +_invalid_clipboard_selected (ModestMsgViewWindow *win) +{ + GtkClipboard *clipboard = NULL; + gchar *selection = NULL; + GtkWidget *focused = NULL; + gboolean result = FALSE; + + g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), TRUE); + + /* Get clipboard selection*/ + clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY); + selection = gtk_clipboard_wait_for_text (clipboard); + + /* Get focuesed widget */ + focused = gtk_window_get_focus (GTK_WINDOW (win)); + + /* Check dimming */ + result = ((selection == NULL) || + (MODEST_IS_ATTACHMENTS_VIEW (focused))); + + return result; +} + +static gboolean +_invalid_attach_selected (ModestMsgViewWindow *win, + gboolean unique, + ModestDimmingRule *rule) +{ + GList *attachments, *node; + gint n_selected; + gboolean nested_attachments = FALSE; + gboolean selected_messages = FALSE; + gboolean result = FALSE; + + g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), TRUE); + + /* Get selected atachments */ + attachments = modest_msg_view_window_get_attachments (win); + n_selected = g_list_length (attachments); + for (node = attachments; node != NULL; node = g_list_next (node)) { + TnyMimePart *mime_part = TNY_MIME_PART (node->data); + TnyList *nested_list = tny_simple_list_new (); + if (!tny_mime_part_is_attachment (mime_part)) { + selected_messages = TRUE; + break; + } + tny_mime_part_get_parts (mime_part, nested_list); + if (tny_list_get_length (nested_list) > 0) + nested_attachments = TRUE; + g_object_unref (nested_list); + } + + /* Check unique */ + if (unique) + result = n_selected != 1; + else + + result = n_selected == 1; + + /* Set notifications */ + if (!result && rule != NULL) { + if (selected_messages) { + modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_save_attach_mail")); + } else if (nested_attachments) { + modest_dimming_rule_set_notification (rule, _("FIXME:unable to save attachments with nested elements")); + } else if (n_selected == 0) { + modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected")); + } + } + + /* Free */ + g_list_free (attachments); + + return result; +} + +static gboolean _invalid_msg_selected (ModestMainWindow *win, gboolean unique, ModestDimmingRule *rule) @@ -708,8 +911,9 @@ _invalid_msg_selected (ModestMainWindow *win, /* Check dimmed rule (TODO: check focus on widgets */ if (!result) { - result = ((selected_headers == NULL) || - (GTK_WIDGET_HAS_FOCUS (folder_view))); + result = (selected_headers == NULL); +/* result = ((selected_headers == NULL) || */ +/* (GTK_WIDGET_HAS_FOCUS (folder_view))); */ if (result) modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected")); } @@ -932,3 +1136,4 @@ _msg_sent_in_progress (ModestWindow *win) return result; } + diff --git a/src/modest-ui-dimming-rules.h b/src/modest-ui-dimming-rules.h index 1f6a127..a744af5 100644 --- a/src/modest-ui-dimming-rules.h +++ b/src/modest-ui-dimming-rules.h @@ -56,6 +56,12 @@ gboolean modest_ui_dimming_rules_on_view_window_move_to (ModestWindow *win, gpoi gboolean modest_ui_dimming_rules_on_paste_msgs (ModestWindow *win, gpointer user_data); gboolean modest_ui_dimming_rules_on_delete_msgs (ModestWindow *win, gpointer user_data); gboolean modest_ui_dimming_rules_on_select_all (ModestWindow *win, gpointer user_data); +gboolean modest_ui_dimming_rules_on_view_attachments (ModestWindow *win, gpointer user_data); +gboolean modest_ui_dimming_rules_on_save_attachments (ModestWindow *win, gpointer user_data); +gboolean modest_ui_dimming_rules_on_remove_attachments (ModestWindow *win, gpointer user_data); +gboolean modest_ui_dimming_rules_on_copy (ModestWindow *win, gpointer user_data); +gboolean modest_ui_dimming_rules_on_view_previous (ModestWindow *win, gpointer user_data); +gboolean modest_ui_dimming_rules_on_view_next (ModestWindow *win, gpointer user_data); gboolean modest_ui_dimming_rules_on_tools_smtp_servers (ModestWindow *win, gpointer user_data); diff --git a/src/widgets/modest-header-view.c b/src/widgets/modest-header-view.c index dffd7b8..0ef3113 100644 --- a/src/widgets/modest-header-view.c +++ b/src/widgets/modest-header-view.c @@ -38,6 +38,8 @@ #include #include +#include + #include #include #include @@ -74,6 +76,9 @@ static void folder_monitor_update (TnyFolderObserver *self, static void tny_folder_observer_init (TnyFolderObserverIface *klass); +static void _on_new_folder_assigned (const GObject *obj, TnyFolder *folder, gpointer user_data); + + typedef struct _ModestHeaderViewPrivate ModestHeaderViewPrivate; struct _ModestHeaderViewPrivate { TnyFolder *folder; @@ -88,6 +93,13 @@ struct _ModestHeaderViewPrivate { }; +typedef struct _HeadersCountChangedHelper HeadersCountChangedHelper; +struct _HeadersCountChangedHelper { + ModestHeaderView *self; + TnyFolderChange *change; +}; + + #define MODEST_HEADER_VIEW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \ MODEST_TYPE_HEADER_VIEW, \ ModestHeaderViewPrivate)) @@ -100,7 +112,7 @@ enum { HEADER_SELECTED_SIGNAL, HEADER_ACTIVATED_SIGNAL, ITEM_NOT_FOUND_SIGNAL, - STATUS_UPDATE_SIGNAL, + MSG_COUNT_CHANGED_SIGNAL, LAST_SIGNAL }; @@ -185,14 +197,14 @@ modest_header_view_class_init (ModestHeaderViewClass *klass) g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT); - signals[STATUS_UPDATE_SIGNAL] = - g_signal_new ("status_update", + signals[MSG_COUNT_CHANGED_SIGNAL] = + g_signal_new ("msg_count_changed", G_TYPE_FROM_CLASS (gobject_class), G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (ModestHeaderViewClass,status_update), + G_STRUCT_OFFSET (ModestHeaderViewClass, msg_count_changed), NULL, NULL, - modest_marshal_VOID__STRING_INT_INT, - G_TYPE_NONE, 3, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT); + modest_marshal_VOID__POINTER_POINTER, + G_TYPE_NONE, 2, G_TYPE_POINTER, G_TYPE_POINTER); } static void @@ -886,7 +898,10 @@ void modest_header_view_set_folder (ModestHeaderView *self, TnyFolder *folder) { ModestHeaderViewPrivate *priv; - + ModestMailOperation *mail_op = NULL; + ModestWindowMgr *mgr = NULL; + GObject *source = NULL; + priv = MODEST_HEADER_VIEW_GET_PRIVATE(self); if (priv->folder) { @@ -898,7 +913,10 @@ modest_header_view_set_folder (ModestHeaderView *self, TnyFolder *folder) } if (folder) { - ModestMailOperation *mail_op; + + /* Get main window to use it as source of mail operation */ + mgr = modest_runtime_get_window_mgr (); + source = G_OBJECT (modest_window_mgr_get_main_window (modest_runtime_get_window_mgr ())); /* Set folder in the model */ modest_header_view_set_folder_intern (self, folder); @@ -909,13 +927,15 @@ modest_header_view_set_folder (ModestHeaderView *self, TnyFolder *folder) /* no message selected */ g_signal_emit (G_OBJECT(self), signals[HEADER_SELECTED_SIGNAL], 0, NULL); - /* Create the mail operation */ - mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_RECEIVE, NULL); + /* Create the mail operation (source will be the parent widget) */ + mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_RECEIVE, source); modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op); /* Refresh the folder asynchronously */ - modest_mail_operation_refresh_folder (mail_op, folder); + modest_mail_operation_refresh_folder (mail_op, folder, + _on_new_folder_assigned, + NULL); /* Free */ g_object_unref (mail_op); @@ -1026,19 +1046,19 @@ cmp_rows (GtkTreeModel *tree_model, GtkTreeIter *iter1, GtkTreeIter *iter2, gint t1, t2; gint val1, val2; gint cmp; - static int counter = 0; +/* static int counter = 0; */ g_return_val_if_fail (GTK_IS_TREE_VIEW_COLUMN(user_data), 0); /* col_id = gtk_tree_sortable_get_sort_column_id (GTK_TREE_SORTABLE (tree_model)); */ col_id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(user_data), MODEST_HEADER_VIEW_FLAG_SORT)); - if (!(++counter % 100)) { - GObject *header_view = g_object_get_data(G_OBJECT(user_data), - MODEST_HEADER_VIEW_PTR); - g_signal_emit (header_view, - signals[STATUS_UPDATE_SIGNAL], - 0, _("Sorting..."), 0, 0); - } +/* if (!(++counter % 100)) { */ +/* GObject *header_view = g_object_get_data(G_OBJECT(user_data), */ +/* MODEST_HEADER_VIEW_PTR); */ +/* g_signal_emit (header_view, */ +/* signals[STATUS_UPDATE_SIGNAL], */ +/* 0, _("Sorting..."), 0, 0); */ +/* } */ switch (col_id) { case TNY_HEADER_FLAG_ATTACHMENTS: @@ -1225,13 +1245,47 @@ idle_notify_added_headers (gpointer data) } static void +idle_notify_headers_count_changed_destroy (gpointer data) +{ + HeadersCountChangedHelper *helper = NULL; + + g_return_if_fail (data != NULL); + helper = (HeadersCountChangedHelper *) data; + + g_object_unref (helper->change); + g_slice_free (HeadersCountChangedHelper, helper); +} + +static gboolean +idle_notify_headers_count_changed (gpointer data) +{ + TnyFolder *folder = NULL; + ModestHeaderViewPrivate *priv = NULL; + HeadersCountChangedHelper *helper = NULL; + + g_return_val_if_fail (data != NULL, FALSE); + helper = (HeadersCountChangedHelper *) data; + g_return_val_if_fail (MODEST_IS_HEADER_VIEW(helper->self), FALSE); + g_return_val_if_fail (TNY_FOLDER_CHANGE(helper->change), FALSE); + + folder = tny_folder_change_get_folder (helper->change); + + priv = MODEST_HEADER_VIEW_GET_PRIVATE (helper->self); + g_mutex_lock (priv->observers_lock); + + g_signal_emit (G_OBJECT(helper->self), signals[MSG_COUNT_CHANGED_SIGNAL], 0, folder, helper->change); + + g_mutex_unlock (priv->observers_lock); + + return FALSE; +} + +static void folder_monitor_update (TnyFolderObserver *self, TnyFolderChange *change) { - ModestHeaderViewPrivate *priv = MODEST_HEADER_VIEW_GET_PRIVATE (self); TnyFolderChangeChanged changed; - - g_mutex_lock (priv->observers_lock); + HeadersCountChangedHelper *helper = NULL; changed = tny_folder_change_get_changed (change); @@ -1240,6 +1294,44 @@ folder_monitor_update (TnyFolderObserver *self, code calls dbus for example */ if (changed & TNY_FOLDER_CHANGE_CHANGED_ADDED_HEADERS) g_idle_add (idle_notify_added_headers, NULL); + + /* Check folder count */ + if ((changed & TNY_FOLDER_CHANGE_CHANGED_ADDED_HEADERS) || + (changed & TNY_FOLDER_CHANGE_CHANGED_REMOVED_HEADERS)) { + helper = g_slice_new0 (HeadersCountChangedHelper); + helper->self = MODEST_HEADER_VIEW(self); + helper->change = g_object_ref(change); + + g_idle_add_full (G_PRIORITY_DEFAULT, + idle_notify_headers_count_changed, + helper, + idle_notify_headers_count_changed_destroy); + } +} - g_mutex_unlock (priv->observers_lock); + +static void +_on_new_folder_assigned (const GObject *obj, TnyFolder *folder, gpointer user_data) +{ + ModestMainWindow *win = NULL; + gboolean folder_empty = FALSE; + + g_return_if_fail (MODEST_IS_MAIN_WINDOW (obj)); + g_return_if_fail (TNY_IS_FOLDER (folder)); + + win = MODEST_MAIN_WINDOW (obj); + + /* Check if folder is empty and set headers view contents style */ + folder_empty = tny_folder_get_all_count (folder) == 0; + if (folder_empty) { + modest_main_window_set_contents_style (win, + MODEST_MAIN_WINDOW_CONTENTS_STYLE_EMPTY); + } + else { + modest_main_window_set_contents_style (win, + MODEST_MAIN_WINDOW_CONTENTS_STYLE_HEADERS); +/* modest_widget_memory_restore (conf, G_OBJECT(header_view), */ +/* MODEST_CONF_HEADER_VIEW_KEY); */ + } + } diff --git a/src/widgets/modest-header-view.h b/src/widgets/modest-header-view.h index 76a7672..7ea0647 100644 --- a/src/widgets/modest-header-view.h +++ b/src/widgets/modest-header-view.h @@ -31,6 +31,7 @@ #define __MODEST_HEADER_VIEW_H__ #include +#include #include #include #include @@ -115,12 +116,10 @@ struct _ModestHeaderViewClass { TnyHeader *header, gpointer user_data); - /* msg == NULL implies that the operation is finished, ie. - * the progress indictation can be hidden */ - void (*status_update) (ModestHeaderView* self, - const gchar* msg, - gint num, gint total, - gpointer user_data); + void (*msg_count_changed) (ModestHeaderView* self, + TnyFolder *folder, + TnyFolderChange *change, + gpointer user_data); }; /** diff --git a/src/widgets/modest-main-window.h b/src/widgets/modest-main-window.h index 361bbfc..64e15a3 100644 --- a/src/widgets/modest-main-window.h +++ b/src/widgets/modest-main-window.h @@ -192,6 +192,7 @@ modest_main_window_notify_send_receive_initied (ModestMainWindow *self); void modest_main_window_notify_send_receive_completed (ModestMainWindow *self); + G_END_DECLS #endif /* __MODEST_MAIN_WINDOW_H__ */ diff --git a/src/widgets/modest-msg-view-window.h b/src/widgets/modest-msg-view-window.h index eb044a1..5d9ee6c 100644 --- a/src/widgets/modest-msg-view-window.h +++ b/src/widgets/modest-msg-view-window.h @@ -188,6 +188,14 @@ void modest_msg_view_window_view_attachment (ModestMsgViewWindow *win TnyMimePart *mime_part); /** + * modest_msg_view_window_get_attachments: + * @window: a #ModestMsgViewWindow + * + * Get selected attachments from #ModetMsgView private object. + */ +GList * modest_msg_view_window_get_attachments (ModestMsgViewWindow *win); + +/** * modest_msg_view_window_save_attachments: * @window: a #ModestMsgViewWindow * @mime_parts: a #GList of #TnyMimePart @@ -217,8 +225,42 @@ void modest_msg_view_window_remove_attachments (ModestMsgViewWindow * * Check if toolbar is in transfer mode, which determines whether a * transfer operation is being processed. */ -gboolean -modest_msg_view_window_toolbar_on_transfer_mode (ModestMsgViewWindow *self); +gboolean modest_msg_view_window_toolbar_on_transfer_mode (ModestMsgViewWindow *self); + + +/** + * modest_msg_view_window_last_message_selected: + * @window: a #ModestMsgViewWindow + * + * Check message currently viewed is the last message into folder . +*/ +gboolean modest_msg_view_window_last_message_selected (ModestMsgViewWindow *window); + + +/** + * modest_msg_view_window_first_message_selected: + * @window: a #ModestMsgViewWindow + * + * Check message currently viewed is the last message into folder . +*/ +gboolean modest_msg_view_window_first_message_selected (ModestMsgViewWindow *window); + +/** + * modest_msg_view_window_has_headers_model: + * @window: a #ModestMsgViewWindow + * + * Check if window has been created with a full headers model. +*/ +gboolean modest_msg_view_window_has_headers_model (ModestMsgViewWindow *window); + +/** + * modest_msg_view_window_get_folder_type: + * @window: a #ModestMsgViewWindow + * + * Gets folder type of message currently viewed . +*/ +TnyFolderType +modest_msg_view_window_get_folder_type (ModestMsgViewWindow *window); G_END_DECLS -- 1.7.9.5