summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorSebastian Rasmussen <sebras@hotmail.com>2011-01-06 18:45:36 +0000
committerSebastian Rasmussen <sebras@hotmail.com>2011-01-06 18:45:36 +0000
commit41686954a174462deea911d3b8f009219cd909b3 (patch)
tree02d939e2d5511b0763baa87c850444a0c3256809 /apps
parenta53b4dac2ed84d9d40420f0c88d05914f73c5556 (diff)
downloadmupdf-41686954a174462deea911d3b8f009219cd909b3.tar.xz
Search for text on all pages rather than only the current page.
Diffstat (limited to 'apps')
-rw-r--r--apps/pdfapp.c115
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);
}
}