From 887eead6bfa56de25f5b6514b2eafe698b3e9947 Mon Sep 17 00:00:00 2001
From: John Ahlroos
Date: Thu, 12 Dec 2013 16:49:49 +0200
Subject: [PATCH] Support custom renderers for header, footer and column group
cells #12993
Change-Id: I95f126ad83b9b7245dd4e123ab35c4f147e2910d
---
.../vaadin/client/ui/grid/ColumnGroup.java | 71 ++++++++-
.../src/com/vaadin/client/ui/grid/Grid.java | 137 +++++++++++++++++-
.../ui/grid/renderers/TextRenderer.java | 33 +++++
3 files changed, 234 insertions(+), 7 deletions(-)
create mode 100644 client/src/com/vaadin/client/ui/grid/renderers/TextRenderer.java
diff --git a/client/src/com/vaadin/client/ui/grid/ColumnGroup.java b/client/src/com/vaadin/client/ui/grid/ColumnGroup.java
index 0b9cbee13c..e48656bc6b 100644
--- a/client/src/com/vaadin/client/ui/grid/ColumnGroup.java
+++ b/client/src/com/vaadin/client/ui/grid/ColumnGroup.java
@@ -21,11 +21,16 @@ import java.util.Collection;
import java.util.Collections;
import java.util.List;
+import com.vaadin.client.ui.grid.renderers.TextRenderer;
+
/**
* Column groups are used to group columns together for adding common auxiliary
* headers and footers. Columns groups are added to {@link ColumnGroupRow
* ColumnGroupRows}.
*
+ * @param
+ * The row type of the grid. The row type is the POJO type from where
+ * the data is retrieved into the column cells.
* @since 7.2
* @author Vaadin Ltd
*/
@@ -41,6 +46,16 @@ public class ColumnGroup {
*/
private String footer;
+ /**
+ * Renders the header cells for the column group
+ */
+ private Renderer headerRenderer = new TextRenderer();
+
+ /**
+ * Renders the footer cells for the column group
+ */
+ private Renderer footerRenderer = new TextRenderer();
+
/**
* The columns included in the group when also accounting for subgroup
* columns
@@ -50,12 +65,12 @@ public class ColumnGroup {
/**
* The grid associated with the column group
*/
- private final Grid grid;
+ private final Grid grid;
/**
* Constructs a new column group
*/
- ColumnGroup(Grid grid, Collection> columns) {
+ ColumnGroup(Grid grid, Collection> columns) {
if (columns == null) {
throw new IllegalArgumentException(
"columns cannot be null. Pass an empty list instead.");
@@ -114,4 +129,56 @@ public class ColumnGroup {
public List> getColumns() {
return columns;
}
+
+ /**
+ * Returns the renderer used for rendering the header cells
+ *
+ * @return a renderer that renders header cells
+ */
+ public Renderer getHeaderRenderer() {
+ return headerRenderer;
+ }
+
+ /**
+ * Sets the renderer that renders header cells.
+ *
+ * @param renderer
+ * The renderer to use for rendering header cells. Must not be
+ * null.
+ * @throws IllegalArgumentException
+ * thrown when renderer is null
+ */
+ public void setHeaderRenderer(Renderer renderer) {
+ if (renderer == null) {
+ throw new IllegalArgumentException("Renderer cannot be null.");
+ }
+ this.headerRenderer = renderer;
+ grid.refreshHeader();
+ }
+
+ /**
+ * Returns the renderer used for rendering the footer cells
+ *
+ * @return a renderer that renders footer cells
+ */
+ public Renderer getFooterRenderer() {
+ return footerRenderer;
+ }
+
+ /**
+ * Sets the renderer that renders footer cells.
+ *
+ * @param renderer
+ * The renderer to use for rendering footer cells. Must not be
+ * null.
+ * @throws IllegalArgumentException
+ * thrown when renderer is null
+ */
+ public void setFooterRenderer(Renderer renderer) {
+ if (renderer == null) {
+ throw new IllegalArgumentException("Renderer cannot be null.");
+ }
+ this.footerRenderer = renderer;
+ grid.refreshFooter();
+ }
}
diff --git a/client/src/com/vaadin/client/ui/grid/Grid.java b/client/src/com/vaadin/client/ui/grid/Grid.java
index 7cb9db9782..2dbb0275cd 100644
--- a/client/src/com/vaadin/client/ui/grid/Grid.java
+++ b/client/src/com/vaadin/client/ui/grid/Grid.java
@@ -26,6 +26,7 @@ import com.google.gwt.user.client.ui.HasVisibility;
import com.google.gwt.user.client.ui.Widget;
import com.vaadin.client.data.DataChangeHandler;
import com.vaadin.client.data.DataSource;
+import com.vaadin.client.ui.grid.renderers.TextRenderer;
import com.vaadin.shared.util.SharedUtil;
/**
@@ -54,6 +55,9 @@ import com.vaadin.shared.util.SharedUtil;
* TODO Explain about what a data source is and how it should be implemented.
*
*
+ * @param
+ * The row type of the grid. The row type is the POJO type from where
+ * the data is retrieved into the column cells.
* @since 7.2
* @author Vaadin Ltd
*/
@@ -132,7 +136,7 @@ public class Grid extends Composite {
/**
* Renderer for rendering a value into the cell
*/
- private Renderer renderer = new Renderer() {
+ private Renderer bodyRenderer = new Renderer() {
@Override
public void renderCell(Cell cell, C value) {
@@ -147,6 +151,16 @@ public class Grid extends Composite {
}
};
+ /**
+ * Renderer for rendering the header cell value into the cell
+ */
+ private Renderer headerRenderer = new TextRenderer();
+
+ /**
+ * Renderer for rendering the footer cell value into the cell
+ */
+ private Renderer footerRenderer = new TextRenderer();
+
/**
* Constructs a new column.
*/
@@ -164,7 +178,29 @@ public class Grid extends Composite {
if (renderer == null) {
throw new IllegalArgumentException("Renderer cannot be null.");
}
- this.renderer = renderer;
+ this.bodyRenderer = renderer;
+ }
+
+ /**
+ * Constructs a new column with custom renderers for rows, header and
+ * footer cells.
+ *
+ * @param bodyRenderer
+ * The renderer to use for rendering body cells
+ * @param headerRenderer
+ * The renderer to use for rendering header cells
+ * @param footerRenderer
+ * The renderer to use for rendering footer cells
+ */
+ public AbstractGridColumn(Renderer bodyRenderer,
+ Renderer headerRenderer, Renderer footerRenderer) {
+ this(bodyRenderer);
+ if (headerRenderer == null || footerRenderer == null) {
+ throw new IllegalArgumentException("Renderer cannot be null.");
+ }
+
+ this.headerRenderer = headerRenderer;
+ this.footerRenderer = footerRenderer;
}
/**
@@ -197,6 +233,56 @@ public class Grid extends Composite {
return header;
}
+ /**
+ * Returns the renderer used for rendering the header cells
+ *
+ * @return a renderer that renders header cells
+ */
+ public Renderer getHeaderRenderer() {
+ return headerRenderer;
+ }
+
+ /**
+ * Sets the renderer that renders header cells. Should not be null.
+ *
+ * @param renderer
+ * The renderer to use for rendering header cells.
+ */
+ public void setHeaderRenderer(Renderer renderer) {
+ if (renderer == null) {
+ throw new IllegalArgumentException("Renderer cannot be null.");
+ }
+ headerRenderer = renderer;
+ if (grid != null) {
+ grid.refreshHeader();
+ }
+ }
+
+ /**
+ * Returns the renderer used for rendering the footer cells
+ *
+ * @return a renderer that renders footer cells
+ */
+ public Renderer getFooterRenderer() {
+ return footerRenderer;
+ }
+
+ /**
+ * Sets the renderer that renders footer cells. Should not be null.
+ *
+ * @param renderer
+ * The renderer to use for rendering footer cells.
+ */
+ public void setFooterRenderer(Renderer renderer) {
+ if (renderer == null) {
+ throw new IllegalArgumentException("Renderer cannot be null.");
+ }
+ footerRenderer = renderer;
+ if (grid != null) {
+ grid.refreshFooter();
+ }
+ }
+
/**
* Sets the text in the header of the column.
*
@@ -306,7 +392,7 @@ public class Grid extends Composite {
* @return The renderer to render the cell content with
*/
public Renderer getRenderer() {
- return renderer;
+ return bodyRenderer;
}
/**
@@ -417,6 +503,25 @@ public class Grid extends Composite {
*/
public abstract boolean firstRowIsVisible();
+ /**
+ * The renderer that renders the cell
+ *
+ * @param column
+ * The column for which the cell should be rendered
+ *
+ * @return renderer used for rendering
+ */
+ public abstract Renderer getRenderer(GridColumn, T> column);
+
+ /**
+ * The renderer that renders the cell for column groups
+ *
+ * @param group
+ * The group that should be rendered
+ * @return renderer used for rendering
+ */
+ public abstract Renderer getGroupRenderer(ColumnGroup group);
+
@Override
public void updateCells(Row row, Iterable cellsToUpdate) {
@@ -433,7 +538,8 @@ public class Grid extends Composite {
GridColumn, T> column = getColumnFromVisibleIndex(cell
.getColumn());
if (column != null) {
- cell.getElement().setInnerText(getColumnValue(column));
+ getRenderer(column).renderCell(cell,
+ getColumnValue(column));
}
}
@@ -465,7 +571,8 @@ public class Grid extends Composite {
Element cellElement = cell.getElement();
if (group != null) {
- cellElement.setInnerText(getGroupValue(group));
+ getGroupRenderer(group).renderCell(cell,
+ getGroupValue(group));
cell.setColSpan(group.getColumns().size());
} else {
// Cells are reused
@@ -542,6 +649,16 @@ public class Grid extends Composite {
public boolean firstRowIsVisible() {
return isColumnHeadersVisible();
}
+
+ @Override
+ public Renderer getRenderer(GridColumn, T> column) {
+ return column.getHeaderRenderer();
+ }
+
+ @Override
+ public Renderer getGroupRenderer(ColumnGroup group) {
+ return group.getHeaderRenderer();
+ }
};
}
@@ -608,6 +725,16 @@ public class Grid extends Composite {
public boolean firstRowIsVisible() {
return isColumnFootersVisible();
}
+
+ @Override
+ public Renderer getRenderer(GridColumn, T> column) {
+ return column.getFooterRenderer();
+ }
+
+ @Override
+ public Renderer getGroupRenderer(ColumnGroup group) {
+ return group.getFooterRenderer();
+ }
};
}
diff --git a/client/src/com/vaadin/client/ui/grid/renderers/TextRenderer.java b/client/src/com/vaadin/client/ui/grid/renderers/TextRenderer.java
new file mode 100644
index 0000000000..1f06a555c3
--- /dev/null
+++ b/client/src/com/vaadin/client/ui/grid/renderers/TextRenderer.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.client.ui.grid.renderers;
+
+import com.vaadin.client.ui.grid.Cell;
+import com.vaadin.client.ui.grid.Renderer;
+
+/**
+ * Renderer that renders text into a cell.
+ *
+ * @since 7.2
+ * @author Vaadin Ltd
+ */
+public class TextRenderer implements Renderer {
+
+ @Override
+ public void renderCell(Cell cell, String text) {
+ cell.getElement().setInnerText(text);
+ }
+}
--
2.39.5
|