Dim "Reply to" commands when a message is in the outbox
[modest] / src / maemo / modest-msg-view-window.c
index 4b6e5b8..5316dd3 100644 (file)
@@ -39,7 +39,6 @@
 #include <modest-maemo-utils.h>
 #include <modest-tny-msg.h>
 #include <modest-msg-view-window.h>
-#include <modest-attachments-view.h>
 #include <modest-main-window-ui.h>
 #include "modest-msg-view-window-ui-dimming.h"
 #include <modest-widget-memory.h>
@@ -48,7 +47,7 @@
 #include <modest-tny-folder.h>
 #include <modest-text-utils.h>
 #include <modest-account-mgr-helpers.h>
-#include "modest-progress-bar-widget.h"
+#include "modest-progress-bar.h"
 #include "modest-defs.h"
 #include "modest-hildon-includes.h"
 #include "modest-ui-dimming-manager.h"
@@ -473,8 +472,8 @@ set_toolbar_mode (ModestMsgViewWindow *self,
        /* Sets current toolbar mode */
        priv->current_toolbar_mode = mode;
 
-       /* Update window dimming state */
-       modest_ui_actions_check_window_dimming_rules (MODEST_WINDOW (self));
+       /* Update toolbar dimming state */
+       modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (self));
 
        switch (mode) {
        case TOOLBAR_MODE_NORMAL:               
@@ -539,10 +538,8 @@ init_window (ModestMsgViewWindow *obj)
 {
        GtkWidget *main_vbox;
        ModestMsgViewWindowPrivate *priv;
-       ModestWindowPrivate *parent_priv;
 
        priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(obj);
-       parent_priv = MODEST_WINDOW_GET_PRIVATE(obj);
 
        priv->msg_view = GTK_WIDGET (tny_platform_factory_new_msg_view (modest_tny_platform_factory_get_instance ()));
        modest_msg_view_set_shadow_type (MODEST_MSG_VIEW (priv->msg_view), GTK_SHADOW_NONE);
@@ -691,7 +688,8 @@ select_next_valid_row (GtkTreeModel *model,
                       gboolean cycle)
 {
        GtkTreeIter tmp_iter;
-       GtkTreePath *path, *next;
+       GtkTreePath *path;
+       GtkTreePath *next = NULL;
        gboolean retval = FALSE;
 
        g_return_val_if_fail (gtk_tree_row_reference_valid (*row_reference), FALSE);
@@ -717,6 +715,8 @@ select_next_valid_row (GtkTreeModel *model,
 
        /* Free */
        gtk_tree_path_free (path);
+       if (next)
+               gtk_tree_path_free (next);
 
        return retval;
 }
@@ -730,7 +730,8 @@ modest_msg_view_window_construct (ModestMsgViewWindow *self,
        GObject *obj = NULL;
        ModestMsgViewWindowPrivate *priv = NULL;
        ModestWindowPrivate *parent_priv = NULL;
-       ModestDimmingRulesGroup *window_rules_group = NULL;
+       ModestDimmingRulesGroup *menu_rules_group = NULL;
+       ModestDimmingRulesGroup *toolbar_rules_group = NULL;
        ModestDimmingRulesGroup *clipboard_rules_group = NULL;
 
        obj = G_OBJECT (self);
@@ -745,27 +746,30 @@ modest_msg_view_window_construct (ModestMsgViewWindow *self,
        gtk_widget_show (parent_priv->menubar);
        parent_priv->ui_dimming_manager = modest_ui_dimming_manager_new();
 
-       window_rules_group = modest_dimming_rules_group_new ("ModestWindowDimmingRules", TRUE);
-       clipboard_rules_group = modest_dimming_rules_group_new ("ModestClipboardDimmingRules", FALSE);
+       menu_rules_group = modest_dimming_rules_group_new (MODEST_DIMMING_RULES_MENU, FALSE);
+       toolbar_rules_group = modest_dimming_rules_group_new (MODEST_DIMMING_RULES_TOOLBAR, TRUE);
+       clipboard_rules_group = modest_dimming_rules_group_new (MODEST_DIMMING_RULES_CLIPBOARD, FALSE);
 
        /* Add common dimming rules */
-       modest_dimming_rules_group_add_rules (window_rules_group, 
-                                             modest_msg_view_toolbar_dimming_entries,
-                                             G_N_ELEMENTS (modest_msg_view_toolbar_dimming_entries),
-                                             MODEST_WINDOW (self));
-       modest_dimming_rules_group_add_rules (window_rules_group, 
+       modest_dimming_rules_group_add_rules (menu_rules_group, 
                                              modest_msg_view_menu_dimming_entries,
                                              G_N_ELEMENTS (modest_msg_view_menu_dimming_entries),
                                              MODEST_WINDOW (self));
+       modest_dimming_rules_group_add_rules (toolbar_rules_group, 
+                                             modest_msg_view_toolbar_dimming_entries,
+                                             G_N_ELEMENTS (modest_msg_view_toolbar_dimming_entries),
+                                             MODEST_WINDOW (self));
        modest_dimming_rules_group_add_rules (clipboard_rules_group, 
                                              modest_msg_view_clipboard_dimming_entries,
                                              G_N_ELEMENTS (modest_msg_view_clipboard_dimming_entries),
                                              MODEST_WINDOW (self));
 
        /* Insert dimming rules group for this window */
-       modest_ui_dimming_manager_insert_rules_group (parent_priv->ui_dimming_manager, window_rules_group);
+       modest_ui_dimming_manager_insert_rules_group (parent_priv->ui_dimming_manager, menu_rules_group);
+       modest_ui_dimming_manager_insert_rules_group (parent_priv->ui_dimming_manager, toolbar_rules_group);
        modest_ui_dimming_manager_insert_rules_group (parent_priv->ui_dimming_manager, clipboard_rules_group);
-       g_object_unref (window_rules_group);
+       g_object_unref (menu_rules_group);
+       g_object_unref (toolbar_rules_group);
        g_object_unref (clipboard_rules_group);
 
        restore_settings (MODEST_MSG_VIEW_WINDOW(obj));
@@ -905,9 +909,10 @@ modest_msg_view_window_new_with_header_model (TnyMsg *msg,
        gtk_widget_show_all (GTK_WIDGET (window));
        modest_msg_view_window_update_priority (window);
 
-       /* Check window dimming rules */
-       modest_ui_actions_check_window_dimming_rules (MODEST_WINDOW (window));
-       modest_window_check_dimming_rules_group (MODEST_WINDOW (window), "ModestClipboardDimmingRules");
+       /* Check dimming rules */
+       modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (window));
+       modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (window));
+       modest_window_check_dimming_rules_group (MODEST_WINDOW (window), MODEST_DIMMING_RULES_CLIPBOARD);
 
        return MODEST_WINDOW(window);
 }
@@ -960,9 +965,10 @@ modest_msg_view_window_new_for_attachment (TnyMsg *msg,
        tny_msg_view_set_msg (TNY_MSG_VIEW (priv->msg_view), msg);
        update_window_title (MODEST_MSG_VIEW_WINDOW (obj));
 
-       /* Check window dimming rules */
-       modest_ui_actions_check_window_dimming_rules (MODEST_WINDOW (obj));
-       modest_window_check_dimming_rules_group (MODEST_WINDOW (obj), "ModestClipboardDimmingRules");
+       /* Check dimming rules */
+       modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (obj));
+       modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (obj));
+       modest_window_check_dimming_rules_group (MODEST_WINDOW (obj), MODEST_DIMMING_RULES_CLIPBOARD);
 
        return MODEST_WINDOW(obj);
 }
@@ -972,14 +978,14 @@ void modest_msg_view_window_on_row_changed(
                GtkTreePath *arg1,
                GtkTreeIter *arg2,
                ModestMsgViewWindow *window){
-       modest_ui_actions_check_window_dimming_rules (MODEST_WINDOW (window));
+       modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (window));
 }
 
 void modest_msg_view_window_on_row_deleted(
                GtkTreeModel *header_model,
                GtkTreePath *arg1,
                ModestMsgViewWindow *window){
-       modest_ui_actions_check_window_dimming_rules (MODEST_WINDOW (window));
+       modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (window));
 }
 
 /* On insertions we check if the folder still has the message we are
@@ -1017,7 +1023,7 @@ void modest_msg_view_window_on_row_inserted(
                        select_next_valid_row (priv->header_model,
                                               &(priv->next_row_reference), FALSE);
                }
-               modest_ui_actions_check_window_dimming_rules (
+               modest_ui_actions_check_toolbar_dimming_rules (
                                MODEST_WINDOW (window));
                return;
        }
@@ -1067,7 +1073,7 @@ void modest_msg_view_window_on_row_inserted(
        select_next_valid_row (priv->header_model,
                        &(priv->next_row_reference), FALSE);
 
-       modest_ui_actions_check_window_dimming_rules (MODEST_WINDOW (window));
+       modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (window));
 }
 
 void modest_msg_view_window_on_row_reordered(
@@ -1076,7 +1082,7 @@ void modest_msg_view_window_on_row_reordered(
                GtkTreeIter *arg2,
                gpointer arg3,
                ModestMsgViewWindow *window){
-       modest_ui_actions_check_window_dimming_rules (MODEST_WINDOW (window));
+       modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (window));
 }
 
 /* The modest_msg_view_window_update_model_replaced implements update
@@ -1141,7 +1147,7 @@ void modest_msg_view_window_update_model_replaced(
                g_object_unref(priv->next_row_reference);
        priv->next_row_reference = NULL;
 
-       modest_ui_actions_check_window_dimming_rules(MODEST_WINDOW(window));
+       modest_ui_actions_check_toolbar_dimming_rules(MODEST_WINDOW(window));
 
        g_assert(model != NULL);
 
@@ -1180,7 +1186,9 @@ modest_msg_view_window_get_header (ModestMsgViewWindow *self)
        /* If the message was not obtained from a treemodel,
         * for instance if it was opened directly by the search UI:
         */
