/*
* GNU LESSER GENERAL PUBLIC LICENSE Copyright (C) 2006 The Lobo Project
*
* 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 St, Fifth Floor, Boston, MA 02110-1301 USA
*
* Contact info: lobochief@users.sourceforge.net
*/
/*
* Created on Nov 19, 2005
*/
package com.nvarghese.beowulf.common.cobra.html.domimpl;
import java.util.ArrayList;
import org.mozilla.javascript.Function;
import org.w3c.dom.html2.HTMLImageElement;
import com.nvarghese.beowulf.common.cobra.html.js.Executor;
public class HTMLImageElementImpl extends HTMLAbstractUIElement implements HTMLImageElement {
public HTMLImageElementImpl() {
super("IMG");
}
public HTMLImageElementImpl(String name) {
super(name);
}
public String getName() {
return this.getAttribute("name");
}
public void setName(String name) {
this.setAttribute("name", name);
}
public String getAlign() {
return this.getAttribute("align");
}
public void setAlign(String align) {
this.setAttribute("align", align);
}
public String getAlt() {
return this.getAttribute("alt");
}
public void setAlt(String alt) {
this.setAttribute("alt", alt);
}
public String getBorder() {
return this.getAttribute("border");
}
public void setBorder(String border) {
this.setAttribute("border", border);
}
public int getHeight() {
UINode r = this.uiNode;
return r == null ? 0 : r.getBounds().height;
}
public void setHeight(int height) {
this.setAttribute("height", String.valueOf(height));
}
public int getHspace() {
return this.getAttributeAsInt("hspace", 0);
}
public void setHspace(int hspace) {
this.setAttribute("hspace", String.valueOf("hspace"));
}
public boolean getIsMap() {
return this.getAttributeAsBoolean("isMap");
}
public void setIsMap(boolean isMap) {
this.setAttribute("isMap", isMap ? "isMap" : null);
}
public String getLongDesc() {
return this.getAttribute("longDesc");
}
public void setLongDesc(String longDesc) {
this.setAttribute("longDesc", longDesc);
}
public String getSrc() {
return this.getAttribute("src");
}
/**
* Sets the image URI and starts to load the image. Note that an
* HtmlRendererContext should be available to the HTML document for images
* to be loaded.
*/
public void setSrc(String src) {
this.setAttribute("src", src);
}
public String getUseMap() {
return this.getAttribute("useMap");
}
public void setUseMap(String useMap) {
this.setAttribute("useMap", useMap);
}
public int getVspace() {
return this.getAttributeAsInt("vspace", 0);
}
public void setVspace(int vspace) {
this.setAttribute("vspace", String.valueOf(vspace));
}
public int getWidth() {
UINode r = this.uiNode;
return r == null ? 0 : r.getBounds().width;
}
public void setWidth(int width) {
this.setAttribute("width", String.valueOf(width));
}
protected void assignAttributeField(String normalName, String value) {
super.assignAttributeField(normalName, value);
if ("src".equals(normalName)) {
this.loadImage(value);
}
}
private Function onload;
public Function getOnload() {
return this.getEventFunction(this.onload, "onload");
}
public void setOnload(Function onload) {
this.onload = onload;
}
private java.awt.Image image = null;
private String imageSrc;
private void loadImage(String src) {
HTMLDocumentImpl document = (HTMLDocumentImpl) this.document;
if (document != null) {
synchronized (this.listeners) {
this.imageSrc = src;
this.image = null;
}
if (src != null) {
document.loadImage(src, new LocalImageListener(src));
}
}
}
public final java.awt.Image getImage() {
synchronized (this.listeners) {
return this.image;
}
}
private final ArrayList listeners = new ArrayList(1);
/**
* Adds a listener of image loading events. The listener gets called right
* away if there's already an image.
*
* @param listener
*/
public void addImageListener(ImageListener listener) {
ArrayList l = this.listeners;
java.awt.Image currentImage;
synchronized (l) {
currentImage = this.image;
l.add(listener);
}
if (currentImage != null) {
// Call listener right away if there's already an
// image; holding no locks.
listener.imageLoaded(new ImageEvent(this, currentImage));
// Should not call onload handler here. That's taken
// care of otherwise.
}
}
public void removeImageListener(ImageListener listener) {
ArrayList l = this.listeners;
synchronized (l) {
l.clear();
}
}
private void dispatchEvent(String expectedImgSrc, ImageEvent event) {
ArrayList l = this.listeners;
ImageListener[] listenerArray;
synchronized (l) {
if (!expectedImgSrc.equals(this.imageSrc)) {
return;
}
this.image = event.image;
// Get array of listeners while holding lock.
listenerArray = (ImageListener[]) l.toArray(ImageListener.EMPTY_ARRAY);
}
int llength = listenerArray.length;
for (int i = 0; i < llength; i++) {
// Inform listener, holding no lock.
listenerArray[i].imageLoaded(event);
}
Function onload = this.getOnload();
if (onload != null) {
// TODO: onload event object?
Executor.executeFunction(HTMLImageElementImpl.this, onload, null);
}
}
/*
* protected RenderState createRenderState(RenderState prevRenderState) {
* return new ImageRenderState(prevRenderState, this); }
*/
private class LocalImageListener implements ImageListener {
private final String expectedImgSrc;
public LocalImageListener(String imgSrc) {
this.expectedImgSrc = imgSrc;
}
public void imageLoaded(ImageEvent event) {
dispatchEvent(this.expectedImgSrc, event);
}
}
}