evolution r37263 - in branches/kill-bonobo: addressbook/gui/component calendar/modules composer doc/reference/shell doc/reference/shell/tmpl mail shell widgets/misc



Author: mbarnes
Date: Sat Feb 14 00:30:08 2009
New Revision: 37263
URL: http://svn.gnome.org/viewvc/evolution?rev=37263&view=rev

Log:
Get mail search bar partially working without help from EFilterBar.
Search scope (current folder, current account, etc.) is still ignored.


Modified:
   branches/kill-bonobo/addressbook/gui/component/e-book-shell-view-private.c
   branches/kill-bonobo/calendar/modules/e-memo-shell-view-private.c
   branches/kill-bonobo/calendar/modules/e-task-shell-view-private.c
   branches/kill-bonobo/composer/e-msg-composer.c
   branches/kill-bonobo/doc/reference/shell/eshell-sections.txt
   branches/kill-bonobo/doc/reference/shell/tmpl/e-shell-content.sgml
   branches/kill-bonobo/doc/reference/shell/tmpl/eshell-unused.sgml
   branches/kill-bonobo/mail/e-mail-shell-content.c
   branches/kill-bonobo/mail/e-mail-shell-content.h
   branches/kill-bonobo/mail/e-mail-shell-view-actions.c
   branches/kill-bonobo/mail/e-mail-shell-view-private.c
   branches/kill-bonobo/mail/e-mail-shell-view-private.h
   branches/kill-bonobo/mail/em-folder-browser.c
   branches/kill-bonobo/shell/e-shell-content.c
   branches/kill-bonobo/shell/e-shell-content.h
   branches/kill-bonobo/widgets/misc/e-search-bar.h

Modified: branches/kill-bonobo/addressbook/gui/component/e-book-shell-view-private.c
==============================================================================
--- branches/kill-bonobo/addressbook/gui/component/e-book-shell-view-private.c	(original)
+++ branches/kill-bonobo/addressbook/gui/component/e-book-shell-view-private.c	Sat Feb 14 00:30:08 2009
@@ -535,8 +535,7 @@
 
 	shell_window = e_shell_view_get_shell_window (shell_view);
 	action = ACTION (CONTACT_SEARCH_ANY_FIELD_CONTAINS);
-	value = gtk_radio_action_get_current_value (
-		GTK_RADIO_ACTION (action));
+	value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (action));
 
 	if (text == NULL || *text == '\0') {
 		text = "";

Modified: branches/kill-bonobo/calendar/modules/e-memo-shell-view-private.c
==============================================================================
--- branches/kill-bonobo/calendar/modules/e-memo-shell-view-private.c	(original)
+++ branches/kill-bonobo/calendar/modules/e-memo-shell-view-private.c	Sat Feb 14 00:30:08 2009
@@ -329,8 +329,7 @@
 
 	shell_window = e_shell_view_get_shell_window (shell_view);
 	action = ACTION (MEMO_SEARCH_ANY_FIELD_CONTAINS);
-	value = gtk_radio_action_get_current_value (
-		GTK_RADIO_ACTION (action));
+	value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (action));
 
 	if (text == NULL || *text == '\0') {
 		text = "";

Modified: branches/kill-bonobo/calendar/modules/e-task-shell-view-private.c
==============================================================================
--- branches/kill-bonobo/calendar/modules/e-task-shell-view-private.c	(original)
+++ branches/kill-bonobo/calendar/modules/e-task-shell-view-private.c	Sat Feb 14 00:30:08 2009
@@ -441,8 +441,7 @@
 
 	shell_window = e_shell_view_get_shell_window (shell_view);
 	action = ACTION (TASK_SEARCH_ANY_FIELD_CONTAINS);
-	value = gtk_radio_action_get_current_value (
-		GTK_RADIO_ACTION (action));
+	value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (action));
 
 	if (text == NULL || *text == '\0') {
 		text = "";

Modified: branches/kill-bonobo/composer/e-msg-composer.c
==============================================================================
--- branches/kill-bonobo/composer/e-msg-composer.c	(original)
+++ branches/kill-bonobo/composer/e-msg-composer.c	Sat Feb 14 00:30:08 2009
@@ -78,7 +78,6 @@
 #include "mail/em-utils.h"
 #include "mail/mail-config.h"
 #include "mail/mail-crypto.h"
-#include "mail/mail-ops.h"
 #include "mail/mail-tools.h"
 
 #include "e-msg-composer.h"

Modified: branches/kill-bonobo/doc/reference/shell/eshell-sections.txt
==============================================================================
--- branches/kill-bonobo/doc/reference/shell/eshell-sections.txt	(original)
+++ branches/kill-bonobo/doc/reference/shell/eshell-sections.txt	Sat Feb 14 00:30:08 2009
@@ -45,8 +45,6 @@
 e_shell_content_new
 e_shell_content_check_state
 e_shell_content_get_shell_view
-e_shell_content_get_context
-e_shell_content_set_context
 e_shell_content_get_filter_action
 e_shell_content_set_filter_action
 e_shell_content_get_filter_value
@@ -60,8 +58,6 @@
 e_shell_content_set_search_rule
 e_shell_content_get_search_text
 e_shell_content_set_search_text
-e_shell_content_get_search_value
-e_shell_content_set_search_value
 e_shell_content_get_search_visible
 e_shell_content_set_search_visible
 e_shell_content_get_scope_action

Modified: branches/kill-bonobo/doc/reference/shell/tmpl/e-shell-content.sgml
==============================================================================
--- branches/kill-bonobo/doc/reference/shell/tmpl/e-shell-content.sgml	(original)
+++ branches/kill-bonobo/doc/reference/shell/tmpl/e-shell-content.sgml	Sat Feb 14 00:30:08 2009
@@ -68,11 +68,6 @@
 
 </para>
 
-<!-- ##### ARG EShellContent:search-value ##### -->
-<para>
-
-</para>
-
 <!-- ##### ARG EShellContent:search-visible ##### -->
 <para>
 
@@ -110,24 +105,6 @@
 @Returns: 
 
 
-<!-- ##### FUNCTION e_shell_content_get_context ##### -->
-<para>
-
-</para>
-
- shell_content: 
- Returns: 
-
-
-<!-- ##### FUNCTION e_shell_content_set_context ##### -->
-<para>
-
-</para>
-
- shell_content: 
- context: 
-
-
 <!-- ##### FUNCTION e_shell_content_get_filter_action ##### -->
 <para>
 
@@ -245,24 +222,6 @@
 @search_text: 
 
 
-<!-- ##### FUNCTION e_shell_content_get_search_value ##### -->
-<para>
-
-</para>
-
- shell_content: 
- Returns: 
-
-
-<!-- ##### FUNCTION e_shell_content_set_search_value ##### -->
-<para>
-
-</para>
-
- shell_content: 
- search_value: 
-
-
 <!-- ##### FUNCTION e_shell_content_get_search_visible ##### -->
 <para>
 

Modified: branches/kill-bonobo/doc/reference/shell/tmpl/eshell-unused.sgml
==============================================================================
--- branches/kill-bonobo/doc/reference/shell/tmpl/eshell-unused.sgml	(original)
+++ branches/kill-bonobo/doc/reference/shell/tmpl/eshell-unused.sgml	Sat Feb 14 00:30:08 2009
@@ -439,6 +439,12 @@
 </para>
 
 
+<!-- ##### ARG EShellContent:search-value ##### -->
+<para>
+
+</para>
+
+
 <!-- ##### ENUM EShellLineStatus ##### -->
 <para>
 
@@ -1737,6 +1743,38 @@
 @revision: 
 @Returns: 
 
+<!-- ##### FUNCTION e_shell_content_get_context ##### -->
+<para>
+
+</para>
+
+ shell_content: 
+ Returns: 
+
+<!-- ##### FUNCTION e_shell_content_get_search_value ##### -->
+<para>
+
+</para>
+
+ shell_content: 
+ Returns: 
+
+<!-- ##### FUNCTION e_shell_content_set_context ##### -->
+<para>
+
+</para>
+
+ shell_content: 
+ context: 
+
+<!-- ##### FUNCTION e_shell_content_set_search_value ##### -->
+<para>
+
+</para>
+
+ shell_content: 
+ search_value: 
+
 <!-- ##### FUNCTION e_shell_create_window ##### -->
 <para>
 

Modified: branches/kill-bonobo/mail/e-mail-shell-content.c
==============================================================================
--- branches/kill-bonobo/mail/e-mail-shell-content.c	(original)
+++ branches/kill-bonobo/mail/e-mail-shell-content.c	Sat Feb 14 00:30:08 2009
@@ -753,6 +753,15 @@
 	g_object_notify (G_OBJECT (mail_shell_content), "vertical-view");
 }
 
