[evolution] Bug 223621 - Add per-account mail Archive Folder option



commit f6c0c8226ef8895f15c0221c94869ac5c663694f
Author: Milan Crha <mcrha redhat com>
Date:   Mon Oct 20 15:16:55 2014 +0200

    Bug 223621 - Add per-account mail Archive Folder option

 data/org.gnome.evolution.mail.gschema.xml.in |    6 +
 libemail-engine/mail-config.c                |   25 +++++
 libemail-engine/mail-config.h                |    1 +
 mail/e-mail-config-defaults-page.c           |   31 ++++++-
 mail/e-mail-reader.c                         |  129 ++++++++++++++++++++++++++
 mail/e-mail-reader.h                         |    3 +-
 mail/mail-config.ui                          |   75 +++++++++++++++
 modules/mail/em-mailer-prefs.c               |   12 +++
 ui/evolution-mail-reader.ui                  |    1 +
 ui/evolution-mail.ui                         |    1 +
 10 files changed, 280 insertions(+), 4 deletions(-)
---
diff --git a/data/org.gnome.evolution.mail.gschema.xml.in b/data/org.gnome.evolution.mail.gschema.xml.in
index c13540d..4f5131b 100644
--- a/data/org.gnome.evolution.mail.gschema.xml.in
+++ b/data/org.gnome.evolution.mail.gschema.xml.in
@@ -562,6 +562,12 @@
     <child name="subscription-window" schema="org.gnome.evolution.window"/>
     <child name="vfolder-window" schema="org.gnome.evolution.window"/>
 
+    <key name="local-archive-folder" type="s">
+      <default>''</default>
+      <_summary>An Archive folder for On This Computer folders.</_summary>
+      <_description>An Archive folder to use for Messages|Archive... feature when in an On This Computer 
folder.</_description>
+    </key>
+
     <!-- The following keys are deprecated. -->
 
     <key name="forward-style" type="i">
diff --git a/libemail-engine/mail-config.c b/libemail-engine/mail-config.c
index e9f3e8e..fe8defb 100644
--- a/libemail-engine/mail-config.c
+++ b/libemail-engine/mail-config.c
@@ -44,6 +44,7 @@ typedef struct {
        gboolean jh_check;
        gboolean book_lookup;
        gboolean book_lookup_local_only;
+       gchar *local_archive_folder;
 } MailConfig;
 
 extern gint camel_header_param_encode_filenames_in_rfc_2047;
@@ -149,6 +150,15 @@ settings_int_value_changed (GSettings *settings,
        *save_location = g_settings_get_int (settings, key);
 }
 
+static void
+settings_string_value_changed (GSettings *settings,
+                              const gchar *key,
+                               gchar **save_location)
+{
+       g_free (*save_location);
+       *save_location = g_settings_get_string (settings, key);
+}
+
 gint
 mail_config_get_address_count (void)
 {
@@ -230,6 +240,14 @@ mail_config_get_lookup_book_local_only (void)
        return config->book_lookup_local_only;
 }
 
+gchar *
+mail_config_dup_local_archive_folder (void)
+{
+       g_return_val_if_fail (config != NULL, NULL);
+
+       return g_strdup (config->local_archive_folder);
+}
+
 /* Config struct routines */
 void
 mail_config_init (EMailSession *session)
@@ -292,5 +310,12 @@ mail_config_init (EMailSession *session)
        config->book_lookup_local_only = g_settings_get_boolean (
                mail_settings, "junk-lookup-addressbook-local-only");
 
+       g_signal_connect (
+               mail_settings, "changed::local-archive-folder",
+               G_CALLBACK (settings_string_value_changed),
+               &config->local_archive_folder);
+       config->local_archive_folder = g_settings_get_string (
+               mail_settings, "local-archive-folder");
+
        settings_jh_check_changed (mail_settings, NULL, session);
 }
