summaryrefslogtreecommitdiffstats
path: root/client/src
diff options
context:
space:
mode:
authorTeemu Suo-Anttila <teemusa@vaadin.com>2015-01-13 12:24:54 +0200
committerJohannes Dahlström <johannesd@vaadin.com>2015-01-13 15:56:23 +0000
commit603122ef7b866afd7f8353eead5922435b2658db (patch)
tree3648ff1b23694800638b5aea6a3d80e288804913 /client/src
parentbb2e6035d2297025fb55f88911d435747eab3819 (diff)
downloadvaadin-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.java113
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) {