+GalViewInstance *
+e_mail_shell_content_get_view_instance (EMailShellContent *mail_shell_content)
+{
+	g_return_val_if_fail (
+		E_IS_MAIL_SHELL_CONTENT (mail_shell_content), NULL);
+
+	return mail_shell_content->priv->view_instance;
+}
+
 void
 e_mail_shell_content_update_view_instance (EMailShellContent *mail_shell_content)
 {

Modified: branches/kill-bonobo/mail/e-mail-shell-content.h
==============================================================================
--- branches/kill-bonobo/mail/e-mail-shell-content.h	(original)
+++ branches/kill-bonobo/mail/e-mail-shell-content.h	Sat Feb 14 00:30:08 2009
@@ -73,6 +73,9 @@
 void		e_mail_shell_content_set_vertical_view
 						(EMailShellContent *mail_shell_content,
 						 gboolean vertical_view);
+GalViewInstance *
+		e_mail_shell_content_get_view_instance
+						(EMailShellContent *mail_shell_content);
 void		e_mail_shell_content_update_view_instance
 						(EMailShellContent *mail_shell_content);
 

Modified: branches/kill-bonobo/mail/e-mail-shell-view-actions.c
==============================================================================
--- branches/kill-bonobo/mail/e-mail-shell-view-actions.c	(original)
+++ branches/kill-bonobo/mail/e-mail-shell-view-actions.c	Sat Feb 14 00:30:08 2009
@@ -22,6 +22,26 @@
 #include "e-mail-shell-view-private.h"
 
 static void
+action_gal_save_custom_view_cb (GtkAction *action,
+                                EMailShellView *mail_shell_view)
+{
+	EMailShellContent *mail_shell_content;
+	EShellView *shell_view;
+	GalViewInstance *view_instance;
+
+	/* All shell views repond to the activation of this action,
+	 * which is defined by EShellWindow.  But only the currently
+	 * active shell view proceeds with saving the custom view. */
+	shell_view = E_SHELL_VIEW (mail_shell_view);
+	if (!e_shell_view_is_active (shell_view))
+		return;
+
+	mail_shell_content = mail_shell_view->priv->mail_shell_content;
+	view_instance = e_mail_shell_content_get_view_instance (mail_shell_content);
+	gal_view_instance_save_as (view_instance);
+}
+
+static void
 action_mail_account_disable_cb (GtkAction *action,
                                 EMailShellView *mail_shell_view)
 {
@@ -685,6 +705,22 @@
 }
 
 static void
+action_search_execute_cb (GtkAction *action,
+                          EMailShellView *mail_shell_view)
+{
+	EShellView *shell_view;
+
+	/* All shell views respond to the activation of this action,
+	 * which is defined by EShellWindow.  But only the currently
+	 * active shell view proceeds with executing the search. */
+	shell_view = E_SHELL_VIEW (mail_shell_view);
+	if (!e_shell_view_is_active (shell_view))
+		return;
+
+	e_mail_shell_view_execute_search (mail_shell_view);
+}
+
+static void
 action_search_filter_cb (GtkRadioAction *action,
                          GtkRadioAction *current,
                          EMailShellView *mail_shell_view)
@@ -692,6 +728,14 @@
 	e_mail_shell_view_execute_search (mail_shell_view);
 }
 
