diff options
Diffstat (limited to 'src/ui/documentwidget.c')
-rw-r--r-- | src/ui/documentwidget.c | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/src/ui/documentwidget.c b/src/ui/documentwidget.c index b088fa74..de2abf0d 100644 --- a/src/ui/documentwidget.c +++ b/src/ui/documentwidget.c | |||
@@ -513,6 +513,10 @@ const iString *url_DocumentWidget(const iDocumentWidget *d) { | |||
513 | return d->url; | 513 | return d->url; |
514 | } | 514 | } |
515 | 515 | ||
516 | const iGmDocument *document_DocumentWidget(const iDocumentWidget *d) { | ||
517 | return d->doc; | ||
518 | } | ||
519 | |||
516 | void setUrlFromCache_DocumentWidget(iDocumentWidget *d, const iString *url, iBool isFromCache) { | 520 | void setUrlFromCache_DocumentWidget(iDocumentWidget *d, const iString *url, iBool isFromCache) { |
517 | if (cmpStringSc_String(d->url, url, &iCaseInsensitive)) { | 521 | if (cmpStringSc_String(d->url, url, &iCaseInsensitive)) { |
518 | set_String(d->url, url); | 522 | set_String(d->url, url); |
@@ -583,8 +587,9 @@ static void scroll_DocumentWidget_(iDocumentWidget *d, int offset) { | |||
583 | refresh_Widget(as_Widget(d)); | 587 | refresh_Widget(as_Widget(d)); |
584 | } | 588 | } |
585 | 589 | ||
586 | static void scrollTo_DocumentWidget_(iDocumentWidget *d, int documentY) { | 590 | static void scrollTo_DocumentWidget_(iDocumentWidget *d, int documentY, iBool centered) { |
587 | d->scrollY = documentY - documentBounds_DocumentWidget_(d).size.y / 2; | 591 | d->scrollY = documentY - (centered ? documentBounds_DocumentWidget_(d).size.y / 2 : |
592 | lineHeight_Text(paragraph_FontId)); | ||
588 | scroll_DocumentWidget_(d, 0); /* clamp it */ | 593 | scroll_DocumentWidget_(d, 0); /* clamp it */ |
589 | } | 594 | } |
590 | 595 | ||
@@ -781,7 +786,7 @@ static iBool handleCommand_DocumentWidget_(iDocumentWidget *d, const char *cmd) | |||
781 | if (midLoc) { | 786 | if (midLoc) { |
782 | mid = findRunAtLoc_GmDocument(d->doc, midLoc); | 787 | mid = findRunAtLoc_GmDocument(d->doc, midLoc); |
783 | if (mid) { | 788 | if (mid) { |
784 | scrollTo_DocumentWidget_(d, mid_Rect(mid->bounds).y); | 789 | scrollTo_DocumentWidget_(d, mid_Rect(mid->bounds).y, iTrue); |
785 | } | 790 | } |
786 | } | 791 | } |
787 | refresh_Widget(w); | 792 | refresh_Widget(w); |
@@ -923,6 +928,14 @@ static iBool handleCommand_DocumentWidget_(iDocumentWidget *d, const char *cmd) | |||
923 | arg_Command(cmd) * height_Rect(documentBounds_DocumentWidget_(d))); | 928 | arg_Command(cmd) * height_Rect(documentBounds_DocumentWidget_(d))); |
924 | return iTrue; | 929 | return iTrue; |
925 | } | 930 | } |
931 | else if (equal_Command(cmd, "document.goto") && document_App() == d) { | ||
932 | const char *loc = pointerLabel_Command(cmd, "loc"); | ||
933 | const iGmRun *run = findRunAtLoc_GmDocument(d->doc, loc); | ||
934 | if (run) { | ||
935 | scrollTo_DocumentWidget_(d, run->visBounds.pos.y, iFalse); | ||
936 | } | ||
937 | return iTrue; | ||
938 | } | ||
926 | else if ((equal_Command(cmd, "find.next") || equal_Command(cmd, "find.prev")) && | 939 | else if ((equal_Command(cmd, "find.next") || equal_Command(cmd, "find.prev")) && |
927 | document_App() == d) { | 940 | document_App() == d) { |
928 | const int dir = equal_Command(cmd, "find.next") ? +1 : -1; | 941 | const int dir = equal_Command(cmd, "find.next") ? +1 : -1; |
@@ -943,7 +956,7 @@ static iBool handleCommand_DocumentWidget_(iDocumentWidget *d, const char *cmd) | |||
943 | if (d->foundMark.start) { | 956 | if (d->foundMark.start) { |
944 | const iGmRun *found; | 957 | const iGmRun *found; |
945 | if ((found = findRunAtLoc_GmDocument(d->doc, d->foundMark.start)) != NULL) { | 958 | if ((found = findRunAtLoc_GmDocument(d->doc, d->foundMark.start)) != NULL) { |
946 | scrollTo_DocumentWidget_(d, mid_Rect(found->bounds).y); | 959 | scrollTo_DocumentWidget_(d, mid_Rect(found->bounds).y, iTrue); |
947 | } | 960 | } |
948 | } | 961 | } |
949 | } | 962 | } |
@@ -1353,7 +1366,7 @@ static void draw_DocumentWidget_(const iDocumentWidget *d) { | |||
1353 | fillRect_Paint(&ctx.paint, bounds, tmBackground_ColorId); | 1366 | fillRect_Paint(&ctx.paint, bounds, tmBackground_ColorId); |
1354 | setClip_Paint(&ctx.paint, bounds); | 1367 | setClip_Paint(&ctx.paint, bounds); |
1355 | render_GmDocument(d->doc, visibleRange_DocumentWidget_(d), drawRun_DrawContext_, &ctx); | 1368 | render_GmDocument(d->doc, visibleRange_DocumentWidget_(d), drawRun_DrawContext_, &ctx); |
1356 | clearClip_Paint(&ctx.paint); | 1369 | unsetClip_Paint(&ctx.paint); |
1357 | draw_Widget(w); | 1370 | draw_Widget(w); |
1358 | } | 1371 | } |
1359 | 1372 | ||