/**
* Copyright (C) 2010 BonitaSoft S.A.
* BonitaSoft, 31 rue Gustave Eiffel - 38000 Grenoble
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2.0 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.bonitasoft.forms.client.view.widget;
import java.io.Serializable;
import java.util.Map;
import java.util.Map.Entry;
import org.bonitasoft.forms.client.view.common.DOMUtils;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.NodeList;
import com.google.gwt.event.dom.client.BlurEvent;
import com.google.gwt.event.dom.client.BlurHandler;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.DoubleClickEvent;
import com.google.gwt.event.dom.client.DoubleClickHandler;
import com.google.gwt.event.dom.client.FocusEvent;
import com.google.gwt.event.dom.client.FocusHandler;
import com.google.gwt.event.dom.client.HasBlurHandlers;
import com.google.gwt.event.dom.client.HasChangeHandlers;
import com.google.gwt.event.dom.client.HasClickHandlers;
import com.google.gwt.event.dom.client.HasDoubleClickHandlers;
import com.google.gwt.event.dom.client.HasFocusHandlers;
import com.google.gwt.event.dom.client.HasKeyDownHandlers;
import com.google.gwt.event.dom.client.HasKeyUpHandlers;
import com.google.gwt.event.dom.client.HasMouseDownHandlers;
import com.google.gwt.event.dom.client.HasMouseMoveHandlers;
import com.google.gwt.event.dom.client.HasMouseOutHandlers;
import com.google.gwt.event.dom.client.HasMouseOverHandlers;
import com.google.gwt.event.dom.client.HasMouseUpHandlers;
import com.google.gwt.event.dom.client.KeyDownEvent;
import com.google.gwt.event.dom.client.KeyDownHandler;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.event.dom.client.KeyUpHandler;
import com.google.gwt.event.dom.client.MouseDownEvent;
import com.google.gwt.event.dom.client.MouseDownHandler;
import com.google.gwt.event.dom.client.MouseMoveEvent;
import com.google.gwt.event.dom.client.MouseMoveHandler;
import com.google.gwt.event.dom.client.MouseOutEvent;
import com.google.gwt.event.dom.client.MouseOutHandler;
import com.google.gwt.event.dom.client.MouseOverEvent;
import com.google.gwt.event.dom.client.MouseOverHandler;
import com.google.gwt.event.dom.client.MouseUpEvent;
import com.google.gwt.event.dom.client.MouseUpHandler;
import com.google.gwt.event.logical.shared.HasValueChangeHandlers;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.SuggestBox;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.user.datepicker.client.DateBox;
/**
* @author Anthony Birembaut
*
*/
public class ElementAttributeSupport {
/**
* Supported HTML events on form fields and buttons
*
*/
private static enum SUPPORTED_EVENT {onclick, ondbclick, onmousedown, onmousemove, onmouseout, onmouseover, onmouseup, onchange, onblur, onfocus, onkeydown, onkeypress, onkeyup};
/**
* Set the HTML attributes of a widget.
* @param fieldWidget the field widget
* @param widgetData the widget data object
*/
public void addHtmlAttributes(final Widget fieldWidget, final Map<String, String> htmlAttributes) {
if (htmlAttributes.size() > 0) {
for (final Entry<String, String> htmlAttribute : htmlAttributes.entrySet()) {
addHtmlAttribute(fieldWidget, htmlAttribute.getKey(), htmlAttribute.getValue());
}
}
}
protected void addHtmlAttribute(Widget fieldWidget, final String htmlAttributeName, final String htmlAttributeValue) {
//Working for bug 4991: the "Html Attributes" of date widget
if(fieldWidget instanceof DateBox){
fieldWidget = ((DateBox) fieldWidget).getTextBox();
}
try {
final SUPPORTED_EVENT event = SUPPORTED_EVENT.valueOf(htmlAttributeName.toLowerCase());
switch (event) {
case onclick:
((HasClickHandlers)fieldWidget).addClickHandler(new ClickHandler() {
public void onClick(final ClickEvent event) {
DOMUtils.getInstance().javascriptEval(htmlAttributeValue);
}
});
break;
case ondbclick:
((HasDoubleClickHandlers)fieldWidget).addDoubleClickHandler(new DoubleClickHandler() {
public void onDoubleClick(final DoubleClickEvent event) {
DOMUtils.getInstance().javascriptEval(htmlAttributeValue);
}
});
break;
case onblur:
((HasBlurHandlers)fieldWidget).addBlurHandler(new BlurHandler() {
public void onBlur(final BlurEvent event) {
DOMUtils.getInstance().javascriptEval(htmlAttributeValue);
}
});
break;
case onchange:
if (fieldWidget instanceof HasChangeHandlers) {
((HasChangeHandlers)fieldWidget).addChangeHandler(new ChangeHandler() {
public void onChange(final ChangeEvent event) {
DOMUtils.getInstance().javascriptEval(htmlAttributeValue);
}
});
} else if (fieldWidget instanceof HasValueChangeHandlers<?>) {
final HasValueChangeHandlers<Serializable> widget = (HasValueChangeHandlers<Serializable>)fieldWidget;
widget.addValueChangeHandler(new ValueChangeHandler<Serializable>() {
public void onValueChange(final ValueChangeEvent<Serializable> event) {
DOMUtils.getInstance().javascriptEval(htmlAttributeValue);
}
});
}
break;
case onfocus:
((HasFocusHandlers)fieldWidget).addFocusHandler(new FocusHandler() {
public void onFocus(final FocusEvent event) {
DOMUtils.getInstance().javascriptEval(htmlAttributeValue);
}
});
break;
case onkeydown:
((HasKeyDownHandlers)fieldWidget).addKeyDownHandler(new KeyDownHandler() {
public void onKeyDown(final KeyDownEvent event) {
DOMUtils.getInstance().javascriptEval(htmlAttributeValue);
}
});
break;
case onkeyup:
((HasKeyUpHandlers)fieldWidget).addKeyUpHandler(new KeyUpHandler() {
public void onKeyUp(final KeyUpEvent event) {
DOMUtils.getInstance().javascriptEval(htmlAttributeValue);
}
});
break;
case onkeypress:
((HasKeyUpHandlers)fieldWidget).addKeyUpHandler(new KeyUpHandler() {
public void onKeyUp(final KeyUpEvent event) {
DOMUtils.getInstance().javascriptEval(htmlAttributeValue);
}
});
break;
case onmousedown:
((HasMouseDownHandlers)fieldWidget).addMouseDownHandler(new MouseDownHandler() {
public void onMouseDown(final MouseDownEvent event) {
DOMUtils.getInstance().javascriptEval(htmlAttributeValue);
}
});
break;
case onmouseup:
((HasMouseUpHandlers)fieldWidget).addMouseUpHandler(new MouseUpHandler() {
public void onMouseUp(final MouseUpEvent event) {
DOMUtils.getInstance().javascriptEval(htmlAttributeValue);
}
});
break;
case onmouseover:
((HasMouseOverHandlers)fieldWidget).addMouseOverHandler(new MouseOverHandler() {
public void onMouseOver(final MouseOverEvent event) {
DOMUtils.getInstance().javascriptEval(htmlAttributeValue);
}
});
break;
case onmouseout:
((HasMouseOutHandlers)fieldWidget).addMouseOutHandler(new MouseOutHandler() {
public void onMouseOut(final MouseOutEvent event) {
DOMUtils.getInstance().javascriptEval(htmlAttributeValue);
}
});
break;
case onmousemove:
((HasMouseMoveHandlers)fieldWidget).addMouseMoveHandler(new MouseMoveHandler() {
public void onMouseMove(final MouseMoveEvent event) {
DOMUtils.getInstance().javascriptEval(htmlAttributeValue);
}
});
break;
default:
break;
}
} catch (final Exception e) {
if (fieldWidget instanceof CheckBox || fieldWidget instanceof CheckboxGroupWidget || fieldWidget instanceof RadioButtonGroupWidget || fieldWidget instanceof FileUploadWidget || fieldWidget instanceof SuggestBox || fieldWidget instanceof AsyncSuggestBoxWidget || fieldWidget instanceof DateBox) {
final NodeList<Element> inputs = fieldWidget.getElement().getElementsByTagName("input");
if (inputs != null) {
for (int i = 0; i < inputs.getLength(); i++) {
inputs.getItem(i).setAttribute(htmlAttributeName, htmlAttributeValue);
}
}
} else if (fieldWidget instanceof DurationWidget) {
final NodeList<Element> selects = fieldWidget.getElement().getElementsByTagName("select");
if (selects != null) {
for (int i = 0; i < selects.getLength(); i++) {
selects.getItem(i).setAttribute(htmlAttributeName, htmlAttributeValue);
}
}
} else if (fieldWidget instanceof ImageWidget) {
final NodeList<Element> images = fieldWidget.getElement().getElementsByTagName("img");
if (images != null) {
for (int i = 0; i < images.getLength(); i++) {
images.getItem(i).setAttribute(htmlAttributeName, htmlAttributeValue);
}
}
} else if (fieldWidget instanceof FileDownloadWidget) {
final NodeList<Element> links = fieldWidget.getElement().getElementsByTagName("a");
if (links != null) {
for (int i = 0; i < links.getLength(); i++) {
links.getItem(i).setAttribute(htmlAttributeName, htmlAttributeValue);
}
}
} else if (fieldWidget instanceof TableWidget || fieldWidget instanceof EditableGridWidget) {
final NodeList<Element> tables = fieldWidget.getElement().getElementsByTagName("table");
if (tables != null) {
for (int i = 0; i < tables.getLength(); i++) {
tables.getItem(i).setAttribute(htmlAttributeName, htmlAttributeValue);
}
}
} else if (fieldWidget instanceof RichTextWidget) {
final NodeList<Element> iframes = fieldWidget.getElement().getElementsByTagName("iframe");
if (iframes != null) {
for (int i = 0; i < iframes.getLength(); i++) {
iframes.getItem(i).setAttribute(htmlAttributeName, htmlAttributeValue);
}
}
} else {
fieldWidget.getElement().setAttribute(htmlAttributeName, htmlAttributeValue);
}
}
}
}