1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-03 07:05:24 +02:00

The CView to update with each reconcile : [Bug 53074]

This commit is contained in:
Hoda Amer 2004-02-27 21:07:56 +00:00
parent f0ac94629e
commit e7dfb880a4
17 changed files with 352 additions and 81 deletions

View file

@ -1,3 +1,8 @@
2004-02-27 Hoda Amer
Fixed [Bug 53074] The CView to update with each reconcile
Added the ability for CView to update based on the translation unit working copy
if one exists.
2004-02-27 Alain Magloire
Performance improvement in the IBinaryParser and

View file

@ -15,16 +15,74 @@ import java.util.EventObject;
* @see ICElementDelta
*/
public class ElementChangedEvent extends EventObject {
/**
* Event type constant (bit mask) indicating an after-the-fact
* report of creations, deletions, and modifications
* to one or more C element(s) expressed as a hierarchical
* C element delta as returned by <code>getDelta()</code>.
*
* Note: this notification occurs during the corresponding POST_CHANGE
* resource change notification, and contains a full delta accounting for
* any CModel operation and/or resource change.
*
* @see ICElementDelta
* @see org.eclipse.core.resources.IResourceChangeEvent
* @see #getDelta()
* @since 2.0
*/
public static final int POST_CHANGE = 1;
/**
* Event type constant (bit mask) indicating an after-the-fact
* report of creations, deletions, and modifications
* to one or more C element(s) expressed as a hierarchical
* C element delta as returned by <code>getDelta</code>.
*
* Note: this notification occurs during the corresponding PRE_AUTO_BUILD
* resource change notification. The delta, which is notified here, only contains
* information relative to the previous CModel operations (in other words,
* it ignores the possible resources which have changed outside C operations).
* In particular, it is possible that the CModel be inconsistent with respect to
* resources, which got modified outside CModel operations (it will only be
* fully consistent once the POST_CHANGE notification has occurred).
*
* @see ICElementDelta
* @see org.eclipse.core.resources.IResourceChangeEvent
* @see #getDelta()
* @since 2.0
* @deprecated - no longer used, such deltas are now notified during POST_CHANGE
*/
public static final int PRE_AUTO_BUILD = 2;
/**
* Event type constant (bit mask) indicating an after-the-fact
* report of creations, deletions, and modifications
* to one or more C element(s) expressed as a hierarchical
* C element delta as returned by <code>getDelta</code>.
*
* Note: this notification occurs as a result of a working copy reconcile
* operation.
*
* @see ICElementDelta
* @see org.eclipse.core.resources.IResourceChangeEvent
* @see #getDelta()
* @since 2.0
*/
public static final int POST_RECONCILE = 4;
/*
* Event type indicating the nature of this event.
* It can be a combination either:
* - POST_CHANGE
* - PRE_AUTO_BUILD
* - POST_RECONCILE
*/
private int type;
/**
* Creates an new element changed event (based on a <code>ICElementDelta</code>).
*
* @param delta the C element delta.
*/
public ElementChangedEvent(ICElementDelta delta) {
public ElementChangedEvent(ICElementDelta delta, int type) {
super(delta);
this.type = type;
}
/**
* Returns the delta describing the change.
@ -33,4 +91,16 @@ public class ElementChangedEvent extends EventObject {
public ICElementDelta getDelta() {
return (ICElementDelta) source;
}
/**
* Returns the type of event being reported.
*
* @return one of the event type constants
* @see #POST_CHANGE
* @see #PRE_AUTO_BUILD
* @see #POST_RECONCILE
* @since 2.0
*/
public int getType() {
return this.type;
}
}

View file

@ -5,7 +5,9 @@ package org.eclipse.cdt.internal.core.model;
* All Rights Reserved.
*/
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.IBinaryParser.IBinaryFile;
import org.eclipse.cdt.core.model.ElementChangedEvent;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICModel;
import org.eclipse.cdt.core.model.ICProject;
@ -14,7 +16,6 @@ import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceVisitor;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.cdt.core.CCorePlugin;
public class BinaryRunner {
IProject project;
@ -92,7 +93,7 @@ public class BinaryRunner {
cdelta.added(children[i]);
}
factory.registerCModelDelta(cdelta);
factory.fire();
factory.fire(ElementChangedEvent.POST_CHANGE);
}
}

View file

@ -439,7 +439,7 @@ public class CModelManager implements IResourceChangeListener {
CElementDelta delta = new CElementDelta(getCModel());
delta.binaryParserChanged(celement);
registerCModelDelta(delta);
fire();
fire(ElementChangedEvent.POST_CHANGE);
}
}
}
@ -705,7 +705,7 @@ public class CModelManager implements IResourceChangeListener {
registerCModelDelta(translatedDeltas[i]);
}
}
fire();
fire(ElementChangedEvent.POST_CHANGE);
}
} catch (Exception e) {
e.printStackTrace();
@ -719,24 +719,15 @@ public class CModelManager implements IResourceChangeListener {
* Fire C Model deltas, flushing them after the fact.
* If the firing mode has been turned off, this has no effect.
*/
public synchronized void fire() {
public synchronized void fire(int eventType) {
if (fFire) {
mergeDeltas();
try {
Iterator iterator = fCModelDeltas.iterator();
while (iterator.hasNext()) {
ICElementDelta delta= (ICElementDelta) iterator.next();
// Refresh internal scopes
ElementChangedEvent event= new ElementChangedEvent(delta);
// Clone the listeners since they could remove themselves when told about the event
// (eg. a type hierarchy becomes invalid (and thus it removes itself) when the type is removed
ArrayList listeners= (ArrayList) fElementChangedListeners.clone();
for (int i= 0; i < listeners.size(); i++) {
IElementChangedListener listener= (IElementChangedListener) listeners.get(i);
listener.elementChanged(event);
}
fire(delta, eventType);
}
} finally {
// empty the queue
@ -745,6 +736,17 @@ public class CModelManager implements IResourceChangeListener {
}
}
public synchronized void fire(ICElementDelta delta, int eventType) {
ElementChangedEvent event= new ElementChangedEvent(delta, eventType);
// Clone the listeners since they could remove themselves when told about the event
// (eg. a type hierarchy becomes invalid (and thus it removes itself) when the type is removed
ArrayList listeners= (ArrayList) fElementChangedListeners.clone();
for (int i= 0; i < listeners.size(); i++) {
IElementChangedListener listener= (IElementChangedListener) listeners.get(i);
listener.elementChanged(event);
}
}
/**
* Flushes all deltas without firing them.
*/
@ -814,7 +816,7 @@ public class CModelManager implements IResourceChangeListener {
// fire only if there were no awaiting deltas (if there were, they would come from a resource modifying operation)
// and the operation has not modified any resource
if (!hadAwaitingDeltas && !operation.hasModifiedResource()) {
fire();
fire(ElementChangedEvent.POST_CHANGE);
} // else deltas are fired while processing the resource delta
}
}

View file

@ -6,27 +6,27 @@ package org.eclipse.cdt.internal.core.model;
*/
import java.io.InputStream;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.resources.IResourceStatus;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.ElementChangedEvent;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.model.ICElementDelta;
import org.eclipse.cdt.core.model.ICModel;
import org.eclipse.cdt.core.model.ICModelStatus;
import org.eclipse.cdt.core.model.ICModelStatusConstants;
import org.eclipse.cdt.core.model.ICElementDelta;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceStatus;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.SubProgressMonitor;
/**
* Defines behavior common to all C Model operations
@ -495,7 +495,7 @@ public abstract class CModelOperation implements IWorkspaceRunnable, IProgressMo
// Fire if we change somethings
if (!hasModifiedResource()) {
CModelManager manager= CModelManager.getDefault();
manager.fire();
manager.fire(ElementChangedEvent.POST_CHANGE);
}
}
}

View file

@ -21,6 +21,7 @@ import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.ICDescriptor;
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.ICModelStatus;
@ -248,7 +249,7 @@ public class PathEntryManager {
//affectedProject.setRawPathEntries(affectedProject.getRawPathEntries(), progressMonitor);
}
if (shouldFire) {
mgr.fire();
mgr.fire(ElementChangedEvent.POST_CHANGE);
}
}
}, monitor);

View file

@ -293,13 +293,11 @@ public class WorkingCopy extends TranslationUnit implements IWorkingCopy {
*/
public boolean reconcile(boolean forceProblemDetection, IProgressMonitor monitor)
throws CModelException {
boolean somethingChanged = false;
if (this.useCount == 0) throw newNotPresentException(); //was destroyed
if (monitor != null){
if (monitor.isCanceled()) return somethingChanged;
if (monitor.isCanceled()) return false;
monitor.beginTask("element.reconciling", 10); //$NON-NLS-1$
}
@ -314,14 +312,13 @@ public class WorkingCopy extends TranslationUnit implements IWorkingCopy {
// update the element infos with the content of the working copy
this.makeConsistent(monitor);
deltaBuilder.buildDeltas();
somethingChanged = true;
}
if (monitor != null) monitor.worked(2);
// force problem detection? - if structure was consistent
if (forceProblemDetection && wasConsistent){
if (monitor != null && monitor.isCanceled()) return somethingChanged;
if (monitor != null && monitor.isCanceled()) return (!wasConsistent);
//IProblemRequestor problemRequestor = this.getProblemRequestor();
//if (problemRequestor != null && problemRequestor.isActive()){
@ -332,15 +329,17 @@ public class WorkingCopy extends TranslationUnit implements IWorkingCopy {
}
// fire the deltas
//if (deltaBuilder != null){
// if ((deltaBuilder.delta != null) && (deltaBuilder.delta.getAffectedChildren().length > 0)) {
// CModelManager.getDefault().fire(deltaBuilder.delta, ElementChangedEvent.POST_RECONCILE);
// }
//}
if (deltaBuilder != null){
if ((deltaBuilder.delta != null) && (deltaBuilder.delta.getAffectedChildren().length > 0)) {
CModelManager.getDefault().fire(deltaBuilder.delta, ElementChangedEvent.POST_RECONCILE);
}
}
} finally {
if (monitor != null) monitor.done();
}
return somethingChanged;
// An indication if something has changed
return (!wasConsistent);
}
/**
* @see org.eclipse.cdt.core.model.IWorkingCopy#restore()

View file

@ -32,6 +32,36 @@ public class CConventions {
private final static char fgDot= '.';
private final static char fgColon= ':';
private static boolean isValidIdentifier(String name) {
if (name == null) {
return false;
}
String trimmed = name.trim();
if ((!name.equals(trimmed)) || (name.indexOf(" ") != -1) ){
return false;
}
int index = name.lastIndexOf(scopeResolutionOperator);
char[] scannedID;
if (index != -1) {
return false;
}
scannedID = name.toCharArray();
if (scannedID != null) {
IStatus status = ResourcesPlugin.getWorkspace().validateName(new String(scannedID), IResource.FILE);
if (!status.isOK()) {
return false;
}
if (CharOperation.contains('$', scannedID)) {
return false;
}
return true;
} else {
return false;
}
}
/**
* Validate the given CPP class name, either simple or qualified.
* For example, <code>"A::B::C"</code>, or <code>"C"</code>.
@ -134,4 +164,56 @@ public class CConventions {
}
return CModelStatus.VERIFIED_OK;
}
/**
* Validate the given field name.
* <p>
* Syntax of a field name corresponds to VariableDeclaratorId (JLS2 8.3).
* For example, <code>"x"</code>.
*
* @param name the name of a field
* @return a status object with code <code>IStatus.OK</code> if
* the given name is valid as a field name, otherwise a status
* object indicating what is wrong with the name
*/
public static IStatus validateFieldName(String name) {
return validateIdentifier(name);
}
/**
* Validate the given C identifier.
* The identifier must not have the same spelling as a C keyword,
* boolean literal (<code>"true"</code>, <code>"false"</code>), or null literal (<code>"null"</code>).
* See section 3.8 of the <em>C Language Specification, Second Edition</em> (JLS2).
* A valid identifier can act as a simple type name, method name or field name.
*
* @param id the C identifier
* @return a status object with code <code>IStatus.OK</code> if
* the given identifier is a valid C identifier, otherwise a status
* object indicating what is wrong with the identifier
*/
public static IStatus validateIdentifier(String id) {
if (isValidIdentifier(id)) {
return CModelStatus.VERIFIED_OK;
} else {
return new Status(IStatus.ERROR, CCorePlugin.PLUGIN_ID, -1, Util.bind("convention.illegalIdentifier", id), null); //$NON-NLS-1$
}
}
/**
* Validate the given method name.
* The special names "&lt;init&gt;" and "&lt;clinit&gt;" are not valid.
* <p>
* The syntax for a method name is defined by Identifier
* of MethodDeclarator (JLS2 8.4). For example "println".
*
* @param name the name of a method
* @return a status object with code <code>IStatus.OK</code> if
* the given name is valid as a method name, otherwise a status
* object indicating what is wrong with the name
*/
public static IStatus validateMethodName(String name) {
return validateIdentifier(name);
}
}

View file

@ -1,3 +1,8 @@
2004-02-27 Hoda Amer
Fixed [Bug 53074] The CView to update with each reconcile
Added the ability for CView to update based on the translation unit working copy
if one exists.
2004-02-26 Andrew Niefer
externalized strings for all packages

View file

@ -21,6 +21,8 @@ import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.model.ILibraryReference;
import org.eclipse.cdt.core.model.IParent;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.model.IWorkingCopy;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
@ -58,7 +60,7 @@ public class BaseCElementContentProvider implements ITreeContentProvider {
public BaseCElementContentProvider(boolean provideMembers, boolean provideWorkingCopy) {
fProvideMembers= provideMembers;
//fProvideWorkingCopy= provideWorkingCopy;
fProvideWorkingCopy= provideWorkingCopy;
}
/**
@ -82,7 +84,7 @@ public class BaseCElementContentProvider implements ITreeContentProvider {
* a working copy of a compilation unit
*/
public void setProvideWorkingCopy(boolean b) {
//fProvideWorkingCopy= b;
fProvideWorkingCopy= b;
}
/**
@ -124,9 +126,20 @@ public class BaseCElementContentProvider implements ITreeContentProvider {
return getCProjectResources((ICProject)celement);
} else if (celement instanceof ICContainer) {
return getCResources((ICContainer)celement);
} else if (celement.getElementType() == ICElement.C_UNIT) {
} else if (celement instanceof ITranslationUnit) {
// if we want to get the chidren of a translation unit
if (fProvideMembers) {
return ((IParent)element).getChildren();
// if we want to use the working copy of it
if(fProvideWorkingCopy){
// if it is not already a working copy
if(!(celement instanceof IWorkingCopy)){
// if it has a valid working copy
IWorkingCopy copy = CUIPlugin.getDefault().getWorkingCopyManager().getWorkingCopy((ITranslationUnit)celement);
if(copy != null)
return ((IParent)copy).getChildren();
}
}
return ((IParent)celement).getChildren();
}
} else if (celement instanceof IParent) {
return (Object[])((IParent)celement).getChildren();

View file

@ -8,7 +8,12 @@ package org.eclipse.cdt.internal.ui.editor;
import java.util.ArrayList;
import java.util.Iterator;
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.ITranslationUnit;
import org.eclipse.cdt.core.model.IWorkingCopy;
import org.eclipse.cdt.internal.core.model.WorkingCopy;
import org.eclipse.cdt.internal.ui.CFileElementWorkingCopy;
@ -37,12 +42,14 @@ import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.IStorageEditorInput;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.part.IPage;
import org.eclipse.ui.part.IPageSite;
import org.eclipse.ui.part.Page;
import org.eclipse.ui.texteditor.IDocumentProvider;
@ -95,16 +102,7 @@ public class CContentOutlinePage extends Page implements IContentOutlinePage, IS
* Called by the editor to signal that the content has updated.
*/
public void contentUpdated() {
if (fInput != null) {
try {
//fInput.update();
fInput.reconcile();
} catch (CoreException e) {
CUIPlugin.getDefault().log(e.getStatus());
fInput= null;
return;
}
if (fInput != null) {
final TreeViewer treeViewer= getTreeViewer();
if (treeViewer != null && !treeViewer.getControl().isDisposed()) {
treeViewer.getControl().getDisplay().asyncExec(new Runnable() {
@ -168,7 +166,6 @@ public class CContentOutlinePage extends Page implements IContentOutlinePage, IS
treeViewer = new ProblemTreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
treeViewer.addSelectionChangedListener(this);
//treeViewer.setContentProvider(new CModelContentProvider());
treeViewer.setContentProvider(new CElementContentProvider(true, true));
treeViewer.setLabelProvider(new StandardCElementLabelProvider());
treeViewer.setAutoExpandLevel(AbstractTreeViewer.ALL_LEVELS);

View file

@ -68,6 +68,7 @@ import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IEditorActionBarContributor;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IFileEditorInput;
@ -103,7 +104,7 @@ import org.eclipse.ui.views.tasklist.TaskList;
/**
* C specific text editor.
*/
public class CEditor extends TextEditor implements ISelectionChangedListener, IShowInSource {
public class CEditor extends TextEditor implements ISelectionChangedListener, IShowInSource , IReconcilingParticipant{
/** The outline page */
protected CContentOutlinePage fOutlinePage;
@ -959,4 +960,13 @@ public class CEditor extends TextEditor implements ISelectionChangedListener, IS
if (statusLine != null)
statusLine.setMessage(true, msg, null);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.ui.editor.IReconcilingParticipant#reconciled()
*/
public void reconciled(boolean somethingHasChanged) {
if(somethingHasChanged)
fOutlinePage.contentUpdated();
}
}

View file

@ -0,0 +1,25 @@
/*******************************************************************************
* Copyright (c) 2000, 2003 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.ui.editor;
/**
* Interface of an object participating in reconciling.
*/
public interface IReconcilingParticipant {
/**
* Called after reconciling has been finished.
*/
void reconciled(boolean SomethingHasChanged);
}

View file

@ -12,9 +12,13 @@
package org.eclipse.cdt.internal.ui.editor;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.model.IWorkingCopy;
import org.eclipse.cdt.ui.IWorkingCopyManager;
import org.eclipse.cdt.ui.IWorkingCopyManagerExtension;
@ -42,6 +46,7 @@ public class WorkingCopyManager implements IWorkingCopyManager, IWorkingCopyMana
public WorkingCopyManager(CDocumentProvider provider) {
Assert.isNotNull(provider);
fDocumentProvider= provider;
fMap = new HashMap();
}
/*
@ -81,9 +86,30 @@ public class WorkingCopyManager implements IWorkingCopyManager, IWorkingCopyMana
*/
public IWorkingCopy getWorkingCopy(IEditorInput input) {
IWorkingCopy unit= fMap == null ? null : (IWorkingCopy) fMap.get(input);
return unit != null ? unit : fDocumentProvider.getWorkingCopy(input);
if(unit != null)
return unit;
IWorkingCopy copy = fDocumentProvider.getWorkingCopy(input);
if(copy != null)
fMap.put(input, copy);
return copy;
}
/*
* @see org.eclipse.cdt.ui.IWorkingCopyManager#getWorkingCopy(org.eclipse.cdt.core.model.ITranslationUnit)
*/
public IWorkingCopy getWorkingCopy(ITranslationUnit unit){
if((fMap == null) || (fMap.size() == 0)){
return null;
} else {
List copies = new ArrayList(fMap.values());
Iterator i = copies.iterator();
while (i.hasNext()){
IWorkingCopy copy = (IWorkingCopy)i.next();
if(copy.getOriginalElement().equals(unit))
return copy;
}
}
return null;
}
/*
* @see org.eclipse.cdt.internal.ui.editor.IWorkingCopyManagerExtension#setWorkingCopy(org.eclipse.ui.IEditorInput, org.eclipse.cdt.core.model.ITranslationUnit)
*/

View file

@ -10,6 +10,7 @@ import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.model.IWorkingCopy;
import org.eclipse.cdt.internal.ui.editor.CContentOutlinePage;
import org.eclipse.cdt.internal.ui.editor.CEditor;
import org.eclipse.cdt.internal.ui.editor.IReconcilingParticipant;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.ui.IWorkingCopyManager;
import org.eclipse.core.runtime.IProgressMonitor;
@ -68,19 +69,23 @@ public class CReconcilingStrategy implements IReconcilingStrategy {
}
private void reconcile() {
boolean doUpdate = false;
boolean somethingHasChanged = false;
try {
ITranslationUnit tu = fManager.getWorkingCopy(fEditor.getEditorInput());
if (tu != null && tu.isWorkingCopy()) {
IWorkingCopy workingCopy = (IWorkingCopy)tu;
// reconcile
synchronized (workingCopy) {
doUpdate = workingCopy.reconcile(true, fProgressMonitor);
somethingHasChanged = workingCopy.reconcile(true, fProgressMonitor);
}
}
if(doUpdate){
fOutliner.contentUpdated();
// update participants
if (fEditor instanceof IReconcilingParticipant /*&& !fProgressMonitor.isCanceled()*/) {
IReconcilingParticipant p= (IReconcilingParticipant) fEditor;
p.reconciled(somethingHasChanged);
}
} catch(CModelException e) {
}

View file

@ -13,11 +13,11 @@ 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.ICModel;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.model.IElementChangedListener;
import org.eclipse.cdt.core.model.IParent;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.model.IWorkingCopy;
import org.eclipse.cdt.internal.core.model.ArchiveContainer;
import org.eclipse.cdt.internal.core.model.BinaryContainer;
import org.eclipse.cdt.internal.ui.BaseCElementContentProvider;
@ -52,8 +52,7 @@ public class CElementContentProvider extends BaseCElementContentProvider impleme
fViewer = (StructuredViewer)viewer;
if (oldInput == null && newInput != null) {
if (newInput instanceof ICModel)
CoreModel.getDefault().addElementChangedListener(this);
CoreModel.getDefault().addElementChangedListener(this);
} else if (oldInput != null && newInput == null) {
CoreModel.getDefault().removeElementChangedListener(this);
}
@ -264,14 +263,20 @@ public class CElementContentProvider extends BaseCElementContentProvider impleme
});
}
private void postRefresh(final Object root) {
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())
fViewer.refresh(root);
if (ctrl != null && !ctrl.isDisposed()){
fViewer.refresh(element);
if(element instanceof IWorkingCopy){
fViewer.refresh(((IWorkingCopy)element).getOriginalElement());
}
}
}
});
}
@ -282,9 +287,14 @@ public class CElementContentProvider extends BaseCElementContentProvider impleme
public void run() {
// 1GF87WR: ITPUI:ALL - SWTEx + NPE closing a workbench window.
Control ctrl= fViewer.getControl();
if (ctrl != null && !ctrl.isDisposed())
if (ctrl != null && !ctrl.isDisposed()){
// fViewer.add(parent, element);
fViewer.refresh(parent);
if(parent instanceof IWorkingCopy){
fViewer.refresh(((IWorkingCopy)parent).getOriginalElement());
}
}
}
});
}
@ -295,17 +305,25 @@ public class CElementContentProvider extends BaseCElementContentProvider impleme
public void run() {
// 1GF87WR: ITPUI:ALL - SWTEx + NPE closing a workbench window.
Control ctrl= fViewer.getControl();
if (ctrl != null && !ctrl.isDisposed())
// fViewer.remove(element);
fViewer.refresh(internalGetParent(element));
if (ctrl != null && !ctrl.isDisposed()) {
// fViewer.remove(element);
Object parent = internalGetParent(element);
fViewer.refresh(parent);
if(parent instanceof IWorkingCopy){
fViewer.refresh(((IWorkingCopy)parent).getOriginalElement());
}
}
}
});
}
private void postRunnable(final Runnable r) {
Control ctrl= fViewer.getControl();
if (ctrl != null && !ctrl.isDisposed())
ctrl.getDisplay().asyncExec(r);
if (ctrl != null && !ctrl.isDisposed()) {
ctrl.getDisplay().asyncExec(r);
}
}
/**

View file

@ -10,6 +10,7 @@
*******************************************************************************/
package org.eclipse.cdt.ui;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.model.IWorkingCopy;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.ui.IEditorInput;
@ -66,6 +67,17 @@ public interface IWorkingCopyManager {
* copy for this translation unit
*/
IWorkingCopy getWorkingCopy(IEditorInput input);
/**
* Returns the working copy remembered for the given translation unit if one exists
* in the current list of the working copy manager
*
* @param unit : the Translation unit
* @return the working copy of the translation unit, or <code>null</code> if the
* unit was not seen by the manager before.
*
*/
IWorkingCopy getWorkingCopy(ITranslationUnit unit);
/**
* Shuts down this working copy manager. All working copies still remembered