]> www.fi.muni.cz Git - evince.git/blobdiff - shell/eggfindbar.c
[libview] Add methods to get/set page cache flags
[evince.git] / shell / eggfindbar.c
index 4ce466266df64810416b6f8b3d293ed9280c77a4..5b196ec1299f56ecad2cf943a530301352c7ee31 100644 (file)
@@ -16,44 +16,40 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 Boston, MA 02111-1307, USA.
 */
 
 Boston, MA 02111-1307, USA.
 */
 
-#include <config.h>
+#include "config.h"
 
 
-#include "eggfindbar.h"
+#include <string.h>
 
 #include <glib/gi18n.h>
 
 #include <glib/gi18n.h>
-#include <gtk/gtkhbox.h>
-#include <gtk/gtkentry.h>
-#include <gtk/gtkcheckbutton.h>
-#include <gtk/gtkvseparator.h>
-#include <gtk/gtkstock.h>
-#include <gtk/gtklabel.h>
+#include <gtk/gtk.h>
 #include <gdk/gdkkeysyms.h>
 #include <gdk/gdkkeysyms.h>
-#include <gtk/gtkbindings.h>
 
 
-#include <string.h>
+#include "eggfindbar.h"
 
 
-typedef struct _EggFindBarPrivate EggFindBarPrivate;
 struct _EggFindBarPrivate
 {
   gchar *search_string;
 struct _EggFindBarPrivate
 {
   gchar *search_string;
-  GtkWidget *hbox;
-  GtkWidget *close_button;
+
+  GtkToolItem *next_button;
+  GtkToolItem *previous_button;
+  GtkToolItem *status_separator;
+  GtkToolItem *status_item;
+  GtkToolItem *case_button;
+
   GtkWidget *find_entry;
   GtkWidget *find_entry;
-  GtkWidget *next_button;
-  GtkWidget *previous_button;
-  GtkWidget *case_button;
+  GtkWidget *status_label;
+
+  gulong set_focus_handler;
   guint case_sensitive : 1;
 };
 
 #define EGG_FIND_BAR_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), EGG_TYPE_FIND_BAR, EggFindBarPrivate))
 
   guint case_sensitive : 1;
 };
 
 #define EGG_FIND_BAR_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), EGG_TYPE_FIND_BAR, EggFindBarPrivate))
 
