2007-07-13 Murray Cumming <murrayc@murrayc.com>
[modest] / src / modest-ui-dimming-rules.c
index 94c7919..486ef45 100644 (file)
@@ -78,7 +78,8 @@ modest_ui_dimming_rules_on_new_msg (ModestWindow *win, gpointer user_data)
                
        /* Check dimmed rule */ 
        if (!dimmed) {
-               dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW(win));
+               if (MODEST_IS_MSG_VIEW_WINDOW (win))
+                       dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW(win));
                if (dimmed)
                        modest_dimming_rule_set_notification (rule, "");
        }
@@ -174,23 +175,33 @@ modest_ui_dimming_rules_on_delete (ModestWindow *win, gpointer user_data)
        GtkWidget *header_view = NULL;  
        gboolean dimmed = 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);
        
-       /* Get the folder view */
-       folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
-                                                          MODEST_WIDGET_TYPE_FOLDER_VIEW);
-
-       /* Get header view */
-       header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
+       if (MODEST_IS_MAIN_WINDOW (win)) {
+               /* Get the folder view */
+               folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
+                                                                  MODEST_WIDGET_TYPE_FOLDER_VIEW);
+               
+               /* Get header view */
+               header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
                                                           MODEST_WIDGET_TYPE_HEADER_VIEW);
 
-       if (header_view && gtk_widget_is_focus (header_view)) 
-               dimmed = modest_ui_dimming_rules_on_delete_msg (win, rule);
+               if (header_view && gtk_widget_is_focus (header_view)) 
+                       dimmed = modest_ui_dimming_rules_on_delete_msg (win, rule);
+
+               if (folder_view && gtk_widget_is_focus (folder_view)) 
+                       dimmed = modest_ui_dimming_rules_on_delete_folder (win, rule);
 
-       if (folder_view && gtk_widget_is_focus (folder_view)) 
+               if (header_view && folder_view &&
+                   !gtk_widget_is_focus (header_view) &&
+                   !gtk_widget_is_focus (folder_view)) {
+                       dimmed = TRUE;
+                       modest_dimming_rule_set_notification (rule, dgettext("hildon-common-strings", "ckct_ib_nothing_to_delete"));                    
+               }
+       } else {
                dimmed = modest_ui_dimming_rules_on_delete_folder (win, rule);
+       }
 
        return dimmed;
 }
@@ -201,7 +212,7 @@ gboolean
 modest_ui_dimming_rules_on_delete_folder (ModestWindow *win, gpointer user_data)
 {
        ModestDimmingRule *rule = NULL;
-       TnyFolderType types[5];
+       TnyFolderType types[6];
        gboolean dimmed = FALSE;
 
        g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
@@ -213,6 +224,7 @@ modest_ui_dimming_rules_on_delete_folder (ModestWindow *win, gpointer user_data)
        types[2] = TNY_FOLDER_TYPE_SENT;
        types[3] = TNY_FOLDER_TYPE_INBOX;
        types[4] = TNY_FOLDER_TYPE_ROOT;
+       types[5] = TNY_FOLDER_TYPE_ARCHIVE;
 
                
        /* Check dimmed rule */ 
@@ -222,7 +234,7 @@ modest_ui_dimming_rules_on_delete_folder (ModestWindow *win, gpointer user_data)
                        modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
        }
        if (!dimmed) {
-               dimmed = _selected_folder_is_any_of_type (win, types, 5);
+               dimmed = _selected_folder_is_any_of_type (win, types, 6);
                if (dimmed)
                        modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
        }
@@ -253,8 +265,7 @@ modest_ui_dimming_rules_on_sort (ModestWindow *win, gpointer user_data)
        /* Check dimmed rule */ 
        if (!dimmed) {
                dimmed = _selected_folder_is_root (MODEST_MAIN_WINDOW(win));
-               if (dimmed)
-                       modest_dimming_rule_set_notification (rule, "");
+               modest_dimming_rule_set_notification (rule, NULL);
        }
 
        return dimmed;
@@ -365,9 +376,10 @@ modest_ui_dimming_rules_on_reply_msg (ModestWindow *win, gpointer user_data)
                                modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
                }
                if (!dimmed) {
-                       dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW(win));
+                       if (MODEST_IS_MSG_VIEW_WINDOW (win))
+                               dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW (win));
                        if (dimmed)
-                               modest_dimming_rule_set_notification (rule, "");
+                               modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_reply"));
                }
        }
        
