From 1594e1b8f981f24bfdc57081369c2675f9ed5c5d Mon Sep 17 00:00:00 2001 From: Alain Magloire Date: Wed, 6 Jul 2005 02:20:16 +0000 Subject: [PATCH] 2005-07-05 Alain Magloire Fix for PR 102327: ContentType framework. * model/org/eclipse/cdt/core/model/CoreModel.java * model/org/eclipse/cdt/internal/core/model/ContentTypeProcessor.java * model/org/eclipse/cdt/internal/core/model/TranslationUnit.java --- core/org.eclipse.cdt.core/ChangeLog | 6 ++ .../org/eclipse/cdt/core/model/CoreModel.java | 47 ++++++++++----- .../core/model/ContentTypeProcessor.java | 60 +++++++++++++++---- .../internal/core/model/TranslationUnit.java | 12 ++++ 4 files changed, 98 insertions(+), 27 deletions(-) diff --git a/core/org.eclipse.cdt.core/ChangeLog b/core/org.eclipse.cdt.core/ChangeLog index a3bce0bc620..dcf50b4798a 100644 --- a/core/org.eclipse.cdt.core/ChangeLog +++ b/core/org.eclipse.cdt.core/ChangeLog @@ -1,3 +1,9 @@ +2005-07-05 Alain Magloire + Fix for PR 102327: ContentType framework. + * model/org/eclipse/cdt/core/model/CoreModel.java + * model/org/eclipse/cdt/internal/core/model/ContentTypeProcessor.java + * model/org/eclipse/cdt/internal/core/model/TranslationUnit.java + 2005-07-05 Robert O'Callahan fix for bug# 102434 diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/CoreModel.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/CoreModel.java index fd365685a43..eef4b681bc2 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/CoreModel.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/CoreModel.java @@ -193,14 +193,25 @@ public class CoreModel { CCorePlugin.CONTENT_TYPE_CXXSOURCE }; } + /** * Return true if name is a valid name for a translation unit. */ public static boolean isValidTranslationUnitName(IProject project, String name) { - if (isValidHeaderUnitName(project, name)) { - return true; - } else if (isValidSourceUnitName(project, name)) { - return true; + IContentType contentType = CCorePlugin.getContentType(project, name); + if (contentType != null) { + String id = contentType.getId(); + if (CCorePlugin.CONTENT_TYPE_CHEADER.equals(id)) { + return true; + } else if (CCorePlugin.CONTENT_TYPE_CXXHEADER.equals(id)) { + return true; + } else if (CCorePlugin.CONTENT_TYPE_CSOURCE.equals(id)) { + return true; + } else if (CCorePlugin.CONTENT_TYPE_CXXSOURCE.equals(id)) { + return true; + } else if (CCorePlugin.CONTENT_TYPE_ASMSOURCE.equals(id)) { + return true; + } } return false; } @@ -209,10 +220,14 @@ public class CoreModel { * Return true if name is a valid name for a translation unit. */ public static boolean isValidHeaderUnitName(IProject project, String name) { - if (isValidCHeaderUnitName(project, name)) { - return true; - } else if (isValidCXXHeaderUnitName(project, name)) { - return true; + IContentType contentType = CCorePlugin.getContentType(project, name); + if (contentType != null) { + String id = contentType.getId(); + if (CCorePlugin.CONTENT_TYPE_CHEADER.equals(id)) { + return true; + } else if (CCorePlugin.CONTENT_TYPE_CXXHEADER.equals(id)) { + return true; + } } return false; } @@ -221,12 +236,16 @@ public class CoreModel { * Return true if name is a valid name for a translation unit. */ public static boolean isValidSourceUnitName(IProject project, String name) { - if (isValidCSourceUnitName(project, name)) { - return true; - } else if (isValidCXXSourceUnitName(project, name)) { - return true; - } else if (isValidASMSourceUnitName(project, name)) { - return true; + IContentType contentType = CCorePlugin.getContentType(project, name); + if (contentType != null) { + String id = contentType.getId(); + if (CCorePlugin.CONTENT_TYPE_CSOURCE.equals(id)) { + return true; + } else if (CCorePlugin.CONTENT_TYPE_CXXSOURCE.equals(id)) { + return true; + } else if (CCorePlugin.CONTENT_TYPE_ASMSOURCE.equals(id)) { + return true; + } } return false; } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ContentTypeProcessor.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ContentTypeProcessor.java index 6abeb8c59be..8227a58eea1 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ContentTypeProcessor.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ContentTypeProcessor.java @@ -19,6 +19,7 @@ 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.ICModel; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.model.IOpenable; @@ -49,14 +50,13 @@ public class ContentTypeProcessor { IContentType contentType = event.getContentType(); // only interested in our contentTypes - if (isRegisteredContentTypeId(contentType.getId())) { - // Go through the events and generate deltas - ICProject[] cprojects = getAffectedProjects(event); - for (int k = 0; k < cprojects.length; ++k) { - ICProject cproject = cprojects[k]; - processContentType(cproject, contentType, event.getContext()); - } + // Go through the events and generate deltas + ICProject[] cprojects = getAffectedProjects(event); + for (int k = 0; k < cprojects.length; ++k) { + ICProject cproject = cprojects[k]; + processContentType(cproject, contentType, event.getContext()); } + if (fCurrentDelta.getAffectedChildren().length > 0) { fManager.fire(fCurrentDelta, ElementChangedEvent.POST_CHANGE); } @@ -98,15 +98,29 @@ public class ContentTypeProcessor { members = ((IContainer)resource).members(); } if (members != null) { - //IContentTypeMatcher matcher = resource.getProject().getContentTypeMatcher(); for (int i = 0; i < members.length; ++i) { if (members[i] instanceof IFile) { IFile file = (IFile) members[i]; - IContentType cType = CCorePlugin.getContentType(file.getProject(), file.getName()); + String name = file.getName(); + IContentType cType = CCorePlugin.getContentType(file.getProject(), name); if (cType != null && cType.equals(contentType)) { - ICElement newElement = CoreModel.getDefault().create(file); - if (newElement != null) { - elementAdded(newElement, celement); + boolean found = false; + for (int j = 0; j < celements.length; ++j) { + if (celements[j].getElementName().equals(name) + && celements[j].getElementType() == ICElement.C_UNIT) { + ITranslationUnit unit = (ITranslationUnit)celements[j]; + if (!cType.getId().equals(unit.getContentTypeId())) { + elementChanged(celements[j]); + } + found = true; + break; + } + } + if (! found) { + ICElement newElement = CoreModel.getDefault().create(file); + if (newElement != null) { + elementAdded(newElement, celement); + } } } } @@ -126,7 +140,12 @@ public class ContentTypeProcessor { if (contentType.getId().equals(id)) { try { if (! contentType.isAssociatedWith(celement.getElementName(), context)) { - elementRemoved(celement, celement.getParent()); + IContentType cType = CCorePlugin.getContentType(celement.getCProject().getProject(), celement.getElementName()); + if (cType != null && isRegisteredContentTypeId(cType.getId())) { + elementChanged(celement); + } else { + elementRemoved(celement, celement.getParent()); + } } } catch (CoreException e) { // @@ -205,6 +224,21 @@ public class ContentTypeProcessor { fManager.releaseCElement(celement); } + protected void elementChanged(ICElement element) throws CModelException { + // For Binary/Archive We can not call close() to do the work + // closing will remove the element from the {Binary,Archive}Container + // We neef to clear the cache explicitely +// if (element instanceof IBinary || element instanceof IArchive) { +// closeBinary(element); +// } else if (element instanceof Openable) { +// close((Openable)element); +// } +// fCurrentDelta.changed(element, ICElementDelta.F_CONTENT); + if (element instanceof IOpenable) { + ((IOpenable)element).close(); + } + fCurrentDelta.changed(element, ICElementDelta.F_CONTENT); + } /** * Removes the given element from its parents cache of children. If the * element does not have a parent, or the parent is not currently open, 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 027e9e7d184..abbe7bc5563 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 @@ -27,6 +27,7 @@ import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.content.IContentType; /** * @see ITranslationUnit @@ -659,4 +660,15 @@ public class TranslationUnit extends Openable implements ITranslationUnit { protected void setContentTypeID(String id) { fContentTypeID = id; } + + /* (non-Javadoc) + * @see org.eclipse.cdt.internal.core.model.Openable#closing(java.lang.Object) + */ + protected void closing(Object info) throws CModelException { + IContentType cType = CCorePlugin.getContentType(getCProject().getProject(), getElementName()); + if (cType != null) { + setContentTypeID(cType.getId()); + } + super.closing(info); + } }