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:
parent
b2b0ddb9b9
commit
5751ec8237
2 changed files with 148 additions and 20 deletions
|
@ -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
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue