Package com.chap.links.client

Source Code of com.chap.links.client.Graph$ValueRange

/**
* @file Graph.java
*
* @brief
* This is a GWT Wrapper for the javascript library graph.js.
*
* Graph is an interactive visualization chart to draw (measurement) data
* in time. You can freely move and zoom in the graph by dragging and scrolling
* in the window. The time scale on the axis is adjusted automatically, and
* supports scales ranging from milliseconds to years.
*
* Graph is part of the CHAP Links library.
*
* Graph is tested on Firefox 3.6, Safari 5.0, Chrome 6.0, Opera 10.6, and
* Internet Explorer 6+.
*
* @license
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy
* of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*
* Copyright © 2010-2011 Almende B.V.
*
* @author   Jos de Jong, <jos@almende.org>
* @date    2011-04-14
*/

package com.chap.links.client;

/**
* TODO
* bug with displaying the color block in the legend
*/

import java.util.Date;

import com.chap.links.client.events.RangeChangeHandler;
import com.chap.links.client.events.RangeChangedHandler;
import com.chap.links.client.events.ReadyHandler;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.dom.client.Element;
import com.google.gwt.visualization.client.AbstractDataTable;
import com.google.gwt.visualization.client.AbstractDrawOptions;
import com.google.gwt.visualization.client.DataTable;
import com.google.gwt.visualization.client.visualizations.Visualization;

/**
* The Graph is a visualization chart to display one ore multiple data sets on a
* timeline
*
* The Graph is developed in javascript as a Google Visualization Chart. This
* Graph class is a GWT wrapper for the javascript code.
*/
public class Graph extends Visualization<Graph.Options> {
  /**
   * Options for drawing the Graph. Create an instance via the method create,
   * for example Graph.Options options = Graph.Options.create();
   */
  public static class Options extends AbstractDrawOptions {
    /**
     * Create a Javascript object instance of Options()
     *
     * @return new instance of Object
     */
    public static Options create() {
      return JavaScriptObject.createObject().cast();
    }

    /**
     * Constructor
     */
    protected Options() {
    }
   
    /**
     * If autoDataStep is set to true (default), intermediate data points
     * will be skipped in case of much data. This makes drawing large
     * amounts of data much faster. For example, when the data contains
     * 10000 points, and the width of the graph is 1000 pixels, every tenth
     * datapoint will be drawn and the rest will be skipped.
     *
     * @param autoDataStep  
     */
    public final native void setAutoDataStep(boolean autoDataStep) /*-{
      this.autoDataStep = autoDataStep;
    }-*/;

    /**
     * Set the width for the chart in pixels.
     *
     * @param width
     *            Width in pixels
     */
    public final native void setWidth(int width) /*-{
      this.width = width + "px";
    }-*/;

    /**
     * Set the width for the chart in pixels or percentages.
     *
     * @param width
     *            Width as a string, for example "100%" or "500px"
     */
    public final native void setWidth(String width) /*-{
      this.width = width;
    }-*/;

    /**
     * Set the height for the chart in pixels.
     *
     * @param height
     *            Height in pixels
     */
    public final native void setHeight(int height) /*-{
      this.height = height + "px";
    }-*/;

    /**
     * Set the height for the chart in pixels or percentages.
     *
     * @param height
     *            Height as a string, for example "100%" or "500px"
     */
    public final native void setHeight(String height) /*-{
      this.height = height;
    }-*/;

    /**
     * Set the start date for the chart
     *
     * @param start
     *            A startdate
     */
    public final void setStart(Date start) {
      nativeSetStart(start.getTime());
    }

    private final native void nativeSetStart(double start) /*-{
      this.start = new $wnd.Date(start);
    }-*/;

    /**
     * Set the end date for the chart
     *
     * @param end
     *            An end date
     */
    public final void setEnd(Date end) {
      nativeSetEnd(end.getTime());
    }

    private final native void nativeSetEnd(double end) /*-{
      this.end = new $wnd.Date(end);
    }-*/;


    /**
     * Set a minimum Date for the visible range.
     * It will not be possible to move beyond this minimum.
     * @param min    Minimum date
     */
    public final void setMin(Date min) {
      nativeSetMin(min.getTime());
    }

