* Review dimming rules to add not_deletable, not_moveable and
authorJavier Fernandez Garcia-Boente <jfernandez@igalia.com>
Wed, 29 Aug 2007 15:44:21 +0000 (15:44 +0000)
committerJavier Fernandez Garcia-Boente <jfernandez@igalia.com>
Wed, 29 Aug 2007 15:44:21 +0000 (15:44 +0000)
not_renameable utility functions.
* fixes: NB#67113

pmo-trunk-r3137

src/modest-email-clipboard.c
src/modest-email-clipboard.h
src/modest-ui-dimming-rules.c

index c6f6a23..e3b489a 100644 (file)
@@ -287,6 +287,52 @@ modest_email_clipboard_check_source_folder (ModestEmailClipboard *self,
        return same_folder;
 }
 
+gboolean 
+modest_email_clipboard_headers_copied (ModestEmailClipboard *self)
+{
+       ModestEmailClipboardPrivate *priv = NULL;;
+       gboolean result = FALSE;
+
+       g_return_val_if_fail (MODEST_IS_EMAIL_CLIPBOARD (self), FALSE);
+       priv = MODEST_EMAIL_CLIPBOARD_GET_PRIVATE (self);
+
+       result = priv->selection != NULL;
+
+       return result;
+}
+
+gboolean 
+modest_email_clipboard_folder_copied (ModestEmailClipboard *self)
+{
+       ModestEmailClipboardPrivate *priv = NULL;;
+       gboolean result = FALSE;
+
+       g_return_val_if_fail (MODEST_IS_EMAIL_CLIPBOARD (self), FALSE);
+       priv = MODEST_EMAIL_CLIPBOARD_GET_PRIVATE (self);
+       
+       result = ((priv->selection == NULL) && (priv->src != NULL));
+       
+       return result; 
+}
+
+const gchar *
+modest_email_clipboard_get_folder_name (ModestEmailClipboard *self)
+{
+       ModestEmailClipboardPrivate *priv = NULL;;
+       const gchar *folder_name = NULL;
+
+       g_return_val_if_fail (MODEST_IS_EMAIL_CLIPBOARD (self), NULL);
+       priv = MODEST_EMAIL_CLIPBOARD_GET_PRIVATE (self);
+       
+       /* If cleared, return always FALSE*/
+       if (modest_email_clipboard_cleared (self)) return NULL;
+
+       /* Check target and source folders */
+       folder_name = tny_folder_get_name (priv->src);
+       
+       return folder_name;
+}
+
 const gchar **
 modest_email_clipboard_get_hidding_ids (ModestEmailClipboard *self,
                                        guint *n_selected)
index 222afef..bf64969 100644 (file)
@@ -157,6 +157,37 @@ modest_email_clipboard_check_source_folder (ModestEmailClipboard *self,
 const gchar **modest_email_clipboard_get_hidding_ids (ModestEmailClipboard *self,
                                                      guint *n_selected);
 
+/**
+ * modest_email_clipboard_get_folder_name:
+ * @self: a #ModestEmailClipboard singlenton instance.   
+ * 
+ * Gets the source folder name.
+ * 
+ * returns a const string with folder name, or NULL if data are not valid.
+ */
+const gchar *modest_email_clipboard_get_folder_name (ModestEmailClipboard *self);
+
+
+/**
+ * modest_email_clipboard_headers_copied:
+ * @self: a #ModestEmailClipboard singlenton instance.   
+ *
+ * Checks if clipboard has headers stored.
+ * 
+ * returns TRUE, if clipboard stores headers, FALSE otherwise.
+ */
+gboolean modest_email_clipboard_headers_copied (ModestEmailClipboard *self);
+
+/**
+ * modest_email_clipboard_headers_copied:
+ * @self: a #ModestEmailClipboard singlenton instance.   
+ *
+ * Checks if clipboard has one folder stored.
+ * 
+ * returns TRUE, if clipboard stores one folder, FALSE otherwise.
+ */
+gboolean modest_email_clipboard_folder_copied (ModestEmailClipboard *self);
+
 G_END_DECLS
 
 #endif /* __MODEST_EMAIL_CLIPBOARD_H__ */
index c1934ac..f19faec 100644 (file)
@@ -50,9 +50,10 @@ static gboolean _invalid_attach_selected (ModestWindow *win,
 static gboolean _purged_attach_selected (ModestWindow *win, gboolean all, ModestDimmingRule *rule);
 static gboolean _clipboard_is_empty (ModestWindow *win);
 static gboolean _invalid_clipboard_selected (ModestWindow *win, ModestDimmingRule *rule);
-/* static gboolean _already_opened_msg (ModestWindow *win, guint *n_messages); */
-/* static gboolean _selected_msg_marked_as (ModestMainWindow *win, TnyHeaderFlags mask, gboolean opposite, gboolean all); */
-static gboolean _selected_folder_not_writeable (ModestMainWindow *win);
+static gboolean _selected_folder_not_writeable (ModestMainWindow *win, gboolean for_paste);
+static gboolean _selected_folder_not_moveable (ModestMainWindow *win);
+static gboolean _selected_folder_not_renameable (ModestMainWindow *win);
+static gboolean _selected_folder_not_deletable (ModestMainWindow *win);
 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_MMC_or_POP_root (ModestMainWindow *win);
@@ -65,12 +66,10 @@ static gboolean _msg_download_in_progress (ModestMsgViewWindow *win);
 static gboolean _msg_download_completed (ModestMainWindow *win);
 static gboolean _selected_msg_sent_in_progress (ModestWindow *win);
 static gboolean _sending_in_progress (ModestWindow *win);
-/* static gboolean _message_is_marked_as_deleted (ModestMsgViewWindow *win); */
-/* static gboolean _selected_message_is_marked_as_deleted (ModestMainWindow *win); */
 static gboolean _invalid_folder_for_purge (ModestWindow *win, ModestDimmingRule *rule);
 static gboolean _transfer_mode_enabled (ModestWindow *win);
-
-static void  fill_list_of_caches (gpointer key, gpointer value, gpointer userdata);
+static gboolean _selected_folder_has_subfolder_with_same_name (ModestWindow *win);
+static void fill_list_of_caches (gpointer key, gpointer value, gpointer userdata);
 
 
 static DimmedState *
@@ -378,7 +377,7 @@ modest_ui_dimming_rules_on_new_folder (ModestWindow *win, gpointer user_data)
 
                /* Apply folder rules */        
                if (!dimmed) {
-                       dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
+                       dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win), FALSE);
                        if (dimmed)
                                modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
                }