-
-enum
-  {
+enum {
     PROP_0,
     PROP_SEARCH_STRING,
     PROP_CASE_SENSITIVE
     PROP_0,
     PROP_SEARCH_STRING,
     PROP_CASE_SENSITIVE
-  };
+};
 
 static void egg_find_bar_finalize      (GObject        *object);
 static void egg_find_bar_get_property  (GObject        *object,
 
 static void egg_find_bar_finalize      (GObject        *object);
 static void egg_find_bar_get_property  (GObject        *object,
@@ -64,18 +60,18 @@ static void egg_find_bar_set_property  (GObject        *object,
                                         guint           prop_id,
                                         const GValue   *value,
                                         GParamSpec     *pspec);
                                         guint           prop_id,
                                         const GValue   *value,
                                         GParamSpec     *pspec);
-static void egg_find_bar_size_request  (GtkWidget      *widget,
-                                        GtkRequisition *requisition);
-static void egg_find_bar_size_allocate (GtkWidget      *widget,
-                                        GtkAllocation  *allocation);
+static void egg_find_bar_show          (GtkWidget *widget);
+static void egg_find_bar_hide          (GtkWidget *widget);
+static void egg_find_bar_grab_focus    (GtkWidget *widget);
 
 
-G_DEFINE_TYPE (EggFindBar, egg_find_bar, GTK_TYPE_BIN);
+G_DEFINE_TYPE (EggFindBar, egg_find_bar, GTK_TYPE_TOOLBAR);
 
 enum
   {
     NEXT,
     PREVIOUS,
     CLOSE,
 
 enum
   {
     NEXT,
     PREVIOUS,
     CLOSE,
+    SCROLL,
     LAST_SIGNAL
   };
 
     LAST_SIGNAL
   };
 
@@ -86,26 +82,28 @@ egg_find_bar_class_init (EggFindBarClass *klass)
 {
   GObjectClass *object_class;
   GtkWidgetClass *widget_class;
 {
   GObjectClass *object_class;
   GtkWidgetClass *widget_class;
-  GtkBinClass *bin_class;
   GtkBindingSet *binding_set;
   GtkBindingSet *binding_set;
+        
+  egg_find_bar_parent_class = g_type_class_peek_parent (klass);
 
   object_class = (GObjectClass *)klass;
   widget_class = (GtkWidgetClass *)klass;
 
   object_class = (GObjectClass *)klass;
   widget_class = (GtkWidgetClass *)klass;
-  bin_class = (GtkBinClass *)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;
 
 
   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->size_request = egg_find_bar_size_request;
-  widget_class->size_allocate = egg_find_bar_size_allocate;
+  widget_class->show = egg_find_bar_show;
+  widget_class->hide = egg_find_bar_hide;
+  
+  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,
 
   find_bar_signals[NEXT] =
     g_signal_new ("next",
                  G_OBJECT_CLASS_TYPE (object_class),
                  G_SIGNAL_RUN_FIRST,
-                  0,
+                  G_STRUCT_OFFSET (EggFindBarClass, next),
                  NULL, NULL,
                  g_cclosure_marshal_VOID__VOID,
                  G_TYPE_NONE, 0);
                  NULL, NULL,
                  g_cclosure_marshal_VOID__VOID,
                  G_TYPE_NONE, 0);
@@ -113,7 +111,7 @@ egg_find_bar_class_init (EggFindBarClass *klass)
     g_signal_new ("previous",
                  G_OBJECT_CLASS_TYPE (object_class),
                  G_SIGNAL_RUN_FIRST,
     g_signal_new ("previous",
                  G_OBJECT_CLASS_TYPE (object_class),
                  G_SIGNAL_RUN_FIRST,
-                  0,
+                  G_STRUCT_OFFSET (EggFindBarClass, previous),
                  NULL, NULL,
                  g_cclosure_marshal_VOID__VOID,
                  G_TYPE_NONE, 0);
                  NULL, NULL,
                  g_cclosure_marshal_VOID__VOID,
                  G_TYPE_NONE, 0);
@@ -121,10 +119,19 @@ egg_find_bar_class_init (EggFindBarClass *klass)
     g_signal_new ("close",
                  G_OBJECT_CLASS_TYPE (object_class),
                  G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
     g_signal_new ("close",
                  G_OBJECT_CLASS_TYPE (object_class),
                  G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
-                  0,
+                  G_STRUCT_OFFSET (EggFindBarClass, close),
                  NULL, NULL,
                  g_cclosure_marshal_VOID__VOID,
                  G_TYPE_NONE, 0);
                  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:
 
   /**
    * EggFindBar:search_string:
@@ -136,8 +143,8 @@ egg_find_bar_class_init (EggFindBarClass *klass)
   g_object_class_install_property (object_class,
                                   PROP_SEARCH_STRING,
                                   g_param_spec_string ("search_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"),
+                                                       "Search string",
+                                                       "The name of the string to be found",
                                                        NULL,
                                                        G_PARAM_READWRITE));
 
                                                        NULL,
                                                        G_PARAM_READWRITE));
 
@@ -150,23 +157,23 @@ egg_find_bar_class_init (EggFindBarClass *klass)
   g_object_class_install_property (object_class,
                                   PROP_CASE_SENSITIVE,
                                   g_param_spec_boolean ("case_sensitive",
   g_object_class_install_property (object_class,
                                   PROP_CASE_SENSITIVE,
                                   g_param_spec_boolean ("case_sensitive",
-                                                         _("Case sensitive"),
-                                                         _("TRUE for a case sensitive search"),
+                                                         "Case sensitive",
+                                                         "TRUE for a case sensitive search",
                                                          FALSE,
                                                          G_PARAM_READWRITE));
 
   /* Style properties */
   gtk_widget_class_install_style_property (widget_class,
                                            g_param_spec_boxed ("all_matches_color",
                                                          FALSE,
                                                          G_PARAM_READWRITE));
 
   /* Style properties */
   gtk_widget_class_install_style_property (widget_class,
                                            g_param_spec_boxed ("all_matches_color",
-                                                               _("Highlight color"),
-                                                               _("Color of highlight for all matches"),
+                                                               "Highlight color",
+                                                               "Color of highlight for all matches",
                                                                GDK_TYPE_COLOR,
                                                                G_PARAM_READABLE));
 
   gtk_widget_class_install_style_property (widget_class,
                                            g_param_spec_boxed ("current_match_color",
                                                                GDK_TYPE_COLOR,
                                                                G_PARAM_READABLE));
 
   gtk_widget_class_install_style_property (widget_class,
                                            g_param_spec_boxed ("current_match_color",
-                                                               _("Current color"),
-                                                               _("Color of highlight for the current match"),
+                                                               "Current color",
+                                                               "Color of highlight for the current match",
                                                                GDK_TYPE_COLOR,
                                                                G_PARAM_READABLE));
 
                                                                GDK_TYPE_COLOR,
                                                                G_PARAM_READABLE));
 
@@ -176,6 +183,25 @@ egg_find_bar_class_init (EggFindBarClass *klass)
 
   gtk_binding_entry_add_signal (binding_set, GDK_Escape, 0,
                                "close", 0);
 
   gtk_binding_entry_add_signal (binding_set, GDK_Escape, 0,
                                "close", 0);
+
+  gtk_binding_entry_add_signal (binding_set, GDK_Up, 0,
+                                "scroll", 1,
+                                GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_STEP_BACKWARD);
+  gtk_binding_entry_add_signal (binding_set, GDK_Down, 0,
+                                "scroll", 1,
+                                GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_STEP_FORWARD);
+  gtk_binding_entry_add_signal (binding_set, GDK_Page_Up, 0,
+                               "scroll", 1,
+                               GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_PAGE_BACKWARD);
+  gtk_binding_entry_add_signal (binding_set, GDK_KP_Page_Up, 0,
+                               "scroll", 1,
+                               GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_PAGE_BACKWARD);
+  gtk_binding_entry_add_signal (binding_set, GDK_Page_Down, 0,
+                               "scroll", 1,
+                               GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_PAGE_FORWARD);
+  gtk_binding_entry_add_signal (binding_set, GDK_KP_Page_Down, 0,
+                               "scroll", 1,
+                               GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_PAGE_FORWARD);
 }
 
 static void
 }
 
 static void