    private final native void nativeSetMin(double min) /*-{
      this.min = new $wnd.Date(min);
    }-*/;

    /**
     * Set a maximum Date for the visible range.
     * It will not be possible to move beyond this maximum.
     * @param max  Maximum date
     */
    public final void setMax(Date max) {
      nativeSetMax(max.getTime());
    }

    private final native void nativeSetMax(double max) /*-{
      this.max = new $wnd.Date(max);
    }-*/;

    /**
     * Set a minimum interval for the visible range in milliseconds.
     * It will not be possible to zoom in further than this minimum.
     * @param intervalMin  Minimum interval in milliseconds (default is 10)
     */
    public final void setIntervalMin(long intervalMin) {
      nativeSetIntervalMin(String.valueOf(intervalMin));
    };

    private final native void nativeSetIntervalMin(String intervalMin) /*-{
      this.intervalMin = Number(intervalMin);
    }-*/;

    /**
     * Set a maximum interval for the visible range in milliseconds.
     * It will not be possible to zoom out further than this maximum.
     * Default value equals about 10000 years.
     * @param intervalMax  Maximum interval in milliseconds
     */
    public final void setIntervalMax(long intervalMax) {
      nativeSetIntervalMax(String.valueOf(intervalMax));
    };

    private final native void nativeSetIntervalMax(String intervalMax) /*-{
      this.intervalMax = Number(intervalMax);
    }-*/;
   
    public enum SCALE {
      MILLISECOND, SECOND, MINUTE, HOUR, DAY, MONTH, YEAR
    };

    /**
     * Set a custom scale. Automatic scaling will be disabled. For example
     * scale=SCALE.MINUTES and step=5 will result in minor steps of 5
     * minutes, and major steps of an hour. Available scales: MILLISECOND,
     * SECOND, MINUTE, HOUR, DAY, MONTH, YEAR. As step size, choose for
     * example 1, 2, 5, or 10.
     *
     * @param scale
     * @param step
     */
    public final native void setScale(SCALE scale, double step) /*-{
      switch (scale) {
      case @com.chap.links.client.Graph.Options.SCALE::MILLISECOND:
        this.scale = $wnd.links.StepDate.SCALE.MILLISECOND;
        break;
      case @com.chap.links.client.Graph.Options.SCALE::SECOND:
        this.scale = $wnd.links.StepDate.SCALE.SECOND;
        break;
      case @com.chap.links.client.Graph.Options.SCALE::MINUTE:
        this.scale = $wnd.links.StepDate.SCALE.MINUTE;
        break;
      case @com.chap.links.client.Graph.Options.SCALE::HOUR:
        this.scale = $wnd.links.StepDate.SCALE.HOUR;
        break;
      case @com.chap.links.client.Graph.Options.SCALE::DAY:
        this.scale = $wnd.links.StepDate.SCALE.DAY;
        break;
      case @com.chap.links.client.Graph.Options.SCALE::MONTH:
        this.scale = $wnd.links.StepDate.SCALE.MONTH;
        break;
      case @com.chap.links.client.Graph.Options.SCALE::YEAR:
        this.scale = $wnd.links.StepDate.SCALE.YEAR;
        break;
      }
      this.step = step;
    }-*/;

    /**
     * Set the initial start value of the vertical axis.
     *
     * @param start
     */
    public final native void setVerticalStart(double start) /*-{
      this.vStart = start;
    }-*/;

    /**
     * Set the initial end value of the vertical axis.
     *
     * @param end
     */
    public final native void setVerticalEnd(double end) /*-{
      this.vEnd = end;
    }-*/;

    /**
     * Set step size of the vertical axis.
     *
     * @param step
     */
    public final native void setVerticalStep(double step) /*-{
      this.vStep = step;
    }-*/;
   
    /**
     * Set the minimum value of the vertical axis.
     *
     * @param min
     */
    public final native void setVerticalMin(double min) /*-{
      this.vMin = min;
    }-*/;

    /**
     * Set the maximum value of the vertical axis.
     *
     * @param end
     */
    public final native void setVerticalMax(double max) /*-{
      this.vMax = max;
    }-*/;

