From 90b6f7dcab2758b1f026af60a58982bc0cfaff22 Mon Sep 17 00:00:00 2001 From: Teemu Suo-Anttila Date: Tue, 26 May 2015 11:47:39 +0300 Subject: [PATCH] Split AbstractGridExtension from AbstractRenderer (#18003) Change-Id: Ibe5766cde606091ce2bd58055472fa7cf3f21374 --- server/src/com/vaadin/ui/Grid.java | 37 ++++++++-- .../component/grid/GridExtensionTest.java | 41 +++++++++++ .../grid/GridExtensionCommunication.java | 69 +++++++++++++++++++ .../grid/GridExtensionCommunicationTest.java | 45 ++++++++++++ .../grid/GridClickExtensionConnector.java | 67 ++++++++++++++++++ 5 files changed, 254 insertions(+), 5 deletions(-) create mode 100644 server/tests/src/com/vaadin/tests/server/component/grid/GridExtensionTest.java create mode 100644 uitest/src/com/vaadin/tests/components/grid/GridExtensionCommunication.java create mode 100644 uitest/src/com/vaadin/tests/components/grid/GridExtensionCommunicationTest.java create mode 100644 uitest/src/com/vaadin/tests/widgetset/client/grid/GridClickExtensionConnector.java diff --git a/server/src/com/vaadin/ui/Grid.java b/server/src/com/vaadin/ui/Grid.java index 902098e8d0..2c7e63ddf8 100644 --- a/server/src/com/vaadin/ui/Grid.java +++ b/server/src/com/vaadin/ui/Grid.java @@ -3274,15 +3274,15 @@ public class Grid extends AbstractComponent implements SelectionNotifier, /** * An abstract base class for server-side Grid renderers. * {@link com.vaadin.client.widget.grid.Renderer Grid renderers}. This class - * currently extends the AbstractExtension superclass, but this fact should - * be regarded as an implementation detail and subject to change in a future - * major or minor Vaadin revision. + * currently extends the AbstractGridExtension superclass, but this fact + * should be regarded as an implementation detail and subject to change in a + * future major or minor Vaadin revision. * * @param * the type this renderer knows how to present */ - public static abstract class AbstractRenderer extends AbstractExtension - implements Renderer { + public static abstract class AbstractRenderer extends + AbstractGridExtension implements Renderer { private final Class presentationType; @@ -3340,6 +3340,33 @@ public class Grid extends AbstractComponent implements SelectionNotifier, return JsonCodec.encode(value, null, type, getUI().getConnectorTracker()).getEncodedValue(); } + } + + /** + * An abstract base class for server-side Grid extensions. + * + * @since + */ + public static abstract class AbstractGridExtension extends + AbstractExtension { + + /** + * Constructs a new Grid extension. + */ + public AbstractGridExtension() { + super(); + } + + /** + * Constructs a new Grid extension and extends given Grid. + * + * @param grid + * a grid instance + */ + public AbstractGridExtension(Grid grid) { + super(); + extend(grid); + } /** * Gets the item id for a row key. diff --git a/server/tests/src/com/vaadin/tests/server/component/grid/GridExtensionTest.java b/server/tests/src/com/vaadin/tests/server/component/grid/GridExtensionTest.java new file mode 100644 index 0000000000..d9db217aa3 --- /dev/null +++ b/server/tests/src/com/vaadin/tests/server/component/grid/GridExtensionTest.java @@ -0,0 +1,41 @@ +/* + * Copyright 2000-2014 Vaadin Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package com.vaadin.tests.server.component.grid; + +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +import com.vaadin.ui.Grid; +import com.vaadin.ui.Grid.AbstractGridExtension; + +public class GridExtensionTest { + + public static class DummyGridExtension extends AbstractGridExtension { + + public DummyGridExtension(Grid grid) { + super(grid); + } + } + + @Test + public void testCreateExtension() { + Grid grid = new Grid(); + DummyGridExtension dummy = new DummyGridExtension(grid); + assertTrue("DummyGridExtension never made it to Grid", grid + .getExtensions().contains(dummy)); + } +} diff --git a/uitest/src/com/vaadin/tests/components/grid/GridExtensionCommunication.java b/uitest/src/com/vaadin/tests/components/grid/GridExtensionCommunication.java new file mode 100644 index 0000000000..181c9cae8d --- /dev/null +++ b/uitest/src/com/vaadin/tests/components/grid/GridExtensionCommunication.java @@ -0,0 +1,69 @@ +/* + * Copyright 2000-2014 Vaadin Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package com.vaadin.tests.components.grid; + +import com.vaadin.annotations.Widgetset; +import com.vaadin.data.Item; +import com.vaadin.server.VaadinRequest; +import com.vaadin.shared.MouseEventDetails; +import com.vaadin.tests.components.AbstractTestUIWithLog; +import com.vaadin.tests.widgetset.TestingWidgetSet; +import com.vaadin.tests.widgetset.client.grid.GridClickExtensionConnector.GridClickServerRpc; +import com.vaadin.ui.Grid; +import com.vaadin.ui.Grid.AbstractGridExtension; +import com.vaadin.ui.Grid.Column; +import com.vaadin.ui.Grid.SelectionMode; + +@Widgetset(TestingWidgetSet.NAME) +public class GridExtensionCommunication extends AbstractTestUIWithLog { + + public class GridClickExtension extends AbstractGridExtension { + + public GridClickExtension(Grid grid) { + super(grid); + registerRpc(new GridClickServerRpc() { + + @Override + public void click(String row, String column, + MouseEventDetails click) { + Object itemId = getItemId(row); + Column col = getColumn(column); + + Item person = getParentGrid().getContainerDataSource() + .getItem(itemId); + + log("Click on Person " + + person.getItemProperty("firstName").getValue() + + " " + + person.getItemProperty("lastName").getValue() + + " on column " + col.toString()); + log("MouseEventDetails: " + click.getButtonName() + " (" + + click.getClientX() + ", " + click.getClientY() + + ")"); + } + }); + } + } + + @Override + protected void setup(VaadinRequest request) { + Grid grid = new PersonTestGrid(50); + grid.setSelectionMode(SelectionMode.NONE); + new GridClickExtension(grid); + addComponent(grid); + } + +} diff --git a/uitest/src/com/vaadin/tests/components/grid/GridExtensionCommunicationTest.java b/uitest/src/com/vaadin/tests/components/grid/GridExtensionCommunicationTest.java new file mode 100644 index 0000000000..9fd35fe3e9 --- /dev/null +++ b/uitest/src/com/vaadin/tests/components/grid/GridExtensionCommunicationTest.java @@ -0,0 +1,45 @@ +/* + * Copyright 2000-2014 Vaadin Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package com.vaadin.tests.components.grid; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +import com.vaadin.testbench.elements.GridElement; +import com.vaadin.testbench.elements.GridElement.GridCellElement; +import com.vaadin.tests.tb3.SingleBrowserTest; + +public class GridExtensionCommunicationTest extends SingleBrowserTest { + + @Test + public void testMouseClickIsSentToExtension() { + openTestURL(); + + GridCellElement cell = $(GridElement.class).first().getCell(0, 4); + cell.click(5, 5); + + int expectedX = cell.getLocation().getX() + 5; + int expectedY = cell.getLocation().getY() + 5; + + assertEquals( + "1. Click on Person Nina Brown on column Column[propertyId:gender]", + getLogRow(1)); + assertEquals("2. MouseEventDetails: left (" + expectedX + ", " + + expectedY + ")", getLogRow(0)); + + } +} diff --git a/uitest/src/com/vaadin/tests/widgetset/client/grid/GridClickExtensionConnector.java b/uitest/src/com/vaadin/tests/widgetset/client/grid/GridClickExtensionConnector.java new file mode 100644 index 0000000000..64020683f6 --- /dev/null +++ b/uitest/src/com/vaadin/tests/widgetset/client/grid/GridClickExtensionConnector.java @@ -0,0 +1,67 @@ +/* + * Copyright 2000-2014 Vaadin Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package com.vaadin.tests.widgetset.client.grid; + +import com.vaadin.client.MouseEventDetailsBuilder; +import com.vaadin.client.ServerConnector; +import com.vaadin.client.connectors.GridConnector; +import com.vaadin.client.extensions.AbstractExtensionConnector; +import com.vaadin.client.widget.grid.CellReference; +import com.vaadin.client.widget.grid.events.BodyClickHandler; +import com.vaadin.client.widget.grid.events.GridClickEvent; +import com.vaadin.client.widgets.Grid; +import com.vaadin.shared.MouseEventDetails; +import com.vaadin.shared.communication.ServerRpc; +import com.vaadin.shared.ui.Connect; +import com.vaadin.tests.components.grid.GridExtensionCommunication.GridClickExtension; + +import elemental.json.JsonObject; + +@Connect(GridClickExtension.class) +public class GridClickExtensionConnector extends AbstractExtensionConnector { + public interface GridClickServerRpc extends ServerRpc { + + public void click(String row, String column, MouseEventDetails click); + } + + @Override + protected void extend(ServerConnector target) { + Grid grid = getParent().getWidget(); + grid.addBodyClickHandler(new BodyClickHandler() { + + @Override + public void onClick(GridClickEvent event) { + CellReference cellRef = event.getTargetCell(); + + // Gather needed information. + String rowKey = getParent().getRowKey( + (JsonObject) cellRef.getRow()); + String columnId = getParent().getColumnId(cellRef.getColumn()); + MouseEventDetails clickDetails = MouseEventDetailsBuilder + .buildMouseEventDetails(event.getNativeEvent()); + + getRpcProxy(GridClickServerRpc.class).click(rowKey, columnId, + clickDetails); + } + }); + } + + @Override + public GridConnector getParent() { + return (GridConnector) super.getParent(); + } + +} -- 2.39.5