/* * Isomorphic SmartGWT web presentation layer * Copyright (c) 2011 Isomorphic Software, Inc. * * OWNERSHIP NOTICE * Isomorphic Software owns and reserves all rights not expressly granted in this source code, * including all intellectual property rights to the structure, sequence, and format of this code * and to all designs, interfaces, algorithms, schema, protocols, and inventions expressed herein. * * If you have any questions, please email
. * * This entire comment must accompany any portion of Isomorphic Software source code that is * copied or moved from this file. */ package com.smartgwt.sample.showcase.client.messaging; import java.util.Date; import java.util.List; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.i18n.client.DateTimeFormat; import com.google.gwt.user.client.Timer; import com.smartgwt.client.data.DSCallback; import com.smartgwt.client.data.DSRequest; import com.smartgwt.client.data.DSResponse; import com.smartgwt.client.data.Record; import com.smartgwt.client.data.RecordList; import com.smartgwt.client.rpc.Messaging; import com.smartgwt.client.rpc.MessagingCallback; import com.smartgwt.client.rpc.RPCManager; import com.smartgwt.client.rpc.RPCRequest; import com.smartgwt.client.types.ChartType; import com.smartgwt.client.util.JSOHelper; import com.smartgwt.client.util.SC; import com.smartgwt.client.widgets.Button; import com.smartgwt.client.widgets.Canvas; import com.smartgwt.client.widgets.chart.FacetChart; import com.smartgwt.client.widgets.cube.Facet; import com.smartgwt.client.widgets.events.ClickEvent; import com.smartgwt.client.widgets.events.ClickHandler; import com.smartgwt.client.widgets.layout.VLayout; import com.google.gwt.core.client.EntryPoint; public class StockChartSample implements EntryPoint { RecordList initialData; RecordList lastValues; RecordList chartData; FacetChart chart; @Override public void onModuleLoad() { final long startParameter = System.currentTimeMillis(); VLayout contentLayout = new VLayout(); contentLayout.setMembersMargin(10); contentLayout.setPadding(10); final Button generateUpdatesButton = new Button("Generate more updates"); generateUpdatesButton.setWidth(200); generateUpdatesButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { generateUpdates(startParameter, generateUpdatesButton); } }); contentLayout.addMember(generateUpdatesButton); chart = new FacetChart(); chart.setFacets(new Facet("lastUpdated", "lastUpdated"), new Facet("name", "Name")); chart.setValueProperty("lastValue"); chart.setChartType(ChartType.AREA); chart.setTitle("Portfolio Value"); chart.setMinHeight(400); contentLayout.addMember(chart); // receive messages from the stockQuotes channel and update data grid Messaging.subscribe("stockQuotes" + startParameter, new MessagingCallback() { @Override public void execute(Object data) { updateStockChart(data); } }); StockQuotesDS.getInstance().fetchData(null, new DSCallback() { public void execute(DSResponse response, Object data, DSRequest request) { initialData = new RecordList(response.getData()); lastValues = new RecordList(initialData.duplicate()); chartData = new RecordList(initialData.duplicate()); String currentDate = dateFormatter.format(new Date()); for (int i=0; i
> stockData = (List
>) JSOHelper.convertToJava((JavaScriptObject) data); String currentDate = dateFormatter.format(new Date()); RecordList newChartData = new RecordList(chartData.duplicate()); for (List> recordData : stockData) { float change = ((Number) recordData.get(1)).floatValue(); Integer id = (Integer) recordData.get(0); Record record = initialData.find("id",id); String name = record.getAttributeAsString("name"); int lastValueRecordIndex = lastValues.findIndex("name",name); Record lastValueRecord = lastValues.get(lastValueRecordIndex); float lastValue = lastValueRecord.getAttributeAsFloat("lastValue").floatValue(); lastValue *= 1.0 + 20.0*0.01*change; Record newRecord = new Record(); newRecord.setAttribute("lastValue", lastValue); newRecord.setAttribute("lastUpdated", currentDate); newRecord.setAttribute("name", name); lastValues.set(lastValueRecordIndex,newRecord); } newChartData.addList(lastValues.toArray()); int recordsToRemove = newChartData.getLength() - 20*lastValues.getLength(); if (recordsToRemove>0) { newChartData.removeList(newChartData.getRange(0,recordsToRemove)); } chart.setData(newChartData); chartData = newChartData; } private void generateUpdates(final long startParameter, final Button generateUpdatesButton) { generateUpdatesButton.disable(); RPCRequest request = new RPCRequest(); // we tells servlet which channel it should use for sending data request.setActionURL("examples/StockQuotes/generate?sp=" + startParameter); RPCManager.sendRequest(request); // block button repeat click for 90 seconds - time while servlet // will sends data to us new Timer() { public void run() { generateUpdatesButton.enable(); } }.schedule(90000); } }