    /**
     * If true, the Graph can be moved. When the graph moved, the
     * rangechange events are fired.
     *
     * @param moveable
     *            default: true
     */
    public final native void setMoveable(boolean moveable) /*-{
      this.moveable = moveable;
    }-*/;

    /**
     * If true (default), the Graph can be zoomed. When the Graph is zoomed,
     * the rangechange event is fired.
     *
     * @param zoomable
     *            default: true
     */
    public final native void setZoomable(boolean zoomable) /*-{
      this.zoomable = zoomable;
    }-*/;

    /**
     * Enable showing and hiding individual lines in the graph. When
     * enableVisibility is true, checkboxes are added in the legend to show
     * or hide a line. A line can initially be set invisible by setting its
     * visibility to false via the method setLineVisibe.
     *
     * @param visible
     *            default: false
     */
    public final native void setLegendCheckboxes(boolean visible) /*-{
      if (this.legend === undefined)
        this.legend = {};

      this.legend.toggleVisibility = visible;
    }-*/;

    /**
     * Set the width of the legend
     *
     * @param width
     *            For example "150px" or "15%". Default: "auto"
     */
    public final native void setLegendWidth(String width) /*-{
      if (this.legend === undefined)
        this.legend = {};

      this.legend.width = width;
    }-*/;

    /**
     * Set the width of the legend in pixels
     *
     * @param width
     *            Default: none
     */
    public final native void setLegendWidth(int width) /*-{
      if (this.legend === undefined)
        this.legend = {};

      this.legend.width = width + "px";
    }-*/;

    /**
     * Set the visibility of the legend
     *
     * @param visible
     *            Default: true
     */
    public final native void setLegendVisibility(boolean visible) /*-{
      if (this.legend === undefined)
        this.legend = {};

      this.legend.visible = visible;
    }-*/;

    public enum LINESTYLE {
      LINE, DOT, DOTLINE
    };

    /**
     * Set the line style for the specified line. This overrides the line
     * style set for all lines
     *
     * @param style
     *            A line style: LINE (default), DOT, or DOTLINE
     * @param linenum
     *            A line number (zero based)
     */
    public final void setLineStyle(LINESTYLE style, int linenum) {
      switch (style) {
      case LINE:
        nativeSetLineStyle("line", linenum);
        break;
      case DOT:
        nativeSetLineStyle("dot", linenum);
        break;
      case DOTLINE:
        nativeSetLineStyle("dot-line", linenum);
        break;
      }
    }

    /**
     * Set the line style for the specified line This overrides the line
     * style set for all lines
     *
     * @param style
     *            A line style: "line" (default), "dot", or "dot-line"
     * @param linenum
     *            A linenumber
     */
    private final native void nativeSetLineStyle(String style, int linenum) /*-{
      if (linenum >= 0) {
        if (this.lines == undefined)
          this.lines = new Array();

        if (this.lines[linenum] == undefined)
          this.lines[linenum] = {};

        this.lines[linenum].style = style;
      }
    }-*/;

    /**
     * Set one line style for the all lines
     *
     * @param style
     *            A line style: LINE (default), DOT, or DOTLINE
     */
    public final void setLineStyle(LINESTYLE style) {
      switch (style) {
      case LINE:
        nativeSetLineStyle("line");
        break;
      case DOT:
        nativeSetLineStyle("dot");
        break;
      case DOTLINE:
        nativeSetLineStyle("dot-line");
        break;
      }
    }

    /**
     * Set the line style for the specified line
     *
     * @param style
     *            A line style: "line" (default), "dot", or "dot-line"
     */
    private final native void nativeSetLineStyle(String style) /*-{
      if (this.line == undefined)
        this.line = new Object();

      this.line.style = style;
    }-*/;

    /**
     * Set the line color for the specified line This overrides the line
     * color set for all lines
     *
     * @param color
     *            A line color, for example "red" or "#FF0000".
     * @param linenum
     *            A line number (zero based)
     */
    public final native void setLineColor(String color, int linenum) /*-{
      // TODO: is there a specific GWT class for colors?
      if (linenum >= 0) {
        if (this.lines == undefined)
          this.lines = new Array();

        if (this.lines[linenum] == undefined)
          this.lines[linenum] = {};

        this.lines[linenum].color = color;
      }
    }-*/;

