aboutsummaryrefslogtreecommitdiffstats
path: root/client/src
diff options
context:
space:
mode:
authorHenrik Paul <henrik@vaadin.com>2015-03-09 14:31:37 +0200
committerHenrik Paul <henrik@vaadin.com>2015-03-17 12:59:05 +0200
commit84c143dd76ed1d27d03c0d695e7218b477d008fe (patch)
tree1070f41763d46572af72eb230f18c9d3ce610b48 /client/src
parentf61cf666f3d28ac57b6c3cd5de30d9b54814d683 (diff)
downloadvaadin-framework-84c143dd76ed1d27d03c0d695e7218b477d008fe.tar.gz
vaadin-framework-84c143dd76ed1d27d03c0d695e7218b477d008fe.zip
Server side Grid can open details on the client side (#16644)
Change-Id: Ibff5a83b3a09c7c530926dadae9138ba3823f27a
Diffstat (limited to 'client/src')
-rw-r--r--client/src/com/vaadin/client/connectors/GridConnector.java26
-rw-r--r--client/src/com/vaadin/client/connectors/RpcDataSourceConnector.java53
-rw-r--r--client/src/com/vaadin/client/widget/grid/DetailsGenerator.java1
-rw-r--r--client/src/com/vaadin/client/widgets/Grid.java7
4 files changed, 81 insertions, 6 deletions
diff --git a/client/src/com/vaadin/client/connectors/GridConnector.java b/client/src/com/vaadin/client/connectors/GridConnector.java
index 55f07ecf85..f476982c15 100644
--- a/client/src/com/vaadin/client/connectors/GridConnector.java
+++ b/client/src/com/vaadin/client/connectors/GridConnector.java
@@ -31,6 +31,7 @@ import java.util.logging.Logger;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.core.client.Scheduler.ScheduledCommand;
import com.google.gwt.dom.client.NativeEvent;
+import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Widget;
import com.vaadin.client.ComponentConnector;
import com.vaadin.client.ConnectorHierarchyChangeEvent;
@@ -45,6 +46,7 @@ import com.vaadin.client.ui.AbstractHasComponentsConnector;
import com.vaadin.client.ui.SimpleManagedLayout;
import com.vaadin.client.widget.grid.CellReference;
import com.vaadin.client.widget.grid.CellStyleGenerator;
+import com.vaadin.client.widget.grid.DetailsGenerator;
import com.vaadin.client.widget.grid.EditorHandler;
import com.vaadin.client.widget.grid.RowReference;
import com.vaadin.client.widget.grid.RowStyleGenerator;
@@ -101,7 +103,7 @@ import elemental.json.JsonValue;
*/
@Connect(com.vaadin.ui.Grid.class)
public class GridConnector extends AbstractHasComponentsConnector implements
- SimpleManagedLayout {
+ SimpleManagedLayout, RpcDataSourceConnector.DetailsListener {
private static final class CustomCellStyleGenerator implements
CellStyleGenerator<JsonObject> {
@@ -360,6 +362,14 @@ public class GridConnector extends AbstractHasComponentsConnector implements
}
}
+ private class CustomDetailsGenerator implements DetailsGenerator {
+ @Override
+ public Widget getDetails(int rowIndex) {
+ // TODO
+ return new Label("[todo]");
+ }
+ }
+
/**
* Maps a generated column id to a grid column instance
*/
@@ -501,7 +511,11 @@ public class GridConnector extends AbstractHasComponentsConnector implements
});
getWidget().setEditorHandler(new CustomEditorHandler());
+
+ getWidget().setDetailsGenerator(new CustomDetailsGenerator());
+
getLayoutManager().registerDependency(this, getWidget().getElement());
+
layout();
}
@@ -994,4 +1008,14 @@ public class GridConnector extends AbstractHasComponentsConnector implements
public void layout() {
getWidget().onResize();
}
+
+ @Override
+ public void reapplyDetailsVisibility(int rowIndex, JsonObject row) {
+ if (row.hasKey(GridState.JSONKEY_DETAILS_VISIBLE)
+ && row.getBoolean(GridState.JSONKEY_DETAILS_VISIBLE)) {
+ getWidget().setDetailsVisible(rowIndex, true);
+ } else {
+ getWidget().setDetailsVisible(rowIndex, false);
+ }
+ }
}
diff --git a/client/src/com/vaadin/client/connectors/RpcDataSourceConnector.java b/client/src/com/vaadin/client/connectors/RpcDataSourceConnector.java
index f8d6ebcb62..ae4249de78 100644
--- a/client/src/com/vaadin/client/connectors/RpcDataSourceConnector.java
+++ b/client/src/com/vaadin/client/connectors/RpcDataSourceConnector.java
@@ -17,6 +17,7 @@
package com.vaadin.client.connectors;
import java.util.ArrayList;
+import java.util.List;
import com.vaadin.client.ServerConnector;
import com.vaadin.client.data.AbstractRemoteDataSource;
@@ -43,6 +44,28 @@ import elemental.json.JsonObject;
@Connect(com.vaadin.data.RpcDataProviderExtension.class)
public class RpcDataSourceConnector extends AbstractExtensionConnector {
+ /**
+ * A callback interface to let {@link GridConnector} know that detail
+ * visibilities might have changed.
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+ interface DetailsListener {
+
+ /**
+ * A request to verify (and correct) the visibility for a row, given
+ * updated metadata.
+ *
+ * @param rowIndex
+ * the index of the row that should be checked
+ * @param row
+ * the row object to check visibility for
+ * @see GridState#JSONKEY_DETAILS_VISIBLE
+ */
+ void reapplyDetailsVisibility(int rowIndex, JsonObject row);
+ }
+
public class RpcDataSource extends AbstractRemoteDataSource<JsonObject> {
protected RpcDataSource() {
@@ -56,27 +79,28 @@ public class RpcDataSourceConnector extends AbstractExtensionConnector {
rows.add(rowObject);
}
- dataSource.setRowData(firstRow, rows);
+ RpcDataSource.this.setRowData(firstRow, rows);
}
@Override
public void removeRowData(int firstRow, int count) {
- dataSource.removeRowData(firstRow, count);
+ RpcDataSource.this.removeRowData(firstRow, count);
}
@Override
public void insertRowData(int firstRow, int count) {
- dataSource.insertRowData(firstRow, count);
+ RpcDataSource.this.insertRowData(firstRow, count);
}
@Override
public void resetDataAndSize(int size) {
- dataSource.resetDataAndSize(size);
+ RpcDataSource.this.resetDataAndSize(size);
}
});
}
private DataRequestRpc rpcProxy = getRpcProxy(DataRequestRpc.class);
+ private DetailsListener detailsListener;
@Override
protected void requestRows(int firstRowIndex, int numberOfRows,
@@ -170,7 +194,24 @@ public class RpcDataSourceConnector extends AbstractExtensionConnector {
if (!handle.isPinned()) {
rpcProxy.setPinned(key, false);
}
+ }
+
+ void setDetailsListener(DetailsListener detailsListener) {
+ this.detailsListener = detailsListener;
+ }
+ @Override
+ protected void setRowData(int firstRowIndex, List<JsonObject> rowData) {
+ super.setRowData(firstRowIndex, rowData);
+
+ /*
+ * Intercepting details information from the data source, rerouting
+ * them back to the GridConnector (as a details listener)
+ */
+ for (int i = 0; i < rowData.size(); i++) {
+ detailsListener.reapplyDetailsVisibility(firstRowIndex + i,
+ rowData.get(i));
+ }
}
}
@@ -178,6 +219,8 @@ public class RpcDataSourceConnector extends AbstractExtensionConnector {
@Override
protected void extend(ServerConnector target) {
- ((GridConnector) target).setDataSource(dataSource);
+ GridConnector gridConnector = (GridConnector) target;
+ dataSource.setDetailsListener(gridConnector);
+ gridConnector.setDataSource(dataSource);
}
}
diff --git a/client/src/com/vaadin/client/widget/grid/DetailsGenerator.java b/client/src/com/vaadin/client/widget/grid/DetailsGenerator.java
index 264aa4e614..309e3f1ea3 100644
--- a/client/src/com/vaadin/client/widget/grid/DetailsGenerator.java
+++ b/client/src/com/vaadin/client/widget/grid/DetailsGenerator.java
@@ -25,6 +25,7 @@ import com.google.gwt.user.client.ui.Widget;
*/
public interface DetailsGenerator {
+ /** A details generator that provides no details */
public static final DetailsGenerator NULL = new DetailsGenerator() {
@Override
public Widget getDetails(int rowIndex) {
diff --git a/client/src/com/vaadin/client/widgets/Grid.java b/client/src/com/vaadin/client/widgets/Grid.java
index b3906591c0..f4aaf798b7 100644
--- a/client/src/com/vaadin/client/widgets/Grid.java
+++ b/client/src/com/vaadin/client/widgets/Grid.java
@@ -6326,10 +6326,17 @@ public class Grid<T> extends ResizeComposite implements
* @since
* @param detailsGenerator
* the details generator to set
+ * @throws IllegalArgumentException
+ * if detailsGenerator is <code>null</code>;
*/
public void setDetailsGenerator(DetailsGenerator detailsGenerator)
throws IllegalArgumentException {
+ if (detailsGenerator == null) {
+ throw new IllegalArgumentException(
+ "Details generator may not be null");
+ }
+
this.detailsGenerator = detailsGenerator;
// this will refresh all visible spacers