From 723fc8f7c266d618eb91e2f621c7c93c6efded37 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jos=C3=A9=20Dapena=20Paz?= Date: Fri, 15 Jan 2010 15:59:05 +0100 Subject: [PATCH] Add find toolbar to headers window. --- src/hildon2/modest-header-window.c | 84 ++++++++++++++++++++++++++++++++++++ src/widgets/modest-header-view.c | 81 ++++++++++++++++++++++++++++++++++ src/widgets/modest-header-view.h | 10 +++++ 3 files changed, 175 insertions(+) diff --git a/src/hildon2/modest-header-window.c b/src/hildon2/modest-header-window.c index 7a03ef0..526b26a 100644 --- a/src/hildon2/modest-header-window.c +++ b/src/hildon2/modest-header-window.c @@ -48,10 +48,12 @@ #include #include #include +#include #include #include #include #include +#include #define SHOW_LATEST_SIZE 250 @@ -106,6 +108,8 @@ struct _ModestHeaderWindowPrivate { /* weak refs */ GtkTreeModel *model_weak_ref; + + GtkWidget *isearch_toolbar; }; #define MODEST_HEADER_WINDOW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \ MODEST_TYPE_HEADER_WINDOW, \ @@ -183,6 +187,15 @@ static gboolean on_key_press(GtkWidget *widget, gpointer user_data); static void modest_header_window_show_more (GtkAction *action, ModestWindow *win); +static void show_isearch_toolbar (GtkWidget *obj, gpointer data); +static void isearch_toolbar_close (GtkWidget *widget, + ModestHeaderWindow *obj); +static void isearch_toolbar_search (GtkWidget *widget, + ModestHeaderWindow *obj); +static void toggle_isearch_toolbar (GtkWidget *obj, + gpointer data); + + /* globals */ static GtkWindowClass *parent_class = NULL; @@ -879,6 +892,13 @@ modest_header_window_new (TnyFolder *folder, const gchar *account_name, const gc GTK_SELECTION_MULTIPLE, EDIT_MODE_CALLBACK (modest_ui_actions_on_edit_mode_move_to)); + priv->isearch_toolbar = hildon_find_toolbar_new (NULL); + hildon_window_add_toolbar (HILDON_WINDOW (self), GTK_TOOLBAR (priv->isearch_toolbar)); + g_signal_connect (G_OBJECT (priv->isearch_toolbar), "close", + G_CALLBACK (isearch_toolbar_close), self); + g_signal_connect (G_OBJECT (priv->isearch_toolbar), "search", + G_CALLBACK (isearch_toolbar_search), self); + modest_window_set_active_account (MODEST_WINDOW (self), account_name); modest_window_set_active_mailbox (MODEST_WINDOW (self), mailbox); @@ -983,6 +1003,8 @@ static void setup_menu (ModestHeaderWindow *self) modest_hildon2_window_add_to_menu (MODEST_HILDON2_WINDOW (self), _("mcen_me_outbox_cancelsend"), NULL, APP_MENU_CALLBACK (modest_ui_actions_cancel_send), MODEST_DIMMING_CALLBACK (modest_ui_dimming_rules_on_cancel_sending_all)); + modest_hildon2_window_add_to_menu (MODEST_HILDON2_WINDOW (self), _("Find..."), NULL, + APP_MENU_CALLBACK (toggle_isearch_toolbar), NULL); } static void @@ -1612,3 +1634,65 @@ modest_header_window_show_more (GtkAction *action, ModestWindow *win) update_view (self, NULL); } } + +/* Used for the Ctrl+F accelerator */ +static void +toggle_isearch_toolbar (GtkWidget *obj, + gpointer data) +{ + ModestHeaderWindow *window = MODEST_HEADER_WINDOW (data); + ModestHeaderWindowPrivate *priv = MODEST_HEADER_WINDOW_GET_PRIVATE (window); + + if (GTK_WIDGET_VISIBLE (priv->isearch_toolbar)) { + isearch_toolbar_close (obj, data); + } else { + show_isearch_toolbar (obj, data); + } +} + +/* Handler for menu option */ +static void +show_isearch_toolbar (GtkWidget *obj, + gpointer data) +{ + ModestHeaderWindow *window = MODEST_HEADER_WINDOW (data); + ModestHeaderWindowPrivate *priv = MODEST_HEADER_WINDOW_GET_PRIVATE (window); + + gtk_widget_show (priv->isearch_toolbar); + hildon_find_toolbar_highlight_entry (HILDON_FIND_TOOLBAR (priv->isearch_toolbar), TRUE); +} + +/* Handler for click on the "X" close button in isearch toolbar */ +static void +isearch_toolbar_close (GtkWidget *widget, + ModestHeaderWindow *obj) +{ + ModestHeaderWindowPrivate *priv; + + priv = MODEST_HEADER_WINDOW_GET_PRIVATE (obj); + + /* Hide toolbar */ + gtk_widget_hide (priv->isearch_toolbar); + + modest_header_view_set_filter_string (MODEST_HEADER_VIEW (priv->header_view), NULL); +} + +static void +isearch_toolbar_search (GtkWidget *widget, + ModestHeaderWindow *obj) +{ + ModestHeaderWindowPrivate *priv = MODEST_HEADER_WINDOW_GET_PRIVATE (obj); + gchar *current_search; + + g_object_get (G_OBJECT (widget), "prefix", ¤t_search, NULL); + + if (current_search && *current_search == '\0') { + g_free (current_search); + current_search = NULL; + } + + /* TODO: set filter */ + modest_header_view_set_filter_string (MODEST_HEADER_VIEW (priv->header_view), + current_search); + g_free (current_search); +} diff --git a/src/widgets/modest-header-view.c b/src/widgets/modest-header-view.c index e7eb3fe..62667a4 100644 --- a/src/widgets/modest-header-view.c +++ b/src/widgets/modest-header-view.c @@ -176,6 +176,9 @@ struct _ModestHeaderViewPrivate { GdkColor secondary_color; gint show_latest; + + gchar *filter_string; + gchar **filter_string_splitted; }; typedef struct _HeadersCountChangedHelper HeadersCountChangedHelper; @@ -630,6 +633,8 @@ modest_header_view_init (ModestHeaderView *obj) priv->hidding_ids = NULL; priv->n_selected = 0; priv->filter = MODEST_HEADER_VIEW_FILTER_NONE; + priv->filter_string = NULL; + priv->filter_string_splitted = NULL; priv->selection_changed_handler = 0; priv->acc_removed_handler = 0; @@ -717,6 +722,14 @@ modest_header_view_finalize (GObject *obj) priv->autoselect_reference = NULL; } + if (priv->filter_string) { + g_free (priv->filter_string); + } + + if (priv->filter_string_splitted) { + g_strfreev (priv->filter_string_splitted); + } + G_OBJECT_CLASS(parent_class)->finalize (obj); } @@ -2115,6 +2128,42 @@ current_folder_needs_filtering (ModestHeaderViewPrivate *priv) } static gboolean +header_match_string (TnyHeader *header, gchar **words) +{ + gchar **current_word; + gboolean found; + + found = FALSE; + + for (current_word = words; !found && *current_word != NULL; current_word++) { + gchar *subject; + gchar *cc; + gchar *bcc; + gchar *to; + gchar *from; + + subject = tny_header_dup_subject (header); + cc = tny_header_dup_cc (header); + bcc = tny_header_dup_bcc (header); + to = tny_header_dup_to (header); + from = tny_header_dup_from (header); + + if ((subject && g_strstr_len (subject, -1, *current_word)) + || (cc && g_strstr_len (cc, -1, *current_word)) + || (bcc && g_strstr_len (bcc, -1, *current_word)) + || (to && g_strstr_len (to, -1, *current_word)) + || (from && g_strstr_len (from, -1, *current_word))) + found = TRUE; + g_free (subject); + g_free (cc); + g_free (bcc); + g_free (to); + g_free (from); + } + return found; +} + +static gboolean filter_row (GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) @@ -2169,6 +2218,13 @@ filter_row (GtkTreeModel *model, } } + if (visible && priv->filter_string) { + if (!header_match_string (header, priv->filter_string_splitted)) { + visible = FALSE; + goto frees; + } + } + /* If no data on clipboard, return always TRUE */ if (modest_email_clipboard_cleared(priv->clipboard)) { visible = TRUE; @@ -2561,3 +2617,28 @@ modest_header_view_get_not_latest (ModestHeaderView *header_view) return not_latest; } + +void +modest_header_view_set_filter_string (ModestHeaderView *self, + const gchar *filter_string) +{ + ModestHeaderViewPrivate *priv; + + g_return_if_fail (MODEST_IS_HEADER_VIEW (self)); + priv = MODEST_HEADER_VIEW_GET_PRIVATE (self); + + if (priv->filter_string) + g_free (priv->filter_string); + + priv->filter_string = g_strdup (filter_string); + + if (priv->filter_string_splitted) { + g_strfreev (priv->filter_string_splitted); + priv->filter_string_splitted = NULL; + } + + if (priv->filter_string) { + priv->filter_string_splitted = g_strsplit (priv->filter_string, " ", 0); + } + modest_header_view_refilter (MODEST_HEADER_VIEW (self)); +} diff --git a/src/widgets/modest-header-view.h b/src/widgets/modest-header-view.h index 11a118f..ea0358e 100644 --- a/src/widgets/modest-header-view.h +++ b/src/widgets/modest-header-view.h @@ -421,6 +421,16 @@ void modest_header_view_set_filter (ModestHeaderView *self, void modest_header_view_unset_filter (ModestHeaderView *self, ModestHeaderViewFilter filter); +/** + * modest_header_view_set_filter_string: + * @self: a #ModestHeaderView + * @filter_string: a string + * + * Set a string for filtering visible messages. If %NULL, no filtering is done. + */ +void modest_header_view_set_filter_string (ModestHeaderView *self, + const gchar *filter_string); + /** -- 1.7.9.5