    /**
     * Set one line color for all lines
     *
     * @param color
     *            A line color, for example "red" or "#FF0000".
     */
    public final native void setLineColor(String color) /*-{
      // TODO: is there a specific GWT class for colors?
      if (this.line == undefined)
        this.line = new Object();

      this.line.color = color;
    }-*/;

    /**
     * Set the line width for the specified line Only applicable when the
     * line style is LINE or DOTLINE. This overrides the line width set for
     * all lines
     *
     * @param width
     *            The width for the line in pixels, for example 2.0.
     *            Default: 1.0
     * @param linenum
     *            A line number (zero based)
     */
    public final native void setLineWidth(double width, int linenum) /*-{
      if (linenum >= 0) {
        if (this.lines == undefined)
          this.lines = new Array();

        if (this.lines[linenum] == undefined)
          this.lines[linenum] = {};

        this.lines[linenum].width = width;
      }
    }-*/;

    /**
     * Set the line width for all lines Only applicable when the line style
     * is LINE or DOTLINE.
     *
     * @param width
     *            The width for the lines in pixels, for example 2.0.
     *            Default: 1.0
     */
    public final native void setLineWidth(double width) /*-{
      if (this.line == undefined)
        this.line = new Object();

      this.line.width = width;
    }-*/;

    /**
     * Set the radius for the dots on the specified line Only applicable
     * when the line style is DOT or DOTLINE. This overrides the line radius
     * set for all lines
     *
     * @param radius
     *            The radius for dots on the line in pixels. Default: 1.0;
     * @param linenum
     *            A line number (zero based)
     */
    public final native void setLineRadius(double radius, int linenum) /*-{
      if (linenum >= 0) {
        if (this.lines == undefined)
          this.lines = new Array();

        if (this.lines[linenum] == undefined)
          this.lines[linenum] = {};

        this.lines[linenum].radius = radius;
      }
    }-*/;

    /**
     * Set the radius for the dots on all lines Only applicable when the
     * line style is DOT or DOTLINE.
     *
     * @param radius
     *            The radius for dots on the line in pixels. Default: 1.0;
     */
    public final native void setLineRadius(double radius) /*-{
      if (this.line == undefined)
        this.line = new Object();

      this.line.radius = radius;
    }-*/;

    /**
     * Show or hide the legend for the specified line. This overrides the
     * line legend visibility set for all lines
     *
     * @param visible
     *            If true, the legend for this line is visible. Default:
     *            true
     * @param linenum
     *            A line number (zero based)
     */
    public final native void setLineLegend(boolean visible, int linenum) /*-{
      if (linenum >= 0) {
        if (this.lines == undefined)
          this.lines = new Array();

        if (this.lines[linenum] == undefined)
          this.lines[linenum] = {};

        this.lines[linenum].legend = visible;
      }
    }-*/;

    /**
     * Show or hide the legend for all lines.
     *
     * @param visible
     *            If true, the legend for all lines are visible. Default:
     *            true
     */
    public final native void setLineLegend(boolean visible) /*-{
      if (this.line == undefined)
        this.line = new Object();

      this.line.legend = visible;
    }-*/;

    /**
     * Show or hide this line. If false, the line is hidden. See also the
     * option enableVisibility, which will add visibility checkboxes in the
     * legend. This overrides the line visibility set for all lines
     *
     * @param visible
     *            If true, this line will be visible. Default: true
     * @param linenum
     *            A line number (zero based)
     */
    public final native void setLineVisibe(boolean visible, int linenum) /*-{
      if (linenum >= 0) {
        if (this.lines == undefined)
          this.lines = new Array();

        if (this.lines[linenum] == undefined)
          this.lines[linenum] = {};

        this.lines[linenum].visible = visible;
      }
    }-*/;

    /**
     * Show or hide all lines. If false, the lines are hidden initially. See
     * also the option enableVisibility, which will add visibility
     * checkboxes in the legend.
     *
     * @param visible
     *            If true, the lines will be visible. Default: true
     */
    public final native void setLineVisible(boolean visible) /*-{
      if (this.line == undefined)
        this.line = new Object();

      this.line.visible = visible;
    }-*/;