@@ -462,7 +461,7 @@ modest_ui_dimming_rules_on_delete_folder (ModestWindow *win, gpointer user_data)
                
        /* Check dimmed rule */ 
        if (!dimmed) {
-               dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
+               dimmed = _selected_folder_not_deletable (MODEST_MAIN_WINDOW(win));
                if (dimmed)
                        modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
        }
@@ -533,7 +532,7 @@ modest_ui_dimming_rules_on_rename_folder (ModestWindow *win, gpointer user_data)
        
        /* Check dimmed rule */ 
        if (!dimmed) {
-               dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
+               dimmed = _selected_folder_not_renameable (MODEST_MAIN_WINDOW(win));
                if (dimmed)
                        modest_dimming_rule_set_notification (rule, "");
        }
@@ -910,7 +909,7 @@ modest_ui_dimming_rules_on_main_window_move_to (ModestWindow *win, gpointer user
                
                /* Apply folder rules */        
                if (!dimmed) {
-                       dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
+                       dimmed = _selected_folder_not_moveable (MODEST_MAIN_WINDOW(win));
                        if (dimmed)
                                modest_dimming_rule_set_notification (rule, _("emev_bd_unabletomove_items"));
                }
@@ -1038,18 +1037,22 @@ modest_ui_dimming_rules_on_paste (ModestWindow *win, gpointer user_data)
                                        "ckct_ib_unable_to_paste_here"));
        }
        if (!dimmed) {
-               dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
-               if (dimmed) {
+               dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win), TRUE);
+               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);
                if (dimmed)
                        modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_copy_samefolder"));
        }
+       if (!dimmed) {
+               dimmed = _selected_folder_has_subfolder_with_same_name (win);
+               if (dimmed)
+                       modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_copy_samefolder"));
+       }
 
        return dimmed;
 }
@@ -1244,7 +1247,7 @@ modest_ui_dimming_rules_on_cut (ModestWindow *win, gpointer user_data)
                        
                        /* Apply folder rules */        
                        if (!dimmed) {
-                               dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
+                               dimmed = _selected_folder_not_deletable (MODEST_MAIN_WINDOW(win));
                                if (dimmed)
                                        modest_dimming_rule_set_notification (rule, _("emev_bd_unabletomove_items"));
                        }