-       if (priv->header_model == NULL || priv->row_reference == NULL) {
+       if (priv->header_model == NULL || 
+           priv->row_reference == NULL ||
+           !gtk_tree_row_reference_valid (priv->row_reference)) {
                msg = modest_msg_view_window_get_message (self);
                if (msg) {
                        header = tny_msg_get_header (msg);
@@ -1190,12 +1198,6 @@ modest_msg_view_window_get_header (ModestMsgViewWindow *self)
        }
 
        /* Get iter of the currently selected message in the header view: */
-       /* TODO: Why not just give this window a ref of the TnyHeader or TnyMessage,
-        * instead of sometimes retrieving it from the header view?
-        * Then we wouldn't be dependent on the message actually still being selected 
-        * in the header view. murrayc. */
-       if (!gtk_tree_row_reference_valid (priv->row_reference))
-               return NULL;
        path = gtk_tree_row_reference_get_path (priv->row_reference);
        g_return_val_if_fail (path != NULL, NULL);
        gtk_tree_model_get_iter (priv->header_model, 
@@ -1597,7 +1599,7 @@ modest_msg_view_window_first_message_selected (ModestMsgViewWindow *window)
  *
  * If the message was not previously downloaded then ask the user
  * before downloading. If there is no connection launch the connection
- * dialog. Update window dimming rules.
+ * dialog. Update toolbar dimming rules.
  *
  * Returns: TRUE if the mail operation was started, otherwise if the
  * user do not want to download the message, or if the user do not
@@ -1661,8 +1663,9 @@ message_reader (ModestMsgViewWindow *window,
        modest_mail_operation_get_msg (mail_op, header, view_msg_cb, row_reference);
        g_object_unref (mail_op);
 
-       /* Update window dimming rules */
-       modest_ui_actions_check_window_dimming_rules (MODEST_WINDOW (window));
+       /* Update dimming rules */
+       modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (window));
+       modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (window));
 
        return TRUE;
 }
@@ -1800,6 +1803,9 @@ view_msg_cb (ModestMailOperation *mail_op,
        if (priv->row_reference != NULL) {
                gtk_tree_row_reference_free (priv->row_reference);
                priv->row_reference = gtk_tree_row_reference_copy (row_reference);
+               if (priv->next_row_reference != NULL) {
+                       gtk_tree_row_reference_free (priv->next_row_reference);
+               }
                priv->next_row_reference = gtk_tree_row_reference_copy (priv->row_reference);
                select_next_valid_row (priv->header_model, &(priv->next_row_reference), TRUE);
                gtk_tree_row_reference_free (row_reference);
@@ -1848,7 +1854,7 @@ modest_msg_view_window_get_folder_type (ModestMsgViewWindow *window)
 
                folder = tny_msg_get_folder (msg);
                if (folder) {
-                       folder_type = tny_folder_get_folder_type (folder);
+                       folder_type = modest_tny_folder_guess_folder_type (folder);
                        g_object_unref (folder);
                }
                g_object_unref (msg);
@@ -2002,7 +2008,7 @@ modest_msg_view_window_show_toolbar (ModestWindow *self,
                toolbar_resize (MODEST_MSG_VIEW_WINDOW (self));
 
                /* Add ProgressBar (Transfer toolbar) */ 
-               priv->progress_bar = modest_progress_bar_widget_new ();
+               priv->progress_bar = modest_progress_bar_new ();
                gtk_widget_set_no_show_all (priv->progress_bar, TRUE);
                placeholder = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ProgressbarView");
                insert_index = gtk_toolbar_get_item_index(GTK_TOOLBAR (parent_priv->toolbar), GTK_TOOL_ITEM(placeholder));
@@ -2068,7 +2074,7 @@ modest_msg_view_window_clipboard_owner_change (GtkClipboard *clipboard,
        if (!GTK_WIDGET_VISIBLE (window))
                return;
 
-       modest_window_check_dimming_rules_group (MODEST_WINDOW (window), "ModestClipboardDimmingRules");
+       modest_window_check_dimming_rules_group (MODEST_WINDOW (window), MODEST_DIMMING_RULES_CLIPBOARD);
 }
 
 gboolean 
@@ -2408,7 +2414,6 @@ save_mime_part_info_free (SaveMimePartInfo *info, gboolean with_struct)
        info->pairs = NULL;
        if (with_struct) {
                gtk_widget_destroy (info->banner);
-               g_object_unref (info->banner);
                g_slice_free (SaveMimePartInfo, info);
        }
 }
@@ -2497,9 +2502,8 @@ save_mime_parts_to_file_with_checks (SaveMimePartInfo *info)
        } else {
                GtkWidget *banner = hildon_banner_show_animation (NULL, NULL, 
                                                                  _CS("sfil_ib_saving"));
-               info->banner = g_object_ref (banner);
+               info->banner = banner;
                g_thread_create ((GThreadFunc)save_mime_part_to_file, info, FALSE, NULL);
-               g_object_unref (banner);
        }
 
 }
@@ -2578,27 +2582,22 @@ modest_msg_view_window_save_attachments (ModestMsgViewWindow *window, TnyList *m
                        while (!tny_iterator_is_done (iter)) {
                                TnyMimePart *mime_part = (TnyMimePart *) tny_iterator_get_current (iter);
 
-                               tny_iterator_next (iter);
-                               if (tny_mime_part_is_attachment (mime_part)) {
+                               if ((tny_mime_part_is_attachment (mime_part)) && 
+                                   (tny_mime_part_get_filename (mime_part) != NULL)) {
                                        SaveMimePartPair *pair;
-
-                                       if ((!tny_iterator_is_done (iter)) &&
-                                           (tny_mime_part_get_filename (mime_part) == NULL)) {
-                                               g_object_unref (mime_part);
-                                               continue;
-                                       }
                                        
                                        pair = g_slice_new0 (SaveMimePartPair);
-                                       if (tny_iterator_is_done (iter)) {
-                                               pair->filename = g_strdup (chooser_uri);
-                                       } else {
+                                       if (save_multiple_str) {
                                                pair->filename = 
                                                        g_build_filename (chooser_uri,
                                                                          tny_mime_part_get_filename (mime_part), NULL);
+                                       } else {
+                                               pair->filename = g_strdup (chooser_uri);
                                        }
                                        pair->part = mime_part;
                                        files_to_save = g_list_prepend (files_to_save, pair);
                                }
+                               tny_iterator_next (iter);
                        }
                        g_object_unref (iter);
                }