All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.webswing.toolkit.util.WaitingImageObserver Maven / Gradle / Ivy

There is a newer version: 20.2.4
Show newest version
/* ========================================================================
 * JCommon : a free general purpose class library for the Java(tm) platform
 * ========================================================================
 *
 * (C) Copyright 2000-2005, by Object Refinery Limited and Contributors.
 *
 * Project Info:  http://www.jfree.org/jcommon/index.html
 *
 * This library 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 2.1 of the License, or
 * (at your option) any later version.
 *
 * This library 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 this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
 * USA.
 *
 * [Java is a trademark or registered trademark of Sun Microsystems, Inc.
 * in the United States and other countries.]
 *
 * -------------------------
 * WaitingImageObserver.java
 * -------------------------
 * (C)opyright 2000-2004, by Thomas Morgner and Contributors.
 *
 * Original Author:  Thomas Morgner
 * Contributor(s):   Stefan Prange;
 *
 * $Id: WaitingImageObserver.java,v 1.8 2008/09/10 09:24:41 mungady Exp $
 *
 * Changes (from 8-Feb-2002)
 * -------------------------
 * 15-Apr-2002 : first version used by ImageElement.
 * 16-May-2002 : Line delimiters adjusted
 * 04-Jun-2002 : Documentation and added a NullPointerCheck for the constructor.
 * 14-Jul-2002 : BugFixed: WaitingImageObserver dead-locked (bugfix by Stefan
 *               Prange)
 * 18-Mar-2003 : Updated header and made minor Javadoc changes (DG);
 * 21-Sep-2003 : Moved from JFreeReport.
 */

package org.webswing.toolkit.util;

import java.awt.Cursor;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.awt.image.ImageObserver;
import java.io.File;
import java.io.Serializable;

/**
 * This image observer blocks until the image is completely loaded. AWT
 * defers the loading of images until they are painted on a graphic.
 *
 * While printing reports it is not very nice, not to know whether a image
 * was completely loaded, so this observer forces the loading of the image
 * until a final state (either ALLBITS, ABORT or ERROR) is reached.
 *
 * @author Thomas Morgner
 */
public class WaitingImageObserver implements ImageObserver, Serializable, Cloneable {
	/** For serialization. */
	static final long serialVersionUID = -807204410581383550L;

	/** The lock. */
	private boolean lock;

	/** The image. */
	private Image image;

	/** A flag that signals an error. */
	private boolean error;

	/**
	 * Creates a new ImageObserver for the given Image.
	 * The observer has to be started by an external thread.
	 *
	 * @param image  the image to observe (null not permitted).
	 */
	public WaitingImageObserver(final Image image) {
		if (image == null) {
			throw new NullPointerException();
		}
		this.image = image;
		this.lock = true;
	}

	/**
	 * Callback function used by AWT to inform that more data is available. The
	 * observer waits until either all data is loaded or AWT signals that the
	 * image cannot be loaded.
	 *
	 * @param     img   the image being observed.
	 * @param     infoflags   the bitwise inclusive OR of the following
	 *               flags:  WIDTH, HEIGHT,
	 *               PROPERTIES, SOMEBITS,
	 *               FRAMEBITS, ALLBITS,
	 *               ERROR, ABORT.
	 * @param     x   the x coordinate.
	 * @param     y   the y coordinate.
	 * @param     width    the width.
	 * @param     height   the height.
	 *
	 * @return    false if the infoflags indicate that the
	 *            image is completely loaded; true otherwise.
	 */
	public synchronized boolean imageUpdate(final Image img, final int infoflags, final int x, final int y, final int width, final int height) {
		if ((infoflags & ImageObserver.ALLBITS) == ImageObserver.ALLBITS || (infoflags & ImageObserver.FRAMEBITS) == ImageObserver.FRAMEBITS) {
			this.lock = false;
			this.error = false;
			notifyAll();
			return false;
		} else if ((infoflags & ImageObserver.ABORT) == ImageObserver.ABORT || (infoflags & ImageObserver.ERROR) == ImageObserver.ERROR) {
			this.lock = false;
			this.error = true;
			notifyAll();
			return false;
		}
		//notifyAll();
		return true;
	}

	/**
	 * The workerthread. Simply draws the image to a BufferedImage's
	 * Graphics-Object and waits for the AWT to load the image.
	 */
	public synchronized void waitImageLoaded() {

		if (this.lock == false) {
			return;
		}

		final BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB);
		final Graphics g = img.getGraphics();

		while (this.lock) {
			if (g.drawImage(this.image, 0, 0, img.getWidth(this), img.getHeight(this), this)) {
				return;
			}

			try {
				wait(500);
			} catch (InterruptedException e) {
				Logger.info("WaitingImageObserver.waitImageLoaded(): InterruptedException thrown", e);
			}
		}
	}

	/**
	 * Clones this WaitingImageObserver.
	 *
	 * @return a clone.
	 *
	 * @throws CloneNotSupportedException this should never happen.
	 * @deprecated cloning may lock down the observer
	 */
	public Object clone() throws CloneNotSupportedException {
		return (WaitingImageObserver) super.clone();
	}

	/**
	 * Returns true if loading is complete, and false
	 * otherwise.
	 *
	 * @return A boolean.
	 */
	public boolean isLoadingComplete() {
		return this.lock == false;
	}

	/**
	 * Returns true if there is an error condition, and false otherwise.
	 *
	 * @return A boolean.
	 */
	public boolean isError() {
		return this.error;
	}

	public static void main(String[] args) throws InterruptedException {
		String prefix = System.getProperty("java.home") + File.separator + "lib" + File.separator + "images" + File.separator + "cursors" + File.separator;
		Image i = Toolkit.getDefaultToolkit().createImage(prefix + "win32_MoveDrop32x32.gif");
		new WaitingImageObserver(i).waitImageLoaded();//magic
		System.out.println(i.getWidth(null));
		Thread.sleep(500);
		System.out.println(i.getWidth(null));
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy