[evolution] Bug #602998 - Contacts searches are supposed to be per address book



commit 223c2f4a75c5423db244430ca3630717e2735a52
Author: Milan Crha <mcrha redhat com>
Date:   Thu Dec 10 21:12:48 2009 +0100

    Bug #602998 - Contacts searches are supposed to be per address book

 addressbook/gui/widgets/e-addressbook-view.c    |   61 +++++++++++++++++++++++
 addressbook/gui/widgets/e-addressbook-view.h    |   13 +++++
 modules/addressbook/e-book-shell-content.c      |   30 +++++++++++-
 modules/addressbook/e-book-shell-view-private.c |    3 +
 modules/addressbook/e-book-shell-view-private.h |    2 +
 modules/addressbook/e-book-shell-view.c         |   54 +++++++++++++++++---
 modules/addressbook/e-book-shell-view.h         |    3 +
 7 files changed, 157 insertions(+), 9 deletions(-)
---
diff --git a/addressbook/gui/widgets/e-addressbook-view.c b/addressbook/gui/widgets/e-addressbook-view.c
index afa8bc0..a48ea8c 100644
--- a/addressbook/gui/widgets/e-addressbook-view.c
+++ b/addressbook/gui/widgets/e-addressbook-view.c
@@ -84,6 +84,12 @@ struct _EAddressbookViewPrivate {
 	GObject *object;
 
 	GalViewInstance *view_instance;
+
+	/* stored search setup for this view */
+	gint filter_id;
+	gchar *search_text;
+	gint search_id;
+	EFilterRule *advanced_search;
 };
 
 enum {
@@ -492,6 +498,19 @@ addressbook_view_dispose (GObject *object)
 		priv->view_instance = NULL;
 	}
 
+	priv->filter_id = 0;
+	priv->search_id = 0;
+
+	if (priv->search_text) {
+		g_free (priv->search_text);
+		priv->search_text = NULL;
+	}
+
+	if (priv->advanced_search) {
+		g_object_unref (priv->advanced_search);
+		priv->advanced_search = NULL;
+	}
+
 	/* Chain up to parent's dispose() method. */
 	G_OBJECT_CLASS (parent_class)->dispose (object);
 }
@@ -1344,3 +1363,45 @@ e_addressbook_view_move_to_folder (EAddressbookView *view, gboolean all)
 {
 	view_transfer_contacts (view, TRUE, all);
 }
+
+void
+e_addressbook_view_set_search (EAddressbookView *view, gint filter_id, gint search_id, const gchar *search_text, EFilterRule *advanced_search)
+{
+	EAddressbookViewPrivate *priv;
+
+	g_return_if_fail (view != NULL);
+	g_return_if_fail (E_IS_ADDRESSBOOK_VIEW (view));
+
+	priv = view->priv;
+
+	if (priv->search_text)
+		g_free (priv->search_text);
+	if (priv->advanced_search)
+		g_object_unref (priv->advanced_search);
+
+	priv->filter_id = filter_id;
+	priv->search_id = search_id;
+	priv->search_text = g_strdup (search_text);
+	priv->advanced_search = advanced_search ? e_filter_rule_clone (advanced_search) : NULL;
+}
+
+/* free returned values for search_text and advanced_search, if not NULL, as these are new copies */
+void
+e_addressbook_view_get_search (EAddressbookView *view, gint *filter_id, gint *search_id, gchar **search_text, EFilterRule **advanced_search)
+{
+	EAddressbookViewPrivate *priv;
+
+	g_return_if_fail (view != NULL);
+	g_return_if_fail (E_IS_ADDRESSBOOK_VIEW (view));
+	g_return_if_fail (filter_id != NULL);
+	g_return_if_fail (search_id != NULL);
+	g_return_if_fail (search_text != NULL);
+	g_return_if_fail (advanced_search != NULL);
+
+	priv = view->priv;
+
+	*filter_id = priv->filter_id;
+	*search_id = priv->search_id;
+	*search_text = g_strdup (priv->search_text);
+	*advanced_search = priv->advanced_search ? e_filter_rule_clone (priv->advanced_search) : NULL;
+}
diff --git a/addressbook/gui/widgets/e-addressbook-view.h b/addressbook/gui/widgets/e-addressbook-view.h
index 6abab6b..319d060 100644
--- a/addressbook/gui/widgets/e-addressbook-view.h
+++ b/addressbook/gui/widgets/e-addressbook-view.h
@@ -29,6 +29,7 @@
 #include <menus/gal-view-instance.h>
 #include <misc/e-selection-model.h>
 #include <shell/e-shell-view.h>
+#include <filter/e-filter-rule.h>
 
 #include "e-addressbook-model.h"
 #include "eab-contact-display.h"
@@ -117,6 +118,18 @@ void		e_addressbook_view_move_to_folder
 
 gboolean	e_addressbook_view_can_create	(EAddressbookView *view);
 
+void		e_addressbook_view_set_search	(EAddressbookView *view,
+						 gint filter_id,
+						 gint search_id,
+						 const gchar *search_text,
+						 EFilterRule *advanced_search);
+
+void		e_addressbook_view_get_search	(EAddressbookView *view,
+						 gint *filter_id,
+						 gint *search_id,
+						 gchar **search_text,
+						 EFilterRule **advanced_search);
+
 G_END_DECLS
 
 #endif /* E_ADDRESSBOOK_VIEW_H */
diff --git a/modules/addressbook/e-book-shell-content.c b/modules/addressbook/e-book-shell-content.c
index f5b147b..46d9824 100644
--- a/modules/addressbook/e-book-shell-content.c
+++ b/modules/addressbook/e-book-shell-content.c
@@ -28,6 +28,7 @@
 #include "e-util/gconf-bridge.h"
 #include "shell/e-shell-utils.h"
 #include "widgets/misc/e-paned.h"
+#include "e-book-shell-view.h"
 
 #define E_BOOK_SHELL_CONTENT_GET_PRIVATE(obj) \
 	(G_TYPE_INSTANCE_GET_PRIVATE \
@@ -519,9 +520,10 @@ void
 e_book_shell_content_set_current_view (EBookShellContent *book_shell_content,
                                        EAddressbookView *addressbook_view)
 {
+	EBookShellView *book_shell_view;
 	GtkNotebook *notebook;
 	GtkWidget *child;
-	gint page_num;
+	gint page_num, old_page_num;
 
 	g_return_if_fail (E_IS_BOOK_SHELL_CONTENT (book_shell_content));
 	g_return_if_fail (E_IS_ADDRESSBOOK_VIEW (addressbook_view));
@@ -531,7 +533,33 @@ e_book_shell_content_set_current_view (EBookShellContent *book_shell_content,
 	page_num = gtk_notebook_page_num (notebook, child);
 	g_return_if_fail (page_num >= 0);
 
+	old_page_num = gtk_notebook_get_current_page (notebook);
 	gtk_notebook_set_current_page (notebook, page_num);
+
+	if (old_page_num != page_num) {
+		EShellContent *shell_content;
+		gint filter_id = 0, search_id = 0;
+		gchar *search_text = NULL;
+		EFilterRule *advanced_search = NULL;
+		GtkRadioAction *radio_action;
+
+		shell_content = E_SHELL_CONTENT (book_shell_content);
+		book_shell_view = E_BOOK_SHELL_VIEW (e_shell_content_get_shell_view (shell_content));
+
+		e_book_shell_view_disable_searching (book_shell_view);
+		e_addressbook_view_get_search (addressbook_view, &filter_id, &search_id, &search_text, &advanced_search);
+		if (e_shell_content_get_filter_action (shell_content))
+			e_shell_content_set_filter_value (shell_content, filter_id);
+		radio_action = e_shell_content_get_search_radio_action (shell_content);
+		gtk_radio_action_set_current_value (radio_action, search_id);
+		e_shell_content_set_search_text	(shell_content, search_text ? search_text : "");
+		e_shell_content_set_search_rule (shell_content, advanced_search);
+		g_free (search_text);
+		if (advanced_search)
+			g_object_unref (advanced_search);
+		e_book_shell_view_enable_searching (book_shell_view);
+	}
+
 	g_object_notify (G_OBJECT (book_shell_content), "current-view");
 }
 
diff --git a/modules/addressbook/e-book-shell-view-private.c b/modules/addressbook/e-book-shell-view-private.c
index 279cf87..5b71c3c 100644
--- a/modules/addressbook/e-book-shell-view-private.c
+++ b/modules/addressbook/e-book-shell-view-private.c
@@ -242,6 +242,9 @@ book_shell_view_activate_selected_source (EBookShellView *book_shell_view,
 		widget = e_addressbook_view_new (shell_view, source);
 		gtk_widget_show (widget);
 
+		/* default searching options for a new view */
+		e_addressbook_view_set_search (E_ADDRESSBOOK_VIEW (widget), CONTACT_FILTER_ANY_CATEGORY, CONTACT_SEARCH_NAME_CONTAINS, NULL, NULL);
+
 		e_book_shell_content_insert_view (
 			book_shell_content,
 			E_ADDRESSBOOK_VIEW (widget));
diff --git a/modules/addressbook/e-book-shell-view-private.h b/modules/addressbook/e-book-shell-view-private.h
index 6d513aa..f1b23c2 100644
--- a/modules/addressbook/e-book-shell-view-private.h
+++ b/modules/addressbook/e-book-shell-view-private.h
@@ -108,6 +108,8 @@ struct _EBookShellViewPrivate {
 	GHashTable *uid_to_editor;
 
 	gint preview_index;
+
+	gint search_locked; /* can track whether search changed while locked, but it is not usable at the moment */
 };
 
 void		e_book_shell_view_private_init
diff --git a/modules/addressbook/e-book-shell-view.c b/modules/addressbook/e-book-shell-view.c
index 6c4c430..ebbf3e7 100644
--- a/modules/addressbook/e-book-shell-view.c
+++ b/modules/addressbook/e-book-shell-view.c
@@ -132,20 +132,28 @@ book_shell_view_execute_search (EShellView *shell_view)
 	EAddressbookModel *model;
 	gchar *query;
 	gchar *temp;
-	gint value;
+	gint filter_id, search_id;
+	gchar *search_text = NULL;
+	EFilterRule *advanced_search = NULL;
 
 	priv = E_BOOK_SHELL_VIEW_GET_PRIVATE (shell_view);
 
+	if (priv->search_locked)
+		return;
+
 	shell_content = e_shell_view_get_shell_content (shell_view);
 	shell_window = e_shell_view_get_shell_window (shell_view);
 	action = GTK_RADIO_ACTION (ACTION (CONTACT_SEARCH_ANY_FIELD_CONTAINS));
-	value = gtk_radio_action_get_current_value (action);
+	search_id = gtk_radio_action_get_current_value (action);
 
-	if (value == CONTACT_SEARCH_ADVANCED) {
+	if (search_id == CONTACT_SEARCH_ADVANCED) {
 		query = e_shell_content_get_search_rule_as_string (shell_content);
 
 		if (!query)
 			query = g_strdup ("");
+
+		/* internal pointer, no need to free it */
+		advanced_search = e_shell_content_get_search_rule (shell_content);
 	} else {
 		const gchar *text;
 		const gchar *format;
@@ -155,10 +163,12 @@ book_shell_view_execute_search (EShellView *shell_view)
 
 		if (text == NULL || *text == '\0') {
 			text = "";
-			value = CONTACT_SEARCH_ANY_FIELD_CONTAINS;
+			search_id = CONTACT_SEARCH_ANY_FIELD_CONTAINS;
 		}
 
-		switch (value) {
+		search_text = text && *text ? g_strdup (text) : NULL;
+
+		switch (search_id) {
 			case CONTACT_SEARCH_NAME_CONTAINS:
 				format = "(contains \"full_name\" %s)";
 				break;
@@ -184,8 +194,8 @@ book_shell_view_execute_search (EShellView *shell_view)
 	}
 
 	/* Apply selected filter. */
-	value = e_shell_content_get_filter_value (shell_content);
-	switch (value) {
+	filter_id = e_shell_content_get_filter_value (shell_content);
+	switch (filter_id) {
 		case CONTACT_FILTER_ANY_CATEGORY:
 			break;
 
@@ -204,7 +214,7 @@ book_shell_view_execute_search (EShellView *shell_view)
 			const gchar *category_name;
 
 			categories = e_categories_get_list ();
-			category_name = g_list_nth_data (categories, value);
+			category_name = g_list_nth_data (categories, filter_id);
 			g_list_free (categories);
 
 			temp = g_strdup_printf (
@@ -220,7 +230,9 @@ book_shell_view_execute_search (EShellView *shell_view)
 	view = e_book_shell_content_get_current_view (book_shell_content);
 	model = e_addressbook_view_get_model (view);
 	e_addressbook_model_set_query (model, query);
+	e_addressbook_view_set_search (view, filter_id, search_id, search_text, advanced_search);
 	g_free (query);
+	g_free (search_text);
 
 	e_book_shell_content_set_preview_contact (book_shell_content, NULL);
 	priv->preview_index = -1;
@@ -441,3 +453,29 @@ e_book_shell_view_register_type (GTypeModule *type_module)
 		type_module, E_TYPE_SHELL_VIEW,
 		"EBookShellView", &type_info, 0);
 }
+
+void
+e_book_shell_view_disable_searching (EBookShellView *book_shell_view)
+{
+	EBookShellViewPrivate *priv;
+
+	g_return_if_fail (book_shell_view != NULL);
+	g_return_if_fail (E_IS_BOOK_SHELL_VIEW (book_shell_view));
+
+	priv = E_BOOK_SHELL_VIEW_GET_PRIVATE (book_shell_view);
+	priv->search_locked++;
+}
+
+void
+e_book_shell_view_enable_searching (EBookShellView *book_shell_view)
+{
+	EBookShellViewPrivate *priv;
+
+	g_return_if_fail (book_shell_view != NULL);
+	g_return_if_fail (E_IS_BOOK_SHELL_VIEW (book_shell_view));
+
+	priv = E_BOOK_SHELL_VIEW_GET_PRIVATE (book_shell_view);
+	g_return_if_fail (priv->search_locked > 0);
+
+	priv->search_locked--;
+}
diff --git a/modules/addressbook/e-book-shell-view.h b/modules/addressbook/e-book-shell-view.h
index 33a0c8a..a5e726b 100644
--- a/modules/addressbook/e-book-shell-view.h
+++ b/modules/addressbook/e-book-shell-view.h
@@ -61,6 +61,9 @@ struct _EBookShellViewClass {
 GType		e_book_shell_view_get_type	(void);
 void		e_book_shell_view_register_type	(GTypeModule *type_module);
 
+void		e_book_shell_view_disable_searching (EBookShellView *book_shell_view);
+void		e_book_shell_view_enable_searching (EBookShellView *book_shell_view);
+
 G_END_DECLS
 
 #endif /* E_BOOK_SHELL_VIEW_H */



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