diff options
author | Johannes Dahlström <johannesd@vaadin.com> | 2014-10-07 16:04:00 +0300 |
---|---|---|
committer | Vaadin Code Review <review@vaadin.com> | 2014-10-09 11:10:23 +0000 |
commit | a33644f29ec3a31dd7046d53306ede4bb20768cc (patch) | |
tree | ef9bb9748f2d2cb35aadd058c90d7e3bd36f9831 | |
parent | 3b92952939df832a3fbbaa7e3354355bed8e0881 (diff) | |
download | vaadin-framework-a33644f29ec3a31dd7046d53306ede4bb20768cc.tar.gz vaadin-framework-a33644f29ec3a31dd7046d53306ede4bb20768cc.zip |
Implement ImageRenderer (#13334)
Change-Id: I5b04f10f5d8b312ace8a3b5f1df28f37aa8b97d8
6 files changed, 246 insertions, 0 deletions
diff --git a/client/src/com/vaadin/client/ui/grid/renderers/ImageRenderer.java b/client/src/com/vaadin/client/ui/grid/renderers/ImageRenderer.java new file mode 100644 index 0000000000..3d8faf44d8 --- /dev/null +++ b/client/src/com/vaadin/client/ui/grid/renderers/ImageRenderer.java @@ -0,0 +1,39 @@ +/* + * 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.client.ui.grid.renderers; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.ui.Image; +import com.vaadin.client.ui.grid.FlyweightCell; + +/** + * A renderer that renders an image into a cell. + * + * @since + * @author Vaadin Ltd + */ +public class ImageRenderer extends WidgetRenderer<String, Image> { + + @Override + public Image createWidget() { + return GWT.create(Image.class); + } + + @Override + public void render(FlyweightCell cell, String url, Image image) { + image.setUrl(url); + } +} diff --git a/client/src/com/vaadin/client/ui/grid/renderers/ImageRendererConnector.java b/client/src/com/vaadin/client/ui/grid/renderers/ImageRendererConnector.java new file mode 100644 index 0000000000..1e33ccfa52 --- /dev/null +++ b/client/src/com/vaadin/client/ui/grid/renderers/ImageRendererConnector.java @@ -0,0 +1,44 @@ +/* + * 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.client.ui.grid.renderers; + +import com.google.gwt.json.client.JSONValue; +import com.vaadin.client.communication.JsonDecoder; +import com.vaadin.client.metadata.TypeDataStore; +import com.vaadin.shared.communication.URLReference; +import com.vaadin.shared.ui.Connect; + +/** + * A connector for {@link ImageRenderer}. + * + * @since + * @author Vaadin Ltd + */ +@Connect(com.vaadin.ui.components.grid.renderers.ImageRenderer.class) +public class ImageRendererConnector extends AbstractRendererConnector<String> { + + @Override + public ImageRenderer getRenderer() { + return (ImageRenderer) super.getRenderer(); + } + + @Override + public String decode(JSONValue value) { + return ((URLReference) JsonDecoder.decodeValue( + TypeDataStore.getType(URLReference.class), value, null, + getConnection())).getURL(); + } +} diff --git a/server/src/com/vaadin/ui/components/grid/renderers/ImageRenderer.java b/server/src/com/vaadin/ui/components/grid/renderers/ImageRenderer.java new file mode 100644 index 0000000000..b7134aab01 --- /dev/null +++ b/server/src/com/vaadin/ui/components/grid/renderers/ImageRenderer.java @@ -0,0 +1,57 @@ +/* + * 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.ui.components.grid.renderers; + +import com.vaadin.server.ExternalResource; +import com.vaadin.server.Resource; +import com.vaadin.server.ResourceReference; +import com.vaadin.server.ThemeResource; +import com.vaadin.shared.communication.URLReference; +import com.vaadin.ui.components.grid.AbstractRenderer; + +import elemental.json.JsonValue; + +/** + * A renderer for presenting images. + * <p> + * The image for each rendered cell is read from a Resource-typed property in + * the data source. Only {@link ExternalResource}s and {@link ThemeResource}s + * are currently supported. + * + * @since + * @author Vaadin Ltd + */ +public class ImageRenderer extends AbstractRenderer<Resource> { + + /** + * Creates a new image renderer. + */ + public ImageRenderer() { + super(Resource.class); + } + + @Override + public JsonValue encode(Resource resource) { + if (!(resource instanceof ExternalResource || resource instanceof ThemeResource)) { + throw new IllegalArgumentException( + "ImageRenderer only supports ExternalResource and ThemeResource (" + + resource.getClass().getSimpleName() + "given )"); + } + + return encode(ResourceReference.create(resource, this, null), + URLReference.class); + } +} diff --git a/server/tests/src/com/vaadin/tests/server/component/grid/ImageRendererTest.java b/server/tests/src/com/vaadin/tests/server/component/grid/ImageRendererTest.java new file mode 100644 index 0000000000..47a4c0337b --- /dev/null +++ b/server/tests/src/com/vaadin/tests/server/component/grid/ImageRendererTest.java @@ -0,0 +1,85 @@ +/* + * 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.assertEquals; + +import java.io.File; + +import org.easymock.EasyMock; +import org.junit.Before; +import org.junit.Test; + +import com.vaadin.server.ClassResource; +import com.vaadin.server.ExternalResource; +import com.vaadin.server.FileResource; +import com.vaadin.server.FontAwesome; +import com.vaadin.server.ThemeResource; +import com.vaadin.ui.UI; +import com.vaadin.ui.components.grid.Grid; +import com.vaadin.ui.components.grid.renderers.ImageRenderer; + +import elemental.json.JsonObject; +import elemental.json.JsonValue; + +public class ImageRendererTest { + + private ImageRenderer renderer; + + @Before + public void setUp() { + UI mockUI = EasyMock.createNiceMock(UI.class); + EasyMock.replay(mockUI); + + Grid grid = new Grid(); + grid.setParent(mockUI); + + renderer = new ImageRenderer(); + renderer.setParent(grid); + } + + @Test + public void testThemeResource() { + JsonValue v = renderer.encode(new ThemeResource("foo.png")); + assertEquals("theme://foo.png", getUrl(v)); + } + + @Test + public void testExternalResource() { + JsonValue v = renderer.encode(new ExternalResource( + "http://example.com/foo.png")); + assertEquals("http://example.com/foo.png", getUrl(v)); + } + + @Test(expected = IllegalArgumentException.class) + public void testFileResource() { + renderer.encode(new FileResource(new File("/tmp/foo.png"))); + } + + @Test(expected = IllegalArgumentException.class) + public void testClassResource() { + renderer.encode(new ClassResource("img/foo.png")); + } + + @Test(expected = IllegalArgumentException.class) + public void testFontIcon() { + renderer.encode(FontAwesome.AMBULANCE); + } + + private String getUrl(JsonValue v) { + return ((JsonObject) v).get("uRL").asString(); + } +} diff --git a/uitest/src/com/vaadin/tests/components/grid/WidgetRenderers.java b/uitest/src/com/vaadin/tests/components/grid/WidgetRenderers.java index 6fe1e9fcc7..534b8a9e4d 100644 --- a/uitest/src/com/vaadin/tests/components/grid/WidgetRenderers.java +++ b/uitest/src/com/vaadin/tests/components/grid/WidgetRenderers.java @@ -17,6 +17,8 @@ package com.vaadin.tests.components.grid; import com.vaadin.data.Item; import com.vaadin.data.util.IndexedContainer; +import com.vaadin.server.Resource; +import com.vaadin.server.ThemeResource; import com.vaadin.server.VaadinRequest; import com.vaadin.tests.components.AbstractTestUI; import com.vaadin.ui.components.grid.Grid; @@ -24,6 +26,7 @@ import com.vaadin.ui.components.grid.Grid.SelectionMode; import com.vaadin.ui.components.grid.renderers.ButtonRenderer; import com.vaadin.ui.components.grid.renderers.ButtonRenderer.RendererClickEvent; import com.vaadin.ui.components.grid.renderers.ButtonRenderer.RendererClickListener; +import com.vaadin.ui.components.grid.renderers.ImageRenderer; import com.vaadin.ui.components.grid.renderers.ProgressBarRenderer; public class WidgetRenderers extends AbstractTestUI { @@ -36,13 +39,18 @@ public class WidgetRenderers extends AbstractTestUI { null); container .addContainerProperty(ButtonRenderer.class, String.class, null); + container.addContainerProperty(ImageRenderer.class, Resource.class, + null); final Item item = container.getItem(container.addItem()); item.getItemProperty(ProgressBarRenderer.class).setValue(0.3); item.getItemProperty(ButtonRenderer.class).setValue("Click"); + item.getItemProperty(ImageRenderer.class).setValue( + new ThemeResource("window/img/resize.png")); Grid grid = new Grid(container); + grid.setId("test-grid"); grid.setSelectionMode(SelectionMode.NONE); @@ -58,6 +66,8 @@ public class WidgetRenderers extends AbstractTestUI { } })); + grid.getColumn(ImageRenderer.class).setRenderer(new ImageRenderer()); + addComponent(grid); } diff --git a/uitest/src/com/vaadin/tests/components/grid/WidgetRenderersTest.java b/uitest/src/com/vaadin/tests/components/grid/WidgetRenderersTest.java index 9ca45a6178..d18494d277 100644 --- a/uitest/src/com/vaadin/tests/components/grid/WidgetRenderersTest.java +++ b/uitest/src/com/vaadin/tests/components/grid/WidgetRenderersTest.java @@ -53,6 +53,17 @@ public class WidgetRenderersTest extends MultiBrowserTest { assertEquals("Clicked!", button.getText()); } + @Test + public void testImageRenderer() { + openTestURL(); + + WebElement image = getGridCell(0, 2).findElement( + By.className("gwt-Image")); + + assertTrue(image.getAttribute("src").endsWith("window/img/resize.png")); + + } + GridCellElement getGridCell(int row, int col) { return $(GridElement.class).first().getCell(row, col); } |