package com.akjava.gwt.html5.client;
import java.util.ArrayList;
import java.util.List;
import com.google.gwt.dom.client.Document;
import com.google.gwt.dom.client.Element;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.HasChangeHandlers;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.user.client.ui.FocusWidget;
public class ElementInputRange extends FocusWidget implements HasChangeHandlers,IInputRange{
public ElementInputRange(){
this(0,100,0);
}
public ElementInputRange(int min,int max,int current){
super(RangeElement.createRangeElement(Document.get(),min,max,current));
this.addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
fireEvent();
}
});
}
protected RangeElement getRangeElement() {
return getElement().cast();
}
public Integer getValue(){
return Integer.parseInt(getRangeElement().getValue());
}
public void setMax(int max){
getRangeElement().setMax(max);
}
private List<InputRangeListener> listeners=new ArrayList<InputRangeListener>();
public synchronized void addInputRangeListener(InputRangeListener listener){
listeners.add(listener);
}
public synchronized void removeInputRangeListener(InputRangeListener listener){
listeners.remove(listener);
}
public synchronized void fireEvent(){
for(InputRangeListener listener:listeners){
listener.changed(getValue());
}
}
public static class RangeElement extends Element{
protected RangeElement(){}
public final native String getValue() /*-{
return this.value;
}-*/;
public final native void setValue(int value) /*-{
this.value = value;
}-*/;
public final native int getMin() /*-{
return this.min;
}-*/;
public final native void setMin(int value) /*-{
this.min = value;
}-*/;
public final native int getMax() /*-{
return this.max;
}-*/;
public final native void setMax(int value) /*-{
this.max = value;
}-*/;
public static final native RangeElement createRangeElement(Document doc,int min,int max,int value) /*-{
var e = doc.createElement("INPUT");
e.type = 'range';
e.min=min;
e.max=max;
e.value=value;
return e;
}-*/;
}
/*
* better to use addListener
* (non-Javadoc)
* @see com.google.gwt.event.dom.client.HasChangeHandlers#addChangeHandler(com.google.gwt.event.dom.client.ChangeHandler)
*/
@Override
public HandlerRegistration addChangeHandler(ChangeHandler handler) {
return addDomHandler(handler, ChangeEvent.getType());
}
@Override
public void setMin(int min) {
getRangeElement().setMin(min);
}
@Override
public void setWidth(int width) {
this.setWidth(width+"px");
}
@Override
public int getMin() {
return getRangeElement().getMin();
}
@Override
public int getMax() {
return getRangeElement().getMax();
}
@Override
public void setHeight(int height) {
this.setHeight(height+"px");
}
@Override
public void setValue(Integer value) {
getRangeElement().setValue(value);
fireEvent();
}
}