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