Change-Id: I837ee83a75337eef4338e7206cdd0e366b24f183tags/7.6.0.alpha4
if (uidl.hasVariable("selected")) { | if (uidl.hasVariable("selected")) { | ||||
final Set<String> selectedKeys = uidl | final Set<String> selectedKeys = uidl | ||||
.getStringArrayVariableAsSet("selected"); | .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) { | if (scrollBody != null) { | ||||
Iterator<Widget> iterator = scrollBody.iterator(); | Iterator<Widget> iterator = scrollBody.iterator(); | ||||
while (iterator.hasNext()) { | while (iterator.hasNext()) { | ||||
selected = true; | selected = true; | ||||
keyboardSelectionOverRowFetchInProgress = true; | keyboardSelectionOverRowFetchInProgress = true; | ||||
} | } | ||||
if (selected && selectedKeys.size() == 1) { | |||||
if (selected && selectedKeys.size() == 1 && updateFocus) { | |||||
/* | /* | ||||
* If a single item is selected, move focus to the | * If a single item is selected, move focus to the | ||||
* selected row. (#10522) | * selected row. (#10522) | ||||
return keyboardSelectionOverRowFetchInProgress; | return keyboardSelectionOverRowFetchInProgress; | ||||
} | } | ||||
private void removeUnselectedRowKeys(final Set<String> selectedKeys) { | |||||
private boolean removeUnselectedRowKeys(final Set<String> selectedKeys) { | |||||
List<String> unselectedKeys = new ArrayList<String>(0); | List<String> unselectedKeys = new ArrayList<String>(0); | ||||
for (String key : selectedRowKeys) { | for (String key : selectedRowKeys) { | ||||
if (!selectedKeys.contains(key)) { | if (!selectedKeys.contains(key)) { | ||||
unselectedKeys.add(key); | unselectedKeys.add(key); | ||||
} | } | ||||
} | } | ||||
selectedRowKeys.removeAll(unselectedKeys); | |||||
return selectedRowKeys.removeAll(unselectedKeys); | |||||
} | } | ||||
/** For internal use only. May be removed or replaced in the future. */ | /** For internal use only. May be removed or replaced in the future. */ |
/* | |||||
* 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."; | |||||
} | |||||
} |
/* | |||||
* 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()); | |||||
} | |||||
} |