[evolution] Add "auto-update" option to Search Folder Editor



commit a3bd7ff42fe0e2be150cfad7640a5e8d62d8821b
Author: Milan Crha <mcrha redhat com>
Date:   Tue Jul 10 17:01:12 2012 +0200

    Add "auto-update" option to Search Folder Editor

 libemail-engine/mail-vfolder.c   |   34 ++++++-------
 libemail-utils/em-vfolder-rule.c |   98 +++++++++++++++++++++++++++++---------
 libemail-utils/em-vfolder-rule.h |   11 +++-
 mail/em-vfolder-editor-rule.c    |   25 +++++++++-
 4 files changed, 121 insertions(+), 47 deletions(-)
---
diff --git a/libemail-engine/mail-vfolder.c b/libemail-engine/mail-vfolder.c
index d1fb0a5..08e6e22 100644
--- a/libemail-engine/mail-vfolder.c
+++ b/libemail-engine/mail-vfolder.c
@@ -399,12 +399,9 @@ mail_vfolder_add_folder (CamelStore *store,
 		 * they must be explictly listed as a source. */
 		if (rule->source
 		    && !CAMEL_IS_VEE_STORE (store)
-		    && ((((EMVFolderRule *) rule)->with ==
-				EM_VFOLDER_RULE_WITH_LOCAL && !remote)
-			|| (((EMVFolderRule *) rule)->with ==
-				EM_VFOLDER_RULE_WITH_REMOTE_ACTIVE && remote)
-			|| (((EMVFolderRule *) rule)->with ==
-				EM_VFOLDER_RULE_WITH_LOCAL_REMOTE_ACTIVE)))
+		    && ((em_vfolder_rule_get_with ((EMVFolderRule *) rule) == EM_VFOLDER_RULE_WITH_LOCAL && !remote)
+			|| (em_vfolder_rule_get_with ((EMVFolderRule *) rule) == EM_VFOLDER_RULE_WITH_REMOTE_ACTIVE && remote)
+			|| (em_vfolder_rule_get_with ((EMVFolderRule *) rule) == EM_VFOLDER_RULE_WITH_LOCAL_REMOTE_ACTIVE)))
 			found = TRUE;
 
 		source = NULL;
