diff options
author | Sebastian Rasmussen <sebras@hotmail.com> | 2011-01-06 18:45:36 +0000 |
---|---|---|
committer | Sebastian Rasmussen <sebras@hotmail.com> | 2011-01-06 18:45:36 +0000 |
commit | 41686954a174462deea911d3b8f009219cd909b3 (patch) | |
tree | 02d939e2d5511b0763baa87c850444a0c3256809 /apps | |
parent | a53b4dac2ed84d9d40420f0c88d05914f73c5556 (diff) | |
download | mupdf-41686954a174462deea911d3b8f009219cd909b3.tar.xz |
Search for text on all pages rather than only the current page.
Diffstat (limited to 'apps')
-rw-r--r-- | apps/pdfapp.c | 115 |
1 files changed, 80 insertions, 35 deletions
diff --git a/apps/pdfapp.c b/apps/pdfapp.c index f07f0592..1b7353d0 100644 --- a/apps/pdfapp.c +++ b/apps/pdfapp.c @@ -275,8 +275,7 @@ static void pdfapp_showpage(pdfapp_t *app, int loadpage, int drawpage, int repai /* Extract text */ app->page->text = fz_newtextspan(); tdev = fz_newtextdevice(app->page->text); - ctm = pdfapp_viewctm(app); - fz_executedisplaylist(app->page->list, tdev, ctm); + fz_executedisplaylist(app->page->list, tdev, fz_identity); fz_freedevice(tdev); pdf_agestore(app->xref->store, 3); @@ -406,7 +405,14 @@ void pdfapp_inverthit(pdfapp_t *app) } if (!fz_isemptyrect(hitbox)) + { + fz_matrix ctm; + + ctm = pdfapp_viewctm(app); + hitbox = fz_transformbbox(ctm, hitbox); + pdfapp_invert(app, hitbox); + } } static inline int charat(fz_textspan *span, int idx) @@ -467,28 +473,47 @@ static void pdfapp_searchforward(pdfapp_t *app) int matchlen; int test; int len; + int startpage; - len = textlen(app->page->text); + wincursor(app, WAIT); - if (app->hit >= 0) - test = app->hit + strlen(app->search); - else - test = 0; + startpage = app->pageno; - while (test < len) + do { - matchlen = match(app->search, app->page->text, test); - if (matchlen) + len = textlen(app->page->text); + + if (app->hit >= 0) + test = app->hit + strlen(app->search); + else + test = 0; + + while (test < len) { - printf("found hit at %d + %d\n", test, matchlen); - app->hit = test; - app->hitlen = matchlen; - return; + matchlen = match(app->search, app->page->text, test); + if (matchlen) + { + app->hit = test; + app->hitlen = matchlen; + wincursor(app, HAND); + return; + } + test++; } - test++; - } - printf("hit not found\n"); + app->pageno++; + if (app->pageno > app->pagecount) + app->pageno = 1; + + pdfapp_showpage(app, 1, 0, 0); + app->pany = 0; + + } while (app->pageno != startpage); + + if (app->pageno == startpage) + printf("hit not found\n"); + + wincursor(app, HAND); } static void pdfapp_searchbackward(pdfapp_t *app) @@ -496,28 +521,47 @@ static void pdfapp_searchbackward(pdfapp_t *app) int matchlen; int test; int len; + int startpage; - len = textlen(app->page->text); + wincursor(app, WAIT); - if (app->hit >= 0) - test = app->hit - 1; - else - test = len; + startpage = app->pageno; - while (test >= 0) + do { - matchlen = match(app->search, app->page->text, test); - if (matchlen) + len = textlen(app->page->text); + + if (app->hit >= 0) + test = app->hit - 1; + else + test = len; + + while (test >= 0) { - printf("found hit at %d\n", test); - app->hit = test; - app->hitlen = matchlen; - return; + matchlen = match(app->search, app->page->text, test); + if (matchlen) + { + app->hit = test; + app->hitlen = matchlen; + wincursor(app, HAND); + return; + } + test--; } - test--; - } - printf("hit not found\n"); + app->pageno--; + if (app->pageno < 1) + app->pageno = app->pagecount; + + pdfapp_showpage(app, 1, 0, 0); + app->pany = -2000; + + } while (app->pageno != startpage); + + if (app->pageno == startpage) + printf("hit not found\n"); + + wincursor(app, HAND); } void pdfapp_onresize(pdfapp_t *app, int w, int h) @@ -535,6 +579,7 @@ void pdfapp_onkey(pdfapp_t *app, int c) { int oldpage = app->pageno; enum panning panto = PAN_TO_TOP; + int loadpage; if (app->isediting) { @@ -773,15 +818,15 @@ void pdfapp_onkey(pdfapp_t *app, int c) break; case 'n': - printf("search forward for: '%s'\n", app->search); pdfapp_searchforward(app); winrepaint(app); + loadpage = 0; break; case 'N': - printf("search backward for: '%s'\n", app->search); pdfapp_searchbackward(app); winrepaint(app); + loadpage = 0; break; } @@ -807,7 +852,7 @@ void pdfapp_onkey(pdfapp_t *app, int c) case DONT_PAN: break; } - pdfapp_showpage(app, 1, 1, 1); + pdfapp_showpage(app, loadpage, 1, 1); } } |