diff --git a/libemail-engine/mail-config.h b/libemail-engine/mail-config.h
index dd874dd..5e440ef 100644
--- a/libemail-engine/mail-config.h
+++ b/libemail-engine/mail-config.h
@@ -45,6 +45,7 @@ gint          mail_config_get_sync_timeout    (void);
 void           mail_config_reload_junk_headers (EMailSession *session);
 gboolean       mail_config_get_lookup_book     (void);
 gboolean       mail_config_get_lookup_book_local_only (void);
+gchar *                mail_config_dup_local_archive_folder (void);
 
 G_END_DECLS
 
diff --git a/mail/e-mail-config-defaults-page.c b/mail/e-mail-config-defaults-page.c
index 8ef2882..9ca110c 100644
--- a/mail/e-mail-config-defaults-page.c
+++ b/mail/e-mail-config-defaults-page.c
@@ -36,6 +36,7 @@ struct _EMailConfigDefaultsPagePrivate {
 
        GtkWidget *drafts_button;  /* not referenced */
        GtkWidget *sent_button;    /* not referenced */
+       GtkWidget *archive_button; /* not referenced */
        GtkWidget *replies_toggle; /* not referenced */
        GtkWidget *trash_toggle;   /* not referenced */
        GtkWidget *junk_toggle;    /* not referenced */
@@ -624,9 +625,33 @@ mail_config_defaults_page_constructed (GObject *object)
                G_BINDING_BIDIRECTIONAL |
                G_BINDING_SYNC_CREATE);
 
+       text = _("Archi_ve Folder:");
+       widget = gtk_label_new_with_mnemonic (text);
+       gtk_widget_set_margin_left (widget, 12);
+       gtk_size_group_add_widget (size_group, widget);
+       gtk_misc_set_alignment (GTK_MISC (widget), 1.0, 0.5);
+       gtk_grid_attach (GTK_GRID (container), widget, 0, 4, 1, 1);
+       gtk_widget_show (widget);
+
+       label = GTK_LABEL (widget);
+
+       text = _("Choose a folder to archive messages to.");
+       widget = em_folder_selection_button_new (session, "", text);
+       gtk_widget_set_hexpand (widget, TRUE);
+       gtk_label_set_mnemonic_widget (label, widget);
+       gtk_grid_attach (GTK_GRID (container), widget, 1, 4, 1, 1);
+       page->priv->archive_button = widget;  /* not referenced */
+       gtk_widget_show (widget);
+
+       e_binding_bind_object_text_property (
+               account_ext, "archive-folder",
+               widget, "folder-uri",
+               G_BINDING_BIDIRECTIONAL |
+               G_BINDING_SYNC_CREATE);
+
        widget = gtk_button_new_with_mnemonic (_("_Restore Defaults"));
        gtk_widget_set_halign (widget, GTK_ALIGN_START);
-       gtk_grid_attach (GTK_GRID (container), widget, 1, 6, 1, 1);
+       gtk_grid_attach (GTK_GRID (container), widget, 1, 7, 1, 1);
        gtk_widget_show (widget);
 
        g_signal_connect_swapped (
@@ -642,7 +667,7 @@ mail_config_defaults_page_constructed (GObject *object)
                _("Choose a folder for deleted messages."),
                "real-trash-path", "use-real-trash-path");
        if (widget != NULL) {
-               gtk_grid_attach (GTK_GRID (container), widget, 0, 4, 2, 1);
+               gtk_grid_attach (GTK_GRID (container), widget, 0, 5, 2, 1);
                gtk_widget_show (widget);
        }
 
@@ -652,7 +677,7 @@ mail_config_defaults_page_constructed (GObject *object)
                _("Choose a folder for junk messages."),
                "real-junk-path", "use-real-junk-path");
        if (widget != NULL) {
-               gtk_grid_attach (GTK_GRID (container), widget, 0, 5, 2, 1);
+               gtk_grid_attach (GTK_GRID (container), widget, 0, 6, 2, 1);
                gtk_widget_show (widget);
        }
 
diff --git a/mail/e-mail-reader.c b/mail/e-mail-reader.c
index 162f17f..900fe15 100644
--- a/mail/e-mail-reader.c
+++ b/mail/e-mail-reader.c
@@ -819,6 +819,108 @@ action_mail_message_open_cb (GtkAction *action,
        e_mail_reader_open_selected_mail (reader);
 }
 
