diff options
author | Paul Gardiner <paulg.artifex@glidos.net> | 2012-10-11 12:03:15 +0100 |
---|---|---|
committer | Paul Gardiner <paulg.artifex@glidos.net> | 2012-10-11 12:03:15 +0100 |
commit | 31791f3ebe049af8dccacd5871c0aeac7dc86b29 (patch) | |
tree | 535b0770f9204dc18a960d6c1824f3966286e097 /android/src | |
parent | 84f84d86e6d7f079e12139fa3306c3bc71713f77 (diff) | |
download | mupdf-31791f3ebe049af8dccacd5871c0aeac7dc86b29.tar.xz |
Android: support entry of text into forms
Diffstat (limited to 'android/src')
-rw-r--r-- | android/src/com/artifex/mupdf/MuPDFCore.java | 33 | ||||
-rw-r--r-- | android/src/com/artifex/mupdf/MuPDFPageView.java | 72 | ||||
-rw-r--r-- | android/src/com/artifex/mupdf/WidgetType.java | 8 |
3 files changed, 106 insertions, 7 deletions
diff --git a/android/src/com/artifex/mupdf/MuPDFCore.java b/android/src/com/artifex/mupdf/MuPDFCore.java index e7653f9e..f2017f77 100644 --- a/android/src/com/artifex/mupdf/MuPDFCore.java +++ b/android/src/com/artifex/mupdf/MuPDFCore.java @@ -31,6 +31,9 @@ public class MuPDFCore private static native RectF[] searchPage(String text); private static native int getPageLink(int page, float x, float y); private static native int passClickEventInternal(int page, float x, float y); + private static native int setFocusedWidgetTextInternal(String text); + private static native String getFocusedWidgetTextInternal(); + private static native int getFocusedWidgetTypeInternal(); private static native LinkInfo [] getPageLinksInternal(int page); private static native RectF[] getWidgetAreasInternal(int page); private static native OutlineItem [] getOutlineInternal(); @@ -95,8 +98,21 @@ public class MuPDFCore return bm; } - public synchronized boolean passClickEvent(int page, float x, float y) { + public synchronized PassClickResult passClickEvent(int page, float x, float y) { boolean changed = passClickEventInternal(page, x, y) != 0; + int type = getFocusedWidgetTypeInternal(); + WidgetType wtype = WidgetType.values()[type]; + String text; + + switch (wtype) + { + case TEXT: + text = getFocusedWidgetTextInternal(); + break; + default: + text = ""; + break; + } if (changed) { if (page == pageNum) @@ -105,7 +121,20 @@ public class MuPDFCore markDirtyInternal(page); } - return changed; + return new PassClickResult(changed, wtype, text); + } + + public synchronized boolean setFocusedWidgetText(int page, String text) { + boolean success; + gotoPage(page); + success = setFocusedWidgetTextInternal(text) != 0 ? true : false; + + if (success) { + pageNum = -1; + markDirtyInternal(page); + } + + return success; } public synchronized int hitLinkPage(int page, float x, float y) { diff --git a/android/src/com/artifex/mupdf/MuPDFPageView.java b/android/src/com/artifex/mupdf/MuPDFPageView.java index 9cb430ef..a2063f59 100644 --- a/android/src/com/artifex/mupdf/MuPDFPageView.java +++ b/android/src/com/artifex/mupdf/MuPDFPageView.java @@ -1,20 +1,70 @@ package com.artifex.mupdf; +import android.app.AlertDialog; import android.content.Context; +import android.content.DialogInterface; import android.graphics.Bitmap; import android.graphics.Point; import android.graphics.PointF; import android.graphics.RectF; +import android.view.LayoutInflater; +import android.view.WindowManager; +import android.widget.EditText; + +class PassClickResult { + public final boolean changed; + public final WidgetType type; + public final String text; + + public PassClickResult(boolean _changed, WidgetType _type, String _text) { + changed = _changed; + type = _type; + text = _text; + } +} public class MuPDFPageView extends PageView { private final MuPDFCore mCore; - private SafeAsyncTask<Void,Void,Boolean> mPassClick; + private SafeAsyncTask<Void,Void,PassClickResult> mPassClick; private RectF mWidgetAreas[]; private SafeAsyncTask<Void,Void,RectF[]> mLoadWidgetAreas; + private AlertDialog.Builder mTextEntryBuilder; + private AlertDialog mTextEntry; + private EditText mEditText; + private SafeAsyncTask<String,Void,Boolean> mSetWidgetText; public MuPDFPageView(Context c, MuPDFCore core, Point parentSize) { super(c, parentSize); mCore = core; + mTextEntryBuilder = new AlertDialog.Builder(c); + mTextEntryBuilder.setTitle("MuPDF: fill out text field"); + LayoutInflater inflater = (LayoutInflater)c.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + mEditText = (EditText)inflater.inflate(R.layout.textentry, null); + mTextEntryBuilder.setView(mEditText); + mTextEntryBuilder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }); + mTextEntryBuilder.setPositiveButton("Okay", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + mSetWidgetText = new SafeAsyncTask<String,Void,Boolean> () { + @Override + protected Boolean doInBackground(String... arg0) { + return mCore.setFocusedWidgetText(mPageNumber, arg0[0]); + } + @Override + protected void onPostExecute(Boolean result) { + update(); + if (!result) + invokeTextDialog(mEditText.getText().toString()); + } + }; + + mSetWidgetText.execute(mEditText.getText().toString()); + } + }); + mTextEntry = mTextEntryBuilder.create(); } public int hitLinkPage(float x, float y) { @@ -29,6 +79,12 @@ public class MuPDFPageView extends PageView { return mCore.hitLinkPage(mPageNumber, docRelX, docRelY); } + private void invokeTextDialog(String text) { + mEditText.setText(text); + mTextEntry.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); + mTextEntry.show(); + } + public boolean passClickEvent(float x, float y) { float scale = mSourceScale*(float)getWidth()/(float)mSize.x; final float docRelX = (x - getLeft())/scale; @@ -42,17 +98,23 @@ public class MuPDFPageView extends PageView { } if (hitWidget) { - mPassClick = new SafeAsyncTask<Void,Void,Boolean>() { + mPassClick = new SafeAsyncTask<Void,Void,PassClickResult>() { @Override - protected Boolean doInBackground(Void... arg0) { + protected PassClickResult doInBackground(Void... arg0) { return mCore.passClickEvent(mPageNumber, docRelX, docRelY); } @Override - protected void onPostExecute(Boolean result) { - if (result) { + protected void onPostExecute(PassClickResult result) { + if (result.changed) { update(); } + + switch(result.type) { + case TEXT: + invokeTextDialog(result.text); + break; + } } }; diff --git a/android/src/com/artifex/mupdf/WidgetType.java b/android/src/com/artifex/mupdf/WidgetType.java new file mode 100644 index 00000000..170232f4 --- /dev/null +++ b/android/src/com/artifex/mupdf/WidgetType.java @@ -0,0 +1,8 @@ +package com.artifex.mupdf; + +public enum WidgetType { + NONE, + TEXT, + LISTBOX, + COMBOBOX +} |