@@ -451,7 +463,7 @@ modest_ui_dimming_rules_on_delete_msg (ModestWindow *win, gpointer user_data)
                if (!dimmed) {
                        dimmed = _selected_msg_sent_in_progress (win);
                        if (dimmed)
-                               modest_dimming_rule_set_notification (rule, _("mcen_ib_message_unableto_delete"));
+                               modest_dimming_rule_set_notification (rule, _("ckct_ib_unable_to_delete"));
                }
        } 
        else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
@@ -461,14 +473,14 @@ modest_ui_dimming_rules_on_delete_msg (ModestWindow *win, gpointer user_data)
                                modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
                }
                if (!dimmed) {
+                       dimmed = _marked_as_deleted (win);
+                       if (dimmed)
+                               modest_dimming_rule_set_notification (rule, _("mcen_ib_message_already_deleted"));
+               }
+               if (!dimmed) {
                        dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW(win));
                        if (dimmed) {
-                               gchar *num = g_strdup("1");
-                               gchar *message = g_strdup_printf(_("mcen_nc_unable_to_delete_n_messages"), num);
-/*                             modest_dimming_rule_set_notification (rule, _("mcen_nc_unable_to_delete_n_messages")); */
-                               modest_dimming_rule_set_notification (rule, message);
-                               g_free(message);
-                               g_free(num);
+                               modest_dimming_rule_set_notification (rule, _("ckct_ib_unable_to_delete"));
                        }
                }
        }
@@ -527,7 +539,8 @@ modest_ui_dimming_rules_on_details (ModestWindow *win, gpointer user_data)
 
                /* Check dimmed rule */ 
                if (!dimmed) {
-                       dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW(win));
+                       if (MODEST_IS_MSG_VIEW_WINDOW (win))
+                               dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW (win));
                        if (dimmed)
                                modest_dimming_rule_set_notification (rule, "");
                }
@@ -612,6 +625,7 @@ modest_ui_dimming_rules_on_main_window_move_to (ModestWindow *win, gpointer user
        GtkWidget *folder_view = NULL;
        GtkWidget *header_view = NULL;
        ModestDimmingRule *rule = NULL;
+       guint n_messages = 0;
        gboolean dimmed = FALSE;
        
        g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), TRUE);
@@ -628,6 +642,14 @@ modest_ui_dimming_rules_on_main_window_move_to (ModestWindow *win, gpointer user
        
        /* Check diming rules for folders and messages transfer  */
        if (!dimmed) {
+               dimmed = _already_opened_msg (win, &n_messages);
+               if (dimmed) {
+                       gchar *message = g_strdup_printf(_("emev_bd_unabletomove_items"), n_messages);
+                       modest_dimming_rule_set_notification (rule, message);
+                       g_free(message);
+               }
+       }
+       if (!dimmed) {
                if (!gtk_widget_is_focus (folder_view))
                        dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
                
@@ -653,7 +675,8 @@ modest_ui_dimming_rules_on_view_window_move_to (ModestWindow *win, gpointer user
                        modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
        }
        if (!dimmed) {
-               dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW(win));
+               if (MODEST_IS_MSG_VIEW_WINDOW (win))
+                       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"));
        }
@@ -687,7 +710,7 @@ modest_ui_dimming_rules_on_paste_msgs (ModestWindow *win, gpointer user_data)
        ModestDimmingRule *rule = NULL;
        TnyFolderType types[3];
        gboolean dimmed = 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);
@@ -705,7 +728,13 @@ modest_ui_dimming_rules_on_paste_msgs (ModestWindow *win, gpointer user_data)
        if (!dimmed) {
                dimmed = _selected_folder_is_any_of_type (win, types, 3);
                if (dimmed)
-                       modest_dimming_rule_set_notification (rule, _("ckct_ib_unable_to_paste_here"));
+                       modest_dimming_rule_set_notification (rule, dgettext("hildon-common-strings", "ckct_ib_unable_to_paste_here"));
+       }
+       if (!dimmed) {
+               dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
+               if (dimmed) {
+                       modest_dimming_rule_set_notification (rule, dgettext("hildon-common-strings", "ckct_ib_unable_to_paste_here"));
+               }
        }
        if (!dimmed) {
                dimmed = _selected_folder_is_same_as_source (win);
@@ -870,11 +899,6 @@ modest_ui_dimming_rules_on_cut (ModestWindow *win, gpointer user_data)
 
        /* Check window specific dimming rules */
        if (MODEST_IS_MAIN_WINDOW (win)) {
-               if (!dimmed) {
-                       dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
-                       if (dimmed)
-                               modest_dimming_rule_set_notification (rule, _("mcen_ib_message_unableto_delete"));
-               }
                if (!dimmed) { 
                        dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));                   
                        if (dimmed)
@@ -939,9 +963,9 @@ modest_ui_dimming_rules_on_view_previous (ModestWindow *win, gpointer user_data)
                        modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
        }
        if (!dimmed) {
-               dimmed = modest_msg_view_window_first_message_selected (MODEST_MSG_VIEW_WINDOW(win));
-               if (dimmed)
-                       modest_dimming_rule_set_notification (rule, "");
+               if (MODEST_IS_MSG_VIEW_WINDOW (win))
+                       dimmed = modest_msg_view_window_first_message_selected (MODEST_MSG_VIEW_WINDOW(win));
+               modest_dimming_rule_set_notification (rule, NULL);
        }               
 
        return dimmed;
