org.jpedal.examples.viewer.commands.PageNavigator Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of OpenViewerFX Show documentation
Show all versions of OpenViewerFX Show documentation
An Open Source JavaFX PDF Viewer
/*
* ===========================================
* Java Pdf Extraction Decoding Access Library
* ===========================================
*
* Project Info: http://www.idrsolutions.com
* Help section for developers at http://www.idrsolutions.com/support/
*
* (C) Copyright 1997-2015 IDRsolutions and Contributors.
*
* This file is part of JPedal/JPDF2HTML5
*
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* ---------------
* PageNavigator.java
* ---------------
*/
package org.jpedal.examples.viewer.commands;
import javax.swing.JOptionPane;
import org.jpedal.*;
import org.jpedal.display.Display;
import org.jpedal.examples.viewer.Commands;
import org.jpedal.examples.viewer.Values;
import org.jpedal.examples.viewer.gui.GUI.PageCounter;
import org.jpedal.gui.GUIFactory;
import org.jpedal.io.TiffHelper;
import org.jpedal.utils.LogWriter;
import org.jpedal.utils.Messages;
/**
* This class controls the different methods that allow you to navigate a
* document by page, its critical method is navigatePages()
*/
public class PageNavigator {
/**
* whether page turn is currently animating
*/
private static boolean pageTurnAnimating;
/**
* flag to track if page decoded twice
*/
private static int lastPageDecoded = -1;
/**
* Objects required to load Tiff
*/
private static TiffHelper tiffHelper;
/**
* Flag to prevent page changing is page changing currently taking place (prevent viewer freezing)
*/
private static boolean pageChanging;
public static void gotoPage(String page, final GUIFactory currentGUI, final Values commonValues, final PdfDecoderInt decode_pdf) {
int newPage;
page = page.split("/")[0];
//allow for bum values
try {
newPage = Integer.parseInt(page);
//if loading on linearized thread, see if we can actually display
if (!decode_pdf.isPageAvailable(newPage)) {
currentGUI.showMessageDialog("Page " + newPage + " is not yet loaded");
currentGUI.setPageCounterText(PageCounter.PAGECOUNTER2, String.valueOf(commonValues.getCurrentPage()));
return;
}
/**
* adjust for double jump on facing
*/
if (decode_pdf.getDisplayView() == Display.FACING || decode_pdf.getDisplayView() == Display.CONTINUOUS_FACING) {
if ((decode_pdf.getPages().getBoolean(Display.BoolValue.SEPARATE_COVER) || decode_pdf.getDisplayView() != Display.FACING) && (newPage & 1) == 1 && newPage != 1) {
newPage--;
} else if (!decode_pdf.getPages().getBoolean(Display.BoolValue.SEPARATE_COVER) && (newPage & 1) == 0) {
newPage--;
}
}
//allow for invalid value
if ((newPage > decode_pdf.getPageCount()) | (newPage < 1)) {
currentGUI.showMessageDialog(Messages.getMessage("PdfViewerPageLabel.text") + ' '
+ page + ' ' + Messages.getMessage("PdfViewerOutOfRange.text") + ' ' + decode_pdf.getPageCount());
newPage = commonValues.getCurrentPage();
currentGUI.setPageNumber();
}
} catch (final Exception e) {
currentGUI.showMessageDialog('>' + page + "< " + Messages.getMessage("PdfViewerInvalidNumber.text")+ ' ' +e);
newPage = commonValues.getCurrentPage();
currentGUI.setPageCounterText(PageCounter.PAGECOUNTER2, String.valueOf(commonValues.getCurrentPage()));
}
navigatePages(newPage - commonValues.getCurrentPage(), commonValues, decode_pdf, currentGUI);
if (decode_pdf.getDisplayView() == Display.PAGEFLOW) {
navigatePages(0, commonValues, decode_pdf, currentGUI);
}
}
public static void goPage(final Object[] args, final GUIFactory currentGUI, final Values commonValues, final PdfDecoderInt decode_pdf) {
if (args == null) {
final String page = currentGUI.showInputDialog(Messages.getMessage("PdfViewer.EnterPageNumber"), Messages.getMessage("PdfViewer.GotoPage"), JOptionPane.QUESTION_MESSAGE);
if (page != null) {
gotoPage(page, currentGUI, commonValues, decode_pdf);
}
} else {
gotoPage((String) args[0], currentGUI, commonValues, decode_pdf);
}
}
public static void goLastPage(final Object[] args, final Values commonValues, final PdfDecoderInt decode_pdf, final GUIFactory currentGUI) {
if (args == null) {
if ((commonValues.getSelectedFile() != null) && (commonValues.getPageCount() > 1) && (commonValues.getPageCount() - commonValues.getCurrentPage() > 0)) // forward(commonValues.getPageCount() - commonValues.getCurrentPage());
{
navigatePages(commonValues.getPageCount() - commonValues.getCurrentPage(), commonValues, decode_pdf, currentGUI);
}
} else {
}
}
public static void goFirstPage(final Object[] args, final Values commonValues, final PdfDecoderInt decode_pdf, final GUIFactory currentGUI) {
if (args == null) {
if ((commonValues.getSelectedFile() != null) && (commonValues.getPageCount() > 1) && (commonValues.getCurrentPage() != 1)) // back(commonValues.getCurrentPage() - 1);
{
navigatePages(-(commonValues.getCurrentPage() - 1), commonValues, decode_pdf, currentGUI);
}
} else {
}
}
public static void goFForwardPage(final Object[] args, final Values commonValues, final PdfDecoderInt decode_pdf, final GUIFactory currentGUI) {
if ((args == null) && (commonValues.getSelectedFile() != null)){
if (commonValues.getPageCount() < commonValues.getCurrentPage() + 10) // forward(commonValues.getPageCount()-commonValues.getCurrentPage());
{
navigatePages(commonValues.getPageCount() - commonValues.getCurrentPage(), commonValues, decode_pdf, currentGUI);
} else {
navigatePages(10, commonValues, decode_pdf, currentGUI);
}
}
}
public static void goForwardPage(final Object[] args, final Values commonValues, final PdfDecoderInt decode_pdf, final GUIFactory currentGUI) {
if (args == null) {
if (commonValues.getSelectedFile() != null) // forward(1);
{
navigatePages(1, commonValues, decode_pdf, currentGUI);
}
} else {
if (commonValues.getSelectedFile() != null) // forward(Integer.parseInt((String) args[0]));
{
navigatePages(Integer.parseInt((String) args[0]), commonValues, decode_pdf, currentGUI);
}
while (Values.isProcessing()) {
//Wait while pdf is loading
try {
Thread.sleep(5000);
} catch (Exception e) {
LogWriter.writeLog("Attempting to set propeties values " + e);
}
}
}
}
public static void goBackPage(final Object[] args, final Values commonValues, final PdfDecoderInt decode_pdf, final GUIFactory currentGUI) {
if (args == null) {
if (commonValues.getSelectedFile() != null) // back(1);
{
navigatePages(-1, commonValues, decode_pdf, currentGUI);
}
} else {
if (commonValues.getSelectedFile() != null) // back(Integer.parseInt((String) args[0]));
{
navigatePages(-Integer.parseInt((String) args[0]), commonValues, decode_pdf, currentGUI);
}
while (Values.isProcessing()) {
//Wait while pdf is loading
try {
Thread.sleep(5000);
} catch (Exception e) {
LogWriter.writeLog("Attempting to set propeties values " + e);
}
}
}
}
public static void goFBackPage(final Object[] args, final Values commonValues, final PdfDecoderInt decode_pdf, final GUIFactory currentGUI) {
if (args == null) {
if (commonValues.getSelectedFile() != null) {
if (commonValues.getCurrentPage() <= 10) // back(commonValues.getCurrentPage() - 1);
{
navigatePages(-(commonValues.getCurrentPage() - 1), commonValues, decode_pdf, currentGUI);
} else // back(10);
{
navigatePages(-10, commonValues, decode_pdf, currentGUI);
}
}
} else {
}
}
private static int getUpdatedPageNumber(int displayMode, int currentPage, int totalPageCount, int changeCount) {
//Facing modes need to move at least by 2 pages others page will not change
if (displayMode == Display.FACING || displayMode == Display.CONTINUOUS_FACING) {
if (changeCount == -1 && currentPage != 2) {
changeCount = -2;
}
if (changeCount == 1 && currentPage != totalPageCount - 1) {
changeCount = 2;
}
}
//new page number
return currentPage + changeCount;
}
private static void changePage(PdfDecoderInt decode_pdf, GUIFactory currentGUI, Values commonValues, int updatedTotal) {
commonValues.setCurrentPage(updatedTotal);
//currentGUI.setPageNumber();
if (decode_pdf.getDisplayView() == Display.CONTINUOUS
|| decode_pdf.getDisplayView() == Display.CONTINUOUS_FACING) {
currentGUI.decodePage();
//Added here else number not updated
currentGUI.setPageNumber();
pageChanging = false;
return;
}
currentGUI.resetStatusMessage("Loading Page " + commonValues.getCurrentPage());
/**
* reset as rotation may change!
*/
decode_pdf.setPageParameters(currentGUI.getScaling(), commonValues.getCurrentPage());
//decode the page
if (commonValues.isPDF()) {
currentGUI.decodePage();
}
//if scaling to window reset screen to fit rotated page
//if(currentGUI.getSelectedComboIndex(Commands.SCALING)<3)
//currentGUI.zoom();
}
private static void navigatePagePrevious(int count, final Values commonValues, final PdfDecoderInt decode_pdf, final GUIFactory currentGUI) {
int updatedTotal = getUpdatedPageNumber(decode_pdf.getDisplayView(), commonValues.getCurrentPage(), decode_pdf.getPageCount(), count);
/**
* example code to show how to check if page is now available
*/
//if loading on linearized thread, see if we can actually display
if (!decode_pdf.isPageAvailable(updatedTotal)) {
currentGUI.showMessageDialog("Page " + updatedTotal + " is not yet loaded");
pageChanging = false;
return;
}
if (!Values.isProcessing()) { //lock to stop multiple accesses
/**
* if in range update count and decode next page. Decoded pages are
* cached so will redisplay almost instantly
*/
if (updatedTotal <= commonValues.getPageCount()) {
if (commonValues.isMultiTiff()) {
changeTiffPage(commonValues, decode_pdf, currentGUI, count, updatedTotal);
} else {
/**
* adjust for double jump on facing
*/
if (decode_pdf.getDisplayView() == Display.FACING || decode_pdf.getDisplayView() == Display.CONTINUOUS_FACING) {
if (decode_pdf.getPages().getBoolean(Display.BoolValue.SEPARATE_COVER) || decode_pdf.getDisplayView() != Display.FACING) {
// updatedTotal++;
if (updatedTotal > commonValues.getPageCount()) {
updatedTotal = commonValues.getPageCount();
}
if ((updatedTotal & 1) == 1 && updatedTotal != 1) {
updatedTotal--;
}
if (decode_pdf.getDisplayView() == Display.FACING) {
count = ((updatedTotal) / 2) - ((commonValues.getCurrentPage()) / 2);
}
} else {
// updatedTotal++;
if ((updatedTotal & 1) == 0) {
updatedTotal--;
}
count = ((updatedTotal + 1) / 2) - ((commonValues.getCurrentPage() + 1) / 2);
}
}
/**
* animate if using drag in facing
*/
if (count == 1 && decode_pdf.getDisplayView() == Display.FACING
&& decode_pdf.getPages().getBoolean(Display.BoolValue.TURNOVER_ON)
&& decode_pdf.getPageCount() != 2
&& currentGUI.getPageTurnScalingAppropriate()
&& updatedTotal / 2 != commonValues.getCurrentPage() / 2
&& !decode_pdf.getPdfPageData().hasMultipleSizes()
&& !pageTurnAnimating) {
currentGUI.triggerPageTurnAnimation(null, commonValues, updatedTotal, false);
} else {
changePage(decode_pdf, currentGUI, commonValues, updatedTotal);
}
}
}
} else {
currentGUI.showMessageDialog(Messages.getMessage("PdfViewerDecodeWait.message"));
}
}
private static void navigatePageNext(int count, final Values commonValues, final PdfDecoderInt decode_pdf, final GUIFactory currentGUI) {
int updatedTotal = getUpdatedPageNumber(decode_pdf.getDisplayView(), commonValues.getCurrentPage(), decode_pdf.getPageCount(), count);
//if loading on linearized thread, see if we can actually display
if (!decode_pdf.isPageAvailable(updatedTotal)) {
currentGUI.showMessageDialog("Page " + updatedTotal + " is not yet loaded");
pageChanging = false;
return;
}
if (!Values.isProcessing()) { //lock to stop multiple accesses
/**
* if in range update count and decode next page. Decoded pages are
* cached so will redisplay almost instantly
*/
if (updatedTotal >= 1) {
if (commonValues.isMultiTiff()) {
changeTiffPage(commonValues, decode_pdf, currentGUI, count, updatedTotal);
} else {
/**
* adjust for double jump on facing
*/
if (decode_pdf.getDisplayView() == Display.FACING || decode_pdf.getDisplayView() == Display.CONTINUOUS_FACING) {
if (decode_pdf.getPages().getBoolean(Display.BoolValue.SEPARATE_COVER) || decode_pdf.getDisplayView() != Display.FACING) {
if (count == -1) {
updatedTotal--;
}
if (updatedTotal < 1) {
updatedTotal = 1;
}
if ((updatedTotal & 1) == 1 && updatedTotal != 1) {
updatedTotal--;
}
if (decode_pdf.getDisplayView() == Display.FACING) {
count = ((updatedTotal) / 2) - ((commonValues.getCurrentPage()) / 2);
}
} else {
if ((updatedTotal & 1) == 0) {
updatedTotal--;
}
if (decode_pdf.getDisplayView() == Display.FACING) {
count = ((updatedTotal + 1) / 2) - ((commonValues.getCurrentPage() + 1) / 2);
}
}
}
/**
* animate if using drag in facing
*/
if (count == -1 && decode_pdf.getDisplayView() == Display.FACING
&& decode_pdf.getPages().getBoolean(Display.BoolValue.TURNOVER_ON)
&& currentGUI.getPageTurnScalingAppropriate()
&& decode_pdf.getPageCount() != 2
&& (updatedTotal != commonValues.getCurrentPage() - 1 || updatedTotal == 1)
&& !decode_pdf.getPdfPageData().hasMultipleSizes()
&& !pageTurnAnimating) {
currentGUI.triggerPageTurnAnimation(null, commonValues, updatedTotal, true);
} else {
changePage(decode_pdf, currentGUI, commonValues, updatedTotal);
}
}
}
} else {
currentGUI.showMessageDialog(Messages.getMessage("PdfViewerDecodeWait.message"));
}
}
public static void navigatePages(int count, final Values commonValues, final PdfDecoderInt decode_pdf, final GUIFactory currentGUI) {
if (count == 0) {
return;
}
if(!pageChanging){
pageChanging = true;
if (count > 0) {
navigatePageNext(count, commonValues, decode_pdf, currentGUI);
} else {
navigatePagePrevious(count, commonValues, decode_pdf, currentGUI);
}
//Ensure thumbnail scroll bar is updated when page changed
if (currentGUI.getThumbnailScrollBar() != null) {
currentGUI.setThumbnailScrollBarValue(commonValues.getCurrentPage() - 1);
}
//After changing page, ensure buttons are updated, redundent buttons are hidden
currentGUI.getButtons().hideRedundentNavButtons(currentGUI);
currentGUI.setPageNumber();
pageChanging = false;
}
}
private static void changeTiffPage(Values commonValues, PdfDecoderInt decode_pdf, GUIFactory currentGUI, int count, int updatedTotal){
//Update page number and draw new page
commonValues.setTiffImageToLoad((lastPageDecoded - 1) + count);
drawMultiPageTiff(commonValues, decode_pdf);
//Update Tiff page
commonValues.setCurrentPage(updatedTotal);
lastPageDecoded = commonValues.getTiffImageToLoad() + 1;
currentGUI.setPageNumber();
//Display new page
decode_pdf.repaint();
}
public static void drawMultiPageTiff(final Values commonValues, final PdfDecoderInt decode_pdf) {
if (tiffHelper != null) {
commonValues.setBufferedImg(tiffHelper.getImage(commonValues.getTiffImageToLoad()));
if (commonValues.getBufferedImg() != null) {
/**
* flush any previous pages
*/
decode_pdf.getDynamicRenderer().flush();
decode_pdf.getPages().refreshDisplay();
Images.addImage(decode_pdf, commonValues);
}
}
}
public static void setPageTurnAnimating(final boolean a, final GUIFactory currentGUI) {
pageTurnAnimating = a;
//disable buttons during animation
if (a) {
currentGUI.getButtons().getButton(Commands.FORWARDPAGE).setEnabled(false);
currentGUI.getButtons().getButton(Commands.BACKPAGE).setEnabled(false);
currentGUI.getButtons().getButton(Commands.FFORWARDPAGE).setEnabled(false);
currentGUI.getButtons().getButton(Commands.FBACKPAGE).setEnabled(false);
currentGUI.getButtons().getButton(Commands.LASTPAGE).setEnabled(false);
currentGUI.getButtons().getButton(Commands.FIRSTPAGE).setEnabled(false);
} else {
currentGUI.getButtons().hideRedundentNavButtons(currentGUI);
}
}
public static boolean getPageTurnAnimating() {
return pageTurnAnimating;
}
public static void setLastPageDecoded(final int x) {
lastPageDecoded = x;
}
public static TiffHelper getTiffHelper() {
return tiffHelper;
}
public static void setTiffHelper(final TiffHelper tiffHelp) {
tiffHelper = tiffHelp;
}
}