net.easysmarthouse.ui.webui.client.view.widget.Slider.java Source code

Java tutorial

Introduction

Here is the source code for net.easysmarthouse.ui.webui.client.view.widget.Slider.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package net.easysmarthouse.ui.webui.client.view.widget;

import java.util.ArrayList;
import java.util.List;

import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.client.JsArrayNumber;
import com.google.gwt.json.client.JSONArray;
import com.google.gwt.json.client.JSONNumber;
import com.google.gwt.json.client.JSONObject;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.ui.Widget;

/**
 *
 * @author rusakovich
 */
public class Slider extends Widget {

    private JSONObject defaultOptions;
    private List<SliderListener> listeners = new ArrayList<SliderListener>();

    public Slider(String id, double min, double max, double defaultValue) {
        this(id, min, max, new double[] { defaultValue });
    }

    public Slider(String id, double min, double max, double[] defaultValues) {
        this(id, getOptions(min, max, defaultValues));
    }

    public Slider(String id) {
        this(id, null);
    }

    public Slider(String id, JSONObject options) {
        super();
        Element divEle = DOM.createDiv();
        setElement(divEle);
        divEle.setId(id);

        this.defaultOptions = options;
        if (defaultOptions == null) {
            defaultOptions = getOptions(0, 100, new double[] { 0 });
        }
    }

    public static JSONObject getOptions(double min, double max, double[] defaultValues) {
        JSONObject options = new JSONObject();
        options.put(SliderOption.MIN.toString(), new JSONNumber(min));
        options.put(SliderOption.MAX.toString(), new JSONNumber(max));

        JSONArray vals = doubleArrayToJSONArray(defaultValues);
        options.put(SliderOption.VALUES.toString(), vals);

        return options;
    }

    private static JSONArray doubleArrayToJSONArray(double[] values) {
        JSONArray vals = new JSONArray();
        for (int i = 0, len = values.length; i < len; i++) {
            vals.set(i, new JSONNumber(values[i]));
        }
        return vals;
    }

    @Override
    protected void onLoad() {
        createSliderJS(this, getElement().getId(), defaultOptions.getJavaScriptObject());
        super.onLoad();
    }

    @Override
    protected void onUnload() {
        destroySliderJS(this, getElement().getId());
        super.onUnload();
    }

    public int getMinimum() {
        return getIntOptionJS(getElement().getId(), SliderOption.MIN.toString());
    }

    public void setMinimum(int minimum) {
        setIntOptionJS(getElement().getId(), SliderOption.MIN.toString(), minimum);
    }

    public int getMaximum() {
        return getIntOptionJS(getElement().getId(), SliderOption.MAX.toString());
    }

    public void setMaximum(int maximum) {
        setIntOptionJS(getElement().getId(), SliderOption.MAX.toString(), maximum);
    }

    public int getValue() {
        return getValueAtIndex(0);
    }

    public void setValue(double value) {
        double[] values = { value };
        setValues(values);
    }

    public void setValues(double[] values) {
        JSONArray vals = doubleArrayToJSONArray(values);
        setValuesJS(getElement().getId(), vals.getJavaScriptObject());
    }

    public int getValueAtIndex(int index) {
        return getValueJS(getElement().getId(), index);
    }

    public void setIntOption(SliderOption option, int value) {
        setIntOptionJS(getElement().getId(), option.toString(), value);
    }

    public int getIntOption(SliderOption option) {
        return getIntOptionJS(getElement().getId(), option.toString());
    }

    public void setBooleanOption(SliderOption option, boolean value) {
        setBooleanOptionJS(getElement().getId(), option.toString(), value);
    }

    public boolean getBooleanOption(SliderOption option) {
        return getBooleanOptionJS(getElement().getId(), option.toString());
    }

    public void setStringOption(SliderOption option, String value) {
        setStringOptionJS(getElement().getId(), option.toString(), value);
    }

    public String setStringOption(SliderOption option) {
        return getStringOptionJS(getElement().getId(), option.toString());
    }

    public void addListener(SliderListener listener) {
        listeners.add(listener);
    }

    public void removeListener(SliderListener listener) {
        listeners.remove(listener);
    }

    private void fireOnStartEvent(Event evt, JsArrayNumber values) {
        double[] vals = jsArrayNumberToArray(values);
        SliderEvent e = new SliderEvent(evt, this, vals);

        for (SliderListener listener : listeners) {
            listener.onStart(e);
        }

    }

