Package de.chris_soft.utilities.swing.pdf

Source Code of de.chris_soft.utilities.swing.pdf.PdfPanel

/**
* 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;
  }
}
TOP

Related Classes of de.chris_soft.utilities.swing.pdf.PdfPanel

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.