--- old/src/java.desktop/share/classes/javax/swing/tree/VariableHeightLayoutCache.java 2017-12-12 19:31:35.071703800 +0530 +++ new/src/java.desktop/share/classes/javax/swing/tree/VariableHeightLayoutCache.java 2017-12-12 19:31:33.935704800 +0530 @@ -925,24 +925,22 @@ * row index, the last row index is returned. */ private int getRowContainingYLocation(int location) { + int max = getRowCount(); + + if(max <= 0) + return -1; if(isFixedRowHeight()) { - if(getRowCount() == 0) - return -1; - return Math.max(0, Math.min(getRowCount() - 1, + return Math.max(0, Math.min(max - 1, location / getRowHeight())); } - int max, maxY, mid, min, minY; - TreeStateNode node; + int min = 0, mid = 0; - if((max = getRowCount()) <= 0) - return -1; - mid = min = 0; while(min < max) { mid = (max - min) / 2 + min; - node = (TreeStateNode)visibleNodes.elementAt(mid); - minY = node.getYOrigin(); - maxY = minY + node.getPreferredHeight(); + TreeStateNode node = (TreeStateNode)visibleNodes.elementAt(mid); + int minY = node.getYOrigin(); + int maxY = minY + node.getPreferredHeight(); if(location < minY) { max = mid - 1; } @@ -1008,9 +1006,9 @@ if(nodeWidth > maxWidth) maxWidth = nodeWidth; } + return maxWidth; } - /** * Responsible for creating a TreeStateNode that will be used * to track display information about value. @@ -1362,17 +1360,11 @@ isExpanded(), boundsBuffer); - if(bounds == null) { + if(bounds == null || bounds.height == 0) { xOrigin = 0; preferredWidth = preferredHeight = 0; updateNodeSizes = true; - } - else if(bounds.height == 0) { - xOrigin = 0; - preferredWidth = preferredHeight = 0; - updateNodeSizes = true; - } - else { + } else { xOrigin = bounds.x; preferredWidth = bounds.width; if(isFixedRowHeight()) @@ -1477,24 +1469,14 @@ Object realNode = getValue(); TreeModel treeModel = getModel(); int count = treeModel.getChildCount(realNode); - + int offset = originalRow == -1 ? -1 : originalRow + 1; hasBeenExpanded = true; - if(originalRow == -1) { - for (int i = 0; i < count; i++) { - newNode = createNodeForValue(treeModel.getChild - (realNode, i)); - this.add(newNode); - newNode.updatePreferredSize(-1); - } - } - else { - int offset = originalRow + 1; - for (int i = 0; i < count; i++) { - newNode = createNodeForValue(treeModel.getChild - (realNode, i)); - this.add(newNode); - newNode.updatePreferredSize(offset); - } + + for (int i = 0; i < count; i++) { + newNode = createNodeForValue(treeModel.getChild + (realNode, i)); + this.add(newNode); + newNode.updatePreferredSize(offset); } } @@ -1502,14 +1484,9 @@ Enumeration cursor = preorderEnumeration(); cursor.nextElement(); // don't add me, I'm already in - int newYOrigin; + int newYOrigin = isFixed || (this == root && !isRootVisible()) ? + 0 : getYOrigin() + this.getPreferredHeight(); - if(isFixed) - newYOrigin = 0; - else if(this == root && !isRootVisible()) - newYOrigin = 0; - else - newYOrigin = getYOrigin() + this.getPreferredHeight(); TreeStateNode aNode; if(!isFixed) { while (cursor.hasMoreElements()) { @@ -1744,14 +1721,10 @@ protected boolean updateNextIndex() { // nextIndex == -1 identifies receiver, make sure is expanded // before descend. - if(nextIndex == -1 && !parent.isExpanded()) - return false; - - // Check that it can have kids - if(childCount == 0) - return false; - // Make sure next index not beyond child count. - else if(++nextIndex >= childCount) + if((nextIndex == -1 && !parent.isExpanded()) || + childCount == 0 || // Check that it can have kids + ++nextIndex >= childCount) // Make sure next index not beyond + // child count. return false; TreeStateNode child = (TreeStateNode)parent.