[evolution] Bug 773419 - Age limit for offline message download



commit 9e9e3c5d3e17eca58d9f01106d4342420f066fb1
Author: Milan Crha <mcrha redhat com>
Date:   Mon Dec 12 22:23:40 2016 +0100

    Bug 773419 - Age limit for offline message download

 po/POTFILES.in                                     |    1 +
 src/e-util/e-dialog-widgets.c                      |  123 +++++++++++++++++++
 src/e-util/e-dialog-widgets.h                      |    4 +
 src/mail/e-mail-config-provider-page.c             |   66 +++++++++++
 src/mail/e-mail-config-provider-page.h             |    3 +
 src/modules/mail-config/CMakeLists.txt             |    2 +
 .../mail-config/e-mail-config-imapx-options.c      |  124 ++++++++++++++++++++
 .../mail-config/e-mail-config-imapx-options.h      |   28 +++++
 src/modules/mail-config/evolution-mail-config.c    |    4 +-
 9 files changed, 354 insertions(+), 1 deletions(-)
---
diff --git a/po/POTFILES.in b/po/POTFILES.in
index d52cf97..a907a98 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -197,6 +197,7 @@ src/e-util/e-color-combo.c
 src/e-util/e-dateedit.c
 src/e-util/e-datetime-format.c
 src/e-util/e-dialog-utils.c
+src/e-util/e-dialog-widgets.c
 src/e-util/e-emoticon-chooser.c
 src/e-util/e-file-utils.c
 src/e-util/e-filter-datespec.c
diff --git a/src/e-util/e-dialog-widgets.c b/src/e-util/e-dialog-widgets.c
index a2618a5..fd23d8d 100644
--- a/src/e-util/e-dialog-widgets.c
+++ b/src/e-util/e-dialog-widgets.c
@@ -27,6 +27,9 @@
 #include <string.h>
 #include <time.h>
 #include <gtk/gtk.h>
+#include <glib/gi18n-lib.h>
+
+#include <libedataserver/libedataserver.h>
 
 #include "e-dialog-widgets.h"
 
@@ -166,3 +169,123 @@ e_dialog_button_new_with_icon (const gchar *icon_name,
 
        return button;
 }