@@ -760,17 +757,20 @@ rule_changed (EFilterRule *rule,
 
 	d(printf("Filter rule changed? for folder '%s'!!\n", folder->name));
 
-	/* find any (currently available) folders, and add them to the ones to open */
-	rule_add_sources (
-		session, &((EMVFolderRule *) rule)->sources,
-		&sources_folder, &sources_uri);
+	camel_vee_folder_set_auto_update (CAMEL_VEE_FOLDER (folder),
+		em_vfolder_rule_get_autoupdate ((EMVFolderRule *) rule));
+
+	if (em_vfolder_rule_get_with ((EMVFolderRule *) rule) == EM_VFOLDER_RULE_WITH_SPECIFIC) {
+		/* find any (currently available) folders, and add them to the ones to open */
+		rule_add_sources (
+			session, em_vfolder_rule_get_sources ((EMVFolderRule *) rule),
+			&sources_folder, &sources_uri);
+	}
 
 	G_LOCK (vfolder);
 
-	if (((EMVFolderRule *) rule)->with ==
-			EM_VFOLDER_RULE_WITH_LOCAL ||
-			((EMVFolderRule *) rule)->with ==
-			EM_VFOLDER_RULE_WITH_LOCAL_REMOTE_ACTIVE) {
+	if (em_vfolder_rule_get_with ((EMVFolderRule *) rule) == EM_VFOLDER_RULE_WITH_LOCAL ||
+	    em_vfolder_rule_get_with ((EMVFolderRule *) rule) == EM_VFOLDER_RULE_WITH_LOCAL_REMOTE_ACTIVE) {
 
 		MailFolderCache *cache;
 		GQueue queue = G_QUEUE_INIT;
@@ -785,10 +785,8 @@ rule_changed (EFilterRule *rule,
 			g_free (g_queue_pop_head (&queue));
 	}
 
-	if (((EMVFolderRule *) rule)->with ==
-			EM_VFOLDER_RULE_WITH_REMOTE_ACTIVE ||
-			((EMVFolderRule *) rule)->with ==
-			EM_VFOLDER_RULE_WITH_LOCAL_REMOTE_ACTIVE) {
+	if (em_vfolder_rule_get_with ((EMVFolderRule *) rule) == EM_VFOLDER_RULE_WITH_REMOTE_ACTIVE ||
+	    em_vfolder_rule_get_with ((EMVFolderRule *) rule) == EM_VFOLDER_RULE_WITH_LOCAL_REMOTE_ACTIVE) {
 
 		MailFolderCache *cache;
 		GQueue queue = G_QUEUE_INIT;
diff --git a/libemail-utils/em-vfolder-rule.c b/libemail-utils/em-vfolder-rule.c
index 8122025..237c99d 100644
--- a/libemail-utils/em-vfolder-rule.c
+++ b/libemail-utils/em-vfolder-rule.c
@@ -46,7 +46,9 @@
 	((obj), EM_TYPE_VFOLDER_RULE, EMVFolderRulePrivate))
 
 struct _EMVFolderRulePrivate {
-	gint placeholder;
+	em_vfolder_rule_with_t with;
+	GQueue sources;		/* uri's of the source folders */
+	gboolean autoupdate;
 };
 
 static gint validate (EFilterRule *, EAlert **alert);
@@ -75,7 +77,7 @@ vfolder_rule_finalize (GObject *object)
 	EMVFolderRule *rule = EM_VFOLDER_RULE (object);
 	gchar *uri;
 
-	while ((uri = g_queue_pop_head (&rule->sources)) != NULL)
+	while ((uri = g_queue_pop_head (&rule->priv->sources)) != NULL)
 		g_free (uri);
 
 	/* Chain up to parent's finalize() method. */
@@ -106,7 +108,8 @@ static void
 em_vfolder_rule_init (EMVFolderRule *rule)
 {
 	rule->priv = EM_VFOLDER_RULE_GET_PRIVATE (rule);
-	rule->with = EM_VFOLDER_RULE_WITH_SPECIFIC;
+	rule->priv->with = EM_VFOLDER_RULE_WITH_SPECIFIC;
+	rule->priv->autoupdate = TRUE;
 	rule->rule.source = g_strdup ("incoming");
 }
 
@@ -124,7 +127,7 @@ em_vfolder_rule_add_source (EMVFolderRule *rule,
 	g_return_if_fail (EM_IS_VFOLDER_RULE (rule));
 	g_return_if_fail (uri);
 
-	g_queue_push_tail (&rule->sources, g_strdup (uri));
+	g_queue_push_tail (&rule->priv->sources, g_strdup (uri));
 
 	e_filter_rule_emit_changed (E_FILTER_RULE (rule));
 }
@@ -140,7 +143,7 @@ em_vfolder_rule_find_source (EMVFolderRule *rule,
 	/* only does a simple string or address comparison, should
 	 * probably do a decoded url comparison */
 	link = g_queue_find_custom (
-		&rule->sources, uri, (GCompareFunc) strcmp);
+		&rule->priv->sources, uri, (GCompareFunc) strcmp);
 
 	return (link != NULL) ? link->data : NULL;
 }
@@ -155,7 +158,7 @@ em_vfolder_rule_remove_source (EMVFolderRule *rule,
 
 	found =(gchar *) em_vfolder_rule_find_source (rule, uri);
 	if (found != NULL) {
-		g_queue_remove (&rule->sources, found);
+		g_queue_remove (&rule->priv->sources, found);
 		g_free (found);
 		e_filter_rule_emit_changed (E_FILTER_RULE (rule));
 	}
@@ -168,11 +171,11 @@ em_vfolder_rule_next_source (EMVFolderRule *rule,
 	GList *link;
 
 	if (last == NULL) {
-		link = g_queue_peek_head_link (&rule->sources);
+		link = g_queue_peek_head_link (&rule->priv->sources);
 	} else {
-		link = g_queue_find (&rule->sources, last);
+		link = g_queue_find (&rule->priv->sources, last);
 		if (link == NULL)
-			link = g_queue_peek_head_link (&rule->sources);
+			link = g_queue_peek_head_link (&rule->priv->sources);
 		else
 			link = g_list_next (link);
 	}
@@ -180,6 +183,48 @@ em_vfolder_rule_next_source (EMVFolderRule *rule,
 	return (link != NULL) ? link->data : NULL;
 }
 
+void
+em_vfolder_rule_set_with (EMVFolderRule *rule,
+			  em_vfolder_rule_with_t with)
+{
+	g_return_if_fail (rule != NULL);
+
+	rule->priv->with = with;
+}
+
+em_vfolder_rule_with_t
+em_vfolder_rule_get_with (EMVFolderRule *rule)
+{
+	g_return_val_if_fail (rule != NULL, FALSE);
+
+	return rule->priv->with;
+}
+
+GQueue *
+em_vfolder_rule_get_sources (EMVFolderRule *rule)
+{
+	g_return_val_if_fail (rule != NULL, NULL);
+	
+	return &rule->priv->sources;
+}
+
+void
+em_vfolder_rule_set_autoupdate	(EMVFolderRule *rule,
+				 gboolean autoupdate)
+{
+	g_return_if_fail (rule != NULL);
+
+	rule->priv->autoupdate = autoupdate;
+}
+
+gboolean
+em_vfolder_rule_get_autoupdate (EMVFolderRule *rule)
+{
+	g_return_val_if_fail (rule != NULL, EM_VFOLDER_RULE_WITH_SPECIFIC);
+
+	return rule->priv->autoupdate;
+}
+
 static gint
 validate (EFilterRule *fr,
           EAlert **alert)
@@ -195,8 +240,8 @@ validate (EFilterRule *fr,
 
 	/* We have to have at least one source set in the "specific" case.
 	 * Do not translate this string! */
-	if (((EMVFolderRule *) fr)->with == EM_VFOLDER_RULE_WITH_SPECIFIC &&
-		g_queue_is_empty (&((EMVFolderRule *) fr)->sources)) {
+	if (((EMVFolderRule *) fr)->priv->with == EM_VFOLDER_RULE_WITH_SPECIFIC &&
+		g_queue_is_empty (&((EMVFolderRule *) fr)->priv->sources)) {
 		if (alert)
 			*alert = e_alert_new ("mail:vfolder-no-source", NULL);
 		return 0;
@@ -235,8 +280,8 @@ vfolder_eq (EFilterRule *fr,
 {
 	return E_FILTER_RULE_CLASS (em_vfolder_rule_parent_class)->eq (fr, cm)
 		&& queue_eq (
-			&((EMVFolderRule *) fr)->sources,
-			&((EMVFolderRule *) cm)->sources);
+			&((EMVFolderRule *) fr)->priv->sources,
+			&((EMVFolderRule *) cm)->priv->sources);
 }
 
 static xmlNodePtr
@@ -248,13 +293,14 @@ xml_encode (EFilterRule *fr)
 
 	node = E_FILTER_RULE_CLASS (em_vfolder_rule_parent_class)->xml_encode (fr);
 	g_return_val_if_fail (node != NULL, NULL);
-	g_return_val_if_fail (vr->with < G_N_ELEMENTS (with_names), NULL);
+	g_return_val_if_fail (vr->priv->with < G_N_ELEMENTS (with_names), NULL);
 
 	set = xmlNewNode(NULL, (const guchar *)"sources");
 	xmlAddChild (node, set);
-	xmlSetProp(set, (const guchar *)"with", (guchar *)with_names[vr->with]);
+	xmlSetProp(set, (const guchar *)"with", (guchar *)with_names[vr->priv->with]);
+	xmlSetProp(set, (const guchar *)"autoupdate", (guchar *) (vr->priv->autoupdate ? "true" : "false"));
 
-	head = g_queue_peek_head_link (&vr->sources);
+	head = g_queue_peek_head_link (&vr->priv->sources);
 	for (link = head; link != NULL; link = g_list_next (link)) {
 		const gchar *uri = link->data;
 
@@ -274,12 +320,12 @@ set_with (EMVFolderRule *vr,
 
 	for (i = 0; i < G_N_ELEMENTS (with_names); i++) {
 		if (!strcmp (name, with_names[i])) {
-			vr->with = i;
+			vr->priv->with = i;
 			return;
 		}
 	}
 
-	vr->with = 0;
+	vr->priv->with = 0;
 }
 
 static gint
@@ -312,12 +358,17 @@ xml_decode (EFilterRule *fr,
 				set_with (vr, tmp);
 				xmlFree (tmp);
 			}
+			tmp = (gchar *) xmlGetProp (set, (const guchar *) "autoupdate");
+			if (tmp) {
+				vr->priv->autoupdate = g_str_equal (tmp, "true");
+				xmlFree (tmp);
+			}
 			work = set->children;
 			while (work) {
 				if (!strcmp((gchar *)work->name, "folder")) {
 					tmp = (gchar *)xmlGetProp(work, (const guchar *)"uri");
 					if (tmp) {
-						g_queue_push_tail (&vr->sources, g_strdup (tmp));
+						g_queue_push_tail (&vr->priv->sources, g_strdup (tmp));
 						xmlFree (tmp);
 					}
 				}
@@ -340,16 +391,17 @@ rule_copy (EFilterRule *dest,
 	vdest =(EMVFolderRule *) dest;
 	vsrc =(EMVFolderRule *) src;
 
-	while ((uri = g_queue_pop_head (&vdest->sources)) != NULL)
+	while ((uri = g_queue_pop_head (&vdest->priv->sources)) != NULL)
 		g_free (uri);
 
-	head = g_queue_peek_head_link (&vsrc->sources);
+	head = g_queue_peek_head_link (&vsrc->priv->sources);
 	for (link = head; link != NULL; link = g_list_next (link)) {
 		const gchar *uri = link->data;
-		g_queue_push_tail (&vdest->sources, g_strdup (uri));
+		g_queue_push_tail (&vdest->priv->sources, g_strdup (uri));
 	}
 
-	vdest->with = vsrc->with;
+	vdest->priv->with = vsrc->priv->with;
+	vdest->priv->autoupdate = vsrc->priv->autoupdate;
 
 	E_FILTER_RULE_CLASS (em_vfolder_rule_parent_class)->copy (dest, src);
 }
diff --git a/libemail-utils/em-vfolder-rule.h b/libemail-utils/em-vfolder-rule.h
index 892aded..f6dbfa0 100644
--- a/libemail-utils/em-vfolder-rule.h
+++ b/libemail-utils/em-vfolder-rule.h
@@ -64,9 +64,6 @@ typedef enum _em_vfolder_rule_with_t em_vfolder_rule_with_t;
 struct _EMVFolderRule {
 	EFilterRule rule;
 	EMVFolderRulePrivate *priv;
-
-	em_vfolder_rule_with_t with;
-	GQueue sources;		/* uri's of the source folders */
 };
 
 struct _EMVFolderRuleClass {
@@ -83,6 +80,14 @@ const gchar *	em_vfolder_rule_find_source	(EMVFolderRule *rule,
 						 const gchar *uri);
 const gchar *	em_vfolder_rule_next_source	(EMVFolderRule *rule,
 						 const gchar *last);
+void		em_vfolder_rule_set_with	(EMVFolderRule *rule,
+						 em_vfolder_rule_with_t with);
+em_vfolder_rule_with_t
+		em_vfolder_rule_get_with	(EMVFolderRule *rule);
+GQueue *	em_vfolder_rule_get_sources	(EMVFolderRule *rule);
+void		em_vfolder_rule_set_autoupdate	(EMVFolderRule *rule,
+						 gboolean autoupdate);
+gboolean	em_vfolder_rule_get_autoupdate	(EMVFolderRule *rule);
 
 G_END_DECLS
 
diff --git a/mail/em-vfolder-editor-rule.c b/mail/em-vfolder-editor-rule.c
index c5473a5..b1fdadd 100644
--- a/mail/em-vfolder-editor-rule.c
+++ b/mail/em-vfolder-editor-rule.c
@@ -251,7 +251,14 @@ select_source_with_changed (GtkWidget *widget,
 
 	gtk_widget_set_sensitive (data->source_selector, !with);
 
-	data->vr->with = with;
+	em_vfolder_rule_set_with (data->vr, with);
+}
+
+static void
+autoupdate_toggled_cb (GtkToggleButton *toggle,
+		       struct _source_data *data)
+{
+	em_vfolder_rule_set_autoupdate (data->vr, gtk_toggle_button_get_active (toggle));
 }
 
 static void
@@ -302,7 +309,7 @@ vfr_folder_response (EMFolderSelector *selector,
 
 			g_hash_table_insert (known_uris, g_strdup (uri), GINT_TO_POINTER (1));
 
-			g_queue_push_tail (&data->vr->sources, g_strdup (uri));
+			g_queue_push_tail (em_vfolder_rule_get_sources (data->vr), g_strdup (uri));
 
 			markup = e_mail_folder_uri_to_markup (session, uri, NULL);
 
@@ -444,6 +451,7 @@ get_widget (EFilterRule *fr,
 	EMVFolderRule *vr = (EMVFolderRule *) fr;
 	EMailSession *session;
 	GtkWidget *widget, *frame, *label, *combobox, *hgrid, *vgrid, *tree_view, *scrolled_window;
+	GtkWidget *autoupdate;
 	GtkListStore *model;
 	GtkCellRenderer *renderer;
 	struct _source_data *data;
@@ -495,6 +503,17 @@ get_widget (EFilterRule *fr,
 	gtk_grid_set_column_spacing (GTK_GRID (hgrid), 6);
 	gtk_container_add (GTK_CONTAINER (vgrid), hgrid);
 
+	autoupdate = gtk_check_button_new_with_mnemonic (_("Automatically update on any _source folder change"));
+	gtk_container_add (GTK_CONTAINER (hgrid), autoupdate);
+
+	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (autoupdate), em_vfolder_rule_get_autoupdate (vr));
+	g_signal_connect (autoupdate, "toggled", G_CALLBACK (autoupdate_toggled_cb), data);
+
+	hgrid = gtk_grid_new ();
+	gtk_orientable_set_orientation (GTK_ORIENTABLE (hgrid), GTK_ORIENTATION_HORIZONTAL);
+	gtk_grid_set_column_spacing (GTK_GRID (hgrid), 6);
+	gtk_container_add (GTK_CONTAINER (vgrid), hgrid);
+
 	combobox = gtk_combo_box_text_new ();
 	gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combobox), NULL, _("All local folders"));
 	gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combobox), NULL, _("All active remote folders"));
@@ -573,7 +592,7 @@ get_widget (EFilterRule *fr,
 
 	data->source_selector = hgrid;
 
-	gtk_combo_box_set_active (GTK_COMBO_BOX (combobox), 3 - vr->with);
+	gtk_combo_box_set_active (GTK_COMBO_BOX (combobox), 3 - em_vfolder_rule_get_with (vr));
 	g_signal_connect (
 		combobox, "changed",
 		G_CALLBACK (select_source_with_changed), data);



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