Author: rwhitcomb
Date: Wed Jun 20 20:43:15 2018
New Revision: 1833950

URL: http://svn.apache.org/viewvc?rev=1833950&view=rev
Log:
PIVOT-1037:  Add checks for this specific condition, namely that the count
of nodes to be removed (from the visible nodes list) is out of range of
what is currently in the children list, and just ignore the request.

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=1833950&r1=1833949&r2=1833950&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 Jun 20 20:43:15 2018
@@ -31,6 +31,7 @@ import org.apache.pivot.collections.Dict
 import org.apache.pivot.collections.List;
 import org.apache.pivot.collections.Sequence;
 import org.apache.pivot.collections.Sequence.Tree.Path;
+import org.apache.pivot.util.ClassUtils;
 import org.apache.pivot.util.Filter;
 import org.apache.pivot.util.Utils;
 import org.apache.pivot.util.Vote;
@@ -362,6 +363,11 @@ public class TerraTreeViewSkin extends C
         public void clearField(byte mask) {
             fields &= ~mask;
         }
+
+        @Override
+        public String toString() {
+            return ClassUtils.simpleToString(this);
+        }
     }
 
     /**
@@ -1256,8 +1262,7 @@ public class TerraTreeViewSkin extends C
         if (insertIndex >= 0) {
             Sequence<NodeInfo> nodes = new ArrayList<>();
 
-            // The parent branch's children are the baseline nodes to make
-            // visible
+            // The parent branch's children are the baseline nodes to make 
visible
             parentBranchInfo.loadChildren();
             for (int i = 0, n = parentBranchInfo.children.getLength(); i < n; 
i++) {
                 nodes.add(parentBranchInfo.children.get(i));
@@ -1344,16 +1349,21 @@ public class TerraTreeViewSkin extends C
      */
     private void removeVisibleNodes(BranchInfo parentBranchInfo, int index, 
int count) {
         parentBranchInfo.loadChildren();
+        int childrenLength = parentBranchInfo.children.getLength();
 
         int countUpdated = count;
 
         if (countUpdated == -1) {
             assert (index == 0) : "Non-zero index with 'remove all' count";
-            countUpdated = parentBranchInfo.children.getLength();
+            countUpdated = childrenLength;
         }
 
-        assert (index + countUpdated <= parentBranchInfo.children.getLength()) 
: "Value too big";
-
+        // If the index is greater-equal the child length, then there could
+        // not possibly be any visible nodes, so just quit
+        if (index >= childrenLength) {
+            return;
+        }
+        assert (index + countUpdated <= childrenLength) : "Value too big";
         if (countUpdated > 0) {
             NodeInfo first = parentBranchInfo.children.get(index);
             NodeInfo last = parentBranchInfo.children.get(index + countUpdated 
- 1);
@@ -2060,12 +2070,18 @@ public class TerraTreeViewSkin extends C
     public void nodesRemoved(TreeView treeView, Path path, int index, int 
count) {
         BranchInfo branchInfo = (BranchInfo) getNodeInfoAt(path);
 
-        // Remove the node from the visible nodes list
+        // Remove the nodes from the visible nodes list
         removeVisibleNodes(branchInfo, index, count);
 
         // Update our internal branch info
         if (branchInfo.children != null) {
-            branchInfo.children.remove(index, count);
+            // Problem: if "loadChildren" was called on this branch the first 
time
+            // by "removeVisibleNodes" above, then the "children" will 
actually be
+            // correct here (i.e., already removed), so this is unnecessary.
+            int len = branchInfo.children.getLength();
+            if (index < len && index + count <= len) {
+                branchInfo.children.remove(index, count);
+            }
         }
 
         // If the empty branch controls are not shown, then this event might


Reply via email to