From 104b3bca571361d100f6bad0ab9b901729d4d46c Mon Sep 17 00:00:00 2001 From: Javier Fernandez Garcia-Boente Date: Mon, 25 Jun 2007 18:00:05 +0000 Subject: [PATCH] * Added new dimming rules for Attachment menu option in viewer window. * Fixes: NB#61148 pmo-trunk-r2414 --- src/maemo/modest-msg-view-window-ui-dimming.h | 3 +- src/maemo/modest-msg-view-window.c | 58 +++++++----- src/maemo/ui/modest-msg-view-window-ui.xml | 2 - src/modest-dimming-rule.c | 6 +- src/modest-ui-actions.c | 5 + src/modest-ui-dimming-rules.c | 124 +++++++++++++++++-------- 6 files changed, 129 insertions(+), 69 deletions(-) diff --git a/src/maemo/modest-msg-view-window-ui-dimming.h b/src/maemo/modest-msg-view-window-ui-dimming.h index 359e96c..0f596b3 100644 --- a/src/maemo/modest-msg-view-window-ui-dimming.h +++ b/src/maemo/modest-msg-view-window-ui-dimming.h @@ -59,10 +59,9 @@ static const ModestDimmingEntry modest_msg_view_menu_dimming_entries [] = { static const ModestDimmingEntry modest_msg_view_toolbar_dimming_entries [] = { /* Toolbar */ - { "/ToolBar/ToolbarMessageNew", NULL }, { "/ToolBar/ToolbarMessageReply", G_CALLBACK(modest_ui_dimming_rules_on_reply_msg) }, + { "/ToolBar/ToolbarMessageMoveTo", G_CALLBACK(modest_ui_dimming_rules_on_move_to) }, { "/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", G_CALLBACK(modest_ui_dimming_rules_on_view_previous) }, { "/ToolBar/ToolbarMessageNext", G_CALLBACK(modest_ui_dimming_rules_on_view_next) }, diff --git a/src/maemo/modest-msg-view-window.c b/src/maemo/modest-msg-view-window.c index 13e59a8..4cdfaeb 100644 --- a/src/maemo/modest-msg-view-window.c +++ b/src/maemo/modest-msg-view-window.c @@ -273,7 +273,7 @@ set_toolbar_mode (ModestMsgViewWindow *self, { ModestWindowPrivate *parent_priv; ModestMsgViewWindowPrivate *priv; - GtkAction *widget = NULL; + GtkWidget *widget = NULL; g_return_if_fail (MODEST_IS_MSG_VIEW_WINDOW (self)); @@ -283,18 +283,20 @@ set_toolbar_mode (ModestMsgViewWindow *self, /* Sets current toolbar mode */ priv->current_toolbar_mode = mode; + /* Get toolbar widget */ + widget = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar"); + switch (mode) { - case TOOLBAR_MODE_NORMAL: - widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarMessageNew"); - gtk_action_set_sensitive (widget, TRUE); - widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarMessageReply"); - gtk_action_set_sensitive (widget, TRUE); - widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarDeleteMessage"); - gtk_action_set_sensitive (widget, TRUE); - widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarMessageMoveTo"); - gtk_action_set_sensitive (widget, TRUE); - widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/FindInMessage"); - gtk_action_set_sensitive (widget, TRUE); + case TOOLBAR_MODE_NORMAL: + gtk_widget_set_sensitive (widget, TRUE); +/* widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarMessageReply"); */ +/* gtk_action_set_sensitive (widget, TRUE); */ +/* widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarDeleteMessage"); */ +/* gtk_action_set_sensitive (widget, TRUE); */ +/* widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarMessageMoveTo"); */ +/* gtk_action_set_sensitive (widget, TRUE); */ +/* widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/FindInMessage"); */ +/* gtk_action_set_sensitive (widget, TRUE); */ if (priv->prev_toolitem) gtk_widget_show (priv->prev_toolitem); @@ -318,16 +320,15 @@ set_toolbar_mode (ModestMsgViewWindow *self, break; case TOOLBAR_MODE_TRANSFER: - widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarMessageNew"); - gtk_action_set_sensitive (widget, FALSE); - widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarMessageReply"); - gtk_action_set_sensitive (widget, FALSE); - widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarDeleteMessage"); - gtk_action_set_sensitive (widget, FALSE); - widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarMessageMoveTo"); - gtk_action_set_sensitive (widget, FALSE); - widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/FindInMessage"); - gtk_action_set_sensitive (widget, FALSE); + gtk_widget_set_sensitive (widget, FALSE); +/* widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarMessageReply"); */ +/* gtk_action_set_sensitive (widget, FALSE); */ +/* widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarDeleteMessage"); */ +/* gtk_action_set_sensitive (widget, FALSE); */ +/* widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarMessageMoveTo"); */ +/* gtk_action_set_sensitive (widget, FALSE); */ +/* widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/FindInMessage"); */ +/* gtk_action_set_sensitive (widget, FALSE); */ if (priv->prev_toolitem) gtk_widget_hide (priv->prev_toolitem); @@ -628,6 +629,9 @@ modest_msg_view_window_new (TnyMsg *msg, update_window_title (MODEST_MSG_VIEW_WINDOW (obj)); + /* Check toolbar dimming rules */ + modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (obj)); + return MODEST_WINDOW(obj); } @@ -647,12 +651,21 @@ TnyHeader* modest_msg_view_window_get_header (ModestMsgViewWindow *self) { ModestMsgViewWindowPrivate *priv= NULL; + TnyMsg *msg = NULL; TnyHeader *header = NULL; GtkTreeIter iter; g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (self), NULL); priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (self); + /* Message is not obtained from a treemodel (Attachment ?) */ + if (priv->header_model == NULL) { + msg = modest_msg_view_window_get_message (self); + header = tny_msg_get_header (msg); + g_object_unref (msg); + return header; + } + /* Get current message iter */ gtk_tree_model_get_iter (priv->header_model, &iter, @@ -1804,6 +1817,7 @@ update_window_title (ModestMsgViewWindow *window) if (msg != NULL) { header = tny_msg_get_header (msg); subject = tny_header_get_subject (header); + g_object_unref (msg); } if ((subject == NULL)||(subject[0] == '\0')) diff --git a/src/maemo/ui/modest-msg-view-window-ui.xml b/src/maemo/ui/modest-msg-view-window-ui.xml index b57d6b8..b700bbb 100644 --- a/src/maemo/ui/modest-msg-view-window-ui.xml +++ b/src/maemo/ui/modest-msg-view-window-ui.xml @@ -98,8 +98,6 @@ - - diff --git a/src/modest-dimming-rule.c b/src/modest-dimming-rule.c index 4b7f13b..827c622 100644 --- a/src/modest-dimming-rule.c +++ b/src/modest-dimming-rule.c @@ -153,8 +153,10 @@ modest_dimming_rule_process (ModestDimmingRule *self) /* Update dimming status */ action = modest_window_get_action (priv->win, priv->action_path); - g_return_if_fail (action != NULL); - gtk_action_set_sensitive (action, !dimmed); + if (action == NULL) + g_printerr ("modest: action path '%s' has not associatd action\n", priv->action_path); + else + gtk_action_set_sensitive (action, !dimmed); } void diff --git a/src/modest-ui-actions.c b/src/modest-ui-actions.c index 3222f79..7326caa 100644 --- a/src/modest-ui-actions.c +++ b/src/modest-ui-actions.c @@ -2759,6 +2759,10 @@ msgs_move_to_confirmation (GtkWindow *win, g_object_unref (header); g_object_unref (iter); + /* if no src_folder, message may be an attahcment */ + if (src_folder == NULL) + return GTK_RESPONSE_CANCEL; + /* If the source is a remote folder */ if (!modest_tny_folder_is_local_folder (src_folder)) { const gchar *message; @@ -2942,6 +2946,7 @@ modest_ui_actions_on_msg_view_window_move_to (GtkAction *action, /* Create header list */ header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win)); + headers = tny_simple_list_new (); tny_list_prepend (headers, G_OBJECT (header)); g_object_unref (header); diff --git a/src/modest-ui-dimming-rules.c b/src/modest-ui-dimming-rules.c index 43e31df..8fa8a6b 100644 --- a/src/modest-ui-dimming-rules.c +++ b/src/modest-ui-dimming-rules.c @@ -45,7 +45,7 @@ static gboolean _folder_is_any_of_type (TnyFolder *folder, TnyFolderType types[] static gboolean _invalid_msg_selected (ModestMainWindow *win, gboolean unique, ModestDimmingRule *rule); static gboolean _invalid_attach_selected (ModestWindow *win, gboolean unique, gboolean for_view, ModestDimmingRule *rule); static gboolean _invalid_clipboard_selected (ModestWindow *win); -static gboolean _already_opened_msg (ModestWindow *win); +static gboolean _already_opened_msg (ModestWindow *win, guint *n_messages); 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 (ModestWindow *win, TnyFolderType types[], guint ntypes); @@ -291,6 +291,7 @@ gboolean modest_ui_dimming_rules_on_delete_msg (ModestWindow *win, gpointer user_data) { ModestDimmingRule *rule = NULL; + guint n_messages = 0; gboolean dimmed = FALSE; g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE); @@ -309,9 +310,14 @@ modest_ui_dimming_rules_on_delete_msg (ModestWindow *win, gpointer user_data) 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")); + dimmed = _already_opened_msg (win, &n_messages); + if (dimmed) { + gchar *num = g_strdup_printf ("%d", n_messages); + gchar *message = g_strdup_printf(_("mcen_nc_unable_to_delete_n_messages"), n_messages); + modest_dimming_rule_set_notification (rule, message); + g_free(message); + g_free(num); + } } if (!dimmed) { dimmed = _marked_as_deleted (win); @@ -327,6 +333,11 @@ modest_ui_dimming_rules_on_delete_msg (ModestWindow *win, gpointer user_data) else if (MODEST_IS_MSG_VIEW_WINDOW (win)) { if (!dimmed) { dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW(win)); + if (dimmed) { + gchar *message = g_strdup_printf(_("mcen_nc_unable_to_delete_n_messages"), "1"); + modest_dimming_rule_set_notification (rule, message); + g_free(message); + } } } @@ -442,9 +453,13 @@ modest_ui_dimming_rules_on_main_window_move_to (ModestWindow *win, gpointer user { GtkWidget *folder_view = NULL; GtkWidget *header_view = NULL; + ModestDimmingRule *rule = NULL; + const gchar *message = NULL; gboolean dimmed = FALSE; g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), TRUE); + g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE); + rule = MODEST_DIMMING_RULE (user_data); /* Get the folder view */ folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win), @@ -453,35 +468,44 @@ modest_ui_dimming_rules_on_main_window_move_to (ModestWindow *win, gpointer user /* Get header view */ header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win), MODEST_WIDGET_TYPE_HEADER_VIEW); - - /* Check common diming rules */ - - /* Check diming rules for folder transfer */ - if (gtk_widget_is_focus (folder_view)) { - if (!dimmed) - dimmed = _selected_folder_not_writeable(MODEST_MAIN_WINDOW(win)); - } - /* Check diming rules for msg transfer */ - else if (gtk_widget_is_focus (header_view)) { - if (!dimmed) - dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data); + + /* Check diming rules for folders and messages transfer */ + if (!dimmed) { + dimmed = _selected_folder_not_writeable(MODEST_MAIN_WINDOW(win)); + if (dimmed) { + if (gtk_widget_is_focus (folder_view)) + message = _("mail_in_ui_folder_move_target_error"); + else + message = ngettext ("mail_in_ui_folder_move_target_error", "mail_in_ui_folder_move_targets_error", + modest_header_view_count_selected_headers (MODEST_HEADER_VIEW(header_view)) > 1); + } + } + if (!dimmed) { + dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data); } - + return dimmed; } gboolean modest_ui_dimming_rules_on_view_window_move_to (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) + if (!dimmed) { dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW(win)); - + if (dimmed) + modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_move_mail_attachment")); + + } + return dimmed; } @@ -578,13 +602,13 @@ modest_ui_dimming_rules_on_remove_attachments (ModestWindow *win, gpointer user_ /* Check dimmed rule */ if (!dimmed) { - dimmed = _invalid_attachment_for_purge (win, rule); + dimmed = _invalid_attach_selected (win, TRUE, TRUE, rule); } - if (!dimmed) { - dimmed = _invalid_attach_selected (win, TRUE, TRUE, rule); + dimmed = _invalid_attachment_for_purge (win, rule); } + return dimmed; } @@ -1009,6 +1033,7 @@ _invalid_clipboard_selected (ModestWindow *win) return result; } + static gboolean _invalid_attach_selected (ModestWindow *win, gboolean unique, @@ -1025,8 +1050,7 @@ _invalid_attach_selected (ModestWindow *win, if (MODEST_IS_MAIN_WINDOW (win)) { flags = TNY_HEADER_FLAG_ATTACHMENTS; if (!result) - result = _selected_msg_marked_as (win, flags, TRUE); - + result = _selected_msg_marked_as (win, flags, TRUE); } else if (MODEST_IS_MSG_VIEW_WINDOW (win)) { @@ -1042,7 +1066,7 @@ _invalid_attach_selected (ModestWindow *win, result = n_selected < 1; } - + /* Check attached type (view operation not required) */ if (!result && !for_view) { for (node = attachments; node != NULL && !result; node = g_list_next (node)) { @@ -1122,7 +1146,8 @@ _invalid_msg_selected (ModestMainWindow *win, } static gboolean -_already_opened_msg (ModestWindow *win) +_already_opened_msg (ModestWindow *win, + guint *n_messages) { ModestWindow *window = NULL; ModestWindowMgr *mgr = NULL; @@ -1148,6 +1173,8 @@ _already_opened_msg (ModestWindow *win) if (selected_headers == NULL) return FALSE; + *n_messages = tny_list_get_length (selected_headers); + /* Check dimmed rule (TODO: check focus on widgets */ mgr = modest_runtime_get_window_mgr (); iter = tny_list_create_iterator (selected_headers); @@ -1376,22 +1403,29 @@ _sending_in_progress (ModestWindow *win) } static gboolean -_invalid_attachment_for_purge (ModestWindow *win, ModestDimmingRule *rule) +_invalid_attachment_for_purge (ModestWindow *win, + ModestDimmingRule *rule) { - gboolean result = FALSE; + TnyMsg *msg = NULL; + TnyFolder *folder = NULL; + TnyAccount *account = NULL; + gboolean result = TRUE; if (MODEST_IS_MSG_VIEW_WINDOW (win)) { - TnyMsg *msg; - TnyFolder *folder; - TnyAccount *account; + /* Get folder and account of message */ msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win)); - folder = tny_msg_get_folder (msg); - g_object_unref (msg); + g_return_val_if_fail(msg != NULL, TRUE); + folder = tny_msg_get_folder (msg); + if (folder == NULL) { + modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments")); + goto frees; + } account = modest_tny_folder_get_account (folder); - g_object_unref (folder); - if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (account))) { - } else { + if (account == NULL) goto frees; + + /* Check account */ + if (!modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (account))) { const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (account)); /* If it's POP then dim */ if (modest_protocol_info_get_transport_store_protocol (proto_str) == @@ -1402,15 +1436,23 @@ _invalid_attachment_for_purge (ModestWindow *win, ModestDimmingRule *rule) attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win)); n_selected = g_list_length (attachments); g_list_free (attachments); - - modest_dimming_rule_set_notification ( - rule, - ngettext ("mail_ib_unable_to_pure_attach_pop_mail_singular", - "mail_ib_unable_to_pure_attach_pop_mail_plural", n_selected)); + + modest_dimming_rule_set_notification (rule, + ngettext ("mail_ib_unable_to_pure_attach_pop_mail_singular", + "mail_ib_unable_to_pure_attach_pop_mail_plural", + n_selected)); } } } + frees: + if (msg != NULL) + g_object_unref (msg); + if (folder != NULL) + g_object_unref (folder); + if (account != NULL) + g_object_unref (account); + return result; } -- 1.7.9.5