@@ -1469,11 +1472,15 @@ modest_ui_dimming_rules_on_add_to_contacts (ModestWindow *win, gpointer user_dat
 
 
 static gboolean
-_selected_folder_not_writeable (ModestMainWindow *win)
+_selected_folder_not_writeable (ModestMainWindow *win,
+                               gboolean for_paste)
 {
        GtkWidget *folder_view = NULL;
        TnyFolderStore *parent_folder = NULL;
+       ModestEmailClipboard *clipboard = NULL;
        ModestTnyFolderRules rules;
+       gboolean is_local_acc = FALSE;
+       gboolean xfer_folders = FALSE;
        gboolean result = FALSE;
 
        g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
@@ -1488,9 +1495,20 @@ _selected_folder_not_writeable (ModestMainWindow *win)
        /* Get selected folder as parent of new folder to create */
        parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
        if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
-               if (parent_folder)
-                       g_object_unref (parent_folder);
-               return TRUE;
+               /* If it's the local account and its transfering folders, then do not dim */            
+               if (TNY_IS_ACCOUNT (parent_folder)) {
+                       is_local_acc = modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (parent_folder));
+                       if (for_paste) {
+                               clipboard = modest_runtime_get_email_clipboard ();
+                               xfer_folders = modest_email_clipboard_folder_copied (clipboard);
+                       }
+               }
+
+               if (for_paste) 
+                       result = !(is_local_acc && xfer_folders); 
+               else
+                       result = !is_local_acc;
+               goto frees;             
        }
        
        /* Check dimmed rule */ 
@@ -1498,7 +1516,117 @@ _selected_folder_not_writeable (ModestMainWindow *win)
        result = rules & MODEST_FOLDER_RULES_FOLDER_NON_WRITEABLE;
 
        /* free */
-       g_object_unref (parent_folder);
+ frees:
+       if (parent_folder != NULL)
+               g_object_unref (parent_folder);
+
+       return result;
+}
+
+static gboolean
+_selected_folder_not_deletable (ModestMainWindow *win)
+{
+       GtkWidget *folder_view = NULL;
+       TnyFolderStore *parent_folder = NULL;
+       ModestTnyFolderRules rules;
+       gboolean result = FALSE;
+
+       g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
+
+       /* 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 */
+       parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
+       if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
+               result = TRUE;
+               goto frees;             
+       }
+       
+       /* Check dimmed rule */ 
+       rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
+       result = rules & MODEST_FOLDER_RULES_FOLDER_NON_DELETABLE;
+
+       /* free */
+ frees:
+       if (parent_folder != NULL)
+               g_object_unref (parent_folder);
+
+       return result;
+}
+
+static gboolean
+_selected_folder_not_moveable (ModestMainWindow *win)
+{
+       GtkWidget *folder_view = NULL;
+       TnyFolderStore *parent_folder = NULL;
+       ModestTnyFolderRules rules;
+       gboolean result = FALSE;
+
+       g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
+
+       /* 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 */
+       parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
+       if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
+               result = TRUE;
+               goto frees;             
+       }
+       
+       /* Check dimmed rule */ 
+       rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
+       result = rules & MODEST_FOLDER_RULES_FOLDER_NON_MOVEABLE;
+
+       /* free */
+ frees:
+       if (parent_folder != NULL)
+               g_object_unref (parent_folder);
+
+       return result;
+}
+
+static gboolean
+_selected_folder_not_renameable (ModestMainWindow *win)
+{
+       GtkWidget *folder_view = NULL;
+       TnyFolderStore *parent_folder = NULL;
+       ModestTnyFolderRules rules;
+       gboolean result = FALSE;
+
+       g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
+
+       /* 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 */
+       parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
+       if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
+               result = TRUE;
+               goto frees;             
+       }
+       
+       /* Check dimmed rule */ 
+       rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
+       result = rules & MODEST_FOLDER_RULES_FOLDER_NON_RENAMEABLE;
+
+       /* free */
+ frees:
+       if (parent_folder != NULL)
+               g_object_unref (parent_folder);
 
        return result;
 }
@@ -2135,3 +2263,42 @@ _transfer_mode_enabled (ModestWindow *win)
        return result;
 }
 
+static gboolean
+_selected_folder_has_subfolder_with_same_name (ModestWindow *win)
+{
+       GtkWidget *folder_view = NULL;
+       TnyFolderStore *folder = NULL;
+       ModestEmailClipboard *clipboard = NULL;
+       const gchar *folder_name = NULL;
+       gboolean result = FALSE;
+
+       g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), TRUE);
+
+       /*Get current parent folder */
+       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 FALSE;
+       
+       /* 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))) goto frees;
+       
+       /* get modest clipboard and source folder */
+       clipboard = modest_runtime_get_email_clipboard ();
+       folder_name = modest_email_clipboard_get_folder_name (clipboard);
+       if (folder_name == NULL) goto frees;
+
+       /* Check source subfolders names */
+       result = modest_tny_folder_has_subfolder_with_name (folder, folder_name);
+       
+       
+       /* Free */
+ frees:
+       if (folder != NULL) 
+               g_object_unref (folder);
+
+
+       return result;
+}      
+