Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlain Magloire2004-06-08 15:32:18 +0000
committerAlain Magloire2004-06-08 15:32:18 +0000
commit5751ec82378c9958434f65401b951a5ebda60cb0 (patch)
tree5a482a0a0cca9a9000f31b0d9e499ea889a97baf
parentb2b0ddb9b9e52f0724f06d47710e25e98b5b298e (diff)
downloadorg.eclipse.cdt-5751ec82378c9958434f65401b951a5ebda60cb0.tar.gz
org.eclipse.cdt-5751ec82378c9958434f65401b951a5ebda60cb0.tar.xz
org.eclipse.cdt-5751ec82378c9958434f65401b951a5ebda60cb0.zip
Fix For Bug 65172
* browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/CBrowsingContentProvider.java
-rw-r--r--core/org.eclipse.cdt.ui/ChangeLog5
-rw-r--r--core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/CBrowsingContentProvider.java163
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;
- }
}

Back to the top