+
+static GtkWidget *
+dialog_widgets_construct_time_units_combo (void)
+{
+       struct _units {
+               const gchar *nick;
+               const gchar *caption;
+       } units[4] = {
+               /* Translators: This is part of: "Do not synchronize locally mails older than [ xxx ] [ days 
]" */
+               { "days", NC_("time-unit", "days") },
+               /* Translators: This is part of: "Do not synchronize locally mails older than [ xxx ] [ weeks 
]" */
+               { "weeks", NC_("time-unit", "weeks") },
+               /* Translators: This is part of: "Do not synchronize locally mails older than [ xxx ] [ 
months ]" */
+               { "months", NC_("time-unit", "months") },
+               /* Translators: This is part of: "Do not synchronize locally mails older than [ xxx ] [ years 
]" */
+               { "years", NC_("time-unit", "years") }
+       };
+       gint ii;
+       GtkCellRenderer *renderer;
+       GtkListStore *store;
+       GtkWidget *combo;
+
+       /* 0: 'nick', 1: caption */
+       store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING);
+
+       for (ii = 0; ii < G_N_ELEMENTS (units); ii++) {
+               GtkTreeIter iter;
+               const gchar *caption;
+
+               /* Localize the caption. */
+               caption = g_dpgettext2 (GETTEXT_PACKAGE, "time-unit", units[ii].caption);
+
+               gtk_list_store_append (store, &iter);
+               gtk_list_store_set (store, &iter, 0, units[ii].nick, 1, caption, -1);
+       }
+
+       combo = gtk_combo_box_new_with_model (GTK_TREE_MODEL (store));
+       gtk_combo_box_set_id_column (GTK_COMBO_BOX (combo), 0);
+
+       renderer = gtk_cell_renderer_text_new ();
+       gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo), renderer, TRUE);
+       gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combo), renderer, "text", 1, NULL);
+
+       g_object_unref (store);
+
+       return combo;
+}
+
+/**
+ * e_dialog_offline_settings_new_limit_box:
+ * @offline_settings: a #CamelOfflineSettings
+ *
+ * Creates a new horizontal #GtkBox, which contains widgets
+ * to configure @offline_settings properties limit-by-age,
+ * limit-unit and limit-value.
+ *
+ * Returns: (transfer full): a new #GtkBox
+ *
+ * Since: 3.24
+ **/
+GtkWidget *
+e_dialog_offline_settings_new_limit_box (CamelOfflineSettings *offline_settings)
+{
+       GtkAdjustment *adjustment;
+       GtkWidget *hbox, *spin, *combo;
+       GtkWidget *prefix;
+
+       g_return_val_if_fail (CAMEL_IS_OFFLINE_SETTINGS (offline_settings), NULL);
+
+       hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 3);
+       gtk_widget_show (hbox);
+
+       /* Translators: This is part of: "Do not synchronize locally mails older than [ xxx ] [ days ]" */
+       prefix = gtk_check_button_new_with_mnemonic (_("Do not synchronize locally mails older than"));
+       gtk_box_pack_start (GTK_BOX (hbox), prefix, FALSE, TRUE, 0);
+       gtk_widget_show (prefix);
+
+       e_binding_bind_property (
+               offline_settings, "limit-by-age",
+               prefix, "active",
+               G_BINDING_BIDIRECTIONAL |
+               G_BINDING_SYNC_CREATE);
+
+       adjustment = gtk_adjustment_new (1.0, 1.0, 999.0, 1.0, 1.0, 0.0);
+
+       spin = gtk_spin_button_new (adjustment, 1.0, 0);
+       gtk_box_pack_start (GTK_BOX (hbox), spin, FALSE, TRUE, 0);
+       gtk_widget_show (spin);
+
+       e_binding_bind_property (
+               offline_settings, "limit-value",
+               spin, "value",
+               G_BINDING_BIDIRECTIONAL |
+               G_BINDING_SYNC_CREATE);
+
+       e_binding_bind_property (
+               prefix, "active",
+               spin, "sensitive",
+               G_BINDING_SYNC_CREATE);
+
+       combo = dialog_widgets_construct_time_units_combo ();
+       gtk_box_pack_start (GTK_BOX (hbox), combo, FALSE, FALSE, 0);
+       gtk_widget_show (combo);
+
+       e_binding_bind_property_full (
+               offline_settings, "limit-unit",
+               combo, "active-id",
+               G_BINDING_BIDIRECTIONAL |
+               G_BINDING_SYNC_CREATE,
+               e_binding_transform_enum_value_to_nick,
+               e_binding_transform_enum_nick_to_value,
+               NULL, NULL);
+
+       e_binding_bind_property (
+               prefix, "active",
+               combo, "sensitive",
+               G_BINDING_SYNC_CREATE);
+
+       return hbox;
+}
diff --git a/src/e-util/e-dialog-widgets.h b/src/e-util/e-dialog-widgets.h
index f2f9ef3..8e0323b 100644
--- a/src/e-util/e-dialog-widgets.h
+++ b/src/e-util/e-dialog-widgets.h
@@ -29,6 +29,7 @@
 #define E_DIALOG_WIDGETS_H
 
 #include <gtk/gtk.h>
+#include <camel/camel.h>
 
 void e_dialog_combo_box_set (GtkWidget *widget, gint value, const gint *value_map);
 gint e_dialog_combo_box_get (GtkWidget *widget, const gint *value_map);
@@ -36,4 +37,7 @@ gint e_dialog_combo_box_get (GtkWidget *widget, const gint *value_map);
 GtkWidget *    e_dialog_button_new_with_icon   (const gchar *icon_name,
                                                 const gchar *label);
 
+GtkWidget *    e_dialog_offline_settings_new_limit_box
+                                               (CamelOfflineSettings *offline_settings);
+
 #endif
