/*
* 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 Jan 15, 2006
*/
package com.nvarghese.beowulf.common.cobra.html.domimpl;
import java.util.ArrayList;
import org.mozilla.javascript.Function;
import org.w3c.dom.Node;
import org.w3c.dom.html2.HTMLFormElement;
import com.nvarghese.beowulf.common.cobra.html.FormInput;
import com.nvarghese.beowulf.common.cobra.html.js.Executor;
public abstract class HTMLBaseInputElement extends HTMLAbstractUIElement {
public HTMLBaseInputElement(String name) {
super(name);
}
protected InputContext inputContext;
protected String deferredValue;
public void setInputContext(InputContext ic) {
String dv = null;
synchronized (this) {
this.inputContext = ic;
if (ic != null) {
dv = this.deferredValue;
}
}
if (dv != null) {
ic.setValue(dv);
}
}
public String getDefaultValue() {
return this.getAttribute("defaultValue");
}
public void setDefaultValue(String defaultValue) {
this.setAttribute("defaultValue", defaultValue);
}
public HTMLFormElement getForm() {
Node parent = this.getParentNode();
while (parent != null && !(parent instanceof HTMLFormElement)) {
parent = parent.getParentNode();
}
return (HTMLFormElement) parent;
}
public void submitForm(FormInput[] extraFormInputs) {
HTMLFormElementImpl form = (HTMLFormElementImpl) this.getForm();
if (form != null) {
form.submit(extraFormInputs);
}
}
public void resetForm() {
HTMLFormElement form = this.getForm();
if (form != null) {
form.reset();
}
}
public String getAccept() {
return this.getAttribute("accept");
}
public void setAccept(String accept) {
this.setAttribute("accept", accept);
}
public String getAccessKey() {
return this.getAttribute("accessKey");
}
public void setAccessKey(String accessKey) {
this.setAttribute("accessKey", accessKey);
}
public String getAlign() {
return this.getAttribute("align");
}
public void setAlign(String align) {
this.setAttribute("align", align);
}
public String getAlt() {
return this.getAttribute("alit");
}
public void setAlt(String alt) {
this.setAttribute("alt", alt);
}
public boolean getDisabled() {
InputContext ic = this.inputContext;
return ic == null ? false : ic.getDisabled();
}
public void setDisabled(boolean disabled) {
InputContext ic = this.inputContext;
if (ic != null) {
ic.setDisabled(disabled);
}
}
public String getName() {
// TODO: Should this return valid of "id"?
return this.getAttribute("name");
}
public void setName(String name) {
this.setAttribute("name", name);
}
public boolean getReadOnly() {
InputContext ic = this.inputContext;
return ic == null ? false : ic.getReadOnly();
}
public void setReadOnly(boolean readOnly) {
InputContext ic = this.inputContext;
if (ic != null) {
ic.setReadOnly(readOnly);
}
}
public int getTabIndex() {
InputContext ic = this.inputContext;
return ic == null ? 0 : ic.getTabIndex();
}
public void setTabIndex(int tabIndex) {
InputContext ic = this.inputContext;
if (ic != null) {
ic.setTabIndex(tabIndex);
}
}
public String getValue() {
InputContext ic = this.inputContext;
if (ic != null) {
// Note: Per HTML Spec, setValue does not set attribute.
return ic.getValue();
} else {
String dv = this.deferredValue;
if (dv != null) {
return dv;
} else {
String val = this.getAttribute("value");
return val == null ? "" : val;
}
}
}
protected java.io.File getFileValue() {
InputContext ic = this.inputContext;
if (ic != null) {
return ic.getFileValue();
} else {
return null;
}
}
public void setValue(String value) {
InputContext ic = null;
synchronized (this) {
ic = this.inputContext;
if (ic == null) {
this.deferredValue = value;
}
}
if (ic != null) {
ic.setValue(value);
}
}
public void blur() {
InputContext ic = this.inputContext;
if (ic != null) {
ic.blur();
}
}
public void focus() {
InputContext ic = this.inputContext;
if (ic != null) {
ic.focus();
}
}
public void select() {
InputContext ic = this.inputContext;
if (ic != null) {
ic.select();
}
}
/*
* (non-Javadoc)
*
* @see
* org.xamjwg.html.domimpl.HTMLElementImpl#assignAttributeField(java.lang
* .String, java.lang.String)
*/
protected void assignAttributeField(String normalName, String value) {
if ("value".equals(normalName)) {
InputContext ic = this.inputContext;
if (ic != null) {
ic.setValue(value);
}
} else if ("src".equals(normalName)) {
this.loadImage(value);
} else {
super.assignAttributeField(normalName, value);
}
}
private Function onload;
public Function getOnload() {
return this.getEventFunction(this.onload, "onload");
}
public void setOnload(Function onload) {
this.onload = onload;
}
private Function onchange;
public Function getOnChange() {
return this.getEventFunction(this.onchange, "onchange");
}
private java.awt.Image image = null;
private String imageSrc;
private void loadImage(String src) {
HTMLDocumentImpl document = (HTMLDocumentImpl) this.document;
if (document != null) {
synchronized (this.imageListeners) {
this.imageSrc = src;
this.image = null;
}
if (src != null) {
document.loadImage(src, new LocalImageListener(src));
}
}
}
public final java.awt.Image getImage() {
synchronized (this.imageListeners) {
return this.image;
}
}
private final ArrayList imageListeners = 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.imageListeners;
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.imageListeners;
synchronized (l) {
l.clear();
}
}
void resetInput() {
InputContext ic = this.inputContext;
if (ic != null) {
ic.resetInput();
}
}
private void dispatchEvent(String expectedImgSrc, ImageEvent event) {
ArrayList l = this.imageListeners;
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(HTMLBaseInputElement.this, onload, null);
}
}
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);
}
}
}