+static gchar *
+mail_reader_get_archive_folder_from_folder (CamelFolder *folder,
+                                           ESourceRegistry *registry,
+                                           GPtrArray *uids,
+                                           gboolean deep_uids_check)
+{
+       CamelStore *store;
+       ESource *source = NULL;
+       gchar *archive_folder = NULL;
+
+       if (!folder)
+               return NULL;
+
+       store = camel_folder_get_parent_store (folder);
+       if (g_strcmp0 (E_MAIL_SESSION_LOCAL_UID, camel_service_get_uid (CAMEL_SERVICE (store))) == 0) {
+               return mail_config_dup_local_archive_folder ();
+       }
+
+       if (CAMEL_IS_VEE_FOLDER (folder) && uids && uids->len > 0) {
+               CamelVeeFolder *vee_folder = CAMEL_VEE_FOLDER (folder);
+               CamelFolder *orig_folder;
+
+               store = NULL;
+
+               if (deep_uids_check) {
+                       gint ii;
+
+                       for (ii = 0; ii < uids->len; ii++) {
+                               orig_folder = camel_vee_folder_get_vee_uid_folder (vee_folder, 
uids->pdata[ii]);
+                               if (orig_folder) {
+                                       if (store && camel_folder_get_parent_store (orig_folder) != store) {
+                                               /* Do not know which archive folder to use when there are
+                                                  selected messages from multiple accounts/stores. */
+                                               store = NULL;
+                                               break;
+                                       }
+
+                                       store = camel_folder_get_parent_store (orig_folder);
+                               }
+                       }
+               } else {
+                       orig_folder = camel_vee_folder_get_vee_uid_folder (CAMEL_VEE_FOLDER (folder), 
uids->pdata[0]);
+                       if (orig_folder)
+                               store = camel_folder_get_parent_store (orig_folder);
+               }
+       }
+
+       if (store)
+               source = e_source_registry_ref_source (registry, camel_service_get_uid (CAMEL_SERVICE 
(store)));
+
+       if (source) {
+               if (e_source_has_extension (source, E_SOURCE_EXTENSION_MAIL_ACCOUNT)) {
+                       ESourceMailAccount *account_ext;
+
+                       account_ext = e_source_get_extension (source, E_SOURCE_EXTENSION_MAIL_ACCOUNT);
+
+                       archive_folder = e_source_mail_account_dup_archive_folder (account_ext);
+                       if (!archive_folder || !*archive_folder) {
+                               g_free (archive_folder);
+                               archive_folder = NULL;
+                       }
+               }
+
+               g_object_unref (source);
+       }
+
+       return archive_folder;
+}
+
+static void
+action_mail_archive_cb (GtkAction *action,
+                       EMailReader *reader)
+{
+       CamelFolder *folder;
+       EMailBackend *backend;
+       EMailSession *session;
+       EShell *shell;
+       ESourceRegistry *registry;
+       GPtrArray *uids;
+       gchar *archive_folder;
+
+       backend = e_mail_reader_get_backend (reader);
+       session = e_mail_backend_get_session (backend);
+       shell = e_shell_backend_get_shell (E_SHELL_BACKEND (backend));
+       registry = e_shell_get_registry (shell);
+
+       uids = e_mail_reader_get_selected_uids (reader);
+       g_return_if_fail (uids != NULL);
+
+       folder = e_mail_reader_ref_folder (reader);
+       archive_folder = mail_reader_get_archive_folder_from_folder (folder, registry, uids, TRUE);
+
+       if (archive_folder != NULL)
+               mail_transfer_messages (
+                       session, folder, uids,
+                       TRUE, archive_folder, 0, NULL, NULL);
+
+       g_clear_object (&folder);
+       g_ptr_array_unref (uids);
+       g_free (archive_folder);
+}
+
 static void
 action_mail_move_cb (GtkAction *action,
                      EMailReader *reader)
@@ -1868,6 +1970,13 @@ static GtkActionEntry mail_reader_entries[] = {
          N_("Add sender to address book"),
          G_CALLBACK (action_mail_add_sender_cb) },
 
