]> www.fi.muni.cz Git - evince.git/blob - shell/eggfindbar.c
Fixed typo in findbar code: s/help/search/
[evince.git] / shell / eggfindbar.c
1 /* Copyright (C) 2004 Red Hat, Inc.
2
3 This library is free software; you can redistribute it and/or
4 modify it under the terms of the GNU Library General Public License as
5 published by the Free Software Foundation; either version 2 of the
6 License, or (at your option) any later version.
7
8 This library is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 Library General Public License for more details.
12
13 You should have received a copy of the GNU Library General Public
14 License along with the Gnome Library; see the file COPYING.LIB.  If not,
15 write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
16 Boston, MA 02111-1307, USA.
17 */
18
19 #include <config.h>
20
21 #include "eggfindbar.h"
22
23 #include <glib/gi18n.h>
24 #include <gtk/gtkhbox.h>
25 #include <gtk/gtkentry.h>
26 #include <gtk/gtkcheckbutton.h>
27 #include <gtk/gtkvseparator.h>
28 #include <gtk/gtkstock.h>
29 #include <gtk/gtklabel.h>
30 #include <gdk/gdkkeysyms.h>
31 #include <gtk/gtkbindings.h>
32 #include <gtk/gtkalignment.h>
33 #include <gtk/gtktoolbutton.h>
34 #include <gtk/gtkseparatortoolitem.h>
35 #include <gtk/gtkarrow.h>
36 #include <gtk/gtktoggletoolbutton.h>
37
38 #include <string.h>
39
40 struct _EggFindBarPrivate
41 {
42   gchar *search_string;
43
44   GtkToolItem *next_button;
45   GtkToolItem *previous_button;
46   GtkToolItem *status_separator;
47   GtkToolItem *status_item;
48   GtkToolItem *case_button;
49
50   GtkWidget *find_entry;
51   GtkWidget *status_label;
52
53   gulong set_focus_handler;
54   guint case_sensitive : 1;
55 };
56
57 #define EGG_FIND_BAR_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), EGG_TYPE_FIND_BAR, EggFindBarPrivate))
58
59 enum {
60     PROP_0,
61     PROP_SEARCH_STRING,
62     PROP_CASE_SENSITIVE
63 };
64
65 static void egg_find_bar_finalize      (GObject        *object);
66 static void egg_find_bar_get_property  (GObject        *object,
67                                         guint           prop_id,
68                                         GValue         *value,
69                                         GParamSpec     *pspec);
70 static void egg_find_bar_set_property  (GObject        *object,
71                                         guint           prop_id,
72                                         const GValue   *value,
73                                         GParamSpec     *pspec);
74 static void egg_find_bar_show          (GtkWidget *widget);
75 static void egg_find_bar_hide          (GtkWidget *widget);
76 static void egg_find_bar_grab_focus    (GtkWidget *widget);
77
78 G_DEFINE_TYPE (EggFindBar, egg_find_bar, GTK_TYPE_TOOLBAR);
79
80 enum
81   {
82     NEXT,
83     PREVIOUS,
84     CLOSE,
85     SCROLL,
86     LAST_SIGNAL
87   };
88
89 static guint find_bar_signals[LAST_SIGNAL] = { 0 };
90
91 static void
92 egg_find_bar_class_init (EggFindBarClass *klass)
93 {
94   GObjectClass *object_class;
95   GtkWidgetClass *widget_class;
96   GtkBindingSet *binding_set;
97         
98   egg_find_bar_parent_class = g_type_class_peek_parent (klass);
99
100   object_class = (GObjectClass *)klass;
101   widget_class = (GtkWidgetClass *)klass;
102
103   object_class->set_property = egg_find_bar_set_property;
104   object_class->get_property = egg_find_bar_get_property;
105
106   object_class->finalize = egg_find_bar_finalize;
107
108   widget_class->show = egg_find_bar_show;
109   widget_class->hide = egg_find_bar_hide;
110   
111   widget_class->grab_focus = egg_find_bar_grab_focus;
112
113   find_bar_signals[NEXT] =
114     g_signal_new ("next",
115                   G_OBJECT_CLASS_TYPE (object_class),
116                   G_SIGNAL_RUN_FIRST,
117                   G_STRUCT_OFFSET (EggFindBarClass, next),
118                   NULL, NULL,
119                   g_cclosure_marshal_VOID__VOID,
120                   G_TYPE_NONE, 0);
121   find_bar_signals[PREVIOUS] =
122     g_signal_new ("previous",
123                   G_OBJECT_CLASS_TYPE (object_class),
124                   G_SIGNAL_RUN_FIRST,
125                   G_STRUCT_OFFSET (EggFindBarClass, previous),
126                   NULL, NULL,
127                   g_cclosure_marshal_VOID__VOID,
128                   G_TYPE_NONE, 0);
129   find_bar_signals[CLOSE] =
130     g_signal_new ("close",
131                   G_OBJECT_CLASS_TYPE (object_class),
132                   G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
133                   G_STRUCT_OFFSET (EggFindBarClass, close),
134                   NULL, NULL,
135                   g_cclosure_marshal_VOID__VOID,
136                   G_TYPE_NONE, 0);
137   find_bar_signals[SCROLL] =
138     g_signal_new ("scroll",
139                   G_OBJECT_CLASS_TYPE (object_class),
140                   G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
141                   G_STRUCT_OFFSET (EggFindBarClass, scroll),
142                   NULL, NULL,
143                   g_cclosure_marshal_VOID__ENUM,
144                   G_TYPE_NONE, 1,
145                   GTK_TYPE_SCROLL_TYPE);
146
147   /**
148    * EggFindBar:search_string:
149    *
150    * The current string to search for. NULL or empty string
151    * both mean no current string.
152    *
153    */
154   g_object_class_install_property (object_class,
155                                    PROP_SEARCH_STRING,
156                                    g_param_spec_string ("search_string",
157                                                         _("Search string"),
158                                                         _("The name of the string to be found"),
159                                                         NULL,
160                                                         G_PARAM_READWRITE));
161
162   /**
163    * EggFindBar:case_sensitive:
164    *
165    * TRUE for a case sensitive search.
166    *
167    */
168   g_object_class_install_property (object_class,
169                                    PROP_CASE_SENSITIVE,
170                                    g_param_spec_boolean ("case_sensitive",
171                                                          _("Case sensitive"),
172                                                          _("TRUE for a case sensitive search"),
173                                                          FALSE,
174                                                          G_PARAM_READWRITE));
175
176   /* Style properties */
177   gtk_widget_class_install_style_property (widget_class,
178                                            g_param_spec_boxed ("all_matches_color",
179                                                                _("Highlight color"),
180                                                                _("Color of highlight for all matches"),
181                                                                GDK_TYPE_COLOR,
182                                                                G_PARAM_READABLE));
183
184   gtk_widget_class_install_style_property (widget_class,
185                                            g_param_spec_boxed ("current_match_color",
186                                                                _("Current color"),
187                                                                _("Color of highlight for the current match"),
188                                                                GDK_TYPE_COLOR,
189                                                                G_PARAM_READABLE));
190
191   g_type_class_add_private (object_class, sizeof (EggFindBarPrivate));
192
193   binding_set = gtk_binding_set_by_class (klass);
194
195   gtk_binding_entry_add_signal (binding_set, GDK_Escape, 0,
196                                 "close", 0);
197
198   gtk_binding_entry_add_signal (binding_set, GDK_Up, 0,
199                                 "scroll", 1,
200                                 GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_STEP_BACKWARD);
201
202   gtk_binding_entry_add_signal (binding_set, GDK_Down, 0,
203                                 "scroll", 1,
204                                 GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_STEP_FORWARD);
205 }
206
207 static void
208 egg_find_bar_emit_next (EggFindBar *find_bar)
209 {
210   g_signal_emit (find_bar, find_bar_signals[NEXT], 0);
211 }
212
213 static void
214 egg_find_bar_emit_previous (EggFindBar *find_bar)
215 {
216   g_signal_emit (find_bar, find_bar_signals[PREVIOUS], 0);
217 }
218
219 static void
220 next_clicked_callback (GtkButton *button,
221                        void      *data)
222 {
223   EggFindBar *find_bar = EGG_FIND_BAR (data);
224
225   egg_find_bar_emit_next (find_bar);
226 }
227
228 static void
229 previous_clicked_callback (GtkButton *button,
230                            void      *data)
231 {
232   EggFindBar *find_bar = EGG_FIND_BAR (data);
233
234   egg_find_bar_emit_previous (find_bar);
235 }
236
237 static void
238 case_sensitive_toggled_callback (GtkCheckButton *button,
239                                  void           *data)
240 {
241   EggFindBar *find_bar = EGG_FIND_BAR (data);
242
243   egg_find_bar_set_case_sensitive (find_bar,
244                                    gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)));
245 }
246
247 static void
248 entry_activate_callback (GtkEntry *entry,
249                           void     *data)
250 {
251   EggFindBar *find_bar = EGG_FIND_BAR (data);
252
253   if (find_bar->priv->search_string != NULL)
254     egg_find_bar_emit_next (find_bar);
255 }
256
257 static void
258 entry_changed_callback (GtkEntry *entry,
259                         void     *data)
260 {
261   EggFindBar *find_bar = EGG_FIND_BAR (data);
262   char *text;
263
264   /* paranoid strdup because set_search_string() sets
265    * the entry text
266    */
267   text = g_strdup (gtk_entry_get_text (entry));
268
269   egg_find_bar_set_search_string (find_bar, text);
270   
271   g_free (text);
272 }
273
274 static void
275 set_focus_cb (GtkWidget *window,
276               GtkWidget *widget,
277               EggFindBar *bar)
278 {
279   GtkWidget *wbar = GTK_WIDGET (bar);
280
281   while (widget != NULL && widget != wbar)
282     {
283       widget = widget->parent;
284     }
285
286   /* if widget == bar, the new focus widget is in the bar, so we
287    * don't deactivate.
288    */
289   if (widget != wbar)
290     {
291       g_signal_emit (bar, find_bar_signals[CLOSE], 0);
292     }
293 }
294
295 static void
296 egg_find_bar_init (EggFindBar *find_bar)
297 {
298   EggFindBarPrivate *priv;
299   GtkWidget *label;
300   GtkWidget *alignment;
301   GtkWidget *box;
302   GtkToolItem *item;
303   GtkWidget *arrow;
304
305   /* Data */
306   priv = EGG_FIND_BAR_GET_PRIVATE (find_bar);
307   
308   find_bar->priv = priv;  
309   priv->search_string = NULL;
310
311   gtk_toolbar_set_style (GTK_TOOLBAR (find_bar), GTK_TOOLBAR_BOTH_HORIZ);
312
313   /* Find: |_____| */
314   item = gtk_tool_item_new ();
315   box = gtk_hbox_new (FALSE, 12);
316   
317   alignment = gtk_alignment_new (0.0, 0.5, 1.0, 0.0);
318   gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 0, 0, 2, 2);
319
320   label = gtk_label_new_with_mnemonic (_("Find:"));
321
322   priv->find_entry = gtk_entry_new ();
323   gtk_entry_set_width_chars (GTK_ENTRY (priv->find_entry), 32);
324   gtk_entry_set_max_length (GTK_ENTRY (priv->find_entry), 512);
325   gtk_label_set_mnemonic_widget (GTK_LABEL (label), priv->find_entry);
326
327   /* Prev */
328   arrow = gtk_arrow_new (GTK_ARROW_LEFT, GTK_SHADOW_NONE);
329   priv->previous_button = gtk_tool_button_new (arrow, Q_("Find Previous"));
330   gtk_tool_item_set_is_important (priv->previous_button, TRUE);
331   gtk_tool_item_set_tooltip (priv->previous_button, GTK_TOOLBAR (find_bar)->tooltips,
332                              _("Find previous occurrence of the search string"),
333                              NULL);
334
335   /* Next */
336   arrow = gtk_arrow_new (GTK_ARROW_RIGHT, GTK_SHADOW_NONE);
337   priv->next_button = gtk_tool_button_new (arrow, Q_("Find Next"));
338   gtk_tool_item_set_is_important (priv->next_button, TRUE);
339   gtk_tool_item_set_tooltip (priv->next_button, GTK_TOOLBAR (find_bar)->tooltips,
340                              _("Find next occurrence of the search string"),
341                              NULL);
342
343   /* Separator*/
344   priv->status_separator = gtk_separator_tool_item_new();
345
346   /* Case button */
347   priv->case_button = gtk_toggle_tool_button_new ();
348   g_object_set (G_OBJECT (priv->case_button), "label", _("C_ase Sensitive"), NULL);
349   gtk_tool_item_set_is_important (priv->case_button, TRUE);
350   gtk_tool_item_set_tooltip (priv->case_button, GTK_TOOLBAR (find_bar)->tooltips,
351                              _("Toggle case sensitive search"),
352                              NULL);
353   /* Status */
354   priv->status_item = gtk_tool_item_new();
355   gtk_tool_item_set_expand (priv->status_item, TRUE);
356   priv->status_label = gtk_label_new (NULL);
357   gtk_label_set_ellipsize (GTK_LABEL (priv->status_label),
358                            PANGO_ELLIPSIZE_END);
359   gtk_misc_set_alignment (GTK_MISC (priv->status_label), 0.0, 0.5);
360
361
362   g_signal_connect (priv->find_entry, "changed",
363                     G_CALLBACK (entry_changed_callback),
364                     find_bar);
365   g_signal_connect (priv->find_entry, "activate",
366                     G_CALLBACK (entry_activate_callback),
367                     find_bar);
368   g_signal_connect (priv->next_button, "clicked",
369                     G_CALLBACK (next_clicked_callback),
370                     find_bar);
371   g_signal_connect (priv->previous_button, "clicked",
372                     G_CALLBACK (previous_clicked_callback),
373                     find_bar);
374   g_signal_connect (priv->case_button, "toggled",
375                     G_CALLBACK (case_sensitive_toggled_callback),
376                     find_bar);
377
378   gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0);
379   gtk_box_pack_start (GTK_BOX (box), priv->find_entry, TRUE, TRUE, 0);
380   gtk_container_add (GTK_CONTAINER (alignment), box);
381   gtk_container_add (GTK_CONTAINER (item), alignment);
382   gtk_toolbar_insert (GTK_TOOLBAR (find_bar), item, -1);
383   gtk_toolbar_insert (GTK_TOOLBAR (find_bar), priv->previous_button, -1);
384   gtk_toolbar_insert (GTK_TOOLBAR (find_bar), priv->next_button, -1);
385   gtk_toolbar_insert (GTK_TOOLBAR (find_bar), priv->case_button, -1);
386   gtk_toolbar_insert (GTK_TOOLBAR (find_bar), priv->status_separator, -1);
387   gtk_container_add  (GTK_CONTAINER (priv->status_item), priv->status_label);
388   gtk_toolbar_insert (GTK_TOOLBAR (find_bar), priv->status_item, -1);
389
390   /* don't show status separator/label until they are set */
391
392   gtk_widget_show_all (GTK_WIDGET (item));
393   gtk_widget_show_all (GTK_WIDGET (priv->next_button));
394   gtk_widget_show_all (GTK_WIDGET (priv->previous_button));
395   gtk_widget_show (priv->status_label);
396 }
397
398 static void
399 egg_find_bar_finalize (GObject *object)
400 {
401   EggFindBar *find_bar = EGG_FIND_BAR (object);
402   EggFindBarPrivate *priv = (EggFindBarPrivate *)find_bar->priv;
403
404   g_free (priv->search_string);
405
406   G_OBJECT_CLASS (egg_find_bar_parent_class)->finalize (object);
407 }
408
409 static void
410 egg_find_bar_set_property (GObject      *object,
411                            guint         prop_id,
412                            const GValue *value,
413                            GParamSpec   *pspec)
414 {
415   EggFindBar *find_bar = EGG_FIND_BAR (object);
416
417   switch (prop_id)
418     {
419     case PROP_SEARCH_STRING:
420       egg_find_bar_set_search_string (find_bar, g_value_get_string (value));
421       break;
422     case PROP_CASE_SENSITIVE:
423       egg_find_bar_set_case_sensitive (find_bar, g_value_get_boolean (value));
424       break;
425     default:
426       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
427       break;
428     }
429 }
430
431 static void
432 egg_find_bar_get_property (GObject    *object,
433                            guint       prop_id,
434                            GValue     *value,
435                            GParamSpec *pspec)
436 {
437   EggFindBar *find_bar = EGG_FIND_BAR (object);
438   EggFindBarPrivate *priv = (EggFindBarPrivate *)find_bar->priv;
439
440   switch (prop_id)
441     {
442     case PROP_SEARCH_STRING:
443       g_value_set_string (value, priv->search_string);
444       break;
445     case PROP_CASE_SENSITIVE:
446       g_value_set_boolean (value, priv->case_sensitive);
447       break;
448     default:
449       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
450       break;
451     }
452 }
453
454 static void
455 egg_find_bar_show (GtkWidget *widget)
456 {
457   EggFindBar *bar = EGG_FIND_BAR (widget);
458   EggFindBarPrivate *priv = bar->priv;
459
460   GTK_WIDGET_CLASS (egg_find_bar_parent_class)->show (widget);
461
462   if (priv->set_focus_handler == 0)
463     {
464       GtkWidget *toplevel;
465
466       toplevel = gtk_widget_get_toplevel (widget);
467
468       priv->set_focus_handler =
469         g_signal_connect (toplevel, "set-focus",
470                           G_CALLBACK (set_focus_cb), bar);
471     }
472 }
473
474 static void
475 egg_find_bar_hide (GtkWidget *widget)
476 {
477   EggFindBar *bar = EGG_FIND_BAR (widget);
478   EggFindBarPrivate *priv = bar->priv;
479
480   if (priv->set_focus_handler != 0)
481     {
482       GtkWidget *toplevel;
483
484       toplevel = gtk_widget_get_toplevel (widget);
485
486       g_signal_handlers_disconnect_by_func
487         (toplevel, (void (*)) G_CALLBACK (set_focus_cb), bar);
488       priv->set_focus_handler = 0;
489     }
490
491   GTK_WIDGET_CLASS (egg_find_bar_parent_class)->hide (widget);
492 }
493
494 static void
495 egg_find_bar_grab_focus (GtkWidget *widget)
496 {
497   EggFindBar *find_bar = EGG_FIND_BAR (widget);
498   EggFindBarPrivate *priv = find_bar->priv;
499
500   gtk_widget_grab_focus (priv->find_entry);
501 }
502
503 /**
504  * egg_find_bar_new:
505  *
506  * Creates a new #EggFindBar.
507  *
508  * Returns: a newly created #EggFindBar
509  *
510  * Since: 2.6
511  */
512 GtkWidget *
513 egg_find_bar_new (void)
514 {
515   EggFindBar *find_bar;
516
517   find_bar = g_object_new (EGG_TYPE_FIND_BAR, NULL);
518
519   return GTK_WIDGET (find_bar);
520 }
521
522 /**
523  * egg_find_bar_set_search_string:
524  *
525  * Sets the string that should be found/highlighted in the document.
526  * Empty string is converted to NULL.
527  *
528  * Since: 2.6
529  */
530 void
531 egg_find_bar_set_search_string  (EggFindBar *find_bar,
532                                  const char *search_string)
533 {
534   EggFindBarPrivate *priv;
535
536   g_return_if_fail (EGG_IS_FIND_BAR (find_bar));
537
538   priv = (EggFindBarPrivate *)find_bar->priv;
539
540   g_object_freeze_notify (G_OBJECT (find_bar));
541   
542   if (priv->search_string != search_string)
543     {
544       char *old;
545       
546       old = priv->search_string;
547
548       if (search_string && *search_string == '\0')
549         search_string = NULL;
550
551       /* Only update if the string has changed; setting the entry
552        * will emit changed on the entry which will re-enter
553        * this function, but we'll handle that fine with this
554        * short-circuit.
555        */
556       if ((old && search_string == NULL) ||
557           (old == NULL && search_string) ||
558           (old && search_string &&
559            strcmp (old, search_string) != 0))
560         {
561           gboolean not_empty;
562           
563           priv->search_string = g_strdup (search_string);
564           g_free (old);
565           
566           gtk_entry_set_text (GTK_ENTRY (priv->find_entry),
567                               priv->search_string ?
568                               priv->search_string :
569                               "");
570            
571           not_empty = (search_string == NULL) ? FALSE : TRUE;            
572
573           gtk_widget_set_sensitive (GTK_WIDGET (find_bar->priv->next_button), not_empty);
574           gtk_widget_set_sensitive (GTK_WIDGET (find_bar->priv->previous_button), not_empty);
575
576           g_object_notify (G_OBJECT (find_bar),
577                            "search_string");
578         }
579     }
580
581   g_object_thaw_notify (G_OBJECT (find_bar));
582 }
583
584
585 /**
586  * egg_find_bar_get_search_string:
587  *
588  * Gets the string that should be found/highlighted in the document.
589  *
590  * Returns: the string
591  *
592  * Since: 2.6
593  */
594 const char*
595 egg_find_bar_get_search_string  (EggFindBar *find_bar)
596 {
597   EggFindBarPrivate *priv;
598
599   g_return_val_if_fail (EGG_IS_FIND_BAR (find_bar), NULL);
600
601   priv = find_bar->priv;
602
603   return priv->search_string ? priv->search_string : "";
604 }
605
606 /**
607  * egg_find_bar_set_case_sensitive:
608  *
609  * Sets whether the search is case sensitive
610  *
611  * Since: 2.6
612  */
613 void
614 egg_find_bar_set_case_sensitive (EggFindBar *find_bar,
615                                  gboolean    case_sensitive)
616 {
617   EggFindBarPrivate *priv;
618
619   g_return_if_fail (EGG_IS_FIND_BAR (find_bar));
620
621   priv = (EggFindBarPrivate *)find_bar->priv;
622
623   g_object_freeze_notify (G_OBJECT (find_bar));
624
625   case_sensitive = case_sensitive != FALSE;
626
627   if (priv->case_sensitive != case_sensitive)
628     {
629       priv->case_sensitive = case_sensitive;
630
631       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->case_button),
632                                     priv->case_sensitive);
633
634       g_object_notify (G_OBJECT (find_bar),
635                        "case_sensitive");
636     }
637
638   g_object_thaw_notify (G_OBJECT (find_bar));
639 }
640
641 /**
642  * egg_find_bar_get_case_sensitive:
643  *
644  * Gets whether the search is case sensitive
645  *
646  * Returns: TRUE if it's case sensitive
647  *
648  * Since: 2.6
649  */
650 gboolean
651 egg_find_bar_get_case_sensitive (EggFindBar *find_bar)
652 {
653   EggFindBarPrivate *priv;
654
655   g_return_val_if_fail (EGG_IS_FIND_BAR (find_bar), FALSE);
656
657   priv = (EggFindBarPrivate *)find_bar->priv;
658
659   return priv->case_sensitive;
660 }
661
662 static void
663 get_style_color (EggFindBar *find_bar,
664                  const char *style_prop_name,
665                  GdkColor   *color)
666 {
667   GdkColor *style_color;
668
669   gtk_widget_ensure_style (GTK_WIDGET (find_bar));
670   gtk_widget_style_get (GTK_WIDGET (find_bar),
671                         "color", &style_color, NULL);
672   if (style_color)
673     {
674       *color = *style_color;
675       gdk_color_free (style_color);
676     }
677 }
678
679 /**
680  * egg_find_bar_get_all_matches_color:
681  *
682  * Gets the color to use to highlight all the
683  * known matches.
684  *
685  * Since: 2.6
686  */
687 void
688 egg_find_bar_get_all_matches_color (EggFindBar *find_bar,
689                                     GdkColor   *color)
690 {
691   GdkColor found_color = { 0, 0, 0, 0x0f0f };
692
693   get_style_color (find_bar, "all_matches_color", &found_color);
694
695   *color = found_color;
696 }
697
698 /**
699  * egg_find_bar_get_current_match_color:
700  *
701  * Gets the color to use to highlight the match
702  * we're currently on.
703  *
704  * Since: 2.6
705  */
706 void
707 egg_find_bar_get_current_match_color (EggFindBar *find_bar,
708                                       GdkColor   *color)
709 {
710   GdkColor found_color = { 0, 0, 0, 0xffff };
711
712   get_style_color (find_bar, "current_match_color", &found_color);
713
714   *color = found_color;
715 }
716
717 /**
718  * egg_find_bar_set_status_text:
719  *
720  * Sets some text to display if there's space; typical text would
721  * be something like "5 results on this page" or "No results"
722  *
723  * @text: the text to display
724  *
725  * Since: 2.6
726  */
727 void
728 egg_find_bar_set_status_text (EggFindBar *find_bar,
729                               const char *text)
730 {
731   EggFindBarPrivate *priv;
732
733   g_return_if_fail (EGG_IS_FIND_BAR (find_bar));
734
735   priv = (EggFindBarPrivate *)find_bar->priv;
736   
737   gtk_label_set_text (GTK_LABEL (priv->status_label), text);
738   g_object_set (priv->status_separator, "visible", text != NULL && *text != '\0', NULL);
739   g_object_set (priv->status_item, "visible", text != NULL && *text !='\0', NULL);
740 }