@@ -190,21 +216,6 @@ egg_find_bar_emit_previous (EggFindBar *find_bar)
   g_signal_emit (find_bar, find_bar_signals[PREVIOUS], 0);
 }
 
   g_signal_emit (find_bar, find_bar_signals[PREVIOUS], 0);
 }
 
-static void
-egg_find_bar_emit_close (EggFindBar *find_bar)
-{
-  g_signal_emit (find_bar, find_bar_signals[CLOSE], 0);
-}
-
-static void
-close_clicked_callback (GtkButton *button,
-                        void      *data)
-{
-  EggFindBar *find_bar = EGG_FIND_BAR (data);
-
-  egg_find_bar_emit_close (find_bar);
-}
-
 static void
 next_clicked_callback (GtkButton *button,
                        void      *data)
 static void
 next_clicked_callback (GtkButton *button,
                        void      *data)
@@ -239,7 +250,8 @@ entry_activate_callback (GtkEntry *entry,
 {
   EggFindBar *find_bar = EGG_FIND_BAR (data);
 
 {
   EggFindBar *find_bar = EGG_FIND_BAR (data);
 
-  egg_find_bar_emit_next (find_bar);
+  if (find_bar->priv->search_string != NULL)
+    egg_find_bar_emit_next (find_bar);
 }
 
 static void
 }
 
 static void
@@ -255,108 +267,98 @@ entry_changed_callback (GtkEntry *entry,
   text = g_strdup (gtk_entry_get_text (entry));
 
   egg_find_bar_set_search_string (find_bar, text);
   text = g_strdup (gtk_entry_get_text (entry));
 
   egg_find_bar_set_search_string (find_bar, text);
-
+  
   g_free (text);
 }
 
   g_free (text);
 }
 
