/**
* NanoDoA - File based document archive
*
* Copyright (C) 2011-2012 Christian Packenius, christian.packenius@googlemail.com
*
* 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
* 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 de.chris_soft.utilities.swing.pdf;
import java.awt.Image;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.SwingConstants;
import de.chris_soft.utilities.LogUtils;
import de.chris_soft.utilities.pdf.PdfPageRenderUtility;
import de.chris_soft.utilities.pdf.PdfViewConstants;
/**
* Swing label for PDF view.
* @author Christian Packenius.
*/
public class PdfPanel extends JScrollPane implements ComponentListener, PdfViewConstants {
private static final long serialVersionUID = -5395083662344706897L;
/**
* Label in the scroll panel.
*/
JLabel label;
/**
* The PDF file content.
*/
private PdfPageRenderUtility pdfRenderer = null;
/**
* If true, nothing is displayed.
*/
boolean error;
/**
* Numbers of pages in the PDF document.
*/
private int pageCount = 0;
/**
* Page (1..n) to view.
*/
private int pageID;
/**
* Image to view in the label.
*/
volatile Image image = null;
/**
* List of all page listeners.
*/
private List<PdfPageListener> pageListeners = new ArrayList<PdfPageListener>();
/**
* Mode of setting the document size.
*/
private int viewMode = VIEW_MODE_ORIGINAL_SIZE;
/**
* Constructor.
*/
public PdfPanel() {
pageID = 0;
init();
}
private void init() {
label = new JLabel();
label.setHorizontalAlignment(SwingConstants.CENTER);
label.setVerticalAlignment(SwingConstants.CENTER);
setViewportView(label);
addComponentListener(this);
}
/**
* Set a PDF file to view here.
* @param pdfRenderer Renderer of the PDF file to view here.
*/
public synchronized void setFile(PdfPageRenderUtility pdfRenderer) {
setFile(pdfRenderer, 1);
}
/**
* Set a PDF file to view here.
* @param pdfRenderer2view Renderer of the PDF file to view here.
* @param pageID Page number to view (1..pageCount).
*/
public synchronized void setFile(PdfPageRenderUtility pdfRenderer2view, int pageID) {
PdfPageRenderUtility oldPdfRenderer = pdfRenderer;
pdfRenderer = pdfRenderer2view;
pageCount = pdfRenderer.pageCount;
if (oldPdfRenderer == null || pdfRenderer2view == null || !oldPdfRenderer.pdfFile.equals(pdfRenderer2view.pdfFile)) {
setPageID(pageID);
inform4pageCount();
}
}
private void inform4pageCount() {
for (PdfPageListener listener : pageListeners) {
listener.setPageCount(pageCount);
}
}
void inform4pageID() {
for (PdfPageListener listener : pageListeners) {
listener.currentPageID(pageID);
}
}
private void paintLabel() {
try {
if (error) {
label.setIcon(null);
label.setText("Can't display PDF content!");
}
else {
label.setText(null);
Image localImage = image;
if (localImage != null) {
label.setIcon(new ImageIcon(localImage));
}
else {
label.setIcon(null);
}
}
repaint();
inform4pageID();
}
catch (Exception exception) {
LogUtils.log(exception);
}
}
private void renderPage() {
try {
image = null;
error = false;
if (pageID >= 1 && pageID <= pageCount) {
if (pdfRenderer != null) {
image = pdfRenderer.getPage(pageID, getViewport().getViewRect(), viewMode);
}
}
paintLabel();
}
catch (Exception e) {
// LogUtils.log(e);
error = true;
pageID = 0;
}
}
/**
* Returns the number of the current page.
* @return Current page number.
*/
public synchronized int getCurrentPageID() {
return pageID;
}
/**
* Add a new page listener to this PDF label.
* @param listener PDF page listener.
*/
public synchronized void addPageListener(PdfPageListener listener) {
if (!pageListeners.contains(listener)) {
pageListeners.add(listener);
}
}
/**
* Set the view mode.
* @param viewMode New view mode.
*/
public synchronized void setViewMode(int viewMode) {
this.viewMode = viewMode;
renderPage();
}
/**
* Returns the count of pages in the current PDF file.
* @return Page count.
*/
public int getPageCount() {
return pageCount;
}
/**
* Set the page to view.
* @param pageID Page number of the page to view (1..n), "1" is the first
* page.
*/
public void setPageID(int pageID) {
if (this.pageID != pageID) {
this.pageID = pageID;
renderPage();
}
}
/**
* @see java.awt.event.ComponentListener#componentResized(java.awt.event.ComponentEvent)
*/
@Override
public synchronized void componentResized(ComponentEvent componentevent) {
renderPage();
}
/**
* @see java.awt.event.ComponentListener#componentMoved(java.awt.event.ComponentEvent)
*/
@Override
public void componentMoved(ComponentEvent componentevent) {
// Ignore.
}
/**
* @see java.awt.event.ComponentListener#componentShown(java.awt.event.ComponentEvent)
*/
@Override
public void componentShown(ComponentEvent componentevent) {
// Ignore.
}
/**
* @see java.awt.event.ComponentListener#componentHidden(java.awt.event.ComponentEvent)
*/
@Override
public void componentHidden(ComponentEvent componentevent) {
// Ignore.
}
/**
* Returns the currently viewed PDF file.
* @return PDF file object or <i>null</i> if no document is shown.
*/
public File getPdfFile() {
if (pdfRenderer == null) {
return null;
}
return pdfRenderer.pdfFile;
}
}