+       { "mail-archive",
+         "mail-move",
+         N_("_Archive..."),
+         "<Shift><Control>a",
+         N_("Move selected messages to the Archive folder for the account"),
+         G_CALLBACK (action_mail_archive_cb) },
+
        { "mail-check-for-junk",
          "mail-mark-junk",
          N_("Check for _Junk"),
@@ -2324,6 +2433,10 @@ static GtkActionEntry mail_reader_search_folder_entries[] = {
 
 static EPopupActionEntry mail_reader_popup_entries[] = {
 
+       { "mail-popup-archive",
+         NULL,
+         "mail-archive" },
+
        { "mail-popup-copy",
          NULL,
          "mail-copy" },
@@ -3361,6 +3474,11 @@ mail_reader_update_actions (EMailReader *reader,
        action = e_mail_reader_get_action (reader, action_name);
        gtk_action_set_sensitive (action, sensitive);
 
+       action_name = "mail-archive";
+       sensitive = any_messages_selected && (state & E_MAIL_READER_FOLDER_ARCHIVE_FOLDER_SET) != 0;
+       action = e_mail_reader_get_action (reader, action_name);
+       gtk_action_set_sensitive (action, sensitive);
+
        action_name = "mail-check-for-junk";
        sensitive = any_messages_selected;
        action = e_mail_reader_get_action (reader, action_name);
@@ -4098,6 +4216,7 @@ e_mail_reader_check_state (EMailReader *reader)
        gboolean is_mailing_list;
        gboolean is_junk_folder = FALSE;
        gboolean is_vtrash_folder = FALSE;
+       gboolean archive_folder_set = FALSE;
        guint32 state = 0;
        guint ii;
 
@@ -4114,6 +4233,8 @@ e_mail_reader_check_state (EMailReader *reader)
        uids = e_mail_reader_get_selected_uids (reader);
 
        if (folder != NULL) {
+               gchar *archive_folder;
+
                store = camel_folder_get_parent_store (folder);
                store_supports_vjunk = (store->flags & CAMEL_STORE_VJUNK);
                is_junk_folder =
@@ -4122,6 +4243,12 @@ e_mail_reader_check_state (EMailReader *reader)
                drafts_or_outbox =
                        em_utils_folder_is_drafts (registry, folder) ||
                        em_utils_folder_is_outbox (registry, folder);
+
+               archive_folder = mail_reader_get_archive_folder_from_folder (folder, registry, uids, TRUE);
+               if (archive_folder && *archive_folder)
+                       archive_folder_set = TRUE;
+
+               g_free (archive_folder);
        }
 
        /* Initialize this flag based on whether there are any
@@ -4248,6 +4375,8 @@ e_mail_reader_check_state (EMailReader *reader)
                state |= E_MAIL_READER_FOLDER_IS_JUNK;
        if (is_vtrash_folder)
                state |= E_MAIL_READER_FOLDER_IS_VTRASH;
+       if (archive_folder_set)
+               state |= E_MAIL_READER_FOLDER_ARCHIVE_FOLDER_SET;
 
        g_clear_object (&folder);
        g_ptr_array_unref (uids);
diff --git a/mail/e-mail-reader.h b/mail/e-mail-reader.h
index 5d081c2..0d83e81 100644
--- a/mail/e-mail-reader.h
+++ b/mail/e-mail-reader.h
@@ -87,7 +87,8 @@ enum {
        E_MAIL_READER_SELECTION_HAS_ATTACHMENTS = 1 << 15,
        E_MAIL_READER_SELECTION_IS_MAILING_LIST = 1 << 16,
        E_MAIL_READER_FOLDER_IS_JUNK = 1 << 17,
-       E_MAIL_READER_FOLDER_IS_VTRASH = 1 << 18
+       E_MAIL_READER_FOLDER_IS_VTRASH = 1 << 18,
+       E_MAIL_READER_FOLDER_ARCHIVE_FOLDER_SET = 1 << 19
 };
 
 struct _EMailReaderInterface {
diff --git a/mail/mail-config.ui b/mail/mail-config.ui
index a788ea5..b4baab1 100644
--- a/mail/mail-config.ui
+++ b/mail/mail-config.ui
@@ -2028,6 +2028,81 @@
             <property name="position">2</property>
           </packing>
         </child>
+
+        <child>
+          <object class="GtkVBox" id="archive-mail-section">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="spacing">6</property>
+            <child>
+              <object class="GtkLabel" id="archive-mail-header">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="xalign">0</property>
+                <property name="label" translatable="yes">Archive Mail</property>
+                <attributes>
+                  <attribute name="weight" value="bold"/>
+                </attributes>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkAlignment" id="archive-mail-alignment">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="left_padding">12</property>
+                <child>
+                  <object class="GtkVBox" id="archive-mail-vbox">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="spacing">6</property>
+                    <child>
+                      <object class="GtkHBox" id="archive-mail-hbox">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="spacing">4</property>
+                        <child>
+                          <object class="GtkLabel" id="lblArchiveMailFolder">
+                            <property name="label" translatable="yes">On This Computer A_rchive 
folder:</property>
+                            <property name="tooltip-text" translatable="yes">Archive folder to use for On 
This Computer messages</property>
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="use-underline">True</property>
+                            <property name="xalign">0</property>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">False</property>
+                            <property name="position">0</property>
+                          </packing>
+                        </child>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                        <property name="position">0</property>
+                      </packing>
+                    </child>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="position">3</property>
+          </packing>
+        </child>
       </object>
       <packing>
         <property name="tab_fill">False</property>
diff --git a/modules/mail/em-mailer-prefs.c b/modules/mail/em-mailer-prefs.c
index 0e2b11b..fc7c99c 100644
--- a/modules/mail/em-mailer-prefs.c
+++ b/modules/mail/em-mailer-prefs.c
@@ -1075,6 +1075,18 @@ em_mailer_prefs_construct (EMMailerPrefs *prefs,
                widget, "sensitive",
                G_SETTINGS_BIND_GET);
 
+       container = e_builder_get_widget (prefs->builder, "archive-mail-hbox");
+       widget = em_folder_selection_button_new (session, "", _("Choose a folder to archive messages to."));
+       gtk_widget_set_hexpand (widget, FALSE);
+       gtk_label_set_mnemonic_widget (GTK_LABEL (e_builder_get_widget (prefs->builder, 
"lblArchiveMailFolder")), widget);
+       gtk_container_add (GTK_CONTAINER (container), widget);
+       gtk_widget_show (widget);
+
+       g_settings_bind (
+               settings, "local-archive-folder",
+               widget, "folder-uri",
+               G_SETTINGS_BIND_DEFAULT);
+
        /* always de-sensitised until the user types something in the entry */
        prefs->add_header = GTK_BUTTON (e_builder_get_widget (prefs->builder, "cmdHeadersAdd"));
        gtk_widget_set_sensitive ((GtkWidget *) prefs->add_header, FALSE);
diff --git a/ui/evolution-mail-reader.ui b/ui/evolution-mail-reader.ui
index 562f34f..0e772b6 100644
--- a/ui/evolution-mail-reader.ui
+++ b/ui/evolution-mail-reader.ui
@@ -72,6 +72,7 @@
         <separator/>
         <menuitem action='mail-copy'/>
         <menuitem action='mail-move'/>
+        <menuitem action='mail-archive'/>
         <separator/>
         <menu action='mail-mark-as-menu'>
           <menuitem action="mail-mark-read"/>
diff --git a/ui/evolution-mail.ui b/ui/evolution-mail.ui
index f9701dd..c8fc9f2 100644
--- a/ui/evolution-mail.ui
+++ b/ui/evolution-mail.ui
@@ -101,6 +101,7 @@
     <menuitem action='mail-popup-undelete'/>
     <menuitem action='mail-popup-copy'/>
     <menuitem action='mail-popup-move'/>
+    <menuitem action='mail-popup-archive'/>
     <separator/>
     <menuitem action='mail-popup-mark-read'/>
     <menuitem action='mail-popup-mark-unread'/>


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]