From 3febb4c53f35c3ebdcb3535203126646c1a505c0 Mon Sep 17 00:00:00 2001 From: Vasiliy Bout Date: Thu, 24 Jun 2010 15:25:12 +0000 Subject: [PATCH] Navigation UI has been added git-svn-id: https://only.mawhrin.net/repos/FBReaderJ/trunk@1508 6a642e6f-84f6-412e-ac94-c4a38d5a04b0 --- data/default/menubar.xml | 10 +- res/layout/navigate.xml | 13 +++ .../android/fbreader/FBReader.java | 96 +++++++++++++++++++ .../fbreader/fbreader/ActionCode.java | 6 +- .../fbreader/fbreader/FBReader.java | 6 +- ...eAction.java => ShowNavigationAction.java} | 13 +-- .../core/application/ZLApplication.java | 13 +++ .../core/application/ZLApplicationWindow.java | 2 + .../ZLAndroidApplicationWindow.java | 10 +- .../ui/android/library/ZLAndroidActivity.java | 3 + .../ui/android/library/ZLAndroidLibrary.java | 13 +++ 11 files changed, 157 insertions(+), 28 deletions(-) create mode 100644 res/layout/navigate.xml rename src/org/geometerplus/fbreader/fbreader/{ScrollToHomeAction.java => ShowNavigationAction.java} (79%) diff --git a/data/default/menubar.xml b/data/default/menubar.xml index e38fa0cf0..49eaf707c 100644 --- a/data/default/menubar.xml +++ b/data/default/menubar.xml @@ -13,13 +13,5 @@ - - - - - - - - - + diff --git a/res/layout/navigate.xml b/res/layout/navigate.xml new file mode 100644 index 000000000..a0a4ed606 --- /dev/null +++ b/res/layout/navigate.xml @@ -0,0 +1,13 @@ + + + + \ No newline at end of file diff --git a/src/org/geometerplus/android/fbreader/FBReader.java b/src/org/geometerplus/android/fbreader/FBReader.java index 092c838a3..76ecd384e 100644 --- a/src/org/geometerplus/android/fbreader/FBReader.java +++ b/src/org/geometerplus/android/fbreader/FBReader.java @@ -19,6 +19,7 @@ package org.geometerplus.android.fbreader; +import android.app.AlertDialog; import android.app.SearchManager; import android.content.Intent; import android.os.Bundle; @@ -26,8 +27,11 @@ import android.os.PowerManager; import android.view.View; import android.view.WindowManager; import android.widget.RelativeLayout; +import android.widget.SeekBar; import org.geometerplus.zlibrary.core.application.ZLApplication; +import org.geometerplus.zlibrary.core.view.ZLView; +import org.geometerplus.zlibrary.text.view.ZLTextView; import org.geometerplus.zlibrary.ui.android.library.ZLAndroidActivity; import org.geometerplus.zlibrary.ui.android.library.ZLAndroidApplication; import org.geometerplus.zlibrary.ui.android.R; @@ -181,4 +185,96 @@ public final class FBReader extends ZLAndroidActivity { startSearch(fbreader.TextSearchPatternOption.getValue(), true, null, false); return true; } + + + private AlertDialog myNavigateDialog; + + public void navigate() { + if (myNavigateDialog == null) { + setupNavigation(); + } + myNavigateDialog.show(); + updateNavigation(); + } + + public boolean canNavigate() { + final org.geometerplus.fbreader.fbreader.FBReader fbreader = + (org.geometerplus.fbreader.fbreader.FBReader)ZLApplication.Instance(); + final ZLView view = fbreader.getCurrentView(); + return view instanceof ZLTextView + && ((ZLTextView) view).getModel() != null + && ((ZLTextView) view).getModel().getParagraphsNumber() != 0; + } + + private void setupNavigation() { + final View layout = getLayoutInflater().inflate(R.layout.navigate, null); + final SeekBar slider = (SeekBar) layout.findViewById(R.id.book_position_slider); + + slider.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { + private boolean myInTouch; + + private void gotoPage(int page) { + /*final ZLView view = ZLApplication.Instance().getCurrentView(); + if (view instanceof ZLTextView) { + ZLTextView textView = (ZLTextView) view; + textView.gotoPage(page); + }*/ + } + + public void onStopTrackingTouch(SeekBar seekBar) { + gotoPage(seekBar.getProgress() + 1); + //updateEpdView(0); + myInTouch = false; + } + + public void onStartTrackingTouch(SeekBar seekBar) { + myInTouch = true; + } + + public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { + if (fromUser) { + final int page = progress + 1; + final int pagesNumber = seekBar.getMax() + 1; + myNavigateDialog.setTitle(makeNavigationTitle(page, pagesNumber)); + if (!myInTouch) { + gotoPage(page); + //updateEpdView(250); + } + } + } + }); + + myNavigateDialog = new AlertDialog.Builder(this) + .setView(layout) + .setTitle("?????") // use Non-empty string to preserve title-bar + .setIcon(0) + .create(); + } + + private void updateNavigation() { + /*final org.geometerplus.fbreader.fbreader.FBReader fbreader = + (org.geometerplus.fbreader.fbreader.FBReader)ZLApplication.Instance(); + final ZLTextView textView = (ZLTextView) fbreader.getCurrentView(); + final int page = textView.computeCurrentPage(); + final int pagesNumber = textView.computePageNumber();*/ + + final int page = 1; + final int pagesNumber = 100; + + final SeekBar slider = (SeekBar) myNavigateDialog.findViewById(R.id.book_position_slider); + slider.setMax(pagesNumber - 1); + slider.setProgress(page - 1); + + myNavigateDialog.setTitle(makeNavigationTitle(page, pagesNumber)); + } + + private static String makeNavigationTitle(int page, int pagesNumber) { + final org.geometerplus.fbreader.fbreader.FBReader fbreader = + (org.geometerplus.fbreader.fbreader.FBReader)ZLApplication.Instance(); + String title = ""; + if (fbreader.Model != null && fbreader.Model.Book != null) { + title = fbreader.Model.Book.getTitle(); + } + return title + ": " + page + " / " + pagesNumber; + } } diff --git a/src/org/geometerplus/fbreader/fbreader/ActionCode.java b/src/org/geometerplus/fbreader/fbreader/ActionCode.java index abedc5c59..3a8c4552f 100644 --- a/src/org/geometerplus/fbreader/fbreader/ActionCode.java +++ b/src/org/geometerplus/fbreader/fbreader/ActionCode.java @@ -40,9 +40,7 @@ public interface ActionCode { String VOLUME_KEY_SCROLL_BACKWARD = "volumeKeyScrollBackward"; String TRACKBALL_SCROLL_FORWARD = "trackballScrollForward"; String TRACKBALL_SCROLL_BACKWARD = "trackballScrollBackward"; - String SCROLL_TO_HOME = "gotoHome"; - String SCROLL_TO_START_OF_TEXT = "gotoSectionStart"; - String SCROLL_TO_END_OF_TEXT = "gotoSectionEnd"; + String SHOW_NAVIGATION = "navigate"; String CANCEL = "cancel"; String ROTATE = "rotate"; String INCREASE_FONT = "increaseFont"; @@ -50,8 +48,6 @@ public interface ActionCode { String TOGGLE_FULLSCREEN = "toggleFullscreen"; String FULLSCREEN_ON = "onFullscreen"; String QUIT = "quit"; - String GOTO_NEXT_TOC_SECTION = "nextTOCSection"; - String GOTO_PREVIOUS_TOC_SECTION = "previousTOCSection"; String COPY_SELECTED_TEXT_TO_CLIPBOARD = "copyToClipboard"; String CLEAR_SELECTION = "clearSelection"; String OPEN_SELECTED_TEXT_IN_DICTIONARY = "openInDictionary"; diff --git a/src/org/geometerplus/fbreader/fbreader/FBReader.java b/src/org/geometerplus/fbreader/fbreader/FBReader.java index ed55acac3..ed6a07760 100644 --- a/src/org/geometerplus/fbreader/fbreader/FBReader.java +++ b/src/org/geometerplus/fbreader/fbreader/FBReader.java @@ -90,16 +90,12 @@ public final class FBReader extends ZLApplication { addAction(ActionCode.FIND_PREVIOUS, new FindPreviousAction(this)); addAction(ActionCode.CLEAR_FIND_RESULTS, new ClearFindResultsAction(this)); - addAction(ActionCode.SCROLL_TO_HOME, new ScrollToHomeAction(this)); - //addAction(ActionCode.SCROLL_TO_START_OF_TEXT, new DummyAction(this)); - //addAction(ActionCode.SCROLL_TO_END_OF_TEXT, new DummyAction(this)); + addAction(ActionCode.SHOW_NAVIGATION, new ShowNavigationAction(this)); addAction(ActionCode.VOLUME_KEY_SCROLL_FORWARD, new VolumeKeyScrollingAction(this, true)); addAction(ActionCode.VOLUME_KEY_SCROLL_BACKWARD, new VolumeKeyScrollingAction(this, false)); addAction(ActionCode.TRACKBALL_SCROLL_FORWARD, new TrackballScrollingAction(this, true)); addAction(ActionCode.TRACKBALL_SCROLL_BACKWARD, new TrackballScrollingAction(this, false)); addAction(ActionCode.CANCEL, new CancelAction(this)); - //addAction(ActionCode.GOTO_NEXT_TOC_SECTION, new DummyAction(this)); - //addAction(ActionCode.GOTO_PREVIOUS_TOC_SECTION, new DummyAction(this)); //addAction(ActionCode.COPY_SELECTED_TEXT_TO_CLIPBOARD, new DummyAction(this)); //addAction(ActionCode.OPEN_SELECTED_TEXT_IN_DICTIONARY, new DummyAction(this)); //addAction(ActionCode.CLEAR_SELECTION, new DummyAction(this)); diff --git a/src/org/geometerplus/fbreader/fbreader/ScrollToHomeAction.java b/src/org/geometerplus/fbreader/fbreader/ShowNavigationAction.java similarity index 79% rename from src/org/geometerplus/fbreader/fbreader/ScrollToHomeAction.java rename to src/org/geometerplus/fbreader/fbreader/ShowNavigationAction.java index e9e98b6c2..dcf3c5dfb 100644 --- a/src/org/geometerplus/fbreader/fbreader/ScrollToHomeAction.java +++ b/src/org/geometerplus/fbreader/fbreader/ShowNavigationAction.java @@ -19,20 +19,17 @@ package org.geometerplus.fbreader.fbreader; -class ScrollToHomeAction extends FBAction { - ScrollToHomeAction(FBReader fbreader) { +class ShowNavigationAction extends FBAction { + ShowNavigationAction(FBReader fbreader) { super(fbreader); } + @Override public boolean isVisible() { - return Reader.getCurrentView() == Reader.BookTextView; - } - - public boolean isEnabled() { - return isVisible(); + return Reader.canNavigate(); } public void run() { - Reader.BookTextView.scrollToHome(); + Reader.navigate(); } } diff --git a/src/org/geometerplus/zlibrary/core/application/ZLApplication.java b/src/org/geometerplus/zlibrary/core/application/ZLApplication.java index 658402232..ee596a71e 100644 --- a/src/org/geometerplus/zlibrary/core/application/ZLApplication.java +++ b/src/org/geometerplus/zlibrary/core/application/ZLApplication.java @@ -146,6 +146,19 @@ public abstract class ZLApplication { return false; } + public void navigate() { + if (myWindow != null) { + myWindow.navigate(); + } + } + + public boolean canNavigate() { + if (myWindow != null) { + return myWindow.canNavigate(); + } + return false; + } + public void rotateScreen() { if (myWindow != null) { myWindow.rotate(); diff --git a/src/org/geometerplus/zlibrary/core/application/ZLApplicationWindow.java b/src/org/geometerplus/zlibrary/core/application/ZLApplicationWindow.java index 5eb74023c..824ad119c 100644 --- a/src/org/geometerplus/zlibrary/core/application/ZLApplicationWindow.java +++ b/src/org/geometerplus/zlibrary/core/application/ZLApplicationWindow.java @@ -44,6 +44,8 @@ abstract public class ZLApplicationWindow { abstract protected void rotate(); abstract protected boolean canRotate(); + abstract protected void navigate(); + abstract protected boolean canNavigate(); abstract protected void close(); } diff --git a/src/org/geometerplus/zlibrary/ui/android/application/ZLAndroidApplicationWindow.java b/src/org/geometerplus/zlibrary/ui/android/application/ZLAndroidApplicationWindow.java index e17e22259..7ea5c959f 100644 --- a/src/org/geometerplus/zlibrary/ui/android/application/ZLAndroidApplicationWindow.java +++ b/src/org/geometerplus/zlibrary/ui/android/application/ZLAndroidApplicationWindow.java @@ -119,7 +119,7 @@ public final class ZLAndroidApplicationWindow extends ZLApplicationWindow { protected void startViewAutoScrolling(int viewPage) { getViewWidget().startAutoScrolling(viewPage); } - + public void rotate() { ((ZLAndroidLibrary)ZLAndroidLibrary.Instance()).rotateScreen(); } @@ -128,6 +128,14 @@ public final class ZLAndroidApplicationWindow extends ZLApplicationWindow { return !ZLAndroidApplication.Instance().AutoOrientationOption.getValue(); } + public void navigate() { + ((ZLAndroidLibrary)ZLAndroidLibrary.Instance()).navigate(); + } + + public boolean canNavigate() { + return ((ZLAndroidLibrary)ZLAndroidLibrary.Instance()).canNavigate(); + } + public void close() { ((ZLAndroidLibrary)ZLAndroidLibrary.Instance()).finish(); } diff --git a/src/org/geometerplus/zlibrary/ui/android/library/ZLAndroidActivity.java b/src/org/geometerplus/zlibrary/ui/android/library/ZLAndroidActivity.java index fa010c9d0..2a8358f38 100644 --- a/src/org/geometerplus/zlibrary/ui/android/library/ZLAndroidActivity.java +++ b/src/org/geometerplus/zlibrary/ui/android/library/ZLAndroidActivity.java @@ -209,4 +209,7 @@ public abstract class ZLAndroidActivity extends Activity { myChangeCounter = 0; } } + + abstract protected void navigate(); + abstract protected boolean canNavigate(); } diff --git a/src/org/geometerplus/zlibrary/ui/android/library/ZLAndroidLibrary.java b/src/org/geometerplus/zlibrary/ui/android/library/ZLAndroidLibrary.java index 15e9a0134..6fbc259ae 100644 --- a/src/org/geometerplus/zlibrary/ui/android/library/ZLAndroidLibrary.java +++ b/src/org/geometerplus/zlibrary/ui/android/library/ZLAndroidLibrary.java @@ -61,6 +61,19 @@ public final class ZLAndroidLibrary extends ZLibrary { } } + public void navigate() { + if (myActivity != null) { + myActivity.navigate(); + } + } + + public boolean canNavigate() { + if (myActivity != null) { + return myActivity.canNavigate(); + } + return false; + } + public void finish() { if ((myActivity != null) && !myActivity.isFinishing()) { myActivity.finish();