/******************************************************************************* * Copyright (c) 2012, Nabeel Shaheen * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are permitted ******************************************************************************/ package com.odb.view.dashboard.client.charts; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Set; import org.icepush.gwt.client.GWTPushContext; import org.icepush.gwt.client.PushEventListener; import com.google.gwt.editor.client.Editor; import com.google.gwt.editor.client.EditorError; import com.google.gwt.event.logical.shared.ValueChangeEvent; import com.google.gwt.event.logical.shared.ValueChangeHandler; import com.google.gwt.i18n.client.DateTimeFormat; import com.google.gwt.regexp.shared.RegExp; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.Widget; import com.odb.view.dashboard.client.DataVO; import com.odb.view.dashboard.client.DebugWindow; import com.odb.view.dashboard.client.TimeSeriesDataVO; import com.sencha.gxt.chart.client.chart.Chart; import com.sencha.gxt.chart.client.chart.Chart.Position; import com.sencha.gxt.chart.client.chart.Legend; import com.sencha.gxt.chart.client.chart.axis.NumericAxis; import com.sencha.gxt.chart.client.chart.axis.TimeAxis; import com.sencha.gxt.chart.client.chart.series.LineSeries; import com.sencha.gxt.chart.client.chart.series.Primitives; import com.sencha.gxt.chart.client.chart.series.SeriesHighlighter; import com.sencha.gxt.chart.client.draw.Color; import com.sencha.gxt.chart.client.draw.DrawFx; import com.sencha.gxt.chart.client.draw.RGB; import com.sencha.gxt.chart.client.draw.path.PathSprite; import com.sencha.gxt.chart.client.draw.sprite.Sprite; import com.sencha.gxt.chart.client.draw.sprite.TextSprite; import com.sencha.gxt.data.shared.LabelProvider; import com.sencha.gxt.data.shared.ListStore; import com.sencha.gxt.data.shared.ModelKeyProvider; import com.sencha.gxt.widget.core.client.button.TextButton; import com.sencha.gxt.widget.core.client.button.ToggleButton; import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer; import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer.VerticalLayoutData; import com.sencha.gxt.widget.core.client.event.SelectEvent; import com.sencha.gxt.widget.core.client.event.SelectEvent.SelectHandler; import com.sencha.gxt.widget.core.client.form.ComboBox; import com.sencha.gxt.widget.core.client.form.TextField; import com.sencha.gxt.widget.core.client.form.Validator; import com.sencha.gxt.widget.core.client.form.error.DefaultEditorError; import com.sencha.gxt.widget.core.client.form.validator.MaxLengthValidator; import com.sencha.gxt.widget.core.client.toolbar.SeparatorToolItem; import com.sencha.gxt.widget.core.client.toolbar.ToolBar; public class DynamicLineChart extends ODBChart { private DebugWindow dbg = DebugWindow.getInstance(); private final NumericAxis<TimeSeriesDataVO> axis = new NumericAxis<TimeSeriesDataVO>(); private final TimeAxis<TimeSeriesDataVO> timeAxis = new TimeAxis<TimeSeriesDataVO>(); final Chart<TimeSeriesDataVO> chart = new Chart<TimeSeriesDataVO>(); final ListStore<TimeSeriesDataVO> store = new ListStore<TimeSeriesDataVO>(new ModelKeyProvider<TimeSeriesDataVO>() { public String getKey(TimeSeriesDataVO item) { return String.valueOf(item.getKey()); } }); public DynamicLineChart() { } public DynamicLineChart(int seriesCount, Integer min, Integer max, ArrayList<TimeSeriesDataVO> dataList) { for (TimeSeriesDataVO data : dataList) { store.add(0,data); } } public void redraw() { chart.redrawChart(); } public Widget asWidget() { final ListStore<LineSeries<TimeSeriesDataVO>> fieldStore = new ListStore<LineSeries<TimeSeriesDataVO>>( new ModelKeyProvider<LineSeries<TimeSeriesDataVO>>() { public String getKey(LineSeries<TimeSeriesDataVO> item) { return item.getYField().getPath(); } }); chart.setStore(store); chart.setShadowChart(true); chart.setAnimated(true); Set<String> keys = store.get(0).keySet(); for (String k : keys) { dbg.debug("Key=" + k); LineSeries<TimeSeriesDataVO> series = createLine(k); axis.addField(series.getYField()); chart.addSeries(series); fieldStore.add(series); } axis.setPosition(Position.LEFT); TextSprite title = new TextSprite("Number of Hits"); title.setFontSize(18); axis.setTitleConfig(title); axis.setMinorTickSteps(1); axis.setDisplayGrid(true); PathSprite odd = new PathSprite(); odd.setOpacity(1); odd.setFill(new Color("#ddd")); odd.setStroke(new Color("#bbb")); odd.setStrokeWidth(0.5); axis.setGridOddConfig(odd); chart.addAxis(axis); timeAxis.setField(new MapTimeProvider()); dbg.debug("StartDate=" + store.get(0).getKey()); timeAxis.setStartDate(store.get(0).getKey()); dbg.debug("EndDate=" + store.get(store.size() - 1).getKey()); timeAxis.setEndDate(store.get(store.size() - 1).getKey()); timeAxis.setPosition(Position.BOTTOM); timeAxis.setLabelProvider(new LabelProvider<Date>() { public String getLabel(Date item) { return DateTimeFormat.getFormat("h:m:s").format(item); } }); chart.addAxis(timeAxis); Legend<TimeSeriesDataVO> legend = new Legend<TimeSeriesDataVO>(); legend.setPosition(Position.RIGHT); legend.setItemHighlighting(true); legend.setItemHiding(true); chart.setLegend(legend); chart.setLayoutData(new VerticalLayoutData(1, 1)); return chart; } private LineSeries<TimeSeriesDataVO> createLine(String seriesName) { MapValueProvider valueProvider = new MapValueProvider(seriesName); LineSeries<TimeSeriesDataVO> series = new LineSeries<TimeSeriesDataVO>(); series.setYAxisPosition(Position.LEFT); Color color = new RGB((int) (Math.random() * 255), (int) (Math.random() * 255), (int) (Math.random() * 255)); series.setStroke(color); series.setStrokeWidth(3); series.setShowMarkers(true); Sprite marker = Primitives.circle(0, 0, 6); marker.setFill(color); series.setMarkerConfig(marker); series.setYField(valueProvider); series.setLineHighlighter(new SeriesHighlighter() { public void highlight(Sprite sprite) { DrawFx.createStrokeWidthAnimator(sprite, 6).run(250); } public void unHighlight(Sprite sprite) { DrawFx.createStrokeWidthAnimator(sprite, 3).run(250); } }); return series; } @Override public void updateChartData(DataVO data, Label errorLabel) { TimeSeriesDataVO ts = (TimeSeriesDataVO)data; chart.getStore().remove(0); chart.getStore().add(ts); timeAxis.setStartDate(chart.getStore().get(0).getKey()); timeAxis.setEndDate(chart.getStore().get(chart.getStore().size()-1).getKey()); chart.redrawChart(); } }