+static void
+action_search_scope_cb (GtkRadioAction *action,
+                        GtkRadioAction *current,
+                        EMailShellView *mail_shell_view)
+{
+	e_mail_shell_view_execute_search (mail_shell_view);
+}
+
 static GtkActionEntry mail_entries[] = {
 
 	{ "mail-account-disable",
@@ -1166,7 +1210,9 @@
 {
 	EShellView *shell_view;
 	EShellWindow *shell_window;
+	EShellContent *shell_content;
 	GtkActionGroup *action_group;
+	GtkRadioAction *radio_action;
 	GConfBridge *bridge;
 	GObject *object;
 	GObject *src_object;
@@ -1177,6 +1223,7 @@
 
 	shell_view = E_SHELL_VIEW (mail_shell_view);
 	shell_window = e_shell_view_get_shell_window (shell_view);
+	shell_content = e_shell_view_get_shell_content (shell_view);
 
 	/* Mail Actions */
 	action_group = ACTION_GROUP (MAIL);
@@ -1202,7 +1249,11 @@
 		action_group, mail_scope_entries,
 		G_N_ELEMENTS (mail_scope_entries),
 		MAIL_SCOPE_CURRENT_FOLDER,
-		NULL, NULL);
+		G_CALLBACK (action_search_scope_cb), mail_shell_view);
+
+	radio_action = GTK_RADIO_ACTION (ACTION (MAIL_SCOPE_ALL_ACCOUNTS));
+	e_shell_content_set_scope_action (shell_content, radio_action);
+	e_shell_content_set_scope_visible (shell_content, TRUE);
 
 	/* Bind GObject properties for GConf keys. */
 
@@ -1235,6 +1286,14 @@
 
 	dst_object = G_OBJECT (ACTION (MAIL_THREADS_EXPAND_ALL));
 	e_binding_new (src_object, "active", dst_object, "sensitive");
+
+	g_signal_connect (
+		ACTION (GAL_SAVE_CUSTOM_VIEW), "activate",
+		G_CALLBACK (action_gal_save_custom_view_cb), mail_shell_view);
+
+	g_signal_connect (
+		ACTION (SEARCH_EXECUTE), "activate",
+		G_CALLBACK (action_search_execute_cb), mail_shell_view);
 }
 
 /* Helper for e_mail_shell_view_update_popup_labels() */
@@ -1470,7 +1529,7 @@
 		ii++;
 	}
 
-	/* User any action in the group; doesn't matter which. */
+	/* Use any action in the group; doesn't matter which. */
 	e_shell_content_set_filter_action (shell_content, radio_action);
 
 	ii = MAIL_FILTER_UNREAD_MESSAGES;

Modified: branches/kill-bonobo/mail/e-mail-shell-view-private.c
==============================================================================
--- branches/kill-bonobo/mail/e-mail-shell-view-private.c	(original)
+++ branches/kill-bonobo/mail/e-mail-shell-view-private.c	Sat Feb 14 00:30:08 2009
@@ -162,12 +162,16 @@
 	EShellWindow *shell_window;
 	EMFolderTreeModel *folder_tree_model;
 	EMFolderTree *folder_tree;
+	RuleContext *context;
+	FilterRule *rule = NULL;
 	GtkTreeModel *tree_model;
 	GtkUIManager *ui_manager;
 	MessageList *message_list;
 	EMailReader *reader;
+	const gchar *source;
 	guint merge_id;
 	gchar *uri;
+	gint ii = 0;
 
 	shell_view = E_SHELL_VIEW (mail_shell_view);
 	shell_content = e_shell_view_get_shell_content (shell_view);
@@ -243,6 +247,17 @@
 	e_mail_shell_view_update_search_filter (mail_shell_view);
 	e_mail_reader_init (reader);
 
+	/* Populate built-in rules for search entry popup menu.
+	 * Keep the assertions, please.  If the conditions aren't
+	 * met we're going to crash anyway, just more mysteriously. */
+	context = e_shell_content_get_search_context (shell_content);
+	source = FILTER_SOURCE_DEMAND;
+	while ((rule = rule_context_next_rule (context, rule, source))) {
+		g_assert (ii < MAIL_NUM_SEARCH_RULES);
+		priv->search_rules[ii++] = g_object_ref (rule);
+	}
+	g_assert (ii == MAIL_NUM_SEARCH_RULES);
+
 	/* Restore the previously selected folder. */
 	folder_tree_model = em_folder_tree_get_model (folder_tree);
 	uri = em_folder_tree_model_get_selected (folder_tree_model);