    /**
     * Show or hide all lines. If false, the lines are hidden initially. See
     * also the option enableVisibility, which will add visibility
     * checkboxes in the legend.
     *
     * @param visible
     *            If true, the lines will be visible. Default: true
     *           
     * @deprecated Use setLineVisible(visible) instead
     */
    public final void setLineVisibe(boolean visible) {
      setLineVisible(visible);
    }
  }


  private AbstractDataTable dataTable = null;
  private JavaScriptObject dataArray = null;
  private Options options = null;
 
  /**
   * DateRange contains a start date and an end date
   */
  public class DateRange {
    public DateRange() {
      start_ = new Date();
      end_ = new Date();
    }

    public DateRange(Date start, Date end) {
      start_ = start;
      end_ = end;
    }

    public Date getEnd() {
      return end_;
    }

    public Date getStart() {
      return start_;
    }

    private Date start_;
    private Date end_;
  }
 
  /**
   * ValueRange contains a start and end number
   */
  public class ValueRange {
    public ValueRange() {
      start_ = 0;
      end_ = 0;
    }

    public ValueRange(double start, double end) {
      start_ = start;
      end_ = end;
    }

    public double getEnd() {
      return end_;
    }

    public double getStart() {
      return start_;
    }

    private double start_;
    private double end_;
  }

  public static final String PACKAGE = "graph";

  /**
   * Constructor
   */
  public Graph() {
    super();
  }


  /**
   * Constructor
   *
   * @param data
   *            A google visualisation datatable containing the data. The
   *            table has two or more columns: date (type DATETIME),
   *            value (type NUMBER), ...
   * @param options
   *            A name/value map containing settings for the graph. See the
   *            class Network.Options for all available options
   */
  public Graph(DataTable data, Options options) {
    super();
    this.dataTable = data;
    this.options = options;
  }

  /**
   * Constructor <br>
   * <br>
   * example data:
     *   String json = <br>
     *     "[{ " + <br>
     *     "    \"label\" : \"Dataset A\", " + <br>
     *     "    \"data\" : [" + <br>
     *     "    {\"date\": 1281823200000, \"value\" : 12.5}," + <br>
     *     "      {\"date\": 1281909600000, \"value\" : 3.5}" + <br>
     *     "    ]" + <br>
     *     "  }," + <br>
     *     "  {" + <br>
     *     "    \"label\" : \"Dataset B\"," + <br> 
     *     "    \"data\" : [" + <br>
     *     "      {\"date\": 1281823200000, \"value\" : 3.2}," + <br>
     *     "      {\"date\": 1281996000000, \"value\" : 6.1}" + <br>
     *     "    ]" + <br>
     *    "  }]"; <br>
     *   JavaScriptObject data = JsonUtils.safeEval(json);   <br>
   *
   * @param data
   *            A JavaScriptObject containing the data
   * @param options
   *            A name/value map containing settings for the graph. See the
   *            class Network.Options for all available options
   */
  public Graph(JavaScriptObject data, Options options) {
    super();
    this.dataArray = data;
    this.options = options;
  }

  /**
   * Redraw the Graph
   */
  public void redraw() {
    nativeRedraw(getJso());
  }

  /**
   * Native redraw of the Graph.
   *
   * @param jso
   *            The javascriptobject pointing to the js instance of the Graph
   */
  private native void nativeRedraw(JavaScriptObject jso) /*-{
    jso.redraw();
  }-*/;

  /**
   * Add a changerange handler. The changerange event is fired repeatedly while
   * the visible range is being changed by user interaction (moving or zooming),
   * but not after a call to the setVisibleChartRange method. The new range
   * can be retrieved by calling getVisibleChartRange method.
   *
   * @param handler
   *            A select handler
   */
  public final void addRangeChangeHandler(com.google.gwt.visualization.client.events.RangeChangeHandler handler) {
    com.google.gwt.visualization.client.events.RangeChangeHandler.addHandler(this, "rangechange", handler);
  }

