aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthew Barnes <mbarnes@redhat.com>2013-06-05 21:24:02 +0800
committerMatthew Barnes <mbarnes@redhat.com>2013-06-06 01:03:45 +0800
commit3e8b6ddf8d9e090e0769faede1d68337e240e58d (patch)
treec5a0ec9d9489564180a73ab10650dabfee4dfccf
parentd388f9b5cf89e6e0c39def1946997baa1aa8b814 (diff)
downloadgsoc2013-evolution-3e8b6ddf8d9e090e0769faede1d68337e240e58d.tar.gz
gsoc2013-evolution-3e8b6ddf8d9e090e0769faede1d68337e240e58d.tar.zst
gsoc2013-evolution-3e8b6ddf8d9e090e0769faede1d68337e240e58d.zip
Add "show-headers" settings key.
Replaces the "headers" key. Whereas "headers" is an array of XML blobs, the "show-headers" key is an array of string/boolean pairs. Also update the appropriate places to get/set the new key.
-rw-r--r--data/org.gnome.evolution.mail.gschema.xml.in11
-rw-r--r--modules/mail/em-mailer-prefs.c187
-rw-r--r--modules/settings/e-settings-deprecated.c118
-rw-r--r--modules/settings/e-settings-mail-formatter.c27
4 files changed, 243 insertions, 100 deletions
diff --git a/data/org.gnome.evolution.mail.gschema.xml.in b/data/org.gnome.evolution.mail.gschema.xml.in
index 71fff625dc..249f2d8436 100644
--- a/data/org.gnome.evolution.mail.gschema.xml.in
+++ b/data/org.gnome.evolution.mail.gschema.xml.in
@@ -231,10 +231,10 @@
<_summary>Show all message headers</_summary>
<_description>Show all the headers when viewing a messages.</_description>
</key>
- <key name="headers" type="as">
+ <key name="show-headers" type="a(sb)">
<default>[]</default>
- <_summary>List of custom headers and whether they are enabled.</_summary>
- <_description>This key should contain a list of XML structures specifying custom headers, and whether they are to be displayed. The format of the XML structure is &lt;header enabled&gt; - set enabled if the header is to be displayed in the mail view.</_description>
+ <_summary>List of headers to show when viewing a message.</_summary>
+ <_description>Each header is represented as a pair: the header name, and a boolean indicating whether the header is enabled. Disabled headers are not shown when viewing a message, but are still listed in Preferences.</_description>
</key>
<key name="show-sender-photo" type="b">
<default>false</default>
@@ -566,6 +566,11 @@
<_summary>(Deprecated) Default reply style</_summary>
<_description>This key was deprecated in version 3.10 and should no longer be used. Use "reply-style-name" instead.</_description>
</key>
+ <key name="headers" type="as">
+ <default>[]</default>
+ <_summary>(Deprecated) List of custom headers and whether they are enabled.</_summary>
+ <_description>This key was deprecated in version 3.10 and should no longer be used. Use "show-headers" instead.</_description>
+ </key>
<key name="load-http-images" type="i">
<default>0</default>
<_summary>(Deprecated) Load images for HTML messages over HTTP</_summary>
diff --git a/modules/mail/em-mailer-prefs.c b/modules/mail/em-mailer-prefs.c
index a5f6e25678..38e66b0002 100644
--- a/modules/mail/em-mailer-prefs.c
+++ b/modules/mail/em-mailer-prefs.c
@@ -56,6 +56,8 @@ static GType col_types[] = {
G_TYPE_STRING
};
+#define EM_FORMAT_HEADER_XMAILER "x-evolution-mailer"
+
/* temporarily copied from em-format.c */
static const gchar *default_headers[] = {
N_("From"),
@@ -67,11 +69,9 @@ static const gchar *default_headers[] = {
N_("Date"),
N_("Newsgroups"),
N_("Face"),
- "x-evolution-mailer", /* DO NOT translate */
+ EM_FORMAT_HEADER_XMAILER /* DO NOT translate */
};
-#define EM_FORMAT_HEADER_XMAILER "x-evolution-mailer"
-
/* for empty trash on exit frequency */
static const struct {
const gchar *label;
@@ -443,40 +443,38 @@ emmp_header_add_sensitivity (EMMailerPrefs *prefs)
static void
emmp_save_headers (EMMailerPrefs *prefs)
{
- GPtrArray *headers;
+ GVariantBuilder builder;
+ GtkTreeModel *model;
+ GVariant *variant;
GtkTreeIter iter;
gboolean valid;
- /* Headers */
- headers = g_ptr_array_new_full (3, g_free);
- valid = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (prefs->header_list_store), &iter);
- while (valid) {
- struct _EMailReaderHeader h;
- gboolean enabled;
- gchar *xml;
+ g_variant_builder_init (&builder, G_VARIANT_TYPE ("a(sb)"));
- h.name = NULL;
+ model = GTK_TREE_MODEL (prefs->header_list_store);
+ valid = gtk_tree_model_get_iter_first (model, &iter);
+
+ while (valid) {
+ gchar *name = NULL;
+ gboolean enabled = TRUE;
gtk_tree_model_get (
- GTK_TREE_MODEL (prefs->header_list_store), &iter,
- HEADER_LIST_HEADER_COLUMN, &h.name,
+ model, &iter,
+ HEADER_LIST_HEADER_COLUMN, &name,
HEADER_LIST_ENABLED_COLUMN, &enabled,
-1);
- h.enabled = enabled;
-
- if ((xml = e_mail_reader_header_to_xml (&h)))
- g_ptr_array_add (headers, xml);
- g_free (h.name);
+ if (name != NULL) {
+ g_variant_builder_add (
+ &builder, "(sb)", name, enabled);
+ g_free (name);
+ }
- valid = gtk_tree_model_iter_next (GTK_TREE_MODEL (prefs->header_list_store), &iter);
+ valid = gtk_tree_model_iter_next (model, &iter);
}
- g_ptr_array_add (headers, NULL);
-
- g_settings_set_strv (prefs->settings, "headers", (const gchar * const *) headers->pdata);
-
- g_ptr_array_free (headers, TRUE);
+ variant = g_variant_builder_end (&builder);
+ g_settings_set_value (prefs->settings, "show-headers", variant);
}
static void
@@ -822,17 +820,17 @@ em_mailer_prefs_construct (EMMailerPrefs *prefs,
EMailSession *session,
EShell *shell)
{
- GSList *header_add_list, *p;
- gchar **headers_config;
GSettings *settings;
GHashTable *default_header_hash;
GtkWidget *toplevel;
GtkWidget *container;
GtkWidget *table;
GtkWidget *widget;
+ GtkTreeModel *tree_model;
GtkTreeSelection *selection;
GtkCellRenderer *renderer;
- GtkTreeIter iter;
+ GVariant *variant;
+ gsize ii, n_children;
gboolean locked;
gboolean writable;
gint val, i;
@@ -1118,72 +1116,95 @@ em_mailer_prefs_construct (EMMailerPrefs *prefs,
"text", HEADER_LIST_NAME_COLUMN,
NULL);
- /* populated the listview with entries; firstly we add all the default headers, and then
- * we add read header configuration out of settings. If a header in settings is a default header,
- * we update the enabled flag accordingly
- */
- header_add_list = NULL;
- default_header_hash = g_hash_table_new (g_str_hash, g_str_equal);
- for (i = 0; i < G_N_ELEMENTS (default_headers); i++) {
- EMailReaderHeader *h;
-
- h = g_malloc (sizeof (EMailReaderHeader));
- h->is_default = TRUE;
- h->name = g_strdup (default_headers[i]);
- h->enabled = strcmp ((gchar *) default_headers[i], "x-evolution-mailer") != 0;
- g_hash_table_insert (default_header_hash, (gpointer) default_headers[i], h);
- header_add_list = g_slist_append (header_add_list, h);
- }
+ /* Populate the list store with entries. Firstly we add all the
+ * default headers, and then we add read header configuration out of
+ * settings. If a header in settings is a default header, we update
+ * the enabled flag accordingly. */
- /* read stored headers from settings */
- headers_config = g_settings_get_strv (prefs->settings, "headers");
- if (headers_config) {
- for (i = 0; headers_config[i]; i++) {
- EMailReaderHeader *h, *def;
- const gchar *xml = headers_config[i];
-
- h = e_mail_reader_header_from_xml (xml);
- if (h) {
- def = g_hash_table_lookup (default_header_hash, h->name);
- if (def) {
- def->enabled = h->enabled;
- e_mail_reader_header_free (h);
- } else {
- h->is_default = FALSE;
- header_add_list = g_slist_append (header_add_list, h);
- }
- }
- }
+ /* FIXME Split the headers section into a separate widget to
+ * better isolate its functionality. There's too much
+ * complexity to just embed it like this. */
- g_strfreev (headers_config);
- }
+ default_header_hash = g_hash_table_new_full (
+ (GHashFunc) g_str_hash,
+ (GEqualFunc) g_str_equal,
+ (GDestroyNotify) g_free,
+ (GDestroyNotify) gtk_tree_path_free);
- g_hash_table_destroy (default_header_hash);
+ tree_model = GTK_TREE_MODEL (prefs->header_list_store);
+
+ for (ii = 0; ii < G_N_ELEMENTS (default_headers); ii++) {
+ GtkTreeIter iter;
+ const gchar *display_name;
+ const gchar *header_name;
+ gboolean enabled;
- p = header_add_list;
- while (p) {
- struct _EMailReaderHeader *h = (struct _EMailReaderHeader *) p->data;
- const gchar *name;
+ header_name = default_headers[ii];
+ if (g_strcmp0 (header_name, EM_FORMAT_HEADER_XMAILER) == 0) {
+ display_name = _("Mailer");
+ enabled = FALSE;
+ } else {
+ display_name = _(header_name);
+ enabled = TRUE;
+ }
- if (g_ascii_strcasecmp (h->name, EM_FORMAT_HEADER_XMAILER) == 0)
- name = _("Mailer");
- else
- name = _(h->name);
+ gtk_list_store_append (
+ GTK_LIST_STORE (tree_model), &iter);
- gtk_list_store_append (prefs->header_list_store, &iter);
gtk_list_store_set (
- prefs->header_list_store, &iter,
- HEADER_LIST_NAME_COLUMN, name,
- HEADER_LIST_ENABLED_COLUMN, h->enabled,
- HEADER_LIST_IS_DEFAULT_COLUMN, h->is_default,
- HEADER_LIST_HEADER_COLUMN, h->name,
+ GTK_LIST_STORE (tree_model), &iter,
+ HEADER_LIST_NAME_COLUMN, display_name,
+ HEADER_LIST_ENABLED_COLUMN, enabled,
+ HEADER_LIST_IS_DEFAULT_COLUMN, TRUE,
+ HEADER_LIST_HEADER_COLUMN, header_name,
-1);
- e_mail_reader_header_free (h);
- p = p->next;
+ g_hash_table_insert (
+ default_header_hash, g_strdup (header_name),
+ gtk_tree_model_get_path (tree_model, &iter));
+ }
+
+ variant = g_settings_get_value (prefs->settings, "show-headers");
+ n_children = g_variant_n_children (variant);
+
+ for (ii = 0; ii < n_children; ii++) {
+ GtkTreeIter iter;
+ GtkTreePath *path;
+ const gchar *header_name = NULL;
+ gboolean enabled = FALSE;
+
+ g_variant_get_child (
+ variant, ii, "(&sb)", &header_name, &enabled);
+
+ if (header_name == NULL) {
+ g_warn_if_reached ();
+ continue;
+ }
+
+ path = g_hash_table_lookup (default_header_hash, header_name);
+ if (path != NULL) {
+ gtk_tree_model_get_iter (tree_model, &iter, path);
+ gtk_list_store_set (
+ GTK_LIST_STORE (tree_model), &iter,
+ HEADER_LIST_ENABLED_COLUMN, enabled,
+ -1);
+ } else {
+ gtk_list_store_append (
+ GTK_LIST_STORE (tree_model), &iter);
+
+ gtk_list_store_set (
+ GTK_LIST_STORE (tree_model), &iter,
+ HEADER_LIST_NAME_COLUMN, _(header_name),
+ HEADER_LIST_ENABLED_COLUMN, enabled,
+ HEADER_LIST_IS_DEFAULT_COLUMN, FALSE,
+ HEADER_LIST_HEADER_COLUMN, header_name,
+ -1);
+ }
}
- g_slist_free (header_add_list);
+ g_variant_unref (variant);
+
+ g_hash_table_destroy (default_header_hash);
/* date/time format */
table = e_builder_get_widget (prefs->builder, "datetime-format-table");
diff --git a/modules/settings/e-settings-deprecated.c b/modules/settings/e-settings-deprecated.c
index 13f0819669..058c7fddd8 100644
--- a/modules/settings/e-settings-deprecated.c
+++ b/modules/settings/e-settings-deprecated.c
@@ -46,6 +46,7 @@ struct _ESettingsDeprecatedPrivate {
gulong forward_style_name_handler_id;
gulong reply_style_name_handler_id;
gulong image_loading_policy_handler_id;
+ gulong show_headers_handler_id;
};
/* Flag values used in the "working-days" key. */
@@ -65,6 +66,69 @@ G_DEFINE_DYNAMIC_TYPE (
E_TYPE_EXTENSION)
static void
+settings_deprecated_header_start_element (GMarkupParseContext *context,
+ const gchar *element_name,
+ const gchar **attribute_names,
+ const gchar **attribute_values,
+ gpointer user_data,
+ GError **error)
+{
+ GVariantBuilder *builder = user_data;
+ const gchar *name = NULL;
+ const gchar *enabled = NULL;
+
+ /* The enabled flag is determined by the presence of an "enabled"
+ * attribute, but the actual value of the "enabled" attribute, if
+ * present, is just an empty string. It's pretty convoluted. */
+ g_markup_collect_attributes (
+ element_name,
+ attribute_names,
+ attribute_values,
+ error,
+ G_MARKUP_COLLECT_STRING,
+ "name", &name,
+ G_MARKUP_COLLECT_STRING |
+ G_MARKUP_COLLECT_OPTIONAL,
+ "enabled", &enabled,
+ G_MARKUP_COLLECT_INVALID);
+
+ if (name != NULL)
+ g_variant_builder_add (
+ builder, "(sb)", name, (enabled != NULL));
+}
+
+static void
+settings_deprecated_header_parse_xml (const gchar *xml,
+ GVariantBuilder *builder)
+{
+ static GMarkupParser parser = {
+ settings_deprecated_header_start_element, };
+
+ GMarkupParseContext *context;
+
+ context = g_markup_parse_context_new (&parser, 0, builder, NULL);
+ g_markup_parse_context_parse (context, xml, -1, NULL);
+ g_markup_parse_context_end_parse (context, NULL);
+ g_markup_parse_context_free (context);
+}
+
+static GVariant *
+settings_deprecated_header_strv_to_variant (gchar **strv)
+{
+ GVariantBuilder builder;
+ guint ii, length;
+
+ length = g_strv_length (strv);
+
+ g_variant_builder_init (&builder, G_VARIANT_TYPE ("a(sb)"));
+
+ for (ii = 0; ii < length; ii++)
+ settings_deprecated_header_parse_xml (strv[ii], &builder);
+
+ return g_variant_builder_end (&builder);
+}
+
+static void
settings_deprecated_week_start_day_name_cb (GSettings *settings,
const gchar *key)
{
@@ -241,6 +305,41 @@ settings_deprecated_image_loading_policy_cb (GSettings *settings,
}
static void
+settings_deprecated_show_headers_cb (GSettings *settings,
+ const gchar *key)
+{
+ GVariant *variant;
+ gsize ii, n_children;
+ gchar **strv = NULL;
+
+ variant = g_settings_get_value (settings, key);
+ n_children = g_variant_n_children (variant);
+
+ strv = g_new0 (gchar *, n_children + 1);
+
+ for (ii = 0; ii < n_children; ii++) {
+ const gchar *name = NULL;
+ gboolean enabled = FALSE;
+
+ g_variant_get_child (
+ variant, ii, "(&sb)", &name, &enabled);
+
+ strv[ii] = g_strdup_printf (
+ "<?xml version=\"1.0\"?>\n"
+ "<header name=\"%s\"%s/>\n",
+ name, enabled ? " enabled=\"\"" : "");
+ }
+
+ g_settings_set_strv (
+ settings, "headers",
+ (const gchar * const *) strv);
+
+ g_strfreev (strv);
+
+ g_variant_unref (variant);
+}
+
+static void
settings_deprecated_dispose (GObject *object)
{
ESettingsDeprecatedPrivate *priv;
@@ -331,6 +430,13 @@ settings_deprecated_dispose (GObject *object)
priv->image_loading_policy_handler_id = 0;
}
+ if (priv->show_headers_handler_id > 0) {
+ g_signal_handler_disconnect (
+ priv->mail_settings,
+ priv->show_headers_handler_id);
+ priv->show_headers_handler_id = 0;
+ }
+
g_clear_object (&priv->calendar_settings);
g_clear_object (&priv->mail_settings);
@@ -342,8 +448,10 @@ static void
settings_deprecated_constructed (GObject *object)
{
ESettingsDeprecatedPrivate *priv;
+ GVariant *variant;
gulong handler_id;
gchar *string_value;
+ gchar **strv_value;
gint int_value;
priv = E_SETTINGS_DEPRECATED_GET_PRIVATE (object);
@@ -409,6 +517,11 @@ settings_deprecated_constructed (GObject *object)
g_settings_set_enum (
priv->mail_settings, "forward-style-name", int_value);
+ strv_value = g_settings_get_strv (priv->mail_settings, "headers");
+ variant = settings_deprecated_header_strv_to_variant (strv_value);
+ g_settings_set_value (priv->mail_settings, "show-headers", variant);
+ g_strfreev (strv_value);
+
/* XXX The "reply-style" key uses a completely different
* numbering than the EMailReplyStyle enum. *sigh* */
switch (g_settings_get_int (priv->mail_settings, "reply-style")) {
@@ -507,6 +620,11 @@ settings_deprecated_constructed (GObject *object)
priv->mail_settings, "changed::image-loading-policy",
G_CALLBACK (settings_deprecated_image_loading_policy_cb), NULL);
priv->image_loading_policy_handler_id = handler_id;
+
+ handler_id = g_signal_connect (
+ priv->mail_settings, "changed::show-headers",
+ G_CALLBACK (settings_deprecated_show_headers_cb), NULL);
+ priv->show_headers_handler_id = handler_id;
}
static void
diff --git a/modules/settings/e-settings-mail-formatter.c b/modules/settings/e-settings-mail-formatter.c
index ae53291874..2c3b4697fc 100644
--- a/modules/settings/e-settings-mail-formatter.c
+++ b/modules/settings/e-settings-mail-formatter.c
@@ -74,31 +74,30 @@ settings_mail_formatter_headers_changed_cb (GSettings *settings,
ESettingsMailFormatter *extension)
{
EMailFormatter *formatter;
- gchar **headers;
- gint ii;
+ GVariant *variant;
+ gsize ii, n_children;
formatter = settings_mail_formatter_get_extensible (extension);
+ e_mail_formatter_clear_headers (formatter);
- headers = g_settings_get_strv (settings, "headers");
+ variant = g_settings_get_value (settings, "show-headers");
+ n_children = g_variant_n_children (variant);
- e_mail_formatter_clear_headers (formatter);
- for (ii = 0; headers && headers[ii]; ii++) {
- EMailReaderHeader *h;
- const gchar *xml = headers[ii];
+ for (ii = 0; ii < n_children; ii++) {
+ const gchar *name = NULL;
+ gboolean enabled = FALSE;
- h = e_mail_reader_header_from_xml (xml);
- if (h && h->enabled)
+ g_variant_get_child (variant, ii, "(&sb)", &name, &enabled);
+ if (name != NULL && enabled)
e_mail_formatter_add_header (
- formatter, h->name, NULL,
+ formatter, name, NULL,
E_MAIL_FORMATTER_HEADER_FLAG_BOLD);
-
- e_mail_reader_header_free (h);
}
- if (!headers || !headers[0])
+ if (n_children == 0)
e_mail_formatter_set_default_headers (formatter);
- g_strfreev (headers);
+ g_variant_unref (variant);
}
static void