@@ -266,20 +281,263 @@
 e_mail_shell_view_private_dispose (EMailShellView *mail_shell_view)
 {
 	EMailShellViewPrivate *priv = mail_shell_view->priv;
+	gint ii;
 
 	DISPOSE (priv->mail_shell_content);
 	DISPOSE (priv->mail_shell_sidebar);
+
+	for (ii = 0; ii < MAIL_NUM_SEARCH_RULES; ii++)
+		DISPOSE (priv->search_rules[ii]);
 }
 
 void
 e_mail_shell_view_private_finalize (EMailShellView *mail_shell_view)
 {
+	/* XXX Nothing to do? */
 }
 
 void
 e_mail_shell_view_execute_search (EMailShellView *mail_shell_view)
 {
-	/* FIXME */
+	EShell *shell;
+	EShellView *shell_view;
+	EShellWindow *shell_window;
+	EShellContent *shell_content;
+	EShellSettings *shell_settings;
+	EMFormatHTMLDisplay *html_display;
+	MessageList *message_list;
+	FilterRule *rule;
+	EMailReader *reader;
+	CamelFolder *folder;
+	GtkAction *action;
+	GtkTreeModel *model;
+	GtkTreePath *path;
+	GtkTreeIter tree_iter;
+	GString *string;
+	GList *iter;
+	GSList *word_list = NULL;
+	const gchar *folder_uri;
+	const gchar *text;
+	gboolean valid;
+	gchar *query;
+	gchar *temp;
+	gchar *tag;
+	gint value;
+
+	g_return_if_fail (E_IS_MAIL_SHELL_VIEW (mail_shell_view));
+
+	shell_view = E_SHELL_VIEW (mail_shell_view);
+	shell_window = e_shell_view_get_shell_window (shell_view);
+	shell_content = e_shell_view_get_shell_content (shell_view);
+
+	shell = e_shell_window_get_shell (shell_window);
+	shell_settings = e_shell_get_shell_settings (shell);
+
+	reader = E_MAIL_READER (shell_content);
+	html_display = e_mail_reader_get_html_display (reader);
+	message_list = e_mail_reader_get_message_list (reader);
+
+	folder_uri = message_list->folder_uri;
+	folder = message_list->folder;
+
+	/* This returns a new object reference. */
+	model = e_shell_settings_get_object (
+		shell_settings, "mail-label-list-store");
+
+	text = e_shell_content_get_search_text (shell_content);
+	if (text == NULL || *text == '\0') {
+		query = g_strdup ("");
+		goto filter;
+	}
+
+	/* Replace variables in the selected rule with the
+	 * current search text and extract a query string. */
+
+	action = ACTION (MAIL_SEARCH_SUBJECT_OR_SENDER_CONTAINS);
+	value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (action));
+	g_return_if_fail (value >= 0 && value < MAIL_NUM_SEARCH_RULES);
+	rule = mail_shell_view->priv->search_rules[value];
+
+	for (iter = rule->parts; iter != NULL; iter = iter->next) {
+		FilterPart *part = iter->data;
+		FilterElement *element = NULL;
+
+		if (strcmp (part->name, "subject") == 0)
+			element = filter_part_find_element (part, "subject");
+		else if (strcmp (part->name, "body") == 0)
+			element = filter_part_find_element (part, "word");
+		else if (strcmp (part->name, "sender") == 0)
+			element = filter_part_find_element (part, "sender");
+		else if (strcmp (part->name, "to") == 0)
+			element = filter_part_find_element (part, "recipient");
+
+		if (strcmp (part->name, "body") == 0) {
+			struct _camel_search_words *words;
+			gint ii;
+
+			words = camel_search_words_split ((guchar *) text);
+			for (ii = 0; ii < words->len; ii++)
+				word_list = g_slist_prepend (
+					word_list, g_strdup (
+					words->words[ii]->word));
+			camel_search_words_free (words);
+		}
+
+		if (element != NULL) {
+			FilterInput *input = FILTER_INPUT (element);
+			filter_input_set_value (input, text);
+		}
+	}
+
+	string = g_string_sized_new (1024);
+	filter_rule_build_code (rule, string);
+	query = g_string_free (string, FALSE);
+
+filter:
+
+	/* Apply selected filter. */
+
+	value = e_shell_content_get_filter_value (shell_content);
+	switch (value) {
+		case MAIL_FILTER_ALL_MESSAGES:
+			break;
+
+		case MAIL_FILTER_UNREAD_MESSAGES:
+			temp = g_strdup_printf (
+				"(and %s (match-all (not "
+				"(system-flag \"Seen\"))))", query);
+			g_free (query);
+			query = temp;
+			break;
+
+		case MAIL_FILTER_NO_LABEL:
+			string = g_string_sized_new (1024);
+			g_string_append_printf (
+				string, "(and %s (and ", query);
+			valid = gtk_tree_model_get_iter_first (
+				model, &tree_iter);
+			while (valid) {
+				tag = e_mail_label_list_store_get_tag (
+					E_MAIL_LABEL_LIST_STORE (model),
+					&tree_iter);
+				g_string_append_printf (
+					string, " (match-all (not (or "
+					"(= (user-tag \"label\") \"%s\") "
+					"(user-flag \"$Label%s\") "
+					"(user-flag \"%s\"))))",
+					tag, tag, tag);
+				g_free (tag);
+
+				valid = gtk_tree_model_iter_next (
+					model, &tree_iter);
+			}
+			g_string_append_len (string, "))", 2);
+			g_free (query);
+			query = g_string_free (string, FALSE);
+			break;
+
+		case MAIL_FILTER_READ_MESSAGES:
+			temp = g_strdup_printf (
+				"(and %s (match-all "
+				"(system-flag \"Seen\")))", query);
+			g_free (query);
+			query = temp;
+			break;
+
+		case MAIL_FILTER_RECENT_MESSAGES:
+			if (em_utils_folder_is_sent (folder, folder_uri))
+				temp = g_strdup_printf (
+					"(and %s (match-all "
+					"(> (get-sent-date) "
+					"(- (get-current-date) 86400))))",
+					query);
+			else
+				temp = g_strdup_printf (
+					"(and %s (match-all "
+					"(> (get-received-date) "
+					"(- (get_current_date) 86400))))",
+					query);
+			g_free (query);
+			query = temp;
+			break;
+
+		case MAIL_FILTER_LAST_5_DAYS_MESSAGES:
+			if (em_utils_folder_is_sent (folder, folder_uri))
+				temp = g_strdup_printf (
+					"(and %s (match-all "
+					"(> (get-sent-date) "
+					"(- (get-current-date) 432000))))",
+					query);
+			else
+				temp = g_strdup_printf (
+					"(and %s (match-all "
+					"(> (get-received-date) "
+					"(- (get_current_date) 432000))))",
+					query);
+			g_free (query);
+			query = temp;
+			break;
+
+		case MAIL_FILTER_MESSAGES_WITH_ATTACHMENTS:
+			temp = g_strdup_printf (
+				"(and %s (match-all "
+				"(system-flag \"Attachments\")))", query);
+			g_free (query);
+			query = temp;
+			break;
+
+		case MAIL_FILTER_IMPORTANT_MESSAGES:
+			temp = g_strdup_printf (
+				"(and %s (match-all "
+				"(system-flag \"Flagged\")))", query);
+			g_free (query);
+			query = temp;
+			break;
+
+		case MAIL_FILTER_MESSAGES_NOT_JUNK:
+			temp = g_strdup_printf (
+				"(and %s (match-all (not "
+				"(system-flag \"junk\"))))", query);
+			g_free (query);
+			query = temp;
+			break;
+
+		default:
+			/* The action value also serves as a path for
+			 * the label list store.  That's why we number
+			 * the label actions from zero. */
+			path = gtk_tree_path_new_from_indices (value, -1);
+			gtk_tree_model_get_iter (model, &tree_iter, path);
+			gtk_tree_path_free (path);
+
+			tag = e_mail_label_list_store_get_tag (
+				E_MAIL_LABEL_LIST_STORE (model), &tree_iter);
+			temp = g_strdup_printf (
+				"(and %s (match-all (or "
+				"(= (user-tag \"label\") \"%s\") "
+				"(user-flag \"$Label%s\") "
+				"(user-flag \"%s\"))))",
+				query, tag, tag, tag);
+			g_free (tag);
+
+			g_free (query);
+			query = temp;
+			break;
+	}
+
+	message_list_set_search (message_list, query);
+
+	em_format_html_display_set_search (
+		html_display,
+		EM_FORMAT_HTML_DISPLAY_SEARCH_SECONDARY |
+		EM_FORMAT_HTML_DISPLAY_SEARCH_ICASE,
+		word_list);
+
+	g_slist_foreach (word_list, (GFunc) g_free, NULL);
+	g_slist_free (word_list);
+
+	g_object_unref (model);
+	g_free (query);
 }
 
 /* Helper for e_mail_shell_view_create_filter_from_selected() */
