diff options
author | Grant Gayed | 2005-01-20 17:00:09 +0000 |
---|---|---|
committer | Grant Gayed | 2005-01-20 17:00:09 +0000 |
commit | 5ce9e32287c36f4649c3c726d93f7ff6e2af5bd1 (patch) | |
tree | 10ab79ba613a0ded42c00399a1ea86aa6cea68db | |
parent | d73f8f0bcf60169fe33b6dbd2d883c2f48f8638f (diff) | |
download | eclipse.platform.swt-5ce9e32287c36f4649c3c726d93f7ff6e2af5bd1.tar.gz eclipse.platform.swt-5ce9e32287c36f4649c3c726d93f7ff6e2af5bd1.tar.xz eclipse.platform.swt-5ce9e32287c36f4649c3c726d93f7ff6e2af5bd1.zip |
*** empty log message ***
2 files changed, 37 insertions, 23 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/emulated/treetable/org/eclipse/swt/widgets/Tree.java b/bundles/org.eclipse.swt/Eclipse SWT/emulated/treetable/org/eclipse/swt/widgets/Tree.java index 41b052bc38..e405ce6343 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/emulated/treetable/org/eclipse/swt/widgets/Tree.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/emulated/treetable/org/eclipse/swt/widgets/Tree.java @@ -329,8 +329,17 @@ void destroyItem (TreeItem item) { availableItems [i].availableIndex = i; } item.availableIndex = -1; - updateVerticalBar (); updateHorizontalBar (0, -rightX); + int oldTopIndex = topIndex; + updateVerticalBar (); + /* + * If destroyed item is above viewport then adjust topIndex and the vertical + * scrollbar so that the current viewport items will not change. + */ + if (availableIndex < topIndex) { + topIndex = oldTopIndex - 1; + getVerticalBar ().setSelection (topIndex); + } } /* selectedItems array */ if (item.isSelected ()) { @@ -1732,24 +1741,16 @@ void makeAvailable (TreeItem item) { } } - TreeItem[] itemsToInsert = item.computeAvailableDescendents (); - TreeItem[] newAvailableItems = new TreeItem [availableItems.length + itemsToInsert.length]; + TreeItem[] newAvailableItems = new TreeItem [availableItems.length + 1]; System.arraycopy (availableItems, 0, newAvailableItems, 0, index); - System.arraycopy (itemsToInsert, 0, newAvailableItems, index, itemsToInsert.length); - System.arraycopy (availableItems, index, newAvailableItems, index + itemsToInsert.length, availableItems.length - index); + newAvailableItems [index] = item; + System.arraycopy (availableItems, index, newAvailableItems, index + 1, availableItems.length - index); availableItems = newAvailableItems; /* update availableIndex as needed */ for (int i = index; i < availableItems.length; i++) { availableItems [i].availableIndex = i; } - updateVerticalBar (); - int rightX = 0; - for (int i = 0; i < itemsToInsert.length; i++) { - Rectangle bounds = itemsToInsert [i].getBounds (); - rightX = Math.max (rightX, bounds.x + bounds.width); - } - updateHorizontalBar (rightX, rightX); } /* @@ -1775,14 +1776,6 @@ void makeDescendentsAvailable (TreeItem item, TreeItem[] descendents) { for (int i = itemAvailableIndex; i < availableItems.length; i++) { availableItems [i].availableIndex = i; } - - updateVerticalBar (); - int rightX = 0; - for (int i = 1; i < descendents.length; i++) { - Rectangle bounds = descendents [i].getBounds (); - rightX = Math.max (rightX, bounds.x + bounds.width); - } - updateHorizontalBar (rightX, rightX); } /* @@ -1823,9 +1816,6 @@ void makeDescendentsUnavailable (TreeItem item, TreeItem[] descendents) { if (anchorItem != null && anchorItem != item && anchorItem.hasAncestor (item)) { anchorItem = null; } - - updateVerticalBar (); - updateHorizontalBar (); } /* * The current focus item is about to become unavailable, so reassign focus. diff --git a/bundles/org.eclipse.swt/Eclipse SWT/emulated/treetable/org/eclipse/swt/widgets/TreeItem.java b/bundles/org.eclipse.swt/Eclipse SWT/emulated/treetable/org/eclipse/swt/widgets/TreeItem.java index d4dbde9be2..22a505626a 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/emulated/treetable/org/eclipse/swt/widgets/TreeItem.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/emulated/treetable/org/eclipse/swt/widgets/TreeItem.java @@ -1007,6 +1007,15 @@ public void setExpanded (boolean value) { TreeItem[] availableDescendents = computeAvailableDescendents (); int descendentsCount = availableDescendents.length; parent.makeDescendentsAvailable (this, availableDescendents); + + /* update scrollbars */ + int rightX = 0; + for (int i = 1; i < availableDescendents.length; i++) { + Rectangle bounds = availableDescendents [i].getBounds (); + rightX = Math.max (rightX, bounds.x + bounds.width); + } + parent.updateHorizontalBar (rightX, rightX); + parent.updateVerticalBar (); /* * If new item is above viewport then adjust topIndex and the vertical scrollbar * so that the current viewport items will not change. @@ -1050,6 +1059,10 @@ public void setExpanded (boolean value) { gc.copyArea (image, 0, startY); } parent.makeDescendentsUnavailable (this, descendents); + parent.updateHorizontalBar (); + int oldTopIndex = parent.topIndex; + parent.updateVerticalBar (); + /* move focus (and selection if SWT.SINGLE) to item if a descendent had focus */ TreeItem focusItem = parent.focusItem; if (focusItem != null && focusItem != this && focusItem.hasAncestor (this)) { @@ -1064,6 +1077,17 @@ public void setExpanded (boolean value) { if (isDisposed ()) return; parent.showItem (this); parent.redrawItem (availableIndex, true); + } else { + /* + * If all collapsed items are above the viewport then adjust topIndex and + * the vertical scrollbar so that the current viewport items will not change. + */ + int bottomIndex = availableIndex + descendents.length - 1; + if (bottomIndex < parent.topIndex) { + parent.topIndex = oldTopIndex - descendents.length + 1; + parent.getVerticalBar ().setSelection (parent.topIndex); + return; + } } itemY = parent.getItemY (this); if (image != null) { |