/*
* Copyright (C) 2009-2015 FBReader.ORG Limited <contact@fbreader.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA.
*/
package org.geometerplus.android.fbreader;
import android.app.Activity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.*;
import org.geometerplus.zlibrary.core.application.ZLApplication;
import org.geometerplus.zlibrary.core.resources.ZLResource;
import org.geometerplus.zlibrary.text.view.ZLTextView;
import org.geometerplus.zlibrary.text.view.ZLTextWordCursor;
import org.geometerplus.zlibrary.ui.android.R;
import org.geometerplus.fbreader.bookmodel.TOCTree;
import org.geometerplus.fbreader.fbreader.FBReaderApp;
final class NavigationPopup extends ZLApplication.PopupPanel {
final static String ID = "NavigationPopup";
private volatile NavigationWindow myWindow;
private volatile FBReader myActivity;
private volatile RelativeLayout myRoot;
private ZLTextWordCursor myStartPosition;
private final FBReaderApp myFBReader;
private volatile boolean myIsInProgress;
NavigationPopup(FBReaderApp fbReader) {
super(fbReader);
myFBReader = fbReader;
}
public void setPanelInfo(FBReader activity, RelativeLayout root) {
myActivity = activity;
myRoot = root;
}
public void runNavigation() {
if (myWindow == null || myWindow.getVisibility() == View.GONE) {
myIsInProgress = false;
if (myStartPosition == null) {
myStartPosition = new ZLTextWordCursor(myFBReader.getTextView().getStartCursor());
}
Application.showPopup(ID);
}
}
@Override
protected void show_() {
if (myActivity != null) {
createPanel(myActivity, myRoot);
}
if (myWindow != null) {
myWindow.show();
setupNavigation();
}
}
@Override
protected void hide_() {
if (myWindow != null) {
myWindow.hide();
}
}
@Override
public String getId() {
return ID;
}
@Override
protected void update() {
if (!myIsInProgress && myWindow != null) {
setupNavigation();
}
}
private void createPanel(FBReader activity, RelativeLayout root) {
if (myWindow != null && activity == myWindow.getContext()) {
return;
}
activity.getLayoutInflater().inflate(R.layout.navigation_panel, root);
myWindow = (NavigationWindow)root.findViewById(R.id.navigation_panel);
final SeekBar slider = (SeekBar)myWindow.findViewById(R.id.navigation_slider);
final TextView text = (TextView)myWindow.findViewById(R.id.navigation_text);
slider.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
private void gotoPage(int page) {
final ZLTextView view = myFBReader.getTextView();
if (page == 1) {
view.gotoHome();
} else {
view.gotoPage(page);
}
myFBReader.getViewWidget().reset();
myFBReader.getViewWidget().repaint();
}
public void onStartTrackingTouch(SeekBar seekBar) {
myIsInProgress = true;
}
public void onStopTrackingTouch(SeekBar seekBar) {
myIsInProgress = false;
}
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (fromUser) {
final int page = progress + 1;
final int pagesNumber = seekBar.getMax() + 1;
gotoPage(page);
text.setText(makeProgressText(page, pagesNumber));
}
}
});
final Button btnOk = (Button)myWindow.findViewById(R.id.navigation_ok);
final Button btnCancel = (Button)myWindow.findViewById(R.id.navigation_cancel);
View.OnClickListener listener = new View.OnClickListener() {
public void onClick(View v) {
final ZLTextWordCursor position = myStartPosition;
if (v == btnCancel && position != null) {
myFBReader.getTextView().gotoPosition(position);
} else if (v == btnOk) {
if (myStartPosition != null &&
!myStartPosition.equals(myFBReader.getTextView().getStartCursor())) {
myFBReader.addInvisibleBookmark(myStartPosition);
myFBReader.storePosition();
}
}
myStartPosition = null;
Application.hideActivePopup();
myFBReader.getViewWidget().reset();
myFBReader.getViewWidget().repaint();
}
};
btnOk.setOnClickListener(listener);
btnCancel.setOnClickListener(listener);
final ZLResource buttonResource = ZLResource.resource("dialog").getResource("button");
btnOk.setText(buttonResource.getResource("ok").getValue());
btnCancel.setText(buttonResource.getResource("cancel").getValue());
}
private void setupNavigation() {
final SeekBar slider = (SeekBar)myWindow.findViewById(R.id.navigation_slider);
final TextView text = (TextView)myWindow.findViewById(R.id.navigation_text);
final ZLTextView textView = myFBReader.getTextView();
final ZLTextView.PagePosition pagePosition = textView.pagePosition();
if (slider.getMax() != pagePosition.Total - 1 || slider.getProgress() != pagePosition.Current - 1) {
slider.setMax(pagePosition.Total - 1);
slider.setProgress(pagePosition.Current - 1);
text.setText(makeProgressText(pagePosition.Current, pagePosition.Total));
}
}
private String makeProgressText(int page, int pagesNumber) {
final StringBuilder builder = new StringBuilder();
builder.append(page);
builder.append("/");
builder.append(pagesNumber);
final TOCTree tocElement = myFBReader.getCurrentTOCElement();
if (tocElement != null) {
builder.append(" ");
builder.append(tocElement.getText());
}
return builder.toString();
}
final void removeWindow(Activity activity) {
if (myWindow != null && activity == myWindow.getContext()) {
final ViewGroup root = (ViewGroup)myWindow.getParent();
myWindow.hide();
root.removeView(myWindow);
myWindow = null;
}
}
}