mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-11 19:15:22 +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.resource.ImageDescriptor;
|
||||||
import org.eclipse.jface.viewers.AbstractTreeViewer;
|
import org.eclipse.jface.viewers.AbstractTreeViewer;
|
||||||
import org.eclipse.jface.viewers.IStructuredSelection;
|
import org.eclipse.jface.viewers.IStructuredSelection;
|
||||||
|
import org.eclipse.jface.viewers.TreeViewer;
|
||||||
import org.eclipse.jface.viewers.Viewer;
|
import org.eclipse.jface.viewers.Viewer;
|
||||||
import org.eclipse.rse.core.SystemBasePlugin;
|
import org.eclipse.rse.core.SystemBasePlugin;
|
||||||
import org.eclipse.rse.core.filters.ISystemFilterReference;
|
import org.eclipse.rse.core.filters.ISystemFilterReference;
|
||||||
import org.eclipse.rse.core.model.IHost;
|
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.ISystemMessageObject;
|
||||||
import org.eclipse.rse.core.model.ISystemRegistry;
|
import org.eclipse.rse.core.model.ISystemRegistry;
|
||||||
import org.eclipse.rse.core.model.ISystemResourceSet;
|
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.ISystemMementoConstants;
|
||||||
import org.eclipse.rse.ui.view.ISystemPropertyConstants;
|
import org.eclipse.rse.ui.view.ISystemPropertyConstants;
|
||||||
import org.eclipse.rse.ui.view.ISystemRemoteElementAdapter;
|
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.ISystemViewDropDestination;
|
||||||
import org.eclipse.rse.ui.view.ISystemViewElementAdapter;
|
import org.eclipse.rse.ui.view.ISystemViewElementAdapter;
|
||||||
import org.eclipse.rse.ui.view.SystemDNDTransferRunnable;
|
import org.eclipse.rse.ui.view.SystemDNDTransferRunnable;
|
||||||
|
@ -236,7 +239,7 @@ public class SystemViewRemoteFileAdapter
|
||||||
*/
|
*/
|
||||||
public void setFilterString(String filterString)
|
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";
|
filterString = filterString + " /ns";
|
||||||
else if (foldersOnly && (filterString != null) && (filterString.indexOf("/nf") == -1))
|
else if (foldersOnly && (filterString != null) && (filterString.indexOf("/nf") == -1))
|
||||||
filterString = filterString + " /nf";
|
filterString = filterString + " /nf";
|
||||||
|
@ -1064,6 +1067,26 @@ public class SystemViewRemoteFileAdapter
|
||||||
{
|
{
|
||||||
return getPropertyValue(key, true);
|
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.
|
* 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) {
|
protected Item[] sortSelection(Widget parentItem, Item[] oldResult) {
|
||||||
Item[] newResult = new Item[oldResult.length];
|
Item[] newResult = new Item[oldResult.length];
|
||||||
for (int i = 0; i < oldResult.length; i++) {
|
Item[] children = null;
|
||||||
Item first = removeFirstItem(parentItem, oldResult);
|
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;
|
newResult[i] = first;
|
||||||
}
|
}
|
||||||
|
|
||||||
return newResult;
|
return newResult;
|
||||||
|
*/
|
||||||
|
return oldResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Item removeFirstItem(Widget parentItem, Item[] items) {
|
protected Item removeFirstItem(Item[] items, Item[] children) {
|
||||||
int firstIndex = 0;
|
int firstIndex = 0;
|
||||||
Item firstItem = null;
|
Item firstItem = null;
|
||||||
int firstItemPosition = 0;
|
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)
|
if (items != null)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < items.length; i++) {
|
for (int i = 0; i < items.length; i++) {
|
||||||
if (items[i] != null) {
|
if (items[i] != null)
|
||||||
|
{
|
||||||
Item current = items[i];
|
Item current = items[i];
|
||||||
int position = getTreeItemPosition(parentItem, current, children);
|
int position = getTreeItemPosition(current, children);
|
||||||
|
|
||||||
if (firstItem == null || position < firstItemPosition) {
|
if (firstItem == null || position < firstItemPosition) {
|
||||||
firstItem = current;
|
firstItem = current;
|
||||||
|
@ -1479,7 +1485,7 @@ public class SystemView extends TreeViewer implements ISystemTree, ISystemResour
|
||||||
|
|
||||||
for (int idx = 0; idx < src.length; idx++)
|
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
|
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
|
* 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;
|
int pos = -1;
|
||||||
for (int idx = 0; (pos == -1) && (idx < children.length); idx++) {
|
for (int idx = 0; (pos == -1) && (idx < children.length); idx++) {
|
||||||
if (children[idx] == childItem) pos = idx;
|
if (children[idx] == childItem) pos = idx;
|
||||||
|
@ -3748,7 +3754,7 @@ public class SystemView extends TreeViewer implements ISystemTree, ISystemResour
|
||||||
children = getChildren(parentItem);
|
children = getChildren(parentItem);
|
||||||
|
|
||||||
for (int idx = 0; idx < src.length; idx++) {
|
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]);
|
//logDebugMsg("::: Old position : " + oldPositions[idx]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5005,6 +5011,45 @@ public class SystemView extends TreeViewer implements ISystemTree, ISystemResour
|
||||||
return getItemCount((Control) w);
|
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
|
* 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) {
|
protected Item[] sortSelection(Widget parentItem, Item[] oldResult) {
|
||||||
Item[] newResult = new Item[oldResult.length];
|
Item[] newResult = new Item[oldResult.length];
|
||||||
for (int i = 0; i < oldResult.length; i++) {
|
Item[] children = null;
|
||||||
Item first = removeFirstItem(parentItem, oldResult);
|
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;
|
newResult[i] = first;
|
||||||
}
|
}
|
||||||
|
|
||||||
return newResult;
|
return newResult;
|
||||||
|
*/
|
||||||
|
return oldResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Item removeFirstItem(Widget parentItem, Item[] items) {
|
protected Item removeFirstItem(Item[] items, Item[] children) {
|
||||||
int firstIndex = 0;
|
int firstIndex = 0;
|
||||||
Item firstItem = null;
|
Item firstItem = null;
|
||||||
int firstItemPosition = 0;
|
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)
|
if (items != null)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < items.length; i++) {
|
for (int i = 0; i < items.length; i++) {
|
||||||
if (items[i] != null) {
|
if (items[i] != null)
|
||||||
|
{
|
||||||
Item current = items[i];
|
Item current = items[i];
|
||||||
int position = getTreeItemPosition(parentItem, current, children);
|
int position = getTreeItemPosition(current, children);
|
||||||
|
|
||||||
if (firstItem == null || position < firstItemPosition) {
|
if (firstItem == null || position < firstItemPosition) {
|
||||||
firstItem = current;
|
firstItem = current;
|
||||||
|
@ -1479,7 +1485,7 @@ public class SystemView extends TreeViewer implements ISystemTree, ISystemResour
|
||||||
|
|
||||||
for (int idx = 0; idx < src.length; idx++)
|
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
|
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
|
* 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;
|
int pos = -1;
|
||||||
for (int idx = 0; (pos == -1) && (idx < children.length); idx++) {
|
for (int idx = 0; (pos == -1) && (idx < children.length); idx++) {
|
||||||
if (children[idx] == childItem) pos = idx;
|
if (children[idx] == childItem) pos = idx;
|
||||||
|
@ -3748,7 +3754,7 @@ public class SystemView extends TreeViewer implements ISystemTree, ISystemResour
|
||||||
children = getChildren(parentItem);
|
children = getChildren(parentItem);
|
||||||
|
|
||||||
for (int idx = 0; idx < src.length; idx++) {
|
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]);
|
//logDebugMsg("::: Old position : " + oldPositions[idx]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5005,6 +5011,45 @@ public class SystemView extends TreeViewer implements ISystemTree, ISystemResour
|
||||||
return getItemCount((Control) w);
|
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
|
* Return the tree item of the first selected object
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Add table
Reference in a new issue