/* ****************************************************************************** * * Copyright 2008-2010 Hans Dijkema * * JRichTextEditor is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of * the License, or (at your option) any later version. * * JRichTextEditor 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with JRichTextEditor. If not, see <http://www.gnu.org/licenses/>. * * ******************************************************************************/ package nl.dykema.jxmlnote.report.viewers; /* * $Id: Jzc3ImagePanel.java,v 1.13 2009/04/15 21:22:45 cvs Exp $ * * This source code is copyright of Hans Dijkema. * © 2008-2009 Hans Dijkema. All rights reserved. * * This source code is property of it's author: Hans Dijkema. * Nothing of this code may be copied, (re)used or multiplied without * permission of the author. */ import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Rectangle; import java.awt.event.ActionListener; import java.awt.event.ComponentEvent; import java.awt.event.ComponentListener; import java.awt.image.BufferedImage; import java.awt.print.PageFormat; import java.util.HashSet; import java.util.Set; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.ScrollPaneConstants; import javax.swing.SwingWorker; import nl.dykema.jxmlnote.utils.DPIAdjuster; import com.sun.pdfview.PDFPage; public class PdfPagePanel extends JScrollPane { private static final long serialVersionUID = 1L; public static final int PAGE_FIT_WIDTH=1; public static final int PAGE_FIT_HEIGHT=2; public static final int PAGE_FIT_NONE=3; private Image _img; private JImagePanel _image; private Set<ActionListener> _listeners; private int _fit=PAGE_FIT_NONE; private double _zoom=1.0; private PageFormat _pageFormat; private int _imageWidth; private int _imageHeight; private PDFPage _page; private ZoomListener _zoomListener; public interface ZoomListener { public void zoomed(double z); } private Color panelColorBg() { return Color.gray; } class JImagePanel extends JPanel { public void paint(Graphics _g) { Graphics2D g=(Graphics2D) _g; g.setColor(panelColorBg()); Dimension d=PdfPagePanel.this.getViewport().getExtentSize(); g.fillRect(0, 0, d.width,d.height); if (_img!=null) { g.drawImage(_img,0,0,_img.getWidth(this),_img.getHeight(this),this); } } public JImagePanel() { } } public interface ImageProvider { public BufferedImage image() throws Exception; public void done(); } public void addActionListener(ActionListener a) { _listeners.add(a); } public void removeActionListener(ActionListener a) { _listeners.remove(a); } public void showPage(PDFPage page) { Dimension d=new Dimension((int) _pageFormat.getWidth(),(int) _pageFormat.getHeight()); Dimension dScreen=DPIAdjuster.getDimensionForScreenDPI(d); int width=dScreen.width; int height=dScreen.height; _imageWidth=width; _imageHeight=height; _page=page; doIt(); } public PDFPage getPage() { return _page; } public int getImageWidth() { return _imageWidth; } public int getImageHeight() { return _imageHeight; } private void doIt() { class worker extends SwingWorker<String,String> { private Dimension _panelSize; private Image _ww=null; public String doInBackground() { if (_page!=null) { //Dimension sz=_page.getUnstretchedSize((int) _pageFormat.getWidth (), // (int) _pageFormat.getHeight (),_page.getBBox ()); //Rectangle wholePage=new Rectangle(0,0,(int) _page.getBBox().getWidth(),(int) _page.getBBox().getHeight()); Rectangle wholePage; if (_page.getRotation()==90) { wholePage=new Rectangle(0,0,(int) _page.getHeight(),(int) _page.getWidth()); } else { wholePage=new Rectangle(0,0,(int) _page.getWidth(),(int) _page.getHeight()); } //wholePage=new Rectangle(0,0,(int) _page.getHeight(),(int) _page.getWidth()); //Fixed: HIER MOETEN WE IETS MEE (MET ROTATIE, LANDSCAPE, ETC.). if (_fit==PAGE_FIT_NONE) { int w,h; if (_page.getRotation()==90) { w=(int) Math.round(getImageHeight()*_zoom); h=(int) Math.round(getImageWidth()*_zoom); } else { w=(int) Math.round(getImageWidth()*_zoom); h=(int) Math.round(getImageHeight()*_zoom); } _img=_page.getImage(w, h, wholePage, null, true, true); _ww=_img; } else if (_fit==PAGE_FIT_WIDTH) { int w=_panelSize.width; int h=(int) (w/_page.getAspectRatio()); _zoom=((double) w)/wholePage.getWidth()/DPIAdjuster.pointsToScreenFactor(); _img=_page.getImage(w, h, wholePage, null,true,true); _ww=_img; } else { int h=_panelSize.height; int w=(int) (h*_page.getAspectRatio()); _zoom=((double) h)/wholePage.getHeight()/DPIAdjuster.pointsToScreenFactor();; _img=_page.getImage(w, h, wholePage, null,true,true); _ww=_img; } } return "done"; } protected void done() { if (_ww!=null) { Dimension d=new Dimension(_ww.getWidth(null),_ww.getHeight(null)); _image.setSize(d); _image.setPreferredSize(d); PdfPagePanel.this.setViewportView(_image); if (_zoomListener!=null) { _zoomListener.zoomed(_zoom); } } } public worker() { _panelSize=PdfPagePanel.this.getViewport().getExtentSize(); } }; worker w=new worker(); w.execute(); } public void zoomFitWidth(ZoomListener l) { _fit=PAGE_FIT_WIDTH; _zoomListener=l; doIt(); } public void zoomFitHeight(ZoomListener l) { _fit=PAGE_FIT_HEIGHT; _zoomListener=l; doIt(); } public void zoomFitNone(double zoom) { _fit=PAGE_FIT_NONE; _zoom=zoom; _zoomListener=null; doIt(); } public void setScrollUnitIncrement(int points) { super.getVerticalScrollBar().setUnitIncrement(points); } public int getScrollUnitIncrement() { return super.getVerticalScrollBar().getUnitIncrement(); } public PdfPagePanel(PageFormat f) { super(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS); _pageFormat=f; _img=null; _image=new JImagePanel(); super.setViewportView(_image); _listeners=new HashSet<ActionListener>(); setScrollUnitIncrement(16); this.addComponentListener(new ComponentListener() { public void componentResized(ComponentEvent evt) { doIt(); } public void componentHidden(ComponentEvent arg0) { } public void componentMoved(ComponentEvent arg0) { } public void componentShown(ComponentEvent arg0) { } }); } }