* Fixed bug in empty_view of headers treeview when selected folder is empty.
authorJavier Fernandez Garcia-Boente <jfernandez@igalia.com>
Tue, 12 Jun 2007 14:29:46 +0000 (14:29 +0000)
committerJavier Fernandez Garcia-Boente <jfernandez@igalia.com>
Tue, 12 Jun 2007 14:29:46 +0000 (14:29 +0000)
* Fixes: NB#60141, NB#60144

pmo-trunk-r2183

14 files changed:
src/maemo/modest-main-window-ui.h
src/maemo/modest-main-window.c
src/maemo/modest-msg-view-window-ui-dimming.h
src/maemo/modest-msg-view-window.c
src/modest-mail-operation.c
src/modest-tny-msg.c
src/modest-ui-actions.c
src/modest-ui-actions.h
src/modest-ui-dimming-rules.c
src/modest-ui-dimming-rules.h
src/widgets/modest-header-view.c
src/widgets/modest-header-view.h
src/widgets/modest-main-window.h
src/widgets/modest-msg-view-window.h

index 00fc7a2..dc30576 100644 (file)
@@ -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) },
index 79a9f49..63191d5 100644 (file)
@@ -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)
index 7ed4e13..3f2cba2 100644 (file)
@@ -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 },
 };
 
index 14e9e1b..50d001b 100644 (file)
@@ -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)
index b645273..2ff8baa 100644 (file)
@@ -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);
 }
 
 /**
index 675fce3..52890f3 100644 (file)
@@ -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);
                
index 98593ab..1e6d467 100644 (file)
@@ -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)
 {
index 69b4784..a770e78 100644 (file)
@@ -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);
 
index d81658a..b1379ec 100644 (file)
 #include "modest-ui-dimming-rules.h"
 #include "modest-dimming-rule.h"
 #include "modest-tny-folder.h"
+#include <widgets/modest-attachments-view.h>
 #include <modest-runtime.h>
+#include <tny-simple-list.h>
 
 
 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;
 }
 
+
index 1f6a127..a744af5 100644 (file)
@@ -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);
 
index dffd7b8..0ef3113 100644 (file)
@@ -38,6 +38,8 @@
 #include <modest-dnd.h>
 #include <modest-tny-folder.h>
 
+#include <modest-main-window.h>
+
 #include <modest-marshal.h>
 #include <modest-text-utils.h>
 #include <modest-icon-names.h>
@@ -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); */
+       }
+       
 }
index 76a7672..7ea0647 100644 (file)
@@ -31,6 +31,7 @@
 #define __MODEST_HEADER_VIEW_H__
 
 #include <tny-folder.h>
+#include <tny-folder-change.h>
 #include <tny-gtk-account-list-model.h>
 #include <tny-msg.h>
 #include <tny-header.h>
@@ -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);
 };
 
 /**
index 361bbfc..64e15a3 100644 (file)
@@ -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__ */
index eb044a1..5d9ee6c 100644 (file)
@@ -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