diff options
author | Teemu Suo-Anttila <teemusa@vaadin.com> | 2015-01-13 12:24:54 +0200 |
---|---|---|
committer | Johannes Dahlström <johannesd@vaadin.com> | 2015-01-13 15:56:23 +0000 |
commit | 603122ef7b866afd7f8353eead5922435b2658db (patch) | |
tree | 3648ff1b23694800638b5aea6a3d80e288804913 /client/src | |
parent | bb2e6035d2297025fb55f88911d435747eab3819 (diff) | |
download | vaadin-framework-603122ef7b866afd7f8353eead5922435b2658db.tar.gz vaadin-framework-603122ef7b866afd7f8353eead5922435b2658db.zip |
Fix Grid handling state changes and RPC calls deferred (#16188)
Some column changes in Grid were not correctly handled by the
RpcDataProviderExtension. These cases are now correctly handled.
Change-Id: I966b1c71d26e77e30e7dd84f26ab9704bd4f1f0f
Diffstat (limited to 'client/src')
-rw-r--r-- | client/src/com/vaadin/client/connectors/GridConnector.java | 113 |
1 files changed, 37 insertions, 76 deletions
diff --git a/client/src/com/vaadin/client/connectors/GridConnector.java b/client/src/com/vaadin/client/connectors/GridConnector.java index 450df31b36..593a8c8574 100644 --- a/client/src/com/vaadin/client/connectors/GridConnector.java +++ b/client/src/com/vaadin/client/connectors/GridConnector.java @@ -27,8 +27,6 @@ import java.util.Map; import java.util.Set; import java.util.logging.Logger; -import com.google.gwt.core.client.Scheduler; -import com.google.gwt.core.client.Scheduler.ScheduledCommand; import com.google.gwt.user.client.ui.Widget; import com.vaadin.client.ComponentConnector; import com.vaadin.client.ConnectorHierarchyChangeEvent; @@ -160,12 +158,13 @@ public class GridConnector extends AbstractHasComponentsConnector implements public Object getValue(final JsonObject obj) { final JsonObject rowData = obj.getObject(GridState.JSONKEY_DATA); - assert rowData.hasKey(id) : "Could not find data for column with id " - + id; + if (rowData.hasKey(id)) { + final JsonValue columnValue = rowData.get(id); - final JsonValue columnValue = rowData.get(id); + return rendererConnector.decode(columnValue); + } - return rendererConnector.decode(columnValue); + return null; } /* @@ -202,19 +201,8 @@ public class GridConnector extends AbstractHasComponentsConnector implements @Override public void bind(final int rowIndex) { - /* - * Because most shared state handling is deferred, we must - * defer this too to ensure the editorConnector references - * in shared state are up to date before opening the editor. - * Yes, this is a hack on top of a hack. - */ - Scheduler.get().scheduleDeferred(new ScheduledCommand() { - @Override - public void execute() { - serverInitiated = true; - GridConnector.this.getWidget().editRow(rowIndex); - } - }); + serverInitiated = true; + GridConnector.this.getWidget().editRow(rowIndex); } @Override @@ -225,15 +213,8 @@ public class GridConnector extends AbstractHasComponentsConnector implements @Override public void confirmBind() { - /* - * See comment in bind() - */ - Scheduler.get().scheduleDeferred(new ScheduledCommand() { - @Override - public void execute() { - endRequest(); - } - }); + endRequest(); + } @Override @@ -447,62 +428,42 @@ public class GridConnector extends AbstractHasComponentsConnector implements updateSelectionFromState(); } - /* - * The operations in here have been made deferred. - * - * The row data needed to react to column changes comes in the RPC - * calls. Since state is always updated before RPCs are called, we need - * to be sure that RPC is called before Grid reacts to state changes. - * - * Note that there are still some methods annotated with @OnStateChange - * that aren't deferred. That's okay, though. - */ - - Scheduler.get().scheduleDeferred(new ScheduledCommand() { - @Override - public void execute() { - // Column updates - if (stateChangeEvent.hasPropertyChanged("columns")) { - - // Remove old columns - purgeRemovedColumns(); - - // Add new columns - for (GridColumnState state : getState().columns) { - if (!columnIdToColumn.containsKey(state.id)) { - addColumnFromStateChangeEvent(state); - } - updateColumnFromState(columnIdToColumn.get(state.id), - state); - } - } + // Column updates + if (stateChangeEvent.hasPropertyChanged("columns")) { - if (stateChangeEvent.hasPropertyChanged("columnOrder")) { - if (orderNeedsUpdate(getState().columnOrder)) { - updateColumnOrderFromState(getState().columnOrder); - } - } + // Remove old columns + purgeRemovedColumns(); - if (stateChangeEvent.hasPropertyChanged("header")) { - updateHeaderFromState(getState().header); + // Add new columns + for (GridColumnState state : getState().columns) { + if (!columnIdToColumn.containsKey(state.id)) { + addColumnFromStateChangeEvent(state); } + updateColumnFromState(columnIdToColumn.get(state.id), state); + } + } - if (stateChangeEvent.hasPropertyChanged("footer")) { - updateFooterFromState(getState().footer); - } + if (stateChangeEvent.hasPropertyChanged("columnOrder")) { + if (orderNeedsUpdate(getState().columnOrder)) { + updateColumnOrderFromState(getState().columnOrder); + } + } - if (stateChangeEvent.hasPropertyChanged("editorEnabled")) { - getWidget().setEditorEnabled(getState().editorEnabled); - } + if (stateChangeEvent.hasPropertyChanged("header")) { + updateHeaderFromState(getState().header); + } - if (stateChangeEvent.hasPropertyChanged("frozenColumnCount")) { - getWidget().setFrozenColumnCount( - getState().frozenColumnCount); - } + if (stateChangeEvent.hasPropertyChanged("footer")) { + updateFooterFromState(getState().footer); + } - } - }); + if (stateChangeEvent.hasPropertyChanged("editorEnabled")) { + getWidget().setEditorEnabled(getState().editorEnabled); + } + if (stateChangeEvent.hasPropertyChanged("frozenColumnCount")) { + getWidget().setFrozenColumnCount(getState().frozenColumnCount); + } } private void updateColumnOrderFromState(List<String> stateColumnOrder) { |