@@ -1264,4 +1264,39 @@ public class Util { | |||
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; | |||
} | |||
}-*/; | |||
} |
@@ -6164,44 +6164,9 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler, | |||
* The row to ensure is visible | |||
*/ | |||
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 | |||
* |
@@ -1291,7 +1291,7 @@ public class VTree extends FocusElementPanel implements Paintable, | |||
* Scrolls the caption into view | |||
*/ | |||
public void scrollIntoView() { | |||
nodeCaptionDiv.scrollIntoView(); | |||
Util.scrollIntoViewVertically(nodeCaptionDiv); | |||
} | |||
} |
@@ -0,0 +1,87 @@ | |||
<?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> |
@@ -0,0 +1,54 @@ | |||
/* | |||
@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; | |||
} | |||
} |