]> www.fi.muni.cz Git - evince.git/blob - shell/eggfindbar.c
Hungarian translation updated.
[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
33 #include <string.h>
34
35 struct _EggFindBarPrivate
36 {
37   gchar *search_string;
38   GtkWidget *hbox;
39   GtkWidget *find_entry;
40   GtkWidget *next_button;
41   GtkWidget *previous_button;
42   GtkWidget *case_button;
43   GtkWidget *status_separator;
44   GtkWidget *status_label;
45   gulong set_focus_handler;
46   guint case_sensitive : 1;
47 };
48
49 #define EGG_FIND_BAR_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), EGG_TYPE_FIND_BAR, EggFindBarPrivate))
50
51
52 enum
53   {
54     PROP_0,
55     PROP_SEARCH_STRING,
56     PROP_CASE_SENSITIVE
57   };
58
59 static void egg_find_bar_finalize      (GObject        *object);
60 static void egg_find_bar_get_property  (GObject        *object,
61                                         guint           prop_id,
62                                         GValue         *value,
63                                         GParamSpec     *pspec);
64 static void egg_find_bar_set_property  (GObject        *object,
65                                         guint           prop_id,
66                                         const GValue   *value,
67                                         GParamSpec     *pspec);
68 static void egg_find_bar_size_request  (GtkWidget      *widget,
69                                         GtkRequisition *requisition);
70 static void egg_find_bar_size_allocate (GtkWidget      *widget,
71                                         GtkAllocation  *allocation);
72 static void egg_find_bar_show          (GtkWidget *widget);
73 static void egg_find_bar_hide          (GtkWidget *widget);
74 static void egg_find_bar_grab_focus    (GtkWidget *widget);
75
76 G_DEFINE_TYPE (EggFindBar, egg_find_bar, GTK_TYPE_BIN);
77
78 enum
79   {
80     NEXT,
81     PREVIOUS,
82     CLOSE,
83     LAST_SIGNAL
84   };
85
86 static guint find_bar_signals[LAST_SIGNAL] = { 0 };
87
88 static void
89 egg_find_bar_class_init (EggFindBarClass *klass)
90 {
91   GObjectClass *object_class;
92   GtkWidgetClass *widget_class;
93   GtkBinClass *bin_class;
94   GtkBindingSet *binding_set;
95         
96   egg_find_bar_parent_class = g_type_class_peek_parent (klass);
97
98   object_class = (GObjectClass *)klass;
99   widget_class = (GtkWidgetClass *)klass;
100   bin_class = (GtkBinClass *)klass;
101
102   object_class->set_property = egg_find_bar_set_property;
103   object_class->get_property = egg_find_bar_get_property;
104
105   object_class->finalize = egg_find_bar_finalize;
106
107   widget_class->size_request = egg_find_bar_size_request;
108   widget_class->size_allocate = egg_find_bar_size_allocate;
109   widget_class->show = egg_find_bar_show;
110   widget_class->hide = egg_find_bar_hide;
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
138   /**
139    * EggFindBar:search_string:
140    *
141    * The current string to search for. NULL or empty string
142    * both mean no current string.
143    *
144    */
145   g_object_class_install_property (object_class,
146                                    PROP_SEARCH_STRING,
147                                    g_param_spec_string ("search_string",
148                                                         _("Search string"),
149                                                         _("The name of the string to be found"),
150                                                         NULL,
151                                                         G_PARAM_READWRITE));
152
153   /**
154    * EggFindBar:case_sensitive:
155    *
156    * TRUE for a case sensitive search.
157    *
158    */
159   g_object_class_install_property (object_class,
160                                    PROP_CASE_SENSITIVE,
161                                    g_param_spec_boolean ("case_sensitive",
162                                                          _("Case sensitive"),
163                                                          _("TRUE for a case sensitive search"),
164                                                          FALSE,
165                                                          G_PARAM_READWRITE));
166
167   /* Style properties */
168   gtk_widget_class_install_style_property (widget_class,
169                                            g_param_spec_boxed ("all_matches_color",
170                                                                _("Highlight color"),
171                                                                _("Color of highlight for all matches"),
172                                                                GDK_TYPE_COLOR,
173                                                                G_PARAM_READABLE));
174
175   gtk_widget_class_install_style_property (widget_class,
176                                            g_param_spec_boxed ("current_match_color",
177                                                                _("Current color"),
178                                                                _("Color of highlight for the current match"),
179                                                                GDK_TYPE_COLOR,
180                                                                G_PARAM_READABLE));
181
182   g_type_class_add_private (object_class, sizeof (EggFindBarPrivate));
183
184   binding_set = gtk_binding_set_by_class (klass);
185
186   gtk_binding_entry_add_signal (binding_set, GDK_Escape, 0,
187                                 "close", 0);
188 }
189
190 static void
191 egg_find_bar_emit_next (EggFindBar *find_bar)
192 {
193   g_signal_emit (find_bar, find_bar_signals[NEXT], 0);
194 }
195
196 static void
197 egg_find_bar_emit_previous (EggFindBar *find_bar)
198 {
199   g_signal_emit (find_bar, find_bar_signals[PREVIOUS], 0);
200 }
201
202 static void
203 next_clicked_callback (GtkButton *button,
204                        void      *data)
205 {
206   EggFindBar *find_bar = EGG_FIND_BAR (data);
207
208   egg_find_bar_emit_next (find_bar);
209 }
210
211 static void
212 previous_clicked_callback (GtkButton *button,
213                            void      *data)
214 {
215   EggFindBar *find_bar = EGG_FIND_BAR (data);
216
217   egg_find_bar_emit_previous (find_bar);
218 }
219
220 static void
221 case_sensitive_toggled_callback (GtkCheckButton *button,
222                                  void           *data)
223 {
224   EggFindBar *find_bar = EGG_FIND_BAR (data);
225
226   egg_find_bar_set_case_sensitive (find_bar,
227                                    gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)));
228 }
229
230 static void
231 entry_activate_callback (GtkEntry *entry,
232                           void     *data)
233 {
234   EggFindBar *find_bar = EGG_FIND_BAR (data);
235   EggFindBarPrivate *priv = (EggFindBarPrivate *)find_bar->priv;
236
237   /* We activate the "next" button here so we'll get a nice
238      animation */
239   if (find_bar->priv->search_string != NULL)
240           gtk_widget_activate (priv->next_button);
241 }
242
243 static void
244 entry_changed_callback (GtkEntry *entry,
245                         void     *data)
246 {
247   EggFindBar *find_bar = EGG_FIND_BAR (data);
248   char *text;
249
250   /* paranoid strdup because set_search_string() sets
251    * the entry text
252    */
253   text = g_strdup (gtk_entry_get_text (entry));
254
255   egg_find_bar_set_search_string (find_bar, text);
256   
257   g_free (text);
258 }
259
260 static void
261 set_focus_cb (GtkWidget *window,
262               GtkWidget *widget,
263               EggFindBar *bar)
264 {
265   GtkWidget *wbar = GTK_WIDGET (bar);
266
267   while (widget != NULL && widget != wbar)
268     {
269       widget = widget->parent;
270     }
271
272   /* if widget == bar, the new focus widget is in the bar, so we
273    * don't deactivate.
274    */
275   if (widget != wbar)
276     {
277       g_signal_emit (bar, find_bar_signals[CLOSE], 0);
278     }
279 }
280
281 static void
282 egg_find_bar_init (EggFindBar *find_bar)
283 {
284   EggFindBarPrivate *priv;
285   GtkWidget *label;
286   GtkWidget *separator;
287   GtkWidget *image_back;
288   GtkWidget *image_forward;
289
290   /* Data */
291   priv = EGG_FIND_BAR_GET_PRIVATE (find_bar);
292   find_bar->priv = priv;
293
294   priv->search_string = NULL;
295
296   /* Widgets */
297   gtk_widget_push_composite_child ();
298   priv->hbox = gtk_hbox_new (FALSE, 6);
299   gtk_container_set_border_width (GTK_CONTAINER (priv->hbox), 3);
300
301   label = gtk_label_new_with_mnemonic (_("F_ind:"));
302   separator = gtk_vseparator_new ();
303
304   priv->find_entry = gtk_entry_new ();
305   gtk_label_set_mnemonic_widget (GTK_LABEL (label), priv->find_entry);
306
307   priv->previous_button = gtk_button_new_with_mnemonic (_("_Previous"));
308   gtk_button_set_focus_on_click (GTK_BUTTON (priv->previous_button), FALSE);
309   gtk_widget_set_sensitive (GTK_WIDGET (priv->previous_button), FALSE);
310
311   priv->next_button = gtk_button_new_with_mnemonic (_("_Next"));
312   gtk_button_set_focus_on_click (GTK_BUTTON (priv->next_button), FALSE);
313   gtk_widget_set_sensitive (GTK_WIDGET (priv->next_button), FALSE);
314
315   image_back = gtk_image_new_from_stock (GTK_STOCK_GO_BACK,
316                                          GTK_ICON_SIZE_BUTTON);
317   image_forward = gtk_image_new_from_stock (GTK_STOCK_GO_FORWARD,
318                                             GTK_ICON_SIZE_BUTTON);
319
320   gtk_button_set_image (GTK_BUTTON (priv->previous_button),
321                         image_back);
322   gtk_button_set_image (GTK_BUTTON (priv->next_button),
323                         image_forward);
324   
325   priv->case_button = gtk_check_button_new_with_mnemonic (_("C_ase Sensitive"));
326
327   priv->status_separator = gtk_vseparator_new ();
328
329   priv->status_label = gtk_label_new (NULL);
330   gtk_label_set_ellipsize (GTK_LABEL (priv->status_label),
331                            PANGO_ELLIPSIZE_END);
332   gtk_misc_set_alignment (GTK_MISC (priv->status_label), 0.0, 0.5);
333   
334 #if 0
335  {
336    GtkWidget *button_label;
337    /* This hack doesn't work because GtkCheckButton doesn't pass the
338     * larger size allocation to the label, it always gives the label
339     * its exact request. If you un-ifdef this, set the box back
340     * on case_button to TRUE, TRUE below
341     */
342    button_label = gtk_bin_get_child (GTK_BIN (priv->case_button));
343    gtk_label_set_ellipsize (GTK_LABEL (button_label),
344                             PANGO_ELLIPSIZE_END);
345  }
346 #endif
347
348   gtk_box_pack_start (GTK_BOX (priv->hbox),
349                       label, FALSE, FALSE, 0);
350   gtk_box_pack_start (GTK_BOX (priv->hbox),
351                       priv->find_entry, FALSE, FALSE, 0);
352   gtk_box_pack_start (GTK_BOX (priv->hbox),
353                       priv->previous_button, FALSE, FALSE, 0);
354   gtk_box_pack_start (GTK_BOX (priv->hbox),
355                       priv->next_button, FALSE, FALSE, 0);
356   gtk_box_pack_start (GTK_BOX (priv->hbox),
357                       separator, FALSE, FALSE, 0);
358   gtk_box_pack_start (GTK_BOX (priv->hbox),
359                       priv->case_button, FALSE, FALSE, 0);
360   gtk_box_pack_start (GTK_BOX (priv->hbox),
361                       priv->status_separator, FALSE, FALSE, 0);
362   gtk_box_pack_start (GTK_BOX (priv->hbox),
363                       priv->status_label, TRUE, TRUE, 0);
364   
365   gtk_container_add (GTK_CONTAINER (find_bar), priv->hbox);
366
367   gtk_widget_show (priv->hbox);
368   gtk_widget_show (priv->find_entry);
369   gtk_widget_show (priv->previous_button);
370   gtk_widget_show (priv->next_button);
371   gtk_widget_show (separator);
372   gtk_widget_show (label);
373   gtk_widget_show (image_back);
374   gtk_widget_show (image_forward);
375   /* don't show status separator/label until they are set */
376
377   gtk_widget_pop_composite_child ();
378
379   g_signal_connect (priv->find_entry, "changed",
380                     G_CALLBACK (entry_changed_callback),
381                     find_bar);
382   g_signal_connect (priv->find_entry, "activate",
383                     G_CALLBACK (entry_activate_callback),
384                     find_bar);
385   g_signal_connect (priv->next_button, "clicked",
386                     G_CALLBACK (next_clicked_callback),
387                     find_bar);
388   g_signal_connect (priv->previous_button, "clicked",
389                     G_CALLBACK (previous_clicked_callback),
390                     find_bar);
391   g_signal_connect (priv->case_button, "toggled",
392                     G_CALLBACK (case_sensitive_toggled_callback),
393                     find_bar);
394 }
395
396 static void
397 egg_find_bar_finalize (GObject *object)
398 {
399   EggFindBar *find_bar = EGG_FIND_BAR (object);
400   EggFindBarPrivate *priv = (EggFindBarPrivate *)find_bar->priv;
401
402   g_free (priv->search_string);
403
404   G_OBJECT_CLASS (egg_find_bar_parent_class)->finalize (object);
405 }
406
407 static void
408 egg_find_bar_set_property (GObject      *object,
409                            guint         prop_id,
410                            const GValue *value,
411                            GParamSpec   *pspec)
412 {
413   EggFindBar *find_bar = EGG_FIND_BAR (object);
414
415   switch (prop_id)
416     {
417     case PROP_SEARCH_STRING:
418       egg_find_bar_set_search_string (find_bar, g_value_get_string (value));
419       break;
420     case PROP_CASE_SENSITIVE:
421       egg_find_bar_set_case_sensitive (find_bar, g_value_get_boolean (value));
422       break;
423     default:
424       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
425       break;
426     }
427 }
428
429 static void
430 egg_find_bar_get_property (GObject    *object,
431                            guint       prop_id,
432                            GValue     *value,
433                            GParamSpec *pspec)
434 {
435   EggFindBar *find_bar = EGG_FIND_BAR (object);
436   EggFindBarPrivate *priv = (EggFindBarPrivate *)find_bar->priv;
437
438   switch (prop_id)
439     {
440     case PROP_SEARCH_STRING:
441       g_value_set_string (value, priv->search_string);
442       break;
443     case PROP_CASE_SENSITIVE:
444       g_value_set_boolean (value, priv->case_sensitive);
445       break;
446     default:
447       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
448       break;
449     }
450 }
451
452 static void
453 egg_find_bar_size_request (GtkWidget      *widget,
454                            GtkRequisition *requisition)
455 {
456   GtkBin *bin = GTK_BIN (widget);
457   GtkRequisition child_requisition;
458   if (bin->child && GTK_WIDGET_VISIBLE (bin->child))
459     {
460       gtk_widget_size_request (bin->child, &child_requisition);
461
462       *requisition = child_requisition;
463     }
464   else
465     {
466       requisition->width = 0;
467       requisition->height = 0;
468     }
469 }
470
471 static void
472 egg_find_bar_size_allocate (GtkWidget     *widget,
473                             GtkAllocation *allocation)
474 {
475   GtkBin *bin = GTK_BIN (widget);
476
477   widget->allocation = *allocation;
478
479   if (bin->child && GTK_WIDGET_VISIBLE (bin->child))
480     gtk_widget_size_allocate (bin->child, allocation);
481 }
482
483 static void
484 egg_find_bar_show (GtkWidget *widget)
485 {
486   EggFindBar *bar = EGG_FIND_BAR (widget);
487   EggFindBarPrivate *priv = bar->priv;
488
489   GTK_WIDGET_CLASS (egg_find_bar_parent_class)->show (widget);
490
491   if (priv->set_focus_handler == 0)
492     {
493       GtkWidget *toplevel;
494
495       toplevel = gtk_widget_get_toplevel (widget);
496
497       priv->set_focus_handler =
498         g_signal_connect (toplevel, "set-focus",
499                           G_CALLBACK (set_focus_cb), bar);
500     }
501 }
502
503 static void
504 egg_find_bar_hide (GtkWidget *widget)
505 {
506   EggFindBar *bar = EGG_FIND_BAR (widget);
507   EggFindBarPrivate *priv = bar->priv;
508
509   if (priv->set_focus_handler != 0)
510     {
511       GtkWidget *toplevel;
512
513       toplevel = gtk_widget_get_toplevel (widget);
514
515       g_signal_handlers_disconnect_by_func
516         (toplevel, (void (*)) G_CALLBACK (set_focus_cb), bar);
517       priv->set_focus_handler = 0;
518     }
519
520   GTK_WIDGET_CLASS (egg_find_bar_parent_class)->hide (widget);
521 }
522
523 static void
524 egg_find_bar_grab_focus (GtkWidget *widget)
525 {
526   EggFindBar *find_bar = EGG_FIND_BAR (widget);
527   EggFindBarPrivate *priv = find_bar->priv;
528
529   gtk_widget_grab_focus (priv->find_entry);
530 }
531
532 /**
533  * egg_find_bar_new:
534  *
535  * Creates a new #EggFindBar.
536  *
537  * Returns: a newly created #EggFindBar
538  *
539  * Since: 2.6
540  */
541 GtkWidget *
542 egg_find_bar_new (void)
543 {
544   EggFindBar *find_bar;
545
546   find_bar = g_object_new (EGG_TYPE_FIND_BAR, NULL);
547
548   return GTK_WIDGET (find_bar);
549 }
550
551 /**
552  * egg_find_bar_set_search_string:
553  *
554  * Sets the string that should be found/highlighted in the document.
555  * Empty string is converted to NULL.
556  *
557  * Since: 2.6
558  */
559 void
560 egg_find_bar_set_search_string  (EggFindBar *find_bar,
561                                  const char *search_string)
562 {
563   EggFindBarPrivate *priv;
564
565   g_return_if_fail (EGG_IS_FIND_BAR (find_bar));
566
567   priv = (EggFindBarPrivate *)find_bar->priv;
568
569   g_object_freeze_notify (G_OBJECT (find_bar));
570   
571   if (priv->search_string != search_string)
572     {
573       char *old;
574       
575       old = priv->search_string;
576
577       if (search_string && *search_string == '\0')
578         search_string = NULL;
579
580       /* Only update if the string has changed; setting the entry
581        * will emit changed on the entry which will re-enter
582        * this function, but we'll handle that fine with this
583        * short-circuit.
584        */
585       if ((old && search_string == NULL) ||
586           (old == NULL && search_string) ||
587           (old && search_string &&
588            strcmp (old, search_string) != 0))
589         {
590           gboolean not_empty;
591           
592           priv->search_string = g_strdup (search_string);
593           g_free (old);
594           
595           gtk_entry_set_text (GTK_ENTRY (priv->find_entry),
596                               priv->search_string ?
597                               priv->search_string :
598                               "");
599            
600           not_empty = (search_string == NULL) ? FALSE : TRUE;            
601
602           gtk_widget_set_sensitive (GTK_WIDGET (find_bar->priv->next_button), not_empty);
603           gtk_widget_set_sensitive (GTK_WIDGET (find_bar->priv->previous_button), not_empty);
604
605           g_object_notify (G_OBJECT (find_bar),
606                            "search_string");
607         }
608     }
609
610   g_object_thaw_notify (G_OBJECT (find_bar));
611 }
612
613
614 /**
615  * egg_find_bar_get_search_string:
616  *
617  * Gets the string that should be found/highlighted in the document.
618  *
619  * Returns: the string
620  *
621  * Since: 2.6
622  */
623 const char*
624 egg_find_bar_get_search_string  (EggFindBar *find_bar)
625 {
626   EggFindBarPrivate *priv;
627
628   g_return_val_if_fail (EGG_IS_FIND_BAR (find_bar), NULL);
629
630   priv = find_bar->priv;
631
632   return priv->search_string ? priv->search_string : "";
633 }
634
635 /**
636  * egg_find_bar_set_case_sensitive:
637  *
638  * Sets whether the search is case sensitive
639  *
640  * Since: 2.6
641  */
642 void
643 egg_find_bar_set_case_sensitive (EggFindBar *find_bar,
644                                  gboolean    case_sensitive)
645 {
646   EggFindBarPrivate *priv;
647
648   g_return_if_fail (EGG_IS_FIND_BAR (find_bar));
649
650   priv = (EggFindBarPrivate *)find_bar->priv;
651
652   g_object_freeze_notify (G_OBJECT (find_bar));
653
654   case_sensitive = case_sensitive != FALSE;
655
656   if (priv->case_sensitive != case_sensitive)
657     {
658       priv->case_sensitive = case_sensitive;
659
660       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->case_button),
661                                     priv->case_sensitive);
662
663       g_object_notify (G_OBJECT (find_bar),
664                        "case_sensitive");
665     }
666
667   g_object_thaw_notify (G_OBJECT (find_bar));
668 }
669
670 /**
671  * egg_find_bar_get_case_sensitive:
672  *
673  * Gets whether the search is case sensitive
674  *
675  * Returns: TRUE if it's case sensitive
676  *
677  * Since: 2.6
678  */
679 gboolean
680 egg_find_bar_get_case_sensitive (EggFindBar *find_bar)
681 {
682   EggFindBarPrivate *priv;
683
684   g_return_val_if_fail (EGG_IS_FIND_BAR (find_bar), FALSE);
685
686   priv = (EggFindBarPrivate *)find_bar->priv;
687
688   return priv->case_sensitive;
689 }
690
691 static void
692 get_style_color (EggFindBar *find_bar,
693                  const char *style_prop_name,
694                  GdkColor   *color)
695 {
696   GdkColor *style_color;
697
698   gtk_widget_ensure_style (GTK_WIDGET (find_bar));
699   gtk_widget_style_get (GTK_WIDGET (find_bar),
700                         "color", &style_color, NULL);
701   if (style_color)
702     {
703       *color = *style_color;
704       gdk_color_free (style_color);
705     }
706 }
707
708 /**
709  * egg_find_bar_get_all_matches_color:
710  *
711  * Gets the color to use to highlight all the
712  * known matches.
713  *
714  * Since: 2.6
715  */
716 void
717 egg_find_bar_get_all_matches_color (EggFindBar *find_bar,
718                                     GdkColor   *color)
719 {
720   GdkColor found_color = { 0, 0, 0, 0x0f0f };
721
722   get_style_color (find_bar, "all_matches_color", &found_color);
723
724   *color = found_color;
725 }
726
727 /**
728  * egg_find_bar_get_current_match_color:
729  *
730  * Gets the color to use to highlight the match
731  * we're currently on.
732  *
733  * Since: 2.6
734  */
735 void
736 egg_find_bar_get_current_match_color (EggFindBar *find_bar,
737                                       GdkColor   *color)
738 {
739   GdkColor found_color = { 0, 0, 0, 0xffff };
740
741   get_style_color (find_bar, "current_match_color", &found_color);
742
743   *color = found_color;
744 }
745
746 /**
747  * egg_find_bar_set_status_text:
748  *
749  * Sets some text to display if there's space; typical text would
750  * be something like "5 results on this page" or "No results"
751  *
752  * @text: the text to display
753  *
754  * Since: 2.6
755  */
756 void
757 egg_find_bar_set_status_text (EggFindBar *find_bar,
758                               const char *text)
759 {
760   EggFindBarPrivate *priv;
761
762   g_return_if_fail (EGG_IS_FIND_BAR (find_bar));
763
764   priv = (EggFindBarPrivate *)find_bar->priv;
765   
766   if (text == NULL || *text == '\0')
767     {
768       gtk_widget_hide (priv->status_label);
769       gtk_widget_hide (priv->status_separator);
770       gtk_label_set_text (GTK_LABEL (priv->status_label), NULL);
771     }
772   else
773     {
774       gtk_label_set_text (GTK_LABEL (priv->status_label), text);
775       gtk_widget_show (priv->status_label);
776       gtk_widget_show (priv->status_separator);
777     }
778 }