Author: tvolkert
Date: Wed May 26 20:57:13 2010
New Revision: 948588
URL: http://svn.apache.org/viewvc?rev=948588&view=rev
Log:
PIVOT-474 :: scroll selection to visible in TerraTreeViewSkin when selection
changes
Modified:
pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraTreeViewSkin.java
Modified:
pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraTreeViewSkin.java
URL:
http://svn.apache.org/viewvc/pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraTreeViewSkin.java?rev=948588&r1=948587&r2=948588&view=diff
==============================================================================
---
pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraTreeViewSkin.java
(original)
+++
pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraTreeViewSkin.java
Wed May 26 20:57:13 2010
@@ -442,6 +442,8 @@ public class TerraTreeViewSkin extends C
private Color gridColor;
private boolean showGridLines;
+ private boolean validateSelection = false;
+
private static final int BRANCH_CONTROL_IMAGE_WIDTH = 8;
private static final int BRANCH_CONTROL_IMAGE_HEIGHT = 8;
private static final int VERTICAL_SPACING = 1;
@@ -582,7 +584,12 @@ public class TerraTreeViewSkin extends C
@Override
public void layout() {
- // No-op
+ if (validateSelection) {
+ // Ensure that the selection is visible
+ scrollSelectionToVisible();
+ }
+
+ validateSelection = false;
}
@Override
@@ -1507,6 +1514,35 @@ public class TerraTreeViewSkin extends C
});
}
+ /**
+ * Scrolls the last visible (expanded) selected node into viewport
+ * visibility. If no such node exists, nothing happens.
+ * <p>
+ * This should only be called when the tree view is valid.
+ */
+ private void scrollSelectionToVisible() {
+ TreeView treeView = (TreeView)getComponent();
+
+ Sequence<Path> selectedPaths = treeView.getSelectedPaths();
+ int n = selectedPaths.getLength();
+
+ if (n > 0) {
+ Bounds nodeBounds = null;
+
+ for (int i = n - 1; i >= 0 && nodeBounds == null; i--) {
+ NodeInfo nodeInfo = getNodeInfoAt(selectedPaths.get(i));
+ nodeBounds = getNodeBounds(nodeInfo);
+ }
+
+ if (nodeBounds != null) {
+ Bounds visibleSelectionBounds =
treeView.getVisibleArea(nodeBounds);
+ if (visibleSelectionBounds.height < nodeBounds.height) {
+ treeView.scrollAreaToVisible(nodeBounds);
+ }
+ }
+ }
+ }
+
@Override
public boolean mouseMove(Component component, int x, int y) {
boolean consumed = super.mouseMove(component, x, y);
@@ -2185,9 +2221,25 @@ public class TerraTreeViewSkin extends C
@Override
public void selectedPathAdded(TreeView treeView, Path path) {
+ // Update the node info
NodeInfo nodeInfo = getNodeInfoAt(path);
-
nodeInfo.setSelected(true);
+
+ if (treeView.isValid()) {
+ Bounds nodeBounds = getNodeBounds(nodeInfo);
+
+ if (nodeBounds != null) {
+ // Ensure that the selection is visible
+ Bounds visibleSelectionBounds =
treeView.getVisibleArea(nodeBounds);
+ if (visibleSelectionBounds.height < nodeBounds.height) {
+ treeView.scrollAreaToVisible(nodeBounds);
+ }
+ }
+ } else {
+ validateSelection = true;
+ }
+
+ // Repaint the node
repaintNode(nodeInfo);
}
@@ -2200,8 +2252,13 @@ public class TerraTreeViewSkin extends C
}
@Override
- public void selectedPathsChanged(TreeView treeView,
- Sequence<Path> previousSelectedPaths) {
+ public void selectedPathsChanged(TreeView treeView, Sequence<Path>
previousSelectedPaths) {
+ // Ensure that the selection is visible
+ if (treeView.isValid()) {
+ scrollSelectionToVisible();
+ } else {
+ validateSelection = true;
+ }
// Un-select the previous selected paths
for (int i = 0, n = previousSelectedPaths.getLength(); i < n; i++) {