diff options
author | Johannes Dahlström <johannesd@vaadin.com> | 2014-11-05 15:56:58 +0200 |
---|---|---|
committer | Vaadin Code Review <review@vaadin.com> | 2014-11-13 14:21:09 +0000 |
commit | 1ac8b6bff007d997bf2cfc69954e69d8fa65e119 (patch) | |
tree | 58485a25a59988bbe54638bdf6c3944b3b0c46d1 /server | |
parent | effe4927119eed370bb7061300123877588c5432 (diff) | |
download | vaadin-framework-1ac8b6bff007d997bf2cfc69954e69d8fa65e119.tar.gz vaadin-framework-1ac8b6bff007d997bf2cfc69954e69d8fa65e119.zip |
Make ImageRenderers emit click events (#13334)
Change-Id: I1f98409e9787e1057ffaeebbe37427042a1e3233
Diffstat (limited to 'server')
3 files changed, 137 insertions, 90 deletions
diff --git a/server/src/com/vaadin/ui/components/grid/renderers/ButtonRenderer.java b/server/src/com/vaadin/ui/components/grid/renderers/ButtonRenderer.java index de63449f81..dece41c7ab 100644 --- a/server/src/com/vaadin/ui/components/grid/renderers/ButtonRenderer.java +++ b/server/src/com/vaadin/ui/components/grid/renderers/ButtonRenderer.java @@ -15,16 +15,6 @@ */ package com.vaadin.ui.components.grid.renderers; -import java.lang.reflect.Method; - -import com.vaadin.event.ConnectorEventListener; -import com.vaadin.event.MouseEvents.ClickEvent; -import com.vaadin.shared.MouseEventDetails; -import com.vaadin.shared.ui.grid.renderers.RendererClickRpc; -import com.vaadin.ui.components.grid.AbstractRenderer; -import com.vaadin.ui.components.grid.Grid; -import com.vaadin.util.ReflectTools; - /** * A Renderer that displays a button with a textual caption. The value of the * corresponding property is used as the caption. Click listeners can be added @@ -33,97 +23,23 @@ import com.vaadin.util.ReflectTools; * @since * @author Vaadin Ltd */ -public class ButtonRenderer extends AbstractRenderer<String> { - - /** - * An interface for listening to {@link RendererClickEvent renderer click - * events}. - * - * @see {@link ButtonRenderer#addClickListener(RendererClickListener)} - */ - public interface RendererClickListener extends ConnectorEventListener { - - static final Method CLICK_METHOD = ReflectTools.findMethod( - RendererClickListener.class, "click", RendererClickEvent.class); - - /** - * Called when a rendered button is clicked. - * - * @param event - * the event representing the click - */ - void click(RendererClickEvent event); - } - - /** - * An event fired when a button rendered by a ButtonRenderer is clicked. - */ - public static class RendererClickEvent extends ClickEvent { - - private Object itemId; - - protected RendererClickEvent(Grid source, Object itemId, - MouseEventDetails mouseEventDetails) { - super(source, mouseEventDetails); - this.itemId = itemId; - } - - /** - * Returns the item ID of the row where the click event originated. - * - * @return the item ID of the clicked row - */ - public Object getItemId() { - return itemId; - } - } +public class ButtonRenderer extends ClickableRenderer<String> { /** * Creates a new button renderer. */ public ButtonRenderer() { super(String.class); - registerRpc(new RendererClickRpc() { - @Override - public void click(int row, int column, - MouseEventDetails mouseDetails) { - - Grid grid = (Grid) getParent(); - - Object itemId = grid.getContainerDatasource().getIdByIndex(row); - - fireEvent(new RendererClickEvent(grid, itemId, mouseDetails)); - } - }); } /** * Creates a new button renderer and adds the given click listener to it. + * + * @param listener + * the click listener to register */ public ButtonRenderer(RendererClickListener listener) { this(); addClickListener(listener); } - - /** - * Adds a click listener to this button renderer. The listener is invoked - * every time one of the buttons rendered by this renderer is clicked. - * - * @param listener - * the click listener to be added - */ - public void addClickListener(RendererClickListener listener) { - addListener(RendererClickEvent.class, listener, - RendererClickListener.CLICK_METHOD); - } - - /** - * Removes the given click listener from this renderer. - * - * @param listener - * the click listener to be removed - */ - public void removeClickListener(RendererClickListener listener) { - removeListener(RendererClickEvent.class, listener); - } } diff --git a/server/src/com/vaadin/ui/components/grid/renderers/ClickableRenderer.java b/server/src/com/vaadin/ui/components/grid/renderers/ClickableRenderer.java new file mode 100644 index 0000000000..ec2ae7bf67 --- /dev/null +++ b/server/src/com/vaadin/ui/components/grid/renderers/ClickableRenderer.java @@ -0,0 +1,121 @@ +/* + * 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 java.lang.reflect.Method; + +import com.vaadin.event.ConnectorEventListener; +import com.vaadin.event.MouseEvents.ClickEvent; +import com.vaadin.shared.MouseEventDetails; +import com.vaadin.shared.ui.grid.renderers.RendererClickRpc; +import com.vaadin.ui.components.grid.AbstractRenderer; +import com.vaadin.ui.components.grid.Grid; +import com.vaadin.util.ReflectTools; + +/** + * An abstract superclass for Renderers that render clickable items. Click + * listeners can be added to a renderer to be notified when any of the rendered + * items is clicked. + * + * @param <T> + * the type presented by the renderer + * + * @since + * @author Vaadin Ltd + */ +public class ClickableRenderer<T> extends AbstractRenderer<T> { + + /** + * An interface for listening to {@link RendererClickEvent renderer click + * events}. + * + * @see {@link ButtonRenderer#addClickListener(RendererClickListener)} + */ + public interface RendererClickListener extends ConnectorEventListener { + + static final Method CLICK_METHOD = ReflectTools.findMethod( + RendererClickListener.class, "click", RendererClickEvent.class); + + /** + * Called when a rendered button is clicked. + * + * @param event + * the event representing the click + */ + void click(RendererClickEvent event); + } + + /** + * An event fired when a button rendered by a ButtonRenderer is clicked. + */ + public static class RendererClickEvent extends ClickEvent { + + private Object itemId; + + protected RendererClickEvent(Grid source, Object itemId, + MouseEventDetails mouseEventDetails) { + super(source, mouseEventDetails); + this.itemId = itemId; + } + + /** + * Returns the item ID of the row where the click event originated. + * + * @return the item ID of the clicked row + */ + public Object getItemId() { + return itemId; + } + } + + protected ClickableRenderer(Class<T> presentationType) { + super(presentationType); + registerRpc(new RendererClickRpc() { + @Override + public void click(int row, int column, + MouseEventDetails mouseDetails) { + + Grid grid = (Grid) getParent(); + Object itemId = grid.getContainerDatasource().getIdByIndex(row); + // TODO map column index to property ID or send column ID + // instead of index from the client + fireEvent(new RendererClickEvent(grid, itemId, mouseDetails)); + } + }); + } + + /** + * Adds a click listener to this button renderer. The listener is invoked + * every time one of the buttons rendered by this renderer is clicked. + * + * @param listener + * the click listener to be added + */ + public void addClickListener(RendererClickListener listener) { + addListener(RendererClickEvent.class, listener, + RendererClickListener.CLICK_METHOD); + } + + /** + * Removes the given click listener from this renderer. + * + * @param listener + * the click listener to be removed + */ + public void removeClickListener(RendererClickListener listener) { + removeListener(RendererClickEvent.class, listener); + } +} diff --git a/server/src/com/vaadin/ui/components/grid/renderers/ImageRenderer.java b/server/src/com/vaadin/ui/components/grid/renderers/ImageRenderer.java index b7134aab01..be57a5ec19 100644 --- a/server/src/com/vaadin/ui/components/grid/renderers/ImageRenderer.java +++ b/server/src/com/vaadin/ui/components/grid/renderers/ImageRenderer.java @@ -20,7 +20,6 @@ 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; @@ -34,7 +33,7 @@ import elemental.json.JsonValue; * @since * @author Vaadin Ltd */ -public class ImageRenderer extends AbstractRenderer<Resource> { +public class ImageRenderer extends ClickableRenderer<Resource> { /** * Creates a new image renderer. @@ -43,6 +42,17 @@ public class ImageRenderer extends AbstractRenderer<Resource> { super(Resource.class); } + /** + * Creates a new image renderer and adds the given click listener to it. + * + * @param listener + * the click listener to register + */ + public ImageRenderer(RendererClickListener listener) { + this(); + addClickListener(listener); + } + @Override public JsonValue encode(Resource resource) { if (!(resource instanceof ExternalResource || resource instanceof ThemeResource)) { |