summaryrefslogtreecommitdiffstats
path: root/client/src
diff options
context:
space:
mode:
authorLeif Åstrand <leif@vaadin.com>2014-12-18 10:17:58 +0200
committerLeif Åstrand <leif@vaadin.com>2014-12-18 10:56:05 +0200
commit12f3e377766e19566aba10b6cc3c5c84b8d3d363 (patch)
tree506b283f8ca64a9919e08d79b6796c4c988c6b6e /client/src
parentcf1c05d0c6f829a2333d4ef744e8f9e1aa6d3dad (diff)
downloadvaadin-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')
-rw-r--r--client/src/com/vaadin/client/connectors/UnsafeHtmlRendererConnector.java4
-rw-r--r--client/src/com/vaadin/client/renderers/ButtonRenderer.java4
-rw-r--r--client/src/com/vaadin/client/renderers/ComplexRenderer.java10
-rw-r--r--client/src/com/vaadin/client/renderers/DateRenderer.java4
-rw-r--r--client/src/com/vaadin/client/renderers/HtmlRenderer.java4
-rw-r--r--client/src/com/vaadin/client/renderers/ImageRenderer.java4
-rw-r--r--client/src/com/vaadin/client/renderers/NumberRenderer.java4
-rw-r--r--client/src/com/vaadin/client/renderers/ProgressBarRenderer.java5
-rw-r--r--client/src/com/vaadin/client/renderers/Renderer.java4
-rw-r--r--client/src/com/vaadin/client/renderers/TextRenderer.java4
-rw-r--r--client/src/com/vaadin/client/renderers/WidgetRenderer.java8
-rw-r--r--client/src/com/vaadin/client/widget/grid/RendererCellReference.java86
-rw-r--r--client/src/com/vaadin/client/widget/grid/selection/MultiSelectionRenderer.java8
-rw-r--r--client/src/com/vaadin/client/widgets/Grid.java32
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) {