Package de.chris_soft.utilities.swing.pdf

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

/**
* 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.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import de.chris_soft.utilities.LogUtils;
import de.chris_soft.utilities.pdf.PdfPageRenderUtility;
import de.chris_soft.utilities.pdf.PdfViewConstants;
import de.chris_soft.utilities.swing.SwingUtils;

/**
* A composite object for zapping through through the pages of a pdf file.
* @author Christian Packenius.
*/
public class PdfZapper implements ActionListener, PdfPageListener, ListSelectionListener, PdfViewConstants {
  private final JPanel xPanel = new JPanel();

  /**
   * Label for PDF page view.
   */
  private final PdfPanel pdfPanel;

  /**
   * Button to go to the first page.
   */
  private JButton firstPageButton;

  /**
   * Button to go to the first page.
   */
  private JButton previousPageButton;

  /**
   * Button to go to the first page.
   */
  private JButton nextPageButton;

  /**
   * Button to go to the first page.
   */
  private JButton lastPageButton;

  /**
   * ComboBox with PDF page count.
   */
  JComboBox pageCombo;

  /**
   * ComboBox with page view sizes.
   */
  JComboBox viewSizeCombo;

  private List<PdfPageListener> pdfPageListeners = new ArrayList<PdfPageListener>();

  /**
   * Testmethode.
   * @param args
   * @throws IOException
   */
  public static void main(String[] args) throws IOException {
    JFrame frame = new JFrame();
    PdfZapper pdfZapper = new PdfZapper();
    frame.add(BorderLayout.CENTER, pdfZapper.getComponent());
    pdfZapper.setFile(new PdfPageRenderUtility(new File("Anleitung Image Resiezer.pdf")));
    frame.setSize(800, 600);
    frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    frame.setVisible(true);
  }

  /**
   * Constructor.
   */
  public PdfZapper() {
    xPanel.setLayout(new BorderLayout(2, 2));
    pdfPanel = new PdfPanel();
    xPanel.add(BorderLayout.CENTER, pdfPanel);
    JPanel navigationPanel = getNavigationPanel();
    JPanel viewModePanel = getViewModePanel();
    JPanel buttonPanel = new JPanel(new BorderLayout(2, 2));
    buttonPanel.add(BorderLayout.CENTER, navigationPanel);
    buttonPanel.add(BorderLayout.EAST, viewModePanel);
    xPanel.add(BorderLayout.SOUTH, buttonPanel);
    pdfPanel.addPageListener(this);
    setComponentStates();
  }

  /**
   * Set the view mode.
   * @param viewMode New view mode.
   */
  public void setViewMode(int viewMode) {
    pdfPanel.setViewMode(viewMode);
  }

  /**
   * Returns the swing component.
   * @return JPanel object.
   */
  public JPanel getComponent() {
    return xPanel;
  }

  private JPanel getNavigationPanel() {
    JPanel navigationPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
    navigationPanel.add(firstPageButton = new JButton("<<"));
    navigationPanel.add(previousPageButton = new JButton("<"));
    navigationPanel.add(pageCombo = new JComboBox());
    navigationPanel.add(nextPageButton = new JButton(">"));
    navigationPanel.add(lastPageButton = new JButton(">>"));
    firstPageButton.addActionListener(this);
    previousPageButton.addActionListener(this);
    nextPageButton.addActionListener(this);
    lastPageButton.addActionListener(this);
    pageCombo.addActionListener(this);
    return navigationPanel;
  }

  private JPanel getViewModePanel() {
    JPanel viewModePanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
    viewModePanel.add(viewSizeCombo = getViewSizeComboBox());
    viewSizeCombo.addActionListener(this);
    return viewModePanel;
  }

  private JComboBox getViewSizeComboBox() {
    final JComboBox combo = new JComboBox();
    try {
      SwingUtils.runInGuiNow(new Runnable() {
        @Override
        public void run() {
          DefaultComboBoxModel model = (DefaultComboBoxModel) combo.getModel();
          model.addElement(new ViewMode(VIEW_MODE_ORIGINAL_SIZE, "Original size"));
          model.addElement(new ViewMode(VIEW_MODE_FIT_TO_SIZE, "Fit to page"));
          model.addElement(new ViewMode(VIEW_MODE_FIT_TO_WIDTH, "Fit to width"));
          model.addElement(new ViewMode(VIEW_MODE_FIT_TO_HEIGHT, "Fit to height"));
          model.addElement(new ViewMode(10));
          model.addElement(new ViewMode(20));
          model.addElement(new ViewMode(25));
          model.addElement(new ViewMode(50));
          model.addElement(new ViewMode(75));
          model.addElement(new ViewMode(100));
          model.addElement(new ViewMode(150));
          model.addElement(new ViewMode(200));
          model.addElement(new ViewMode(300));
          model.addElement(new ViewMode(400));
          model.addElement(new ViewMode(500));
          model.addElement(new ViewMode(750));
          model.addElement(new ViewMode(1000));
          model.addElement(new ViewMode(2000));
          model.addElement(new ViewMode(5000));
        }
      });
    } catch (Exception exception) {
      LogUtils.log(exception);
    }
    return combo;
  }

