diff options
Diffstat (limited to 'mail/mail-config.c')
-rw-r--r-- | mail/mail-config.c | 428 |
1 files changed, 25 insertions, 403 deletions
diff --git a/mail/mail-config.c b/mail/mail-config.c index ef9185ecbd..2a483750c8 100644 --- a/mail/mail-config.c +++ b/mail/mail-config.c @@ -58,6 +58,7 @@ #include <libedataserver/e-data-server-util.h> #include <e-util/e-util.h> #include <misc/e-gui-utils.h> +#include "e-util/e-util-labels.h" #include <libedataserver/e-account-list.h> #include <e-util/e-signature-list.h> @@ -76,17 +77,6 @@ #include "mail-mt.h" #include "mail-tools.h" -/* Note, the first element of each MailConfigLabel must NOT be translated */ -/* Note, the label tag should Always starts with prefix "$Label"! - It's also because filters and search folders, so beware people. */ -MailConfigLabel label_defaults[LABEL_DEFAULTS_NUM] = { - { "$Labelimportant", N_("I_mportant"), "#EF2929" }, /* red */ - { "$Labelwork", N_("_Work"), "#F57900" }, /* orange */ - { "$Labelpersonal", N_("_Personal"), "#4E9A06" }, /* green */ - { "$Labeltodo", N_("_To Do"), "#3465A4" }, /* blue */ - { "$Labellater", N_("_Later"), "#75507B" } /* purple */ -}; - typedef struct { GConfClient *gconf; @@ -139,123 +129,6 @@ mail_config_save_signatures (void) e_signature_list_save (config->signatures); } - -static void -config_clear_labels (void) -{ - MailConfigLabel *label; - GSList *list, *n; - - list = config->labels; - while (list != NULL) { - label = list->data; - g_free(label->tag); - g_free (label->name); - g_free (label->colour); - g_free (label); - - n = list->next; - g_slist_free_1 (list); - list = n; - } - - config->labels = NULL; -} - -static void -config_cache_labels (void) -{ - GSList *labels, *list, *head; - MailConfigLabel *label; - char *buf; - int num = 0; - - labels = NULL; - - head = gconf_client_get_list (config->gconf, "/apps/evolution/mail/labels", GCONF_VALUE_STRING, NULL); - - for (list = head; list; list = list->next) { - char *color, *name, *tag; - name = buf = list->data; - color = strrchr (buf, ':'); - - *color++ = '\0'; - tag = strchr (color, '|'); - if (tag) - *tag++ = '\0'; - - label = g_new (MailConfigLabel, 1); - - /* Needed for Backward Compatibility */ - if (num < LABEL_DEFAULTS_NUM) { - label->name = g_strdup (_(buf)); - label->tag = g_strdup (label_defaults[num].tag); - num++; - } else if (!tag) { - g_free (buf); - g_free (label); - continue; - } else { - label->name = g_strdup (name); - label->tag = g_strdup (tag); - } - - label->colour = g_strdup (color); - labels = g_slist_prepend (labels, label); - - g_free (buf); - } - - if (head) - g_slist_free (head); - - while (num < LABEL_DEFAULTS_NUM) { - /* complete the list with defaults */ - label = g_new (MailConfigLabel, 1); - label->tag = g_strdup (label_defaults[num].tag); - label->name = g_strdup (_(label_defaults[num].name)); - label->colour = g_strdup (label_defaults[num].colour); - - labels = g_slist_prepend (labels, label); - - num++; - } - - config->labels = g_slist_reverse (labels); -} - -/* stores the actual cache to gconf */ -static gboolean -config_cache_labels_flush (void) -{ - GSList *l, *text_labels; - - if (!config || !config->labels) - return FALSE; - - text_labels = NULL; - - for (l = config->labels; l; l = l->next) { - MailConfigLabel *label = l->data; - - if (label && label->tag && label->name && label->colour) - text_labels = g_slist_prepend (text_labels, g_strdup_printf ("%s:%s|%s", label->name, label->colour, label->tag)); - } - - if (!text_labels) - return FALSE; - - text_labels = g_slist_reverse (text_labels); - - gconf_client_set_list (config->gconf, "/apps/evolution/mail/labels", GCONF_VALUE_STRING, text_labels, NULL); - - g_slist_foreach (text_labels, (GFunc)g_free, NULL); - g_slist_free (text_labels); - - /* not true if gconf failed to write; who cares */ - return TRUE; -} - static void config_clear_mime_types (void) { @@ -344,11 +217,30 @@ config_write_style (void) } static void +config_clear_labels (void) +{ + if (!config) + return; + + e_util_labels_free (config->labels); + config->labels = NULL; +} + +static void +config_cache_labels (GConfClient *client) +{ + if (!config) + return; + + config->labels = e_util_labels_parse (client); +} + +static void gconf_labels_changed (GConfClient *client, guint cnxn_id, GConfEntry *entry, gpointer user_data) { config_clear_labels (); - config_cache_labels (); + config_cache_labels (client); } static void @@ -461,10 +353,10 @@ mail_config_init (void) config->citation_colour_notify_id = gconf_client_notify_add (config->gconf, "/apps/evolution/mail/display/citation_colour", gconf_style_changed, NULL, NULL, NULL); - gconf_client_add_dir (config->gconf, "/apps/evolution/mail/labels", + gconf_client_add_dir (config->gconf, E_UTIL_LABELS_GCONF_KEY, GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); config->label_notify_id = - gconf_client_notify_add (config->gconf, "/apps/evolution/mail/labels", + gconf_client_notify_add (config->gconf, E_UTIL_LABELS_GCONF_KEY, gconf_labels_changed, NULL, NULL, NULL); gconf_client_add_dir (config->gconf, "/apps/evolution/mail/mime_types", @@ -473,7 +365,7 @@ mail_config_init (void) gconf_client_notify_add (config->gconf, "/apps/evolution/mail/mime_types", gconf_mime_types_changed, NULL, NULL, NULL); - config_cache_labels (); + config_cache_labels (config->gconf); config_cache_mime_types (); config->address_compress = gconf_client_get_bool (config->gconf, "/apps/evolution/mail/display/address_compress", NULL); config->address_count = gconf_client_get_int (config->gconf, "/apps/evolution/mail/display/address_count", NULL); @@ -651,36 +543,10 @@ mail_config_get_enable_magic_spacebar () return config->magic_spacebar; } -/* public Label functions */ - -/** - * config_get_label - * - * Looks for label in labels cache by tag and returns actual pointer to cache. - * @param tag Tag of label you are looking for. - * @return Pointer to cache data if label with such tag exists or NULL. Do not free it! - **/ -static MailConfigLabel * -config_get_label (const char *tag) -{ - GSList *l; - - g_return_val_if_fail (tag != NULL, NULL); - - for (l = config->labels; l; l = l->next) { - MailConfigLabel *label = l->data; - - if (label && label->tag && !strcmp (tag, label->tag)) - return label; - } - - return NULL; -} - /** * mail_config_get_labels * - * @return list of known labels, each member data is MailConfigLabel structure. + * @return list of known labels, each member data is EUtilLabel structure. * Returned list should not be freed, neither data inside it. **/ GSList * @@ -689,250 +555,6 @@ mail_config_get_labels (void) return config->labels; } -/** - * mail_config_get_next_label_tag - * - * @param id [out] if not NULL, then assigned used number of the next free tag. - * @return Next free tag, which can be used for new label. - * Returned pointer should be freed with g_free. - * - * @note All labels should always start with "$Label" string, it's very important - * for filters and search folders! - **/ -char * -mail_config_get_next_label_tag (int *id) -{ - char *tag = NULL; - int count = LABEL_DEFAULTS_NUM; - - /* who wants more than 100 labels? */ - while (!tag && count <= 100) { - count++; - tag = g_strdup_printf ("$Label%d", count); - - if (config_get_label (tag)) { - g_free (tag); - tag = NULL; - } - } - - if (id) - *id = count; - - return tag; -} - -/** - * mail_config_is_system_label - * - * @return Whether the tag is one of default/system labels or not. - **/ -gboolean -mail_config_is_system_label (const char *tag) -{ - int i; - - if (!tag) - return FALSE; - - for (i = 0; i < LABEL_DEFAULTS_NUM; i++) { - if (strcmp (tag, label_defaults[i].tag) == 0) - return TRUE; - } - - return FALSE; -} - -/** - * mail_config_add_label - * Creates new label at the end of actual list of labels. - * - * @param tag Unique identifier of this new label. - * @param name User readable name of this label. Should not be NULL. - * @param color Color assigned to this label. Should not be NULL. - * @return Whether was added. - **/ -gboolean -mail_config_add_label (const char *tag, const char *name, const GdkColor *color) -{ - MailConfigLabel *label; - - g_return_val_if_fail (tag != NULL, FALSE); - g_return_val_if_fail (name != NULL, FALSE); - g_return_val_if_fail (color != NULL, FALSE); - - if (config_get_label (tag) != NULL) - return FALSE; - - label = g_new0 (MailConfigLabel, 1); - label->tag = g_strdup (tag); - label->name = g_strdup (name); - label->colour = gdk_color_to_string (color); - - config->labels = g_slist_append (config->labels, label); - - return config_cache_labels_flush (); -} - -/** - * mail_config_remove_label - * - * @param tag Tag of the label to remove. - * @return Whether was removed. - **/ -gboolean -mail_config_remove_label (const char *tag) -{ - MailConfigLabel *label; - - g_return_val_if_fail (tag != NULL, FALSE); - - label = config_get_label (tag); - if (!label) - return FALSE; - - config->labels = g_slist_remove (config->labels, label); - - g_free (label); - - return config_cache_labels_flush (); -} - -/** - * mail_config_get_label_name - * - * @param tag Tag of the label of our interest. - * @return Name of the label with that tag or NULL, if no such label exists. - **/ -const char * -mail_config_get_label_name (const char *tag) -{ - MailConfigLabel *label; - - g_return_val_if_fail (tag != NULL, NULL); - - label = config_get_label (tag); - if (!label) - return NULL; - - return label->name; -} - -/** - * mail_config_get_label_color - * - * @param tag Tag of the label of our interest. - * @param color [out] Actual color of the label with that tag, or unchanged if failed. - * @return Whether found such label and color has been set. - **/ -gboolean -mail_config_get_label_color (const char *tag, GdkColor *color) -{ - MailConfigLabel *label; - - g_return_val_if_fail (tag != NULL, FALSE); - g_return_val_if_fail (color != NULL, FALSE); - - label = config_get_label (tag); - if (!label) - return FALSE; - - return gdk_color_parse (label->colour, color); -} - -/** - * mail_config_get_label_color_str - * - * @param tag Tag of the label of our interest. - * @return String representation of that label, or NULL, is no such label exists. - **/ -const char * -mail_config_get_label_color_str (const char *tag) -{ - MailConfigLabel *label; - - g_return_val_if_fail (tag != NULL, FALSE); - - label = config_get_label (tag); - if (!label) - return FALSE; - - return label->colour; -} - -/** - * mail_config_get_new_label_tag - * - * @param old_tag Tag of the label from old version of Evolution. - * @return New tag name equivalent with the old tag, or NULL if no such name existed before. - **/ -const char * -mail_config_get_new_label_tag (const char *old_tag) -{ - int i; - - if (!old_tag) - return NULL; - - for (i = 0; i < LABEL_DEFAULTS_NUM; i++) { - /* default labels have same name as those old, only with prefix "$Label" */ - if (!strcmp (old_tag, label_defaults[i].tag + 6)) - return label_defaults[i].tag; - } - - return NULL; -} - -/** - * mail_config_set_label_name - * - * @param tag Tag of the label of our interest. - * @param name New name for the label. - * @return Whether successfully saved. - **/ -gboolean -mail_config_set_label_name (const char *tag, const char *name) -{ - MailConfigLabel *label; - - g_return_val_if_fail (tag != NULL, FALSE); - g_return_val_if_fail (name != NULL, FALSE); - - label = config_get_label (tag); - if (!label) - return FALSE; - - g_free (label->name); - label->name = g_strdup (name); - - return config_cache_labels_flush (); -} - -/** - * mail_config_set_label_color - * - * @param tag Tag of the label of our interest. - * @param color New color for the label. - * @return Whether successfully saved. - **/ -gboolean -mail_config_set_label_color (const char *tag, const GdkColor *color) -{ - MailConfigLabel *label; - - g_return_val_if_fail (tag != NULL, FALSE); - g_return_val_if_fail (color != NULL, FALSE); - - label = config_get_label (tag); - if (!label) - return FALSE; - - g_free (label->colour); - label->colour = gdk_color_to_string (color); - - return config_cache_labels_flush (); -} - const char ** mail_config_get_allowable_mime_types (void) { |