* @since 7.4
* @author Vaadin Ltd
*/
-@Connect(com.vaadin.ui.renderer.ButtonRenderer.class)
+@Connect(com.vaadin.ui.renderers.ButtonRenderer.class)
public class ButtonRendererConnector extends ClickableRendererConnector<String> {
@Override
* @since 7.4
* @author Vaadin Ltd
*/
-@Connect(com.vaadin.ui.renderer.DateRenderer.class)
+@Connect(com.vaadin.ui.renderers.DateRenderer.class)
public class DateRendererConnector extends TextRendererConnector {
// No implementation needed
}
* @since 7.4
* @author Vaadin Ltd
*/
-@Connect(com.vaadin.ui.renderer.ImageRenderer.class)
+@Connect(com.vaadin.ui.renderers.ImageRenderer.class)
public class ImageRendererConnector extends ClickableRendererConnector<String> {
@Override
import com.vaadin.client.widget.grid.RendererCellReference;
import com.vaadin.shared.JavaScriptExtensionState;
import com.vaadin.shared.ui.Connect;
-import com.vaadin.ui.renderer.AbstractJavaScriptRenderer;
+import com.vaadin.ui.renderers.AbstractJavaScriptRenderer;
import elemental.json.JsonObject;
import elemental.json.JsonValue;
* @since 7.4
* @author Vaadin Ltd
*/
-@Connect(com.vaadin.ui.renderer.NumberRenderer.class)
+@Connect(com.vaadin.ui.renderers.NumberRenderer.class)
public class NumberRendererConnector extends TextRendererConnector {
// no implementation needed
}
* @since 7.4
* @author Vaadin Ltd
*/
-@Connect(com.vaadin.ui.renderer.ProgressBarRenderer.class)
+@Connect(com.vaadin.ui.renderers.ProgressBarRenderer.class)
public class ProgressBarRendererConnector extends
AbstractRendererConnector<Double> {
* @since 7.4
* @author Vaadin Ltd
*/
-@Connect(com.vaadin.ui.renderer.TextRenderer.class)
+@Connect(com.vaadin.ui.renderers.TextRenderer.class)
public class TextRendererConnector extends AbstractRendererConnector<String> {
@Override
* @since 7.4
* @author Vaadin Ltd
*/
-@Connect(com.vaadin.ui.renderer.HtmlRenderer.class)
+@Connect(com.vaadin.ui.renderers.HtmlRenderer.class)
public class UnsafeHtmlRendererConnector extends
AbstractRendererConnector<String> {
import com.vaadin.ui.Grid.Column;
import com.vaadin.ui.Grid.RowReference;
import com.vaadin.ui.Grid.RowStyleGenerator;
-import com.vaadin.ui.renderer.Renderer;
+import com.vaadin.ui.renderers.Renderer;
import elemental.json.Json;
import elemental.json.JsonArray;
import com.vaadin.shared.ui.grid.HeightMode;
import com.vaadin.shared.ui.grid.ScrollDestination;
import com.vaadin.shared.util.SharedUtil;
-import com.vaadin.ui.renderer.Renderer;
-import com.vaadin.ui.renderer.TextRenderer;
+import com.vaadin.ui.renderers.Renderer;
+import com.vaadin.ui.renderers.TextRenderer;
import com.vaadin.util.ReflectTools;
import elemental.json.Json;
+++ /dev/null
-/*
- * 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.renderer;
-
-import com.vaadin.server.AbstractJavaScriptExtension;
-import com.vaadin.server.JavaScriptCallbackHelper;
-import com.vaadin.shared.JavaScriptExtensionState;
-import com.vaadin.shared.communication.ServerRpc;
-import com.vaadin.ui.Grid.AbstractRenderer;
-import com.vaadin.ui.JavaScriptFunction;
-
-/**
- * Base class for Renderers with all client-side logic implemented using
- * JavaScript.
- * <p>
- * When a new JavaScript renderer is initialized in the browser, the framework
- * will look for a globally defined JavaScript function that will initialize the
- * renderer. The name of the initialization function is formed by replacing .
- * with _ in the name of the server-side class. If no such function is defined,
- * each super class is used in turn until a match is found. The framework will
- * thus first attempt with <code>com_example_MyRenderer</code> for the
- * server-side
- * <code>com.example.MyRenderer extends AbstractJavaScriptRenderer</code> class.
- * If MyRenderer instead extends <code>com.example.SuperRenderer</code> , then
- * <code>com_example_SuperRenderer</code> will also be attempted if
- * <code>com_example_MyRenderer</code> has not been defined.
- * <p>
- *
- * In addition to the general JavaScript extension functionality explained in
- * {@link AbstractJavaScriptExtension}, this class also provides some
- * functionality specific for renderers.
- * <p>
- * The initialization function will be called with <code>this</code> pointing to
- * a connector wrapper object providing integration to Vaadin with the following
- * functions:
- * <ul>
- * <li><code>getRowKey(rowIndex)</code> - Gets a unique identifier for the row
- * at the given index. This identifier can be used on the server to retrieve the
- * corresponding ItemId using {@link #getItemId(String)}.</li>
- * </ul>
- * The connector wrapper also supports these special functions that can be
- * implemented by the connector:
- * <ul>
- * <li><code>render(cell, data)</code> - Callback for rendering the given data
- * into the given cell. The structure of cell and data are described in separate
- * sections below. The renderer is required to implement this function.
- * Corresponds to
- * {@link com.vaadin.client.renderers.Renderer#render(com.vaadin.client.widget.grid.RendererCellReference, Object)}
- * .</li>
- * <li><code>init(cell)</code> - Prepares a cell for rendering. Corresponds to
- * {@link com.vaadin.client.renderers.ComplexRenderer#init(com.vaadin.client.widget.grid.RendererCellReference)}
- * .</li>
- * <li><code>destory(cell)</code> - Allows the renderer to release resources
- * allocate for a cell that will no longer be used. Corresponds to
- * {@link com.vaadin.client.renderers.ComplexRenderer#destroy(com.vaadin.client.widget.grid.RendererCellReference)}
- * .</li>
- * <li><code>onActivate(cell)</code> - Called when the cell is activated by the
- * user e.g. by double clicking on the cell or pressing enter with the cell
- * focused. Corresponds to
- * {@link com.vaadin.client.renderers.ComplexRenderer#onActivate(com.vaadin.client.widget.grid.CellReference)}
- * .</li>
- * <li><code>getConsumedEvents()</code> - Returns a JavaScript array of event
- * names that should cause onBrowserEvent to be invoked whenever an event is
- * fired for a cell managed by this renderer. Corresponds to
- * {@link com.vaadin.client.renderers.ComplexRenderer#getConsumedEvents()}.</li>
- * <li><code>onBrowserEvent(cell, event)</code> - Called by Grid when an event
- * of a type returned by getConsumedEvents is fired for a cell managed by this
- * renderer. Corresponds to
- * {@link com.vaadin.client.renderers.ComplexRenderer#onBrowserEvent(com.vaadin.client.widget.grid.CellReference, com.google.gwt.dom.client.NativeEvent)}
- * .</li>
- * </ul>
- *
- * <p>
- * The cell object passed to functions defined by the renderer has these
- * properties:
- * <ul>
- * <li><code>element</code> - The DOM element corresponding to this cell.
- * Readonly.</li>
- * <li><code>rowIndex</code> - The current index of the row of this cell.
- * Readonly.</li>
- * <li><code>columnIndex</code> - The current index of the column of this cell.
- * Readonly.</li>
- * <li><code>colSpan</code> - The number of columns spanned by this cell. Only
- * supported in the object passed to the <code>render</code> function - other
- * functions should not use the property. Readable and writable.
- * </ul>
- *
- * @author Vaadin Ltd
- * @since 7.4
- */
-public abstract class AbstractJavaScriptRenderer<T> extends AbstractRenderer<T> {
- private JavaScriptCallbackHelper callbackHelper = new JavaScriptCallbackHelper(
- this);
-
- protected AbstractJavaScriptRenderer(Class<T> presentationType) {
- super(presentationType);
- }
-
- @Override
- protected <R extends ServerRpc> void registerRpc(R implementation,
- Class<R> rpcInterfaceType) {
- super.registerRpc(implementation, rpcInterfaceType);
- callbackHelper.registerRpc(rpcInterfaceType);
- }
-
- /**
- * Register a {@link JavaScriptFunction} that can be called from the
- * JavaScript using the provided name. A JavaScript function with the
- * provided name will be added to the connector wrapper object (initially
- * available as <code>this</code>). Calling that JavaScript function will
- * cause the call method in the registered {@link JavaScriptFunction} to be
- * invoked with the same arguments.
- *
- * @param functionName
- * the name that should be used for client-side callback
- * @param function
- * the {@link JavaScriptFunction} object that will be invoked
- * when the JavaScript function is called
- */
- protected void addFunction(String functionName, JavaScriptFunction function) {
- callbackHelper.registerCallback(functionName, function);
- }
-
- /**
- * Invoke a named function that the connector JavaScript has added to the
- * JavaScript connector wrapper object. The arguments should only contain
- * data types that can be represented in JavaScript including primitives,
- * their boxed types, arrays, String, List, Set, Map, Connector and
- * JavaBeans.
- *
- * @param name
- * the name of the function
- * @param arguments
- * function arguments
- */
- protected void callFunction(String name, Object... arguments) {
- callbackHelper.invokeCallback(name, arguments);
- }
-
- @Override
- protected JavaScriptExtensionState getState() {
- return (JavaScriptExtensionState) super.getState();
- }
-}
+++ /dev/null
-/*
- * 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.renderer;
-
-/**
- * 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
- * to the renderer, invoked when any of the rendered buttons is clicked.
- *
- * @since 7.4
- * @author Vaadin Ltd
- */
-public class ButtonRenderer extends ClickableRenderer<String> {
-
- /**
- * Creates a new button renderer.
- */
- public ButtonRenderer() {
- super(String.class);
- }
-
- /**
- * 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);
- }
-}
+++ /dev/null
-/*
- * 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.renderer;
-
-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.Grid;
-import com.vaadin.ui.Grid.AbstractRenderer;
-import com.vaadin.ui.Grid.Column;
-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 7.4
- * @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;
- private Column column;
-
- protected RendererClickEvent(Grid source, Object itemId, Column column,
- MouseEventDetails mouseEventDetails) {
- super(source, mouseEventDetails);
- this.itemId = itemId;
- this.column = column;
- }
-
- /**
- * 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;
- }
-
- /**
- * Returns the {@link Column} where the click event originated.
- *
- * @return the column of the click event
- */
- public Column getColumn() {
- return column;
- }
-
- /**
- * Returns the property ID where the click event originated.
- *
- * @return the property ID of the clicked cell
- */
- public Object getPropertyId() {
- return column.getPropertyId();
- }
- }
-
- protected ClickableRenderer(Class<T> presentationType) {
- super(presentationType);
- registerRpc(new RendererClickRpc() {
- @Override
- public void click(String rowKey, String columnId,
- MouseEventDetails mouseDetails) {
- fireEvent(new RendererClickEvent(getParentGrid(),
- getItemId(rowKey), getColumn(columnId), 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);
- }
-}
+++ /dev/null
-/*
- * 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.renderer;
-
-import java.text.DateFormat;
-import java.util.Date;
-import java.util.Locale;
-
-import com.vaadin.ui.Grid.AbstractRenderer;
-
-import elemental.json.JsonValue;
-
-/**
- * A renderer for presenting date values.
- *
- * @since 7.4
- * @author Vaadin Ltd
- */
-public class DateRenderer extends AbstractRenderer<Date> {
- private final Locale locale;
- private final String formatString;
- private final DateFormat dateFormat;
-
- /**
- * Creates a new date renderer.
- * <p>
- * The renderer is configured to render with the {@link Date#toString()}
- * representation for the default locale.
- */
- public DateRenderer() {
- this(Locale.getDefault());
- }
-
- /**
- * Creates a new date renderer.
- * <p>
- * The renderer is configured to render with the {@link Date#toString()}
- * representation for the given locale.
- *
- * @param locale
- * the locale in which to present dates
- * @throws IllegalArgumentException
- * if {@code locale} is {@code null}
- */
- public DateRenderer(Locale locale) throws IllegalArgumentException {
- this("%s", locale);
- }
-
- /**
- * Creates a new date renderer.
- * <p>
- * The renderer is configured to render with the given string format, as
- * displayed in the default locale.
- *
- * @param formatString
- * the format string with which to format the date
- * @throws IllegalArgumentException
- * if {@code formatString} is {@code null}
- * @see <a
- * href="http://docs.oracle.com/javase/7/docs/api/java/util/Formatter.html#syntax">Format
- * String Syntax</a>
- */
- public DateRenderer(String formatString) throws IllegalArgumentException {
- this(formatString, Locale.getDefault());
- }
-
- /**
- * Creates a new date renderer.
- * <p>
- * The renderer is configured to render with the given string format, as
- * displayed in the given locale.
- *
- * @param formatString
- * the format string to format the date with
- * @param locale
- * the locale to use
- * @throws IllegalArgumentException
- * if either argument is {@code null}
- * @see <a
- * href="http://docs.oracle.com/javase/7/docs/api/java/util/Formatter.html#syntax">Format
- * String Syntax</a>
- */
- public DateRenderer(String formatString, Locale locale)
- throws IllegalArgumentException {
- super(Date.class);
-
- if (formatString == null) {
- throw new IllegalArgumentException("format string may not be null");
- }
-
- if (locale == null) {
- throw new IllegalArgumentException("locale may not be null");
- }
-
- this.locale = locale;
- this.formatString = formatString;
- dateFormat = null;
- }
-
- /**
- * Creates a new date renderer.
- * <p>
- * The renderer is configured to render with he given date format.
- *
- * @param dateFormat
- * the date format to use when rendering dates
- * @throws IllegalArgumentException
- * if {@code dateFormat} is {@code null}
- */
- public DateRenderer(DateFormat dateFormat) throws IllegalArgumentException {
- super(Date.class);
- if (dateFormat == null) {
- throw new IllegalArgumentException("date format may not be null");
- }
-
- locale = null;
- formatString = null;
- this.dateFormat = dateFormat;
- }
-
- @Override
- public JsonValue encode(Date value) {
- String dateString;
- if (dateFormat != null) {
- dateString = dateFormat.format(value);
- } else {
- dateString = String.format(locale, formatString, value);
- }
- return encode(dateString, String.class);
- }
-
- @Override
- public String toString() {
- final String fieldInfo;
- if (dateFormat != null) {
- fieldInfo = "dateFormat: " + dateFormat.toString();
- } else {
- fieldInfo = "locale: " + locale + ", formatString: " + formatString;
- }
-
- return String.format("%s [%s]", getClass().getSimpleName(), fieldInfo);
- }
-}
+++ /dev/null
-/*
- * 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.renderer;
-
-import com.vaadin.ui.Grid.AbstractRenderer;
-
-/**
- * A renderer for presenting HTML content.
- *
- * @since 7.4
- * @author Vaadin Ltd
- */
-public class HtmlRenderer extends AbstractRenderer<String> {
- /**
- * Creates a new HTML renderer.
- */
- public HtmlRenderer() {
- super(String.class);
- }
-}
+++ /dev/null
-/*
- * 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.renderer;
-
-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 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 7.4
- * @author Vaadin Ltd
- */
-public class ImageRenderer extends ClickableRenderer<Resource> {
-
- /**
- * Creates a new image renderer.
- */
- public ImageRenderer() {
- 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)) {
- throw new IllegalArgumentException(
- "ImageRenderer only supports ExternalResource and ThemeResource ("
- + resource.getClass().getSimpleName() + "given )");
- }
-
- return encode(ResourceReference.create(resource, this, null),
- URLReference.class);
- }
-}
+++ /dev/null
-/*
- * 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.renderer;
-
-import java.text.NumberFormat;
-import java.util.Locale;
-
-import com.vaadin.ui.Grid.AbstractRenderer;
-
-import elemental.json.JsonValue;
-
-/**
- * A renderer for presenting number values.
- *
- * @since 7.4
- * @author Vaadin Ltd
- */
-public class NumberRenderer extends AbstractRenderer<Number> {
- private final Locale locale;
- private final NumberFormat numberFormat;
- private final String formatString;
-
- /**
- * Creates a new number renderer.
- * <p>
- * The renderer is configured to render with the number's natural string
- * representation in the default locale.
- */
- public NumberRenderer() {
- this(Locale.getDefault());
- }
-
- /**
- * Creates a new number renderer.
- * <p>
- * The renderer is configured to render the number as defined with the given
- * number format.
- *
- * @param numberFormat
- * the number format with which to display numbers
- * @throws IllegalArgumentException
- * if {@code numberFormat} is {@code null}
- */
- public NumberRenderer(NumberFormat numberFormat)
- throws IllegalArgumentException {
- super(Number.class);
-
- if (numberFormat == null) {
- throw new IllegalArgumentException("Number format may not be null");
- }
-
- locale = null;
- this.numberFormat = numberFormat;
- formatString = null;
- }
-
- /**
- * Creates a new number renderer.
- * <p>
- * The renderer is configured to render with the number's natural string
- * representation in the given locale.
- *
- * @param locale
- * the locale in which to display numbers
- * @throws IllegalArgumentException
- * if {@code locale} is {@code null}
- */
- public NumberRenderer(Locale locale) throws IllegalArgumentException {
- this("%s", locale);
- }
-
- /**
- * Creates a new number renderer.
- * <p>
- * The renderer is configured to render with the given format string in the
- * default locale.
- *
- * @param formatString
- * the format string with which to format the number
- * @throws IllegalArgumentException
- * if {@code formatString} is {@code null}
- * @see <a
- * href="http://docs.oracle.com/javase/7/docs/api/java/util/Formatter.html#syntax">Format
- * String Syntax</a>
- */
- public NumberRenderer(String formatString) throws IllegalArgumentException {
- this(formatString, Locale.getDefault());
- }
-
- /**
- * Creates a new number renderer.
- * <p>
- * The renderer is configured to render with the given format string in the
- * given locale.
- *
- * @param formatString
- * the format string with which to format the number
- * @param locale
- * the locale in which to present numbers
- * @throws IllegalArgumentException
- * if either argument is {@code null}
- * @see <a
- * href="http://docs.oracle.com/javase/7/docs/api/java/util/Formatter.html#syntax">Format
- * String Syntax</a>
- */
- public NumberRenderer(String formatString, Locale locale) {
- super(Number.class);
-
- if (formatString == null) {
- throw new IllegalArgumentException("Format string may not be null");
- }
-
- if (locale == null) {
- throw new IllegalArgumentException("Locale may not be null");
- }
-
- this.locale = locale;
- numberFormat = null;
- this.formatString = formatString;
- }
-
- @Override
- public JsonValue encode(Number value) {
- String stringValue;
- if (formatString != null && locale != null) {
- stringValue = String.format(locale, formatString, value);
- } else if (numberFormat != null) {
- stringValue = numberFormat.format(value);
- } else {
- throw new IllegalStateException(String.format("Internal bug: "
- + "%s is in an illegal state: "
- + "[locale: %s, numberFormat: %s, formatString: %s]",
- getClass().getSimpleName(), locale, numberFormat,
- formatString));
- }
- return encode(stringValue, String.class);
- }
-
- @Override
- public String toString() {
- final String fieldInfo;
- if (numberFormat != null) {
- fieldInfo = "numberFormat: " + numberFormat.toString();
- } else {
- fieldInfo = "locale: " + locale + ", formatString: " + formatString;
- }
-
- return String.format("%s [%s]", getClass().getSimpleName(), fieldInfo);
- }
-}
+++ /dev/null
-/*
- * 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.renderer;
-
-import com.vaadin.ui.Grid.AbstractRenderer;
-
-import elemental.json.JsonValue;
-
-/**
- * A renderer that represents a double values as a graphical progress bar.
- *
- * @since 7.4
- * @author Vaadin Ltd
- */
-public class ProgressBarRenderer extends AbstractRenderer<Double> {
-
- /**
- * Creates a new text renderer
- */
- public ProgressBarRenderer() {
- super(Double.class);
- }
-
- @Override
- public JsonValue encode(Double value) {
- if (value != null) {
- value = Math.max(Math.min(value, 1), 0);
- }
- return super.encode(value);
- }
-}
+++ /dev/null
-/*
- * 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.renderer;
-
-import com.vaadin.server.ClientConnector;
-import com.vaadin.server.Extension;
-
-import elemental.json.JsonValue;
-
-/**
- * A ClientConnector for controlling client-side
- * {@link com.vaadin.client.widget.grid.Renderer Grid renderers}. Renderers
- * currently extend the Extension interface, but this fact should be regarded as
- * an implementation detail and subject to change in a future major or minor
- * Vaadin revision.
- *
- * @param <T>
- * the type this renderer knows how to present
- *
- * @since 7.4
- * @author Vaadin Ltd
- */
-public interface Renderer<T> extends Extension {
-
- /**
- * Returns the class literal corresponding to the presentation type T.
- *
- * @return the class literal of T
- */
- Class<T> getPresentationType();
-
- /**
- * Encodes the given value into a {@link JsonValue}.
- *
- * @param value
- * the value to encode
- * @return a JSON representation of the given value
- */
- JsonValue encode(T value);
-
- /**
- * This method is inherited from Extension but should never be called
- * directly with a Renderer.
- */
- @Override
- @Deprecated
- void remove();
-
- /**
- * This method is inherited from Extension but should never be called
- * directly with a Renderer.
- */
- @Override
- @Deprecated
- void setParent(ClientConnector parent);
-}
+++ /dev/null
-/*
- * 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.renderer;
-
-import com.vaadin.ui.Grid.AbstractRenderer;
-
-/**
- * A renderer for presenting simple plain-text string values.
- *
- * @since 7.4
- * @author Vaadin Ltd
- */
-public class TextRenderer extends AbstractRenderer<String> {
-
- /**
- * Creates a new text renderer
- */
- public TextRenderer() {
- super(String.class);
- }
-}
--- /dev/null
+/*
+ * 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.renderers;
+
+import com.vaadin.server.AbstractJavaScriptExtension;
+import com.vaadin.server.JavaScriptCallbackHelper;
+import com.vaadin.shared.JavaScriptExtensionState;
+import com.vaadin.shared.communication.ServerRpc;
+import com.vaadin.ui.Grid.AbstractRenderer;
+import com.vaadin.ui.JavaScriptFunction;
+
+/**
+ * Base class for Renderers with all client-side logic implemented using
+ * JavaScript.
+ * <p>
+ * When a new JavaScript renderer is initialized in the browser, the framework
+ * will look for a globally defined JavaScript function that will initialize the
+ * renderer. The name of the initialization function is formed by replacing .
+ * with _ in the name of the server-side class. If no such function is defined,
+ * each super class is used in turn until a match is found. The framework will
+ * thus first attempt with <code>com_example_MyRenderer</code> for the
+ * server-side
+ * <code>com.example.MyRenderer extends AbstractJavaScriptRenderer</code> class.
+ * If MyRenderer instead extends <code>com.example.SuperRenderer</code> , then
+ * <code>com_example_SuperRenderer</code> will also be attempted if
+ * <code>com_example_MyRenderer</code> has not been defined.
+ * <p>
+ *
+ * In addition to the general JavaScript extension functionality explained in
+ * {@link AbstractJavaScriptExtension}, this class also provides some
+ * functionality specific for renderers.
+ * <p>
+ * The initialization function will be called with <code>this</code> pointing to
+ * a connector wrapper object providing integration to Vaadin with the following
+ * functions:
+ * <ul>
+ * <li><code>getRowKey(rowIndex)</code> - Gets a unique identifier for the row
+ * at the given index. This identifier can be used on the server to retrieve the
+ * corresponding ItemId using {@link #getItemId(String)}.</li>
+ * </ul>
+ * The connector wrapper also supports these special functions that can be
+ * implemented by the connector:
+ * <ul>
+ * <li><code>render(cell, data)</code> - Callback for rendering the given data
+ * into the given cell. The structure of cell and data are described in separate
+ * sections below. The renderer is required to implement this function.
+ * Corresponds to
+ * {@link com.vaadin.client.renderers.Renderer#render(com.vaadin.client.widget.grid.RendererCellReference, Object)}
+ * .</li>
+ * <li><code>init(cell)</code> - Prepares a cell for rendering. Corresponds to
+ * {@link com.vaadin.client.renderers.ComplexRenderer#init(com.vaadin.client.widget.grid.RendererCellReference)}
+ * .</li>
+ * <li><code>destory(cell)</code> - Allows the renderer to release resources
+ * allocate for a cell that will no longer be used. Corresponds to
+ * {@link com.vaadin.client.renderers.ComplexRenderer#destroy(com.vaadin.client.widget.grid.RendererCellReference)}
+ * .</li>
+ * <li><code>onActivate(cell)</code> - Called when the cell is activated by the
+ * user e.g. by double clicking on the cell or pressing enter with the cell
+ * focused. Corresponds to
+ * {@link com.vaadin.client.renderers.ComplexRenderer#onActivate(com.vaadin.client.widget.grid.CellReference)}
+ * .</li>
+ * <li><code>getConsumedEvents()</code> - Returns a JavaScript array of event
+ * names that should cause onBrowserEvent to be invoked whenever an event is
+ * fired for a cell managed by this renderer. Corresponds to
+ * {@link com.vaadin.client.renderers.ComplexRenderer#getConsumedEvents()}.</li>
+ * <li><code>onBrowserEvent(cell, event)</code> - Called by Grid when an event
+ * of a type returned by getConsumedEvents is fired for a cell managed by this
+ * renderer. Corresponds to
+ * {@link com.vaadin.client.renderers.ComplexRenderer#onBrowserEvent(com.vaadin.client.widget.grid.CellReference, com.google.gwt.dom.client.NativeEvent)}
+ * .</li>
+ * </ul>
+ *
+ * <p>
+ * The cell object passed to functions defined by the renderer has these
+ * properties:
+ * <ul>
+ * <li><code>element</code> - The DOM element corresponding to this cell.
+ * Readonly.</li>
+ * <li><code>rowIndex</code> - The current index of the row of this cell.
+ * Readonly.</li>
+ * <li><code>columnIndex</code> - The current index of the column of this cell.
+ * Readonly.</li>
+ * <li><code>colSpan</code> - The number of columns spanned by this cell. Only
+ * supported in the object passed to the <code>render</code> function - other
+ * functions should not use the property. Readable and writable.
+ * </ul>
+ *
+ * @author Vaadin Ltd
+ * @since 7.4
+ */
+public abstract class AbstractJavaScriptRenderer<T> extends AbstractRenderer<T> {
+ private JavaScriptCallbackHelper callbackHelper = new JavaScriptCallbackHelper(
+ this);
+
+ protected AbstractJavaScriptRenderer(Class<T> presentationType) {
+ super(presentationType);
+ }
+
+ @Override
+ protected <R extends ServerRpc> void registerRpc(R implementation,
+ Class<R> rpcInterfaceType) {
+ super.registerRpc(implementation, rpcInterfaceType);
+ callbackHelper.registerRpc(rpcInterfaceType);
+ }
+
+ /**
+ * Register a {@link JavaScriptFunction} that can be called from the
+ * JavaScript using the provided name. A JavaScript function with the
+ * provided name will be added to the connector wrapper object (initially
+ * available as <code>this</code>). Calling that JavaScript function will
+ * cause the call method in the registered {@link JavaScriptFunction} to be
+ * invoked with the same arguments.
+ *
+ * @param functionName
+ * the name that should be used for client-side callback
+ * @param function
+ * the {@link JavaScriptFunction} object that will be invoked
+ * when the JavaScript function is called
+ */
+ protected void addFunction(String functionName, JavaScriptFunction function) {
+ callbackHelper.registerCallback(functionName, function);
+ }
+
+ /**
+ * Invoke a named function that the connector JavaScript has added to the
+ * JavaScript connector wrapper object. The arguments should only contain
+ * data types that can be represented in JavaScript including primitives,
+ * their boxed types, arrays, String, List, Set, Map, Connector and
+ * JavaBeans.
+ *
+ * @param name
+ * the name of the function
+ * @param arguments
+ * function arguments
+ */
+ protected void callFunction(String name, Object... arguments) {
+ callbackHelper.invokeCallback(name, arguments);
+ }
+
+ @Override
+ protected JavaScriptExtensionState getState() {
+ return (JavaScriptExtensionState) super.getState();
+ }
+}
--- /dev/null
+/*
+ * 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.renderers;
+
+/**
+ * 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
+ * to the renderer, invoked when any of the rendered buttons is clicked.
+ *
+ * @since 7.4
+ * @author Vaadin Ltd
+ */
+public class ButtonRenderer extends ClickableRenderer<String> {
+
+ /**
+ * Creates a new button renderer.
+ */
+ public ButtonRenderer() {
+ super(String.class);
+ }
+
+ /**
+ * 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);
+ }
+}
--- /dev/null
+/*
+ * 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.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.Grid;
+import com.vaadin.ui.Grid.AbstractRenderer;
+import com.vaadin.ui.Grid.Column;
+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 7.4
+ * @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;
+ private Column column;
+
+ protected RendererClickEvent(Grid source, Object itemId, Column column,
+ MouseEventDetails mouseEventDetails) {
+ super(source, mouseEventDetails);
+ this.itemId = itemId;
+ this.column = column;
+ }
+
+ /**
+ * 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;
+ }
+
+ /**
+ * Returns the {@link Column} where the click event originated.
+ *
+ * @return the column of the click event
+ */
+ public Column getColumn() {
+ return column;
+ }
+
+ /**
+ * Returns the property ID where the click event originated.
+ *
+ * @return the property ID of the clicked cell
+ */
+ public Object getPropertyId() {
+ return column.getPropertyId();
+ }
+ }
+
+ protected ClickableRenderer(Class<T> presentationType) {
+ super(presentationType);
+ registerRpc(new RendererClickRpc() {
+ @Override
+ public void click(String rowKey, String columnId,
+ MouseEventDetails mouseDetails) {
+ fireEvent(new RendererClickEvent(getParentGrid(),
+ getItemId(rowKey), getColumn(columnId), 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);
+ }
+}
--- /dev/null
+/*
+ * 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.renderers;
+
+import java.text.DateFormat;
+import java.util.Date;
+import java.util.Locale;
+
+import com.vaadin.ui.Grid.AbstractRenderer;
+
+import elemental.json.JsonValue;
+
+/**
+ * A renderer for presenting date values.
+ *
+ * @since 7.4
+ * @author Vaadin Ltd
+ */
+public class DateRenderer extends AbstractRenderer<Date> {
+ private final Locale locale;
+ private final String formatString;
+ private final DateFormat dateFormat;
+
+ /**
+ * Creates a new date renderer.
+ * <p>
+ * The renderer is configured to render with the {@link Date#toString()}
+ * representation for the default locale.
+ */
+ public DateRenderer() {
+ this(Locale.getDefault());
+ }
+
+ /**
+ * Creates a new date renderer.
+ * <p>
+ * The renderer is configured to render with the {@link Date#toString()}
+ * representation for the given locale.
+ *
+ * @param locale
+ * the locale in which to present dates
+ * @throws IllegalArgumentException
+ * if {@code locale} is {@code null}
+ */
+ public DateRenderer(Locale locale) throws IllegalArgumentException {
+ this("%s", locale);
+ }
+
+ /**
+ * Creates a new date renderer.
+ * <p>
+ * The renderer is configured to render with the given string format, as
+ * displayed in the default locale.
+ *
+ * @param formatString
+ * the format string with which to format the date
+ * @throws IllegalArgumentException
+ * if {@code formatString} is {@code null}
+ * @see <a
+ * href="http://docs.oracle.com/javase/7/docs/api/java/util/Formatter.html#syntax">Format
+ * String Syntax</a>
+ */
+ public DateRenderer(String formatString) throws IllegalArgumentException {
+ this(formatString, Locale.getDefault());
+ }
+
+ /**
+ * Creates a new date renderer.
+ * <p>
+ * The renderer is configured to render with the given string format, as
+ * displayed in the given locale.
+ *
+ * @param formatString
+ * the format string to format the date with
+ * @param locale
+ * the locale to use
+ * @throws IllegalArgumentException
+ * if either argument is {@code null}
+ * @see <a
+ * href="http://docs.oracle.com/javase/7/docs/api/java/util/Formatter.html#syntax">Format
+ * String Syntax</a>
+ */
+ public DateRenderer(String formatString, Locale locale)
+ throws IllegalArgumentException {
+ super(Date.class);
+
+ if (formatString == null) {
+ throw new IllegalArgumentException("format string may not be null");
+ }
+
+ if (locale == null) {
+ throw new IllegalArgumentException("locale may not be null");
+ }
+
+ this.locale = locale;
+ this.formatString = formatString;
+ dateFormat = null;
+ }
+
+ /**
+ * Creates a new date renderer.
+ * <p>
+ * The renderer is configured to render with he given date format.
+ *
+ * @param dateFormat
+ * the date format to use when rendering dates
+ * @throws IllegalArgumentException
+ * if {@code dateFormat} is {@code null}
+ */
+ public DateRenderer(DateFormat dateFormat) throws IllegalArgumentException {
+ super(Date.class);
+ if (dateFormat == null) {
+ throw new IllegalArgumentException("date format may not be null");
+ }
+
+ locale = null;
+ formatString = null;
+ this.dateFormat = dateFormat;
+ }
+
+ @Override
+ public JsonValue encode(Date value) {
+ String dateString;
+ if (dateFormat != null) {
+ dateString = dateFormat.format(value);
+ } else {
+ dateString = String.format(locale, formatString, value);
+ }
+ return encode(dateString, String.class);
+ }
+
+ @Override
+ public String toString() {
+ final String fieldInfo;
+ if (dateFormat != null) {
+ fieldInfo = "dateFormat: " + dateFormat.toString();
+ } else {
+ fieldInfo = "locale: " + locale + ", formatString: " + formatString;
+ }
+
+ return String.format("%s [%s]", getClass().getSimpleName(), fieldInfo);
+ }
+}
--- /dev/null
+/*
+ * 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.renderers;
+
+import com.vaadin.ui.Grid.AbstractRenderer;
+
+/**
+ * A renderer for presenting HTML content.
+ *
+ * @since 7.4
+ * @author Vaadin Ltd
+ */
+public class HtmlRenderer extends AbstractRenderer<String> {
+ /**
+ * Creates a new HTML renderer.
+ */
+ public HtmlRenderer() {
+ super(String.class);
+ }
+}
--- /dev/null
+/*
+ * 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.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 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 7.4
+ * @author Vaadin Ltd
+ */
+public class ImageRenderer extends ClickableRenderer<Resource> {
+
+ /**
+ * Creates a new image renderer.
+ */
+ public ImageRenderer() {
+ 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)) {
+ throw new IllegalArgumentException(
+ "ImageRenderer only supports ExternalResource and ThemeResource ("
+ + resource.getClass().getSimpleName() + "given )");
+ }
+
+ return encode(ResourceReference.create(resource, this, null),
+ URLReference.class);
+ }
+}
--- /dev/null
+/*
+ * 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.renderers;
+
+import java.text.NumberFormat;
+import java.util.Locale;
+
+import com.vaadin.ui.Grid.AbstractRenderer;
+
+import elemental.json.JsonValue;
+
+/**
+ * A renderer for presenting number values.
+ *
+ * @since 7.4
+ * @author Vaadin Ltd
+ */
+public class NumberRenderer extends AbstractRenderer<Number> {
+ private final Locale locale;
+ private final NumberFormat numberFormat;
+ private final String formatString;
+
+ /**
+ * Creates a new number renderer.
+ * <p>
+ * The renderer is configured to render with the number's natural string
+ * representation in the default locale.
+ */
+ public NumberRenderer() {
+ this(Locale.getDefault());
+ }
+
+ /**
+ * Creates a new number renderer.
+ * <p>
+ * The renderer is configured to render the number as defined with the given
+ * number format.
+ *
+ * @param numberFormat
+ * the number format with which to display numbers
+ * @throws IllegalArgumentException
+ * if {@code numberFormat} is {@code null}
+ */
+ public NumberRenderer(NumberFormat numberFormat)
+ throws IllegalArgumentException {
+ super(Number.class);
+
+ if (numberFormat == null) {
+ throw new IllegalArgumentException("Number format may not be null");
+ }
+
+ locale = null;
+ this.numberFormat = numberFormat;
+ formatString = null;
+ }
+
+ /**
+ * Creates a new number renderer.
+ * <p>
+ * The renderer is configured to render with the number's natural string
+ * representation in the given locale.
+ *
+ * @param locale
+ * the locale in which to display numbers
+ * @throws IllegalArgumentException
+ * if {@code locale} is {@code null}
+ */
+ public NumberRenderer(Locale locale) throws IllegalArgumentException {
+ this("%s", locale);
+ }
+
+ /**
+ * Creates a new number renderer.
+ * <p>
+ * The renderer is configured to render with the given format string in the
+ * default locale.
+ *
+ * @param formatString
+ * the format string with which to format the number
+ * @throws IllegalArgumentException
+ * if {@code formatString} is {@code null}
+ * @see <a
+ * href="http://docs.oracle.com/javase/7/docs/api/java/util/Formatter.html#syntax">Format
+ * String Syntax</a>
+ */
+ public NumberRenderer(String formatString) throws IllegalArgumentException {
+ this(formatString, Locale.getDefault());
+ }
+
+ /**
+ * Creates a new number renderer.
+ * <p>
+ * The renderer is configured to render with the given format string in the
+ * given locale.
+ *
+ * @param formatString
+ * the format string with which to format the number
+ * @param locale
+ * the locale in which to present numbers
+ * @throws IllegalArgumentException
+ * if either argument is {@code null}
+ * @see <a
+ * href="http://docs.oracle.com/javase/7/docs/api/java/util/Formatter.html#syntax">Format
+ * String Syntax</a>
+ */
+ public NumberRenderer(String formatString, Locale locale) {
+ super(Number.class);
+
+ if (formatString == null) {
+ throw new IllegalArgumentException("Format string may not be null");
+ }
+
+ if (locale == null) {
+ throw new IllegalArgumentException("Locale may not be null");
+ }
+
+ this.locale = locale;
+ numberFormat = null;
+ this.formatString = formatString;
+ }
+
+ @Override
+ public JsonValue encode(Number value) {
+ String stringValue;
+ if (formatString != null && locale != null) {
+ stringValue = String.format(locale, formatString, value);
+ } else if (numberFormat != null) {
+ stringValue = numberFormat.format(value);
+ } else {
+ throw new IllegalStateException(String.format("Internal bug: "
+ + "%s is in an illegal state: "
+ + "[locale: %s, numberFormat: %s, formatString: %s]",
+ getClass().getSimpleName(), locale, numberFormat,
+ formatString));
+ }
+ return encode(stringValue, String.class);
+ }
+
+ @Override
+ public String toString() {
+ final String fieldInfo;
+ if (numberFormat != null) {
+ fieldInfo = "numberFormat: " + numberFormat.toString();
+ } else {
+ fieldInfo = "locale: " + locale + ", formatString: " + formatString;
+ }
+
+ return String.format("%s [%s]", getClass().getSimpleName(), fieldInfo);
+ }
+}
--- /dev/null
+/*
+ * 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.renderers;
+
+import com.vaadin.ui.Grid.AbstractRenderer;
+
+import elemental.json.JsonValue;
+
+/**
+ * A renderer that represents a double values as a graphical progress bar.
+ *
+ * @since 7.4
+ * @author Vaadin Ltd
+ */
+public class ProgressBarRenderer extends AbstractRenderer<Double> {
+
+ /**
+ * Creates a new text renderer
+ */
+ public ProgressBarRenderer() {
+ super(Double.class);
+ }
+
+ @Override
+ public JsonValue encode(Double value) {
+ if (value != null) {
+ value = Math.max(Math.min(value, 1), 0);
+ }
+ return super.encode(value);
+ }
+}
--- /dev/null
+/*
+ * 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.renderers;
+
+import com.vaadin.server.ClientConnector;
+import com.vaadin.server.Extension;
+
+import elemental.json.JsonValue;
+
+/**
+ * A ClientConnector for controlling client-side
+ * {@link com.vaadin.client.widget.grid.Renderer Grid renderers}. Renderers
+ * currently extend the Extension interface, but this fact should be regarded as
+ * an implementation detail and subject to change in a future major or minor
+ * Vaadin revision.
+ *
+ * @param <T>
+ * the type this renderer knows how to present
+ *
+ * @since 7.4
+ * @author Vaadin Ltd
+ */
+public interface Renderer<T> extends Extension {
+
+ /**
+ * Returns the class literal corresponding to the presentation type T.
+ *
+ * @return the class literal of T
+ */
+ Class<T> getPresentationType();
+
+ /**
+ * Encodes the given value into a {@link JsonValue}.
+ *
+ * @param value
+ * the value to encode
+ * @return a JSON representation of the given value
+ */
+ JsonValue encode(T value);
+
+ /**
+ * This method is inherited from Extension but should never be called
+ * directly with a Renderer.
+ */
+ @Override
+ @Deprecated
+ void remove();
+
+ /**
+ * This method is inherited from Extension but should never be called
+ * directly with a Renderer.
+ */
+ @Override
+ @Deprecated
+ void setParent(ClientConnector parent);
+}
--- /dev/null
+/*
+ * 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.renderers;
+
+import com.vaadin.ui.Grid.AbstractRenderer;
+
+/**
+ * A renderer for presenting simple plain-text string values.
+ *
+ * @since 7.4
+ * @author Vaadin Ltd
+ */
+public class TextRenderer extends AbstractRenderer<String> {
+
+ /**
+ * Creates a new text renderer
+ */
+ public TextRenderer() {
+ super(String.class);
+ }
+}
import com.vaadin.server.ThemeResource;
import com.vaadin.ui.Grid;
import com.vaadin.ui.UI;
-import com.vaadin.ui.renderer.ImageRenderer;
+import com.vaadin.ui.renderers.ImageRenderer;
import elemental.json.JsonObject;
import elemental.json.JsonValue;
import com.vaadin.ui.Grid;
import com.vaadin.ui.Grid.Column;
import com.vaadin.ui.UI;
-import com.vaadin.ui.renderer.TextRenderer;
+import com.vaadin.ui.renderers.TextRenderer;
import elemental.json.JsonValue;
import com.vaadin.ui.Grid.FooterRow;
import com.vaadin.ui.Grid.HeaderRow;
import com.vaadin.ui.Grid.SelectionMode;
-import com.vaadin.ui.renderer.NumberRenderer;
+import com.vaadin.ui.renderers.NumberRenderer;
public class GridColspans extends AbstractTestUI {
import com.vaadin.ui.Grid;
import com.vaadin.ui.Grid.Column;
import com.vaadin.ui.Grid.SelectionMode;
-import com.vaadin.ui.renderer.HtmlRenderer;
+import com.vaadin.ui.renderers.HtmlRenderer;
public class GridColumnAutoWidth extends AbstractTestUI {
@Override
import com.vaadin.annotations.JavaScript;
import com.vaadin.tests.components.grid.JavaScriptRenderers.MyBean;
-import com.vaadin.ui.renderer.AbstractJavaScriptRenderer;
+import com.vaadin.ui.renderers.AbstractJavaScriptRenderer;
/**
*
import com.vaadin.ui.Grid;
import com.vaadin.ui.Grid.SelectionMode;
import com.vaadin.ui.NativeButton;
-import com.vaadin.ui.renderer.ButtonRenderer;
-import com.vaadin.ui.renderer.ClickableRenderer.RendererClickEvent;
-import com.vaadin.ui.renderer.ClickableRenderer.RendererClickListener;
-import com.vaadin.ui.renderer.ImageRenderer;
-import com.vaadin.ui.renderer.ProgressBarRenderer;
+import com.vaadin.ui.renderers.ButtonRenderer;
+import com.vaadin.ui.renderers.ImageRenderer;
+import com.vaadin.ui.renderers.ProgressBarRenderer;
+import com.vaadin.ui.renderers.ClickableRenderer.RendererClickEvent;
+import com.vaadin.ui.renderers.ClickableRenderer.RendererClickListener;
@SuppressWarnings("all")
public class WidgetRenderers extends AbstractTestUI {
import com.vaadin.ui.Grid.RowStyleGenerator;
import com.vaadin.ui.Grid.SelectionMode;
import com.vaadin.ui.Grid.SelectionModel;
-import com.vaadin.ui.renderer.DateRenderer;
-import com.vaadin.ui.renderer.HtmlRenderer;
-import com.vaadin.ui.renderer.NumberRenderer;
+import com.vaadin.ui.renderers.DateRenderer;
+import com.vaadin.ui.renderers.HtmlRenderer;
+import com.vaadin.ui.renderers.NumberRenderer;
/**
* Tests the basic features like columns, footers and headers