Hilites do not match gird data
All I want to do is color the entire row, based on one field.
I reworked your Simulated Stock Quotes Example in the EE showcase to use hilites.
First a button to launch a window
Click the button -> launch window 0 -> The servlet turns on updates for the next 90 seconds -> the updates go into the datasource -> the data updates -> the hilites update.
wait for the updates to end.
Click the button -> launch window 1 -> The servlet turns on updates for the next 90 seconds -> the updates go into the datasource -> the data updates -> the hilites update in all windows ( in window 1 they are correct. Window 0 they are not.)
wait for the updates to end.
Click the button -> launch window 2 -> The servlet turns on updates for the next 90 seconds -> the updates go into the datasource -> the data updates -> the hilites update in all windows ( in window 2 they are correct. Window 0 and window 1, they are not. )
The end state of the hilites for windows 0 and 1, is normally wrong (green rows with negitive change values, or red rows with positive), and windoww 1 doesn't match window 0.
The latest window, the hilite state is correct.
1. SmartClient Version: v9.1p_2014-12-12/PowerEdition Deployment (built 2014-12-12)
2. FF 33.1.1
Chrome 39.0.2171.95m
3. - 5. n/a
6. see above
All I want to do is color the entire row, based on one field.
I reworked your Simulated Stock Quotes Example in the EE showcase to use hilites.
First a button to launch a window
Code:
IButton button = new IButton("launch window"); button.addClickHandler(new ClickHandler() { int count = 1; @Override public void onClick(ClickEvent clickEvent) { new GuiWidgetLab("window" + count++).show(); } });
wait for the updates to end.
Click the button -> launch window 1 -> The servlet turns on updates for the next 90 seconds -> the updates go into the datasource -> the data updates -> the hilites update in all windows ( in window 1 they are correct. Window 0 they are not.)
wait for the updates to end.
Click the button -> launch window 2 -> The servlet turns on updates for the next 90 seconds -> the updates go into the datasource -> the data updates -> the hilites update in all windows ( in window 2 they are correct. Window 0 and window 1, they are not. )
The end state of the hilites for windows 0 and 1, is normally wrong (green rows with negitive change values, or red rows with positive), and windoww 1 doesn't match window 0.
The latest window, the hilite state is correct.
Code:
/* * 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 <sourcecode@isomorphic.com>. * * This entire comment must accompany any portion of Isomorphic Software source code that is * copied or moved from this file. */ import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.user.client.Timer; import com.smartgwt.client.data.*; 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.DSOperationType; import com.smartgwt.client.types.OperatorId; import com.smartgwt.client.util.JSOHelper; import com.smartgwt.client.widgets.Button; import com.smartgwt.client.widgets.Window; import com.smartgwt.client.widgets.events.ClickEvent; import com.smartgwt.client.widgets.events.ClickHandler; import com.smartgwt.client.widgets.grid.ListGrid; import com.smartgwt.client.widgets.grid.ListGridField; import java.util.ArrayList; import java.util.Date; import java.util.List; public class GuiWidgetLab extends Window { private ListGrid stockQuotesGrid; public GuiWidgetLab(String title) { super(); setTitle(title); setWidth("50%"); setHeight("50%"); final long startParameter = System.currentTimeMillis(); // Grid and button below it setMembersMargin(10); setPadding(10); stockQuotesGrid = new ListGrid(); stockQuotesGrid.setWidth(600); stockQuotesGrid.setHeight(300); stockQuotesGrid.setShowAllRecords(true); stockQuotesGrid.setDataSource(StockQuotesDS.getInstance()); stockQuotesGrid.setAutoFetchData(true); stockQuotesGrid.enableHiliting(); stockQuotesGrid.setCanEditHilites(false); stockQuotesGrid.setIncludeHilitesInSummaryFields(true); List<ListGridField> fieldList = new ArrayList<>(StockQuotesDS.getInstance().getFields().length); fieldList.add(new ListGridField("id")); fieldList.add(new ListGridField("name")); fieldList.add(new ListGridField("symbol")); fieldList.add(new ListGridField("lastValue")); fieldList.add(new ListGridField("changeValue")); fieldList.add(new ListGridField("openValue")); fieldList.add(new ListGridField("dayHighValue")); fieldList.add(new ListGridField("dayLowValue")); ListGridField lastUpdatedField = new ListGridField("lastUpdated"); lastUpdatedField.setHidden(true); fieldList.add(lastUpdatedField); ListGridField[] fields = fieldList.toArray(new ListGridField[fieldList.size()]); stockQuotesGrid.setFields(fields); stockQuotesGrid.setHilites(buildHilites(fields)); addItem(stockQuotesGrid); final Button generateUpdatesButton = new Button("Generate more updates"); generateUpdatesButton.setWidth(200); generateUpdatesButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { generateUpdates(startParameter, generateUpdatesButton); } }); addItem(generateUpdatesButton); // receive messages from the stockQuotes channel and update data grid Messaging.subscribe("stockQuotes" + startParameter, new MessagingCallback() { @Override public void execute(Object data) { updateStockQuotes(data); } }); generateUpdates(startParameter, generateUpdatesButton); } /** * We get id and changeValue only from server - combine it with the record * in the grid to get the rest of the fields * * @param data */ @SuppressWarnings("unchecked") private void updateStockQuotes(Object data) { List<List<?>> stockData = (List<List<?>>) JSOHelper .convertToJava((JavaScriptObject) data); List<Record> newStockData = new ArrayList<Record>(); // prepare data for grid manually using received data from servlet // we receive only 'id' and 'change percent' data here for (List<?> recordData : stockData) { float change = ((Number) recordData.get(1)).floatValue(); if (change != 0) { final Integer id = (Integer) recordData.get(0); Record record = stockQuotesGrid.getDataAsRecordList().find("id", id); float lastValue = record.getAttributeAsFloat("lastValue"); float newChangeValue = change * lastValue / 100; float newLastValue = newChangeValue + lastValue; record.setAttribute("changeValue", newChangeValue); record.setAttribute("lastValue", newLastValue); record.setAttribute("dayHighValue", Math.max(record.getAttributeAsFloat("dayHighValue"), newLastValue)); record.setAttribute("dayLowValue", Math.min(record.getAttributeAsFloat("dayLowValue"), newLastValue)); record.setAttribute("lastUpdated", new Date()); newStockData.add(record); new Timer() { @Override public void run() { Record record = stockQuotesGrid.getDataAsRecordList().find("id", id); if(record.getAttribute("lastUpdated") != null) { Date lastUpdated = record.getAttributeAsDate("lastUpdated"); long delta = System.currentTimeMillis() - lastUpdated.getTime(); if(delta >= blinkPeriod) { record.setAttribute("lastUpdated", (Date) null); } DSResponse dsResponse = new DSResponse(); Record[] toUpdate = new Record[] {record}; dsResponse.setData(toUpdate); DSRequest dsRequest = new DSRequest(); dsRequest.setOperationType(DSOperationType.UPDATE); // broadcast the change - the grid will notice this automatically (and so would other // components showing the same record) StockQuotesDS.getInstance().updateCaches(dsResponse, dsRequest); } } }.schedule(blinkPeriod); } } DSResponse dsResponse = new DSResponse(); dsResponse.setData((Record[]) newStockData.toArray(new Record[newStockData.size()])); DSRequest dsRequest = new DSRequest(); dsRequest.setOperationType(DSOperationType.UPDATE); // broadcast the change - the grid will notice this automatically (and so would other // components showing the same record) StockQuotesDS.getInstance().updateCaches(dsResponse, dsRequest); } private int blinkPeriod = 2000; 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 send data to us new Timer() { public void run() { generateUpdatesButton.enable(); } }.schedule(90000); } public static Hilite[] buildHilites(ListGridField... fields) { String [] names = new String[fields.length]; int i = 0; for(ListGridField field: fields) { names[i] = field.getName(); i++; } return buildHilites(names); } public static Hilite[] buildHilites(String... fields) { List<Hilite> lites= buildHilitesList(fields); return lites.toArray(new Hilite[lites.size()]); } public static List<Hilite> buildHilitesList(String... fields) { List<Hilite> lites= new ArrayList<>(); lites.add(buildHilite("#000000", "#FF0000", fields, new Criterion("changeValue", OperatorId.LESS_THAN, 0f) )); lites.add(buildHilite("#000000", "#00FF00", fields, new Criterion("changeValue", OperatorId.GREATER_THAN, 0f))); lites.add(buildHilite("#000000", "#FFFFFF", fields, new Criterion("changeValue", OperatorId.EQUALS, 0f))); lites.add(buildHiliteNull("#000000", "#FFFFFF", fields, "lastUpdated")); return lites; } public static Hilite buildHilite(String textColor, String bkgrndColor, String[] hiliteFields, Criterion ... criterions) { Hilite build = new Hilite(); build.setTextColor(textColor); build.setBackgroundColor(bkgrndColor); build.setFieldNames(hiliteFields); if(criterions == null || criterions.length <= 0 ) { return build; } AdvancedCriteria criteria = new AdvancedCriteria(OperatorId.OR, criterions); build.setCriteria(criteria); return build; } public static Hilite buildHiliteNull(String textColor, String bkgrndColor, String[] hiliteFields, String criteriaField) { Hilite build = new Hilite(); build.setTextColor(textColor); build.setBackgroundColor(bkgrndColor); build.setFieldNames(hiliteFields); List<Criterion> criterionList = new ArrayList<>(1); criterionList.add(new Criterion(criteriaField, OperatorId.IS_NULL )); AdvancedCriteria criteria = new AdvancedCriteria(OperatorId.OR, criterionList.toArray(new Criterion[criterionList.size()])); build.setCriteria(criteria); return build; } }
1. SmartClient Version: v9.1p_2014-12-12/PowerEdition Deployment (built 2014-12-12)
2. FF 33.1.1
Chrome 39.0.2171.95m
3. - 5. n/a
6. see above
Comment