    private boolean fireOnSlideEvent(Event evt, JsArrayNumber values) {
        double[] vals = jsArrayNumberToArray(values);
        SliderEvent event = new SliderEvent(evt, this, vals);

        for (SliderListener listener : listeners) {
            listener.onStart(event);
        }

        boolean result = true;
        for (SliderListener listener : listeners) {
            if (!listener.onSlide(event)) {
                //if any of the listeners returns false, return false,
                //but let them all do their thing
                result = false;
            }
        }

        return result;
    }

    private void fireOnChangeEvent(Event evt, JsArrayNumber values, boolean hasOriginalEvent) {
        double[] vals = jsArrayNumberToArray(values);
        SliderEvent event = new SliderEvent(evt, this, vals, hasOriginalEvent);

        for (SliderListener listener : listeners) {
            listener.onChange(event);
        }
    }

    private void fireOnStopEvent(Event evt, JsArrayNumber values) {
        double[] vals = jsArrayNumberToArray(values);
        SliderEvent e = new SliderEvent(evt, this, vals);

        for (SliderListener listener : listeners) {
            listener.onStop(e);
        }
    }

    private double[] jsArrayNumberToArray(JsArrayNumber values) {
        int len = values.length();
        double[] vals = new double[len];
        for (int i = 0; i < len; i++) {
            vals[i] = values.get(i);
        }
        return vals;
    }

    private native void setIntOptionJS(String id, String option, int value) /*-{
                                                                            $wnd.$("#" + id).slider("option", option, value);
                                                                            }-*/;

    private native int getIntOptionJS(String id, String option) /*-{
                                                                return $wnd.$("#" + id).slider("option", option);
                                                                }-*/;

    private native void setBooleanOptionJS(String id, String option, boolean value) /*-{
                                                                                    $wnd.$("#" + id).slider("option", option, value);
                                                                                    }-*/;

    private native boolean getBooleanOptionJS(String id, String option) /*-{
                                                                        return $wnd.$("#" + id).slider("option", option);
                                                                        }-*/;

    private native void setStringOptionJS(String id, String option, String value) /*-{
                                                                                  $wnd.$("#" + id).slider("option", option, value);
                                                                                  }-*/;

    private native String getStringOptionJS(String id, String option) /*-{
                                                                      return $wnd.$("#" + id).slider("option", option);
                                                                      }-*/;

    private native void setValuesJS(String id, JavaScriptObject values) /*-{
                                                                        $wnd.$("#" + id).slider("option", "values", values);
                                                                        }-*/;

    private native int getValueJS(String id, int index) /*-{
                                                        return $wnd.$("#" + id).slider("values", index);
                                                        }-*/;

    private native void createSliderJS(Slider x, String id, JavaScriptObject options) /*-{
                                                                                      options.start = function(event, ui) {
                                                                                      x.@net.easysmarthouse.ui.webui.client.view.widget.Slider::fireOnStartEvent(Lcom/google/gwt/user/client/Event;Lcom/google/gwt/core/client/JsArrayNumber;)(event, ui.values);
                                                                                      };
                                                                                      options.slide = function(event, ui) {
                                                                                      return x.@net.easysmarthouse.ui.webui.client.view.widget.Slider::fireOnSlideEvent(Lcom/google/gwt/user/client/Event;Lcom/google/gwt/core/client/JsArrayNumber;)(event, ui.values);
                                                                                      };
                                                                                      options.change = function(event, ui) {
                                                                                      var has = event.originalEvent ? true : false;
                                                                                      x.@net.easysmarthouse.ui.webui.client.view.widget.Slider::fireOnChangeEvent(Lcom/google/gwt/user/client/Event;Lcom/google/gwt/core/client/JsArrayNumber;Z)(event, ui.values, has);                
                                                                                      };
                                                                                      options.stop = function(event, ui) {
                                                                                      x.@net.easysmarthouse.ui.webui.client.view.widget.Slider::fireOnStopEvent(Lcom/google/gwt/user/client/Event;Lcom/google/gwt/core/client/JsArrayNumber;)(event, ui.values);
                                                                                      };
                                                                                          
                                                                                      $wnd.$("#" + id).slider(options);
                                                                                      }-*/;

    private native void destroySliderJS(Slider x, String id) /*-{
                                                             $wnd.$("#" + id).slider("destroy");
                                                             }-*/;
}