diff options
-rw-r--r-- | android/jni/mupdf.c | 100 | ||||
-rw-r--r-- | android/src/com/artifex/mupdf/LinkInfo.java | 14 | ||||
-rw-r--r-- | android/src/com/artifex/mupdf/LinkInfoExternal.java | 14 | ||||
-rw-r--r-- | android/src/com/artifex/mupdf/LinkInfoInternal.java | 14 | ||||
-rw-r--r-- | android/src/com/artifex/mupdf/LinkInfoVisitor.java | 6 | ||||
-rw-r--r-- | android/src/com/artifex/mupdf/MuPDFActivity.java | 17 | ||||
-rw-r--r-- | android/src/com/artifex/mupdf/MuPDFCore.java | 5 | ||||
-rw-r--r-- | android/src/com/artifex/mupdf/MuPDFPageView.java | 8 | ||||
-rw-r--r-- | android/src/com/artifex/mupdf/PageView.java | 8 |
9 files changed, 106 insertions, 80 deletions
diff --git a/android/jni/mupdf.c b/android/jni/mupdf.c index 915f3946..7e18b3e7 100644 --- a/android/jni/mupdf.c +++ b/android/jni/mupdf.c @@ -1037,7 +1037,10 @@ JNIEXPORT jobjectArray JNICALL Java_com_artifex_mupdf_MuPDFCore_getPageLinksInternal(JNIEnv * env, jobject thiz, int pageNumber) { jclass linkInfoClass; - jmethodID ctor; + jclass linkInfoInternalClass; + jclass linkInfoExternalClass; + jmethodID ctorInternal; + jmethodID ctorExternal; jobjectArray arr; jobject linkInfo; fz_matrix ctm; @@ -1050,8 +1053,14 @@ Java_com_artifex_mupdf_MuPDFCore_getPageLinksInternal(JNIEnv * env, jobject thiz linkInfoClass = (*env)->FindClass(env, "com/artifex/mupdf/LinkInfo"); if (linkInfoClass == NULL) return NULL; - ctor = (*env)->GetMethodID(env, linkInfoClass, "<init>", "(FFFFI)V"); - if (ctor == NULL) return NULL; + linkInfoInternalClass = (*env)->FindClass(env, "com/artifex/mupdf/LinkInfoInternal"); + if (linkInfoInternalClass == NULL) return NULL; + linkInfoExternalClass = (*env)->FindClass(env, "com/artifex/mupdf/LinkInfoExternal"); + if (linkInfoExternalClass == NULL) return NULL; + ctorInternal = (*env)->GetMethodID(env, linkInfoInternalClass, "<init>", "(FFFFI)V"); + if (ctorInternal == NULL) return NULL; + ctorExternal = (*env)->GetMethodID(env, linkInfoExternalClass, "<init>", "(FFFFLjava/lang/String;)V"); + if (ctorExternal == NULL) return NULL; Java_com_artifex_mupdf_MuPDFCore_gotoPageInternal(env, thiz, pageNumber); pc = &glo->pages[glo->current]; @@ -1065,8 +1074,12 @@ Java_com_artifex_mupdf_MuPDFCore_getPageLinksInternal(JNIEnv * env, jobject thiz count = 0; for (link = list; link; link = link->next) { - if (link->dest.kind == FZ_LINK_GOTO) + switch (link->dest.kind) + { + case FZ_LINK_GOTO: + case FZ_LINK_URI: count++ ; + } } arr = (*env)->NewObjectArray(env, count, linkInfoClass, NULL); @@ -1075,19 +1088,35 @@ Java_com_artifex_mupdf_MuPDFCore_getPageLinksInternal(JNIEnv * env, jobject thiz count = 0; for (link = list; link; link = link->next) { - if (link->dest.kind == FZ_LINK_GOTO) - { - fz_rect rect = fz_transform_rect(ctm, link->rect); + fz_rect rect = fz_transform_rect(ctm, link->rect); - linkInfo = (*env)->NewObject(env, linkInfoClass, ctor, + switch (link->dest.kind) + { + case FZ_LINK_GOTO: + { + linkInfo = (*env)->NewObject(env, linkInfoInternalClass, ctorInternal, (float)rect.x0, (float)rect.y0, (float)rect.x1, (float)rect.y1, link->dest.ld.gotor.page); - if (linkInfo == NULL) return NULL; - (*env)->SetObjectArrayElement(env, arr, count, linkInfo); - (*env)->DeleteLocalRef(env, linkInfo); + break; + } + + case FZ_LINK_URI: + { + jstring juri = (*env)->NewStringUTF(env, link->dest.ld.uri.uri); + linkInfo = (*env)->NewObject(env, linkInfoExternalClass, ctorExternal, + (float)rect.x0, (float)rect.y0, (float)rect.x1, (float)rect.y1, + juri); + break; + } - count ++; + default: + continue; } + + if (linkInfo == NULL) return NULL; + (*env)->SetObjectArrayElement(env, arr, count, linkInfo); + (*env)->DeleteLocalRef(env, linkInfo); + count++; } return arr; @@ -1150,53 +1179,6 @@ Java_com_artifex_mupdf_MuPDFCore_getWidgetAreasInternal(JNIEnv * env, jobject th } JNIEXPORT int JNICALL -Java_com_artifex_mupdf_MuPDFCore_getPageLink(JNIEnv * env, jobject thiz, int pageNumber, float x, float y) -{ - fz_matrix ctm; - float zoom; - fz_link *link; - fz_point p; - page_cache *pc; - globals *glo = get_globals(env, thiz); - - Java_com_artifex_mupdf_MuPDFCore_gotoPageInternal(env, thiz, pageNumber); - pc = &glo->pages[glo->current]; - if (pc->number != pageNumber || pc->page == NULL) - return -1; - - p.x = x; - p.y = y; - - /* Ultimately we should probably return a pointer to a java structure - * with the link details in, but for now, page number will suffice. - */ - zoom = glo->resolution / 72; - ctm = fz_scale(zoom, zoom); - ctm = fz_invert_matrix(ctm); - - p = fz_transform_point(ctm, p); - - for (link = fz_load_links(glo->doc, pc->page); link; link = link->next) - { - if (p.x >= link->rect.x0 && p.x <= link->rect.x1) - if (p.y >= link->rect.y0 && p.y <= link->rect.y1) - break; - } - - if (link == NULL) - return -1; - - if (link->dest.kind == FZ_LINK_URI) - { - //gotouri(link->dest.ld.uri.uri); - return -1; - } - else if (link->dest.kind == FZ_LINK_GOTO) - return link->dest.ld.gotor.page; - return -1; -} - -JNIEXPORT int JNICALL Java_com_artifex_mupdf_MuPDFCore_passClickEventInternal(JNIEnv * env, jobject thiz, int pageNumber, float x, float y) { globals *glo = get_globals(env, thiz); diff --git a/android/src/com/artifex/mupdf/LinkInfo.java b/android/src/com/artifex/mupdf/LinkInfo.java index c2a395e7..8b52d7f7 100644 --- a/android/src/com/artifex/mupdf/LinkInfo.java +++ b/android/src/com/artifex/mupdf/LinkInfo.java @@ -2,11 +2,13 @@ package com.artifex.mupdf; import android.graphics.RectF; -public class LinkInfo extends RectF { - public int pageNumber; +public class LinkInfo { + final public RectF rect; - public LinkInfo(float l, float t, float r, float b, int p) { - super(l, t, r, b); - pageNumber = p; + public LinkInfo(float l, float t, float r, float b) { + rect = new RectF(l, t, r, b); } -} + + public void acceptVisitor(LinkInfoVisitor visitor) { + } +}
\ No newline at end of file diff --git a/android/src/com/artifex/mupdf/LinkInfoExternal.java b/android/src/com/artifex/mupdf/LinkInfoExternal.java new file mode 100644 index 00000000..fce1eae0 --- /dev/null +++ b/android/src/com/artifex/mupdf/LinkInfoExternal.java @@ -0,0 +1,14 @@ +package com.artifex.mupdf; + +public class LinkInfoExternal extends LinkInfo { + final public String url; + + public LinkInfoExternal(float l, float t, float r, float b, String u) { + super(l, t, r, b); + url = u; + } + + public void acceptVisitor(LinkInfoVisitor visitor) { + visitor.visitExternal(this); + } +} diff --git a/android/src/com/artifex/mupdf/LinkInfoInternal.java b/android/src/com/artifex/mupdf/LinkInfoInternal.java new file mode 100644 index 00000000..9d34fcb7 --- /dev/null +++ b/android/src/com/artifex/mupdf/LinkInfoInternal.java @@ -0,0 +1,14 @@ +package com.artifex.mupdf; + +public class LinkInfoInternal extends LinkInfo { + final public int pageNumber; + + public LinkInfoInternal(float l, float t, float r, float b, int p) { + super(l, t, r, b); + pageNumber = p; + } + + public void acceptVisitor(LinkInfoVisitor visitor) { + visitor.visitInternal(this); + } +} diff --git a/android/src/com/artifex/mupdf/LinkInfoVisitor.java b/android/src/com/artifex/mupdf/LinkInfoVisitor.java new file mode 100644 index 00000000..348334a7 --- /dev/null +++ b/android/src/com/artifex/mupdf/LinkInfoVisitor.java @@ -0,0 +1,6 @@ +package com.artifex.mupdf; + +abstract public class LinkInfoVisitor { + public abstract void visitInternal(LinkInfoInternal li); + public abstract void visitExternal(LinkInfoExternal li); +} diff --git a/android/src/com/artifex/mupdf/MuPDFActivity.java b/android/src/com/artifex/mupdf/MuPDFActivity.java index 283ed761..4a548637 100644 --- a/android/src/com/artifex/mupdf/MuPDFActivity.java +++ b/android/src/com/artifex/mupdf/MuPDFActivity.java @@ -352,12 +352,21 @@ public class MuPDFActivity extends Activity } else if (e.getX() > super.getWidth()*(TAP_PAGE_MARGIN-1)/TAP_PAGE_MARGIN) { super.moveToNext(); } else { - int linkPage = -1; + LinkInfo link = null; if (mLinkHighlight && pageView != null) { - linkPage = pageView.hitLinkPage(e.getX(), e.getY()); + link = pageView.hitLink(e.getX(), e.getY()); } - if (linkPage != -1) { - mDocView.setDisplayedViewIndex(linkPage); + if (link != null) { + link.acceptVisitor(new LinkInfoVisitor() { + @Override + public void visitInternal(LinkInfoInternal li) { + mDocView.setDisplayedViewIndex(li.pageNumber); + } + @Override + public void visitExternal(LinkInfoExternal li) { + // Clicked on an external link: li.url + } + }); } else { if (!mButtonsVisible) { showButtons(); diff --git a/android/src/com/artifex/mupdf/MuPDFCore.java b/android/src/com/artifex/mupdf/MuPDFCore.java index c86867c3..15c90e17 100644 --- a/android/src/com/artifex/mupdf/MuPDFCore.java +++ b/android/src/com/artifex/mupdf/MuPDFCore.java @@ -33,7 +33,6 @@ public class MuPDFCore int patchX, int patchY, int patchW, int patchH); private native RectF[] searchPage(String text); - private native int getPageLink(int page, float x, float y); private native int passClickEventInternal(int page, float x, float y); private native void setFocusedWidgetChoiceSelectedInternal(String [] selected); private native String [] getFocusedWidgetChoiceSelected(); @@ -173,10 +172,6 @@ public class MuPDFCore setFocusedWidgetChoiceSelectedInternal(selected); } - public synchronized int hitLinkPage(int page, float x, float y) { - return getPageLink(page, x, y); - } - public synchronized LinkInfo [] getPageLinks(int page) { return getPageLinksInternal(page); } diff --git a/android/src/com/artifex/mupdf/MuPDFPageView.java b/android/src/com/artifex/mupdf/MuPDFPageView.java index 8c8ec7e0..68031837 100644 --- a/android/src/com/artifex/mupdf/MuPDFPageView.java +++ b/android/src/com/artifex/mupdf/MuPDFPageView.java @@ -104,7 +104,7 @@ public class MuPDFPageView extends PageView { mChoiceEntryBuilder.setTitle("MuPDF: choose value"); } - public int hitLinkPage(float x, float y) { + public LinkInfo hitLink(float x, float y) { // Since link highlighting was implemented, the super class // PageView has had sufficient information to be able to // perform this method directly. Making that change would @@ -113,7 +113,11 @@ public class MuPDFPageView extends PageView { float docRelX = (x - getLeft())/scale; float docRelY = (y - getTop())/scale; - return mCore.hitLinkPage(mPageNumber, docRelX, docRelY); + for (LinkInfo l: mLinks) + if (l.rect.contains(docRelX, docRelY)) + return l; + + return null; } private void invokeTextDialog(String text) { diff --git a/android/src/com/artifex/mupdf/PageView.java b/android/src/com/artifex/mupdf/PageView.java index f07ea8d8..bdbed438 100644 --- a/android/src/com/artifex/mupdf/PageView.java +++ b/android/src/com/artifex/mupdf/PageView.java @@ -62,7 +62,7 @@ public abstract class PageView extends ViewGroup { private BitmapHolder mPatchBm; private AsyncTask<PatchInfo,Void,PatchInfo> mDrawPatch; private RectF mSearchBoxes[]; - private LinkInfo mLinks[]; + protected LinkInfo mLinks[]; private View mSearchView; private boolean mIsBlank; private boolean mHighlightLinks; @@ -250,9 +250,9 @@ public abstract class PageView extends ViewGroup { // Work out current total scale factor // from source to view paint.setColor(LINK_COLOR); - for (RectF rect : mLinks) - canvas.drawRect(rect.left*scale, rect.top*scale, - rect.right*scale, rect.bottom*scale, + for (LinkInfo link : mLinks) + canvas.drawRect(link.rect.left*scale, link.rect.top*scale, + link.rect.right*scale, link.rect.bottom*scale, paint); } } |