/* * Orion Viewer - pdf, djvu, xps and cbz file viewer for android devices * * Copyright (C) 2011-2013 Michael Bogdanov & Co * * 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 3 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, see <http://www.gnu.org/licenses/>. */ package universe.constellation.orion.viewer; import android.content.ActivityNotFoundException; import android.content.Intent; import android.support.v7.app.AppCompatDialog; import android.support.v7.widget.Toolbar; import android.view.View; import android.view.Window; import android.widget.Toast; import java.util.HashMap; import java.util.List; import pl.polidea.treeview.InMemoryTreeStateManager; import pl.polidea.treeview.TreeViewList; import universe.constellation.orion.viewer.dialog.CropDialogBuilderKt; import universe.constellation.orion.viewer.filemanager.OrionFileManagerActivity; import universe.constellation.orion.viewer.outline.OutlineAdapter; import universe.constellation.orion.viewer.outline.OutlineItem; import universe.constellation.orion.viewer.prefs.GlobalOptions; import universe.constellation.orion.viewer.prefs.OrionApplication; import universe.constellation.orion.viewer.prefs.OrionBookPreferences; import universe.constellation.orion.viewer.prefs.OrionPreferenceActivity; import universe.constellation.orion.viewer.prefs.TemporaryOptions; import universe.constellation.orion.viewer.util.ColorUtil; import universe.constellation.orion.viewer.view.FullScene; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE; /** * User: mike * Date: 06.01.12 * Time: 18:28 */ public enum Action { NONE (R.string.action_none, R.integer.action_none) { @Override public void doAction(Controller controller, OrionViewerActivity activity, Object parameter) { //none action } } , MENU (R.string.action_menu, R.integer.action_menu) { @Override public void doAction(Controller controller, OrionViewerActivity activity, Object parameter) { activity.getSupportActionBar().openOptionsMenu(); } } , NEXT (R.string.action_next_page, R.integer.action_next_page) { @Override public void doAction(Controller controller, OrionViewerActivity activity, Object parameter) { if (controller != null) { controller.drawNext(); } } } , PREV (R.string.action_prev_page, R.integer.action_prev_page) { @Override public void doAction(Controller controller, OrionViewerActivity activity, Object parameter) { if (controller != null) { controller.drawPrev(); } } } , NEXT10 (R.string.action_next_10, R.integer.action_next_10) { @Override public void doAction(Controller controller, OrionViewerActivity activity, Object parameter) { int page = controller.getCurrentPage() + 10; if (page > controller.getPageCount() - 1) { page = controller.getPageCount() - 1; } controller.drawPage(page); } }, PREV10 (R.string.action_prev_10, R.integer.action_prev_10) { @Override public void doAction(Controller controller, OrionViewerActivity activity, Object parameter) { int page = controller.getCurrentPage() - 10; if (page < 0) { page = 0; } controller.drawPage(page); } }, FIRST_PAGE (R.string.action_first_page, R.integer.action_first_page) { @Override public void doAction(Controller controller, OrionViewerActivity activity, Object parameter) { if (controller != null) { controller.drawPage(0); } } } , LAST_PAGE (R.string.action_last_page, R.integer.action_last_page) { @Override public void doAction(Controller controller, OrionViewerActivity activity, Object parameter) { if (controller != null) { controller.drawPage(controller.getPageCount() - 1); } } } , SHOW_OUTLINE (R.string.action_outline, R.integer.action_open_outline) { public void doAction(Controller controller, OrionViewerActivity activity, Object parameter) { Common.d("Show Outline..."); OutlineItem[] outline = controller.getOutline(); if (outline != null && outline.length != 0) { final AppCompatDialog dialog = new AppCompatDialog(activity); dialog.supportRequestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(R.layout.outline); final Toolbar toolbar = (Toolbar) dialog.findViewById(R.id.toolbar); toolbar.setTitle(R.string.menu_outline_text); toolbar.setLogo(R.drawable.collapsed); final InMemoryTreeStateManager<Integer> manager = new InMemoryTreeStateManager<>(); manager.setVisibleByDefault(false); int navigateTo = OutlineAdapter.initializeTreeManager(manager, outline, controller.getCurrentPage()); TreeViewList tocTree = (TreeViewList) dialog.findViewById(R.id.mainTreeView); tocTree.setDivider(activity.getResources().getDrawable(android.R.drawable.divider_horizontal_bright)); tocTree.setAdapter(new OutlineAdapter(controller, activity, dialog, manager, outline)); tocTree.setSelection(navigateTo); dialog.setCanceledOnTouchOutside(true); dialog.show(); toolbar.setOnClickListener(new View.OnClickListener() { boolean expanded = false; @Override public void onClick(View v) { if (expanded) { toolbar.setLogo(R.drawable.collapsed); List<Integer> children = manager.getChildren(null); for (Integer child : children) { manager.collapseChildren(child); } } else { toolbar.setLogo(R.drawable.expanded); manager.expandEverythingBelow(null); } expanded = !expanded; } }); } else { activity.showWarning(R.string.warn_no_outline); } } }, SEARCH (R.string.action_crop_page, R.integer.action_crop_page) { @Override public void doAction(Controller controller, OrionViewerActivity activity, Object parameter) { activity.startSearch(); } }, SELECT_TEXT (R.string.action_select_text, R.integer.action_select_text) { public void doAction(Controller controller, OrionViewerActivity activity, Object parameter) { activity.textSelectionMode(false, false); } }, SELECT_WORD (R.string.action_select_word, R.integer.action_select_word) { public void doAction(Controller controller, OrionViewerActivity activity, Object parameter) { activity.textSelectionMode(true, false); } }, SELECT_WORD_AND_TRANSLATE (R.string.action_select_word_and_translate, R.integer.action_select_word_and_translate) { public void doAction(Controller controller, OrionViewerActivity activity, Object parameter) { activity.textSelectionMode(true, true); } }, ADD_BOOKMARK (R.string.action_add_bookmark, R.integer.action_add_bookmark) { public void doAction(Controller controller, OrionViewerActivity activity, Object parameter) { activity.showOrionDialog(OrionViewerActivity.ADD_BOOKMARK_SCREEN, this, parameter); } }, OPEN_BOOKMARKS (R.string.action_open_bookmarks, R.integer.action_open_bookmarks) { public void doAction(Controller controller, OrionViewerActivity activity, Object parameter) { Intent bookmark = new Intent(activity.getApplicationContext(), OrionBookmarkActivity.class); bookmark.putExtra(OrionBookmarkActivity.BOOK_ID, activity.getBookId()); activity.startActivityForResult(bookmark, OrionViewerActivity.OPEN_BOOKMARK_ACTIVITY_RESULT); } }, FULL_SCREEN (R.string.action_full_screen, R.integer.action_full_screen) { public void doAction(Controller controller, OrionViewerActivity activity, Object parameter) { GlobalOptions options = activity.getGlobalOptions(); options.saveBooleanProperty(GlobalOptions.FULL_SCREEN, !options.isFullScreen()); } }, SWITCH_COLOR_MODE (R.string.action_switch_color_mode, R.integer.action_switch_color_mode) { public void doAction(Controller controller, OrionViewerActivity activity, Object parameter) { OrionScene view = activity.getView(); FullScene scene = activity.getFullScene(); LastPageInfo currentBookParameters = activity.getOrionContext().getCurrentBookParameters(); if (currentBookParameters != null && ColorUtil.getColorMode(currentBookParameters.colorMode) == null) { activity.showLongMessage(activity.getString(R.string.select_color_mode)); return; } if (view.isDefaultColorMatrix()) { if (currentBookParameters != null) { scene.setColorMatrix(ColorUtil.getColorMode(currentBookParameters.colorMode)); } } else { scene.setColorMatrix(null); } view.invalidate(); } }, BOOK_OPTIONS (R.string.action_book_options, R.integer.action_book_options) { @Override public void doAction(Controller controller, OrionViewerActivity activity, Object parameter) { Intent intent = new Intent(activity, OrionBookPreferences.class); activity.startActivity(intent); } }, ZOOM (R.string.action_zoom_page, R.integer.action_zoom_page) { @Override public void doAction(Controller controller, OrionViewerActivity activity, Object parameter) { activity.showOrionDialog(OrionViewerActivity.ZOOM_SCREEN, null, null); } }, PAGE_LAYOUT (R.string.action_layout_page, R.integer.action_page_layout) { @Override public void doAction(Controller controller, OrionViewerActivity activity, Object parameter) { activity.showOrionDialog(OrionViewerActivity.PAGE_LAYOUT_SCREEN, null, null); } }, CROP (R.string.action_crop_page, R.integer.action_crop_page) { @Override public void doAction(Controller controller, OrionViewerActivity activity, Object parameter) { activity.showOrionDialog(OrionViewerActivity.CROP_SCREEN, null, null); } }, GOTO (R.string.action_goto_page, R.integer.action_goto_page) { @Override public void doAction(Controller controller, OrionViewerActivity activity, Object parameter) { activity.showOrionDialog(OrionViewerActivity.PAGE_SCREEN, this, null); } }, ROTATION (R.string.action_rotation_page, R.integer.action_rotation_page) { @Override public void doAction(Controller controller, OrionViewerActivity activity, Object parameter) { activity.showOrionDialog(OrionViewerActivity.ROTATION_SCREEN, null, null); } }, DICTIONARY (R.string.action_dictionary, R.integer.action_dictionary) { public void doAction(Controller controller, OrionViewerActivity activity, Object parameter) { String dict = activity.getGlobalOptions().getDictionary(); String action = null; Intent intent = new Intent(); String queryText = null; if ("FORA".equals(dict)) { action = "com.ngc.fora.action.LOOKUP"; queryText = "HEADWORD"; } else if ("COLORDICT".equals(dict)) { action = "colordict.intent.action.SEARCH"; queryText = "EXTRA_QUERY"; } else if ("AARD".equals(dict)) { action = Intent.ACTION_SEARCH; intent.setClassName("aarddict.android", "aarddict.android.LookupActivity"); queryText = "query"; parameter = safeParameter(parameter); } else if ("AARD2".equals(dict)) { action = "aard2.lookup"; queryText = "query"; parameter = safeParameter(parameter); } else if ("LINGVO".equals(dict)) { action = "com.abbyy.mobile.lingvo.intent.action.TRANSLATE"; intent.setPackage("com.abbyy.mobile.lingvo.market"); queryText = "com.abbyy.mobile.lingvo.intent.extra.TEXT"; parameter = safeParameter(parameter); } if (action != null) { intent.setAction(action); if (parameter != null) { intent.putExtra(queryText, (String) parameter); } try { activity.startActivity(intent); } catch (ActivityNotFoundException ex) { Common.d(ex); String string = activity.getString(R.string.warn_msg_no_dictionary); activity.showWarning(string + ": " + dict + ": " + ex.getMessage()); } } } private Object safeParameter(Object parameter) { return parameter == null ? "" : parameter; } }, OPEN_BOOK (R.string.action_open, R.integer.action_open_book) { public void doAction(Controller controller, OrionViewerActivity activity, Object parameter) { Intent intent = new Intent(activity, OrionFileManagerActivity.class); intent.putExtra(OrionBaseActivity.DONT_OPEN_RECENT, true); activity.startActivity(intent); } }, OPTIONS (R.string.action_options_page, R.integer.action_options_page) { @Override public void doAction(Controller controller, OrionViewerActivity activity, Object parameter) { Intent intent = new Intent(activity, OrionPreferenceActivity.class); activity.startActivity(intent); } }, CLOSE_ACTION (R.string.action_close, R.integer.action_close) { public void doAction(Controller controller, OrionViewerActivity activity, Object parameter) { activity.finish(); } }, FIT_WIDTH (R.string.action_fit_width, R.integer.action_fit_width) { @Override public void doAction(Controller controller, OrionViewerActivity activity, Object parameter) { controller.changeZoom(0); } }, FIT_HEIGHT (R.string.action_fit_height, R.integer.action_fit_heigh) { @Override public void doAction(Controller controller, OrionViewerActivity activity, Object parameter) { controller.changeZoom(-1); } }, FIT_PAGE (R.string.action_fit_page, R.integer.action_fit_page) { @Override public void doAction(Controller controller, OrionViewerActivity activity, Object parameter) { controller.changeZoom(-2); } }, ROTATE_90 (R.string.action_rotate_90, R.integer.action_rotate_90) { @Override public void doAction(Controller controller, OrionViewerActivity activity, Object parameter) { //controller.setRotation((controller.getRotation() - 1) % 2); if (activity.getRequestedOrientation() == SCREEN_ORIENTATION_LANDSCAPE || activity.getRequestedOrientation() == SCREEN_ORIENTATION_REVERSE_LANDSCAPE) { controller.changeOrinatation("PORTRAIT"); } else { controller.changeOrinatation("LANDSCAPE"); } } }, ROTATE_270 (R.string.action_rotate_270, R.integer.action_rotate_270) { @Override public void doAction(Controller controller, OrionViewerActivity activity, Object parameter) { //controller.setRotation((controller.getRotation() + 1) % 2); boolean isLevel9 = activity.getOrionContext().getSdkVersion() >= 9; if (!isLevel9 || activity.getRequestedOrientation() == SCREEN_ORIENTATION_LANDSCAPE || activity.getRequestedOrientation() == SCREEN_ORIENTATION_REVERSE_LANDSCAPE) { ROTATE_90.doAction(controller, activity, parameter); } else { controller.changeOrinatation("LANDSCAPE_INVERSE"); } } }, INVERSE_CROP (R.string.action_inverse_crops, R.integer.action_inverse_crop) { public void doAction(Controller controller, OrionViewerActivity activity, Object parameter) { TemporaryOptions opts = activity.getOrionContext().getTempOptions(); opts.inverseCropping = !opts.inverseCropping; String title = activity.getResources().getString(R.string.action_inverse_crops) + ":" +(opts.inverseCropping ? "inverted" : "normal"); Toast.makeText(activity.getApplicationContext(), title, Toast.LENGTH_SHORT).show(); } }, SWITCH_CROP (R.string.action_switch_long_crop, R.integer.action_switch_long_crop) { public void doAction(Controller controller, OrionViewerActivity activity, Object parameter) { TemporaryOptions opts = activity.getOrionContext().getTempOptions(); opts.switchCropping = !opts.switchCropping; String title = activity.getResources().getString(R.string.action_switch_long_crop) + ":" + (opts.switchCropping ? "big" : "small"); Toast.makeText(activity.getApplicationContext(), title, Toast.LENGTH_SHORT).show(); } }, CROP_LEFT (R.string.action_crop_left, R.integer.action_crop_left) { public void doAction(Controller controller, OrionViewerActivity activity, Object parameter) { updateMargin(controller, true, 0); } }, UNCROP_LEFT (R.string.action_uncrop_left, R.integer.action_uncrop_left) { public void doAction(Controller controller, OrionViewerActivity activity, Object parameter) { updateMargin(controller, false, 0); } }, CROP_RIGHT (R.string.action_crop_right, R.integer.action_crop_right) { public void doAction(Controller controller, OrionViewerActivity activity, Object parameter) { updateMargin(controller, true, 1); } }, UNCROP_RIGHT (R.string.action_uncrop_right, R.integer.action_uncrop_right) { public void doAction(Controller controller, OrionViewerActivity activity, Object parameter) { updateMargin(controller, false, 1); } }, CROP_TOP (R.string.action_crop_top, R.integer.action_crop_top) { public void doAction(Controller controller, OrionViewerActivity activity, Object parameter) { updateMargin(controller, true, 2); } }, UNCROP_TOP (R.string.action_uncrop_top, R.integer.action_uncrop_top) { public void doAction(Controller controller, OrionViewerActivity activity, Object parameter) { updateMargin(controller, false, 2); } }, CROP_BOTTOM (R.string.action_crop_bottom, R.integer.action_crop_bottom) { public void doAction(Controller controller, OrionViewerActivity activity, Object parameter) { updateMargin(controller, true, 3); } }, UNCROP_BOTTOM (R.string.action_uncrop_bottom, R.integer.action_uncrop_bottom) { public void doAction(Controller controller, OrionViewerActivity activity, Object parameter) { updateMargin(controller, false, 3); } }; private static final HashMap<Integer, Action> actions = new HashMap<>(); static { Action [] values = values(); for (Action value : values) { actions.put(value.code, value); } } private final int name; private final int code; Action(int nameId, int resId) { this.name = nameId; this.code = OrionApplication.instance.getResources().getInteger(resId); } public int getName() { return name; } public int getCode() { return code; } public static Action getAction(int code) { Action result = actions.get(code); return result != null ? result : NONE; } public void doAction(Controller controller, OrionViewerActivity activity, Object parameter) { } protected void updateMargin(Controller controller, boolean isCrop, int index) { CropMargins cropMargins = controller.getMargins(); if (cropMargins.evenCrop && controller.isEvenPage()) { if (index == 0 || index == 1) { index += 4; } } int[] margins = CropDialogBuilderKt.toDialogMargins(cropMargins); OrionApplication context = controller.getActivity().getOrionContext(); TemporaryOptions tempOpts = context.getTempOptions(); if (tempOpts.inverseCropping) { isCrop = !isCrop; } int delta = tempOpts.switchCropping ? context.getOptions().getLongCrop() : 1; margins[index] += isCrop ? delta : -delta; if (margins[index] > OrionViewerActivity.CROP_RESTRICTION_MAX) { margins[index] = OrionViewerActivity.CROP_RESTRICTION_MAX; } if (margins[index] < OrionViewerActivity.CROP_RESTRICTION_MIN) { margins[index] = OrionViewerActivity.CROP_RESTRICTION_MIN; } controller.changeCropMargins( CropDialogBuilderKt.toMargins(margins, cropMargins.evenCrop, cropMargins.cropMode) ); } }