Change-Id: I837ee83a75337eef4338e7206cdd0e366b24f183tags/7.6.0.alpha4
@@ -1295,8 +1295,12 @@ public class VScrollTable extends FlowPanel implements HasWidgets, | |||
if (uidl.hasVariable("selected")) { | |||
final Set<String> selectedKeys = uidl | |||
.getStringArrayVariableAsSet("selected"); | |||
removeUnselectedRowKeys(selectedKeys); | |||
// Do not update focus if there is a single selected row | |||
// that is the same as the previous selection. This prevents | |||
// unwanted scrolling (#18247). | |||
boolean rowsUnSelected = removeUnselectedRowKeys(selectedKeys); | |||
boolean updateFocus = rowsUnSelected || selectedRowKeys.size() == 0 | |||
|| focusedRow == null; | |||
if (scrollBody != null) { | |||
Iterator<Widget> iterator = scrollBody.iterator(); | |||
while (iterator.hasNext()) { | |||
@@ -1313,7 +1317,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets, | |||
selected = true; | |||
keyboardSelectionOverRowFetchInProgress = true; | |||
} | |||
if (selected && selectedKeys.size() == 1) { | |||
if (selected && selectedKeys.size() == 1 && updateFocus) { | |||
/* | |||
* If a single item is selected, move focus to the | |||
* selected row. (#10522) | |||
@@ -1338,14 +1342,14 @@ public class VScrollTable extends FlowPanel implements HasWidgets, | |||
return keyboardSelectionOverRowFetchInProgress; | |||
} | |||
private void removeUnselectedRowKeys(final Set<String> selectedKeys) { | |||
private boolean removeUnselectedRowKeys(final Set<String> selectedKeys) { | |||
List<String> unselectedKeys = new ArrayList<String>(0); | |||
for (String key : selectedRowKeys) { | |||
if (!selectedKeys.contains(key)) { | |||
unselectedKeys.add(key); | |||
} | |||
} | |||
selectedRowKeys.removeAll(unselectedKeys); | |||
return selectedRowKeys.removeAll(unselectedKeys); | |||
} | |||
/** For internal use only. May be removed or replaced in the future. */ |
@@ -0,0 +1,51 @@ | |||
/* | |||
* 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.tests.components.treetable; | |||
import com.vaadin.server.VaadinRequest; | |||
import com.vaadin.tests.components.AbstractTestUI; | |||
import com.vaadin.ui.TreeTable; | |||
public class TreeTableScrollOnExpand extends AbstractTestUI { | |||
@Override | |||
protected void setup(VaadinRequest request) { | |||
TreeTable t = new TreeTable(); | |||
t.setSelectable(true); | |||
t.setImmediate(true); | |||
t.setSizeFull(); | |||
t.addContainerProperty("Name", String.class, "null"); | |||
for (int i = 1; i <= 100; i++) { | |||
String parentID = "Item " + i; | |||
Object parent = t.addItem(new Object[] { parentID }, parentID); | |||
String childID = "Item " + (100 + i); | |||
Object child = t.addItem(new Object[] { childID }, childID); | |||
t.getContainerDataSource().setParent(childID, parentID); | |||
} | |||
addComponent(t); | |||
} | |||
@Override | |||
public Integer getTicketNumber() { | |||
return 18247; | |||
} | |||
@Override | |||
public String getTestDescription() { | |||
return "After selecting an item and scrolling it out of view, TreeTable should not scroll to the " | |||
+ "selected item when expanding an item."; | |||
} | |||
} |
@@ -0,0 +1,46 @@ | |||
/* | |||
* 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.tests.components.treetable; | |||
import static org.junit.Assert.assertEquals; | |||
import java.io.IOException; | |||
import org.junit.Test; | |||
import org.openqa.selenium.By; | |||
import org.openqa.selenium.WebElement; | |||
import com.vaadin.testbench.elements.TreeTableElement; | |||
import com.vaadin.tests.tb3.MultiBrowserTest; | |||
public class TreeTableScrollOnExpandTest extends MultiBrowserTest { | |||
@Test | |||
public void testScrollOnExpand() throws InterruptedException, IOException { | |||
openTestURL(); | |||
TreeTableElement tt = $(TreeTableElement.class).first(); | |||
tt.getRow(0).click(); | |||
tt.scroll(300); | |||
sleep(1000); | |||
tt.getRow(20).toggleExpanded(); | |||
// Need to wait a bit to avoid accepting the case where the TreeTable is | |||
// in the desired state only for a short while. | |||
sleep(1000); | |||
WebElement focusedRow = getDriver().findElement( | |||
By.className("v-table-focus")); | |||
assertEquals("Item 21", focusedRow.getText()); | |||
} | |||
} |