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
|
2004-06-07 Hoda Amer
|
||||||
Fix for bug 63395 : [Refactoring] a template class does not refactor its constructor
|
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 java.util.Collection;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.model.CModelException;
|
||||||
import org.eclipse.cdt.core.model.CoreModel;
|
import org.eclipse.cdt.core.model.CoreModel;
|
||||||
import org.eclipse.cdt.core.model.ElementChangedEvent;
|
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.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.ITreeContentProvider;
|
||||||
import org.eclipse.jface.viewers.StructuredViewer;
|
import org.eclipse.jface.viewers.StructuredViewer;
|
||||||
import org.eclipse.jface.viewers.Viewer;
|
import org.eclipse.jface.viewers.Viewer;
|
||||||
import org.eclipse.swt.widgets.Control;
|
import org.eclipse.swt.widgets.Control;
|
||||||
import org.eclipse.swt.widgets.Display;
|
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 StructuredViewer fViewer;
|
||||||
protected Object fInput;
|
protected Object fInput;
|
||||||
|
@ -61,14 +70,139 @@ public abstract class CBrowsingContentProvider implements ITreeContentProvider,
|
||||||
* @see org.eclipse.cdt.core.model.IElementChangedListener#elementChanged(org.eclipse.cdt.core.model.ElementChangedEvent)
|
* @see org.eclipse.cdt.core.model.IElementChangedListener#elementChanged(org.eclipse.cdt.core.model.ElementChangedEvent)
|
||||||
*/
|
*/
|
||||||
public void elementChanged(ElementChangedEvent event) {
|
public void elementChanged(ElementChangedEvent event) {
|
||||||
// TODO listen for cache updates
|
try {
|
||||||
// try {
|
processDelta(event.getDelta());
|
||||||
// processDelta(event.getDelta());
|
} catch(CModelException e) {
|
||||||
// } catch(CModelException e) {
|
CUIPlugin.getDefault().log(e.getStatus());
|
||||||
// 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() {
|
protected void startReadInDisplayThread() {
|
||||||
if (isDisplayThread())
|
if (isDisplayThread())
|
||||||
|
@ -89,15 +223,4 @@ public abstract class CBrowsingContentProvider implements ITreeContentProvider,
|
||||||
return currentDisplay != null && currentDisplay.equals(ctrl.getDisplay());
|
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