@@ -964,9 +988,9 @@ modest_ui_dimming_rules_on_view_next (ModestWindow *win, gpointer user_data)
                        modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
        }
        if (!dimmed) {
-               dimmed = modest_msg_view_window_last_message_selected (MODEST_MSG_VIEW_WINDOW(win));
-               if (dimmed)
-                       modest_dimming_rule_set_notification (rule, "");
+               if (MODEST_IS_MSG_VIEW_WINDOW (win))
+                       dimmed = modest_msg_view_window_last_message_selected (MODEST_MSG_VIEW_WINDOW (win));
+               modest_dimming_rule_set_notification (rule, NULL);
        }               
 
        return dimmed;
@@ -1010,7 +1034,7 @@ modest_ui_dimming_rules_on_cancel_sending (ModestWindow *win, gpointer user_data
        }
        if (!dimmed) {
                dimmed = !_sending_in_progress (win);
-               if (dimmed) 
+               if (dimmed)
                        modest_dimming_rule_set_notification (rule, "");
        }
 
@@ -1052,7 +1076,7 @@ modest_ui_dimming_rules_on_add_to_contacts (ModestWindow *win, gpointer user_dat
                gchar *selection = NULL;
                selection = gtk_clipboard_wait_for_text (clipboard);
 
-               dimmed = !((selection != NULL) && (modest_text_utils_validate_recipient (selection)));
+               dimmed = !((selection != NULL) && (modest_text_utils_validate_recipient (selection, NULL)));
        }
 
        return dimmed;
@@ -1066,8 +1090,6 @@ _marked_as_deleted (ModestWindow *win)
        gboolean result = FALSE;
        TnyHeaderFlags flags;
 
-       g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
-       
        flags = TNY_HEADER_FLAG_DELETED; 
 
        /* Check dimmed rule */ 
@@ -1142,6 +1164,24 @@ _selected_folder_is_root (ModestMainWindow *win)
 
        g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
 
+       /* All accounts are root items: */
+       GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
+                                                          MODEST_WIDGET_TYPE_FOLDER_VIEW);
+       if (folder_view) {                                      
+               gboolean is_account = FALSE;
+               TnyFolderStore *folder_store = 
+                       modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
+               if (folder_store) {
+                       is_account = TNY_IS_ACCOUNT (folder_store);
+                       g_object_unref (folder_store);
+                       folder_store = NULL;
+               }
+               
+               if (is_account)
+                       return TRUE;
+       }
+               
+       /* Try something more precise: */
        types[0] = TNY_FOLDER_TYPE_ROOT; 
 
        /* Check folder type */
@@ -1191,8 +1231,6 @@ _selected_folder_is_MMC_or_POP_root (ModestMainWindow *win)
 }
 
 
