package org.ebookdroid.ui.viewer.dialogs;
import org.emdev.ui.uimanager.UIManagerAppCompat;
import org.sufficientlysecure.viewer.R;
import org.ebookdroid.common.settings.AppSettings;
import org.ebookdroid.common.settings.books.BookSettings;
import org.ebookdroid.common.settings.books.Bookmark;
import org.ebookdroid.core.Page;
import org.ebookdroid.core.models.DocumentModel;
import org.ebookdroid.ui.viewer.IActivityController;
import org.ebookdroid.ui.viewer.adapters.BookmarkAdapter;
import android.app.Dialog;
import android.content.Context;
import android.text.Editable;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.Toast;
import org.emdev.ui.actions.ActionDialogBuilder;
import org.emdev.ui.actions.ActionEx;
import org.emdev.ui.actions.ActionMethod;
import org.emdev.ui.actions.DialogController;
import org.emdev.ui.actions.IActionController;
import org.emdev.ui.actions.params.Constant;
import org.emdev.ui.actions.params.EditableValue;
import org.emdev.ui.uimanager.IUIManager;
import org.emdev.ui.widget.IViewContainer;
import org.emdev.ui.widget.SeekBarIncrementHandler;
import org.emdev.utils.LayoutUtils;
public class GoToPageDialog extends Dialog {
final IActivityController base;
final SeekBarIncrementHandler handler;
BookmarkAdapter adapter;
Bookmark current;
DialogController<GoToPageDialog> actions;
int offset;
public GoToPageDialog(final IActivityController base) {
super(base.getContext());
this.base = base;
this.actions = new DialogController<GoToPageDialog>(this);
this.handler = new SeekBarIncrementHandler();
final BookSettings bs = base.getBookSettings();
this.offset = bs != null ? bs.firstPageOffset : 1;
setTitle(R.string.dialog_title_goto_page);
setContentView(R.layout.gotopage);
final SeekBar seekbar = (SeekBar) findViewById(R.id.seekbar);
final EditText editText = (EditText) findViewById(R.id.pageNumberTextEdit);
actions.connectViewToAction(R.id.bookmark_add);
actions.connectViewToAction(R.id.bookmark_remove_all);
actions.connectViewToAction(R.id.bookmark_remove);
actions.connectViewToAction(R.id.goToButton);
actions.connectEditorToAction(editText, R.id.actions_gotoPage);
seekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(final SeekBar seekBar) {
}
@Override
public void onStartTrackingTouch(final SeekBar seekBar) {
}
@Override
public void onProgressChanged(final SeekBar seekBar, final int progress, final boolean fromUser) {
updateControls(progress, false);
}
});
handler.init(new IViewContainer.DialogBridge(this), seekbar, R.id.seekbar_minus, R.id.seekbar_plus);
}
@Override
protected void onStart() {
super.onStart();
LayoutUtils.maximizeWindow(getWindow());
final DocumentModel dm = base.getDocumentModel();
final Page lastPage = dm != null ? dm.getLastPageObject() : null;
final int current = dm != null ? dm.getCurrentViewPageIndex() : 0;
final int max = lastPage != null ? lastPage.index.viewIndex : 0;
adapter = new BookmarkAdapter(this.getContext(), actions, lastPage, base.getBookSettings());
final ListView bookmarks = (ListView) findViewById(R.id.bookmarks);
bookmarks.setAdapter(adapter);
final SeekBar seekbar = (SeekBar) findViewById(R.id.seekbar);
seekbar.setMax(max);
updateControls(current, true);
}
@Override
protected void onStop() {
final ListView bookmarks = (ListView) findViewById(R.id.bookmarks);
bookmarks.setAdapter(null);
adapter = null;
UIManagerAppCompat.invalidateOptionsMenu(base.getManagedComponent());
}
@ActionMethod(ids = R.id.goToButton)
public void goToPageAndDismiss(final ActionEx action) {
if (navigateToPage()) {
dismiss();
}
}
@ActionMethod(ids = R.id.actions_setBookmarkedPage)
public void updateControls(final ActionEx action) {
final View view = action.getParameter(IActionController.VIEW_PROPERTY);
final Bookmark bookmark = (Bookmark) view.getTag();
final Page actualPage = bookmark.page.getActualPage(base.getDocumentModel(), adapter.bookSettings);
if (actualPage != null) {
updateControls(actualPage.index.viewIndex, true);
}
current = bookmark;
}
@ActionMethod(ids = R.id.actions_showDeleteBookmarkDlg)
public void showDeleteBookmarkDlg(final ActionEx action) {
final View view = action.getParameter(IActionController.VIEW_PROPERTY);
final Bookmark bookmark = view != null ? (Bookmark) view.getTag() : null;
if (bookmark.service) {
return;
}
final ActionDialogBuilder builder = new ActionDialogBuilder(getContext(), actions);
builder.setTitle(R.string.del_bookmark_title);
builder.setMessage(R.string.del_bookmark_text);
builder.setPositiveButton(R.id.actions_removeBookmark, new Constant("bookmark", bookmark));
builder.setNegativeButton().show();
}
@ActionMethod(ids = R.id.actions_removeBookmark)
public void removeBookmark(final ActionEx action) {
final Bookmark bookmark = action.getParameter("bookmark");
adapter.remove(bookmark);
}
@ActionMethod(ids = R.id.bookmark_add)
public void showAddBookmarkDlg(final ActionEx action) {
final Context context = getContext();
final View view = action.getParameter(IActionController.VIEW_PROPERTY);
final Bookmark bookmark = (Bookmark) view.getTag();
final EditText input = (EditText) LayoutInflater.from(getContext()).inflate(R.layout.bookmark_edit, null);
final ActionDialogBuilder builder = new ActionDialogBuilder(getContext(), actions);
builder.setMessage(R.string.add_bookmark_name);
builder.setView(input);
if (bookmark == null) {
builder.setTitle(R.string.menu_add_bookmark);
final SeekBar seekbar = (SeekBar) findViewById(R.id.seekbar);
final int viewIndex = seekbar.getProgress();
input.setText(context.getString(R.string.text_page) + " " + (viewIndex + offset));
input.selectAll();
builder.setPositiveButton(R.id.actions_addBookmark, new EditableValue("input", input), new Constant(
"viewIndex", viewIndex));
} else {
builder.setTitle(R.string.menu_edit_bookmark);
input.setText(bookmark.name);
input.selectAll();
builder.setPositiveButton(R.id.actions_addBookmark, new EditableValue("input", input), new Constant(
"bookmark", bookmark));
}
builder.setNegativeButton().show();
}
@ActionMethod(ids = R.id.actions_addBookmark)
public void addBookmark(final ActionEx action) {
final Editable value = action.getParameter("input");
final Bookmark bookmark = action.getParameter("bookmark");
if (bookmark != null) {
bookmark.name = value.toString();
adapter.update(bookmark);
} else {
final Integer viewIndex = action.getParameter("viewIndex");
final Page page = base.getDocumentModel().getPageObject(viewIndex);
adapter.add(new Bookmark(value.toString(), page.index, 0, 0));
adapter.notifyDataSetChanged();
}
}
@ActionMethod(ids = { R.id.bookmark_remove_all, R.id.actions_showDeleteAllBookmarksDlg })
public void showDeleteAllBookmarksDlg(final ActionEx action) {
if (!adapter.hasUserBookmarks()) {
return;
}
final ActionDialogBuilder builder = new ActionDialogBuilder(getContext(), actions);
builder.setTitle(R.string.clear_bookmarks_title);
builder.setMessage(R.string.clear_bookmarks_text);
builder.setPositiveButton(R.id.actions_deleteAllBookmarks);
builder.setNegativeButton().show();
}
@ActionMethod(ids = R.id.actions_deleteAllBookmarks)
public void deleteAllBookmarks(final ActionEx action) {
adapter.clear();
}
private void updateControls(final int viewIndex, final boolean updateBar) {
final SeekBar seekbar = (SeekBar) findViewById(R.id.seekbar);
final EditText editText = (EditText) findViewById(R.id.pageNumberTextEdit);
editText.setText("" + (viewIndex + offset));
editText.selectAll();
if (updateBar) {
seekbar.setProgress(viewIndex);
}
current = null;
}
private boolean navigateToPage() {
if (current != null) {
final Page actualPage = current.page.getActualPage(base.getDocumentModel(), adapter.bookSettings);
if (actualPage != null) {
base.jumpToPage(actualPage.index.viewIndex, current.offsetX, current.offsetY,
AppSettings.current().storeGotoHistory);
return true;
}
return false;
}
final EditText text = (EditText) findViewById(R.id.pageNumberTextEdit);
final int pageNumber = getEnteredPageIndex(text);
final int pageCount = base.getDocumentModel().getPageCount();
if (pageNumber < 0 || pageNumber >= pageCount) {
final String msg = base.getContext().getString(R.string.bookmark_invalid_page, offset, pageCount - 1 + offset);
Toast.makeText(getContext(), msg, Toast.LENGTH_LONG).show();
return false;
}
base.jumpToPage(pageNumber, 0, 0, AppSettings.current().storeGotoHistory);
return true;
}
private int getEnteredPageIndex(final EditText text) {
try {
return Integer.parseInt(text.getText().toString()) - offset;
} catch (final Exception e) {
}
return -1;
}
}