  /**
   * Constructor.
   * @param pdfRenderer PDF file to view.
   * @param withThumbnailList If <i>true</i>, a thumbnail list is displayed at the left side.
   * @throws IOException
   */
  public PdfZapper(PdfPageRenderUtility pdfRenderer, boolean withThumbnailList) throws IOException {
    this();
    setFile(pdfRenderer);
  }

  /**
   * Set a PDF file to display here.
   * @param pdfRenderer PDF file to display.
   */
  public void setFile(PdfPageRenderUtility pdfRenderer) {
    setFile(pdfRenderer, 1);
  }

  /**
   * Set a PDF file to display here.
   * @param pdfRenderer PDF file to display.
   * @param pageID Page number to display.
   */
  public void setFile(PdfPageRenderUtility pdfRenderer, int pageID) {
    pdfPanel.setFile(pdfRenderer, pageID);
    setComponentStates();
  }

  private void setComponentStates() {
    boolean enabled = pdfPanel.getPdfFile() != null;
    firstPageButton.setEnabled(enabled);
    previousPageButton.setEnabled(enabled);
    nextPageButton.setEnabled(enabled);
    lastPageButton.setEnabled(enabled);
    pageCombo.setEnabled(enabled);
    viewSizeCombo.setEnabled(enabled);
  }

  /**
   * Set the page number of the page to display.
   * @param pageID Page number to display.
   */
  public void setPageID(int pageID) {
    pdfPanel.setPageID(pageID);
    informPageListener(pageID);
  }

  private void informPageListener(int pageID) {
    for (PdfPageListener listener : pdfPageListeners) {
      listener.currentPageID(pageID);
    }
  }

  /**
   * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
   */
  @Override
  public void actionPerformed(ActionEvent actionevent) {
    Object source = actionevent.getSource();
    if (source == firstPageButton) {
      setPageID(1);
    }
    else if (source == previousPageButton) {
      int pageID = pdfPanel.getCurrentPageID() - 1;
      if (pageID > 0) {
        setPageID(pageID);
      }
    }
    else if (source == nextPageButton) {
      int pageID = pdfPanel.getCurrentPageID() + 1;
      if (pageID <= pdfPanel.getPageCount()) {
        setPageID(pageID);
      }
    }
    else if (source == lastPageButton) {
      setPageID(pdfPanel.getPageCount());
    }
    else if (source == pageCombo) {
      setPageID(pageCombo.getSelectedIndex() + 1);
    }
    else if (source == viewSizeCombo) {
      ViewMode selectedItem = (ViewMode) viewSizeCombo.getSelectedItem();
      setViewMode(selectedItem.viewMode);
    }
  }

  /**
   * @see PdfPageListener#currentPageID(int)
   */
  @Override
  public void currentPageID(final int pageID) {
    if (pageID > 0 && pageID <= pageCombo.getItemCount()) {
      try {
        SwingUtils.runInGuiNow(new Runnable() {
          @Override
          public void run() {
            DefaultComboBoxModel model = (DefaultComboBoxModel) pageCombo.getModel();
            model.setSelectedItem(model.getElementAt(pageID - 1));
          }
        });
      } catch (Exception exception) {
        LogUtils.log(exception);
      }
    }
  }

  /**
   * @see PdfPageListener#setPageCount(int)
   */
  @Override
  public void setPageCount(final int pageCount) {
    try {
      SwingUtils.runInGuiNow(new Runnable() {
        @Override
        public void run() {
          setPagesInComboBox(pageCount);
        }
      });
    } catch (Exception exception) {
      LogUtils.log(exception);
    }
  }

  void setPagesInComboBox(int pageCount) {
    DefaultComboBoxModel model = (DefaultComboBoxModel) pageCombo.getModel();
    model.removeAllElements();
    for (int i = 1; i <= pageCount; i++) {
      model.addElement("" + i);
    }
  }

  /**
   * @see javax.swing.event.ListSelectionListener#valueChanged(javax.swing.event.ListSelectionEvent)
   */
  @Override
  public void valueChanged(ListSelectionEvent e) {
    JList jList = (JList) e.getSource();
    setPageID(jList.getSelectedIndex());
  }

  /**
   * Adds another listener to the PDF page listener list.
   * @param listener PDF page listener object.
   */
  public void addPageListener(PdfPageListener listener) {
    pdfPageListeners.add(listener);
  }

  private class ViewMode {
    /**
     * View size / view mode.
     */
    public final int viewMode;

    private String name;

    /**
     * Constructor.
     * @param sizeInPercent View size in percent.
     */
    public ViewMode(int sizeInPercent) {
      this(sizeInPercent, sizeInPercent + "%");
    }

    /**
     * Constructor.
     * @param viewMode View mode or view size.
     * @param name Display name.
     */
    public ViewMode(int viewMode, String name) {
      this.viewMode = viewMode;
      this.name = name;
    }

    @Override
    public String toString() {
      return name;
    }
  }
}
TOP

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

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.