@@ -427,8 +685,6 @@
 	guint32 num_unread;
 	guint32 num_visible;
 
-	/* FIXME The sidebar should handle icon name and primary text. */
-
 	g_return_if_fail (E_IS_MAIL_SHELL_VIEW (mail_shell_view));
 
 	shell_view = E_SHELL_VIEW (mail_shell_view);

Modified: branches/kill-bonobo/mail/e-mail-shell-view-private.h
==============================================================================
--- branches/kill-bonobo/mail/e-mail-shell-view-private.h	(original)
+++ branches/kill-bonobo/mail/e-mail-shell-view-private.h	Sat Feb 14 00:30:08 2009
@@ -27,11 +27,13 @@
 #include <glib/gi18n.h>
 #include <gtkhtml/gtkhtml.h>
 #include <camel/camel-vtrash-folder.h>
+#include <camel/camel-search-private.h>  /* for camel_search_word */
 
 #include "e-util/e-util.h"
 #include "e-util/e-binding.h"
 #include "e-util/gconf-bridge.h"
 #include "e-util/e-account-utils.h"
+#include "filter/filter-part.h"
 #include "widgets/misc/e-popup-action.h"
 #include "widgets/menus/gal-view-instance.h"
 
@@ -101,7 +103,8 @@
 	MAIL_SEARCH_MESSAGE_CONTAINS,
 	MAIL_SEARCH_SUBJECT_CONTAINS,
 	MAIL_SEARCH_SENDER_CONTAINS,
-	MAIL_SEARCH_BODY_CONTAINS
+	MAIL_SEARCH_BODY_CONTAINS,
+	MAIL_NUM_SEARCH_RULES
 };
 
 /* Scope items are displayed in ascending order. */
@@ -123,6 +126,9 @@
 	/* For UI merging and unmerging. */
 	guint merge_id;
 	guint label_merge_id;
+
+	/* Filter rules correspond to the search entry menu. */
+	FilterRule *search_rules[MAIL_NUM_SEARCH_RULES];
 };
 
 void		e_mail_shell_view_private_init

Modified: branches/kill-bonobo/mail/em-folder-browser.c
==============================================================================
--- branches/kill-bonobo/mail/em-folder-browser.c	(original)
+++ branches/kill-bonobo/mail/em-folder-browser.c	Sat Feb 14 00:30:08 2009
@@ -274,34 +274,34 @@
 
 	emfb->view.enable_map = g_slist_prepend(emfb->view.enable_map, (void *)emfb_enable_map);
 
-	if (search_context) {
-		const char *systemrules = g_object_get_data (G_OBJECT (search_context), "system");
-		const char *userrules = g_object_get_data (G_OBJECT (search_context), "user");
-		EFilterBar *efb;
-		GConfClient *gconf;
-
-		emfb->search = e_filter_bar_new(search_context, systemrules, userrules, emfb_search_config_search, emfb);
-		efb = (EFilterBar *)emfb->search;
-		efb->account_search_vf = NULL;
-		efb->all_account_search_vf = NULL;
- 		efb->account_search_cancel = NULL;
-		e_search_bar_set_menu ((ESearchBar *)emfb->search, emfb_search_items);
-		e_search_bar_set_scopeoption ((ESearchBar *)emfb->search, emfb_search_scope_items);
-		e_search_bar_scope_enable ((ESearchBar *)emfb->search, E_FILTERBAR_CURRENT_MESSAGE_ID, FALSE);
-		emfb->priv->scope_restricted = TRUE;
-		g_signal_connect(emfb, "realize", G_CALLBACK(emfb_realize), NULL);
-		gtk_widget_show((GtkWidget *)emfb->search);
-
-		p->search_menu_activated_id = g_signal_connect(emfb->search, "menu_activated", G_CALLBACK(emfb_search_menu_activated), emfb);
-		p->search_activated_id = g_signal_connect(emfb->search, "search_activated", G_CALLBACK(emfb_search_search_activated), emfb);
-		g_signal_connect(emfb->search, "search_cleared", G_CALLBACK(emfb_search_search_cleared), NULL);
-
-		gtk_box_pack_start((GtkBox *)emfb, (GtkWidget *)emfb->search, FALSE, TRUE, 0);
-
+//	if (search_context) {
+//		const char *systemrules = g_object_get_data (G_OBJECT (search_context), "system");
+//		const char *userrules = g_object_get_data (G_OBJECT (search_context), "user");
+//		EFilterBar *efb;
+//		GConfClient *gconf;
+//
+//		emfb->search = e_filter_bar_new(search_context, systemrules, userrules, emfb_search_config_search, emfb);
+//		efb = (EFilterBar *)emfb->search;
+//		efb->account_search_vf = NULL;
+//		efb->all_account_search_vf = NULL;
+// 		efb->account_search_cancel = NULL;
+//		e_search_bar_set_menu ((ESearchBar *)emfb->search, emfb_search_items);
+//		e_search_bar_set_scopeoption ((ESearchBar *)emfb->search, emfb_search_scope_items);
+//		e_search_bar_scope_enable ((ESearchBar *)emfb->search, E_FILTERBAR_CURRENT_MESSAGE_ID, FALSE);
+//		emfb->priv->scope_restricted = TRUE;
+//		g_signal_connect(emfb, "realize", G_CALLBACK(emfb_realize), NULL);
+//		gtk_widget_show((GtkWidget *)emfb->search);
+//
+//		p->search_menu_activated_id = g_signal_connect(emfb->search, "menu_activated", G_CALLBACK(emfb_search_menu_activated), emfb);
+//		p->search_activated_id = g_signal_connect(emfb->search, "search_activated", G_CALLBACK(emfb_search_search_activated), emfb);
+//		g_signal_connect(emfb->search, "search_cleared", G_CALLBACK(emfb_search_search_cleared), NULL);
+//
+//		gtk_box_pack_start((GtkBox *)emfb, (GtkWidget *)emfb->search, FALSE, TRUE, 0);
+//
 //		gconf = mail_config_get_gconf_client ();
 //		emfb->priv->labels_change_notify_id = gconf_client_notify_add (gconf, E_UTIL_LABELS_GCONF_KEY, gconf_labels_changed, emfb, NULL, NULL);
-	}
-
+//	}
+//
 //	emfb->priv->show_wide = gconf_client_get_bool(mail_config_get_gconf_client(), "/apps/evolution/mail/display/show_wide", NULL);
 //	emfb->vpane = emfb->priv->show_wide?gtk_hpaned_new():gtk_vpaned_new();
 //
