77
EPHY_FIND_NOTFOUND = 1,
78
EPHY_FIND_FOUNDWRAPPED = 2
79
} EphyEmbedFindResult;
76
EPHY_FIND_RESULT_FOUND = 0,
77
EPHY_FIND_RESULT_NOTFOUND = 1,
78
EPHY_FIND_RESULT_FOUNDWRAPPED = 2
83
EPHY_FIND_DIRECTION_NEXT,
84
EPHY_FIND_DIRECTION_PREV
81
87
static guint signals[LAST_SIGNAL];
239
245
webkit_web_view_set_highlight_text_matches (web_view, TRUE);
242
static EphyEmbedFindResult
248
static EphyFindResult
243
249
real_find (EphyFindToolbarPrivate *priv,
250
EphyFindDirection direction)
246
252
WebKitWebView *web_view = priv->web_view;
247
253
gboolean case_sensitive = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->case_sensitive));
254
gboolean forward = (direction == EPHY_FIND_DIRECTION_NEXT);
249
256
if (!priv->find_string || !g_strcmp0 (priv->find_string, ""))
250
return EPHY_FIND_NOTFOUND;
257
return EPHY_FIND_RESULT_NOTFOUND;
252
259
if (!webkit_web_view_search_text
253
260
(web_view, priv->find_string, case_sensitive, forward, FALSE)) {
255
262
if (!webkit_web_view_search_text
256
263
(web_view, priv->find_string, case_sensitive, forward, TRUE)) {
257
264
/* there's no result */
258
return EPHY_FIND_NOTFOUND;
265
return EPHY_FIND_RESULT_NOTFOUND;
260
267
/* found wrapped */
261
return EPHY_FIND_FOUNDWRAPPED;
268
return EPHY_FIND_RESULT_FOUNDWRAPPED;
265
return EPHY_FIND_FOUND;
272
return EPHY_FIND_RESULT_FOUND;
269
276
do_search (EphyFindToolbar *toolbar)
271
278
EphyFindToolbarPrivate *priv = toolbar->priv;
272
EphyEmbedFindResult result;
279
EphyFindResult result;
274
281
priv->find_source_id = 0;
276
283
ephy_find_toolbar_mark_matches (toolbar);
278
result = real_find (priv, TRUE);
285
result = real_find (priv, EPHY_FIND_DIRECTION_NEXT);
279
286
set_status (toolbar, result);
430
437
if (case_sensitive)
432
EphyEmbedFindResult result;
439
EphyFindResult result;
434
result = real_find (toolbar->priv, FALSE);
435
if (result != EPHY_FIND_NOTFOUND)
436
result = real_find (toolbar->priv, TRUE);
441
result = real_find (toolbar->priv, EPHY_FIND_DIRECTION_PREV);
442
if (result != EPHY_FIND_RESULT_NOTFOUND)
443
result = real_find (toolbar->priv,
444
EPHY_FIND_DIRECTION_NEXT);
438
446
set_status (toolbar, result);
787
796
g_slice_free (FindAgainCBStruct, data);
790
static EphyEmbedFindResult
791
ephy_find_toolbar_find_again (EphyFindToolbar *toolbar,
795
EphyFindToolbarPrivate *priv = toolbar->priv;
797
return real_find (priv, forward);
801
800
find_again_cb (FindAgainCBStruct *data)
803
EphyEmbedFindResult result;
802
EphyFindResult result;
804
803
EphyFindToolbarPrivate *priv = data->toolbar->priv;
806
result = ephy_find_toolbar_find_again (data->toolbar, data->next,
805
result = real_find (priv, data->direction);
807
/* Highlight matches again if the toolbar was hidden when the user
808
* requested find-again. */
809
if (result != EPHY_FIND_RESULT_NOTFOUND && data->highlight)
810
ephy_find_toolbar_mark_matches (data->toolbar);
808
812
set_status (data->toolbar, result);
810
814
priv->find_again_source_id = 0;
820
find_again (EphyFindToolbar *toolbar, EphyFindDirection direction)
822
GtkWidget *widget = GTK_WIDGET (toolbar);
823
EphyFindToolbarPrivate *priv = toolbar->priv;
824
FindAgainCBStruct *data;
827
visible = gtk_widget_get_visible (widget);
829
gtk_widget_show (widget);
830
gtk_widget_grab_focus (widget);
833
/* We need to do this to give time to the embed to sync with the size
834
* change due to the toolbar being shown, otherwise the toolbar can
835
* obscure the result. See GNOME bug #415074.
837
if (priv->find_again_source_id != 0) return;
839
data = g_slice_new0 (FindAgainCBStruct);
840
data->toolbar = toolbar;
841
data->direction = direction;
842
data->highlight = !visible;
844
priv->find_again_source_id = g_idle_add_full (G_PRIORITY_DEFAULT_IDLE,
845
(GSourceFunc) find_again_cb,
847
(GDestroyNotify) find_again_data_destroy_cb);
816
851
ephy_find_toolbar_find_next (EphyFindToolbar *toolbar)
818
GtkWidget *widget = GTK_WIDGET (toolbar);
819
EphyFindToolbarPrivate *priv = toolbar->priv;
820
FindAgainCBStruct *data;
822
if (!gtk_widget_get_visible (widget)) {
823
gtk_widget_show (widget);
824
gtk_widget_grab_focus (widget);
827
/* We need to do this here (and in find_previous) to give time to the embed
828
* to sync with the size change due to the toolbar being shown, otherwise
829
* the toolbar can obscure the result. See GNOME bug #415074.
832
if (priv->find_again_source_id != 0) return;
834
data = g_slice_new0 (FindAgainCBStruct);
835
data->toolbar = toolbar;
838
priv->find_again_source_id = g_idle_add_full (G_PRIORITY_DEFAULT_IDLE,
839
(GSourceFunc) find_again_cb,
841
(GDestroyNotify) find_again_data_destroy_cb);
853
find_again (toolbar, EPHY_FIND_DIRECTION_NEXT);
845
857
ephy_find_toolbar_find_previous (EphyFindToolbar *toolbar)
847
GtkWidget *widget = GTK_WIDGET (toolbar);
848
EphyFindToolbarPrivate *priv = toolbar->priv;
849
FindAgainCBStruct *data;
851
if (!gtk_widget_get_visible (widget)) {
852
gtk_widget_show (widget);
853
gtk_widget_grab_focus (widget);
856
if (priv->find_again_source_id != 0) return;
858
data = g_slice_new0 (FindAgainCBStruct);
859
data->toolbar = toolbar;
862
priv->find_again_source_id = g_idle_add_full (G_PRIORITY_DEFAULT_IDLE,
863
(GSourceFunc) find_again_cb,
865
(GDestroyNotify) find_again_data_destroy_cb);
859
find_again (toolbar, EPHY_FIND_DIRECTION_PREV);