package com.googlecode.gwt.charts.showcase.client.controls;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.user.client.ui.DockLayoutPanel;
import com.googlecode.gwt.charts.client.ChartLoader;
import com.googlecode.gwt.charts.client.ChartPackage;
import com.googlecode.gwt.charts.client.ChartType;
import com.googlecode.gwt.charts.client.ChartWrapper;
import com.googlecode.gwt.charts.client.ColumnType;
import com.googlecode.gwt.charts.client.DataTable;
import com.googlecode.gwt.charts.client.controls.Dashboard;
import com.googlecode.gwt.charts.client.controls.filter.ChartRangeFilter;
import com.googlecode.gwt.charts.client.controls.filter.ChartRangeFilterOptions;
import com.googlecode.gwt.charts.client.controls.filter.ChartRangeFilterState;
import com.googlecode.gwt.charts.client.controls.filter.ChartRangeFilterStateRange;
import com.googlecode.gwt.charts.client.controls.filter.ChartRangeFilterUi;
import com.googlecode.gwt.charts.client.corechart.LineChartOptions;
import com.googlecode.gwt.charts.client.options.ChartArea;
import com.googlecode.gwt.charts.client.options.Legend;
import com.googlecode.gwt.charts.client.options.LegendPosition;
import com.googlecode.gwt.charts.showcase.client.util.DateUtils;
public class ChartRangeFilterExample extends DockLayoutPanel {
private Dashboard dashboard;
private ChartWrapper<LineChartOptions> lineChart;
private ChartRangeFilter numberRangeFilter;
public ChartRangeFilterExample() {
super(Unit.PX);
initialize();
}
private void initialize() {
ChartLoader chartLoader = new ChartLoader(ChartPackage.CONTROLS);
chartLoader.loadApi(new Runnable() {
@Override
public void run() {
addNorth(getDashboardWidget(), 0);
addSouth(getNumberRangeFilter(), 100);
add(getLineChart());
draw();
}
});
}
private Dashboard getDashboardWidget() {
if (dashboard == null) {
dashboard = new Dashboard();
}
return dashboard;
}
private ChartWrapper<LineChartOptions> getLineChart() {
if (lineChart == null) {
lineChart = new ChartWrapper<LineChartOptions>();
lineChart.setChartType(ChartType.LINE);
}
return lineChart;
}
private ChartRangeFilter getNumberRangeFilter() {
if (numberRangeFilter == null) {
numberRangeFilter = new ChartRangeFilter();
}
return numberRangeFilter;
}
private void draw() {
// Set control options
ChartRangeFilterOptions chartRangeFilterOptions = ChartRangeFilterOptions.create();
chartRangeFilterOptions.setFilterColumnIndex(0); // Filter by the date axis
LineChartOptions controlChartOptions = LineChartOptions.create();
controlChartOptions.setHeight(100);
ChartArea chartArea = ChartArea.create();
chartArea.setWidth("90%");
chartArea.setHeight("90%");
controlChartOptions.setChartArea(chartArea);
ChartRangeFilterUi chartRangeFilterUi = ChartRangeFilterUi.create();
chartRangeFilterUi.setChartType(ChartType.LINE);
chartRangeFilterUi.setChartOptions(controlChartOptions);
chartRangeFilterUi.setMinRangeSize(2 * 24 * 60 * 60 * 1000); // 2 days in milliseconds
chartRangeFilterOptions.setUi(chartRangeFilterUi);
ChartRangeFilterStateRange stateRange = ChartRangeFilterStateRange.create();
stateRange.setStart(DateUtils.create(2012, 2, 9));
stateRange.setEnd(DateUtils.create(2012, 3, 20));
ChartRangeFilterState controlState = ChartRangeFilterState.create();
controlState.setRange(stateRange);
numberRangeFilter.setState(controlState);
numberRangeFilter.setOptions(chartRangeFilterOptions);
// Set chart options
LineChartOptions lineChartOptions = LineChartOptions.create();
lineChartOptions.setLineWidth(3);
lineChartOptions.setLegend(Legend.create(LegendPosition.NONE));
lineChartOptions.setChartArea(chartArea);
lineChart.setOptions(lineChartOptions);
// Generate random data
DataTable dataTable = DataTable.create();
dataTable.addColumn(ColumnType.DATE, "Date");
dataTable.addColumn(ColumnType.NUMBER, "Stock value");
dataTable.addRows(121);
double open, close = 300;
double low, high;
for (int day = 1; day < 121; ++day) {
double change = (Math.sin(day / 2.5 + Math.PI) + Math.sin(day / 3) - Math.cos(day * 0.7)) * 150;
change = change >= 0 ? change + 10 : change - 10;
open = close;
close = Math.max(50, open + change);
low = Math.min(open, close) - (Math.cos(day * 1.7) + 1) * 15;
low = Math.max(0, low);
high = Math.max(open, close) + (Math.cos(day * 1.3) + 1) * 15;
dataTable.setValue(day, 0, DateUtils.create(2012, 1, day));
dataTable.setValue(day, 1, Math.round(high));
}
// Draw the chart
dashboard.bind(numberRangeFilter, lineChart);
dashboard.draw(dataTable);
}
}