diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ReconcileWorkingCopyOperation.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ReconcileWorkingCopyOperation.java index c2696b61e25..2c2875d0cba 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ReconcileWorkingCopyOperation.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ReconcileWorkingCopyOperation.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2006 IBM Corporation and others. + * Copyright (c) 2000, 2007 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -7,6 +7,7 @@ * * Contributors: * IBM Corporation - initial API and implementation + * Anton Leherbauer (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.core.model; @@ -51,34 +52,24 @@ public class ReconcileWorkingCopyOperation extends CModelOperation { CElementDeltaBuilder deltaBuilder = null; try { - // create the delta builder (this remembers the current content of the cu) - if (!wasConsistent){ + if (!wasConsistent || forceProblemDetection || fComputeAST) { + // create the delta builder (this remembers the current content of the tu) deltaBuilder = new CElementDeltaBuilder(workingCopy); // update the element infos with the content of the working copy - if (fComputeAST) { - fAST= workingCopy.makeConsistent(fComputeAST, fMonitor); - } else { - workingCopy.makeConsistent(fMonitor); - } + fAST= workingCopy.makeConsistent(fComputeAST, fMonitor); + deltaBuilder.buildDeltas(); // register the deltas - if (deltaBuilder != null){ - if ((deltaBuilder.delta != null) && (deltaBuilder.delta.getAffectedChildren().length > 0)) { - addReconcileDelta(workingCopy, deltaBuilder.delta); - } + if (deltaBuilder.delta != null) { + addReconcileDelta(workingCopy, deltaBuilder.delta); } } if (fMonitor != null) fMonitor.worked(2); - // force problem detection? - if structure was consistent - if (forceProblemDetection && wasConsistent){ - if (fMonitor != null && fMonitor.isCanceled()) return; - } - } finally { if (fMonitor != null) fMonitor.done(); } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/TranslationUnit.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/TranslationUnit.java index b5b5cbf37da..055c7011974 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/TranslationUnit.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/TranslationUnit.java @@ -490,11 +490,11 @@ public class TranslationUnit extends Openable implements ITranslationUnit { } public void makeConsistent(IProgressMonitor monitor, boolean forced) throws CModelException { - makeConsistent(false, monitor); + makeConsistent(forced, monitor); } protected IASTTranslationUnit makeConsistent(boolean computeAST, IProgressMonitor monitor) throws CModelException { - if (isConsistent()) { + if (!computeAST && isConsistent()) { return null; } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/ASTProvider.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/ASTProvider.java index e8762945e5d..9fbda5143c9 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/ASTProvider.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/ASTProvider.java @@ -16,6 +16,7 @@ package org.eclipse.cdt.internal.ui.editor; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; import org.eclipse.ui.IPartListener2; import org.eclipse.ui.IWindowListener; import org.eclipse.ui.IWorkbenchPart; @@ -298,6 +299,9 @@ public final class ASTProvider { if (cElement == null) return null; Assert.isTrue(cElement instanceof ITranslationUnit); + if (waitFlag == WAIT_ACTIVE_ONLY && !isActive((ITranslationUnit)cElement)) { + return null; + } return fCache.getAST((ITranslationUnit)cElement, index, waitFlag != WAIT_NO, progressMonitor); } @@ -326,6 +330,9 @@ public final class ASTProvider { public IStatus runOnAST(ICElement cElement, WAIT_FLAG waitFlag, IProgressMonitor monitor, ASTCache.ASTRunnable astRunnable) { Assert.isTrue(cElement instanceof ITranslationUnit); + if (waitFlag == WAIT_ACTIVE_ONLY && !isActive((ITranslationUnit)cElement)) { + return Status.CANCEL_STATUS; + } return fCache.runOnAST((ITranslationUnit)cElement, waitFlag != WAIT_NO, monitor, astRunnable); } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CContentOutlinerProvider.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CContentOutlinerProvider.java index 6e60ab5ccc9..68ce3f03b77 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CContentOutlinerProvider.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CContentOutlinerProvider.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2002, 2006 QNX Software Systems and others. + * Copyright (c) 2002, 2007 QNX Software Systems and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -7,6 +7,7 @@ * * Contributors: * QNX Software Systems - Initial API and implementation + * Anton Leherbauer (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.ui.editor; @@ -14,6 +15,16 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import org.eclipse.jface.util.IPropertyChangeListener; +import org.eclipse.jface.util.PropertyChangeEvent; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.StructuredSelection; +import org.eclipse.jface.viewers.TreeViewer; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.ui.IWorkbenchPartSite; +import org.eclipse.ui.progress.PendingUpdateAdapter; + import org.eclipse.cdt.core.model.CModelException; import org.eclipse.cdt.core.model.CoreModel; import org.eclipse.cdt.core.model.ElementChangedEvent; @@ -22,27 +33,13 @@ import org.eclipse.cdt.core.model.ICElementDelta; import org.eclipse.cdt.core.model.IElementChangedListener; import org.eclipse.cdt.core.model.ISourceRange; import org.eclipse.cdt.core.model.ITranslationUnit; +import org.eclipse.cdt.ui.PreferenceConstants; + import org.eclipse.cdt.internal.core.model.CShiftData; import org.eclipse.cdt.internal.core.model.SourceManipulation; + import org.eclipse.cdt.internal.ui.BaseCElementContentProvider; import org.eclipse.cdt.internal.ui.util.StringMatcher; -import org.eclipse.cdt.ui.PreferenceConstants; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Status; -import org.eclipse.jface.util.IPropertyChangeListener; -import org.eclipse.jface.util.PropertyChangeEvent; -import org.eclipse.jface.viewers.AbstractTreeViewer; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jface.viewers.StructuredSelection; -import org.eclipse.jface.viewers.TreeViewer; -import org.eclipse.jface.viewers.Viewer; -import org.eclipse.ui.IWorkbenchPartSite; -import org.eclipse.ui.progress.DeferredTreeContentManager; -import org.eclipse.ui.progress.IElementCollector; -import org.eclipse.ui.progress.PendingUpdateAdapter; -import org.eclipse.ui.progress.WorkbenchJob; /** * Manages contents of the outliner. @@ -64,19 +61,6 @@ public class CContentOutlinerProvider extends BaseCElementContentProvider { /** Filter for files to outline. */ private StringMatcher filter = new StringMatcher("*", true, false); //$NON-NLS-1$ - /** - * Remote content manager to retrieve content in the background. - */ - private DeferredTreeContentManager fManager; - - /** - * We only want to use the DeferredContentManager, the first time - * because the Outliner is initialize in the UI thread. So to not block - * the UI thread we deferred, after it is not necessary the reconciler is - * running in a separate thread not affecting the UI. - */ - private boolean fUseContentManager = false; - public CContentOutlinerProvider(TreeViewer viewer) { this(viewer, null); } @@ -91,68 +75,6 @@ public class CContentOutlinerProvider extends BaseCElementContentProvider { super(true, true); treeViewer = viewer; setIncludesGrouping(PreferenceConstants.getPreferenceStore().getBoolean(PreferenceConstants.OUTLINE_GROUP_INCLUDES)); - fManager = createContentManager(viewer, site); - } - - /** - * Subclass of DeferredTreeContentManager used to refresh - * the outline when the "group includes" setting is enabled. - */ - class DeferredTreeCContentManager extends DeferredTreeContentManager { - - public DeferredTreeCContentManager(AbstractTreeViewer viewer, IWorkbenchPartSite site) { - super(CContentOutlinerProvider.this, viewer, site); - } - - public DeferredTreeCContentManager(AbstractTreeViewer viewer) { - super(CContentOutlinerProvider.this, viewer); - } - - protected IElementCollector createElementCollector(final Object parent, - final PendingUpdateAdapter placeholder) { - - // Return a special element collector when the parent - // is the translation unit. In that case we need to - // refresh the outline when all the content has become - // available. - if (!(parent instanceof ITranslationUnit)) { - return super.createElementCollector(parent, placeholder); - } - return new IElementCollector() { - public void add(Object element, IProgressMonitor monitor) { - add(new Object[] { element }, monitor); - } - - public void add(Object[] elements, IProgressMonitor monitor) { - addChildren(parent, elements, monitor); - } - - public void done() { - runClearPlaceholderJob(placeholder); - // runClearPlaceholderJob uses a WorkbenchJob and contentUpdated - // executes via asyncExec(). There can be race conditions if we - // don't wrap contentUpdated in a job. - if (CContentOutlinerProvider.this.fIncludesGrouping) { - WorkbenchJob job = new WorkbenchJob("") { //$NON-NLS-1$ - - public IStatus runInUIThread(IProgressMonitor monitor) { - contentUpdated(); - return Status.OK_STATUS; - } - }; - job.setSystem(true); - job.schedule(); - } - } - }; - } - } - - protected DeferredTreeContentManager createContentManager(TreeViewer viewer, IWorkbenchPartSite site) { - if (site == null) { - return new DeferredTreeCContentManager(viewer); - } - return new DeferredTreeCContentManager(viewer, site); } /** @@ -229,37 +151,30 @@ public class CContentOutlinerProvider extends BaseCElementContentProvider { PreferenceConstants.getPreferenceStore().removePropertyChangeListener(fPropertyListener); fPropertyListener = null; } - if (root != null) { - fManager.cancel(root); - } } - /** - * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, - * java.lang.Object, java.lang.Object) + /* + * @see org.eclipse.cdt.internal.ui.BaseCElementContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object) */ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { boolean isTU = newInput instanceof ITranslationUnit; - if (isTU && fListener == null) { - fUseContentManager = true; - if (root != null) { - fManager.cancel(root); - } + if (isTU) { root = (ITranslationUnit) newInput; - fListener = new ElementChangedListener(); - CoreModel.getDefault().addElementChangedListener(fListener); - fPropertyListener = new PropertyListener(); - PreferenceConstants.getPreferenceStore().addPropertyChangeListener( - fPropertyListener); - } else if (!isTU && fListener != null) { - fUseContentManager = false; - CoreModel.getDefault().removeElementChangedListener(fListener); - fListener = null; - root = null; - if (oldInput != null) { - fManager.cancel(oldInput); + if (fListener == null) { + fListener= new ElementChangedListener(); + CoreModel.getDefault().addElementChangedListener(fListener); + fPropertyListener= new PropertyListener(); + PreferenceConstants.getPreferenceStore().addPropertyChangeListener(fPropertyListener); } + } else { + if (fListener != null) { + CoreModel.getDefault().removeElementChangedListener(fListener); + PreferenceConstants.getPreferenceStore().removePropertyChangeListener(fPropertyListener); + fListener= null; + fPropertyListener= null; + } + root= null; } } @@ -269,9 +184,11 @@ public class CContentOutlinerProvider extends BaseCElementContentProvider { public Object[] getChildren(Object element) { Object[] children = null; // Use the deferred manager for the first time (when parsing) - if (fUseContentManager && element instanceof ITranslationUnit) { - children = fManager.getChildren(element); - fUseContentManager = false; + if (element instanceof ITranslationUnit) { + ITranslationUnit unit= (ITranslationUnit)element; + if (!unit.isOpen()) { + children= new Object[] { new PendingUpdateAdapter() }; + } } if (children == null) { children = super.getChildren(element); @@ -292,9 +209,6 @@ public class CContentOutlinerProvider extends BaseCElementContentProvider { * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object) */ public boolean hasChildren(Object element) { - if (fUseContentManager) { - return fManager.mayHaveChildren(element); - } return super.hasChildren(element); } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CEditor.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CEditor.java index cbe5b2f4e9c..cac83bbfcb2 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CEditor.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CEditor.java @@ -74,6 +74,7 @@ import org.eclipse.jface.text.source.IAnnotationModel; import org.eclipse.jface.text.source.ICharacterPairMatcher; import org.eclipse.jface.text.source.IOverviewRuler; import org.eclipse.jface.text.source.ISourceViewer; +import org.eclipse.jface.text.source.ISourceViewerExtension2; import org.eclipse.jface.text.source.IVerticalRuler; import org.eclipse.jface.text.source.SourceViewerConfiguration; import org.eclipse.jface.text.source.projection.ProjectionAnnotationModel; @@ -138,7 +139,6 @@ import org.eclipse.cdt.core.IPositionConverter; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; import org.eclipse.cdt.core.dom.ast.gnu.cpp.GPPLanguage; import org.eclipse.cdt.core.formatter.DefaultCodeFormatterConstants; -import org.eclipse.cdt.core.index.IIndex; import org.eclipse.cdt.core.model.CModelException; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.ICProject; @@ -156,8 +156,6 @@ import org.eclipse.cdt.ui.actions.OpenViewActionGroup; import org.eclipse.cdt.ui.text.ICPartitions; import org.eclipse.cdt.ui.text.folding.ICFoldingStructureProvider; -import org.eclipse.cdt.internal.corext.util.SimplePositionTracker; - import org.eclipse.cdt.internal.ui.CPluginImages; import org.eclipse.cdt.internal.ui.ICHelpContextIds; import org.eclipse.cdt.internal.ui.IContextMenuConstants; @@ -186,9 +184,9 @@ import org.eclipse.cdt.internal.ui.util.CUIHelp; /** - * C specific text editor. + * C/C++ source editor. */ -public class CEditor extends TextEditor implements ISelectionChangedListener, IReconcilingParticipant, ICReconcilingListener { +public class CEditor extends TextEditor implements ISelectionChangedListener, ICReconcilingListener { class AdaptedSourceViewer extends CSourceViewer { @@ -1159,7 +1157,22 @@ public class CEditor extends TextEditor implements ISelectionChangedListener, IR * @see org.eclipse.ui.texteditor.AbstractTextEditor#doSetInput(org.eclipse.ui.IEditorInput) */ protected void doSetInput(IEditorInput input) throws CoreException { + boolean reuse= getEditorInput() != null; + super.doSetInput(input); + + if (reuse) { + // in case language changed, need to reconfigure the viewer + ISourceViewer viewer= getSourceViewer(); + if (viewer instanceof ISourceViewerExtension2) { + ISourceViewerExtension2 viewerExt2= (ISourceViewerExtension2)viewer; + viewerExt2.unconfigure(); + CSourceViewerConfiguration cConfig= (CSourceViewerConfiguration)getSourceViewerConfiguration(); + cConfig.resetScanners(); + viewer.configure(cConfig); + } + } + setOutlinePageInput(fOutlinePage, input); if (fProjectionModelUpdater != null) { @@ -1548,7 +1561,7 @@ public class CEditor extends TextEditor implements ISelectionChangedListener, IR * @param element Element to select. */ public void setSelection(ICElement element) { - if (element instanceof ISourceReference) { + if (element instanceof ISourceReference && !(element instanceof ITranslationUnit)) { ISourceReference reference = (ISourceReference) element; // set hightlight range setSelection(reference, true); @@ -2471,51 +2484,6 @@ public class CEditor extends TextEditor implements ISelectionChangedListener, IR } } - /* - * @see org.eclipse.cdt.internal.ui.editor.IReconcilingParticipant#reconciled() - */ - public void reconciled(boolean somethingHasChanged) { - if (getSourceViewer() == null || getSourceViewer().getTextWidget() == null) { - return; - } - // this method must be called in a background thread - assert getSourceViewer().getTextWidget().getDisplay().getThread() != Thread.currentThread(); - - if (fReconcilingListeners.size() > 0) { - // create AST and notify ICReconcilingListeners - ICElement cElement= getInputCElement(); - if (cElement == null) { - return; - } - - aboutToBeReconciled(); - - // track changes to the document while parsing - IDocument doc= getDocumentProvider().getDocument(getEditorInput()); - SimplePositionTracker positionTracker= new SimplePositionTracker(); - positionTracker.startTracking(doc); - - ASTProvider astProvider= CUIPlugin.getDefault().getASTProvider(); - IIndex index; - try { - index = CCorePlugin.getIndexManager().getIndex(cElement.getCProject()); - index.acquireReadLock(); - } catch (CoreException e) { - CUIPlugin.getDefault().log(e); - return; - } catch (InterruptedException e) { - return; - } - try { - IASTTranslationUnit ast= astProvider.createAST(cElement, index, null); - reconciled(ast, positionTracker, null); - } finally { - index.releaseReadLock(); - positionTracker.stopTracking(); - } - } - } - /* * @see org.eclipse.ui.texteditor.AbstractDecoratedTextEditor#collectContextMenuPreferencePages() */ diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/IReconcilingParticipant.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/IReconcilingParticipant.java index b5e0c5d56b0..43253429830 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/IReconcilingParticipant.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/IReconcilingParticipant.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2004, 2006 IBM Corporation and others. + * Copyright (c) 2004, 2007 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -15,6 +15,7 @@ package org.eclipse.cdt.internal.ui.editor; /** * Interface of an object participating in reconciling. + * @deprecated in favour of {@link org.eclipse.cdt.internal.ui.text.ICReconcilingListener} */ public interface IReconcilingParticipant { diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CReconcilingStrategy.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CReconcilingStrategy.java index a4a90598e2b..71616db2c60 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CReconcilingStrategy.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CReconcilingStrategy.java @@ -33,8 +33,6 @@ import org.eclipse.cdt.ui.IWorkingCopyManager; import org.eclipse.cdt.internal.core.model.CModelManager; -import org.eclipse.cdt.internal.ui.editor.IReconcilingParticipant; - public class CReconcilingStrategy implements IReconcilingStrategy, IReconcilingStrategyExtension { @@ -73,6 +71,7 @@ public class CReconcilingStrategy implements IReconcilingStrategy, IReconcilingS /* * @see org.eclipse.jface.text.reconciler.IReconcilingStrategy#reconcile(org.eclipse.jface.text.reconciler.DirtyRegion, org.eclipse.jface.text.IRegion) + * Called for incremental reconciler only - currently not used (no shift deltas) */ public void reconcile(DirtyRegion dirtyRegion, IRegion region) { // consistent data needs not further checks ! @@ -114,13 +113,13 @@ public class CReconcilingStrategy implements IReconcilingStrategy, IReconcilingS } private void reconcile(final boolean initialReconcile) { + boolean computeAST= fEditor instanceof ICReconcilingListener; IASTTranslationUnit ast= null; IWorkingCopy workingCopy= fManager.getWorkingCopy(fEditor.getEditorInput()); if (workingCopy == null) { return; } try { - final boolean computeAST= initialReconcile || CUIPlugin.getDefault().getASTProvider().isActive(workingCopy); // reconcile synchronized (workingCopy) { ast= workingCopy.reconcile(computeAST, true, fProgressMonitor); @@ -131,18 +130,10 @@ public class CReconcilingStrategy implements IReconcilingStrategy, IReconcilingS IStatus status= new Status(IStatus.ERROR, CUIPlugin.PLUGIN_ID, IStatus.OK, "Error in CDT UI during reconcile", e); //$NON-NLS-1$ CUIPlugin.getDefault().log(status); } finally { - if (fEditor instanceof ICReconcilingListener) { + if (computeAST) { IIndex index= null; if (ast != null) { index= ast.getIndex(); - if (index != null) { - try { - index.acquireReadLock(); - } catch (InterruptedException exc) { - ast= null; - index= null; - } - } } try { ((ICReconcilingListener)fEditor).reconciled(ast, null, fProgressMonitor); @@ -152,13 +143,6 @@ public class CReconcilingStrategy implements IReconcilingStrategy, IReconcilingS } } } - if (fProgressMonitor != null && fProgressMonitor.isCanceled()) { - return; - } - if (ast == null && fEditor instanceof IReconcilingParticipant && workingCopy.exists()) { - IReconcilingParticipant p= (IReconcilingParticipant) fEditor; - p.reconciled(true); - } } } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/folding/DefaultCFoldingStructureProvider.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/folding/DefaultCFoldingStructureProvider.java index 47c507c89c4..ff5f03877ec 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/folding/DefaultCFoldingStructureProvider.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/folding/DefaultCFoldingStructureProvider.java @@ -58,9 +58,7 @@ import org.eclipse.cdt.core.dom.ast.IASTPreprocessorStatement; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; 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.ICElement; -import org.eclipse.cdt.core.model.ICElementDelta; import org.eclipse.cdt.core.model.IElementChangedListener; import org.eclipse.cdt.core.model.IMember; import org.eclipse.cdt.core.model.IParent; @@ -104,13 +102,16 @@ public class DefaultCFoldingStructureProvider implements ICFoldingStructureProvi * @see org.eclipse.cdt.internal.ui.text.ICReconcilingListener#reconciled(org.eclipse.cdt.core.dom.ast.IASTTranslationUnit, org.eclipse.cdt.core.IPositionConverter, org.eclipse.core.runtime.IProgressMonitor) */ public void reconciled(IASTTranslationUnit ast, IPositionConverter positionTracker, IProgressMonitor progressMonitor) { - if (fInput == null || ast == null || fReconciling) { + if (fInput == null || fReconciling) { + return; + } + if (fPreprocessorBranchFoldingEnabled && ast == null) { return; } fReconciling= true; try { - FoldingStructureComputationContext ctx= createContext(fInitialASTReconcile); - fInitialASTReconcile= false; + FoldingStructureComputationContext ctx= createContext(fInitialReconcilePending); + fInitialReconcilePending= false; if (fPreprocessorBranchFoldingEnabled) { ctx.fAST= ast; ctx.fASTPositionConverter= positionTracker; @@ -350,44 +351,6 @@ public class DefaultCFoldingStructureProvider implements ICFoldingStructureProvi } - private class ElementChangedListener implements IElementChangedListener { - - /* - * @see org.eclipse.cdt.core.IElementChangedListener#elementChanged(org.eclipse.cdt.core.ElementChangedEvent) - */ - public void elementChanged(ElementChangedEvent e) { - ICElementDelta delta= findElement(fInput, e.getDelta()); - if (delta != null) - update(createContext(false)); - } - - private ICElementDelta findElement(ICElement target, ICElementDelta delta) { - - if (delta == null || target == null) - return null; - - ICElement element= delta.getElement(); - - if (element.getElementType() > ICElement.C_UNIT) - return null; - - if (target.equals(element)) - return delta; - - ICElementDelta[] children= delta.getAffectedChildren(); - if (children == null || children.length == 0) - return null; - - for (int i= 0; i < children.length; i++) { - ICElementDelta d= findElement(target, children[i]); - if (d != null) - return d; - } - - return null; - } - } - /** * Projection position that will return two foldable regions: one folding away * the region from after the '/*' to the beginning of the content, the other @@ -705,7 +668,7 @@ public class DefaultCFoldingStructureProvider implements ICFoldingStructureProvi private boolean fCommentFoldingEnabled= true; private ICReconcilingListener fReconilingListener; - boolean fInitialASTReconcile= true; + boolean fInitialReconcilePending= true; /** @@ -781,15 +744,10 @@ public class DefaultCFoldingStructureProvider implements ICFoldingStructureProvi handleProjectionDisabled(); if (fEditor instanceof CEditor) { - fInitialASTReconcile= true; + fInitialReconcilePending= true; initialize(); - if (fPreprocessorBranchFoldingEnabled || fCommentFoldingEnabled) { - fReconilingListener= new PreprocessorBranchesReconciler(); - ((CEditor)fEditor).addReconcileListener(fReconilingListener); - } else { - fElementListener= new ElementChangedListener(); - CoreModel.getDefault().addElementChangedListener(fElementListener); - } + fReconilingListener= new PreprocessorBranchesReconciler(); + ((CEditor)fEditor).addReconcileListener(fReconilingListener); } } @@ -1087,11 +1045,6 @@ public class DefaultCFoldingStructureProvider implements ICFoldingStructureProvi // ignore } } - IParent parent= (IParent) fInput; - try { - computeFoldingStructure(parent.getChildren(), ctx); - } catch (CModelException x) { - } if (fPreprocessorBranchFoldingEnabled) { IASTTranslationUnit ast= ctx.getAST(); if (ast == null) { @@ -1101,19 +1054,26 @@ public class DefaultCFoldingStructureProvider implements ICFoldingStructureProvi if (ast != null) { ctx.fAST= ast; ctx.fASTPositionConverter= null; - fInitialASTReconcile= false; + fInitialReconcilePending= false; computeFoldingStructure(ast, ctx); } return Status.OK_STATUS; } }); - if (!status.isOK()) { + if (status.matches(IStatus.ERROR)) { CUIPlugin.getDefault().log(status); } } else { computeFoldingStructure(ast, ctx); } } + if (!fInitialReconcilePending) { + IParent parent= (IParent) fInput; + try { + computeFoldingStructure(parent.getChildren(), ctx); + } catch (CModelException x) { + } + } } /**