1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

2005-07-06 Alain Magloire

PR 102619: Performance improvement patch from: Robert O'Callahan
	* src/org/eclipse/cdt/ui/CElementContentProvider.java
This commit is contained in:
Alain Magloire 2005-07-06 14:42:01 +00:00
parent 5875bc56e8
commit 03b2f1de71
2 changed files with 93 additions and 73 deletions

View file

@ -1,3 +1,7 @@
2005-07-06 Alain Magloire
PR 102619: Performance improvement patch from: Robert O'Callahan
* src/org/eclipse/cdt/ui/CElementContentProvider.java
2005-07-05 Alain Magloire
Fix for PR 102327: ContentType framework.
* src/org/eclipse/cdt/internal/ui/preferences/CFileTypesPreferenceBlock.java

View file

@ -12,6 +12,8 @@ package org.eclipse.cdt.ui;
import java.util.HashSet;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.ElementChangedEvent;
@ -68,6 +70,9 @@ public class CElementContentProvider extends BaseCElementContentProvider impleme
protected StructuredViewer fViewer;
protected Object fInput;
/** Remember what refreshes we already have pending so we don't post them again. */
protected HashSet pendingRefreshes = new HashSet();
/**
* Creates a new content provider for C elements.
*/
@ -259,12 +264,21 @@ public class CElementContentProvider extends BaseCElementContentProvider impleme
return false;
}
private void postContainerRefresh(final IParent container, final ICProject cproject) {
//System.out.println("UI Container:" + cproject + " " + container);
postRunnable(new Runnable() {
public void run () {
Control ctrl= fViewer.getControl();
if (ctrl != null && !ctrl.isDisposed()) {
// Tree refresh system
// We keep track of what we're going to refresh and avoid posting multiple refresh
// messages for the same elements. This avoids major performance issues where
// we update tree views hundreds or thousands of times.
interface IRefreshable {
public void refresh();
}
final class RefreshContainer implements IRefreshable {
private IParent container;
private ICProject cproject;
public RefreshContainer(IParent container, ICProject cproject) {
this.container = container;
this.cproject = cproject;
}
public void refresh() {
if (container.hasChildren()) {
if (fViewer.testFindItem(container) != null) {
fViewer.refresh(container);
@ -275,17 +289,23 @@ public class CElementContentProvider extends BaseCElementContentProvider impleme
fViewer.refresh(cproject);
}
}
public boolean equals(Object o) {
if (o instanceof RefreshContainer) {
RefreshContainer c = (RefreshContainer)o;
return c.container.equals(container) && c.cproject.equals(cproject);
}
});
return false;
}
private void postRefresh(final Object element) {
//System.out.println("UI refresh:" + root);
postRunnable(new Runnable() {
public void run() {
// 1GF87WR: ITPUI:ALL - SWTEx + NPE closing a workbench window.
Control ctrl= fViewer.getControl();
if (ctrl != null && !ctrl.isDisposed()){
public int hashCode() {
return container.hashCode()*10903143 + 31181;
}
}
final class RefreshElement implements IRefreshable {
private Object element;
public RefreshElement(Object element) {
this.element = element;
}
public void refresh() {
if (element instanceof IWorkingCopy){
if (fViewer.testFindItem(element) != null){
fViewer.refresh(element);
@ -298,58 +318,54 @@ public class CElementContentProvider extends BaseCElementContentProvider impleme
fViewer.refresh(element);
}
}
public boolean equals(Object o) {
if (o instanceof RefreshElement) {
RefreshElement c = (RefreshElement)o;
return c.element.equals(element);
}
});
return false;
}
public int hashCode() {
return element.hashCode()*7 + 490487;
}
}
private void postContainerRefresh(final IParent container, final ICProject cproject) {
//System.out.println("UI Container:" + cproject + " " + container);
postRefreshable(new RefreshContainer(container, cproject));
}
private void postRefresh(final Object element) {
//System.out.println("UI refresh:" + root);
postRefreshable(new RefreshElement(element));
}
private void postAdd(final Object parent, final Object element) {
//System.out.println("UI add:" + parent + " " + element);
postRunnable(new Runnable() {
public void run() {
// 1GF87WR: ITPUI:ALL - SWTEx + NPE closing a workbench window.
Control ctrl= fViewer.getControl();
if (ctrl != null && !ctrl.isDisposed()){
if(parent instanceof IWorkingCopy){
if (fViewer.testFindItem(parent) != null){
fViewer.refresh(parent);
} else {
fViewer.refresh(((IWorkingCopy)parent).getOriginalElement());
}
} else {
fViewer.refresh(parent);
}
}
}
});
postRefreshable(new RefreshElement(parent));
}
private void postRemove(final Object element) {
//System.out.println("UI remove:" + element);
postRunnable(new Runnable() {
public void run() {
// 1GF87WR: ITPUI:ALL - SWTEx + NPE closing a workbench window.
postRefreshable(new RefreshElement(internalGetParent(element)));
}
private void postRefreshable(final IRefreshable r) {
Control ctrl= fViewer.getControl();
if (ctrl != null && !ctrl.isDisposed()) {
Object parent = internalGetParent(element);
if (parent instanceof IWorkingCopy){
if (fViewer.testFindItem(parent) != null){
fViewer.refresh(parent);
} else {
fViewer.refresh(((IWorkingCopy)parent).getOriginalElement());
}
} else {
fViewer.refresh(parent);
}
if (pendingRefreshes.contains(r))
return;
pendingRefreshes.add(r);
ctrl.getDisplay().asyncExec(new Runnable() {
public void run() {
pendingRefreshes.remove(r);
Control ctrl= fViewer.getControl();
if (ctrl != null && !ctrl.isDisposed()) {
r.refresh();
}
}
});
}
private void postRunnable(final Runnable r) {
Control ctrl= fViewer.getControl();
if (ctrl != null && !ctrl.isDisposed()) {
ctrl.getDisplay().asyncExec(r);
}
}
/**