@@ -470,144 +470,144 @@
 	}
 }
 
-static void
-emfb_search_config_search(EFilterBar *efb, FilterRule *rule, int id, const char *query, void *data)
-{
-	EMFolderBrowser *emfb = data;
-	GList *partl;
-	struct _camel_search_words *words;
-	int i;
-	GSList *strings = NULL;
-
-	/* we scan the parts of a rule, and set all the types we know about to the query string */
-	partl = rule->parts;
-	while (partl) {
-		FilterPart *part = partl->data;
-
-		if (!strcmp(part->name, "subject")) {
-			FilterInput *input = (FilterInput *)filter_part_find_element(part, "subject");
-			if (input)
-				filter_input_set_value(input, query);
-		} else if (!strcmp(part->name, "body")) {
-			FilterInput *input = (FilterInput *)filter_part_find_element(part, "word");
-			if (input)
-				filter_input_set_value(input, query);
-
-			words = camel_search_words_split((unsigned char *)query);
-			for (i=0;i<words->len;i++)
-				strings = g_slist_prepend(strings, g_strdup(words->words[i]->word));
-			camel_search_words_free (words);
-		} else if(!strcmp(part->name, "sender")) {
-			FilterInput *input = (FilterInput *)filter_part_find_element(part, "sender");
-			if (input)
-				filter_input_set_value(input, query);
-		} else if(!strcmp(part->name, "to")) {
-			FilterInput *input = (FilterInput *)filter_part_find_element(part, "recipient");
-			if (input)
-				filter_input_set_value(input, query);
-		}
-
-		partl = partl->next;
-	}
-
-	em_format_html_display_set_search(emfb->view.preview,
-					  EM_FORMAT_HTML_DISPLAY_SEARCH_SECONDARY|EM_FORMAT_HTML_DISPLAY_SEARCH_ICASE,
-					  strings);
-	while (strings) {
-		GSList *n = strings->next;
-		g_free(strings->data);
-		g_slist_free_1(strings);
-		strings = n;
-	}
-}
-
-static char *
-get_view_query (ESearchBar *esb, CamelFolder *folder, const char *folder_uri)
-{
-	char *view_sexp = NULL;
-	gint id;
-	GtkWidget *menu_item;
-	char *tag;
-	gboolean duplicate = TRUE;
-
-	/* Get the current selected view */
-	id = e_search_bar_get_viewitem_id (esb);
-	menu_item = e_search_bar_get_selected_viewitem (esb);
-
-	switch (id & VIEW_ITEMS_MASK) {
-	case VIEW_ALL_MESSAGES:
-		/* one space indicates no filtering */
-		view_sexp = " ";
-		break;
-
-	case VIEW_UNREAD_MESSAGES:
-		view_sexp = "(match-all (not (system-flag  \"Seen\")))";
-		break;
-	case VIEW_READ_MESSAGES:
-		view_sexp = "(match-all (system-flag  \"Seen\" ))";
-		break;
-        case VIEW_RECENT_MESSAGES:
-		if (!em_utils_folder_is_sent (folder, folder_uri))
-			view_sexp = "(match-all (> (get-received-date) (- (get-current-date) 86400)))";
-		else
-			view_sexp = "(match-all (> (get-sent-date) (- (get-current-date) 86400)))";
-		break;
-	case VIEW_LAST_FIVE_DAYS:
-		if (!em_utils_folder_is_sent (folder, folder_uri))
-			view_sexp = " (match-all (> (get-received-date) (- (get-current-date) 432000)))";
-		else
-			view_sexp = " (match-all (> (get-sent-date) (- (get-current-date) 432000)))";
-		break;
-        case VIEW_WITH_ATTACHMENTS:
-		view_sexp = "(match-all (system-flag \"Attachments\" ))";
-		break;
-	case VIEW_NOT_JUNK:
-		view_sexp = "(match-all (not (system-flag \"junk\")))";
-		break;
-        case VIEW_NO_LABEL: {
-		GSList *l;
-		GString *s = g_string_new ("(and");
-
-		for (l = mail_config_get_labels (); l; l = l->next) {
-			EUtilLabel *label = (EUtilLabel *)l->data;
-
-			if (label && label->tag) {
-				const gchar *tag = label->tag;
-
-				if (strncmp (tag, "$Label", 6) == 0)
-					tag += 6;
-
-				g_string_append_printf (s, " (match-all (not (or (= (user-tag \"label\") \"%s\") (user-flag \"$Label%s\") (user-flag \"%s\"))))", tag, tag, tag);
-			}
-		}
-
-		g_string_append (s, ")");
-
-		duplicate = FALSE;
-	        view_sexp = g_string_free (s, FALSE);
-		} break;
-        case VIEW_LABEL:
-		tag = (char *)g_object_get_data (G_OBJECT (menu_item), "LabelTag");
-		view_sexp = g_strdup_printf ("(match-all (or (= (user-tag \"label\") \"%s\") (user-flag \"$Label%s\") (user-flag \"%s\")))", tag, tag, tag);
-		duplicate = FALSE;
-		break;
-	case VIEW_MESSAGES_MARKED_AS_IMPORTANT:
-		view_sexp = "(match-all (system-flag  \"Flagged\" ))";
-		break;
-	case VIEW_ANY_FIELD_CONTAINS:
-		break;
-
-	case VIEW_CUSTOMIZE:
-		/* one space indicates no filtering, so here use two */
-		view_sexp = "  ";
-		break;
-	}
-
-	if (duplicate)
-		view_sexp = g_strdup (view_sexp);
+//static void
+//emfb_search_config_search(EFilterBar *efb, FilterRule *rule, int id, const char *query, void *data)
+//{
+//	EMFolderBrowser *emfb = data;
+//	GList *partl;
+//	struct _camel_search_words *words;
+//	int i;
+//	GSList *strings = NULL;
+//
+//	/* we scan the parts of a rule, and set all the types we know about to the query string */
+//	partl = rule->parts;
+//	while (partl) {
+//		FilterPart *part = partl->data;
+//
+//		if (!strcmp(part->name, "subject")) {
+//			FilterInput *input = (FilterInput *)filter_part_find_element(part, "subject");
+//			if (input)
+//				filter_input_set_value(input, query);
+//		} else if (!strcmp(part->name, "body")) {
+//			FilterInput *input = (FilterInput *)filter_part_find_element(part, "word");
+//			if (input)
+//				filter_input_set_value(input, query);
+//
+//			words = camel_search_words_split((unsigned char *)query);
+//			for (i=0;i<words->len;i++)
+//				strings = g_slist_prepend(strings, g_strdup(words->words[i]->word));
+//			camel_search_words_free (words);
+//		} else if(!strcmp(part->name, "sender")) {
+//			FilterInput *input = (FilterInput *)filter_part_find_element(part, "sender");
+//			if (input)
+//				filter_input_set_value(input, query);
+//		} else if(!strcmp(part->name, "to")) {
+//			FilterInput *input = (FilterInput *)filter_part_find_element(part, "recipient");
+//			if (input)
+//				filter_input_set_value(input, query);
+//		}
+//
+//		partl = partl->next;
+//	}
+//
+//	em_format_html_display_set_search(emfb->view.preview,
+//					  EM_FORMAT_HTML_DISPLAY_SEARCH_SECONDARY|EM_FORMAT_HTML_DISPLAY_SEARCH_ICASE,
+//					  strings);
+//	while (strings) {
+//		GSList *n = strings->next;
+//		g_free(strings->data);
+//		g_slist_free_1(strings);
+//		strings = n;
+//	}
+//}
 
-	return view_sexp;
-}
+//static char *
+//get_view_query (ESearchBar *esb, CamelFolder *folder, const char *folder_uri)
+//{
+//	char *view_sexp = NULL;
+//	gint id;
+//	GtkWidget *menu_item;
+//	char *tag;
+//	gboolean duplicate = TRUE;
+//
+//	/* Get the current selected view */
+//	id = e_search_bar_get_viewitem_id (esb);
+//	menu_item = e_search_bar_get_selected_viewitem (esb);
+//
+//	switch (id & VIEW_ITEMS_MASK) {
+//	case VIEW_ALL_MESSAGES:
+//		/* one space indicates no filtering */
+//		view_sexp = " ";
+//		break;
+//
+//	case VIEW_UNREAD_MESSAGES:
+//		view_sexp = "(match-all (not (system-flag  \"Seen\")))";
+//		break;
+//	case VIEW_READ_MESSAGES:
+//		view_sexp = "(match-all (system-flag  \"Seen\" ))";
+//		break;
+//	case VIEW_RECENT_MESSAGES:
+//		if (!em_utils_folder_is_sent (folder, folder_uri))
+//			view_sexp = "(match-all (> (get-received-date) (- (get-current-date) 86400)))";
+//		else
+//			view_sexp = "(match-all (> (get-sent-date) (- (get-current-date) 86400)))";
+//		break;
+//	case VIEW_LAST_FIVE_DAYS:
+//		if (!em_utils_folder_is_sent (folder, folder_uri))
+//			view_sexp = " (match-all (> (get-received-date) (- (get-current-date) 432000)))";
+//		else
+//			view_sexp = " (match-all (> (get-sent-date) (- (get-current-date) 432000)))";
+//		break;
+//	case VIEW_WITH_ATTACHMENTS:
+//		view_sexp = "(match-all (system-flag \"Attachments\" ))";
+//		break;
+//	case VIEW_NOT_JUNK:
+//		view_sexp = "(match-all (not (system-flag \"junk\")))";
+//		break;
+//	case VIEW_NO_LABEL: {
+//		GSList *l;
+//		GString *s = g_string_new ("(and");
+//
+//		for (l = mail_config_get_labels (); l; l = l->next) {
+//			EUtilLabel *label = (EUtilLabel *)l->data;
+//
+//			if (label && label->tag) {
+//				const gchar *tag = label->tag;
+//
+//				if (strncmp (tag, "$Label", 6) == 0)
+//					tag += 6;
+//
+//				g_string_append_printf (s, " (match-all (not (or (= (user-tag \"label\") \"%s\") (user-flag \"$Label%s\") (user-flag \"%s\"))))", tag, tag, tag);
+//			}
+//		}
+//
+//		g_string_append (s, ")");
+//
+//		duplicate = FALSE;
+//	        view_sexp = g_string_free (s, FALSE);
+//		} break;
+//	case VIEW_LABEL:
+//		tag = (char *)g_object_get_data (G_OBJECT (menu_item), "LabelTag");
+//		view_sexp = g_strdup_printf ("(match-all (or (= (user-tag \"label\") \"%s\") (user-flag \"$Label%s\") (user-flag \"%s\")))", tag, tag, tag);
+//		duplicate = FALSE;
+//		break;
+//	case VIEW_MESSAGES_MARKED_AS_IMPORTANT:
+//		view_sexp = "(match-all (system-flag  \"Flagged\" ))";
+//		break;
+//	case VIEW_ANY_FIELD_CONTAINS:
+//		break;
+//
+//	case VIEW_CUSTOMIZE:
+//		/* one space indicates no filtering, so here use two */
+//		view_sexp = "  ";
+//		break;
+//	}
+//
+//	if (duplicate)
+//		view_sexp = g_strdup (view_sexp);
+//
+//	return view_sexp;
+//}
 
 
 struct _setup_msg {

Modified: branches/kill-bonobo/shell/e-shell-content.c
==============================================================================
--- branches/kill-bonobo/shell/e-shell-content.c	(original)
+++ branches/kill-bonobo/shell/e-shell-content.c	Sat Feb 14 00:30:08 2009
@@ -66,7 +66,6 @@
 	PROP_SEARCH_CONTEXT,
 	PROP_SEARCH_RULE,
 	PROP_SEARCH_TEXT,
-	PROP_SEARCH_VALUE,
 	PROP_SEARCH_VISIBLE,
 	PROP_SCOPE_ACTION,
 	PROP_SCOPE_VALUE,
@@ -78,7 +77,7 @@
 
 static void
 shell_content_dialog_rule_changed (GtkWidget *dialog,
-                                            FilterRule *rule)
+                                   FilterRule *rule)
 {
 	gboolean sensitive;
 
@@ -318,12 +317,6 @@
 				g_value_get_string (value));
 			return;
 
