blob: 8e3428b2a1dba1b9ffec5d1272aba3ac9e831681 [file] [log] [blame]
/******************************************************************************
* Copyright (c) 2004, 2010 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
****************************************************************************/
package org.eclipse.gmf.runtime.draw2d.ui.render.internal;
import java.security.InvalidParameterException;
import org.eclipse.gmf.runtime.draw2d.ui.render.RenderInfo;
import org.eclipse.gmf.runtime.draw2d.ui.render.RenderedImage;
import org.eclipse.gmf.runtime.draw2d.ui.render.factory.RenderedImageFactory;
import org.eclipse.gmf.runtime.draw2d.ui.render.internal.factory.RenderedImageKey;
import org.eclipse.swt.graphics.Image;
/**
* Abstract class for RenderedImage interface.
*
* @author sshaw
*/
abstract public class AbstractRenderedImage implements RenderedImage {
/**
* Constructor for AbstractRenderedImage
*
* @param buffer
* byte[] array containing an cached SVG image file.
* @param key
* ImageKey instance which is unique for the byte array.
*/
public AbstractRenderedImage(final byte[] buff, RenderedImageKey key) {
if (buff == null || key == null)
throw new InvalidParameterException();
this.buffer = buff;
this.key = key;
}
private byte[] buffer = null;
private RenderedImageKey key = null;
private Image img = null;
/**
* @return Returns the buffer.
*/
public byte[] getBuffer() {
return buffer;
}
/**
* @return Returns the key.
*/
public RenderedImageKey getKey() {
return new RenderedImageKey(key, key.getChecksum(), key.getExtraData(), key.getURLString());
}
/**
* Overridden so that image can be disposed.
*
* @see java.lang.Object#finalize()
*/
protected void finalize() throws Throwable {
if (img != null) {
img.dispose();
img = null;
}
key = null;
super.finalize();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gmf.runtime.gef.ui.internal.render.RenderedImage#getRenderInfo()
*/
public RenderInfo getRenderInfo() {
return getKey();
}
/**
*Implementation of the ResizableImage interface that will allow the SVG
* to be re-rendered into a different ImageSize.
* @see org.eclipse.gmf.runtime.draw2d.ui.render.RenderedImage#getNewRenderedImage(org.eclipse.gmf.runtime.draw2d.ui.render.RenderInfo)
*/
public RenderedImage getNewRenderedImage(RenderInfo info) {
if (!getRenderInfo().equals(info)) {
RenderedImage rndImg = RenderedImageFactory.getRelatedInstance(this, info);
if (rndImg != null) {
return rndImg;
} else {
return RenderedImageFactory.getInstance(getBuffer(), info);
}
}
return this;
}
/**
* @return <code>true</code> if image has been fully rendered, <code>false</code> if
* it needs to be rendered.
*/
public boolean isRendered() {
if (img != null)
return true;
return false;
}
/**
* Accessor for retrieving the default image for the rendered SVG data.
* This method will render the image if it doesn't exist yet. This allows
* for "on-demand" loading. If no-one accesses the image, then it will not
* be rendered.
*
* @see org.eclipse.gmf.runtime.draw2d.ui.render.RenderedImage#getSWTImage()
*/
final public Image getSWTImage() {
if (img != null)
return img;
Image image = renderImage();
if (img != null && !img.isDisposed()) {
img.dispose();
}
img = image;
return img;
}
/**
* @return the new <code>Image</code> rendered to the specification of the
* <code>RenderInfo</code> structure stored with the this <code>RenderedImage</code>
*/
abstract protected Image renderImage();
/*
* (non-Javadoc)
* @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
*/
public Object getAdapter(Class adapter) {
if (adapter.equals(Image.class)) {
return getSWTImage();
}
return null;
}
}