+static void
+set_focus_cb (GtkWidget *window,
+             GtkWidget *widget,
+             EggFindBar *bar)
+{
+  GtkWidget *wbar = GTK_WIDGET (bar);
+
+  while (widget != NULL && widget != wbar)
+    {
+      widget = widget->parent;
+    }
+
+  /* if widget == bar, the new focus widget is in the bar, so we
+   * don't deactivate.
+   */
+  if (widget != wbar)
+    {
+      g_signal_emit (bar, find_bar_signals[CLOSE], 0);
+    }
+}
+
 static void
 egg_find_bar_init (EggFindBar *find_bar)
 {
   EggFindBarPrivate *priv;
   GtkWidget *label;
 static void
 egg_find_bar_init (EggFindBar *find_bar)
 {
   EggFindBarPrivate *priv;
   GtkWidget *label;
-  GtkWidget *separator;
-  GtkWidget *image;
-  GtkWidget *image_back;
-  GtkWidget *image_forward;
+  GtkWidget *alignment;
+  GtkWidget *box;
+  GtkToolItem *item;
+  GtkWidget *arrow;
 
   /* Data */
   priv = EGG_FIND_BAR_GET_PRIVATE (find_bar);
 
   /* Data */
   priv = EGG_FIND_BAR_GET_PRIVATE (find_bar);
-  find_bar->private_data = priv;
-
+  
+  find_bar->priv = priv;  
   priv->search_string = NULL;
 
   priv->search_string = NULL;
 
-  /* Widgets */
-  gtk_widget_push_composite_child ();
-  priv->hbox = gtk_hbox_new (FALSE, 6);
-  gtk_container_set_border_width (GTK_CONTAINER (priv->hbox), 3);
+  gtk_toolbar_set_style (GTK_TOOLBAR (find_bar), GTK_TOOLBAR_BOTH_HORIZ);
 
 
-  label = gtk_label_new_with_mnemonic (_("F_ind:"));
-  separator = gtk_vseparator_new ();
+  /* Find: |_____| */
+  item = gtk_tool_item_new ();
+  box = gtk_hbox_new (FALSE, 12);
+  
+  alignment = gtk_alignment_new (0.0, 0.5, 1.0, 0.0);
+  gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 0, 0, 2, 2);
 
 
-  priv->close_button = gtk_button_new ();
-  gtk_button_set_relief (GTK_BUTTON (priv->close_button),
-                         GTK_RELIEF_NONE);
-  image = gtk_image_new_from_stock (GTK_STOCK_CLOSE,
-                                    GTK_ICON_SIZE_SMALL_TOOLBAR);
-  gtk_container_add (GTK_CONTAINER (priv->close_button), image);
+  label = gtk_label_new_with_mnemonic (_("Find:"));
 
   priv->find_entry = gtk_entry_new ();
 
   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);
   gtk_label_set_mnemonic_widget (GTK_LABEL (label), priv->find_entry);
   gtk_label_set_mnemonic_widget (GTK_LABEL (label), priv->find_entry);
