org.jopendocument.panel.ODSViewerPanel Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jOpenDocument Show documentation
Show all versions of jOpenDocument Show documentation
jOpenDocument is a free library for developers looking to use
Open Document files without OpenOffice.org.
The newest version!
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2008-2013 jOpenDocument, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU
* General Public License Version 3 only ("GPL").
* You may not use this file except in compliance with the License.
* You can obtain a copy of the License at http://www.gnu.org/licenses/gpl-3.0.html
* See the License for the specific language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*
*/
package org.jopendocument.panel;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.ScrollPaneConstants;
import org.jopendocument.model.OpenDocument;
import org.jopendocument.print.DocumentPrinter;
import org.jopendocument.renderer.ODTRenderer;
public class ODSViewerPanel extends JPanel {
/**
*
*/
private static final long serialVersionUID = -6113257667157151508L;
private final ODTRenderer renderer;
private int mode;
private int zoom = 100;
private static final int MODE_PAGE = 0;
private static final int MODE_WIDTH = 1;
private static final int MODE_ZOOM = 2;
private JScrollPane scroll;
private final JPanel viewer = new JPanel();
private final JTextField textFieldZoomValue = new JTextField(5);
private int currentPageIndex = 0;
public ODSViewerPanel(final OpenDocument doc) {
this(doc, null);
}
public ODSViewerPanel(final OpenDocument doc, final boolean ignoreMargin) {
this(doc, null, ignoreMargin);
}
public ODSViewerPanel(final OpenDocument doc, final DocumentPrinter printListener) {
this(doc, printListener, true);
}
public ODSViewerPanel(final OpenDocument doc, final DocumentPrinter printListener, final boolean ignoreMargin) {
Toolkit.getDefaultToolkit().setDynamicLayout(false);
this.setOpaque(false);
renderer = new ODTRenderer(doc);
renderer.setIgnoreMargins(ignoreMargin);
updateMode(MODE_ZOOM, this.zoom);
JPanel tools = new JPanel();
final JButton buttonTailleReelle = new JButton(Messages.getString("ODSViewerPanel.normalSize"));
buttonTailleReelle.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
updateMode(MODE_ZOOM, 100);
}
});
tools.add(buttonTailleReelle);
final JButton buttonFullPage = new JButton(Messages.getString("ODSViewerPanel.fitPage"));
buttonFullPage.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (mode != MODE_PAGE) {
int width = (int) scroll.getViewportBorderBounds().getWidth();
int height = (int) scroll.getViewportBorderBounds().getHeight();
final double resizeW = renderer.getPageWidth() / width;
final double resizeH = renderer.getPageHeight() / height;
double resize = resizeH;
if (resizeW > resizeH) {
resize = resizeW;
}
updateMode(MODE_PAGE, (int) ((100 * 360) / resize));
}
}
});
tools.add(buttonFullPage);
final JButton buttonFullWidth = new JButton(Messages.getString("ODSViewerPanel.fitWidth"));
buttonFullWidth.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int width = (int) (scroll.getViewportBorderBounds().getWidth());
final double resizeW = renderer.getPageWidth() / width;
updateMode(MODE_WIDTH, (int) ((100 * 360) / resizeW));
}
});
tools.add(buttonFullWidth);
final JButton buttonZoomOut = new JButton("-");
buttonZoomOut.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (zoom > 30) {
updateMode(mode, zoom - 20);
}
}
});
tools.add(buttonZoomOut);
textFieldZoomValue.setEditable(false);
tools.add(textFieldZoomValue);
final JButton buttonZoomIn = new JButton("+");
buttonZoomIn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int z = zoom + 20;
if (z > 400)
z = 400;
updateMode(mode, z);
}
});
tools.add(buttonZoomIn);
// Viewer
viewer.setOpaque(false);
viewer.setBackground(Color.DARK_GRAY);
viewer.setLayout(null);
renderer.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY));
viewer.add(renderer);
this.setLayout(new BorderLayout());
this.add(tools, BorderLayout.NORTH);
scroll = new JScrollPane(viewer);
scroll.setOpaque(false);
scroll.getHorizontalScrollBar().setUnitIncrement(30);
scroll.getVerticalScrollBar().setUnitIncrement(30);
scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
scroll.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
((JComponent) scroll.getViewport().getView()).setOpaque(false);
this.add(scroll, BorderLayout.CENTER);
updateMode(MODE_ZOOM, this.zoom);
this.addComponentListener(new ComponentAdapter() {
public void componentResized(ComponentEvent e) {
updateMode(mode, zoom);
}
});
if (doc.getPrintedPageCount() > 1) {
final JTextField page = new JTextField(5);
page.setHorizontalAlignment(JTextField.CENTER);
JButton previousButton = new JButton("<");
previousButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (currentPageIndex > 0) {
currentPageIndex--;
updatePage(currentPageIndex);
updatePageCount(doc, page);
}
}
});
JButton nextButton = new JButton(">");
nextButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (currentPageIndex < doc.getPrintedPageCount() - 1) {
currentPageIndex++;
updatePage(currentPageIndex);
updatePageCount(doc, page);
}
}
});
tools.add(previousButton);
updatePageCount(doc, page);
tools.add(page);
tools.add(nextButton);
}
if (printListener != null) {
final JButton buttonPrint = new JButton(Messages.getString("ODSViewerPanel.print"));
buttonPrint.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
printListener.print(doc);
}
});
tools.add(buttonPrint);
}
}
/**
* @param doc
* @param page
*/
private void updatePageCount(final OpenDocument doc, final JTextField page) {
page.setText((currentPageIndex + 1) + "/" + doc.getPrintedPageCount());
}
protected void updatePage(int i) {
this.renderer.setCurrentPage(i);
}
private void updateMode(int m, int zoom_value) {
this.mode = m;
this.zoom = zoom_value;
this.textFieldZoomValue.setText(zoom + " %");
renderer.setResizeFactor(((100 * 360) / zoom_value));
int w = this.renderer.getPageWidthInPixel();
int h = this.renderer.getPageHeightInPixel();
int posx = 0;
int posy = 0;
if (scroll != null) {
posx = (scroll.getViewportBorderBounds().width - w) / 2;
posy = (scroll.getViewportBorderBounds().height - h) / 2;
}
if (posy > 10)
posy = 10;
if (posx < 0)
posx = 0;
if (posy < 0)
posy = 0;
renderer.setLocation(posx, posy);
// final int renderedHeight = renderer.getPrintHeightInPixel();
// renderer.setSize(renderer.getPrintWidthInPixel(), renderedHeight);
final Dimension size = new Dimension(w, h);
viewer.setPreferredSize(size);
// Let the scroll pane know to update itself
// and its scrollbars.
viewer.revalidate();
repaint();
}
public ODTRenderer getRenderer() {
return renderer;
}
}