diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CConfigurationSpecSettings.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CConfigurationSpecSettings.java index d1e432a448a..852bfc4e5c0 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CConfigurationSpecSettings.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CConfigurationSpecSettings.java @@ -279,11 +279,11 @@ public class CConfigurationSpecSettings implements ICSettingsStorage{ void doneInitialization(){ if(isReadOnly()){ if(fRootStorageElement != null) - ((InternalXmlStorageElement)fRootStorageElement).setReadOnly(true); + ((InternalXmlStorageElement)fRootStorageElement).setReadOnly(true, false); if(fSettingsStorageElement != null) - ((InternalXmlStorageElement)fSettingsStorageElement).setReadOnly(true); + ((InternalXmlStorageElement)fSettingsStorageElement).setReadOnly(true, false); if(fStorage != null) - fStorage.setReadOnly(true); + fStorage.setReadOnly(true, false); } } @@ -492,7 +492,16 @@ public class CConfigurationSpecSettings implements ICSettingsStorage{ if(isReadOnly()) throw ExceptionFactory.createIsReadOnlyException(); fIsModified = modified; + + if(!modified){ + if(fMacros != null) + fMacros.setDirty(false); + + if(fEnvironment != null) + fEnvironment.setDirty(false); + } } + void setModified(){ setModified(true); } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CProjectDescription.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CProjectDescription.java index 9c8c790b028..aa2824cee49 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CProjectDescription.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CProjectDescription.java @@ -232,11 +232,16 @@ public class CProjectDescription implements ICProjectDescription, ICDataProxyCon return modified; } - - void doneApplying(){ doneInitializing(); fIsApplying = false; + + try { + ((InternalXmlStorageElement)getRootStorageElement()).setReadOnly(true, false); + } catch (CoreException e1) { + } + + setModified(false); } void doneLoadding(){ @@ -502,6 +507,20 @@ public class CProjectDescription implements ICProjectDescription, ICDataProxyCon } return false; } + + private void setModified(boolean modified){ + fIsModified = modified; + + if(!modified){ + fActiveCfgInfo.fIsModified = false; + + fSettingCfgInfo.fIsModified = false; + + fPrefs.setModified(false); + + //no need to do that for config cache since they always maintain the "isModified == false" + } + } public boolean isReadOnly() { return fIsReadOnly && !(fIsLoadding || fIsApplying); diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CProjectDescriptionManager.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CProjectDescriptionManager.java index f999bf20f0f..6ba684f7e68 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CProjectDescriptionManager.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CProjectDescriptionManager.java @@ -709,11 +709,6 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager { } finally { clearDescriptionApplying(project); } - - try { - ((InternalXmlStorageElement)des.getRootStorageElement()).setReadOnly(true); - } catch (CoreException e1) { - } } }finally{ CProjectDescription d = clearDescriptionLoadding(project); diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CProjectDescriptionPreferences.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CProjectDescriptionPreferences.java index de33cd528a5..d0c9d7bb020 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CProjectDescriptionPreferences.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CProjectDescriptionPreferences.java @@ -95,6 +95,10 @@ public class CProjectDescriptionPreferences implements ICProjectDescriptionPrefe && !fSuperPreference.settingsEqual((CProjectDescriptionPreferences)CProjectDescriptionManager.getInstance().getProjectDescriptionWorkspacePreferences(false))); } + void setModified(boolean modified){ + fIsModified = modified; + } + public boolean isReadOnly(){ return fIsReadOnly; } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CStorage.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CStorage.java index 67b21924b0c..acd862b0c6f 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CStorage.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CStorage.java @@ -170,11 +170,12 @@ public class CStorage implements ICSettingsStorage{ return false; } - void setReadOnly(boolean readOnly){ + void setReadOnly(boolean readOnly, boolean keepModify){ fIsReadOnly = readOnly; + fIsDirty &= keepModify; for(Iterator iter = fStorageElementMap.values().iterator(); iter.hasNext();){ InternalXmlStorageElement el = (InternalXmlStorageElement)iter.next(); - el.setReadOnly(readOnly); + el.setReadOnly(readOnly, keepModify); } } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/InternalXmlStorageElement.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/InternalXmlStorageElement.java index 446d88aa8df..35d2762ccd7 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/InternalXmlStorageElement.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/InternalXmlStorageElement.java @@ -61,11 +61,16 @@ public class InternalXmlStorageElement extends XmlStorageElement { } public void setReadOnly(boolean readOnly){ + setReadOnly(readOnly, true); + } + + public void setReadOnly(boolean readOnly, boolean keepModify){ fIsReadOnly = readOnly; + fIsDirty &= keepModify; ICStorageElement children[] = getChildren(false); for(int i = 0; i < children.length; i++){ - ((InternalXmlStorageElement)children[i]).setReadOnly(readOnly); + ((InternalXmlStorageElement)children[i]).setReadOnly(readOnly, keepModify); } } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/SetCProjectDescriptionOperation.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/SetCProjectDescriptionOperation.java index 7df2215b456..78775696bf2 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/SetCProjectDescriptionOperation.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/SetCProjectDescriptionOperation.java @@ -45,11 +45,14 @@ public class SetCProjectDescriptionOperation extends CModelOperation { mngr.notifyListeners(event); CProjectDescription fNewDescriptionCache = null; SettingsContext context = new SettingsContext(project); - boolean modified; + boolean modified = false; + if(fSetDescription != null){ InternalXmlStorageElement el = null; try { - el = mngr.copyElement((InternalXmlStorageElement)fSetDescription.getRootStorageElement(), false); + InternalXmlStorageElement base = (InternalXmlStorageElement)fSetDescription.getRootStorageElement(); + modified = base.isDirty(); + el = mngr.copyElement(base, false); } catch (CoreException e2) { } @@ -63,7 +66,7 @@ public class SetCProjectDescriptionOperation extends CModelOperation { fNewDescriptionCache = new CProjectDescription(fSetDescription, true, el, creating); try { mngr.setDescriptionApplying(project, fNewDescriptionCache); - modified = fNewDescriptionCache.applyDatas(context); + modified |= fNewDescriptionCache.applyDatas(context); } finally { mngr.clearDescriptionApplying(project); } @@ -105,11 +108,6 @@ public class SetCProjectDescriptionOperation extends CModelOperation { // ExternalSettingsManager.getInstance().updateDepentents(delta); if(fNewDescriptionCache != null){ - try { - ((InternalXmlStorageElement)fNewDescriptionCache.getRootStorageElement()).setReadOnly(true); - } catch (CoreException e1) { - } - fNewDescriptionCache.doneApplying(); }