mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-04 15:45:25 +02:00
[167620] improve performance of large select
This commit is contained in:
parent
67077ca826
commit
cea85b4644
3 changed files with 148 additions and 35 deletions
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
*/
|
||||
|
|
|
@ -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
|
||||
*/
|
||||
|
|
Loading…
Add table
Reference in a new issue