return false; | return false; | ||||
} | } | ||||
} | } | ||||
/** | |||||
* Scrolls an element into view vertically only. Modified version of | |||||
* Element.scrollIntoView. | |||||
* | |||||
* @param elem | |||||
* The element to scroll into view | |||||
*/ | |||||
public static native void scrollIntoViewVertically(Element elem) | |||||
/*-{ | |||||
var top = elem.offsetTop; | |||||
var height = elem.offsetHeight; | |||||
if (elem.parentNode != elem.offsetParent) { | |||||
top -= elem.parentNode.offsetTop; | |||||
} | |||||
var cur = elem.parentNode; | |||||
while (cur && (cur.nodeType == 1)) { | |||||
if (top < cur.scrollTop) { | |||||
cur.scrollTop = top; | |||||
} | |||||
if (top + height > cur.scrollTop + cur.clientHeight) { | |||||
cur.scrollTop = (top + height) - cur.clientHeight; | |||||
} | |||||
var offsetTop = cur.offsetTop; | |||||
if (cur.parentNode != cur.offsetParent) { | |||||
offsetTop -= cur.parentNode.offsetTop; | |||||
} | |||||
top += offsetTop - cur.scrollTop; | |||||
cur = cur.parentNode; | |||||
} | |||||
}-*/; | |||||
} | } |
* The row to ensure is visible | * The row to ensure is visible | ||||
*/ | */ | ||||
private void ensureRowIsVisible(VScrollTableRow row) { | private void ensureRowIsVisible(VScrollTableRow row) { | ||||
scrollIntoViewVertically(row.getElement()); | |||||
Util.scrollIntoViewVertically(row.getElement()); | |||||
} | } | ||||
/** | |||||
* Scrolls an element into view vertically only. Modified version of | |||||
* Element.scrollIntoView. | |||||
* | |||||
* @param elem | |||||
* The element to scroll into view | |||||
*/ | |||||
private native void scrollIntoViewVertically(Element elem) | |||||
/*-{ | |||||
var top = elem.offsetTop; | |||||
var height = elem.offsetHeight; | |||||
if (elem.parentNode != elem.offsetParent) { | |||||
top -= elem.parentNode.offsetTop; | |||||
} | |||||
var cur = elem.parentNode; | |||||
while (cur && (cur.nodeType == 1)) { | |||||
if (top < cur.scrollTop) { | |||||
cur.scrollTop = top; | |||||
} | |||||
if (top + height > cur.scrollTop + cur.clientHeight) { | |||||
cur.scrollTop = (top + height) - cur.clientHeight; | |||||
} | |||||
var offsetTop = cur.offsetTop; | |||||
if (cur.parentNode != cur.offsetParent) { | |||||
offsetTop -= cur.parentNode.offsetTop; | |||||
} | |||||
top += offsetTop - cur.scrollTop; | |||||
cur = cur.parentNode; | |||||
} | |||||
}-*/; | |||||
/** | /** | ||||
* Handles the keyboard events handled by the table | * Handles the keyboard events handled by the table | ||||
* | * |
* Scrolls the caption into view | * Scrolls the caption into view | ||||
*/ | */ | ||||
public void scrollIntoView() { | public void scrollIntoView() { | ||||
nodeCaptionDiv.scrollIntoView(); | |||||
Util.scrollIntoViewVertically(nodeCaptionDiv); | |||||
} | } | ||||
} | } |
<?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="" /> | |||||
<title>TreeKeyboardNavigationScroll</title> | |||||
</head> | |||||
<body> | |||||
<table cellpadding="1" cellspacing="1" border="1"> | |||||
<thead> | |||||
<tr><td rowspan="1" colspan="3">New Test</td></tr> | |||||
</thead><tbody> | |||||
<tr> | |||||
<td>open</td> | |||||
<td>/run/com.vaadin.tests.components.tree.TreeKeyboardNavigationScrolls?restartApplication</td> | |||||
<td></td> | |||||
</tr> | |||||
<tr> | |||||
<td>mouseClick</td> | |||||
<td>vaadin=runcomvaadintestscomponentstreeTreeKeyboardNavigationScrolls::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTree[0]#n[0]</td> | |||||
<td>4,3</td> | |||||
</tr> | |||||
<tr> | |||||
<td>pressSpecialKey</td> | |||||
<td>vaadin=runcomvaadintestscomponentstreeTreeKeyboardNavigationScrolls::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTree[0]/domChild[1]</td> | |||||
<td>right</td> | |||||
</tr> | |||||
<tr> | |||||
<td>pressSpecialKey</td> | |||||
<td>vaadin=runcomvaadintestscomponentstreeTreeKeyboardNavigationScrolls::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTree[0]/domChild[1]</td> | |||||
<td>down</td> | |||||
</tr> | |||||
<tr> | |||||
<td>pressSpecialKey</td> | |||||
<td>vaadin=runcomvaadintestscomponentstreeTreeKeyboardNavigationScrolls::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTree[0]/domChild[1]</td> | |||||
<td>down</td> | |||||
</tr> | |||||
<tr> | |||||
<td>pressSpecialKey</td> | |||||
<td>vaadin=runcomvaadintestscomponentstreeTreeKeyboardNavigationScrolls::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTree[0]/domChild[1]</td> | |||||
<td>down</td> | |||||
</tr> | |||||
<tr> | |||||
<td>pressSpecialKey</td> | |||||
<td>vaadin=runcomvaadintestscomponentstreeTreeKeyboardNavigationScrolls::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTree[0]/domChild[1]</td> | |||||
<td>right</td> | |||||
</tr> | |||||
<tr> | |||||
<td>pressSpecialKey</td> | |||||
<td>vaadin=runcomvaadintestscomponentstreeTreeKeyboardNavigationScrolls::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTree[0]/domChild[1]</td> | |||||
<td>down</td> | |||||
</tr> | |||||
<tr> | |||||
<td>pressSpecialKey</td> | |||||
<td>vaadin=runcomvaadintestscomponentstreeTreeKeyboardNavigationScrolls::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTree[0]/domChild[1]</td> | |||||
<td>down</td> | |||||
</tr> | |||||
<tr> | |||||
<td>pressSpecialKey</td> | |||||
<td>vaadin=runcomvaadintestscomponentstreeTreeKeyboardNavigationScrolls::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTree[0]/domChild[1]</td> | |||||
<td>down</td> | |||||
</tr> | |||||
<tr> | |||||
<td>pressSpecialKey</td> | |||||
<td>vaadin=runcomvaadintestscomponentstreeTreeKeyboardNavigationScrolls::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTree[0]/domChild[1]</td> | |||||
<td>right</td> | |||||
</tr> | |||||
<tr> | |||||
<td>pressSpecialKey</td> | |||||
<td>vaadin=runcomvaadintestscomponentstreeTreeKeyboardNavigationScrolls::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTree[0]/domChild[1]</td> | |||||
<td>down</td> | |||||
</tr> | |||||
<tr> | |||||
<td>pressSpecialKey</td> | |||||
<td>vaadin=runcomvaadintestscomponentstreeTreeKeyboardNavigationScrolls::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTree[0]/domChild[1]</td> | |||||
<td>down</td> | |||||
</tr> | |||||
<tr> | |||||
<td>screenCapture</td> | |||||
<td></td> | |||||
<td>noscroll</td> | |||||
</tr> | |||||
</tbody></table> | |||||
</body> | |||||
</html> |
/* | |||||
@ITMillApache2LicenseForJavaFiles@ | |||||
*/ | |||||
package com.vaadin.tests.components.tree; | |||||
import com.vaadin.data.Container; | |||||
import com.vaadin.data.util.HierarchicalContainer; | |||||
import com.vaadin.data.validator.AbstractValidator; | |||||
import com.vaadin.tests.components.TestBase; | |||||
import com.vaadin.ui.Tree; | |||||
public class TreeKeyboardNavigationScrolls extends TestBase { | |||||
@Override | |||||
protected void setup() { | |||||
Tree tree = new Tree(); | |||||
tree.setContainerDataSource(generateHierarchicalContainer()); | |||||
tree.setImmediate(true); | |||||
tree.addValidator(new AbstractValidator("failed") { | |||||
public boolean isValid(Object value) { | |||||
return false; | |||||
} | |||||
}); | |||||
addComponent(tree); | |||||
} | |||||
private Container generateHierarchicalContainer() { | |||||
HierarchicalContainer cont = new HierarchicalContainer(); | |||||
for (int i = 1; i < 6; i++) { | |||||
cont.addItem(i); | |||||
for (int j = 1; j < 3; j++) { | |||||
String id = i | |||||
+ " foo bar baz make this node really wide so that we don't have to fiddle with resizing the browser window -> what would you do if you had one of your legs on backwards? it's legs time! everybody get your legs! " | |||||
+ j; | |||||
cont.addItem(id); | |||||
cont.setChildrenAllowed(id, false); | |||||
cont.setParent(id, i); | |||||
} | |||||
} | |||||
return cont; | |||||
} | |||||
@Override | |||||
protected String getDescription() { | |||||
return "The tree scrolls right if the focused node is too wide when navigating with the keyboard"; | |||||
} | |||||
@Override | |||||
protected Integer getTicketNumber() { | |||||
return 7230; | |||||
} | |||||
} |