  /**
   * Add a changerange handler. The changerange event is fired repeatedly while
   * the visible range is being changed by user interaction (moving or zooming),
   * but not after a call to the setVisibleChartRange method. The new range
   * can be retrieved by calling getVisibleChartRange method.
   *
   * @param handler
   *            A select handler
   */
  public final void addRangeChangeHandler(RangeChangeHandler handler) {
    RangeChangeHandler.addHandler(this, "rangechange", handler);
  }

  /**
   * Add a changeranged handler. The changeranged event is fired once after the
   * visible range has been changed by user interaction (moving or zooming),
   * but not after a call to the setVisibleChartRange method. The new range
   * can be retrieved by calling getVisibleChartRange method.
   *
   * @param handler
   *            A select handler
   */
  public final void addRangeChangedHandler(RangeChangedHandler handler) {
    RangeChangedHandler.addHandler(this, "rangechanged", handler);
  }

  /**
   * Add a ready handler. The ready event is fired when the Graph is ready for
   * external method calls.
   *
   * @param handler
   *            A ready handler
   */
  public final void addReadyHandler(com.google.gwt.visualization.client.events.ReadyHandler handler) {
    com.google.gwt.visualization.client.events.ReadyHandler.addHandler(this, "ready", handler);
  }

  /**
   * Add a ready handler. The ready event is fired when the Graph is ready for
   * external method calls.
   *
   * @param handler
   *            A ready handler
   */
  public final void addReadyHandler(ReadyHandler handler) {
    ReadyHandler.addHandler(this, "ready", handler);
  }

  /**
   * Retrieve the (vertical) value range.
   */
  public ValueRange getValueRange() {
    ValueRange range = new ValueRange((long)nativeGetStartValue(getJso()),
        (long)nativeGetEndValue(getJso()));
    return range;
  }
 
  /**
   * returns the current value of the startDate
   *
   * @param jso
   *            The javascriptobject pointing to the js instance of the Graph
   * @return start The timevalue of the start Date
   */
  private native double nativeGetStartValue(JavaScriptObject jso) /*-{
    return jso.vStart || 0;
  }-*/;

  /**
   * returns the current value of the endDate
   *
   * @param jso
   *            The javascriptobject pointing to the js instance of the Graph
   * @return end The timevalue of the send Date
   */
  private native double nativeGetEndValue(JavaScriptObject jso) /*-{
    return jso.vEnd || 0;
  }-*/;

  /**
   * Adjust the (vertical) value range to fit all data.
   *
   * @param start
   *            the start value
   * @param end
   *            the end value
   */
  public void setValueRange(double start, double end) {
    nativeSetValueRange(getJso(), start, end);
  }

  /**
   * Sets the (vertical) value range.
   *
   * @param jso
   *            The javascriptobject pointing to the js instance of the Graph
   * @param start
   *            the start value
   * @param end
   *            the end value
   */
  private native void nativeSetValueRange(JavaScriptObject jso,
      double start, double end) /*-{
    jso.setValueRange(start, end);
  }-*/;

  /**
   * Adjust the (vertical) value range to fit all data.
   */
  public void setValueRangeAuto() {
    nativeSetValueRangeAuto(getJso());
  }
 
  /**
   * Adjust the (vertical) value range to fit all data.
   *
   * @param jso
   *            The javascriptobject pointing to the js instance of the Graph
   */
  private native void nativeSetValueRangeAuto(JavaScriptObject jso) /*-{
    jso.setValueRangeAuto();
  }-*/;

  /**
   * Set a new start and end date Use the function redraw() to redraw after
   * changing the time
   *
   * @param start
   *            A Date object containing the start date.
   * @param end
   *            A Date object containing the end date.
   */
  public void setVisibleChartRange(Date start, Date end) {
    nativeSetVisibleChartRange(getJso(), start.getTime(), end.getTime());
  }

  /**
   * Set a new value for the startDate. Use the function redraw() to redraw
   * after changing the time
   *
   * @param jso
   *            The javascriptobject pointing to the js instance of the Graph
   * @param start
   *            the timevalue of the start date.
   * @param end
   *            the timevalue of the end date.
   */
  private native void nativeSetVisibleChartRange(JavaScriptObject jso,
      double start, double end) /*-{
    jso.setVisibleChartRange(new $wnd.Date(start), new $wnd.Date(end));
  }-*/;
  /**
   * Move the visible range such that all loaded events are within the visible
   * range. This method does not trigger a rangechange event.
   * @param start     A Date object containing the start date.
   * @param end       A Date object containing the end date.
   */ 
  public void setVisibleChartRangeAuto() {
    nativeSetVisibleChartRangeAuto(getJso());
  }

