/*
* $Id: PdfRendererController.java 3146 2008-02-20 18:10:07Z blowagie $
*
* Copyright 2007 Bruno Lowagie.
*
* 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
package com.lowagie.rups.controller;
import java.util.Observable;
import java.util.Observer;
import javax.swing.JSplitPane;
import com.lowagie.rups.model.PageLoader;
import com.lowagie.rups.model.PdfFile;
import com.lowagie.rups.view.PageNavigationListener;
import com.lowagie.rups.view.RupsMenuBar;
import com.lowagie.rups.view.renderer.PagePanel;
import com.lowagie.rups.view.renderer.ToolBar;
/**
* This is the part of Trapeze that uses SUN's PDF Renderer.
*/
public class PdfRendererController extends JSplitPane
implements Observer {
/** The page loader that provides access to the PDFPage objects. */
protected PageLoader pageLoader = null;
/** The ToolBar. */
protected ToolBar toolbar;
/** The PagePanel */
protected PagePanel pagePanel;
/** A Serial Version UID. */
private static final long serialVersionUID = 3270054619281094248L;
/**
* Constructs the rendering controller.
* @param listener a page navigation listener
*/
public PdfRendererController(PageNavigationListener listener) {
setOrientation(JSplitPane.VERTICAL_SPLIT);
setDividerLocation(33);
setDividerSize(0);
pagePanel = new PagePanel();
toolbar = new ToolBar(listener);
add(toolbar, JSplitPane.TOP);
add(pagePanel, JSplitPane.BOTTOM);
}
/**
* Starts loading pages.
* Shows page 1 of this file as soon as possible.
* @param file the PdfFile that needs to be rendered
*/
public void startPageLoader(PdfFile file) {
this.pageLoader = new PageLoader(file.getPDFFile());
gotoPage(1);
}
/**
* Shows a specific page in the page panel.
* @param pageNumber a number of a specific page.
*/
protected int showPage(int pageNumber) {
if (pageLoader == null) {
return -1;
}
pagePanel.showPage(pageLoader.loadPage(pageNumber));
pagePanel.requestFocus();
return pageNumber;
}
// page navigation
/**
* Gets the total number of pages in the document.
* @return the total number of pages
*/
public int getTotalNumberOfPages() {
if (pageLoader == null) return 0;
return pageLoader.getNumberOfPages();
}
/**
* Getter for the current page number.
* @return the page number of the page currently shown
*/
public int getCurrentPageNumber() {
return pagePanel.getCurrentPageNumber();
}
/**
* Shows a specific page.
* @param pageNumber the number of a specific page.
*/
public int gotoPage(int pageNumber) {
if (pageNumber == getCurrentPageNumber()) {
return pageNumber;
}
if (pageNumber < 0) {
toolbar.setPageNumber(-1);
return -1;
}
if (pageNumber == 0) {
pageNumber = 1;
}
else if (pageNumber > getTotalNumberOfPages()) {
pageNumber = getTotalNumberOfPages();
}
pageNumber = showPage(pageNumber);
toolbar.setPageNumber(pageNumber);
return pageNumber;
}
// Observer interface
/**
* Forwards updates from the RupsController to the Observers of this class.
* @param observable this should be the RupsController
* @param obj the object that has to be forwarded to the observers of PdfReaderController
* @see java.util.Observer#update(java.util.Observable, java.lang.Object)
*/
public void update(Observable observable, Object obj) {
if (RupsMenuBar.CLOSE.equals(obj)) {
pageLoader = null;
pagePanel.showPage(null);
toolbar.setPageNumber(-1);
}
}
}