aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohannes Dahlström <johannesd@vaadin.com>2014-10-07 16:04:00 +0300
committerVaadin Code Review <review@vaadin.com>2014-10-09 11:10:23 +0000
commita33644f29ec3a31dd7046d53306ede4bb20768cc (patch)
treeef9bb9748f2d2cb35aadd058c90d7e3bd36f9831
parent3b92952939df832a3fbbaa7e3354355bed8e0881 (diff)
downloadvaadin-framework-a33644f29ec3a31dd7046d53306ede4bb20768cc.tar.gz
vaadin-framework-a33644f29ec3a31dd7046d53306ede4bb20768cc.zip
Implement ImageRenderer (#13334)
Change-Id: I5b04f10f5d8b312ace8a3b5f1df28f37aa8b97d8
-rw-r--r--client/src/com/vaadin/client/ui/grid/renderers/ImageRenderer.java39
-rw-r--r--client/src/com/vaadin/client/ui/grid/renderers/ImageRendererConnector.java44
-rw-r--r--server/src/com/vaadin/ui/components/grid/renderers/ImageRenderer.java57
-rw-r--r--server/tests/src/com/vaadin/tests/server/component/grid/ImageRendererTest.java85
-rw-r--r--uitest/src/com/vaadin/tests/components/grid/WidgetRenderers.java10
-rw-r--r--uitest/src/com/vaadin/tests/components/grid/WidgetRenderersTest.java11
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);
}