aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMilan Crha <mcrha@redhat.com>2012-04-07 00:31:41 +0800
committerMilan Crha <mcrha@redhat.com>2012-04-07 00:31:41 +0800
commit37e79dec824738b206a4c78284a0870a26c7d80c (patch)
tree7e3d061d6f39c65390791e1a43953c5c9fb65c1d
parent76c3cb95c73cc67709bf77d81697b69d4d0c0a04 (diff)
downloadgsoc2013-evolution-37e79dec824738b206a4c78284a0870a26c7d80c.tar.gz
gsoc2013-evolution-37e79dec824738b206a4c78284a0870a26c7d80c.tar.zst
gsoc2013-evolution-37e79dec824738b206a4c78284a0870a26c7d80c.zip
Bug #245025 - Popup confirmation when moving a folder (via drag and drop)
-rw-r--r--data/org.gnome.evolution.mail.gschema.xml.in10
-rw-r--r--mail/em-folder-tree.c129
-rw-r--r--mail/mail.error.xml18
3 files changed, 112 insertions, 45 deletions
diff --git a/data/org.gnome.evolution.mail.gschema.xml.in b/data/org.gnome.evolution.mail.gschema.xml.in
index bc7645b6f0..bdc4089d89 100644
--- a/data/org.gnome.evolution.mail.gschema.xml.in
+++ b/data/org.gnome.evolution.mail.gschema.xml.in
@@ -405,6 +405,16 @@
<_summary>Prompt when deleting messages in search folder</_summary>
<_description>It disables/enables the repeated prompts to warn that deleting messages from a search folder permanently deletes the message, not simply removing it from the search results.</_description>
</key>
+ <key name="prompt-on-folder-drop-copy" type="s">
+ <default>'ask'</default>
+ <_summary>Asks whether to copy a folder by drag &amp; drop in the folder tree</_summary>
+ <_description>Possible values are: 'never' - do not allow copy with drag &amp; drop of folders in folder tree, 'always' - allow copy with drag &amp; drop of folders in folder tree without asking, or 'ask' - (or any other value) will ask user.</_description>
+ </key>
+ <key name="prompt-on-folder-drop-move" type="s">
+ <default>'ask'</default>
+ <_summary>Asks whether to move a folder by drag &amp; drop in the folder tree</_summary>
+ <_description>Possible values are: 'never' - do not allow move with drag &amp; drop of folders in folder tree, 'always' - allow move with drag &amp; drop of folders in folder tree without asking, or 'ask' - (or any other value) will ask user.</_description>
+ </key>
<key name="prompt-on-private-list-reply" type="b">
<default>true</default>
<_summary>Prompt when replying privately to list messages</_summary>
diff --git a/mail/em-folder-tree.c b/mail/em-folder-tree.c
index 2d1e28ea58..4dbbb36224 100644
--- a/mail/em-folder-tree.c
+++ b/mail/em-folder-tree.c
@@ -1899,48 +1899,6 @@ tree_drag_begin (GtkWidget *widget,
}
static void
-tree_drag_data_delete (GtkWidget *widget,
- GdkDragContext *context,
- EMFolderTree *folder_tree)
-{
- EMFolderTreePrivate *priv = folder_tree->priv;
- gchar *full_name = NULL;
- GtkTreeModel *model;
- GtkTreePath *src_path;
- gboolean is_store;
- CamelStore *store;
- GtkTreeIter iter;
-
- if (!priv->drag_row)
- return;
-
- src_path = gtk_tree_row_reference_get_path (priv->drag_row);
- if (src_path == NULL)
- return;
-
- model = gtk_tree_view_get_model (GTK_TREE_VIEW (folder_tree));
-
- if (!gtk_tree_model_get_iter (model, &iter, src_path))
- goto fail;
-
- gtk_tree_model_get (
- model, &iter,
- COL_POINTER_CAMEL_STORE, &store,
- COL_STRING_FULL_NAME, &full_name,
- COL_BOOL_IS_STORE, &is_store, -1);
-
- if (is_store)
- goto fail;
-
- /* FIXME camel_store_delete_folder_sync() may block. */
- camel_store_delete_folder_sync (store, full_name, NULL, NULL);
-
-fail:
- gtk_tree_path_free (src_path);
- g_free (full_name);
-}
-
-static void
tree_drag_data_get (GtkWidget *widget,
GdkDragContext *context,
GtkSelectionData *selection,
@@ -2005,6 +1963,80 @@ fail:
g_free (uri);
}
+static gboolean
+ask_drop_folder (EMFolderTree *folder_tree,
+ const gchar *src_folder_uri,
+ const gchar *des_full_name,
+ CamelStore *des_store,
+ gboolean is_move)
+{
+ const gchar *key = is_move ? "prompt-on-folder-drop-move" : "prompt-on-folder-drop-copy";
+ EMailSession *session;
+ GSettings *settings;
+ gchar *set_value, *src_folder_name = NULL;
+ GError *error = NULL;
+ GtkWidget *widget;
+ GtkWindow *parent;
+ gint response;
+
+ g_return_val_if_fail (folder_tree != NULL, FALSE);
+ g_return_val_if_fail (src_folder_uri != NULL, FALSE);
+ g_return_val_if_fail (des_full_name != NULL || des_store != NULL, FALSE);
+
+ settings = g_settings_new ("org.gnome.evolution.mail");
+ set_value = g_settings_get_string (settings, key);
+
+ if (g_strcmp0 (set_value, "never") == 0) {
+ g_object_unref (settings);
+ g_free (set_value);
+
+ return FALSE;
+ } else if (g_strcmp0 (set_value, "always") == 0) {
+ g_object_unref (settings);
+ g_free (set_value);
+
+ return TRUE;
+ }
+
+ g_free (set_value);
+
+ session = em_folder_tree_get_session (folder_tree);
+ if (!e_mail_folder_uri_parse (CAMEL_SESSION (session),
+ src_folder_uri, NULL, &src_folder_name, &error)) {
+ g_debug ("%s: Failed to convert '%s' to folder name: %s",
+ G_STRFUNC, src_folder_uri, error ? error->message : "Unknown error");
+ g_clear_error (&error);
+ g_object_unref (settings);
+
+ return FALSE;
+ }
+
+ parent = NULL;
+ widget = gtk_widget_get_toplevel (GTK_WIDGET (folder_tree));
+ if (widget && gtk_widget_is_toplevel (widget) && GTK_IS_WINDOW (widget))
+ parent = GTK_WINDOW (widget);
+
+ widget = e_alert_dialog_new_for_args (
+ parent,
+ is_move ? "mail:ask-folder-drop-move" : "mail:ask-folder-drop-copy",
+ src_folder_name,
+ des_full_name && *des_full_name ? des_full_name :
+ camel_service_get_display_name (CAMEL_SERVICE (des_store)),
+ NULL);
+ response = gtk_dialog_run (GTK_DIALOG (widget));
+ gtk_widget_destroy (widget);
+
+ if (response == GTK_RESPONSE_OK)
+ g_settings_set_string (settings, key, "always");
+ else if (response == GTK_RESPONSE_CANCEL)
+ g_settings_set_string (settings, key, "never");
+
+ g_free (src_folder_name);
+ g_object_unref (settings);
+
+ return response == GTK_RESPONSE_YES || response == GTK_RESPONSE_OK;
+}
+
/* Drop handling */
struct _DragDataReceivedAsync {
MailMsg base;
@@ -2250,6 +2282,16 @@ tree_drag_data_received (GtkWidget *widget,
return;
}
+ if (info == DND_DROP_TYPE_FOLDER &&
+ !ask_drop_folder (folder_tree,
+ (const gchar *) gtk_selection_data_get_data (selection),
+ full_name, store,
+ gdk_drag_context_get_selected_action (context) == GDK_ACTION_MOVE)) {
+ gtk_drag_finish (context, FALSE, FALSE, GDK_CURRENT_TIME);
+ gtk_tree_path_free (dest_path);
+ return;
+ }
+
m = mail_msg_new (&folder_tree_drop_async_info);
m->folder_tree = g_object_ref (folder_tree);
m->session = g_object_ref (session);
@@ -2781,9 +2823,6 @@ em_folder_tree_enable_drag_and_drop (EMFolderTree *folder_tree)
tree_view, "drag-begin",
G_CALLBACK (tree_drag_begin), folder_tree);
g_signal_connect (
- tree_view, "drag-data-delete",
- G_CALLBACK (tree_drag_data_delete), folder_tree);
- g_signal_connect (
tree_view, "drag-data-get",
G_CALLBACK (tree_drag_data_get), folder_tree);
g_signal_connect (
diff --git a/mail/mail.error.xml b/mail/mail.error.xml
index 3a9dab56bf..158a26440b 100644
--- a/mail/mail.error.xml
+++ b/mail/mail.error.xml
@@ -426,6 +426,24 @@ An mbox account will be created to preserve the old mbox folders. You can delete
<button _label="N_ever" response="GTK_RESPONSE_CANCEL"/>
</error>
+ <error id="ask-folder-drop-copy" type="question" default="GTK_RESPONSE_YES">
+ <_primary>Copy folder in folder tree.</_primary>
+ <_secondary xml:space="preserve">Are you sure to copy folder '{0}' to folder '{1}'?</_secondary>
+ <button _label="_Yes" response="GTK_RESPONSE_YES"/>
+ <button _label="_No" response="GTK_RESPONSE_NO"/>
+ <button _label="_Always" response="GTK_RESPONSE_OK"/>
+ <button _label="N_ever" response="GTK_RESPONSE_CANCEL"/>
+ </error>
+
+ <error id="ask-folder-drop-move" type="question" default="GTK_RESPONSE_YES">
+ <_primary>Move folder in folder tree.</_primary>
+ <_secondary xml:space="preserve">Are you sure to move folder '{0}' to folder '{1}'?</_secondary>
+ <button _label="_Yes" response="GTK_RESPONSE_YES"/>
+ <button _label="_No" response="GTK_RESPONSE_NO"/>
+ <button _label="_Always" response="GTK_RESPONSE_OK"/>
+ <button _label="N_ever" response="GTK_RESPONSE_CANCEL"/>
+ </error>
+
<error id="signature-already-exists" type="error" modal="true">
<_primary>Signature Already Exists</_primary>
<_secondary>A signature already exists with the name "{0}". Please specify a different name. </_secondary>