From d37358b195190f298f9e1a2593398110c63a8d4b Mon Sep 17 00:00:00 2001 From: Carlos Garcia Campos Date: Tue, 7 Apr 2015 14:58:03 +0200 Subject: [PATCH] Remove EggFindBar and use GtkSearchBar with EvSearchBox instead --- po/POTFILES.in | 1 - shell/Makefile.am | 2 - shell/eggfindbar.c | 827 --------------------------------------------- shell/eggfindbar.h | 89 ----- shell/ev-window.c | 381 +++++++-------------- 5 files changed, 120 insertions(+), 1180 deletions(-) delete mode 100644 shell/eggfindbar.c delete mode 100644 shell/eggfindbar.h diff --git a/po/POTFILES.in b/po/POTFILES.in index 68d3a6ca..2ad581e5 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -40,7 +40,6 @@ previewer/ev-previewer.c previewer/ev-previewer-window.c properties/ev-properties-main.c properties/ev-properties-view.c -shell/eggfindbar.c shell/ev-annotation-properties-dialog.c shell/ev-application.c shell/ev-history.c diff --git a/shell/Makefile.am b/shell/Makefile.am index debb80b7..0c7e5b81 100644 --- a/shell/Makefile.am +++ b/shell/Makefile.am @@ -7,8 +7,6 @@ libexec_PROGRAMS = evinced endif evince_SOURCES= \ - eggfindbar.c \ - eggfindbar.h \ ev-annotation-properties-dialog.h \ ev-annotation-properties-dialog.c \ ev-bookmarks.h \ diff --git a/shell/eggfindbar.c b/shell/eggfindbar.c deleted file mode 100644 index daaec5cf..00000000 --- a/shell/eggfindbar.c +++ /dev/null @@ -1,827 +0,0 @@ -/* Copyright (C) 2004 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with the Gnome Library; see the file COPYING.LIB. If not, - * write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include "config.h" - -#include - -#include -#include -#include - -#include "eggfindbar.h" - -struct _EggFindBarPrivate -{ - gchar *search_string; - - GtkWidget *next_button; - GtkWidget *previous_button; - GtkToolItem *status_item; - - GtkWidget *find_entry; - GtkWidget *status_label; - - guint case_sensitive : 1; - guint case_sensitive_enabled : 1; - guint whole_words_only : 1; - guint whole_words_only_enabled : 1; -}; - -#define EGG_FIND_BAR_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), EGG_TYPE_FIND_BAR, EggFindBarPrivate)) - -enum { - PROP_0, - PROP_SEARCH_STRING, - PROP_CASE_SENSITIVE, - PROP_WHOLE_WORDS_ONLY -}; - -static void egg_find_bar_finalize (GObject *object); -static void egg_find_bar_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec); -static void egg_find_bar_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec); -static void egg_find_bar_grab_focus (GtkWidget *widget); - -G_DEFINE_TYPE (EggFindBar, egg_find_bar, GTK_TYPE_TOOLBAR); - -enum - { - NEXT, - PREVIOUS, - CLOSE, - SCROLL, - LAST_SIGNAL - }; - -static guint find_bar_signals[LAST_SIGNAL] = { 0 }; - -static void -egg_find_bar_class_init (EggFindBarClass *klass) -{ - GObjectClass *object_class; - GtkWidgetClass *widget_class; - GtkBindingSet *binding_set; - - egg_find_bar_parent_class = g_type_class_peek_parent (klass); - - object_class = (GObjectClass *)klass; - widget_class = (GtkWidgetClass *)klass; - - object_class->set_property = egg_find_bar_set_property; - object_class->get_property = egg_find_bar_get_property; - - object_class->finalize = egg_find_bar_finalize; - - widget_class->grab_focus = egg_find_bar_grab_focus; - - find_bar_signals[NEXT] = - g_signal_new ("next", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, - G_STRUCT_OFFSET (EggFindBarClass, next), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); - find_bar_signals[PREVIOUS] = - g_signal_new ("previous", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, - G_STRUCT_OFFSET (EggFindBarClass, previous), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); - find_bar_signals[CLOSE] = - g_signal_new ("close", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, - G_STRUCT_OFFSET (EggFindBarClass, close), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); - find_bar_signals[SCROLL] = - g_signal_new ("scroll", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, - G_STRUCT_OFFSET (EggFindBarClass, scroll), - NULL, NULL, - g_cclosure_marshal_VOID__ENUM, - G_TYPE_NONE, 1, - GTK_TYPE_SCROLL_TYPE); - - /** - * EggFindBar:search_string: - * - * The current string to search for. NULL or empty string - * both mean no current string. - * - */ - g_object_class_install_property (object_class, - PROP_SEARCH_STRING, - g_param_spec_string ("search-string", - "Search string", - "The name of the string to be found", - NULL, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * EggFindBar:case_sensitive: - * - * TRUE for a case sensitive search. - * - */ - g_object_class_install_property (object_class, - PROP_CASE_SENSITIVE, - g_param_spec_boolean ("case-sensitive", - "Case sensitive", - "TRUE for a case sensitive search", - FALSE, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * EggFindBar:whole-words-only: - * - * Whether search whole words only - */ - g_object_class_install_property (object_class, - PROP_WHOLE_WORDS_ONLY, - g_param_spec_boolean ("whole-words-only", - "Whole words only", - "Whether search whole words only", - FALSE, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - g_type_class_add_private (object_class, sizeof (EggFindBarPrivate)); - - binding_set = gtk_binding_set_by_class (klass); - - gtk_binding_entry_add_signal (binding_set, GDK_KEY_Escape, 0, - "close", 0); - - gtk_binding_entry_add_signal (binding_set, GDK_KEY_Up, 0, - "scroll", 1, - GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_STEP_BACKWARD); - gtk_binding_entry_add_signal (binding_set, GDK_KEY_Down, 0, - "scroll", 1, - GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_STEP_FORWARD); - gtk_binding_entry_add_signal (binding_set, GDK_KEY_Page_Up, 0, - "scroll", 1, - GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_PAGE_BACKWARD); - gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Page_Up, 0, - "scroll", 1, - GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_PAGE_BACKWARD); - gtk_binding_entry_add_signal (binding_set, GDK_KEY_Page_Down, 0, - "scroll", 1, - GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_PAGE_FORWARD); - gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Page_Down, 0, - "scroll", 1, - GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_PAGE_FORWARD); - - gtk_binding_entry_add_signal (binding_set, GDK_KEY_Return, GDK_SHIFT_MASK, - "previous", 0); - gtk_binding_entry_add_signal (binding_set, GDK_KEY_Up, GDK_CONTROL_MASK, - "previous", 0); - gtk_binding_entry_add_signal (binding_set, GDK_KEY_Down, GDK_CONTROL_MASK, - "next", 0); -} - -static void -egg_find_bar_emit_next (EggFindBar *find_bar) -{ - g_signal_emit (find_bar, find_bar_signals[NEXT], 0); -} - -static void -egg_find_bar_emit_previous (EggFindBar *find_bar) -{ - g_signal_emit (find_bar, find_bar_signals[PREVIOUS], 0); -} - -static void -next_clicked_callback (GtkButton *button, - void *data) -{ - EggFindBar *find_bar = EGG_FIND_BAR (data); - - egg_find_bar_emit_next (find_bar); -} - -static void -previous_clicked_callback (GtkButton *button, - void *data) -{ - EggFindBar *find_bar = EGG_FIND_BAR (data); - - egg_find_bar_emit_previous (find_bar); -} - -static void -close_button_clicked_callback (GtkButton *button, - EggFindBar *find_bar) -{ - g_signal_emit (find_bar, find_bar_signals[CLOSE], 0); -} - -static void -case_sensitive_toggled_callback (GtkCheckMenuItem *menu_item, - void *data) -{ - EggFindBar *find_bar = EGG_FIND_BAR (data); - - egg_find_bar_set_case_sensitive (find_bar, gtk_check_menu_item_get_active (menu_item)); -} - -static void -whole_words_only_toggled_callback (GtkCheckMenuItem *menu_item, - void *data) -{ - EggFindBar *find_bar = EGG_FIND_BAR (data); - - egg_find_bar_set_whole_words_only (find_bar, gtk_check_menu_item_get_active (menu_item)); -} - -static void -entry_activate_callback (GtkEntry *entry, - void *data) -{ - EggFindBar *find_bar = EGG_FIND_BAR (data); - - if (find_bar->priv->search_string != NULL) - egg_find_bar_emit_next (find_bar); -} - -static void -egg_find_bar_entry_populate_popup (EggFindBar *find_bar, - GtkWidget *menu) -{ - GtkWidget *menu_item; - - if (find_bar->priv->whole_words_only_enabled) - { - menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Whole Words Only")); - g_signal_connect (menu_item, "toggled", - G_CALLBACK (whole_words_only_toggled_callback), - find_bar); - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menu_item), - find_bar->priv->whole_words_only); - gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), menu_item); - gtk_widget_show (menu_item); - } - - if (find_bar->priv->case_sensitive_enabled) - { - menu_item = gtk_check_menu_item_new_with_mnemonic (_("C_ase Sensitive")); - g_signal_connect (menu_item, "toggled", - G_CALLBACK (case_sensitive_toggled_callback), - find_bar); - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menu_item), - find_bar->priv->case_sensitive); - gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), menu_item); - gtk_widget_show (menu_item); - } -} - -static void -entry_icon_release_callback (GtkEntry *entry, - GtkEntryIconPosition icon_pos, - GdkEventButton *event, - void *data) -{ - EggFindBar *find_bar = EGG_FIND_BAR (data); - GtkWidget *menu; - - if (!find_bar->priv->case_sensitive_enabled && - !find_bar->priv->whole_words_only_enabled) - return; - - menu = gtk_menu_new (); - egg_find_bar_entry_populate_popup (find_bar, menu); - gtk_widget_show (menu); - - gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, - event->button, event->time); -} - -static void -entry_populate_popup_callback (GtkEntry *entry, - GtkMenu *menu, - void *data) -{ - EggFindBar *find_bar = EGG_FIND_BAR (data); - GtkWidget *separator; - - if (!find_bar->priv->case_sensitive_enabled && - !find_bar->priv->whole_words_only_enabled) - return; - - separator = gtk_separator_menu_item_new (); - gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), separator); - gtk_widget_show (separator); - egg_find_bar_entry_populate_popup (find_bar, GTK_WIDGET (menu)); -} - -static void -entry_changed_callback (GtkEntry *entry, - void *data) -{ - EggFindBar *find_bar = EGG_FIND_BAR (data); - char *text; - - /* paranoid strdup because set_search_string() sets - * the entry text - */ - text = g_strdup (gtk_entry_get_text (entry)); - - egg_find_bar_set_search_string (find_bar, text); - - g_free (text); -} - -static void -egg_find_bar_init (EggFindBar *find_bar) -{ - EggFindBarPrivate *priv; - GtkWidget *box; - GtkWidget *close_button; - GtkToolItem *item; - GtkStyleContext *style_context; - - /* Data */ - priv = EGG_FIND_BAR_GET_PRIVATE (find_bar); - - find_bar->priv = priv; - priv->search_string = NULL; - - gtk_toolbar_set_style (GTK_TOOLBAR (find_bar), GTK_TOOLBAR_BOTH_HORIZ); - - box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); - style_context = gtk_widget_get_style_context (box); - gtk_style_context_add_class (style_context, GTK_STYLE_CLASS_LINKED); - gtk_style_context_add_class (style_context, GTK_STYLE_CLASS_RAISED); - - /* Entry */ - priv->find_entry = gtk_entry_new (); - gtk_entry_set_width_chars (GTK_ENTRY (priv->find_entry), 32); - gtk_entry_set_max_length (GTK_ENTRY (priv->find_entry), 512); - - /* Find options */ - gtk_entry_set_icon_from_icon_name (GTK_ENTRY (priv->find_entry), - GTK_ENTRY_ICON_PRIMARY, - "edit-find-symbolic"); - gtk_entry_set_icon_activatable (GTK_ENTRY (priv->find_entry), - GTK_ENTRY_ICON_PRIMARY, - TRUE); - gtk_entry_set_icon_tooltip_text (GTK_ENTRY (priv->find_entry), - GTK_ENTRY_ICON_PRIMARY, - _("Find options")); - - gtk_box_pack_start (GTK_BOX (box), priv->find_entry, TRUE, TRUE, 0); - gtk_widget_show (priv->find_entry); - - /* Prev */ - priv->previous_button = gtk_button_new (); - gtk_button_set_image (GTK_BUTTON (priv->previous_button), - gtk_image_new_from_icon_name ("go-up-symbolic", GTK_ICON_SIZE_MENU)); - gtk_widget_set_tooltip_text (priv->previous_button, _("Find previous occurrence of the search string")); - gtk_widget_set_can_focus (priv->previous_button, FALSE); - gtk_widget_set_sensitive (priv->previous_button, FALSE); - gtk_container_add (GTK_CONTAINER (box), priv->previous_button); - gtk_widget_show (priv->previous_button); - - /* Next */ - priv->next_button = gtk_button_new (); - gtk_button_set_image (GTK_BUTTON (priv->next_button), - gtk_image_new_from_icon_name ("go-down-symbolic", GTK_ICON_SIZE_MENU)); - gtk_widget_set_tooltip_text (priv->next_button, _("Find next occurrence of the search string")); - gtk_widget_set_can_focus (priv->next_button, FALSE); - gtk_widget_set_sensitive (priv->next_button, FALSE); - gtk_container_add (GTK_CONTAINER (box), priv->next_button); - gtk_widget_show (priv->next_button); - - item = gtk_tool_item_new (); - gtk_widget_set_margin_right (GTK_WIDGET (item), 12); - gtk_container_add (GTK_CONTAINER (item), box); - gtk_widget_show (box); - - gtk_container_add (GTK_CONTAINER (find_bar), GTK_WIDGET (item)); - gtk_widget_show (GTK_WIDGET (item)); - - /* Status */ - priv->status_item = gtk_tool_item_new(); - gtk_tool_item_set_expand (priv->status_item, TRUE); - priv->status_label = gtk_label_new (NULL); - gtk_label_set_ellipsize (GTK_LABEL (priv->status_label), - PANGO_ELLIPSIZE_END); - gtk_misc_set_alignment (GTK_MISC (priv->status_label), 0.0, 0.5); - gtk_container_add (GTK_CONTAINER (priv->status_item), priv->status_label); - gtk_widget_show (priv->status_label); - gtk_container_add (GTK_CONTAINER (find_bar), GTK_WIDGET (priv->status_item)); - - /* Separator */ - item = gtk_tool_item_new (); - gtk_tool_item_set_expand (GTK_TOOL_ITEM (item), TRUE); - gtk_container_add (GTK_CONTAINER (find_bar), GTK_WIDGET (item)); - gtk_widget_show (GTK_WIDGET (item)); - - /* Close button */ - close_button = gtk_button_new (); - style_context = gtk_widget_get_style_context (close_button); - gtk_style_context_add_class (style_context, GTK_STYLE_CLASS_RAISED); - gtk_button_set_relief (GTK_BUTTON (close_button), GTK_RELIEF_NONE); - gtk_button_set_image (GTK_BUTTON (close_button), - gtk_image_new_from_icon_name ("window-close-symbolic", GTK_ICON_SIZE_MENU)); - gtk_widget_set_can_focus (close_button, FALSE); - item = gtk_tool_item_new (); - gtk_container_add (GTK_CONTAINER (item), close_button); - gtk_widget_show (close_button); - gtk_container_add (GTK_CONTAINER (find_bar), GTK_WIDGET (item)); - gtk_widget_show (GTK_WIDGET (item)); - - g_signal_connect (priv->find_entry, "changed", - G_CALLBACK (entry_changed_callback), - find_bar); - g_signal_connect (priv->find_entry, "activate", - G_CALLBACK (entry_activate_callback), - find_bar); - g_signal_connect (priv->find_entry, "icon-release", - G_CALLBACK (entry_icon_release_callback), - find_bar); - g_signal_connect (priv->find_entry, "populate-popup", - G_CALLBACK (entry_populate_popup_callback), - find_bar); - g_signal_connect (priv->next_button, "clicked", - G_CALLBACK (next_clicked_callback), - find_bar); - g_signal_connect (priv->previous_button, "clicked", - G_CALLBACK (previous_clicked_callback), - find_bar); - g_signal_connect (close_button, "clicked", - G_CALLBACK (close_button_clicked_callback), - find_bar); -} - -static void -egg_find_bar_finalize (GObject *object) -{ - EggFindBar *find_bar = EGG_FIND_BAR (object); - EggFindBarPrivate *priv = (EggFindBarPrivate *)find_bar->priv; - - g_free (priv->search_string); - - G_OBJECT_CLASS (egg_find_bar_parent_class)->finalize (object); -} - -static void -egg_find_bar_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - EggFindBar *find_bar = EGG_FIND_BAR (object); - - switch (prop_id) - { - case PROP_SEARCH_STRING: - egg_find_bar_set_search_string (find_bar, g_value_get_string (value)); - break; - case PROP_CASE_SENSITIVE: - egg_find_bar_set_case_sensitive (find_bar, g_value_get_boolean (value)); - break; - case PROP_WHOLE_WORDS_ONLY: - egg_find_bar_set_whole_words_only (find_bar, g_value_get_boolean (value)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -egg_find_bar_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - EggFindBar *find_bar = EGG_FIND_BAR (object); - EggFindBarPrivate *priv = (EggFindBarPrivate *)find_bar->priv; - - switch (prop_id) - { - case PROP_SEARCH_STRING: - g_value_set_string (value, priv->search_string); - break; - case PROP_CASE_SENSITIVE: - g_value_set_boolean (value, priv->case_sensitive); - break; - case PROP_WHOLE_WORDS_ONLY: - g_value_set_boolean (value, priv->whole_words_only); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -egg_find_bar_grab_focus (GtkWidget *widget) -{ - EggFindBar *find_bar = EGG_FIND_BAR (widget); - EggFindBarPrivate *priv = find_bar->priv; - - gtk_widget_grab_focus (priv->find_entry); -} - -/** - * egg_find_bar_new: - * - * Creates a new #EggFindBar. - * - * Returns: a newly created #EggFindBar - * - * Since: 2.6 - */ -GtkWidget * -egg_find_bar_new (void) -{ - EggFindBar *find_bar; - - find_bar = g_object_new (EGG_TYPE_FIND_BAR, NULL); - - return GTK_WIDGET (find_bar); -} - -/** - * egg_find_bar_set_search_string: - * - * Sets the string that should be found/highlighted in the document. - * Empty string is converted to NULL. - * - * Since: 2.6 - */ -void -egg_find_bar_set_search_string (EggFindBar *find_bar, - const char *search_string) -{ - EggFindBarPrivate *priv; - - g_return_if_fail (EGG_IS_FIND_BAR (find_bar)); - - priv = (EggFindBarPrivate *)find_bar->priv; - - g_object_freeze_notify (G_OBJECT (find_bar)); - - if (priv->search_string != search_string) - { - char *old; - - old = priv->search_string; - - if (search_string && *search_string == '\0') - search_string = NULL; - - /* Only update if the string has changed; setting the entry - * will emit changed on the entry which will re-enter - * this function, but we'll handle that fine with this - * short-circuit. - */ - if ((old && search_string == NULL) || - (old == NULL && search_string) || - (old && search_string && - strcmp (old, search_string) != 0)) - { - gboolean not_empty; - - priv->search_string = g_strdup (search_string); - g_free (old); - - gtk_entry_set_text (GTK_ENTRY (priv->find_entry), - priv->search_string ? - priv->search_string : - ""); - - not_empty = (search_string == NULL) ? FALSE : TRUE; - - gtk_widget_set_sensitive (GTK_WIDGET (find_bar->priv->next_button), not_empty); - gtk_widget_set_sensitive (GTK_WIDGET (find_bar->priv->previous_button), not_empty); - - g_object_notify (G_OBJECT (find_bar), - "search_string"); - } - } - - g_object_thaw_notify (G_OBJECT (find_bar)); -} - - -/** - * egg_find_bar_get_search_string: - * - * Gets the string that should be found/highlighted in the document. - * - * Returns: the string - * - * Since: 2.6 - */ -const char* -egg_find_bar_get_search_string (EggFindBar *find_bar) -{ - EggFindBarPrivate *priv; - - g_return_val_if_fail (EGG_IS_FIND_BAR (find_bar), NULL); - - priv = find_bar->priv; - - return priv->search_string ? priv->search_string : ""; -} - -/** - * egg_find_bar_set_case_sensitive: - * - * Sets whether the search is case sensitive - * - * Since: 2.6 - */ -void -egg_find_bar_set_case_sensitive (EggFindBar *find_bar, - gboolean case_sensitive) -{ - EggFindBarPrivate *priv; - - g_return_if_fail (EGG_IS_FIND_BAR (find_bar)); - - priv = (EggFindBarPrivate *)find_bar->priv; - - g_object_freeze_notify (G_OBJECT (find_bar)); - - case_sensitive = case_sensitive != FALSE; - - if (priv->case_sensitive != case_sensitive) - { - priv->case_sensitive = case_sensitive; - g_object_notify (G_OBJECT (find_bar), "case_sensitive"); - } - - g_object_thaw_notify (G_OBJECT (find_bar)); -} - -/** - * egg_find_bar_get_case_sensitive: - * - * Gets whether the search is case sensitive - * - * Returns: TRUE if it's case sensitive - * - * Since: 2.6 - */ -gboolean -egg_find_bar_get_case_sensitive (EggFindBar *find_bar) -{ - EggFindBarPrivate *priv; - - g_return_val_if_fail (EGG_IS_FIND_BAR (find_bar), FALSE); - - priv = (EggFindBarPrivate *)find_bar->priv; - - if (!priv->case_sensitive_enabled) - return FALSE; - - return priv->case_sensitive; -} - -/** - * egg_find_bar_enable_case_sensitive: - * - * Enable or disable the case sensitive option - */ -void -egg_find_bar_enable_case_sensitive (EggFindBar *find_bar, - gboolean enable) -{ - EggFindBarPrivate *priv; - - g_return_if_fail (EGG_IS_FIND_BAR (find_bar)); - - priv = (EggFindBarPrivate *)find_bar->priv; - - priv->case_sensitive_enabled = !!enable; -} - -/** - * egg_find_bar_set_whole_words_only: - * - * Sets whether search whole words only - */ -void -egg_find_bar_set_whole_words_only (EggFindBar *find_bar, - gboolean whole_words_only) -{ - EggFindBarPrivate *priv; - - g_return_if_fail (EGG_IS_FIND_BAR (find_bar)); - - priv = (EggFindBarPrivate *)find_bar->priv; - - g_object_freeze_notify (G_OBJECT (find_bar)); - - whole_words_only = whole_words_only != FALSE; - - if (priv->whole_words_only != whole_words_only) - { - priv->whole_words_only = whole_words_only; - g_object_notify (G_OBJECT (find_bar), "whole-words-only"); - } - - g_object_thaw_notify (G_OBJECT (find_bar)); -} - -/** - * egg_find_bar_get_whole_words_only: - * - * Gets whether search whole words only - * - * Returns: %TRUE if only whole words are searched - */ -gboolean -egg_find_bar_get_whole_words_only (EggFindBar *find_bar) -{ - EggFindBarPrivate *priv; - - g_return_val_if_fail (EGG_IS_FIND_BAR (find_bar), FALSE); - - priv = (EggFindBarPrivate *)find_bar->priv; - - if (!priv->whole_words_only_enabled) - return FALSE; - - return priv->whole_words_only; -} - -/** - * egg_find_bar_enable_whole_words_only: - * - * Enable or disable the whole words only option - */ -void -egg_find_bar_enable_whole_words_only (EggFindBar *find_bar, - gboolean enable) -{ - EggFindBarPrivate *priv; - - g_return_if_fail (EGG_IS_FIND_BAR (find_bar)); - - priv = (EggFindBarPrivate *)find_bar->priv; - - priv->whole_words_only_enabled = !!enable; -} - -/** - * egg_find_bar_set_status_text: - * - * Sets some text to display if there's space; typical text would - * be something like "5 results on this page" or "No results" - * - * @text: the text to display - * - * Since: 2.6 - */ -void -egg_find_bar_set_status_text (EggFindBar *find_bar, - const char *text) -{ - EggFindBarPrivate *priv; - const gchar *current_text; - - g_return_if_fail (EGG_IS_FIND_BAR (find_bar)); - - priv = (EggFindBarPrivate *)find_bar->priv; - - current_text = gtk_label_get_text (GTK_LABEL (priv->status_label)); - - if (g_strcmp0 (current_text, text) != 0) - gtk_label_set_text (GTK_LABEL (priv->status_label), text); - - g_object_set (priv->status_item, "visible", text != NULL && *text !='\0', NULL); -} diff --git a/shell/eggfindbar.h b/shell/eggfindbar.h deleted file mode 100644 index c7280db0..00000000 --- a/shell/eggfindbar.h +++ /dev/null @@ -1,89 +0,0 @@ -/* Copyright (C) 2004 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with the Gnome Library; see the file COPYING.LIB. If not, - * write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - * - */ - -#ifndef __EGG_FIND_BAR_H__ -#define __EGG_FIND_BAR_H__ - -#include - -G_BEGIN_DECLS - -#define EGG_TYPE_FIND_BAR (egg_find_bar_get_type ()) -#define EGG_FIND_BAR(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), EGG_TYPE_FIND_BAR, EggFindBar)) -#define EGG_FIND_BAR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EGG_TYPE_FIND_BAR, EggFindBarClass)) -#define EGG_IS_FIND_BAR(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), EGG_TYPE_FIND_BAR)) -#define EGG_IS_FIND_BAR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EGG_TYPE_FIND_BAR)) -#define EGG_FIND_BAR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EGG_TYPE_FIND_BAR, EggFindBarClass)) - -typedef struct _EggFindBar EggFindBar; -typedef struct _EggFindBarClass EggFindBarClass; -typedef struct _EggFindBarPrivate EggFindBarPrivate; - -struct _EggFindBar -{ - GtkToolbar parent; - - /*< private >*/ - EggFindBarPrivate *priv; -}; - -struct _EggFindBarClass -{ - GtkToolbarClass parent_class; - - void (* next) (EggFindBar *find_bar); - void (* previous) (EggFindBar *find_bar); - void (* close) (EggFindBar *find_bar); - void (* scroll) (EggFindBar *find_bar, GtkScrollType* scroll); - - /* Padding for future expansion */ - void (*_gtk_reserved1) (void); - void (*_gtk_reserved2) (void); - void (*_gtk_reserved3) (void); - void (*_gtk_reserved4) (void); -}; - -GType egg_find_bar_get_type (void) G_GNUC_CONST; -GtkWidget *egg_find_bar_new (void); - -void egg_find_bar_set_search_string (EggFindBar *find_bar, - const char *search_string); -const char* egg_find_bar_get_search_string (EggFindBar *find_bar); -void egg_find_bar_set_case_sensitive (EggFindBar *find_bar, - gboolean case_sensitive); -gboolean egg_find_bar_get_case_sensitive (EggFindBar *find_bar); -void egg_find_bar_enable_case_sensitive (EggFindBar *find_bar, - gboolean enable); -void egg_find_bar_set_whole_words_only (EggFindBar *find_bar, - gboolean whole_words_only); -gboolean egg_find_bar_get_whole_words_only (EggFindBar *find_bar); -void egg_find_bar_enable_whole_words_only (EggFindBar *find_bar, - gboolean enable); -void egg_find_bar_get_all_matches_color (EggFindBar *find_bar, - GdkColor *color); -void egg_find_bar_get_current_match_color (EggFindBar *find_bar, - GdkColor *color); -void egg_find_bar_set_status_text (EggFindBar *find_bar, - const char *text); - -G_END_DECLS - -#endif /* __EGG_FIND_BAR_H__ */ - - diff --git a/shell/ev-window.c b/shell/ev-window.c index 7092d855..f9802ae2 100644 --- a/shell/ev-window.c +++ b/shell/ev-window.c @@ -41,7 +41,6 @@ #include #include -#include "eggfindbar.h" #include "ev-find-sidebar.h" #include "ev-application.h" @@ -89,6 +88,7 @@ #include "ev-toolbar.h" #include "ev-bookmarks.h" #include "ev-recent-view.h" +#include "ev-search-box.h" #ifdef ENABLE_DBUS #include "ev-gdbus-generated.h" @@ -129,7 +129,8 @@ struct _EvWindowPrivate { GtkWidget *hpaned; GtkWidget *view_box; GtkWidget *sidebar; - GtkWidget *find_bar; + GtkWidget *search_box; + GtkWidget *search_bar; GtkWidget *scrolled_window; GtkWidget *view; GtkWidget *loading_message; @@ -211,7 +212,6 @@ struct _EvWindowPrivate { EvJob *reload_job; EvJob *thumbnail_job; EvJob *save_job; - EvJob *find_job; /* Printing */ GQueue *print_queue; @@ -276,8 +276,6 @@ struct _EvWindowPrivate { #define FULLSCREEN_POPUP_TIMEOUT 2 #define FULLSCREEN_TRANSITION_DURATION 1000 /* in milliseconds */ -#define FIND_PAGE_RATE_REFRESH 100 - static const gchar *document_print_settings[] = { GTK_PRINT_SETTINGS_COLLATE, GTK_PRINT_SETTINGS_REVERSE, @@ -352,10 +350,6 @@ static void view_handle_link_cb (EvView *view, static void activate_link_cb (GObject *object, EvLink *link, EvWindow *window); -static void ev_window_update_find_status_message (EvWindow *ev_window); -static void find_bar_search_changed_cb (EggFindBar *find_bar, - GParamSpec *param, - EvWindow *ev_window); static void view_external_link_cb (EvWindow *window, EvLinkAction *action); static void ev_window_load_file_remote (EvWindow *ev_window, @@ -372,7 +366,6 @@ static void ev_window_setup_bookmarks (EvWindow *windo static void ev_window_show_find_bar (EvWindow *ev_window, gboolean restart); static void ev_window_close_find_bar (EvWindow *ev_window); -static void ev_window_clear_find_job (EvWindow *ev_window); static void ev_window_destroy_recent_view (EvWindow *ev_window); static void recent_view_item_activated_cb (EvRecentView *recent_view, const char *uri, @@ -421,7 +414,7 @@ ev_window_update_actions_sensitivity (EvWindow *ev_window) gboolean override_restrictions = TRUE; gboolean can_get_text = FALSE; gboolean can_find = FALSE; - gboolean can_find_in_page = FALSE; + gboolean can_find_in_page; gboolean presentation_mode; gboolean recent_view_mode; gboolean dual_mode = FALSE; @@ -553,8 +546,7 @@ ev_window_update_actions_sensitivity (EvWindow *ev_window) ev_window_set_action_enabled (ev_window, "annot-properties", !recent_view_mode); ev_window_set_action_enabled (ev_window, "remove-annot", !recent_view_mode); - can_find_in_page = (ev_window->priv->find_job && - ev_job_find_has_results (EV_JOB_FIND (ev_window->priv->find_job))); + can_find_in_page = ev_search_box_has_results (EV_SEARCH_BOX (ev_window->priv->search_box)); ev_window_set_action_enabled (ev_window, "copy", has_pages && @@ -626,18 +618,16 @@ static void update_chrome_visibility (EvWindow *window) { EvWindowPrivate *priv = window->priv; - gboolean toolbar, findbar, sidebar; + gboolean toolbar, sidebar; gboolean presentation; presentation = EV_WINDOW_IS_PRESENTATION (window); toolbar = ((priv->chrome & EV_CHROME_TOOLBAR) != 0 || (priv->chrome & EV_CHROME_RAISE_TOOLBAR) != 0) && !presentation; - findbar = (priv->chrome & EV_CHROME_FINDBAR) != 0; sidebar = (priv->chrome & EV_CHROME_SIDEBAR) != 0 && priv->document && !presentation; set_widget_visibility (priv->toolbar, toolbar); - set_widget_visibility (priv->find_bar, findbar); set_widget_visibility (priv->sidebar, sidebar); } @@ -969,8 +959,6 @@ ev_window_page_changed_cb (EvWindow *ev_window, { ev_window_update_actions_sensitivity (ev_window); - ev_window_update_find_status_message (ev_window); - if (ev_window->priv->metadata && !ev_window_is_empty (ev_window)) ev_metadata_set_int (ev_window->priv->metadata, "page", new_page); } @@ -1543,27 +1531,20 @@ ev_window_setup_document (EvWindow *ev_window) info = ev_document_get_info (document); update_document_mode (ev_window, info->mode); - if (EV_IS_DOCUMENT_FIND (document)) { - EvFindOptions options; - - options = ev_document_find_get_supported_options (EV_DOCUMENT_FIND (document)); - egg_find_bar_enable_case_sensitive (EGG_FIND_BAR (ev_window->priv->find_bar), - options & EV_FIND_CASE_SENSITIVE); - egg_find_bar_enable_whole_words_only (EGG_FIND_BAR (ev_window->priv->find_bar), - options & EV_FIND_WHOLE_WORDS_ONLY); - - if (ev_window->priv->search_string && - !EV_WINDOW_IS_PRESENTATION (ev_window)) { - ev_window_show_find_bar (ev_window, FALSE); - egg_find_bar_set_search_string (EGG_FIND_BAR (ev_window->priv->find_bar), ev_window->priv->search_string); - } + if (ev_window->priv->search_string && EV_IS_DOCUMENT_FIND (document) && + !EV_WINDOW_IS_PRESENTATION (ev_window)) { + GtkSearchEntry *entry; - g_clear_pointer (&ev_window->priv->search_string, g_free); + ev_window_show_find_bar (ev_window, FALSE); + entry = ev_search_box_get_entry (EV_SEARCH_BOX (ev_window->priv->search_box)); + gtk_entry_set_text (GTK_ENTRY (entry), ev_window->priv->search_string); } + g_clear_pointer (&ev_window->priv->search_string, g_free); + if (EV_WINDOW_IS_PRESENTATION (ev_window)) gtk_widget_grab_focus (ev_window->priv->presentation_view); - else if (!gtk_widget_get_visible (ev_window->priv->find_bar)) + else if (!gtk_search_bar_get_search_mode (GTK_SEARCH_BAR (ev_window->priv->search_bar))) gtk_widget_grab_focus (ev_window->priv->view); return FALSE; @@ -1851,11 +1832,9 @@ ev_window_reload_job_cb (EvJob *job, } /* Restart the search after reloading */ - if (gtk_widget_is_visible (ev_window->priv->find_bar)) { - find_bar_search_changed_cb (EGG_FIND_BAR (ev_window->priv->find_bar), - NULL, ev_window); - } - + if (gtk_search_bar_get_search_mode (GTK_SEARCH_BAR (ev_window->priv->search_bar))) + ev_search_box_restart (EV_SEARCH_BOX (ev_window->priv->search_box)); + ev_window_clear_reload_job (ev_window); ev_window->priv->in_reload = FALSE; } @@ -2304,9 +2283,11 @@ ev_window_open_document (EvWindow *ev_window, if (search_string && EV_IS_DOCUMENT_FIND (document) && mode != EV_WINDOW_MODE_PRESENTATION) { + GtkSearchEntry *entry; + ev_window_show_find_bar (ev_window, FALSE); - egg_find_bar_set_search_string (EGG_FIND_BAR (ev_window->priv->find_bar), - search_string); + entry = ev_search_box_get_entry (EV_SEARCH_BOX (ev_window->priv->search_box)); + gtk_entry_set_text (GTK_ENTRY (entry), search_string); } /* Create a monitor for the document */ @@ -2323,7 +2304,6 @@ ev_window_open_recent_view (EvWindow *ev_window) return; gtk_widget_hide (ev_window->priv->hpaned); - gtk_widget_hide (ev_window->priv->find_bar); ev_window->priv->recent_view = EV_RECENT_VIEW (ev_recent_view_new ()); g_signal_connect_object (ev_window->priv->recent_view, @@ -3951,16 +3931,16 @@ ev_window_cmd_edit_find_next (GSimpleAction *action, gpointer user_data) { EvWindow *ev_window = user_data; - gboolean find_bar_hidden; + gboolean search_mode_enabled; if (EV_WINDOW_IS_PRESENTATION (ev_window)) return; - find_bar_hidden = !gtk_widget_get_visible (ev_window->priv->find_bar); + search_mode_enabled = gtk_search_bar_get_search_mode (GTK_SEARCH_BAR (ev_window->priv->search_bar)); ev_window_show_find_bar (ev_window, FALSE); /* Use idle to make sure view allocation happens before find */ - if (find_bar_hidden) + if (!search_mode_enabled) g_idle_add ((GSourceFunc)find_next_idle_cb, ev_window); else ev_window_find_next (ev_window); @@ -3979,16 +3959,16 @@ ev_window_cmd_edit_find_previous (GSimpleAction *action, gpointer user_data) { EvWindow *ev_window = user_data; - gboolean find_bar_hidden; + gboolean search_mode_enabled; if (EV_WINDOW_IS_PRESENTATION (ev_window)) return; - find_bar_hidden = !gtk_widget_get_visible (ev_window->priv->find_bar); + search_mode_enabled = gtk_search_bar_get_search_mode (GTK_SEARCH_BAR (ev_window->priv->search_bar)); ev_window_show_find_bar (ev_window, FALSE); /* Use idle to make sure view allocation happens before find */ - if (find_bar_hidden) + if (!search_mode_enabled) g_idle_add ((GSourceFunc)find_previous_idle_cb, ev_window); else ev_window_find_previous (ev_window); @@ -4525,7 +4505,6 @@ ev_window_cmd_edit_save_settings (GSimpleAction *action, EvDocumentModel *model = priv->model; GSettings *settings = priv->default_settings; EvSizingMode sizing_mode; - EvView *view = EV_VIEW (ev_window->priv->view); g_settings_set_boolean (settings, "continuous", ev_document_model_get_continuous (model)); @@ -4755,7 +4734,7 @@ ev_window_cmd_escape (GSimpleAction *action, EvWindow *window = user_data; ev_view_autoscroll_stop (EV_VIEW (window->priv->view)); - if (gtk_widget_get_visible (window->priv->find_bar)) + if (gtk_search_bar_get_search_mode (GTK_SEARCH_BAR (window->priv->search_bar))) ev_window_close_find_bar (window); else if (ev_document_model_get_fullscreen (window->priv->model)) ev_window_stop_fullscreen (window, TRUE); @@ -5166,198 +5145,73 @@ recent_view_item_activated_cb (EvRecentView *recent_view, } static void -ev_window_update_find_status_message (EvWindow *ev_window) +search_entry_stop_search_cb (GtkSearchEntry *entry, + EvWindow *ev_window) { - gchar *message; - - if (!ev_window->priv->find_job) - return; - - if (ev_job_is_finished (ev_window->priv->find_job)) { - EvJobFind *job_find = EV_JOB_FIND (ev_window->priv->find_job); - - if (ev_job_find_has_results (job_find)) { - gint n_results; - - n_results = ev_job_find_get_n_results (job_find, - ev_document_model_get_page (ev_window->priv->model)); - /* TRANS: Sometimes this could be better translated as - "%d hit(s) on this page". Therefore this string - contains plural cases. */ - message = g_strdup_printf (ngettext ("%d found on this page", - "%d found on this page", - n_results), - n_results); - } else { - message = g_strdup (_("Not found")); - } - } else { - gdouble percent; - - percent = ev_job_find_get_progress (EV_JOB_FIND (ev_window->priv->find_job)); - message = g_strdup_printf (_("%3d%% remaining to search"), - (gint) ((1.0 - percent) * 100)); - } - - egg_find_bar_set_status_text (EGG_FIND_BAR (ev_window->priv->find_bar), message); - g_free (message); + ev_window_close_find_bar (ev_window); } static void -ev_window_find_job_finished_cb (EvJobFind *job, - EvWindow *ev_window) +search_started_cb (EvSearchBox *search_box, + EvJobFind *job, + EvWindow *ev_window) { - ev_window_update_find_status_message (ev_window); - ev_window_clear_find_job (ev_window); -} + if (!ev_window->priv->document || !EV_IS_DOCUMENT_FIND (ev_window->priv->document)) + return; -/** - * find_bar_check_refresh_rate: - * - * Check whether the current page should trigger an status update in the - * find bar given its document size and the rate page. - * - * For documents with less pages than page_rate, it will return TRUE for - * every page. For documents with more pages, it will return TRUE every - * ((total_pages / page rate) + 1). - * - * This slow down the update rate in the GUI, making the search more - * responsive. - */ -static inline gboolean -find_check_refresh_rate (EvJobFind *job, gint page_rate) -{ - return ((job->current_page % (gint)((job->n_pages / page_rate) + 1)) == 0); -} - -static void -ev_window_find_job_updated_cb (EvJobFind *job, - gint page, - EvWindow *ev_window) -{ - /* Adjust the status update when searching for a term according - * to the document size in pages. For documents smaller (or equal) - * than 100 pages, it will be updated in every page. A value of - * 100 is enough to update the find bar every 1%. - */ - if (find_check_refresh_rate (job, FIND_PAGE_RATE_REFRESH)) { - ev_window_update_actions_sensitivity (ev_window); - ev_window_update_find_status_message (ev_window); - ev_find_sidebar_update (EV_FIND_SIDEBAR (ev_window->priv->find_sidebar)); - } + ev_view_find_search_changed (EV_VIEW (ev_window->priv->view)); + ev_view_find_started (EV_VIEW (ev_window->priv->view), job); + ev_find_sidebar_start (EV_FIND_SIDEBAR (ev_window->priv->find_sidebar), job); } static void -ev_window_clear_find_job (EvWindow *ev_window) +search_updated_cb (EvSearchBox *search_box, + gint page, + EvWindow *ev_window) { - if (ev_window->priv->find_job != NULL) { - if (!ev_job_is_finished (ev_window->priv->find_job)) - ev_job_cancel (ev_window->priv->find_job); - - g_signal_handlers_disconnect_by_func (ev_window->priv->find_job, - ev_window_find_job_finished_cb, - ev_window); - g_signal_handlers_disconnect_by_func (ev_window->priv->find_job, - ev_window_find_job_updated_cb, - ev_window); - g_object_unref (ev_window->priv->find_job); - ev_window->priv->find_job = NULL; - } + ev_window_update_actions_sensitivity (ev_window); + ev_find_sidebar_update (EV_FIND_SIDEBAR (ev_window->priv->find_sidebar)); } static void -find_bar_previous_cb (EggFindBar *find_bar, - EvWindow *ev_window) +search_cleared_cb (EvSearchBox *search_box, + EvWindow *ev_window) { - ev_window_find_previous (ev_window); -} -static void -find_bar_next_cb (EggFindBar *find_bar, - EvWindow *ev_window) -{ - ev_window_find_next (ev_window); -} + ev_window_update_actions_sensitivity (ev_window); + ev_find_sidebar_clear (EV_FIND_SIDEBAR (ev_window->priv->find_sidebar)); -static void -find_bar_close_cb (EggFindBar *find_bar, - EvWindow *ev_window) -{ - ev_window_close_find_bar (ev_window); + ev_view_find_search_changed (EV_VIEW (ev_window->priv->view)); + gtk_widget_queue_draw (GTK_WIDGET (ev_window->priv->view)); } static void -ev_window_search_start (EvWindow *ev_window) +search_previous_cb (EvSearchBox *search_box, + EvWindow *ev_window) { - EggFindBar *find_bar = EGG_FIND_BAR (ev_window->priv->find_bar); - const char *search_string; - - if (!ev_window->priv->document || !EV_IS_DOCUMENT_FIND (ev_window->priv->document)) - return; - - search_string = egg_find_bar_get_search_string (find_bar); - - ev_window_clear_find_job (ev_window); - if (search_string && search_string[0]) { - EvFindOptions options = EV_FIND_DEFAULT; - - ev_window->priv->find_job = ev_job_find_new (ev_window->priv->document, - ev_document_model_get_page (ev_window->priv->model), - ev_document_get_n_pages (ev_window->priv->document), - search_string, - FALSE); - - if (egg_find_bar_get_case_sensitive (find_bar)) - options |= EV_FIND_CASE_SENSITIVE; - if (egg_find_bar_get_whole_words_only (find_bar)) - options |= EV_FIND_WHOLE_WORDS_ONLY; - ev_job_find_set_options (EV_JOB_FIND (ev_window->priv->find_job), options); - - ev_view_find_started (EV_VIEW (ev_window->priv->view), EV_JOB_FIND (ev_window->priv->find_job)); - ev_find_sidebar_start (EV_FIND_SIDEBAR (ev_window->priv->find_sidebar), - EV_JOB_FIND (ev_window->priv->find_job)); - - g_signal_connect (ev_window->priv->find_job, "finished", - G_CALLBACK (ev_window_find_job_finished_cb), - ev_window); - g_signal_connect (ev_window->priv->find_job, "updated", - G_CALLBACK (ev_window_find_job_updated_cb), - ev_window); - ev_job_scheduler_push_job (ev_window->priv->find_job, EV_JOB_PRIORITY_NONE); - } else { - ev_window_update_actions_sensitivity (ev_window); - egg_find_bar_set_status_text (find_bar, NULL); - ev_find_sidebar_clear (EV_FIND_SIDEBAR (ev_window->priv->find_sidebar)); - gtk_widget_queue_draw (GTK_WIDGET (ev_window->priv->view)); - } + ev_window_find_previous (ev_window); } static void -find_bar_search_changed_cb (EggFindBar *find_bar, - GParamSpec *param, - EvWindow *ev_window) +search_next_cb (EvSearchBox *search_box, + EvWindow *ev_window) { - /* Either the string or case sensitivity could have changed. */ - ev_view_find_search_changed (EV_VIEW (ev_window->priv->view)); - ev_window_search_start (ev_window); + ev_window_find_next (ev_window); } static void -find_bar_visibility_changed_cb (EggFindBar *find_bar, - GParamSpec *param, - EvWindow *ev_window) +search_bar_search_mode_enabled_changed (GtkSearchBar *search_bar, + GParamSpec *param, + EvWindow *ev_window) { - gboolean visible; + gboolean enabled = gtk_search_bar_get_search_mode (search_bar); - visible = gtk_widget_get_visible (GTK_WIDGET (find_bar)); - - if (ev_window->priv->document && - EV_IS_DOCUMENT_FIND (ev_window->priv->document)) { - ev_view_find_set_highlight_search (EV_VIEW (ev_window->priv->view), visible); - ev_window_update_actions_sensitivity (ev_window); + ev_view_find_set_highlight_search (EV_VIEW (ev_window->priv->view), enabled); + ev_window_update_actions_sensitivity (ev_window); - if (!visible) - egg_find_bar_set_status_text (EGG_FIND_BAR (ev_window->priv->find_bar), NULL); + if (!enabled) { + /* Handle the case of search bar close button clicked */ + ev_window_close_find_bar (ev_window); } } @@ -5365,8 +5219,8 @@ static void ev_window_show_find_bar (EvWindow *ev_window, gboolean restart) { - if (gtk_widget_get_visible (ev_window->priv->find_bar)) { - gtk_widget_grab_focus (ev_window->priv->find_bar); + if (gtk_widget_get_visible (ev_window->priv->find_sidebar)) { + gtk_widget_grab_focus (ev_window->priv->search_box); return; } @@ -5386,19 +5240,24 @@ ev_window_show_find_bar (EvWindow *ev_window, ev_window->priv->find_sidebar, FALSE, FALSE); gtk_widget_show (ev_window->priv->find_sidebar); - update_chrome_flag (ev_window, EV_CHROME_FINDBAR, TRUE); - update_chrome_visibility (ev_window); - gtk_widget_grab_focus (ev_window->priv->find_bar); + + gtk_search_bar_set_search_mode (GTK_SEARCH_BAR (ev_window->priv->search_bar), TRUE); + gtk_widget_grab_focus (ev_window->priv->search_box); g_action_group_change_action_state (G_ACTION_GROUP (ev_window), "toggle-find", g_variant_new_boolean (TRUE)); - if (restart && ev_window->priv->find_job) - ev_window_find_restart (ev_window); + if (restart) { + GtkSearchEntry *entry = ev_search_box_get_entry (EV_SEARCH_BOX (ev_window->priv->search_box)); + const char *search_string = gtk_entry_get_text (GTK_ENTRY (entry)); + + if (search_string && search_string[0]) + ev_window_find_restart (ev_window); + } } static void ev_window_close_find_bar (EvWindow *ev_window) { - if (!gtk_widget_get_visible (ev_window->priv->find_bar)) + if (!gtk_widget_get_visible (ev_window->priv->find_sidebar)) return; g_object_ref (ev_window->priv->find_sidebar); @@ -5406,9 +5265,9 @@ ev_window_close_find_bar (EvWindow *ev_window) ev_window->priv->find_sidebar); gtk_paned_pack1 (GTK_PANED (ev_window->priv->hpaned), ev_window->priv->sidebar, FALSE, FALSE); + gtk_widget_hide (ev_window->priv->find_sidebar); - update_chrome_flag (ev_window, EV_CHROME_FINDBAR, FALSE); - update_chrome_visibility (ev_window); + gtk_search_bar_set_search_mode (GTK_SEARCH_BAR (ev_window->priv->search_bar), FALSE); gtk_widget_grab_focus (ev_window->priv->view); g_action_group_change_action_state (G_ACTION_GROUP (ev_window), "toggle-find", g_variant_new_boolean (FALSE)); @@ -5662,10 +5521,6 @@ ev_window_dispose (GObject *object) ev_window_clear_thumbnail_job (window); } - if (priv->find_job) { - ev_window_clear_find_job (window); - } - if (priv->local_uri) { ev_window_clear_local_uri (window); priv->local_uri = NULL; @@ -5702,14 +5557,6 @@ ev_window_dispose (GObject *object) priv->attach_list = NULL; } - if (priv->find_bar) { - g_signal_handlers_disconnect_by_func - (window->priv->find_bar, - G_CALLBACK (find_bar_close_cb), - window); - priv->find_bar = NULL; - } - if (priv->uri) { g_free (priv->uri); priv->uri = NULL; @@ -6834,6 +6681,7 @@ ev_window_init (EvWindow *ev_window) GObject *mpkeys; guint page_cache_mb; gboolean allow_links_change_zoom; + GtkEntry *search_entry; #ifdef ENABLE_DBUS GDBusConnection *connection; static gint window_id = 0; @@ -6931,13 +6779,24 @@ ev_window_init (EvWindow *ev_window) G_CALLBACK (activate_link_cb), ev_window); - /* Find Bar */ - ev_window->priv->find_bar = egg_find_bar_new (); - gtk_style_context_add_class (gtk_widget_get_style_context (ev_window->priv->find_bar), - GTK_STYLE_CLASS_PRIMARY_TOOLBAR); + /* Search Bar */ + ev_window->priv->search_bar = gtk_search_bar_new (); + gtk_search_bar_set_show_close_button (GTK_SEARCH_BAR (ev_window->priv->search_bar), TRUE); + + ev_window->priv->search_box = ev_search_box_new (ev_window->priv->model); + search_entry = GTK_ENTRY (ev_search_box_get_entry (EV_SEARCH_BOX (ev_window->priv->search_box))); + gtk_entry_set_width_chars (search_entry, 32); + gtk_entry_set_max_length (search_entry, 512); + gtk_container_add (GTK_CONTAINER (ev_window->priv->search_bar), + ev_window->priv->search_box); + gtk_widget_show (ev_window->priv->search_box); + + /* We don't use gtk_search_bar_connect_entry, because it clears the entry when the + * search is closed, but we want to keep the current search. + */ gtk_box_pack_start (GTK_BOX (ev_window->priv->main_box), - ev_window->priv->find_bar, - FALSE, TRUE, 0); + ev_window->priv->search_bar, FALSE, TRUE, 0); + gtk_widget_show (ev_window->priv->search_bar); /* Add the main area */ ev_window->priv->hpaned = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL); @@ -7170,33 +7029,33 @@ ev_window_init (EvWindow *ev_window) ev_window); /* Connect to find bar signals */ - g_signal_connect (ev_window->priv->find_bar, - "previous", - G_CALLBACK (find_bar_previous_cb), + g_signal_connect (ev_window->priv->search_box, + "started", + G_CALLBACK (search_started_cb), ev_window); - g_signal_connect (ev_window->priv->find_bar, - "next", - G_CALLBACK (find_bar_next_cb), + g_signal_connect (ev_window->priv->search_box, + "updated", + G_CALLBACK (search_updated_cb), ev_window); - g_signal_connect (ev_window->priv->find_bar, - "close", - G_CALLBACK (find_bar_close_cb), + g_signal_connect (ev_window->priv->search_box, + "cleared", + G_CALLBACK (search_cleared_cb), ev_window); - g_signal_connect (ev_window->priv->find_bar, - "notify::search-string", - G_CALLBACK (find_bar_search_changed_cb), + g_signal_connect (ev_window->priv->search_box, + "previous", + G_CALLBACK (search_previous_cb), ev_window); - g_signal_connect (ev_window->priv->find_bar, - "notify::case-sensitive", - G_CALLBACK (find_bar_search_changed_cb), + g_signal_connect (ev_window->priv->search_box, + "next", + G_CALLBACK (search_next_cb), ev_window); - g_signal_connect (ev_window->priv->find_bar, - "notify::whole-words-only", - G_CALLBACK (find_bar_search_changed_cb), + g_signal_connect (search_entry, + "stop-search", + G_CALLBACK (search_entry_stop_search_cb), ev_window); - g_signal_connect (ev_window->priv->find_bar, - "notify::visible", - G_CALLBACK (find_bar_visibility_changed_cb), + g_signal_connect (ev_window->priv->search_bar, + "notify::search-mode-enabled", + G_CALLBACK (search_bar_search_mode_enabled_changed), ev_window); /* Popups */