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