org.apache.fop.render.awt.viewer.ImageProxyPanel Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of org.apache.fop Show documentation
Show all versions of org.apache.fop Show documentation
The core maven build properties
The newest version!
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* $Id: ImageProxyPanel.java 1681435 2015-05-24 11:14:22Z adelmelle $ */
package org.apache.fop.render.awt.viewer;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.image.BufferedImage;
import java.lang.ref.Reference;
import java.lang.ref.SoftReference;
import javax.swing.JPanel;
import org.apache.fop.apps.FOPException;
import org.apache.fop.render.awt.AWTRenderer;
/**
* Panel used to display a single page of a document.
* This is basically a lazy-load display panel which
* gets the size of the image for layout purposes but
* doesn't get the actual image data until needed.
* The image data is then accessed via a soft reference,
* so it will be garbage collected when moving through
* large documents.
*/
public class ImageProxyPanel extends JPanel {
/** The reference to the BufferedImage storing the page data */
private transient Reference imageRef;
/** The maximum and preferred size of the panel */
private Dimension size;
/** The renderer. Shared with PreviewPanel and PreviewDialog. */
private AWTRenderer renderer;
/** The page to be rendered. */
private int page;
/**
* Panel constructor. Doesn't allocate anything until needed.
* @param renderer the AWTRenderer instance to use for painting
* @param page initial page number to show
*/
public ImageProxyPanel(AWTRenderer renderer, int page) {
this.renderer = renderer;
this.page = page;
try {
Dimension size = renderer.getPageImageSize(page);
Insets insets = getInsets();
size.width += insets.left + insets.right;
size.height += insets.top + insets.bottom;
this.size = size;
} catch (Exception e) {
this.size = new Dimension(10, 10);
}
// Allows single panel to appear behind page display.
// Important for textured L&Fs.
setOpaque(false);
}
/**
* @return the size of the page plus the border.
*/
public Dimension getMinimumSize() {
return getPreferredSize();
}
/**
* @return the size of the page plus the border.
*/
public Dimension getPreferredSize() {
return size;
}
/**
* Sets the number of the page to be displayed and refreshes the display.
* @param pg the page number
*/
public synchronized void setPage(int pg) {
if (page != pg) {
page = pg;
imageRef = null;
repaint();
}
}
/**
* Gets the image data and paints it on screen. Will make
* calls to getPageImage as required.
* @param graphics a graphics context
* @see javax.swing.JComponent#paintComponent(Graphics)
* @see org.apache.fop.render.java2d.Java2DRenderer#getPageImage(int)
*/
public synchronized void paintComponent(Graphics graphics) {
try {
if (isOpaque()) { //paint background
graphics.setColor(getBackground());
graphics.fillRect(0, 0, getWidth(), getHeight());
}
super.paintComponent(graphics);
BufferedImage image = null;
if (imageRef == null || imageRef.get() == null) {
image = renderer.getPageImage(page);
imageRef = new SoftReference(image);
} else {
image = (BufferedImage)imageRef.get();
}
if (image != null) {
int x = (getWidth() - image.getWidth()) / 2;
int y = (getHeight() - image.getHeight()) / 2;
graphics.drawImage(image, x, y, image.getWidth(), image.getHeight(), null);
}
} catch (FOPException fopEx) {
fopEx.printStackTrace();
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy