package org.geogebra.web.html5.util.sliderPanel;
import com.google.gwt.dom.client.Document;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.NativeEvent;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.MouseDownEvent;
import com.google.gwt.event.dom.client.MouseMoveEvent;
import com.google.gwt.event.dom.client.MouseUpEvent;
import com.google.gwt.event.dom.client.TouchMoveEvent;
import com.google.gwt.event.dom.client.TouchMoveHandler;
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;
/**
* GWT wrapper for JQuery UI slider
*/
public class SliderWJquery extends FocusWidget
implements SliderWI, TouchMoveHandler {
private Element range;
private boolean valueChangeHandlerInitialized;
private Double curValue;
private static volatile SliderWJquery currentSlider;
/**
* Creates new slider
*
* @param min
* min
* @param max
* max
*/
public SliderWJquery(double min, double max) {
range = Document.get().createElement("div");
range.getStyle().setWidth(200, Unit.PX);
setup(range, min, max, min);
setElement(range);
addMouseDownHandler(this);
addMouseMoveHandler(this);
addMouseUpHandler(this);
addTouchMoveHandler(this);
}
private native void setup(Element range1, double min, double max, double val)/*-{
var that = this;
var j = $wnd.$ggbQuery || $wnd.jQuery;
j(range1)
.slider(
{
"min" : min,
"max" : max,
"animate" : false,
"values" : [ val ],
"slide" : function(event, ui) {
that.@org.geogebra.web.html5.util.sliderPanel.SliderWJquery::slide(D)(ui.value)
}
});
}-*/ ;
@Override
public void setScale(double zoom) {
setScale(range, zoom);
}
private native void setScale(Element range1, double zoom) /*-{
var $ = $wnd.$ggbQuery || $wnd.jQuery;
$(range1).slider("setzoom", zoom);
}-*/;
private native void setRangeValue(Element range1, double val) /*-{
var $ = $wnd.$ggbQuery || $wnd.jQuery;
$(range1).slider("values", [ val ]);
}-*/;
@Override
public Double getValue() {
return getRangeValue(range);
}
private void stop() {
stopNative(range);
}
private native void stopNative(Element range1) /*-{
var $ = $wnd.$ggbQuery || $wnd.jQuery;
$(range1).slider("doCancel");
}-*/;
private native double getRangeValue(Element range1) /*-{
var $ = $wnd.$ggbQuery || $wnd.jQuery;
return $(range1).slider("values")[0];
}-*/;
private native void setProperty(Element range1, String prop,
double val) /*-{
var $ = $wnd.$ggbQuery || $wnd.jQuery;
$(range1).slider("option", prop, val);
}-*/;
@Override
public void setMaximum(double max) {
setProperty(range, "max", max);
}
@Override
public void setMinimum(double min) {
setProperty(range, "min", min);
}
@Override
public void setStep(double step) {
setProperty(range, "step", step);
}
@Override
public HandlerRegistration addValueChangeHandler(
ValueChangeHandler<Double> handler) {
if (!valueChangeHandlerInitialized) {
valueChangeHandlerInitialized = true;
addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
ValueChangeEvent.fire(SliderWJquery.this, getValue());
}
});
}
return addHandler(handler, ValueChangeEvent.getType());
}
@Override
public void setValue(Double value) {
setValue(value, false);
}
@Override
public void setValue(Double value, boolean fireEvents) {
setRangeValue(range, 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, curValue, getValue());
curValue = getValue();
}
@Override
public void onMouseDown(MouseDownEvent event) {
if (event.getNativeButton() != NativeEvent.BUTTON_RIGHT) {
event.stopPropagation();
setCurrentSlider(this);
}
// curValue = getValue();
}
private static void setCurrentSlider(SliderWJquery sliderWJquery) {
currentSlider = sliderWJquery;
}
private void slide(double val) {
ValueChangeEvent.fireIfNotEqual(this, curValue, val);
curValue = val;
}
@Override
public void onMouseMove(MouseMoveEvent event) {
// event.stopPropagation();
slideValue();
}
private void slideValue() {
Double value = getValue();
if (curValue != null) {
slide(value);
}
}
/**
* Cancels current slider
*/
public static void stopSliders() {
if (currentSlider != null) {
currentSlider.stop();
}
}
public void onTouchMove(TouchMoveEvent event) {
event.stopPropagation();
event.preventDefault();
slideValue();
}
}