Browse Source

Fix lost focus in Table when refreshing row cache (#12231)

svn changeset:25991/svn branch:6.8
svn changeset:26075/svn branch:6.8
svn changeset:26091/svn branch:6.8

Change-Id: Ia4a6ab4cc6ff98795a6d1f9b1701a345dc3f4dc4
tags/7.1.1
Tapio Aali 10 years ago
parent
commit
3229847265

+ 2
- 2
client/src/com/vaadin/client/ui/VScrollTable.java View File

@@ -194,7 +194,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets,

private SelectMode selectMode = SelectMode.NONE;

private final HashSet<String> selectedRowKeys = new HashSet<String>();
public final HashSet<String> selectedRowKeys = new HashSet<String>();

/*
* When scrolling and selecting at the same time, the selections are not in
@@ -568,7 +568,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets,
this.rowKey = rowKey;
this.left = left;
this.top = top;
this.closeRegistration = menu.addCloseHandler(this);
closeRegistration = menu.addCloseHandler(this);
}

@Override

+ 17
- 1
client/src/com/vaadin/client/ui/table/TableConnector.java View File

@@ -266,7 +266,23 @@ public class TableConnector extends AbstractHasComponentsConnector implements
if (!getWidget().focusedRow.isAttached()
&& !getWidget().rowRequestHandler.isRunning()) {
// focused row has been orphaned, can't focus
getWidget().focusRowFromBody();
if (getWidget().selectedRowKeys.contains(getWidget().focusedRow
.getKey())) {
// if row cache was refreshed, focused row should be
// in selection and exists with same index
getWidget().setRowFocus(
getWidget().getRenderedRowByKey(
getWidget().focusedRow.getKey()));
} else if (getWidget().selectedRowKeys.size() > 0) {
// try to focus any row in selection
getWidget().setRowFocus(
getWidget().getRenderedRowByKey(
getWidget().selectedRowKeys.iterator()
.next()));
} else {
// try to focus any row
getWidget().focusRowFromBody();
}
}
}


+ 61
- 0
tests/testbench/com/vaadin/tests/components/table/TableFocusOnRefreshRowCache.html View File

@@ -0,0 +1,61 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head profile="http://selenium-ide.openqa.org/profiles/test-case">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="selenium.base" href="http://localhost:8888/" />
<title>TableFocusOnRefreshRowCache</title>
</head>
<body>
<table cellpadding="1" cellspacing="1" border="1">
<thead>
<tr><td rowspan="1" colspan="3">TableFocusOnRefreshRowCache</td></tr>
</thead><tbody>
<tr>
<td>open</td>
<td>/run/com.vaadin.tests.components.table.TableFocusOnRefreshRowCache?restartApplication</td>
<td></td>
</tr>
<tr>
<td>scroll</td>
<td>vaadin=runcomvaadintestscomponentstableTableFocusOnRefreshRowCache::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VScrollTable[0]/domChild[1]</td>
<td>3161</td>
</tr>
<tr>
<td>pause</td>
<td>500</td>
<td></td>
</tr>
<tr>
<td>mouseClick</td>
<td>vaadin=runcomvaadintestscomponentstableTableFocusOnRefreshRowCache::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VScrollTable[0]/domChild[1]/domChild[0]/domChild[1]/domChild[0]/domChild[42]/domChild[0]/domChild[0]</td>
<td>186,-3151</td>
</tr>
<!-- Opera does some funky stuff with the row indices when this is run in
testbench, making it impossible to reliably test that the stylenames are
in the right location. Must instead just test that the stylename is not in
the position it was prior to fixing the bug, although that could never
fail in Opera since it looks at the wrong row
-->
<!--
<tr>
<td>assertCSSClass</td>
<td>vaadin=runcomvaadintestscomponentstableTableFocusOnRefreshRowCache::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VScrollTable[0]/domChild[1]/domChild[0]/domChild[1]/domChild[0]/domChild[35]</td>
<td>v-selected</td>
</tr>
<tr>
<td>assertCSSClass</td>
<td>vaadin=runcomvaadintestscomponentstableTableFocusOnRefreshRowCache::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VScrollTable[0]/domChild[1]/domChild[0]/domChild[1]/domChild[0]/domChild[35]</td>
<td>v-table-focus</td>
</tr>
-->
<!-- Test that the first row in the view does not get focus -->
<tr>
<td>assertNotCSSClass</td>
<td>vaadin=runcomvaadintestscomponentstableTableFocusOnRefreshRowCache::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VScrollTable[0]/domChild[1]/domChild[0]/domChild[1]/domChild[0]/domChild[23]</td>
<td>v-table-focus</td>
</tr>

</tbody></table>
</body>
</html>

+ 37
- 0
tests/testbench/com/vaadin/tests/components/table/TableFocusOnRefreshRowCache.java View File

@@ -0,0 +1,37 @@
package com.vaadin.tests.components.table;

import com.vaadin.event.ItemClickEvent;
import com.vaadin.event.ItemClickEvent.ItemClickListener;
import com.vaadin.tests.components.TestBase;
import com.vaadin.ui.Table;

public class TableFocusOnRefreshRowCache extends TestBase {

@Override
protected void setup() {
final Table table = new Table();
table.setSizeFull();
table.addContainerProperty("Name", String.class, null);
for (int i = 0; i < 200; i++) {
table.addItem(new Object[] { "Item " + i }, i);
}

table.setSelectable(true);
table.addListener(new ItemClickListener() {
public void itemClick(ItemClickEvent event) {
table.refreshRowCache();
}
});
addComponent(table);
}

@Override
protected String getDescription() {
return "Calling Table#refreshRowCache() loses cell focus";
}

@Override
protected Integer getTicketNumber() {
return 11797;
}
}

+ 1
- 1
uitest/src/com/vaadin/tests/components/table/MultiSelectWithRemovedRow.html View File

@@ -91,7 +91,7 @@
<tr>
<td>assertText</td>
<td>vaadin=runcomvaadintestscomponentstableMultiSelectWithRemovedRow::PID_SLog_row_0</td>
<td>4. Selection: [William, Averell, Bob, Grat]</td>
<td>4. Selection: [Averell, Bob, Grat]</td>
</tr>
<!--Sort + shift select down-->
<tr>

Loading…
Cancel
Save