-		case PROP_SEARCH_VALUE:
-			e_shell_content_set_search_value (
-				E_SHELL_CONTENT (object),
-				g_value_get_int (value));
-			return;
-
 		case PROP_SEARCH_VISIBLE:
 			e_shell_content_set_search_visible (
 				E_SHELL_CONTENT (object),
@@ -401,12 +394,6 @@
 				E_SHELL_CONTENT (object)));
 			return;
 
-		case PROP_SEARCH_VALUE:
-			g_value_set_int (
-				value, e_shell_content_get_search_value (
-				E_SHELL_CONTENT (object)));
-			return;
-
 		case PROP_SEARCH_VISIBLE:
 			g_value_set_boolean (
 				value, e_shell_content_get_search_visible (
@@ -725,18 +712,6 @@
 
 	g_object_class_install_property (
 		object_class,
-		PROP_SEARCH_VALUE,
-		g_param_spec_int (
-			"search-value",
-			NULL,
-			NULL,
-			G_MININT,
-			G_MAXINT,
-			0,
-			G_PARAM_READWRITE));
-
-	g_object_class_install_property (
-		object_class,
 		PROP_SEARCH_VISIBLE,
 		g_param_spec_boolean (
 			"search-visible",
@@ -1138,26 +1113,6 @@
 	g_object_notify (G_OBJECT (shell_content), "search-text");
 }
 
-gint
-e_shell_content_get_search_value (EShellContent *shell_content)
-{
-	g_return_val_if_fail (E_IS_SHELL_CONTENT (shell_content), 0);
-
-	/* FIXME */
-	return 0;
-}
-
-void
-e_shell_content_set_search_value (EShellContent *shell_content,
-                                  gint search_value)
-{
-	g_return_if_fail (E_IS_SHELL_CONTENT (shell_content));
-
-	/* FIXME */
-
-	g_object_notify (G_OBJECT (shell_content), "search-value");
-}
-
 gboolean
 e_shell_content_get_search_visible (EShellContent *shell_content)
 {

Modified: branches/kill-bonobo/shell/e-shell-content.h
==============================================================================
--- branches/kill-bonobo/shell/e-shell-content.h	(original)
+++ branches/kill-bonobo/shell/e-shell-content.h	Sat Feb 14 00:30:08 2009
@@ -85,9 +85,6 @@
 guint32		e_shell_content_check_state	(EShellContent *shell_content);
 struct _EShellView *
 		e_shell_content_get_shell_view	(EShellContent *shell_content);
-RuleContext *	e_shell_content_get_context	(EShellContent *shell_content);
-void		e_shell_content_set_context	(EShellContent *shell_content,
-						 RuleContext *context);
 GtkRadioAction *e_shell_content_get_filter_action
 						(EShellContent *shell_content);
 void		e_shell_content_set_filter_action
@@ -115,9 +112,6 @@
 const gchar *	e_shell_content_get_search_text	(EShellContent *shell_content);
 void		e_shell_content_set_search_text	(EShellContent *shell_content,
 						 const gchar *search_text);
-gint		e_shell_content_get_search_value(EShellContent *shell_content);
-void		e_shell_content_set_search_value(EShellContent *shell_content,
-						 gint search_value);
 gboolean	e_shell_content_get_search_visible
 						(EShellContent *shell_content);
 void		e_shell_content_set_search_visible

Modified: branches/kill-bonobo/widgets/misc/e-search-bar.h
==============================================================================
--- branches/kill-bonobo/widgets/misc/e-search-bar.h	(original)
+++ branches/kill-bonobo/widgets/misc/e-search-bar.h	Sat Feb 14 00:30:08 2009
@@ -54,14 +54,12 @@
 typedef struct _ESearchBarClass ESearchBarClass;
 typedef struct _ESearchBarPrivate ESearchBarPrivate;
 
-struct _ESearchBar
-{
+struct _ESearchBar {
 	GtkHBox parent;
 	ESearchBarPrivate *priv;
 };
 
-struct _ESearchBarClass
-{
+struct _ESearchBarClass {
 	GtkHBoxClass parent_class;
 };
 



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