package org.geogebra.web.html5.gui.util;
import org.geogebra.web.html5.awt.GDimensionW;
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.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.MouseUpEvent;
import com.google.gwt.event.dom.client.MouseUpHandler;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.user.client.ui.FocusWidget;
import com.google.gwt.user.client.ui.HasValue;
public class Slider extends FocusWidget implements HasChangeHandlers,
HasValue<Integer>, MouseDownHandler, MouseUpHandler, MouseMoveHandler {
private Element range;
private boolean valueChangeHandlerInitialized;
private Integer valueOnDragStart;
public Slider() {
this(0, 100);
}
public Slider(int min, int max) {
range = Document.get().createElement("input");
range.setAttribute("type", "range");
range.setAttribute("min", String.valueOf(min));
range.setAttribute("max", String.valueOf(max));
setRangeValue(range, String.valueOf(min));
setElement(range);
addMouseDownHandler(this);
// addMouseMoveHandler(this);
addMouseUpHandler(this);
}
public static native void addInputHandler(Element el,
SliderInputHandler handler)/*-{
el.oninput = function() {
handler.@org.geogebra.web.html5.gui.util.SliderInputHandler::onSliderInput()();
}
}-*/;
private native void setRangeValue(Element range, String value) /*-{
range.value = value;
}-*/;
@Override
public Integer getValue() {
return Integer.valueOf(getRangeValue(range));
}
private native String getRangeValue(Element range) /*-{
return range.value;
}-*/;
public void setMinimum(int min) {
range.setAttribute("min", String.valueOf(min));
}
public void setMaximum(int max) {
range.setAttribute("max", String.valueOf(max));
}
public void setMajorTickSpacing(int step) {
range.setAttribute("step", String.valueOf(step));
}
public void setMinorTickSpacing(int step) {
range.setAttribute("step", String.valueOf(step));
}
public GDimensionW getPreferredSize() {
return new GDimensionW(100, 10);
}
@Override
public HandlerRegistration addValueChangeHandler(
ValueChangeHandler<Integer> handler) {
if (!valueChangeHandlerInitialized) {
valueChangeHandlerInitialized = true;
addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
ValueChangeEvent.fire(Slider.this, getValue());
}
});
}
return addHandler(handler, ValueChangeEvent.getType());
}
@Override
public void setValue(Integer value) {
setValue(value, false);
}
@Override
public void setValue(Integer value, boolean fireEvents) {
// Integer oldValue = getValue();
setSliderValue(String.valueOf(value));
// if (fireEvents) {
// ValueChangeEvent.fireIfNotEqual(this, oldValue, value);
// }
}
private void setSliderValue(String value) {
setRangeValue(range, value);
}
@Override
public HandlerRegistration addChangeHandler(ChangeHandler handler) {
return addDomHandler(handler, ChangeEvent.getType());
}
@Override
public void onMouseUp(MouseUpEvent event) {
ValueChangeEvent.fireIfNotEqual(this, valueOnDragStart, getValue());
}
@Override
public void onMouseDown(MouseDownEvent event) {
valueOnDragStart = getValue();
}
@Override
public void onMouseMove(MouseMoveEvent event) {
event.stopPropagation();
}
}