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();