From cea85b4644895283af8b0e543bbd64227cbd6cbe Mon Sep 17 00:00:00 2001 From: David McKnight Date: Tue, 12 Dec 2006 21:35:06 +0000 Subject: [PATCH] [167620] improve performance of large select --- .../ui/view/SystemViewRemoteFileAdapter.java | 25 +++++- .../rse/internal/ui/view/SystemView.java | 79 +++++++++++++++---- .../org/eclipse/rse/ui/view/SystemView.java | 79 +++++++++++++++---- 3 files changed, 148 insertions(+), 35 deletions(-) diff --git a/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/files/ui/view/SystemViewRemoteFileAdapter.java b/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/files/ui/view/SystemViewRemoteFileAdapter.java index 1c1a757a158..27b773d4c53 100644 --- a/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/files/ui/view/SystemViewRemoteFileAdapter.java +++ b/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/files/ui/view/SystemViewRemoteFileAdapter.java @@ -38,10 +38,12 @@ import org.eclipse.jface.action.Separator; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.AbstractTreeViewer; import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.rse.core.SystemBasePlugin; import org.eclipse.rse.core.filters.ISystemFilterReference; import org.eclipse.rse.core.model.IHost; +import org.eclipse.rse.core.model.ISystemContainer; import org.eclipse.rse.core.model.ISystemMessageObject; import org.eclipse.rse.core.model.ISystemRegistry; import org.eclipse.rse.core.model.ISystemResourceSet; @@ -121,6 +123,7 @@ import org.eclipse.rse.ui.view.ISystemEditableRemoteObject; import org.eclipse.rse.ui.view.ISystemMementoConstants; import org.eclipse.rse.ui.view.ISystemPropertyConstants; import org.eclipse.rse.ui.view.ISystemRemoteElementAdapter; +import org.eclipse.rse.ui.view.ISystemTree; import org.eclipse.rse.ui.view.ISystemViewDropDestination; import org.eclipse.rse.ui.view.ISystemViewElementAdapter; import org.eclipse.rse.ui.view.SystemDNDTransferRunnable; @@ -236,7 +239,7 @@ public class SystemViewRemoteFileAdapter */ public void setFilterString(String filterString) { - if (filesOnly && (filterString != null) && (filterString.indexOf("/ns") == -1)) + if (filesOnly && (filterString != null) && (filterString.indexOf("/ns") == -1)) //$NON-NLS-1$ filterString = filterString + " /ns"; else if (foldersOnly && (filterString != null) && (filterString.indexOf("/nf") == -1)) filterString = filterString + " /nf"; @@ -1064,6 +1067,26 @@ public class SystemViewRemoteFileAdapter { return getPropertyValue(key, true); } + + + public Object getPropertyValue(Object key) + { + String name = (String)key; + if (name.equals(P_NBRCHILDREN)) + { + IRemoteFile file = (IRemoteFile) propertySourceInput; + if (file instanceof ISystemContainer) + { + ISystemContainer container = (ISystemContainer)file; + Object[] contents = container.getContents(RemoteChildrenContentsType.getInstance()); + if (contents == null) + return "0"; + else + return Integer.toString(contents.length); + } + } + return super.getPropertyValue(key); + } /** * Returns the current value for the named property. diff --git a/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/internal/ui/view/SystemView.java b/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/internal/ui/view/SystemView.java index b182fac7603..0cf3f115871 100644 --- a/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/internal/ui/view/SystemView.java +++ b/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/internal/ui/view/SystemView.java @@ -1398,33 +1398,39 @@ public class SystemView extends TreeViewer implements ISystemTree, ISystemResour protected Item[] sortSelection(Widget parentItem, Item[] oldResult) { Item[] newResult = new Item[oldResult.length]; - for (int i = 0; i < oldResult.length; i++) { - Item first = removeFirstItem(parentItem, oldResult); + Item[] children = null; + if (parentItem instanceof Item) { + if (oldResult == null) + children = getItems((Item) parentItem); + else + children = oldResult; + } else + children = getChildren(parentItem); + /* + for (int i = 0; i < oldResult.length; i++) + { + Item first = removeFirstItem(oldResult, children); newResult[i] = first; } return newResult; + */ + return oldResult; } - protected Item removeFirstItem(Widget parentItem, Item[] items) { + protected Item removeFirstItem(Item[] items, Item[] children) { int firstIndex = 0; Item firstItem = null; int firstItemPosition = 0; - - Item[] children = null; - if (parentItem instanceof Item) { - if (items == null) - children = getItems((Item) parentItem); - else - children = items; - } else - children = getChildren(parentItem); + + if (items != null) { for (int i = 0; i < items.length; i++) { - if (items[i] != null) { + if (items[i] != null) + { Item current = items[i]; - int position = getTreeItemPosition(parentItem, current, children); + int position = getTreeItemPosition(current, children); if (firstItem == null || position < firstItemPosition) { firstItem = current; @@ -1479,7 +1485,7 @@ public class SystemView extends TreeViewer implements ISystemTree, ISystemResour for (int idx = 0; idx < src.length; idx++) { - oldPositions[idx] = getTreeItemPosition(parentItem, oldItems[idx], children) + 1; + oldPositions[idx] = getTreeItemPosition(oldItems[idx], children) + 1; } if (delta > 0) // moving down, process backwards @@ -1522,7 +1528,7 @@ public class SystemView extends TreeViewer implements ISystemTree, ISystemResour /** * Get the position of a tree item within its parent */ - protected int getTreeItemPosition(Widget parentItem, Item childItem, Item[] children) { + protected int getTreeItemPosition(Item childItem, Item[] children) { int pos = -1; for (int idx = 0; (pos == -1) && (idx < children.length); idx++) { if (children[idx] == childItem) pos = idx; @@ -3748,7 +3754,7 @@ public class SystemView extends TreeViewer implements ISystemTree, ISystemResour children = getChildren(parentItem); for (int idx = 0; idx < src.length; idx++) { - oldPositions[idx] = getTreeItemPosition(parentItem, oldItems[idx], children) + 1; + oldPositions[idx] = getTreeItemPosition(oldItems[idx], children) + 1; //logDebugMsg("::: Old position : " + oldPositions[idx]); } @@ -5005,6 +5011,45 @@ public class SystemView extends TreeViewer implements ISystemTree, ISystemResour return getItemCount((Control) w); } + protected Widget doFindItem(Object element) { + // compare with root + Object root = getRoot(); + if (root == null) { + return null; + } + + Item[] items = getChildren(getControl()); + if (items != null) { + for (int i = 0; i < items.length; i++) { + Widget o = findExactItem(items[i], element); + if (o != null) { + return o; + } + } + } + return null; + } + private Widget findExactItem(Item parent, Object element) { + + // compare with node + Object data = parent.getData(); + if (data != null) { + if (data == element) { + return parent; + } + } + // recurse over children + Item[] items = getChildren(parent); + for (int i = 0; i < items.length; i++) { + Item item = items[i]; + Widget o = findExactItem(item, element); + if (o != null) { + return o; + } + } + return null; + } + /** * Return the tree item of the first selected object */ diff --git a/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/ui/view/SystemView.java b/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/ui/view/SystemView.java index b182fac7603..0cf3f115871 100644 --- a/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/ui/view/SystemView.java +++ b/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/ui/view/SystemView.java @@ -1398,33 +1398,39 @@ public class SystemView extends TreeViewer implements ISystemTree, ISystemResour protected Item[] sortSelection(Widget parentItem, Item[] oldResult) { Item[] newResult = new Item[oldResult.length]; - for (int i = 0; i < oldResult.length; i++) { - Item first = removeFirstItem(parentItem, oldResult); + Item[] children = null; + if (parentItem instanceof Item) { + if (oldResult == null) + children = getItems((Item) parentItem); + else + children = oldResult; + } else + children = getChildren(parentItem); + /* + for (int i = 0; i < oldResult.length; i++) + { + Item first = removeFirstItem(oldResult, children); newResult[i] = first; } return newResult; + */ + return oldResult; } - protected Item removeFirstItem(Widget parentItem, Item[] items) { + protected Item removeFirstItem(Item[] items, Item[] children) { int firstIndex = 0; Item firstItem = null; int firstItemPosition = 0; - - Item[] children = null; - if (parentItem instanceof Item) { - if (items == null) - children = getItems((Item) parentItem); - else - children = items; - } else - children = getChildren(parentItem); + + if (items != null) { for (int i = 0; i < items.length; i++) { - if (items[i] != null) { + if (items[i] != null) + { Item current = items[i]; - int position = getTreeItemPosition(parentItem, current, children); + int position = getTreeItemPosition(current, children); if (firstItem == null || position < firstItemPosition) { firstItem = current; @@ -1479,7 +1485,7 @@ public class SystemView extends TreeViewer implements ISystemTree, ISystemResour for (int idx = 0; idx < src.length; idx++) { - oldPositions[idx] = getTreeItemPosition(parentItem, oldItems[idx], children) + 1; + oldPositions[idx] = getTreeItemPosition(oldItems[idx], children) + 1; } if (delta > 0) // moving down, process backwards @@ -1522,7 +1528,7 @@ public class SystemView extends TreeViewer implements ISystemTree, ISystemResour /** * Get the position of a tree item within its parent */ - protected int getTreeItemPosition(Widget parentItem, Item childItem, Item[] children) { + protected int getTreeItemPosition(Item childItem, Item[] children) { int pos = -1; for (int idx = 0; (pos == -1) && (idx < children.length); idx++) { if (children[idx] == childItem) pos = idx; @@ -3748,7 +3754,7 @@ public class SystemView extends TreeViewer implements ISystemTree, ISystemResour children = getChildren(parentItem); for (int idx = 0; idx < src.length; idx++) { - oldPositions[idx] = getTreeItemPosition(parentItem, oldItems[idx], children) + 1; + oldPositions[idx] = getTreeItemPosition(oldItems[idx], children) + 1; //logDebugMsg("::: Old position : " + oldPositions[idx]); } @@ -5005,6 +5011,45 @@ public class SystemView extends TreeViewer implements ISystemTree, ISystemResour return getItemCount((Control) w); } + protected Widget doFindItem(Object element) { + // compare with root + Object root = getRoot(); + if (root == null) { + return null; + } + + Item[] items = getChildren(getControl()); + if (items != null) { + for (int i = 0; i < items.length; i++) { + Widget o = findExactItem(items[i], element); + if (o != null) { + return o; + } + } + } + return null; + } + private Widget findExactItem(Item parent, Object element) { + + // compare with node + Object data = parent.getData(); + if (data != null) { + if (data == element) { + return parent; + } + } + // recurse over children + Item[] items = getChildren(parent); + for (int i = 0; i < items.length; i++) { + Item item = items[i]; + Widget o = findExactItem(item, element); + if (o != null) { + return o; + } + } + return null; + } + /** * Return the tree item of the first selected object */