-
-
 static gboolean
 _selected_folder_is_empty (ModestMainWindow *win)
 {
@@ -1278,7 +1316,7 @@ _selected_folder_is_any_of_type (ModestWindow *win,
        guint i=0;
        gboolean result = FALSE;
 
-       /*Get curent folder */
+       /*Get current folder */
        if (MODEST_IS_MAIN_WINDOW(win)) {
 
                /* Get folder view */
@@ -1286,7 +1324,7 @@ _selected_folder_is_any_of_type (ModestWindow *win,
                                                                   MODEST_WIDGET_TYPE_FOLDER_VIEW);
                /* If no folder view, always dimmed */
                if (!folder_view)
-                       return TRUE;
+                       return FALSE;
        
                /* Get selected folder as parent of new folder to create */
                folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
@@ -1294,7 +1332,7 @@ _selected_folder_is_any_of_type (ModestWindow *win,
                if (!(folder && TNY_IS_FOLDER(folder))) {
                        if (folder)
                                g_object_unref (folder);
-                       return TRUE;
+                       return FALSE;
                }
                
                /* Check folder type */
@@ -1326,11 +1364,8 @@ _folder_is_any_of_type (TnyFolder *folder,
        g_return_val_if_fail (TNY_IS_FOLDER(folder), FALSE);
 
        /* Get folder type */
-       if (modest_tny_folder_is_local_folder (folder))
-               folder_type = modest_tny_folder_get_local_folder_type (folder);         
-       else 
-               folder_type = modest_tny_folder_guess_folder_type (folder);             
-       
+       folder_type = modest_tny_folder_guess_folder_type (folder);
+               
        /* Check foler type */
        for (i=0; i < ntypes; i++) {
                result = result || folder_type == types[i];
@@ -1347,7 +1382,7 @@ _selected_folder_is_snd_level (ModestMainWindow *win)
        GtkTreeModel *model = NULL;
        GtkTreePath *path = NULL;
        GtkTreeIter iter;
-       TnyFolderStore *folder = NULL;
+       TnyFolderStore *folder = NULL;
        gboolean result = FALSE;
 
        g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), TRUE);
@@ -1375,7 +1410,7 @@ _selected_folder_is_snd_level (ModestMainWindow *win)
  frees:
        if (folder != NULL)
                g_object_unref (folder);
-       if (path != NULL) 
+       if (path != NULL)
                gtk_tree_path_free (path);
        
        return result;
@@ -1420,7 +1455,7 @@ _invalid_clipboard_selected (ModestWindow *win,
                          (MODEST_IS_ATTACHMENTS_VIEW (focused)));
                
                if (result)
-                       modest_dimming_rule_set_notification (rule, _(""));                     
+                       modest_dimming_rule_set_notification (rule, "");
        }               
        else if (MODEST_IS_MAIN_WINDOW (win)) {
                GtkWidget *header_view = NULL;
@@ -1654,6 +1689,7 @@ _selected_msg_marked_as (ModestWindow *win,
                         TnyHeaderFlags mask, 
                         gboolean opposite)
 {
+       ModestWindow *main_window = NULL;
        GtkWidget *header_view = NULL;
        TnyList *selected_headers = NULL;
        TnyIterator *iter = NULL;
@@ -1661,8 +1697,16 @@ _selected_msg_marked_as (ModestWindow *win,
        TnyHeaderFlags flags;
        gboolean result = FALSE;
 
+       if (MODEST_IS_MAIN_WINDOW (win))
+               main_window = win;
+       else {
+               main_window = 
+                       modest_window_mgr_get_main_window (modest_runtime_get_window_mgr ());           
+       }
+               
+
        /* Get header view to check selected messages */
-       header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
+       header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(main_window),
                                                           MODEST_WIDGET_TYPE_HEADER_VIEW);
 
        /* Check no selection */
@@ -1854,10 +1898,10 @@ _invalid_folder_for_purge (ModestWindow *win,
                /* Get folder and account of message */
                msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
                g_return_val_if_fail(msg != NULL, TRUE);                        
-               folder = tny_msg_get_folder (msg);              
+               folder = tny_msg_get_folder (msg);      
                if (folder == NULL) {
                        modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
-                       goto frees;                     
+                       goto frees;
                }
                g_object_unref (msg);
        } else if (MODEST_IS_MAIN_WINDOW (win)) {
@@ -1867,9 +1911,7 @@ _invalid_folder_for_purge (ModestWindow *win,
                        return FALSE;
                folder = TNY_FOLDER (modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view)));
                if (folder == NULL || ! TNY_IS_FOLDER (folder))
-                       return FALSE;
-               g_object_ref (folder);
-               
+                       goto frees;             
        } else {
                g_return_val_if_reached (FALSE);
        }
@@ -1895,12 +1937,17 @@ _invalid_folder_for_purge (ModestWindow *win,
                /* If it's POP then dim */
                if (modest_protocol_info_get_transport_store_protocol (proto_str) == 
                    MODEST_PROTOCOL_STORE_POP) {
-                       GList *attachments;
-                       gint n_selected;
+                       GList *attachments = NULL;
+                       gint n_selected = 0;
                        result = TRUE;
-                       attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
-                       n_selected = g_list_length (attachments);
-                       g_list_free (attachments);
+                       
+                       /* TODO: This check is here to prevent a gwarning, but this looks like a logic error.
+                        * murrayc */
+                       if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
+                               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",