-  
-  priv->previous_button = gtk_button_new_with_mnemonic (_("_Previous"));
-  priv->next_button = gtk_button_new_with_mnemonic (_("_Next"));
-
-  image_back = gtk_image_new_from_stock (GTK_STOCK_GO_BACK,
-                                         GTK_ICON_SIZE_BUTTON);
-  image_forward = gtk_image_new_from_stock (GTK_STOCK_GO_FORWARD,
-                                            GTK_ICON_SIZE_BUTTON);
-
-  gtk_button_set_image (GTK_BUTTON (priv->previous_button),
-                        image_back);
-  gtk_button_set_image (GTK_BUTTON (priv->next_button),
-                        image_forward);
-  
-  priv->case_button = gtk_check_button_new_with_mnemonic (_("C_ase Sensitive"));
-
-#if 0
- {
-   GtkWidget *button_label;
-   /* This hack doesn't work because GtkCheckButton doesn't pass the
-    * larger size allocation to the label, it always gives the label
-    * its exact request. If you un-ifdef this, set the box back
-    * on case_button to TRUE, TRUE below
-    */
-   button_label = gtk_bin_get_child (GTK_BIN (priv->case_button));
-   gtk_label_set_ellipsize (GTK_LABEL (button_label),
-                            PANGO_ELLIPSIZE_END);
- }
-#endif
-  
-  gtk_box_pack_start (GTK_BOX (priv->hbox),
-                      priv->close_button, FALSE, FALSE, 0);
-  gtk_box_pack_start (GTK_BOX (priv->hbox),
-                      label, FALSE, FALSE, 0);
-  gtk_box_pack_start (GTK_BOX (priv->hbox),
-                      priv->find_entry, FALSE, FALSE, 0);
-  gtk_box_pack_start (GTK_BOX (priv->hbox),
-                      priv->previous_button, FALSE, FALSE, 0);
-  gtk_box_pack_start (GTK_BOX (priv->hbox),
-                      priv->next_button, FALSE, FALSE, 0);
-  gtk_box_pack_start (GTK_BOX (priv->hbox),
-                      separator, FALSE, FALSE, 0);
-  gtk_box_pack_start (GTK_BOX (priv->hbox),
-                      priv->case_button, FALSE, FALSE, 0);
-
-  gtk_container_add (GTK_CONTAINER (find_bar), priv->hbox);
-
-  gtk_widget_show (priv->hbox);
-  gtk_widget_show (priv->close_button);
-  gtk_widget_show (priv->find_entry);
-  gtk_widget_show (priv->previous_button);
-  gtk_widget_show (priv->next_button);
-  gtk_widget_show (separator);
-  gtk_widget_show (label);
-  gtk_widget_show (image);
-  gtk_widget_show (image_back);
-  gtk_widget_show (image_forward);
-
-  gtk_widget_pop_composite_child ();
-
-  gtk_widget_show_all (priv->hbox);
-
-  g_signal_connect (priv->close_button, "clicked",
-                    G_CALLBACK (close_clicked_callback),
-                    find_bar);
+
+  /* Prev */
+  arrow = gtk_arrow_new (GTK_ARROW_LEFT, GTK_SHADOW_NONE);
+  priv->previous_button = gtk_tool_button_new (arrow, Q_("Find Pre_vious"));
+  gtk_tool_button_set_use_underline (GTK_TOOL_BUTTON (priv->previous_button), TRUE);
+  gtk_tool_item_set_is_important (priv->previous_button, TRUE);
+  gtk_widget_set_tooltip_text (GTK_WIDGET (priv->previous_button),
+                              _("Find previous occurrence of the search string"));
+
+  /* Next */
+  arrow = gtk_arrow_new (GTK_ARROW_RIGHT, GTK_SHADOW_NONE);
+  priv->next_button = gtk_tool_button_new (arrow, Q_("Find Ne_xt"));
+  gtk_tool_button_set_use_underline (GTK_TOOL_BUTTON (priv->next_button), TRUE);
+  gtk_tool_item_set_is_important (priv->next_button, TRUE);
+  gtk_widget_set_tooltip_text (GTK_WIDGET (priv->next_button),
+                              _("Find next occurrence of the search string"));
+
+  /* Separator*/
+  priv->status_separator = gtk_separator_tool_item_new();
+
+  /* Case button */
+  priv->case_button = gtk_toggle_tool_button_new ();
+  g_object_set (G_OBJECT (priv->case_button), "label", _("C_ase Sensitive"), NULL);
+  gtk_tool_item_set_is_important (priv->case_button, TRUE);
+  gtk_widget_set_tooltip_text (GTK_WIDGET (priv->case_button),
+                              _("Toggle case sensitive search"));
+
+  /* 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);
+
+
   g_signal_connect (priv->find_entry, "changed",
                     G_CALLBACK (entry_changed_callback),
                     find_bar);
   g_signal_connect (priv->find_entry, "changed",
                     G_CALLBACK (entry_changed_callback),
                     find_bar);
@@ -372,13 +374,32 @@ egg_find_bar_init (EggFindBar *find_bar)
   g_signal_connect (priv->case_button, "toggled",
                     G_CALLBACK (case_sensitive_toggled_callback),
                     find_bar);
   g_signal_connect (priv->case_button, "toggled",
                     G_CALLBACK (case_sensitive_toggled_callback),
                     find_bar);
+
+  gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0);
+  gtk_box_pack_start (GTK_BOX (box), priv->find_entry, TRUE, TRUE, 0);
+  gtk_container_add (GTK_CONTAINER (alignment), box);
+  gtk_container_add (GTK_CONTAINER (item), alignment);
+  gtk_toolbar_insert (GTK_TOOLBAR (find_bar), item, -1);
+  gtk_toolbar_insert (GTK_TOOLBAR (find_bar), priv->previous_button, -1);
+  gtk_toolbar_insert (GTK_TOOLBAR (find_bar), priv->next_button, -1);
+  gtk_toolbar_insert (GTK_TOOLBAR (find_bar), priv->case_button, -1);
+  gtk_toolbar_insert (GTK_TOOLBAR (find_bar), priv->status_separator, -1);
+  gtk_container_add  (GTK_CONTAINER (priv->status_item), priv->status_label);
+  gtk_toolbar_insert (GTK_TOOLBAR (find_bar), priv->status_item, -1);
+
+  /* don't show status separator/label until they are set */
+
+  gtk_widget_show_all (GTK_WIDGET (item));
+  gtk_widget_show_all (GTK_WIDGET (priv->next_button));
+  gtk_widget_show_all (GTK_WIDGET (priv->previous_button));
+  gtk_widget_show (priv->status_label);
 }
 
 static void
 egg_find_bar_finalize (GObject *object)
 {
   EggFindBar *find_bar = EGG_FIND_BAR (object);
 }
 
 static void
 egg_find_bar_finalize (GObject *object)
 {
   EggFindBar *find_bar = EGG_FIND_BAR (object);
-  EggFindBarPrivate *priv = (EggFindBarPrivate *)find_bar->private_data;
+  EggFindBarPrivate *priv = (EggFindBarPrivate *)find_bar->priv;
 
   g_free (priv->search_string);
 
 
   g_free (priv->search_string);
 
@@ -414,7 +435,7 @@ egg_find_bar_get_property (GObject    *object,
                            GParamSpec *pspec)
 {
   EggFindBar *find_bar = EGG_FIND_BAR (object);
                            GParamSpec *pspec)
 {
   EggFindBar *find_bar = EGG_FIND_BAR (object);
-  EggFindBarPrivate *priv = (EggFindBarPrivate *)find_bar->private_data;
+  EggFindBarPrivate *priv = (EggFindBarPrivate *)find_bar->priv;
 
   switch (prop_id)
     {
 
   switch (prop_id)
     {
@@ -431,34 +452,52 @@ egg_find_bar_get_property (GObject    *object,
 }
 
 static void
 }
 
 static void
-egg_find_bar_size_request (GtkWidget      *widget,
-                           GtkRequisition *requisition)
+egg_find_bar_show (GtkWidget *widget)
 {
 {
-  GtkBin *bin = GTK_BIN (widget);
-  GtkRequisition child_requisition;
-  if (bin->child && GTK_WIDGET_VISIBLE (bin->child))
+  EggFindBar *bar = EGG_FIND_BAR (widget);
+  EggFindBarPrivate *priv = bar->priv;
+
+  GTK_WIDGET_CLASS (egg_find_bar_parent_class)->show (widget);
+
+  if (priv->set_focus_handler == 0)
     {
     {
-      gtk_widget_size_request (bin->child, &child_requisition);
+      GtkWidget *toplevel;
 
 
-      *requisition = child_requisition;
+      toplevel = gtk_widget_get_toplevel (widget);
+
+      priv->set_focus_handler =
+       g_signal_connect (toplevel, "set-focus",
+                         G_CALLBACK (set_focus_cb), bar);
     }
     }
-  else
+}
+
+static void
+egg_find_bar_hide (GtkWidget *widget)
+{
+  EggFindBar *bar = EGG_FIND_BAR (widget);
+  EggFindBarPrivate *priv = bar->priv;
+
+  if (priv->set_focus_handler != 0)
     {
     {
-      requisition->width = 0;
-      requisition->height = 0;
+      GtkWidget *toplevel;
+
+      toplevel = gtk_widget_get_toplevel (widget);
+
+      g_signal_handlers_disconnect_by_func
+       (toplevel, (void (*)) G_CALLBACK (set_focus_cb), bar);
+      priv->set_focus_handler = 0;
     }
     }
+
+  GTK_WIDGET_CLASS (egg_find_bar_parent_class)->hide (widget);
 }
 
 static void
 }
 
 static void
-egg_find_bar_size_allocate (GtkWidget     *widget,
-                            GtkAllocation *allocation)
+egg_find_bar_grab_focus (GtkWidget *widget)
 {
 {
-  GtkBin *bin = GTK_BIN (widget);
+  EggFindBar *find_bar = EGG_FIND_BAR (widget);
+  EggFindBarPrivate *priv = find_bar->priv;
 
 
-  widget->allocation = *allocation;
-
-  if (bin->child && GTK_WIDGET_VISIBLE (bin->child))
-    gtk_widget_size_allocate (bin->child, allocation);
+  gtk_widget_grab_focus (priv->find_entry);
 }
 
 /**
 }
 
 /**
@@ -496,7 +535,7 @@ egg_find_bar_set_search_string  (EggFindBar *find_bar,
 
   g_return_if_fail (EGG_IS_FIND_BAR (find_bar));
 
 
   g_return_if_fail (EGG_IS_FIND_BAR (find_bar));
 
-  priv = (EggFindBarPrivate *)find_bar->private_data;
+  priv = (EggFindBarPrivate *)find_bar->priv;
 
   g_object_freeze_notify (G_OBJECT (find_bar));
   
 
   g_object_freeze_notify (G_OBJECT (find_bar));
   
@@ -519,6 +558,8 @@ egg_find_bar_set_search_string  (EggFindBar *find_bar,
           (old && search_string &&
            strcmp (old, search_string) != 0))
         {
           (old && search_string &&
            strcmp (old, search_string) != 0))
         {
+         gboolean not_empty;
+         
           priv->search_string = g_strdup (search_string);
           g_free (old);
           
           priv->search_string = g_strdup (search_string);
           g_free (old);
           
@@ -526,7 +567,12 @@ egg_find_bar_set_search_string  (EggFindBar *find_bar,
                               priv->search_string ?
                               priv->search_string :
                               "");
                               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_notify (G_OBJECT (find_bar),
                            "search_string");
         }
@@ -552,9 +598,9 @@ egg_find_bar_get_search_string  (EggFindBar *find_bar)
 
   g_return_val_if_fail (EGG_IS_FIND_BAR (find_bar), NULL);
 
 
   g_return_val_if_fail (EGG_IS_FIND_BAR (find_bar), NULL);
 
-  priv = (EggFindBarPrivate *)find_bar->private_data;
+  priv = find_bar->priv;
 
 
-  return priv->search_string;
+  return priv->search_string ? priv->search_string : "";
 }
 
 /**
 }
 
 /**
@@ -572,7 +618,7 @@ egg_find_bar_set_case_sensitive (EggFindBar *find_bar,
 
   g_return_if_fail (EGG_IS_FIND_BAR (find_bar));
 
 
   g_return_if_fail (EGG_IS_FIND_BAR (find_bar));
 
-  priv = (EggFindBarPrivate *)find_bar->private_data;
+  priv = (EggFindBarPrivate *)find_bar->priv;
 
   g_object_freeze_notify (G_OBJECT (find_bar));
 
 
   g_object_freeze_notify (G_OBJECT (find_bar));
 
@@ -608,7 +654,7 @@ egg_find_bar_get_case_sensitive (EggFindBar *find_bar)
 
   g_return_val_if_fail (EGG_IS_FIND_BAR (find_bar), FALSE);
 
 
   g_return_val_if_fail (EGG_IS_FIND_BAR (find_bar), FALSE);
 
-  priv = (EggFindBarPrivate *)find_bar->private_data;
+  priv = (EggFindBarPrivate *)find_bar->priv;
 
   return priv->case_sensitive;
 }
 
   return priv->case_sensitive;
 }
@@ -669,21 +715,26 @@ egg_find_bar_get_current_match_color (EggFindBar *find_bar,
 }
 
 /**
 }
 
 /**
- * egg_find_bar_grab_focus:
+ * 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"
  *
  *
- * Focuses the text entry in the find bar; currently GTK+ doesn't have
- * a way to make this work on gtk_widget_grab_focus(find_bar).
+ * @text: the text to display
  *
  * Since: 2.6
  */
 void
  *
  * Since: 2.6
  */
 void
-egg_find_bar_grab_focus (EggFindBar *find_bar)
+egg_find_bar_set_status_text (EggFindBar *find_bar,
+                              const char *text)
 {
   EggFindBarPrivate *priv;
 
   g_return_if_fail (EGG_IS_FIND_BAR (find_bar));
 
 {
   EggFindBarPrivate *priv;
 
   g_return_if_fail (EGG_IS_FIND_BAR (find_bar));
 
-  priv = (EggFindBarPrivate *)find_bar->private_data;
-  gtk_widget_grab_focus (priv->find_entry);
+  priv = (EggFindBarPrivate *)find_bar->priv;
+  
+  gtk_label_set_text (GTK_LABEL (priv->status_label), text);
+  g_object_set (priv->status_separator, "visible", text != NULL && *text != '\0', NULL);
+  g_object_set (priv->status_item, "visible", text != NULL && *text !='\0', NULL);
 }
 }