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

Fix For Bug 65172

* browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/CBrowsingContentProvider.java
This commit is contained in:
Alain Magloire 2004-06-08 15:32:18 +00:00
parent b2b0ddb9b9
commit 5751ec8237
2 changed files with 148 additions and 20 deletions

View file

@ -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

View file

@ -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;
}
}