summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArtur <artur@vaadin.com>2018-03-13 14:03:29 +0200
committerIlia Motornyi <elmot@vaadin.com>2018-03-13 15:03:29 +0300
commite813c97e0bdc00c5542c9bf0f55eef65f34ac093 (patch)
treedf2557a4a63a9de77234358e0c55bfc8ca1185ff
parent0af3b7d717b44b0de1af82143b3c3d3aece587ab (diff)
downloadvaadin-framework-e813c97e0bdc00c5542c9bf0f55eef65f34ac093.tar.gz
vaadin-framework-e813c97e0bdc00c5542c9bf0f55eef65f34ac093.zip
Setting of tooltips for grid header/footer cells (#10489)
Fixes #7527
-rw-r--r--client/src/main/java/com/vaadin/client/connectors/grid/GridConnector.java30
-rwxr-xr-xclient/src/main/java/com/vaadin/client/widgets/Grid.java80
-rw-r--r--server/src/main/java/com/vaadin/ui/components/grid/FooterCell.java57
-rw-r--r--server/src/main/java/com/vaadin/ui/components/grid/HeaderCell.java57
-rw-r--r--server/src/main/java/com/vaadin/ui/components/grid/StaticSection.java70
-rw-r--r--shared/src/main/java/com/vaadin/shared/ui/grid/SectionState.java7
-rw-r--r--uitest/src/main/java/com/vaadin/tests/components/grid/GridHeaderFooterTooltip.java113
-rw-r--r--uitest/src/test/java/com/vaadin/tests/components/grid/GridHeaderFooterTooltipTest.java93
8 files changed, 504 insertions, 3 deletions
diff --git a/client/src/main/java/com/vaadin/client/connectors/grid/GridConnector.java b/client/src/main/java/com/vaadin/client/connectors/grid/GridConnector.java
index 491aa0d9d2..b9521d06f5 100644
--- a/client/src/main/java/com/vaadin/client/connectors/grid/GridConnector.java
+++ b/client/src/main/java/com/vaadin/client/connectors/grid/GridConnector.java
@@ -59,6 +59,7 @@ import com.vaadin.client.widgets.Grid.Column;
import com.vaadin.client.widgets.Grid.FooterRow;
import com.vaadin.client.widgets.Grid.HeaderRow;
import com.vaadin.client.widgets.Grid.SelectionColumn;
+import com.vaadin.client.widgets.Grid.StaticSection.StaticCell;
import com.vaadin.shared.MouseEventDetails;
import com.vaadin.shared.data.sort.SortDirection;
import com.vaadin.shared.ui.Connect;
@@ -457,6 +458,8 @@ public class GridConnector extends AbstractListingConnector
"unexpected cell type: " + cellState.type);
}
cell.setStyleName(cellState.styleName);
+ cell.setDescription(cellState.description);
+ cell.setDescriptionContentMode(cellState.descriptionContentMode);
}
/**
@@ -677,7 +680,10 @@ public class GridConnector extends AbstractListingConnector
if (cell != null) {
JsonObject row = cell.getRow();
-
+ TooltipInfo tooltip = getHeaderFooterTooltip(cell);
+ if (tooltip != null) {
+ return tooltip;
+ }
if (row != null && (row.hasKey(GridState.JSONKEY_ROWDESCRIPTION)
|| row.hasKey(GridState.JSONKEY_CELLDESCRIPTION))) {
@@ -708,6 +714,28 @@ public class GridConnector extends AbstractListingConnector
return null;
}
+ private TooltipInfo getHeaderFooterTooltip(CellReference cell) {
+ Section section = Section.BODY;
+ if (cell instanceof EventCellReference) {
+ // Header or footer
+ section = ((EventCellReference) cell).getSection();
+ }
+ StaticCell staticCell = null;
+ if (section == Section.HEADER) {
+ staticCell = getWidget().getHeaderRow(cell.getRowIndex())
+ .getCell(cell.getColumn());
+ } else if (section == Section.FOOTER) {
+ staticCell = getWidget().getFooterRow(cell.getRowIndex())
+ .getCell(cell.getColumn());
+ }
+ if (staticCell != null && staticCell.getDescription() != null) {
+ return new TooltipInfo(staticCell.getDescription(),
+ staticCell.getDescriptionContentMode());
+ }
+
+ return null;
+ }
+
@Override
protected void sendContextClickEvent(MouseEventDetails details,
EventTarget eventTarget) {
diff --git a/client/src/main/java/com/vaadin/client/widgets/Grid.java b/client/src/main/java/com/vaadin/client/widgets/Grid.java
index e8baa981af..8a6d7abfdd 100755
--- a/client/src/main/java/com/vaadin/client/widgets/Grid.java
+++ b/client/src/main/java/com/vaadin/client/widgets/Grid.java
@@ -176,6 +176,7 @@ import com.vaadin.client.widgets.Grid.StaticSection.StaticRow;
import com.vaadin.shared.Range;
import com.vaadin.shared.Registration;
import com.vaadin.shared.data.sort.SortDirection;
+import com.vaadin.shared.ui.ContentMode;
import com.vaadin.shared.ui.grid.ColumnResizeMode;
import com.vaadin.shared.ui.grid.GridConstants;
import com.vaadin.shared.ui.grid.GridConstants.Section;
@@ -258,6 +259,10 @@ public class Grid<T> extends ResizeComposite implements HasSelectionHandlers<T>,
private String styleName = null;
+ private String description = null;
+
+ private ContentMode descriptionContentMode = ContentMode.TEXT;
+
/**
* Sets the text displayed in this cell.
*
@@ -426,11 +431,82 @@ public class Grid<T> extends ResizeComposite implements HasSelectionHandlers<T>,
* @since 7.6.3
*/
void detach() {
- if (this.content instanceof Widget) {
+ if (content instanceof Widget) {
// Widget in the cell, detach it
- section.getGrid().detachWidget((Widget) this.content);
+ section.getGrid().detachWidget((Widget) content);
}
}
+
+ /**
+ * Gets the tooltip for the cell.
+ * <p>
+ * The tooltip is shown in the mode returned by
+ * {@link #getDescriptionContentMode()}.
+ *
+ * @since
+ */
+ public String getDescription() {
+ return description;
+ }
+
+ /**
+ * Sets the tooltip for the cell.
+ * <p>
+ * By default, tooltips are shown as plain text. For HTML tooltips,
+ * see {@link #setDescription(String, ContentMode)} or
+ * {@link #setDescriptionContentMode(ContentMode)}.
+ *
+ * @param description
+ * the tooltip to show when hovering the cell
+ * @since
+ */
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ /**
+ * Sets the tooltip for the cell to be shown with the given content
+ * mode.
+ *
+ * @see ContentMode
+ * @param description
+ * the tooltip to show when hovering the cell
+ * @param descriptionContentMode
+ * the content mode to use for the tooltip (HTML or plain
+ * text)
+ * @since
+ */
+ public void setDescription(String description,
+ ContentMode descriptionContentMode) {
+ setDescription(description);
+ setDescriptionContentMode(descriptionContentMode);
+ }
+
+ /**
+ * Gets the content mode for the tooltip.
+ * <p>
+ * The content mode determines how the tooltip is shown.
+ *
+ * @see ContentMode
+ * @return the content mode for the tooltip
+ * @since
+ */
+ public ContentMode getDescriptionContentMode() {
+ return descriptionContentMode;
+ }
+
+ /**
+ * Sets the content mode for the tooltip.
+ *
+ * @see ContentMode
+ * @param descriptionContentMode
+ * the content mode for the tooltip
+ * @since
+ */
+ public void setDescriptionContentMode(
+ ContentMode descriptionContentMode) {
+ this.descriptionContentMode = descriptionContentMode;
+ }
}
/**
diff --git a/server/src/main/java/com/vaadin/ui/components/grid/FooterCell.java b/server/src/main/java/com/vaadin/ui/components/grid/FooterCell.java
index d9777cbb77..9c4a38bc77 100644
--- a/server/src/main/java/com/vaadin/ui/components/grid/FooterCell.java
+++ b/server/src/main/java/com/vaadin/ui/components/grid/FooterCell.java
@@ -17,6 +17,7 @@ package com.vaadin.ui.components.grid;
import java.io.Serializable;
+import com.vaadin.shared.ui.ContentMode;
import com.vaadin.shared.ui.grid.GridStaticCellType;
import com.vaadin.ui.Component;
@@ -102,4 +103,60 @@ public interface FooterCell extends Serializable {
* the style name to set or null to not use any style name
*/
public void setStyleName(String styleName);
+
+ /**
+ * Gets the tooltip for the cell.
+ * <p>
+ * The tooltip is shown in the mode returned by
+ * {@link #getDescriptionContentMode()}.
+ *
+ * @since
+ */
+ public String getDescription();
+
+ /**
+ * Sets the tooltip for the cell.
+ * <p>
+ * By default, tooltips are shown as plain text. For HTML tooltips, see
+ * {@link #setDescription(String, ContentMode)} or
+ * {@link #setDescriptionContentMode(ContentMode)}.
+ *
+ * @param description
+ * the tooltip to show when hovering the cell
+ * @since
+ */
+ public void setDescription(String description);
+
+ /**
+ * Sets the tooltip for the cell to be shown with the given content mode.
+ *
+ * @see ContentMode
+ * @param description
+ * the tooltip to show when hovering the cell
+ * @param descriptionContentMode
+ * the content mode to use for the tooltip (HTML or plain text)
+ * @since
+ */
+ public void setDescription(String description,
+ ContentMode descriptionContentMode);
+
+ /**
+ * Gets the content mode for the tooltip.
+
+ * @see ContentMode
+ * @return the content mode for the tooltip
+ * @since
+ */
+ public ContentMode getDescriptionContentMode();
+
+ /**
+ * Sets the content mode for the tooltip.
+ *
+ * @see ContentMode
+ * @param descriptionContentMode
+ * the content mode for the tooltip
+ * @since
+ */
+ public void setDescriptionContentMode(ContentMode descriptionContentMode);
+
}
diff --git a/server/src/main/java/com/vaadin/ui/components/grid/HeaderCell.java b/server/src/main/java/com/vaadin/ui/components/grid/HeaderCell.java
index 6801622740..79f25b6dea 100644
--- a/server/src/main/java/com/vaadin/ui/components/grid/HeaderCell.java
+++ b/server/src/main/java/com/vaadin/ui/components/grid/HeaderCell.java
@@ -17,6 +17,7 @@ package com.vaadin.ui.components.grid;
import java.io.Serializable;
+import com.vaadin.shared.ui.ContentMode;
import com.vaadin.shared.ui.grid.GridStaticCellType;
import com.vaadin.ui.Component;
@@ -102,4 +103,60 @@ public interface HeaderCell extends Serializable {
* the style name to set or null to not use any style name
*/
public void setStyleName(String styleName);
+
+ /**
+ * Gets the tooltip for the cell.
+ * <p>
+ * The tooltip is shown in the mode returned by
+ * {@link #getDescriptionContentMode()}.
+ *
+ * @since
+ */
+ public String getDescription();
+
+ /**
+ * Sets the tooltip for the cell.
+ * <p>
+ * By default, tooltips are shown as plain text. For HTML tooltips, see
+ * {@link #setDescription(String, ContentMode)} or
+ * {@link #setDescriptionContentMode(ContentMode)}.
+ *
+ * @param description
+ * the tooltip to show when hovering the cell
+ * @since
+ */
+ public void setDescription(String description);
+
+ /**
+ * Sets the tooltip for the cell to be shown with the given content mode.
+ *
+ * @see ContentMode
+ * @param description
+ * the tooltip to show when hovering the cell
+ * @param descriptionContentMode
+ * the content mode to use for the tooltip (HTML or plain text)
+ * @since
+ */
+ public void setDescription(String description,
+ ContentMode descriptionContentMode);
+
+ /**
+ * Gets the content mode for the tooltip.
+ * <p>
+ *
+ * @see ContentMode
+ * @return the content mode for the tooltip
+ * @since
+ */
+ public ContentMode getDescriptionContentMode();
+
+ /**
+ * Sets the content mode for the tooltip.
+ *
+ * @see ContentMode
+ * @param descriptionContentMode
+ * the content mode for the tooltip
+ * @since
+ */
+ public void setDescriptionContentMode(ContentMode descriptionContentMode);
}
diff --git a/server/src/main/java/com/vaadin/ui/components/grid/StaticSection.java b/server/src/main/java/com/vaadin/ui/components/grid/StaticSection.java
index ec25339931..40ade7e97e 100644
--- a/server/src/main/java/com/vaadin/ui/components/grid/StaticSection.java
+++ b/server/src/main/java/com/vaadin/ui/components/grid/StaticSection.java
@@ -35,6 +35,7 @@ import java.util.stream.Stream;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
+import com.vaadin.shared.ui.ContentMode;
import com.vaadin.shared.ui.grid.GridStaticCellType;
import com.vaadin.shared.ui.grid.SectionState;
import com.vaadin.shared.ui.grid.SectionState.CellState;
@@ -615,6 +616,75 @@ public abstract class StaticSection<ROW extends StaticSection.StaticRow<?>>
void detach() {
removeComponentIfPresent();
}
+
+ /**
+ * Gets the tooltip for the cell.
+ * <p>
+ * The tooltip is shown in the mode returned by
+ * {@link #getDescriptionContentMode()}.
+ *
+ * @since
+ */
+ public String getDescription() {
+ return cellState.description;
+ }
+
+ /**
+ * Sets the tooltip for the cell.
+ * <p>
+ * By default, tooltips are shown as plain text. For HTML tooltips, see
+ * {@link #setDescription(String, ContentMode)} or
+ * {@link #setDescriptionContentMode(ContentMode)}.
+ *
+ * @param description
+ * the tooltip to show when hovering the cell
+ * @since
+ */
+ public void setDescription(String description) {
+ cellState.description = description;
+ }
+
+ /**
+ * Sets the tooltip for the cell to be shown with the given content
+ * mode.
+ *
+ * @see ContentMode
+ * @param description
+ * the tooltip to show when hovering the cell
+ * @param descriptionContentMode
+ * the content mode to use for the tooltip (HTML or plain
+ * text)
+ * @since
+ */
+ public void setDescription(String description,
+ ContentMode descriptionContentMode) {
+ setDescription(description);
+ setDescriptionContentMode(descriptionContentMode);
+ }
+
+ /**
+ * Gets the content mode for the tooltip.
+ *
+ * @see ContentMode
+ * @return the content mode for the tooltip
+ * @since
+ */
+ public ContentMode getDescriptionContentMode() {
+ return cellState.descriptionContentMode;
+ }
+
+ /**
+ * Sets the content mode for the tooltip.
+ *
+ * @see ContentMode
+ * @param descriptionContentMode
+ * the content mode for the tooltip
+ * @since
+ */
+ public void setDescriptionContentMode(
+ ContentMode descriptionContentMode) {
+ cellState.descriptionContentMode = descriptionContentMode;
+ }
}
private final List<ROW> rows = new ArrayList<>();
diff --git a/shared/src/main/java/com/vaadin/shared/ui/grid/SectionState.java b/shared/src/main/java/com/vaadin/shared/ui/grid/SectionState.java
index a76c6927b6..ba9a44677e 100644
--- a/shared/src/main/java/com/vaadin/shared/ui/grid/SectionState.java
+++ b/shared/src/main/java/com/vaadin/shared/ui/grid/SectionState.java
@@ -23,6 +23,7 @@ import java.util.Map;
import java.util.Set;
import com.vaadin.shared.Connector;
+import com.vaadin.shared.ui.ContentMode;
/**
* Shared state for Grid headers and footers.
@@ -75,6 +76,12 @@ public class SectionState implements Serializable {
/** The id of the column that this cell belongs to. */
public String columnId;
+
+ /** The tooltip for the cell */
+ public String description;
+
+ /** The content mode for the tooltip for the cell */
+ public ContentMode descriptionContentMode = ContentMode.TEXT;
}
/** The rows in this section. */
diff --git a/uitest/src/main/java/com/vaadin/tests/components/grid/GridHeaderFooterTooltip.java b/uitest/src/main/java/com/vaadin/tests/components/grid/GridHeaderFooterTooltip.java
new file mode 100644
index 0000000000..c5684e6311
--- /dev/null
+++ b/uitest/src/main/java/com/vaadin/tests/components/grid/GridHeaderFooterTooltip.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright 2000-2016 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.tests.components.grid;
+
+import com.vaadin.annotations.Widgetset;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.shared.ui.ContentMode;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.tests.data.bean.Person;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Grid;
+import com.vaadin.ui.Grid.Column;
+import com.vaadin.ui.Grid.SelectionMode;
+import com.vaadin.ui.HorizontalLayout;
+import com.vaadin.ui.components.grid.FooterRow;
+import com.vaadin.ui.components.grid.HeaderCell;
+import com.vaadin.ui.components.grid.HeaderRow;
+
+@Widgetset("com.vaadin.DefaultWidgetSet")
+public class GridHeaderFooterTooltip extends AbstractTestUI {
+
+ private static final long serialVersionUID = -2787771187365766027L;
+
+ private HeaderRow row;
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ Grid<Person> grid = new Grid<>(Person.class);
+ grid.setWidth("600px");
+
+ grid.setSelectionMode(SelectionMode.SINGLE);
+ addComponent(grid);
+
+ grid.getDefaultHeaderRow().getCell("firstName").setDescription(
+ "Text: Header tooltip for <b>first</b> name", ContentMode.TEXT);
+ grid.getDefaultHeaderRow().getCell("lastName").setDescription(
+ "HTML: Header tooltip for <b>last</b> name", ContentMode.HTML);
+ grid.getDefaultHeaderRow().getCell("deceased").setDescription(
+ "PRE\nHeader tooltip for\n<b>deceased</b>",
+ ContentMode.PREFORMATTED);
+ grid.setDescription("Tooltip for the whole grid");
+
+ FooterRow footer = grid.addFooterRowAt(0);
+ footer.getCell("firstName").setDescription(
+ "Text: Footer tooltip for <b>first</b> name", ContentMode.TEXT);
+ footer.getCell("lastName").setDescription(
+ "HTML: Footer tooltip for <b>last</b> name", ContentMode.HTML);
+ footer.getCell("deceased").setDescription(
+ "PRE\nFooter tooltip for\n<b>deceased</b>",
+ ContentMode.PREFORMATTED);
+
+ grid.setItems(Person.createTestPerson1(), Person.createTestPerson2());
+
+ Button showHide = new Button("Hide firstName", event -> {
+ Column<Person, ?> column = grid.getColumn("firstName");
+ if (grid.getColumn("firstName") != null) {
+ grid.removeColumn(column);
+ event.getButton().setCaption("Show firstName");
+ } else {
+ grid.addColumn(Person::getFirstName).setId("firstName");
+ grid.setColumnOrder(grid.getColumn("firstName"),
+ grid.getColumn("lastName"),
+ grid.getColumn("streetAddress"), grid.getColumn("zip"),
+ grid.getColumn("city"));
+
+ event.getButton().setCaption("Hide firstName");
+ }
+ });
+ showHide.setId("show_hide");
+
+ Button join = new Button("Add Join header column", event -> {
+ if (row == null) {
+ row = grid.prependHeaderRow();
+ HeaderCell joinedCell = row.join(
+ grid.getDefaultHeaderRow()
+ .getCell(grid.getColumn("firstName")),
+ grid.getDefaultHeaderRow()
+ .getCell(grid.getColumn("lastName")));
+ joinedCell.setText("Full Name");
+ joinedCell.setDescription("Full name tooltip");
+ } else {
+ grid.removeHeaderRow(row);
+ row = null;
+ }
+ });
+ join.setId("join");
+ addComponent(new HorizontalLayout(showHide, join));
+ }
+
+ @Override
+ protected String getTestDescription() {
+ return "Grid for testing header re-rendering.";
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 17131;
+ }
+
+}
diff --git a/uitest/src/test/java/com/vaadin/tests/components/grid/GridHeaderFooterTooltipTest.java b/uitest/src/test/java/com/vaadin/tests/components/grid/GridHeaderFooterTooltipTest.java
new file mode 100644
index 0000000000..8752196e1c
--- /dev/null
+++ b/uitest/src/test/java/com/vaadin/tests/components/grid/GridHeaderFooterTooltipTest.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2000-2016 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.tests.components.grid;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.vaadin.testbench.elements.ButtonElement;
+import com.vaadin.testbench.elements.GridElement;
+import com.vaadin.testbench.elements.GridElement.GridCellElement;
+import com.vaadin.tests.tb3.SingleBrowserTest;
+
+public class GridHeaderFooterTooltipTest extends SingleBrowserTest {
+
+ private GridElement grid;
+
+ @Override
+ public void setup() throws Exception {
+ super.setup();
+ openTestURL();
+ grid = $(GridElement.class).first();
+ }
+
+ @Test
+ public void headerTooltipShown() {
+ GridCellElement lastName = grid.getHeaderCell(0, 0);
+ GridCellElement firstName = grid.getHeaderCell(0, 1);
+ GridCellElement deceased = grid.getHeaderCell(0, 2);
+
+ lastName.showTooltip();
+ Assert.assertEquals("HTML: Header tooltip for last name",
+ getTooltipElement().getText());
+
+ firstName.showTooltip();
+ Assert.assertEquals("Text: Header tooltip for <b>first</b> name",
+ getTooltipElement().getText());
+
+ deceased.showTooltip();
+ Assert.assertEquals("PRE\nHeader tooltip for\n<b>deceased</b>",
+ getTooltipElement().getText());
+ }
+
+ @Test
+ public void headerWithoutTooltipShowsGridTooltip() {
+ GridCellElement otherHeader = grid.getHeaderCell(0, 3);
+
+ otherHeader.showTooltip();
+ Assert.assertEquals("Tooltip for the whole grid",
+ getTooltipElement().getText());
+
+ }
+
+ @Test
+ public void joinedHeaderTooltipShown() {
+ $(ButtonElement.class).id("join").click();
+ GridCellElement fullName = grid.getHeaderCell(0, 0);
+ fullName.showTooltip();
+ Assert.assertEquals("Full name tooltip", getTooltipElement().getText());
+ }
+
+ @Test
+ public void footerTooltipShown() {
+ GridCellElement lastName = grid.getFooterCell(0, 0);
+ GridCellElement firstName = grid.getFooterCell(0, 1);
+ GridCellElement deceased = grid.getFooterCell(0, 2);
+
+ lastName.showTooltip();
+ Assert.assertEquals("HTML: Footer tooltip for last name",
+ getTooltipElement().getText());
+
+ firstName.showTooltip();
+ Assert.assertEquals("Text: Footer tooltip for <b>first</b> name",
+ getTooltipElement().getText());
+
+ deceased.showTooltip();
+ Assert.assertEquals("PRE\nFooter tooltip for\n<b>deceased</b>",
+ getTooltipElement().getText());
+
+ }
+}