From 5751ec82378c9958434f65401b951a5ebda60cb0 Mon Sep 17 00:00:00 2001 From: Alain Magloire Date: Tue, 8 Jun 2004 15:32:18 +0000 Subject: [PATCH] Fix For Bug 65172 * browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/CBrowsingContentProvider.java --- core/org.eclipse.cdt.ui/ChangeLog | 5 + .../cbrowsing/CBrowsingContentProvider.java | 163 +++++++++++++++--- 2 files changed, 148 insertions(+), 20 deletions(-) diff --git a/core/org.eclipse.cdt.ui/ChangeLog b/core/org.eclipse.cdt.ui/ChangeLog index c65451d45a2..69cd06bede0 100644 --- a/core/org.eclipse.cdt.ui/ChangeLog +++ b/core/org.eclipse.cdt.ui/ChangeLog @@ -1,3 +1,8 @@ +2004-06-08 Alain Magloire + + Fix For Bug 65172 + * browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/CBrowsingContentProvider.java + 2004-06-07 Hoda Amer Fix for bug 63395 : [Refactoring] a template class does not refactor its constructor diff --git a/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/CBrowsingContentProvider.java b/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/CBrowsingContentProvider.java index 2f97bd9f5a3..6ebac586c03 100644 --- a/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/CBrowsingContentProvider.java +++ b/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/CBrowsingContentProvider.java @@ -12,16 +12,25 @@ package org.eclipse.cdt.internal.ui.browser.cbrowsing; import java.util.Collection; +import org.eclipse.cdt.core.model.CModelException; import org.eclipse.cdt.core.model.CoreModel; import org.eclipse.cdt.core.model.ElementChangedEvent; +import org.eclipse.cdt.core.model.IArchive; +import org.eclipse.cdt.core.model.IBinary; +import org.eclipse.cdt.core.model.ICElement; +import org.eclipse.cdt.core.model.ICElementDelta; import org.eclipse.cdt.core.model.IElementChangedListener; +import org.eclipse.cdt.core.model.ITranslationUnit; +import org.eclipse.cdt.core.model.IWorkingCopy; +import org.eclipse.cdt.internal.ui.BaseCElementContentProvider; +import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.StructuredViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; -public abstract class CBrowsingContentProvider implements ITreeContentProvider, IElementChangedListener { +public abstract class CBrowsingContentProvider extends BaseCElementContentProvider implements ITreeContentProvider, IElementChangedListener { protected StructuredViewer fViewer; protected Object fInput; @@ -61,15 +70,140 @@ public abstract class CBrowsingContentProvider implements ITreeContentProvider, * @see org.eclipse.cdt.core.model.IElementChangedListener#elementChanged(org.eclipse.cdt.core.model.ElementChangedEvent) */ public void elementChanged(ElementChangedEvent event) { -// TODO listen for cache updates -// try { -// processDelta(event.getDelta()); -// } catch(CModelException e) { -// CUIPlugin.getDefault().log(e.getStatus()); -// } + try { + processDelta(event.getDelta()); + } catch(CModelException e) { + CUIPlugin.getDefault().log(e.getStatus()); + } } - - + + protected boolean isPathEntryChange(ICElementDelta delta) { + int flags= delta.getFlags(); + return (delta.getKind() == ICElementDelta.CHANGED && + ((flags & ICElementDelta.F_BINARY_PARSER_CHANGED) != 0 || + (flags & ICElementDelta.F_ADDED_PATHENTRY_LIBRARY) != 0 || + (flags & ICElementDelta.F_ADDED_PATHENTRY_SOURCE) != 0 || + (flags & ICElementDelta.F_REMOVED_PATHENTRY_LIBRARY) != 0 || + (flags & ICElementDelta.F_PATHENTRY_REORDER) != 0 || + (flags & ICElementDelta.F_REMOVED_PATHENTRY_SOURCE) != 0 || + (flags & ICElementDelta.F_CHANGED_PATHENTRY_INCLUDE) != 0)); + } + + /** + * Processes a delta recursively. When more than two children are affected the + * tree is fully refreshed starting at this node. The delta is processed in the + * current thread but the viewer updates are posted to the UI thread. + */ + protected void processDelta(ICElementDelta delta) throws CModelException { + int kind= delta.getKind(); + int flags= delta.getFlags(); + ICElement element= delta.getElement(); + + //System.out.println("Processing " + element); + + // handle open and closing of a solution or project + if (((flags & ICElementDelta.F_CLOSED) != 0) || ((flags & ICElementDelta.F_OPENED) != 0)) { + postRefresh(element); + } + + if (kind == ICElementDelta.REMOVED) { + postRemove(element); + } + + if (kind == ICElementDelta.ADDED) { + Object parent= internalGetParent(element); + postAdd(parent, element); + } + + if (kind == ICElementDelta.CHANGED) { + if (element instanceof ITranslationUnit || element instanceof IBinary || element instanceof IArchive) { + postRefresh(element); + return; + } + } + + if (isPathEntryChange(delta)) { + // throw the towel and do a full refresh of the affected C project. + postRefresh(element.getCProject()); + } + + ICElementDelta[] affectedChildren= delta.getAffectedChildren(); + for (int i= 0; i < affectedChildren.length; i++) { + processDelta(affectedChildren[i]); + } + } + + 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()){ + if(element instanceof IWorkingCopy){ + if(fViewer.testFindItem(element) != null){ + fViewer.refresh(element); + }else { + fViewer.refresh(((IWorkingCopy)element).getOriginalElement()); + } + } else { + fViewer.refresh(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); + } + } + } + }); + } + + 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. + 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); + } + } + } + }); + } + + private void postRunnable(final Runnable r) { + Control ctrl= fViewer.getControl(); + if (ctrl != null && !ctrl.isDisposed()) { + ctrl.getDisplay().asyncExec(r); + } + } + protected void startReadInDisplayThread() { if (isDisplayThread()) fReadsInDisplayThread++; @@ -89,15 +223,4 @@ public abstract class CBrowsingContentProvider implements ITreeContentProvider, return currentDisplay != null && currentDisplay.equals(ctrl.getDisplay()); } - /** - * Note: This method is for internal use only. Clients should not call this method. - */ - protected static Object[] concatenate(Object[] a1, Object[] a2) { - int a1Len = a1.length; - int a2Len = a2.length; - Object[] res = new Object[a1Len + a2Len]; - System.arraycopy(a1, 0, res, 0, a1Len); - System.arraycopy(a2, 0, res, a1Len, a2Len); - return res; - } }