  /**
   * Move the visible range such that all loaded events are within the visible
   * range. This method does not trigger a rangechange event.
   * @param jso       The javascriptobject pointing to the js instance of
   *                  the timeline
   */ 
  private native void nativeSetVisibleChartRangeAuto(JavaScriptObject jso) /*-{
    jso.setVisibleChartRangeAuto();
  }-*/;

  /**
   * Move the visible range such that the current time is located in the center
   * of the timeline. This method does not trigger a rangechange event.
   * @param start     A Date object containing the start date.
   * @param end       A Date object containing the end date.
   */ 
  public void setVisibleChartRangeNow() {
    nativeSetVisibleChartRangeNow(getJso());
  }

  /**
   * Move the visible range such that the current time is located in the center
   * of the timeline. This method does not trigger a rangechange event.
   * @param jso       The javascriptobject pointing to the js instance of
   *                  the timeline
   */ 
  private native void nativeSetVisibleChartRangeNow(JavaScriptObject jso) /*-{
    jso.setVisibleChartRangeNow();
  }-*/;

  /**
   * returns the current value of the start Date
   *
   * @return {Date} start A Date object
   */
  public DateRange getVisibleChartRange() {
    JavaScriptObject jso = getJso();
    Date start = new Date((long) nativeGetStart(jso));
    Date end = new Date((long) nativeGetEnd(jso));
    return new DateRange(start, end);
  }

  /**
   * returns the current value of the startDate
   *
   * @param jso
   *            The javascriptobject pointing to the js instance of the Graph
   * @return start The timevalue of the start Date
   */
  private native double nativeGetStart(JavaScriptObject jso) /*-{
    return jso.start.getTime();
  }-*/;

  /**
   * returns the current value of the endDate
   *
   * @param jso
   *            The javascriptobject pointing to the js instance of the Graph
   * @return end The timevalue of the send Date
   */
  private native double nativeGetEnd(JavaScriptObject jso) /*-{
    return jso.end.getTime();
  }-*/;

  /**
   * Enable or disable autoscaling. If enable true or not defined, autoscaling
   * is enabled. If false, autoscaling is disabled.
   *
   * @param enable
   */
  public void setAutoScale(boolean enable) {
    nativeSetAutoScale(getJso(), enable);
  }

  /**
   * Enable or disable autoscaling. If enable true or not defined, autoscaling
   * is enabled. If false, autoscaling is disabled.
   *
   * @param jso
   *            The javascriptobject pointing to the js instance of the Graph
   * @param enable
   */
  private native void nativeSetAutoScale(JavaScriptObject jso, boolean enable) /*-{
    jso.setAutoScale(enable);
  }-*/;

  /**
   * Set a custom scale. Automatic scaling will be disabled. For example
   * scale=SCALE.MINUTES and step=5 will result in minor steps of 5 minutes,
   * and major steps of an hour. Available scales: MILLISECOND, SECOND,
   * MINUTE, HOUR, DAY, MONTH, YEAR. As step size, choose for example 1, 2, 5,
   * or 10.
   *
   * @param scale
   * @param step
   */
  public void setScale(Options.SCALE scale, double step) {
    nativeSetScale(getJso(), scale, step);
  }

