All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.googlecode.gwt.charts.client.controls.Dashboard Maven / Gradle / Ivy

/*
 * Copyright 2012 Rui Afonso
 * 
 * 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.
 */
package com.googlecode.gwt.charts.client.controls;

import com.google.gwt.core.client.JsArray;
import com.google.gwt.core.client.JsArrayMixed;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.dom.client.Element;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.ui.Widget;

import com.googlecode.gwt.charts.client.ChartWrapper;
import com.googlecode.gwt.charts.client.ChartWrapperObject;
import com.googlecode.gwt.charts.client.DataSource;
import com.googlecode.gwt.charts.client.event.ErrorEvent;
import com.googlecode.gwt.charts.client.event.ErrorHandler;
import com.googlecode.gwt.charts.client.event.HandlerRef;
import com.googlecode.gwt.charts.client.event.ReadyEvent;
import com.googlecode.gwt.charts.client.event.ReadyHandler;
import com.googlecode.gwt.charts.client.util.ChartHelper;

import java.util.List;

/**
 * Represents a collection of collaborating controls and charts that share the same underlying data.
 */
public class Dashboard extends Widget {
	private DashboardObject dashboardObject;
	private Object data;
	private boolean pending;

	/**
	 * Creates a Dashboard
	 */
	public Dashboard() {
		super();
		Element dashboardDiv = DOM.createDiv();
		dashboardObject = DashboardObject.create(dashboardDiv);
		setElement(dashboardDiv);
	}

	/**
	 * Fired when an error occurs when attempting to render the dashboard. One or more of the controls and charts that
	 * are part of the dashboard may have failed rendering.
	 * 
	 * @param handler the error handler
	 * @return a reference for removing this handler
	 */
	public HandlerRef addErrorHandler(ErrorHandler handler) {
		return dashboardObject.addListener(ErrorEvent.NAME, handler);
	}

	/**
	 * The dashboard has completed drawing and is ready to accept changes. All the controls and charts that are part of
	 * the dashboard are ready for external method call and user interaction. If you want to change the dashboard (or
	 * the data it displays) after you draw it, you should set up a listener for this event before you call the draw
	 * method, and then apply your changes only after the event was fired.
	 * 
	 * The ready event will also fire:
	 * 
	 * after the completion of a dashboard refresh triggered by a user or programmatic interaction with one of the
	 * controls,
	 * after a programmatic call to the draw() method of any chart part of the dashboard.
	 * 
	 * @param handler the ready handler
	 * @return a reference for removing this handler
	 */
	public HandlerRef addReadyHandler(ReadyHandler handler) {
		return dashboardObject.addListener(ReadyEvent.NAME, handler);
	}

	/**
	 * Binds one Control to a dashboard participant (either a chart or other control), so that
	 * all of the latter are redrawn whenever any of the former collects a programmatic or user interaction that affects
	 * the data managed by the dashboard. Returns the dashboard instance itself for chaining multiple bind() calls
	 * together.
	 * 
	 * @param controlWrapper
	 * @param chartWrapper
	 */
	public void bind(ControlWrapper controlWrapper, ChartWrapper chartWrapper) {
		dashboardObject.bind(controlWrapper.getObject(), chartWrapper.getObject());
	}

	/**
	 * Binds one or more Controls to one or more other dashboard participants (either charts or other controls), so
	 * that all of the latter are redrawn whenever any of the former collects a programmatic or user interaction that
	 * affects the data managed by the dashboard. Returns the dashboard instance itself for chaining multiple bind()
	 * calls together.
	 * 
	 * @param controlWrappers
	 * @param chartWrappers
	 */
	public void bind(List> controlWrappers, List> chartWrappers) {
		JsArray> controlWrapperArray = JsArray.createArray().cast();
		for (ControlWrapper controlWrapper : controlWrappers) {
			controlWrapperArray.push(controlWrapper.getObject());
		}
		JsArray> chartWrapperArray = JsArray.createArray().cast();
		for (ChartWrapper chartWrapper : chartWrappers) {
			chartWrapperArray.push(chartWrapper.getObject());
		}
		dashboardObject.bind(controlWrapperArray, chartWrapperArray);
	}

	/**
	 * Draws the dashboard.
	 * 
	 * @param dataSource a DataTable or a DataView object
	 */
	public void draw(DataSource dataSource) {
		this.data = dataSource;
		redraw();
	}

	/**
	 * Draws the dashboard.
	 * 
	 * @param dataArray an array following the syntax of {@link ChartHelper#arrayToDataTable(JsArrayMixed)}
	 */
	public void draw(JsArrayMixed dataArray) {
		this.data = dataArray;
		dashboardObject.draw(dataArray);
	}

	/**
	 * Draws the dashboard.
	 * 
	 * @param json a JSON representation of a DataTable
	 */
	public void draw(String json) {
		this.data = json;
		dashboardObject.draw(json);
	}

	/**
	 * Returns the underlying dashboard object.
	 * 
	 * @return the underlying dashboard object
	 */
	public DashboardObject getObject() {
		return dashboardObject;
	}
	
	/**
	 * Redraws the chart with last used data and options.
	 */
	public void redraw() {
		if (pending) {
			return;
		}
		pending = true;
		// Double deferred command because of layout issues
		Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() {

			@Override
			public void execute() {
				Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() {

					@Override
					public void execute() {
						redrawNow();
					}
				});
			}
		});
	}
	
	protected void redrawNow() {
		if (data instanceof DataSource) {
			dashboardObject.draw((DataSource)data);
		} else if (data instanceof JsArrayMixed) {
			dashboardObject.draw((JsArrayMixed)data);
		} else if (data instanceof String) {
			dashboardObject.draw((String)data);
		}
		pending = false;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy