summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libview/ev-web-view.c227
-rw-r--r--libview/ev-web-view.h11
-rw-r--r--shell/ev-window.c46
3 files changed, 59 insertions, 225 deletions
diff --git a/libview/ev-web-view.c b/libview/ev-web-view.c
index 78b59adf..2c5271ba 100644
--- a/libview/ev-web-view.c
+++ b/libview/ev-web-view.c
@@ -33,20 +33,6 @@
#include "ev-document.h"
#include "ev-jobs.h"
- typedef enum {
- EV_WEB_VIEW_FIND_NEXT,
- EV_WEB_VIEW_FIND_PREV
- } EvWebViewFindDirection;
-
-typedef struct _SearchParams {
- gboolean case_sensitive;
- gchar* search_string;
- EvWebViewFindDirection direction;
- gboolean search_jump;
- gint on_result;
- guint *results;
-}SearchParams;
-
struct _EvWebView
{
WebKitWebView web_view;
@@ -54,13 +40,13 @@ struct _EvWebView
EvDocumentModel *model;
GepubDoc *gepub_doc;
gint current_page;
- gboolean inverted_stylesheet ;
+ gboolean inverted_stylesheet;
gboolean fullscreen;
- SearchParams *search;
WebKitFindController *findcontroller;
WebKitFindOptions findoptions;
gdouble zoom_level;
gchar *hlink;
+ gchar *search_string;
};
struct _EvWebViewClass
@@ -119,9 +105,9 @@ ev_web_view_dispose (GObject *object)
webview->hlink = NULL;
}
- if (webview->search) {
- g_free(webview->search);
- webview->search = NULL;
+ if (webview->search_string) {
+ g_free(webview->search_string);
+ webview->search_string = NULL;
}
G_OBJECT_CLASS (ev_web_view_parent_class)->dispose (object);
@@ -192,17 +178,10 @@ ev_web_view_init (EvWebView *webview)
}
webview->current_page = 0;
-
- webview->search = g_new0(SearchParams, 1);
- webview->search->search_string = NULL;
-
- webview->search->on_result = -1 ;
- webview->search->results = NULL;
- webview->search->search_jump = TRUE ;
-
webview->fullscreen = FALSE;
webview->inverted_stylesheet = FALSE;
webview->hlink = NULL;
+ webview->search_string = NULL;
}
static void
@@ -481,207 +460,57 @@ ev_web_view_handle_link(EvWebView *webview,EvLink *link)
/* Searching */
static void
-results_counted_cb(WebKitFindController *findcontroller,
- guint match_count,
- EvWebView *webview)
-{
- if (match_count > 0 && webview->search->on_result < match_count) {
- webkit_find_controller_search(findcontroller,
- webview->search->search_string,
- webview->findoptions,
- match_count);
- webview->search->search_jump = FALSE;
- }
-}
-
-/*
- * Jump to find results once we have changed the page in the webview.
- */
-static void
-jump_to_find_results(EvWebView *webview,
- WebKitLoadEvent load_event,
- gpointer data)
+ev_web_view_find_restart (EvWebView *webview)
{
- if ( load_event != WEBKIT_LOAD_FINISHED) {
- return;
- }
-
- if (!webview->search->search_string) {
+ if (!webview->search_string || !webview->search_string[0])
return;
- }
- if (webview->search->direction == EV_WEB_VIEW_FIND_NEXT) {
- webview->findoptions &= ~WEBKIT_FIND_OPTIONS_BACKWARDS;
- webview->findoptions &= ~WEBKIT_FIND_OPTIONS_WRAP_AROUND;
- }
- else {
- webview->findoptions |= WEBKIT_FIND_OPTIONS_BACKWARDS;
- webview->findoptions |= WEBKIT_FIND_OPTIONS_WRAP_AROUND;
- }
-
- webkit_find_controller_count_matches (webview->findcontroller,
- webview->search->search_string,
- webview->findoptions,
- G_MAXUINT);
- webview->search->search_jump = FALSE;
-}
-
-static gint
-ev_web_view_find_get_n_results (EvWebView *webview, gint page)
-{
- return webview->search->results[page];
+ webkit_find_controller_search (webview->findcontroller,
+ webview->search_string,
+ webview->findoptions,
+ G_MAXUINT);
}
-/**
- * jump_to_find_page
- * @webview: #EvWebView instance
- * @direction: Direction to look
- * @shift: Shift from current 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)
+void
+ev_web_view_find_changed (EvWebView *webview,
+ const gchar *text,
+ gboolean case_sensitive)
{
- int n_pages, i;
-
- n_pages = ev_document_get_n_pages (webview->document);
-
- 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 && ev_web_view_find_get_n_results(webview,page) > 0) {
- if (direction == EV_WEB_VIEW_FIND_PREV) {
- webview->findoptions |= WEBKIT_FIND_OPTIONS_WRAP_AROUND;
- webview->findoptions |= WEBKIT_FIND_OPTIONS_BACKWARDS;
- }
- else {
- if (webview->search->search_jump)
- webview->findoptions |= WEBKIT_FIND_OPTIONS_WRAP_AROUND;
- else
- webview->findoptions &= ~WEBKIT_FIND_OPTIONS_WRAP_AROUND;
+ g_free (webview->search_string);
+ webview->search_string = g_strdup (text);
- webview->findoptions &= ~WEBKIT_FIND_OPTIONS_BACKWARDS;
- }
-
- webkit_find_controller_search (webview->findcontroller,
- webview->search->search_string,
- webview->findoptions,
- /*Highlight all the results.*/
- G_MAXUINT);
- webview->search->search_jump = FALSE;
- break;
- }
-
- if (ev_web_view_find_get_n_results (webview, page) > 0) {
- webview->search->direction = direction;
- webkit_find_controller_search_finish(webview->findcontroller);
- ev_document_model_set_page (webview->model, page);
- break;
- }
- }
-}
+ webview->findoptions = WEBKIT_FIND_OPTIONS_NONE;
+ if (!case_sensitive)
+ webview->findoptions |= WEBKIT_FIND_OPTIONS_CASE_INSENSITIVE;
+ webview->findoptions |= WEBKIT_FIND_OPTIONS_WRAP_AROUND;
-void
-ev_web_view_find_changed (EvWebView *webview, guint *results, gchar *text,gboolean case_sensitive)
-{
- webview->search->results = results;
- webview->search->on_result = 0;
- webview->search->search_string = g_strdup(text);
- webview->search->case_sensitive = case_sensitive;
- if (webview->search->search_jump == TRUE) {
- if (!case_sensitive) {
- webview->findoptions |= WEBKIT_FIND_OPTIONS_CASE_INSENSITIVE;
- }
- else {
- webview->findoptions &= ~WEBKIT_FIND_OPTIONS_CASE_INSENSITIVE;
- }
- jump_to_find_page (webview, EV_WEB_VIEW_FIND_NEXT, 0);
- }
+ ev_web_view_find_restart (webview);
}
void
ev_web_view_find_next (EvWebView *webview)
{
- gint n_results;
-
- n_results = ev_web_view_find_get_n_results (webview, webview->current_page);
- webview->search->on_result++;
-
- if (webview->search->on_result >= n_results) {
- webview->search->on_result = 0;
- jump_to_find_page (webview, EV_WEB_VIEW_FIND_NEXT, 1);
- }
- else {
- webkit_find_controller_search_next(webview->findcontroller);
- }
+ webkit_find_controller_search_next (webview->findcontroller);
}
void
ev_web_view_find_previous (EvWebView *webview)
{
- webview->search->on_result--;
-
- if (webview->search->on_result < 0) {
- jump_to_find_page (webview, EV_WEB_VIEW_FIND_PREV, -1);
- webview->search->on_result = MAX (0, ev_web_view_find_get_n_results (webview, webview->current_page) - 1);
- } else {
- webkit_find_controller_search_previous(webview->findcontroller);
- }
+ webkit_find_controller_search_previous (webview->findcontroller);
}
void
ev_web_view_find_search_changed (EvWebView *webview)
{
- /* search string has changed, focus on new search result */
- if (webview->search->search_string) {
- g_free(webview->search->search_string);
- webview->search->search_string = NULL;
- }
-
- webkit_find_controller_search_finish(webview->findcontroller);
- webview->search->search_jump = TRUE;
+ webkit_find_controller_search_finish (webview->findcontroller);
}
void
ev_web_view_find_cancel (EvWebView *webview)
{
webkit_find_controller_search_finish (webview->findcontroller);
-}
-
-void
-ev_web_view_set_handler(EvWebView *webview,gboolean visible)
-{
- if (visible) {
- g_signal_connect(webview,
- "load-changed",
- G_CALLBACK(jump_to_find_results),
- NULL);
- g_signal_connect(webview->findcontroller,
- "counted-matches",
- G_CALLBACK(results_counted_cb),
- webview);
- }
- else {
- g_signal_handlers_disconnect_by_func(webview,
- jump_to_find_results,
- NULL);
- g_signal_handlers_disconnect_by_func(webview,
- results_counted_cb,
- NULL);
- }
+ g_free (webview->search_string);
+ webview->search_string = NULL;
}
/* Selection and copying*/
diff --git a/libview/ev-web-view.h b/libview/ev-web-view.h
index 02f7ef64..721560db 100644
--- a/libview/ev-web-view.h
+++ b/libview/ev-web-view.h
@@ -62,18 +62,13 @@ gboolean ev_web_view_previous_page (EvWebView *webview);
void ev_web_view_handle_link (EvWebView *webview, EvLink* link);
/* Searching */
+void ev_web_view_find_changed (EvWebView *webview,
+ const gchar *text,
+ gboolean case_sensitive);
void ev_web_view_find_next (EvWebView *webview);
void ev_web_view_find_previous (EvWebView *webview);
-
-void ev_web_view_find_changed (EvWebView *webview,
- guint *results,
- gchar *text,
- gboolean case_sensitive);
-
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 cc45f883..d046113b 100644
--- a/shell/ev-window.c
+++ b/shell/ev-window.c
@@ -453,7 +453,7 @@ ev_window_setup_action_sensitivity (EvWindow *ev_window)
else if (has_document && document->iswebdocument) {
can_get_text = TRUE;
}
- if (has_pages && EV_IS_DOCUMENT_FIND (document)) {
+ if (has_pages && (EV_IS_DOCUMENT_FIND (document) || document->iswebdocument)) {
can_find = TRUE;
}
@@ -1733,7 +1733,7 @@ ev_window_setup_document (EvWindow *ev_window)
info = ev_document_get_info (document);
update_document_mode (ev_window, info->mode);
- if (EV_IS_DOCUMENT_FIND (document)) {
+ if (EV_IS_DOCUMENT_FIND (document) || document->iswebdocument) {
if (ev_window->priv->search_string &&
!EV_WINDOW_IS_PRESENTATION (ev_window)) {
ev_window_show_find_bar (ev_window);
@@ -2509,7 +2509,7 @@ ev_window_open_document (EvWindow *ev_window,
break;
}
- if (search_string && EV_IS_DOCUMENT_FIND (document) &&
+ if (search_string && (EV_IS_DOCUMENT_FIND (document) || document->iswebdocument) &&
mode != EV_WINDOW_MODE_PRESENTATION) {
ev_window_show_find_bar (ev_window);
egg_find_bar_set_search_string (EGG_FIND_BAR (ev_window->priv->find_bar),
@@ -5858,13 +5858,6 @@ ev_window_find_job_updated_cb (EvJobFind *job,
EvWindow *ev_window)
{
ev_window_update_actions (ev_window);
-#if ENABLE_EPUB
- if (ev_window->priv->document && 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);
- }
- else
-#endif
{
ev_view_find_changed (EV_VIEW (ev_window->priv->view),
ev_job_find_get_results (job),
@@ -5938,11 +5931,27 @@ ev_window_search_start (EvWindow *ev_window)
EggFindBar *find_bar = EGG_FIND_BAR (ev_window->priv->find_bar);
const char *search_string;
- if (!ev_window->priv->document || !EV_IS_DOCUMENT_FIND (ev_window->priv->document))
+ if (!ev_window->priv->document)
return;
search_string = egg_find_bar_get_search_string (find_bar);
+#if ENABLE_EPUB
+ if (ev_window->priv->document->iswebdocument) {
+ if (search_string && search_string[0]) {
+ ev_web_view_find_changed (EV_WEB_VIEW (ev_window->priv->webview),
+ search_string,
+ egg_find_bar_get_case_sensitive (find_bar));
+ } else {
+ ev_web_view_find_cancel (EV_WEB_VIEW (ev_window->priv->webview));
+ }
+ return;
+ }
+#endif
+
+ if (!EV_IS_DOCUMENT_FIND (ev_window->priv->document))
+ return;
+
ev_window_clear_find_job (ev_window);
if (search_string && search_string[0]) {
@@ -5966,9 +5975,7 @@ ev_window_search_start (EvWindow *ev_window)
ev_window_update_actions (ev_window);
egg_find_bar_set_status_text (find_bar, NULL);
ev_find_sidebar_clear (EV_FIND_SIDEBAR (ev_window->priv->find_sidebar));
- if (ev_window->priv->document->iswebdocument == FALSE) {
- gtk_widget_queue_draw (GTK_WIDGET (ev_window->priv->view));
- }
+ gtk_widget_queue_draw (GTK_WIDGET (ev_window->priv->view));
}
}
@@ -5999,15 +6006,16 @@ find_bar_visibility_changed_cb (EggFindBar *find_bar,
visible = gtk_widget_get_visible (GTK_WIDGET (find_bar));
if (ev_window->priv->document &&
- EV_IS_DOCUMENT_FIND (ev_window->priv->document)) {
+ (EV_IS_DOCUMENT_FIND (ev_window->priv->document) ||
+ ev_window->priv->document->iswebdocument)) {
if (!ev_window->priv->document->iswebdocument) {
ev_view_find_set_highlight_search (EV_VIEW (ev_window->priv->view), visible);
}
#if ENABLE_EPUB
else {
- 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);
+ if (!visible)
+ ev_web_view_find_cancel (EV_WEB_VIEW (ev_window->priv->webview));
}
#endif
ev_window_update_actions (ev_window);
@@ -6038,7 +6046,9 @@ ev_window_show_find_bar (EvWindow *ev_window)
if (gtk_widget_get_visible (ev_window->priv->find_bar))
return;
- if (ev_window->priv->document == NULL || !EV_IS_DOCUMENT_FIND (ev_window->priv->document)) {
+ if (ev_window->priv->document == NULL ||
+ (!EV_IS_DOCUMENT_FIND (ev_window->priv->document) &&
+ !ev_window->priv->document->iswebdocument)) {
g_error ("Find action should be insensitive since document doesn't support find");
return;
}