diff options
author | Leif Åstrand <leif@vaadin.com> | 2014-12-18 10:17:58 +0200 |
---|---|---|
committer | Leif Åstrand <leif@vaadin.com> | 2014-12-18 10:56:05 +0200 |
commit | 12f3e377766e19566aba10b6cc3c5c84b8d3d363 (patch) | |
tree | 506b283f8ca64a9919e08d79b6796c4c988c6b6e /client/src | |
parent | cf1c05d0c6f829a2333d4ef744e8f9e1aa6d3dad (diff) | |
download | vaadin-framework-12f3e377766e19566aba10b6cc3c5c84b8d3d363.tar.gz vaadin-framework-12f3e377766e19566aba10b6cc3c5c84b8d3d363.zip |
Use CellReference instead of FlyweightCell in Grid APIs (#13334)
Change-Id: I519e433219a028e99678574227ca44d5b66d07bc
Diffstat (limited to 'client/src')
14 files changed, 145 insertions, 36 deletions
diff --git a/client/src/com/vaadin/client/connectors/UnsafeHtmlRendererConnector.java b/client/src/com/vaadin/client/connectors/UnsafeHtmlRendererConnector.java index 3213c49a1b..91833ae9ac 100644 --- a/client/src/com/vaadin/client/connectors/UnsafeHtmlRendererConnector.java +++ b/client/src/com/vaadin/client/connectors/UnsafeHtmlRendererConnector.java @@ -16,7 +16,7 @@ package com.vaadin.client.connectors; import com.vaadin.client.renderers.Renderer; -import com.vaadin.client.widget.escalator.FlyweightCell; +import com.vaadin.client.widget.grid.RendererCellReference; import com.vaadin.shared.ui.Connect; /** @@ -31,7 +31,7 @@ public class UnsafeHtmlRendererConnector extends public static class UnsafeHtmlRenderer implements Renderer<String> { @Override - public void render(FlyweightCell cell, String data) { + public void render(RendererCellReference cell, String data) { cell.getElement().setInnerHTML(data); } } diff --git a/client/src/com/vaadin/client/renderers/ButtonRenderer.java b/client/src/com/vaadin/client/renderers/ButtonRenderer.java index 718d481cbf..8dfa3d6fae 100644 --- a/client/src/com/vaadin/client/renderers/ButtonRenderer.java +++ b/client/src/com/vaadin/client/renderers/ButtonRenderer.java @@ -17,7 +17,7 @@ package com.vaadin.client.renderers; import com.google.gwt.core.shared.GWT; import com.google.gwt.user.client.ui.Button; -import com.vaadin.client.widget.escalator.FlyweightCell; +import com.vaadin.client.widget.grid.RendererCellReference; /** * A Renderer that displays buttons with textual captions. The values of the @@ -37,7 +37,7 @@ public class ButtonRenderer extends ClickableRenderer<String, Button> { } @Override - public void render(FlyweightCell cell, String text, Button button) { + public void render(RendererCellReference cell, String text, Button button) { button.setText(text); } } diff --git a/client/src/com/vaadin/client/renderers/ComplexRenderer.java b/client/src/com/vaadin/client/renderers/ComplexRenderer.java index ce9cede72c..a4980b8108 100644 --- a/client/src/com/vaadin/client/renderers/ComplexRenderer.java +++ b/client/src/com/vaadin/client/renderers/ComplexRenderer.java @@ -24,6 +24,7 @@ import com.google.gwt.dom.client.Node; import com.google.gwt.dom.client.Style.Visibility; import com.vaadin.client.widget.escalator.Cell; import com.vaadin.client.widget.escalator.FlyweightCell; +import com.vaadin.client.widget.grid.RendererCellReference; /** * Base class for renderers that needs initialization and destruction logic @@ -49,18 +50,21 @@ public abstract class ComplexRenderer<T> implements Renderer<T> { * the method as the cell install will change. See * {@link FlyweightCell} */ - public abstract void init(FlyweightCell cell); + public abstract void init(RendererCellReference cell); /** * Called after the cell is deemed to be destroyed and no longer used by the * Grid. Called after the cell element is detached from the DOM. + * <p> + * The row object in the cell reference will be <code>null</code> since the + * row might no longer be present in the data source. * * @param cell * The cell. Note that the cell is not to be stored outside of * the method as the cell install will change. See * {@link FlyweightCell} */ - public void destroy(FlyweightCell cell) { + public void destroy(RendererCellReference cell) { // Implement if needed } @@ -114,7 +118,7 @@ public abstract class ComplexRenderer<T> implements Renderer<T> { * Has the cell content been loaded from the data source * */ - public void setContentVisible(FlyweightCell cell, boolean hasData) { + public void setContentVisible(RendererCellReference cell, boolean hasData) { Element cellElement = cell.getElement(); for (int n = 0; n < cellElement.getChildCount(); n++) { Node node = cellElement.getChild(n); diff --git a/client/src/com/vaadin/client/renderers/DateRenderer.java b/client/src/com/vaadin/client/renderers/DateRenderer.java index 4d43969495..ee5af2dce9 100644 --- a/client/src/com/vaadin/client/renderers/DateRenderer.java +++ b/client/src/com/vaadin/client/renderers/DateRenderer.java @@ -20,7 +20,7 @@ import java.util.Date; import com.google.gwt.i18n.client.TimeZone; import com.google.gwt.i18n.shared.DateTimeFormat; import com.google.gwt.i18n.shared.DateTimeFormat.PredefinedFormat; -import com.vaadin.client.widget.escalator.FlyweightCell; +import com.vaadin.client.widget.grid.RendererCellReference; /** * A renderer for rendering dates into cells @@ -50,7 +50,7 @@ public class DateRenderer implements Renderer<Date> { } @Override - public void render(FlyweightCell cell, Date date) { + public void render(RendererCellReference cell, Date date) { String dateStr = format.format(date, timeZone); cell.getElement().setInnerText(dateStr); } diff --git a/client/src/com/vaadin/client/renderers/HtmlRenderer.java b/client/src/com/vaadin/client/renderers/HtmlRenderer.java index 7086c20345..df95e07367 100644 --- a/client/src/com/vaadin/client/renderers/HtmlRenderer.java +++ b/client/src/com/vaadin/client/renderers/HtmlRenderer.java @@ -17,7 +17,7 @@ package com.vaadin.client.renderers; import com.google.gwt.safehtml.shared.SafeHtml; import com.google.gwt.safehtml.shared.SafeHtmlUtils; -import com.vaadin.client.widget.escalator.FlyweightCell; +import com.vaadin.client.widget.grid.RendererCellReference; /** * Renders a string as HTML into a cell. @@ -34,7 +34,7 @@ import com.vaadin.client.widget.escalator.FlyweightCell; public class HtmlRenderer implements Renderer<String> { @Override - public void render(FlyweightCell cell, String htmlString) { + public void render(RendererCellReference cell, String htmlString) { cell.getElement().setInnerSafeHtml( SafeHtmlUtils.fromSafeConstant(htmlString)); } diff --git a/client/src/com/vaadin/client/renderers/ImageRenderer.java b/client/src/com/vaadin/client/renderers/ImageRenderer.java index 09c2befcc4..9b3d05ec0b 100644 --- a/client/src/com/vaadin/client/renderers/ImageRenderer.java +++ b/client/src/com/vaadin/client/renderers/ImageRenderer.java @@ -17,7 +17,7 @@ package com.vaadin.client.renderers; import com.google.gwt.core.client.GWT; import com.google.gwt.user.client.ui.Image; -import com.vaadin.client.widget.escalator.FlyweightCell; +import com.vaadin.client.widget.grid.RendererCellReference; /** * A renderer that renders an image into a cell. Click handlers can be added to @@ -37,7 +37,7 @@ public class ImageRenderer extends ClickableRenderer<String, Image> { } @Override - public void render(FlyweightCell cell, String url, Image image) { + public void render(RendererCellReference cell, String url, Image image) { image.setUrl(url); } } diff --git a/client/src/com/vaadin/client/renderers/NumberRenderer.java b/client/src/com/vaadin/client/renderers/NumberRenderer.java index ba0bd7d5bd..552a88644a 100644 --- a/client/src/com/vaadin/client/renderers/NumberRenderer.java +++ b/client/src/com/vaadin/client/renderers/NumberRenderer.java @@ -16,7 +16,7 @@ package com.vaadin.client.renderers; import com.google.gwt.i18n.client.NumberFormat; -import com.vaadin.client.widget.escalator.FlyweightCell; +import com.vaadin.client.widget.grid.RendererCellReference; /** * Renders a number into a cell using a specific {@link NumberFormat}. By @@ -65,7 +65,7 @@ public class NumberRenderer implements Renderer<Number> { } @Override - public void render(FlyweightCell cell, Number number) { + public void render(RendererCellReference cell, Number number) { cell.getElement().setInnerText(format.format(number)); } } diff --git a/client/src/com/vaadin/client/renderers/ProgressBarRenderer.java b/client/src/com/vaadin/client/renderers/ProgressBarRenderer.java index fb1d7ad22f..f5aff7191d 100644 --- a/client/src/com/vaadin/client/renderers/ProgressBarRenderer.java +++ b/client/src/com/vaadin/client/renderers/ProgressBarRenderer.java @@ -17,7 +17,7 @@ package com.vaadin.client.renderers; import com.google.gwt.core.shared.GWT; import com.vaadin.client.ui.VProgressBar; -import com.vaadin.client.widget.escalator.FlyweightCell; +import com.vaadin.client.widget.grid.RendererCellReference; /** * A Renderer that represents a double value as a graphical progress bar. @@ -33,7 +33,8 @@ public class ProgressBarRenderer extends WidgetRenderer<Double, VProgressBar> { } @Override - public void render(FlyweightCell cell, Double data, VProgressBar progressBar) { + public void render(RendererCellReference cell, Double data, + VProgressBar progressBar) { if (data == null) { progressBar.setEnabled(false); } else { diff --git a/client/src/com/vaadin/client/renderers/Renderer.java b/client/src/com/vaadin/client/renderers/Renderer.java index cf746ec130..7149181b61 100644 --- a/client/src/com/vaadin/client/renderers/Renderer.java +++ b/client/src/com/vaadin/client/renderers/Renderer.java @@ -16,7 +16,7 @@ package com.vaadin.client.renderers; import com.vaadin.client.widget.escalator.Cell; -import com.vaadin.client.widget.escalator.FlyweightCell; +import com.vaadin.client.widget.grid.RendererCellReference; import com.vaadin.client.widgets.Grid; /** @@ -44,5 +44,5 @@ public interface Renderer<T> { * @param data * The column data object */ - void render(FlyweightCell cell, T data); + void render(RendererCellReference cell, T data); } diff --git a/client/src/com/vaadin/client/renderers/TextRenderer.java b/client/src/com/vaadin/client/renderers/TextRenderer.java index e98088ede6..76ccd9f206 100644 --- a/client/src/com/vaadin/client/renderers/TextRenderer.java +++ b/client/src/com/vaadin/client/renderers/TextRenderer.java @@ -15,7 +15,7 @@ */ package com.vaadin.client.renderers; -import com.vaadin.client.widget.escalator.FlyweightCell; +import com.vaadin.client.widget.grid.RendererCellReference; /** * Renderer that renders text into a cell. @@ -26,7 +26,7 @@ import com.vaadin.client.widget.escalator.FlyweightCell; public class TextRenderer implements Renderer<String> { @Override - public void render(FlyweightCell cell, String text) { + public void render(RendererCellReference cell, String text) { cell.getElement().setInnerText(text); } } diff --git a/client/src/com/vaadin/client/renderers/WidgetRenderer.java b/client/src/com/vaadin/client/renderers/WidgetRenderer.java index 230de0ac00..ef0338ce70 100644 --- a/client/src/com/vaadin/client/renderers/WidgetRenderer.java +++ b/client/src/com/vaadin/client/renderers/WidgetRenderer.java @@ -18,7 +18,7 @@ package com.vaadin.client.renderers; import com.google.gwt.dom.client.TableCellElement; import com.google.gwt.user.client.ui.Widget; import com.vaadin.client.Util; -import com.vaadin.client.widget.escalator.FlyweightCell; +import com.vaadin.client.widget.grid.RendererCellReference; /** * A renderer for rendering widgets into cells. @@ -34,7 +34,7 @@ public abstract class WidgetRenderer<T, W extends Widget> extends ComplexRenderer<T> { @Override - public void init(FlyweightCell cell) { + public void init(RendererCellReference cell) { // Implement if needed } @@ -48,7 +48,7 @@ public abstract class WidgetRenderer<T, W extends Widget> extends public abstract W createWidget(); @Override - public void render(FlyweightCell cell, T data) { + public void render(RendererCellReference cell, T data) { W w = getWidget(cell.getElement()); assert w != null : "Widget not found in cell (" + cell.getColumn() + "," + cell.getRow() + ")"; @@ -68,7 +68,7 @@ public abstract class WidgetRenderer<T, W extends Widget> extends * @param widget * the widget embedded in the cell */ - public abstract void render(FlyweightCell cell, T data, W widget); + public abstract void render(RendererCellReference cell, T data, W widget); /** * Returns the widget contained inside the given cell element. Cannot be diff --git a/client/src/com/vaadin/client/widget/grid/RendererCellReference.java b/client/src/com/vaadin/client/widget/grid/RendererCellReference.java new file mode 100644 index 0000000000..be82fcb45e --- /dev/null +++ b/client/src/com/vaadin/client/widget/grid/RendererCellReference.java @@ -0,0 +1,86 @@ +/* + * 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.widget.grid; + +import com.google.gwt.dom.client.TableCellElement; +import com.vaadin.client.widget.escalator.FlyweightCell; +import com.vaadin.client.widgets.Grid; + +/** + * A data class which contains information which identifies a cell being + * rendered in a {@link Grid}. + * <p> + * Since this class follows the <code>Flyweight</code>-pattern any instance of + * this object is subject to change without the user knowing it and so should + * not be stored anywhere outside of the method providing these instances. + * + */ +public class RendererCellReference extends CellReference<Object> { + + /** + * Creates a new renderer cell reference bound to a row reference. + * + * @param rowReference + * the row reference to bind to + */ + public RendererCellReference(RowReference<Object> rowReference) { + super(rowReference); + } + + private FlyweightCell cell; + + /** + * Sets the identifying information for this cell. + * + * @param cell + * the flyweight cell to reference + * @param column + * the column to reference + */ + public void set(FlyweightCell cell, Grid.Column<?, ?> column) { + this.cell = cell; + super.set(cell.getColumn(), (Grid.Column<?, Object>) column); + } + + /** + * Returns the element of the cell. Can be either a <code>TD</code> element + * or a <code>TH</code> element. + * + * @return the element of the cell + */ + public TableCellElement getElement() { + return cell.getElement(); + } + + /** + * Sets the colspan attribute of the element of this cell. + * + * @param numberOfCells + * the number of columns that the cell should span + */ + public void setColSpan(int numberOfCells) { + cell.setColSpan(numberOfCells); + } + + /** + * Gets the colspan attribute of the element of this cell. + * + * @return the number of columns that the cell should span + */ + public int getColspan() { + return cell.getColSpan(); + } +} diff --git a/client/src/com/vaadin/client/widget/grid/selection/MultiSelectionRenderer.java b/client/src/com/vaadin/client/widget/grid/selection/MultiSelectionRenderer.java index d2cc06f753..525603a15b 100644 --- a/client/src/com/vaadin/client/widget/grid/selection/MultiSelectionRenderer.java +++ b/client/src/com/vaadin/client/widget/grid/selection/MultiSelectionRenderer.java @@ -35,7 +35,7 @@ import com.google.gwt.user.client.Event.NativePreviewHandler; import com.vaadin.client.Util; import com.vaadin.client.renderers.ComplexRenderer; import com.vaadin.client.widget.escalator.Cell; -import com.vaadin.client.widget.escalator.FlyweightCell; +import com.vaadin.client.widget.grid.RendererCellReference; import com.vaadin.client.widget.grid.selection.SelectionModel.Multi.Batched; import com.vaadin.client.widgets.Grid; @@ -551,18 +551,18 @@ public class MultiSelectionRenderer<T> extends ComplexRenderer<Boolean> { } @Override - public void init(FlyweightCell cell) { + public void init(RendererCellReference cell) { final InputElement checkbox = InputElement.as(DOM.createInputCheck()); cell.getElement().removeAllChildren(); cell.getElement().appendChild(checkbox); } @Override - public void render(final FlyweightCell cell, final Boolean data) { + public void render(final RendererCellReference cell, final Boolean data) { InputElement checkbox = InputElement.as(cell.getElement() .getFirstChildElement()); checkbox.setChecked(data.booleanValue()); - checkbox.setPropertyInt(LOGICAL_ROW_PROPERTY_INT, cell.getRow()); + checkbox.setPropertyInt(LOGICAL_ROW_PROPERTY_INT, cell.getRowIndex()); } @Override diff --git a/client/src/com/vaadin/client/widgets/Grid.java b/client/src/com/vaadin/client/widgets/Grid.java index 014cd800cb..f643fafbea 100644 --- a/client/src/com/vaadin/client/widgets/Grid.java +++ b/client/src/com/vaadin/client/widgets/Grid.java @@ -82,6 +82,7 @@ import com.vaadin.client.widget.grid.EditorHandler; import com.vaadin.client.widget.grid.EditorHandler.EditorRequest; import com.vaadin.client.widget.grid.EditorHandler.EditorRequest.RequestCallback; import com.vaadin.client.widget.grid.GridUtil; +import com.vaadin.client.widget.grid.RendererCellReference; import com.vaadin.client.widget.grid.RowReference; import com.vaadin.client.widget.grid.RowStyleGenerator; import com.vaadin.client.widget.grid.events.AbstractGridKeyEventHandler; @@ -2507,7 +2508,7 @@ public class Grid<T> extends ResizeComposite implements + "A more suitable renderer should be set using the setRenderer() method."; @Override - public void render(FlyweightCell cell, Object data) { + public void render(RendererCellReference cell, Object data) { if (!warned) { getLogger().warning( Column.this.toString() + ": " @@ -2979,11 +2980,16 @@ public class Grid<T> extends ResizeComposite implements @Override public void preAttach(Row row, Iterable<FlyweightCell> cellsToAttach) { + int rowIndex = row.getRow(); + rowReference.set(rowIndex, getDataSource().getRow(rowIndex)); for (FlyweightCell cell : cellsToAttach) { Renderer<?> renderer = findRenderer(cell); if (renderer instanceof ComplexRenderer) { try { - ((ComplexRenderer<?>) renderer).init(cell); + rendererCellReference.set(cell, + getColumn(cell.getColumn())); + ((ComplexRenderer<?>) renderer) + .init(rendererCellReference); } catch (RuntimeException e) { getLogger().log( Level.SEVERE, @@ -3104,27 +3110,30 @@ public class Grid<T> extends ResizeComposite implements Renderer renderer = column.getRenderer(); try { + rendererCellReference.set(cell, column); if (renderer instanceof ComplexRenderer) { // Hide cell content if needed ComplexRenderer clxRenderer = (ComplexRenderer) renderer; if (hasData) { if (!usedToHaveData) { // Prepare cell for rendering - clxRenderer.setContentVisible(cell, true); + clxRenderer.setContentVisible( + rendererCellReference, true); } Object value = column.getValue(rowData); - clxRenderer.render(cell, value); + clxRenderer.render(rendererCellReference, value); } else { // Prepare cell for no data - clxRenderer.setContentVisible(cell, false); + clxRenderer.setContentVisible( + rendererCellReference, false); } } else if (hasData) { // Simple renderers just render Object value = column.getValue(rowData); - renderer.render(cell, value); + renderer.render(rendererCellReference, value); } else { // Clear cell if there is no data @@ -3167,11 +3176,18 @@ public class Grid<T> extends ResizeComposite implements @Override public void postDetach(Row row, Iterable<FlyweightCell> detachedCells) { + int rowIndex = row.getRow(); + // Passing null row data since it might not exist in the data source + // any more + rowReference.set(rowIndex, null); for (FlyweightCell cell : detachedCells) { Renderer renderer = findRenderer(cell); if (renderer instanceof ComplexRenderer) { try { - ((ComplexRenderer) renderer).destroy(cell); + rendererCellReference.set(cell, + getColumn(cell.getColumn())); + ((ComplexRenderer) renderer) + .destroy(rendererCellReference); } catch (RuntimeException e) { getLogger().log( Level.SEVERE, @@ -4604,6 +4620,8 @@ public class Grid<T> extends ResizeComposite implements private RowStyleGenerator<T> rowStyleGenerator; private RowReference<T> rowReference = new RowReference<T>(this); private CellReference<T> cellReference = new CellReference<T>(rowReference); + private RendererCellReference rendererCellReference = new RendererCellReference( + (RowReference<Object>) rowReference); private boolean handleHeaderDefaultRowEvent(Event event, RowContainer container, final Cell cell) { |