From d87c6f72508a4c76c0c2274bccaf4191bb5fa204 Mon Sep 17 00:00:00 2001 From: Artur Signell Date: Wed, 28 Nov 2012 20:36:03 +0200 Subject: Fixed tooltip handling for Table (#9088) Change-Id: I0de74785fbc9eb68f958875031df59f1c61c8ec2 --- client/src/com/vaadin/client/ui/VScrollTable.java | 60 ++-- client/src/com/vaadin/client/ui/VTreeTable.java | 4 +- server/src/com/vaadin/ui/Table.java | 3 +- .../table/TableItemDescriptionGeneratorTest.html | 358 +++++++++++++++++++++ .../table/TableItemDescriptionGeneratorTest.java | 84 ++++- 5 files changed, 466 insertions(+), 43 deletions(-) create mode 100644 uitest/src/com/vaadin/tests/components/table/TableItemDescriptionGeneratorTest.html diff --git a/client/src/com/vaadin/client/ui/VScrollTable.java b/client/src/com/vaadin/client/ui/VScrollTable.java index 55ad533132..e0bd159951 100644 --- a/client/src/com/vaadin/client/ui/VScrollTable.java +++ b/client/src/com/vaadin/client/ui/VScrollTable.java @@ -4722,7 +4722,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets, .getPaintable((UIDL) cell); addCell(uidl, cellContent.getWidget(), aligns[col++], - style, sorted); + style, sorted, description); } } } @@ -4859,13 +4859,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets, break; } } - - if (description != null && !description.equals("")) { - TooltipInfo info = new TooltipInfo(description); - cellToolTips.put(td, info); - } else { - cellToolTips.remove(td); - } + setTooltip(td, description); td.appendChild(container); getElement().appendChild(td); @@ -4886,9 +4880,20 @@ public class VScrollTable extends FlowPanel implements HasWidgets, } public void addCell(UIDL rowUidl, Widget w, char align, - String style, boolean sorted) { + String style, boolean sorted, String description) { final TableCellElement td = DOM.createTD().cast(); initCellWithWidget(w, align, style, sorted, td); + setTooltip(td, description); + } + + private void setTooltip(TableCellElement td, String description) { + if (description != null && !description.equals("")) { + TooltipInfo info = new TooltipInfo(description); + cellToolTips.put(td, info); + } else { + cellToolTips.remove(td); + } + } protected void initCellWithWidget(Widget w, char align, @@ -4995,10 +5000,10 @@ public class VScrollTable extends FlowPanel implements HasWidgets, com.google.gwt.dom.client.Element target) { TooltipInfo info = null; - - if (target.hasTagName("TD")) { - - TableCellElement td = (TableCellElement) target.cast(); + final Element targetTdOrTr = getTdOrTr((Element) target.cast()); + if ("td".equals(targetTdOrTr.getTagName().toLowerCase())) { + TableCellElement td = (TableCellElement) targetTdOrTr + .cast(); info = cellToolTips.get(td); } @@ -5009,6 +5014,22 @@ public class VScrollTable extends FlowPanel implements HasWidgets, return info; } + private Element getTdOrTr(Element target) { + Element thisTrElement = getElement(); + if (target == thisTrElement) { + // This was a on the TR element + return target; + } + + // Iterate upwards until we find the TR element + Element element = target; + while (element != null + && element.getParentElement().cast() != thisTrElement) { + element = element.getParentElement().cast(); + } + return element; + } + /** * Special handler for touch devices that support native scrolling * @@ -5533,18 +5554,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets, return null; } } - if (eventTarget == thisTrElement) { - // This was a click on the TR element - return thisTrElement; - } - - // Iterate upwards until we find the TR element - Element element = eventTarget; - while (element != null - && element.getParentElement().cast() != thisTrElement) { - element = element.getParentElement().cast(); - } - return element; + return getTdOrTr(eventTarget); } public void showContextMenu(Event event) { diff --git a/client/src/com/vaadin/client/ui/VTreeTable.java b/client/src/com/vaadin/client/ui/VTreeTable.java index f4e3974505..d4bfa9698d 100644 --- a/client/src/com/vaadin/client/ui/VTreeTable.java +++ b/client/src/com/vaadin/client/ui/VTreeTable.java @@ -219,8 +219,8 @@ public class VTreeTable extends VScrollTable { @Override public void addCell(UIDL rowUidl, Widget w, char align, - String style, boolean isSorted) { - super.addCell(rowUidl, w, align, style, isSorted); + String style, boolean isSorted, String description) { + super.addCell(rowUidl, w, align, style, isSorted, description); if (addTreeSpacer(rowUidl)) { widgetInHierarchyColumn = w; } diff --git a/server/src/com/vaadin/ui/Table.java b/server/src/com/vaadin/ui/Table.java index 1b72035e54..c0814b8481 100644 --- a/server/src/com/vaadin/ui/Table.java +++ b/server/src/com/vaadin/ui/Table.java @@ -3503,14 +3503,13 @@ public class Table extends AbstractSelect implements Action.Container, + currentColumn][indexInRowbuffer]; if (c == null) { target.addText(""); - paintCellTooltips(target, itemId, columnId); } else { LegacyPaint.paint(c, target); } } else { target.addText((String) cells[CELL_FIRSTCOL + currentColumn][indexInRowbuffer]); - paintCellTooltips(target, itemId, columnId); } + paintCellTooltips(target, itemId, columnId); } target.endTag("tr"); diff --git a/uitest/src/com/vaadin/tests/components/table/TableItemDescriptionGeneratorTest.html b/uitest/src/com/vaadin/tests/components/table/TableItemDescriptionGeneratorTest.html new file mode 100644 index 0000000000..eb3efc28fd --- /dev/null +++ b/uitest/src/com/vaadin/tests/components/table/TableItemDescriptionGeneratorTest.html @@ -0,0 +1,358 @@ + + + + + + +New Test + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
New Test
open/run/TableItemDescriptionGeneratorTest?restartApplication
mouseMoveAtvaadin=runTableItemDescriptionGeneratorTest::PID_Stable/domChild[1]/domChild[0]/domChild[1]/domChild[0]/domChild[1]/domChild[0]/domChild[0]22,7
waitForElementPresentvaadin=runTableItemDescriptionGeneratorTest::Root/VTooltip[0]
assertTextvaadin=runTableItemDescriptionGeneratorTest::Root/VTooltip[0]/FlowPanel[0]/domChild[1]Cell description item 1,Text
mouseMoveAtvaadin=runTableItemDescriptionGeneratorTest::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/domChild[3]22,7
waitForElementNotPresentvaadin=runTableItemDescriptionGeneratorTest::Root/VTooltip[0]
mouseMoveAtvaadin=runTableItemDescriptionGeneratorTest::PID_Stable/FocusableScrollPanel[0]/VScrollTable$VScrollTableBody[0]/VScrollTable$VScrollTableBody$VScrollTableRow[1]/VButton[0]/domChild[0]/domChild[0]22,7
waitForElementPresentvaadin=runTableItemDescriptionGeneratorTest::Root/VTooltip[0]
assertTextvaadin=runTableItemDescriptionGeneratorTest::Root/VTooltip[0]/FlowPanel[0]/domChild[1]Button 1 description
mouseMoveAtvaadin=runTableItemDescriptionGeneratorTest::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/domChild[3]22,7
waitForElementNotPresentvaadin=runTableItemDescriptionGeneratorTest::Root/VTooltip[0]
mouseMoveAtvaadin=runTableItemDescriptionGeneratorTest::PID_Stable/FocusableScrollPanel[0]/VScrollTable$VScrollTableBody[0]/VScrollTable$VScrollTableBody$VScrollTableRow[1]/VTextField[0]22,7
waitForElementPresentvaadin=runTableItemDescriptionGeneratorTest::Root/VTooltip[0]
assertTextvaadin=runTableItemDescriptionGeneratorTest::Root/VTooltip[0]/FlowPanel[0]/domChild[1]Textfield's own description
mouseMoveAtvaadin=runTableItemDescriptionGeneratorTest::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/domChild[3]22,7
waitForElementNotPresentvaadin=runTableItemDescriptionGeneratorTest::Root/VTooltip[0]
mouseClickvaadin=runTableItemDescriptionGeneratorTest::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/VOrderedLayout$Slot[0]/VCheckBox[0]/domChild[0]12,6
mouseMoveAtvaadin=runTableItemDescriptionGeneratorTest::PID_Stable/domChild[1]/domChild[0]/domChild[1]/domChild[0]/domChild[1]/domChild[0]/domChild[0]22,7
waitForElementPresentvaadin=runTableItemDescriptionGeneratorTest::Root/VTooltip[0]
assertTextvaadin=runTableItemDescriptionGeneratorTest::Root/VTooltip[0]/FlowPanel[0]/domChild[1]Cell description item 1,Text
mouseMoveAtvaadin=runTableItemDescriptionGeneratorTest::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/domChild[3]22,7
waitForElementNotPresentvaadin=runTableItemDescriptionGeneratorTest::Root/VTooltip[0]
mouseMoveAtvaadin=runTableItemDescriptionGeneratorTest::PID_Stable/FocusableScrollPanel[0]/VScrollTable$VScrollTableBody[0]/VScrollTable$VScrollTableBody$VScrollTableRow[1]/VButton[0]/domChild[0]/domChild[0]22,7
waitForElementPresentvaadin=runTableItemDescriptionGeneratorTest::Root/VTooltip[0]
assertTextvaadin=runTableItemDescriptionGeneratorTest::Root/VTooltip[0]/FlowPanel[0]/domChild[1]Cell description item 1,Component
mouseMoveAtvaadin=runTableItemDescriptionGeneratorTest::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/domChild[3]22,7
waitForElementNotPresentvaadin=runTableItemDescriptionGeneratorTest::Root/VTooltip[0]
mouseMoveAtvaadin=runTableItemDescriptionGeneratorTest::PID_Stable/FocusableScrollPanel[0]/VScrollTable$VScrollTableBody[0]/VScrollTable$VScrollTableBody$VScrollTableRow[1]/VTextField[0]22,7
waitForElementPresentvaadin=runTableItemDescriptionGeneratorTest::Root/VTooltip[0]
assertTextvaadin=runTableItemDescriptionGeneratorTest::Root/VTooltip[0]/FlowPanel[0]/domChild[1]Cell description item 1,Generated component
mouseMoveAtvaadin=runTableItemDescriptionGeneratorTest::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/domChild[3]22,7
waitForElementNotPresentvaadin=runTableItemDescriptionGeneratorTest::Root/VTooltip[0]
mouseClickvaadin=runTableItemDescriptionGeneratorTest::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/VOrderedLayout$Slot[0]/VCheckBox[0]/domChild[0]7,8
mouseClickvaadin=runTableItemDescriptionGeneratorTest::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VCheckBox[0]/domChild[0]7,5
mouseMoveAtvaadin=runTableItemDescriptionGeneratorTest::PID_Stable/domChild[1]/domChild[0]/domChild[1]/domChild[0]/domChild[1]/domChild[0]/domChild[0]22,7
waitForElementPresentvaadin=runTableItemDescriptionGeneratorTest::Root/VTooltip[0]
assertTextvaadin=runTableItemDescriptionGeneratorTest::Root/VTooltip[0]/FlowPanel[0]/domChild[1]Row description item 1
mouseMoveAtvaadin=runTableItemDescriptionGeneratorTest::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/domChild[3]22,7
waitForElementNotPresentvaadin=runTableItemDescriptionGeneratorTest::Root/VTooltip[0]
mouseMoveAtvaadin=runTableItemDescriptionGeneratorTest::PID_Stable/FocusableScrollPanel[0]/VScrollTable$VScrollTableBody[0]/VScrollTable$VScrollTableBody$VScrollTableRow[1]/VButton[0]/domChild[0]/domChild[0]22,7
waitForElementPresentvaadin=runTableItemDescriptionGeneratorTest::Root/VTooltip[0]
assertTextvaadin=runTableItemDescriptionGeneratorTest::Root/VTooltip[0]/FlowPanel[0]/domChild[1]Button 1 description
mouseMoveAtvaadin=runTableItemDescriptionGeneratorTest::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/domChild[3]22,7
waitForElementNotPresentvaadin=runTableItemDescriptionGeneratorTest::Root/VTooltip[0]
mouseMoveAtvaadin=runTableItemDescriptionGeneratorTest::PID_Stable/FocusableScrollPanel[0]/VScrollTable$VScrollTableBody[0]/VScrollTable$VScrollTableBody$VScrollTableRow[1]/VTextField[0]22,7
waitForElementPresentvaadin=runTableItemDescriptionGeneratorTest::Root/VTooltip[0]
assertTextvaadin=runTableItemDescriptionGeneratorTest::Root/VTooltip[0]/FlowPanel[0]/domChild[1]Textfield's own description
mouseMoveAtvaadin=runTableItemDescriptionGeneratorTest::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/domChild[3]22,7
waitForElementNotPresentvaadin=runTableItemDescriptionGeneratorTest::Root/VTooltip[0]
mouseClickvaadin=runTableItemDescriptionGeneratorTest::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/VOrderedLayout$Slot[0]/VCheckBox[0]/domChild[0]7,8
mouseMoveAtvaadin=runTableItemDescriptionGeneratorTest::PID_Stable/domChild[1]/domChild[0]/domChild[1]/domChild[0]/domChild[1]/domChild[0]/domChild[0]22,7
waitForElementPresentvaadin=runTableItemDescriptionGeneratorTest::Root/VTooltip[0]
assertTextvaadin=runTableItemDescriptionGeneratorTest::Root/VTooltip[0]/FlowPanel[0]/domChild[1]Row description item 1
mouseMoveAtvaadin=runTableItemDescriptionGeneratorTest::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/domChild[3]22,7
waitForElementNotPresentvaadin=runTableItemDescriptionGeneratorTest::Root/VTooltip[0]
mouseMoveAtvaadin=runTableItemDescriptionGeneratorTest::PID_Stable/FocusableScrollPanel[0]/VScrollTable$VScrollTableBody[0]/VScrollTable$VScrollTableBody$VScrollTableRow[1]/VButton[0]/domChild[0]/domChild[0]22,7
waitForElementPresentvaadin=runTableItemDescriptionGeneratorTest::Root/VTooltip[0]
assertTextvaadin=runTableItemDescriptionGeneratorTest::Root/VTooltip[0]/FlowPanel[0]/domChild[1]Row description item 1
mouseMoveAtvaadin=runTableItemDescriptionGeneratorTest::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/domChild[3]22,7
waitForElementNotPresentvaadin=runTableItemDescriptionGeneratorTest::Root/VTooltip[0]
mouseMoveAtvaadin=runTableItemDescriptionGeneratorTest::PID_Stable/FocusableScrollPanel[0]/VScrollTable$VScrollTableBody[0]/VScrollTable$VScrollTableBody$VScrollTableRow[1]/VTextField[0]22,7
waitForElementPresentvaadin=runTableItemDescriptionGeneratorTest::Root/VTooltip[0]
assertTextvaadin=runTableItemDescriptionGeneratorTest::Root/VTooltip[0]/FlowPanel[0]/domChild[1]Row description item 1
mouseMoveAtvaadin=runTableItemDescriptionGeneratorTest::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/domChild[3]22,7
waitForElementNotPresentvaadin=runTableItemDescriptionGeneratorTest::Root/VTooltip[0]
+ + diff --git a/uitest/src/com/vaadin/tests/components/table/TableItemDescriptionGeneratorTest.java b/uitest/src/com/vaadin/tests/components/table/TableItemDescriptionGeneratorTest.java index e7176add0a..ec81194f14 100644 --- a/uitest/src/com/vaadin/tests/components/table/TableItemDescriptionGeneratorTest.java +++ b/uitest/src/com/vaadin/tests/components/table/TableItemDescriptionGeneratorTest.java @@ -2,50 +2,101 @@ package com.vaadin.tests.components.table; import com.vaadin.data.Container; import com.vaadin.data.Item; +import com.vaadin.data.Property.ValueChangeEvent; +import com.vaadin.data.Property.ValueChangeListener; import com.vaadin.data.util.IndexedContainer; import com.vaadin.tests.components.TestBase; import com.vaadin.ui.AbstractSelect.ItemDescriptionGenerator; +import com.vaadin.ui.Button; +import com.vaadin.ui.CheckBox; import com.vaadin.ui.Component; import com.vaadin.ui.Table; import com.vaadin.ui.TextField; public class TableItemDescriptionGeneratorTest extends TestBase { - private final String COLUMN1_PROPERTY_ID = "Text - Cell description"; - private final String COLUMN2_PROPERTY_ID = "Text - Row description"; - private final String COLUMN3_PROPERTY_ID = "Widget"; + private final String TEXT_PROPERTY_ID = "Text"; + private final String GEN_WIDGET_PROPERTY_ID = "Generated component"; + private final String WIDGET_PROPERTY_ID = "Component"; + private CheckBox componentDescription; + private CheckBox tableCellItemDescription; + private CheckBox tableRowItemDescription; @Override protected void setup() { - final Table table = new Table(); + final Table table = createTable(); table.setId("table"); - table.setContainerDataSource(createContainer()); + componentDescription = new CheckBox("Tooltip on components"); + componentDescription.addValueChangeListener(new ValueChangeListener() { + + @Override + public void valueChange(ValueChangeEvent event) { + table.setContainerDataSource(createContainer(componentDescription + .getValue())); + } + }); + componentDescription.setImmediate(true); + componentDescription.setValue(true); + tableCellItemDescription = new CheckBox("Tooltip on table cells"); + tableCellItemDescription + .addValueChangeListener(new ValueChangeListener() { + + @Override + public void valueChange(ValueChangeEvent event) { + table.refreshRowCache(); + } + }); + tableCellItemDescription.setImmediate(true); + tableCellItemDescription.setValue(true); + + tableRowItemDescription = new CheckBox("Tooltip on table Rows"); + tableRowItemDescription + .addValueChangeListener(new ValueChangeListener() { + + @Override + public void valueChange(ValueChangeEvent event) { + table.refreshRowCache(); + } + }); + tableRowItemDescription.setImmediate(true); + tableRowItemDescription.setValue(true); + + addComponent(componentDescription); + addComponent(tableCellItemDescription); + addComponent(tableRowItemDescription); addComponent(table); table.setItemDescriptionGenerator(new ItemDescriptionGenerator() { @Override public String generateDescription(Component source, Object itemId, Object propertyId) { - if (propertyId == null) { + if (propertyId == null && tableRowItemDescription.getValue()) { return "Row description " + itemId; - } else if (propertyId == COLUMN1_PROPERTY_ID) { + } else if (tableCellItemDescription.getValue()) { return "Cell description " + itemId + "," + propertyId; } return null; } }); - table.addGeneratedColumn(COLUMN3_PROPERTY_ID, + table.addGeneratedColumn(GEN_WIDGET_PROPERTY_ID, new Table.ColumnGenerator() { @Override public Component generateCell(Table source, Object itemId, Object columnId) { TextField lbl = new TextField(); - lbl.setDescription("Textfields own description"); + if (componentDescription.getValue()) { + lbl.setDescription("Textfield's own description"); + } return lbl; } }); + + } + + protected Table createTable() { + return new Table(); } @Override @@ -58,17 +109,22 @@ public class TableItemDescriptionGeneratorTest extends TestBase { return 5414; } - private Container createContainer() { + private Container createContainer(boolean description) { IndexedContainer container = new IndexedContainer(); - container.addContainerProperty(COLUMN1_PROPERTY_ID, String.class, ""); - container.addContainerProperty(COLUMN2_PROPERTY_ID, String.class, ""); + container.addContainerProperty(TEXT_PROPERTY_ID, String.class, ""); + container.addContainerProperty(WIDGET_PROPERTY_ID, Component.class, + null); // container.addContainerProperty(COLUMN3_PROPERTY_ID, String.class, // ""); for (int i = 0; i < 5; i++) { Item item = container.addItem("item " + i); - item.getItemProperty(COLUMN1_PROPERTY_ID).setValue("first" + i); - item.getItemProperty(COLUMN2_PROPERTY_ID).setValue("middle" + i); + item.getItemProperty(TEXT_PROPERTY_ID).setValue("Text " + i); + Button b = new Button("Button " + i); + if (description) { + b.setDescription("Button " + i + " description"); + } + item.getItemProperty(WIDGET_PROPERTY_ID).setValue(b); // item.getItemProperty(COLUMN3_PROPERTY_ID).setValue("last" + i); } -- cgit v1.2.3