diff --git a/src/mail/e-mail-config-provider-page.c b/src/mail/e-mail-config-provider-page.c
index efd0781..65cc1ec 100644
--- a/src/mail/e-mail-config-provider-page.c
+++ b/src/mail/e-mail-config-provider-page.c
@@ -469,6 +469,27 @@ mail_config_provider_page_add_options (EMailConfigProviderPage *page,
 }
 
 static void
+mail_config_provider_page_add_placeholder (EMailConfigProviderPage *page,
+                                          CamelProviderConfEntry *entry)
+{
+       GtkWidget *hbox;
+
+       /* The entry->name is used as an identifier of the placeholder,
+          which is used with e_mail_config_provider_page_get_placeholder(). */
+
+       g_return_if_fail (entry->name && *(entry->name));
+
+       hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+       gtk_widget_set_name (hbox, entry->name);
+       gtk_box_set_spacing (GTK_BOX (hbox), 6);
+       gtk_widget_set_margin_left (hbox, STANDARD_MARGIN);
+       gtk_box_pack_start (GTK_BOX (page), hbox, FALSE, FALSE, 0);
+       gtk_widget_show (hbox);
+
+       mail_config_provider_page_handle_dependency (page, entry, hbox);
+}
+
+static void
 mail_config_provider_page_add_widgets (EMailConfigProviderPage *page)
 {
        EMailConfigServiceBackend *backend;
@@ -599,6 +620,11 @@ mail_config_provider_page_add_widgets (EMailConfigProviderPage *page)
                                        page, &entries[ii]);
                                break;
 
+                       case CAMEL_PROVIDER_CONF_PLACEHOLDER:
+                               mail_config_provider_page_add_placeholder (
+                                       page, &entries[ii]);
+                               break;
+
                        default:
                                break;  /* skip it */
                }
@@ -760,3 +786,43 @@ e_mail_config_provider_page_get_backend (EMailConfigProviderPage *page)
        return page->priv->backend;
 }
 
+typedef struct _FindPlaceholderData {
+       const gchar *name;
+       GtkBox *box;
+} FindPlaceholderData;
+
+static void
+mail_config_provider_page_find_placeholder (GtkWidget *widget,
+                                           gpointer user_data)
+{
+       FindPlaceholderData *fpd = user_data;
+
+       g_return_if_fail (fpd != NULL);
+
+       if (g_strcmp0 (fpd->name, gtk_widget_get_name (widget)) == 0) {
+               if (fpd->box) {
+                       g_warning ("%s: Found multiple placeholders named '%s'", G_STRFUNC, fpd->name);
+               } else {
+                       g_return_if_fail (GTK_IS_BOX (widget));
+
+                       fpd->box = GTK_BOX (widget);
+               }
+       }
+}
+
+GtkBox *
+e_mail_config_provider_page_get_placeholder (EMailConfigProviderPage *page,
+                                            const gchar *name)
+{
+       FindPlaceholderData fpd;
+
+       g_return_val_if_fail (E_IS_MAIL_CONFIG_PROVIDER_PAGE (page), NULL);
+       g_return_val_if_fail (name && *name, NULL);
+
+       fpd.name = name;
+       fpd.box = NULL;
+
+       gtk_container_foreach (GTK_CONTAINER (page), mail_config_provider_page_find_placeholder, &fpd);
+
+       return fpd.box;
+}
diff --git a/src/mail/e-mail-config-provider-page.h b/src/mail/e-mail-config-provider-page.h
index ec9c5ff..6cf3e94 100644
--- a/src/mail/e-mail-config-provider-page.h
+++ b/src/mail/e-mail-config-provider-page.h
@@ -75,6 +75,9 @@ gboolean      e_mail_config_provider_page_is_empty
 EMailConfigServiceBackend *
                e_mail_config_provider_page_get_backend
                                        (EMailConfigProviderPage *page);
+GtkBox *       e_mail_config_provider_page_get_placeholder
+                                       (EMailConfigProviderPage *page,
+                                        const gchar *name);
 
 G_END_DECLS
 
