From ff0a79e545356046c7145bff0630a7cd50ad977c Mon Sep 17 00:00:00 2001 From: rootavish Date: Thu, 7 Aug 2014 17:43:55 +0530 Subject: Ability to search through epub documents You can now search through the entire epub document. In the next commit I'm adding support for webkit2 with gtk3. --- libview/ev-web-view.c | 54 +++++++++++++++++++++++++++------------------------ libview/ev-web-view.h | 4 ++-- shell/ev-window.c | 8 +++++--- 3 files changed, 36 insertions(+), 30 deletions(-) diff --git a/libview/ev-web-view.c b/libview/ev-web-view.c index 0756b0f0..e6bef75a 100644 --- a/libview/ev-web-view.c +++ b/libview/ev-web-view.c @@ -436,10 +436,12 @@ jump_to_find_result_on_page(EvWebView *webview,EvWebViewFindDirection direction) webview->search->case_sensitive, forward, wrap); + + webview->search->search_jump = FALSE; } static void -jump_to_find_result(EvWebView *webview, +jump_to_find_results(EvWebView *webview, GParamSpec *pspec, gpointer data) { @@ -496,8 +498,7 @@ ev_web_view_find_get_n_results (EvWebView *webview, gint page) * * Jumps to the first page that has occurences of searched word. * Uses a direction where to look and a shift from current page. - * - */ +**/ static void jump_to_find_page (EvWebView *webview, EvWebViewFindDirection direction, gint shift) { @@ -507,20 +508,22 @@ jump_to_find_page (EvWebView *webview, EvWebViewFindDirection direction, gint sh for (i = 0; i < n_pages; i++) { int page; - + if (direction == EV_WEB_VIEW_FIND_NEXT) page = webview->current_page + i; else page = webview->current_page - i; page += shift; - + if (page >= n_pages) { page = page - n_pages; } else if (page < 0) page = page + n_pages; - if (page == webview->current_page) + if (page == webview->current_page && ev_web_view_find_get_n_results(webview,page) > 0) { jump_to_find_result_on_page(webview,EV_WEB_VIEW_FIND_NEXT); + break; + } if (ev_web_view_find_get_n_results (webview, page) > 0) { webkit_web_view_unmark_text_matches (WEBKIT_WEB_VIEW(webview)); @@ -537,11 +540,9 @@ ev_web_view_find_changed (EvWebView *webview, guint *results, gchar *text,gboole webview->search->results = results; webview->search->search_string = g_strdup(text); webview->search->case_sensitive = case_sensitive; - + webview->search->on_result = 0; if (webview->search->search_jump == TRUE) { jump_to_find_page (webview, EV_WEB_VIEW_FIND_NEXT, 0); - } else { - jump_to_find_result_on_page(webview,EV_WEB_VIEW_FIND_NEXT); } } @@ -576,20 +577,9 @@ ev_web_view_find_previous (EvWebView *webview) } void -ev_web_view_find_search_changed (EvWebView *webview,gboolean visible) +ev_web_view_find_search_changed (EvWebView *webview) { /* search string has changed, focus on new search result */ - if (visible) { - g_signal_connect(webview, - "notify::load-status", - G_CALLBACK(jump_to_find_result), - NULL); - } - else { - g_signal_handlers_disconnect_by_func(webview, - jump_to_find_result, - NULL); - } webkit_web_view_unmark_text_matches(WEBKIT_WEB_VIEW(webview)); webview->search->search_jump = TRUE; @@ -609,14 +599,27 @@ ev_web_view_find_set_highlight_search (EvWebView *webview, gboolean value) void ev_web_view_find_cancel (EvWebView *webview) { - g_signal_handlers_disconnect_by_func(webview, - jump_to_find_result, - NULL); - webkit_web_view_unmark_text_matches(WEBKIT_WEB_VIEW(webview)); ev_web_view_find_set_highlight_search(webview,FALSE); } + +void +ev_web_view_set_handler(EvWebView *webview,gboolean visible) +{ + if (visible) { + g_signal_connect(webview, + "notify::load-status", + G_CALLBACK(jump_to_find_results), + NULL); + } + else { + g_signal_handlers_disconnect_by_func(webview, + jump_to_find_results, + NULL); + } +} + /* Selection */ gboolean ev_web_view_get_has_selection(EvWebView *webview) @@ -642,6 +645,7 @@ ev_web_view_copy(EvWebView *webview) } +/*Zoom control*/ gboolean ev_web_view_zoom_in(EvWebView *webview) { diff --git a/libview/ev-web-view.h b/libview/ev-web-view.h index 751e7381..661ed9d0 100644 --- a/libview/ev-web-view.h +++ b/libview/ev-web-view.h @@ -69,10 +69,10 @@ void ev_web_view_find_changed (EvWebView *webview, gchar *text, gboolean case_sensitive); -void ev_web_view_find_search_changed (EvWebView *webview,gboolean visible); +void ev_web_view_find_search_changed (EvWebView *webview); void ev_web_view_find_cancel (EvWebView *webview); void ev_web_view_find_set_highlight_search (EvWebView *webview,gboolean visible); - +void ev_web_view_set_handler (EvWebView *webview,gboolean visible); /* Selection */ gboolean ev_web_view_get_has_selection (EvWebView *webview); void ev_web_view_select_all (EvWebView *webview); diff --git a/shell/ev-window.c b/shell/ev-window.c index d765a2d8..aab14229 100644 --- a/shell/ev-window.c +++ b/shell/ev-window.c @@ -5073,7 +5073,8 @@ ev_window_find_job_updated_cb (EvJobFind *job, { ev_window_update_actions (ev_window); if (ev_window->priv->document->iswebdocument == TRUE ) { - ev_web_view_find_changed(EV_WEB_VIEW(ev_window->priv->webview), job->results,job->text, job->case_sensitive); + ev_web_view_find_changed(EV_WEB_VIEW(ev_window->priv->webview), + job->results,job->text, job->case_sensitive); } else { ev_view_find_changed (EV_VIEW (ev_window->priv->view), @@ -5154,7 +5155,7 @@ find_bar_search_changed_cb (EggFindBar *find_bar, search_string = egg_find_bar_get_search_string (find_bar); if (ev_window->priv->document->iswebdocument) { - ev_web_view_find_search_changed(EV_WEB_VIEW(ev_window->priv->webview),TRUE); + ev_web_view_find_search_changed(EV_WEB_VIEW(ev_window->priv->webview)); } else { ev_view_find_search_changed (EV_VIEW (ev_window->priv->view)); } @@ -5201,7 +5202,8 @@ find_bar_visibility_changed_cb (EggFindBar *find_bar, } else { ev_web_view_find_set_highlight_search(EV_WEB_VIEW(ev_window->priv->webview),visible); - ev_web_view_find_search_changed(EV_WEB_VIEW(ev_window->priv->webview),visible); + ev_web_view_find_search_changed(EV_WEB_VIEW(ev_window->priv->webview)); + ev_web_view_set_handler(EV_WEB_VIEW(ev_window->priv->webview),visible); } ev_window_update_actions (ev_window); -- cgit v1.2.1