  /**
   * Set a custom scale. Automatic scaling will be disabled. For example
   * scale=SCALE.MINUTES and step=5 will result in minor steps of 5 minutes,
   * and major steps of an hour. Available scales: MILLISECOND, SECOND,
   * MINUTE, HOUR, DAY, MONTH, YEAR. As step size, choose for example 1, 2, 5,
   * or 10.
   *
   * @param jso
   *            The javascript object pointing to the js instance of the Graph
   * @param scale
   * @param step
   */
  private native void nativeSetScale(JavaScriptObject jso,
      Options.SCALE scale, double step) /*-{
    var jsScale;
    switch (scale) {
    case @com.chap.links.client.Graph.Options.SCALE::MILLISECOND:
      jsScale = $wnd.links.StepDate.SCALE.MILLISECOND;
      break;
    case @com.chap.links.client.Graph.Options.SCALE::SECOND:
      jsScale = $wnd.links.StepDate.SCALE.SECOND;
      break;
    case @com.chap.links.client.Graph.Options.SCALE::MINUTE:
      jsScale = $wnd.links.StepDate.SCALE.MINUTE;
      break;
    case @com.chap.links.client.Graph.Options.SCALE::HOUR:
      jsScale = $wnd.links.StepDate.SCALE.HOUR;
      break;
    case @com.chap.links.client.Graph.Options.SCALE::DAY:
      jsScale = $wnd.links.StepDate.SCALE.DAY;
      break;
    case @com.chap.links.client.Graph.Options.SCALE::MONTH:
      jsScale = $wnd.links.StepDate.SCALE.MONTH;
      break;
    case @com.chap.links.client.Graph.Options.SCALE::YEAR:
      jsScale = $wnd.links.StepDate.SCALE.YEAR;
      break;
    default:
      jsScale = $wnd.links.StepDate.SCALE.DAY;
      break;
    }

    jso.setScale(jsScale, step);
  }-*/;

  /**
   * Draws the visualization providing a Javascript array with data
   *
   * example data:
     *   String json = <br>
     *     "[{ " + <br>
     *     "    \"label\" : \"Dataset A\", " + <br>
     *     "    \"data\" : [" + <br>
     *     "    {\"date\": 1281823200000, \"value\" : 12.5}," + <br>
     *     "      {\"date\": 1281909600000, \"value\" : 3.5}" + <br>
     *     "    ]" + <br>
     *     "  }," + <br>
     *     "  {" + <br>
     *     "    \"label\" : \"Dataset B\"," + <br> 
     *     "    \"data\" : [" + <br>
     *     "      {\"date\": 1281823200000, \"value\" : 3.2}," + <br>
     *     "      {\"date\": 1281996000000, \"value\" : 6.1}" + <br>
     *     "    ]" + <br>
     *    "  }]"; <br>
     *   JavaScriptObject data = JsonUtils.safeEval(json);   <br>
   *
   * @param data
   *            The data, as a Javascript Array
   * @param options
   *            The options for drawing this visualization.
   */
  public void draw(JavaScriptObject data, Options options) {
    nativeDraw(getJso(), data, options);
  }
 
  /**
   * Draws the visualization providing a Javascript Array as data
   *
   * example data:
     *   String json = <br>
     *     "[{ " + <br>
     *     "    \"label\" : \"Dataset A\", " + <br>
     *     "    \"data\" : [" + <br>
     *     "    {\"date\": 1281823200000, \"value\" : 12.5}," + <br>
     *     "      {\"date\": 1281909600000, \"value\" : 3.5}" + <br>
     *     "    ]" + <br>
     *     "  }," + <br>
     *     "  {" + <br>
     *     "    \"label\" : \"Dataset B\"," + <br> 
     *     "    \"data\" : [" + <br>
     *     "      {\"date\": 1281823200000, \"value\" : 3.2}," + <br>
     *     "      {\"date\": 1281996000000, \"value\" : 6.1}" + <br>
     *     "    ]" + <br>
     *    "  }]"; <br>
     *   JavaScriptObject data = JsonUtils.safeEval(json);   <br>
   *
   * @param data
   *            The DataTable with the nodes.
   * @param options
   *            The options for drawing this visualization.
   */
  private native void nativeDraw(JavaScriptObject jso,
      JavaScriptObject data, Options options) /*-{
    jso.draw(data, options);
  }-*/;
 
  @Override
  protected native JavaScriptObject createJso(Element parent) /*-{
    var jso = new $wnd.links.Graph(parent);
    return jso;
  }-*/;

  @Override
  protected void onLoad() {
    if (options != null) {
      if (dataTable != null) {
        draw(dataTable, options);
      } else if (dataArray != null) {
        draw(dataArray, options);
      }

      dataTable = null;
      dataArray = null;
      options = null;
    }
  }
}
TOP

Related Classes of com.chap.links.client.Graph$ValueRange

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.