diff --git a/src/modules/mail-config/CMakeLists.txt b/src/modules/mail-config/CMakeLists.txt
index 4061ce2..da58249 100644
--- a/src/modules/mail-config/CMakeLists.txt
+++ b/src/modules/mail-config/CMakeLists.txt
@@ -6,6 +6,8 @@ set(sources
        evolution-mail-config.c
        e-mail-config-local-accounts.c
        e-mail-config-remote-accounts.c
+       e-mail-config-imapx-options.c
+       e-mail-config-imapx-options.h
        e-mail-config-sendmail-backend.c
        e-mail-config-sendmail-backend.h
        e-mail-config-smtp-backend.c
diff --git a/src/modules/mail-config/e-mail-config-imapx-options.c 
b/src/modules/mail-config/e-mail-config-imapx-options.c
new file mode 100644
index 0000000..92ad1b2
--- /dev/null
+++ b/src/modules/mail-config/e-mail-config-imapx-options.c
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2016 Red Hat, Inc. (www.redhat.com)
+ *
+ * This library is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "evolution-config.h"
+
+#include <libebackend/libebackend.h>
+#include <libedataserver/libedataserver.h>
+
+#include "e-util/e-util.h"
+#include "mail/e-mail-config-provider-page.h"
+
+#include "e-mail-config-imapx-options.h"
+
+/* Standard GObject macros */
+#define E_TYPE_MAIL_CONFIG_IMAPX_OPTIONS \
+       (e_mail_config_imapx_options_get_type ())
+#define E_MAIL_CONFIG_IMAPX_OPTIONS(obj) \
+       (G_TYPE_CHECK_INSTANCE_CAST \
+       ((obj), E_TYPE_MAIL_CONFIG_IMAPX_OPTIONS, EMailConfigIMAPxOptions))
+#define E_MAIL_CONFIG_IMAPX_OPTIONS_CLASS(cls) \
+       (G_TYPE_CHECK_CLASS_CAST \
+       ((cls), E_TYPE_MAIL_CONFIG_IMAPX_OPTIONS, EMailConfigIMAPxOptionsClass))
+#define E_IS_MAIL_CONFIG_IMAPX_OPTIONS(obj) \
+       (G_TYPE_CHECK_INSTANCE_TYPE \
+       ((obj), E_TYPE_MAIL_CONFIG_IMAPX_OPTIONS))
+#define E_IS_MAIL_CONFIG_IMAPX_OPTIONS_CLASS(cls) \
+       (G_TYPE_CHECK_CLASS_TYPE \
+       ((cls), E_TYPE_MAIL_CONFIG_IMAPX_OPTIONS))
+#define E_MAIL_CONFIG_IMAPX_OPTIONS_GET_CLASS(obj) \
+       (G_TYPE_INSTANCE_GET_CLASS \
+       ((obj), E_TYPE_MAIL_CONFIG_IMAPX_OPTIONS, EMailConfigIMAPxOptionsClass))
+
+typedef struct _EMailConfigIMAPxOptions EMailConfigIMAPxOptions;
+typedef struct _EMailConfigIMAPxOptionsClass EMailConfigIMAPxOptionsClass;
+
+struct _EMailConfigIMAPxOptions {
+       EExtension parent;
+};
+
+struct _EMailConfigIMAPxOptionsClass {
+       EExtensionClass parent_class;
+};
+
+GType          e_mail_config_imapx_options_get_type
+                                               (void) G_GNUC_CONST;
+
+G_DEFINE_DYNAMIC_TYPE (EMailConfigIMAPxOptions, e_mail_config_imapx_options, E_TYPE_EXTENSION)
+
+static void
+mail_config_imapx_options_constructed (GObject *object)
+{
+       EMailConfigProviderPage *provider_page;
+       EMailConfigServiceBackend *backend;
+       CamelProvider *provider;
+       CamelSettings *settings;
+       GtkBox *placeholder;
+       GtkWidget *hbox;
+
+       /* Chain up to parent's constructed() method. */
+       G_OBJECT_CLASS (e_mail_config_imapx_options_parent_class)->constructed (object);
+
+       provider_page = E_MAIL_CONFIG_PROVIDER_PAGE (e_extension_get_extensible (E_EXTENSION (object)));
+       backend = e_mail_config_provider_page_get_backend (provider_page);
+       provider = e_mail_config_service_backend_get_provider (backend);
+       settings = e_mail_config_service_backend_get_settings (backend);
+
+       if (e_mail_config_provider_page_is_empty (provider_page) ||
+           !provider || g_strcmp0 (provider->protocol, "imapx") != 0)
+               return;
+
+       g_return_if_fail (CAMEL_IS_OFFLINE_SETTINGS (settings));
+
+       placeholder = e_mail_config_provider_page_get_placeholder (provider_page, 
"imapx-limit-by-age-placeholder");
+       g_return_if_fail (placeholder != NULL);
+
+       hbox = e_dialog_offline_settings_new_limit_box (CAMEL_OFFLINE_SETTINGS (settings));
+       gtk_box_pack_start (placeholder, hbox, FALSE, FALSE, 0);
+       gtk_widget_show (hbox);
+}
+
+static void
+e_mail_config_imapx_options_class_init (EMailConfigIMAPxOptionsClass *class)
+{
+       GObjectClass *object_class;
+       EExtensionClass *extension_class;
+
+       object_class = G_OBJECT_CLASS (class);
+       object_class->constructed = mail_config_imapx_options_constructed;
+
+       extension_class = E_EXTENSION_CLASS (class);
+       extension_class->extensible_type = E_TYPE_MAIL_CONFIG_PROVIDER_PAGE;
+}
+
+static void
+e_mail_config_imapx_options_class_finalize (EMailConfigIMAPxOptionsClass *class)
+{
+}
+
+static void
+e_mail_config_imapx_options_init (EMailConfigIMAPxOptions *extension)
+{
+}
+
+void
+e_mail_config_imapx_options_type_register (GTypeModule *type_module)
+{
+       /* XXX G_DEFINE_DYNAMIC_TYPE declares a static type registration
+        *     function, so we have to wrap it with a public function in
+        *     order to register types from a separate compilation unit. */
+       e_mail_config_imapx_options_register_type (type_module);
+}
diff --git a/src/modules/mail-config/e-mail-config-imapx-options.h 
b/src/modules/mail-config/e-mail-config-imapx-options.h
new file mode 100644
index 0000000..bf6a307
--- /dev/null
+++ b/src/modules/mail-config/e-mail-config-imapx-options.h
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2016 Red Hat, Inc. (www.redhat.com)
+ *
+ * This library is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef E_MAIL_CONFIG_IMAPX_OPTIONS_H
+#define E_MAIL_CONFIG_IMAPX_OPTIONS_H
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+void e_mail_config_imapx_options_type_register (GTypeModule *type_module);
+
+G_END_DECLS
+
+#endif /* E_MAIL_CONFIG_IMAPX_OPTIONS_H */
diff --git a/src/modules/mail-config/evolution-mail-config.c b/src/modules/mail-config/evolution-mail-config.c
index 9a51360..67763b9 100644
--- a/src/modules/mail-config/evolution-mail-config.c
+++ b/src/modules/mail-config/evolution-mail-config.c
@@ -21,6 +21,8 @@
 #include "e-mail-config-sendmail-backend.h"
 #include "e-mail-config-smtp-backend.h"
 
+#include "e-mail-config-imapx-options.h"
+
 #include "e-mail-config-google-summary.h"
 #include "e-mail-config-yahoo-summary.h"
 
@@ -30,13 +32,13 @@ void e_module_unload (GTypeModule *type_module);
 
 void e_mail_config_local_accounts_register_types (GTypeModule *type_module);
 void e_mail_config_remote_accounts_register_types (GTypeModule *type_module);
-void e_mail_config_transports_register_types (GTypeModule *type_module);
 
 G_MODULE_EXPORT void
 e_module_load (GTypeModule *type_module)
 {
        e_mail_config_local_accounts_register_types (type_module);
        e_mail_config_remote_accounts_register_types (type_module);
+       e_mail_config_imapx_options_type_register (type_module);
        e_mail_config_sendmail_backend_type_register (type_module);
        e_mail_config_smtp_backend_type_register (type_module);
 


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