diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Configuration.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Configuration.java index 74aaa21df28..7c482b5b97e 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Configuration.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Configuration.java @@ -960,7 +960,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild LanguageSettingEntriesSerializer.serializeEntries(sourceEntries, el); } // I am clean now - isDirty = false; + setDirty(false); } /* diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/dataprovider/ConfigurationDataProvider.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/dataprovider/ConfigurationDataProvider.java index a29a99e9ff1..6e1a89b7609 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/dataprovider/ConfigurationDataProvider.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/dataprovider/ConfigurationDataProvider.java @@ -100,8 +100,8 @@ public class ConfigurationDataProvider extends CConfigurationDataProvider implem } static BuildConfigurationData writeConfiguration(ICConfigurationDescription des, - CConfigurationData base) throws CoreException { - BuildConfigurationData appliedCfg = (BuildConfigurationData)base; + BuildConfigurationData base) throws CoreException { + BuildConfigurationData appliedCfg = base; ICStorageElement rootElement = des.getStorage(BUILD_SYSTEM_DATA_MODULE_NAME, true); rootElement.clear(); rootElement.setAttribute(VERSION_ATTRIBUTE, ManagedBuildManager.getVersion().toString()); @@ -122,7 +122,7 @@ public class ConfigurationDataProvider extends CConfigurationDataProvider implem protected CConfigurationData applyPreferences( ICConfigurationDescription des, CConfigurationData base) throws CoreException{ - BuildConfigurationData appliedCfg = writeConfiguration(des, base); + BuildConfigurationData appliedCfg = writeConfiguration(des, (BuildConfigurationData)base); IConfiguration cfg = ((BuildConfigurationData)base).getConfiguration(); try { @@ -144,38 +144,46 @@ public class ConfigurationDataProvider extends CConfigurationDataProvider implem if(des.isPreferenceConfiguration()) return applyPreferences(des, base); - BuildConfigurationData appliedCfg = writeConfiguration(des, base); - - IManagedBuildInfo info = getBuildInfo(des); - ManagedProject mProj = (ManagedProject)info.getManagedProject(); - mProj.applyConfiguration((Configuration)appliedCfg.getConfiguration()); - writeManagedProjectInfo(des.getProjectDescription(), mProj); - try { - CfgScannerConfigInfoFactory2.save(appliedCfg, des.getProjectDescription(), baseDescription.getProjectDescription(), !isPersistedCfg(des)); - } catch (CoreException e){ - ManagedBuilderCorePlugin.log(e); - } - info.setValid(true); - - setPersistedFlag(des); - cacheNaturesIdsUsedOnCache(des); - - if(des.isActive()){ - IConfiguration cfg = appliedCfg.getConfiguration(); - IBuilder builder = cfg.getEditableBuilder(); - IProject project = context.getProject(); - IProjectDescription eDes = context.getEclipseProjectDescription(); - switch(BuilderFactory.applyBuilder(eDes, builder)){ - case BuilderFactory.CMD_UNDEFINED: - IWorkspaceRunnable applyR = new DesApplyRunnable(project, builder); - context.addWorkspaceRunnable(applyR); - break; - case BuilderFactory.CMD_CHANGED: - context.setEclipseProjectDescription(eDes); - break; + BuildConfigurationData baseCfgData = (BuildConfigurationData)base; + IConfiguration baseCfg = baseCfgData.getConfiguration(); + BuildConfigurationData appliedCfg; + if(context.getBaseConfigurationDataCacheState() && !baseCfg.isDirty()){ + appliedCfg = baseCfgData; + context.setConfiguratoinDataModifiedState(false); + } else { + appliedCfg = writeConfiguration(des, baseCfgData); + context.setConfiguratoinDataModifiedState(true); + + IManagedBuildInfo info = getBuildInfo(des); + ManagedProject mProj = (ManagedProject)info.getManagedProject(); + mProj.applyConfiguration((Configuration)appliedCfg.getConfiguration()); + writeManagedProjectInfo(des.getProjectDescription(), mProj); + try { + CfgScannerConfigInfoFactory2.save(appliedCfg, des.getProjectDescription(), baseDescription.getProjectDescription(), !isPersistedCfg(des)); + } catch (CoreException e){ + ManagedBuilderCorePlugin.log(e); + } + info.setValid(true); + + setPersistedFlag(des); + cacheNaturesIdsUsedOnCache(des); + + if(des.isActive()){ + IConfiguration cfg = appliedCfg.getConfiguration(); + IBuilder builder = cfg.getEditableBuilder(); + IProject project = context.getProject(); + IProjectDescription eDes = context.getEclipseProjectDescription(); + switch(BuilderFactory.applyBuilder(eDes, builder)){ + case BuilderFactory.CMD_UNDEFINED: + IWorkspaceRunnable applyR = new DesApplyRunnable(project, builder); + context.addWorkspaceRunnable(applyR); + break; + case BuilderFactory.CMD_CHANGED: + context.setEclipseProjectDescription(eDes); + break; + } } } - return appliedCfg; } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/IModificationContext.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/IModificationContext.java index c3831fefc8c..0f41e23d9a1 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/IModificationContext.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/IModificationContext.java @@ -23,4 +23,14 @@ public interface IModificationContext { void setEclipseProjectDescription(IProjectDescription eDes) throws CoreException; void addWorkspaceRunnable(IWorkspaceRunnable runnable); + + /** + * the CConfigurationDataProvider can call this method to indicate whether the + * ICConfigurationDescription settings were changed + * @param modified + */ + void setConfiguratoinDataModifiedState(boolean modified); + + boolean getBaseConfigurationDataCacheState(); + } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CConfigurationDescriptionCache.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CConfigurationDescriptionCache.java index f29cafe12b5..f00c89d5e8c 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CConfigurationDescriptionCache.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CConfigurationDescriptionCache.java @@ -32,7 +32,6 @@ import org.eclipse.cdt.core.settings.model.ICSettingObject; import org.eclipse.cdt.core.settings.model.ICSourceEntry; import org.eclipse.cdt.core.settings.model.ICStorageElement; import org.eclipse.cdt.core.settings.model.ICTargetPlatformSetting; -import org.eclipse.cdt.core.settings.model.IModificationContext; import org.eclipse.cdt.core.settings.model.WriteAccessException; import org.eclipse.cdt.core.settings.model.extension.CBuildData; import org.eclipse.cdt.core.settings.model.extension.CConfigurationData; @@ -60,6 +59,7 @@ public class CConfigurationDescriptionCache extends CDefaultConfigurationData private List fChildList = new ArrayList(); private CConfigurationSpecSettings fSpecSettings; private CConfigurationData fData; + private CConfigurationDescriptionCache fBaseCache; private ICSourceEntry fProjSourceEntries[]; private StorableCdtVariables fMacros; private boolean fDataLoadded; @@ -105,11 +105,12 @@ public class CConfigurationDescriptionCache extends CDefaultConfigurationData // fInitializing = false; } - CConfigurationDescriptionCache(ICConfigurationDescription baseDescription, CConfigurationData base, CConfigurationSpecSettings settingsBase, CProjectDescription parent, ICStorageElement rootEl) throws CoreException { + CConfigurationDescriptionCache(ICConfigurationDescription baseDescription, CConfigurationData base, CConfigurationDescriptionCache baseCache, CConfigurationSpecSettings settingsBase, CProjectDescription parent, ICStorageElement rootEl) throws CoreException { super(base.getId(), base.getName(), null); fInitializing = true; fParent = parent; fSpecSettings = new CConfigurationSpecSettings(this, settingsBase, rootEl); + fSpecSettings.setModified(settingsBase.isModified()); fBaseDescription = baseDescription; if(base instanceof CConfigurationDescriptionCache){ fData = ((CConfigurationDescriptionCache)base).getConfigurationData(); @@ -119,41 +120,44 @@ public class CConfigurationDescriptionCache extends CDefaultConfigurationData // base = CProjectDescriptionManager.getInstance().applyData(this, baseDescription, base); // fData = base; } -// fDataLoadded = true; -// fName = fData.getName(); -// fId = fData.getId(); -// -// copySettingsFrom(base, true); -// -// ICdtVariable vars[] = CdtVariableManager.getDefault().getVariables(this); -// fMacros = new StorableCdtVariables(vars, true); -// if(saving) -// fSpecSettings.serialize(); -// -// fInitializing = false; + + fBaseCache = baseCache; } - void applyData(CSettingEntryFactory factory, IModificationContext context) throws CoreException{ - if(fBaseDescription == null) - return; + CConfigurationDescriptionCache getBaseCache(){ + return fBaseCache; + } + + boolean applyData(CSettingEntryFactory factory, SettingsContext context) throws CoreException{ + boolean modified = true; + if(fBaseDescription != null){ - fData = CProjectDescriptionManager.getInstance().applyData(this, fBaseDescription, fData, context, null); - fDataLoadded = true; - fName = fData.getName(); - fId = fData.getId(); - fSettingsFactory = factory; - - copySettingsFrom(fData, true); - - fSettingsFactory = null; - - ICdtVariable vars[] = CdtVariableManager.getDefault().getVariables(this); - fMacros = new StorableCdtVariables(vars, true); -// if(saving) + fData = CProjectDescriptionManager.getInstance().applyData(this, fBaseDescription, fData, context, null); + fDataLoadded = true; + fName = fData.getName(); + fId = fData.getId(); + fSettingsFactory = factory; + + if(context.getConfiguratoinDataModifiedState() || fBaseCache == null) + copySettingsFrom(fData, true); + else { + copySettingsFrom(fBaseCache, true); + modified = fSpecSettings.isModified(); + } + + fSettingsFactory = null; + + ICdtVariable vars[] = CdtVariableManager.getDefault().getVariables(this); + fMacros = new StorableCdtVariables(vars, true); fSpecSettings.serialize(); + fSpecSettings.setModified(false); + + } fBaseDescription = null; -// fInitializing = false; + fBaseCache = null; + + return modified; } CSettingEntryFactory getSettingsFactory(){ 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 1eba2d5c966..15b62d6aa79 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 @@ -487,11 +487,14 @@ public class CConfigurationSpecSettings implements ICSettingsStorage{ return fExtSettingsProvider.isModified(); } - - void setModified(){ + + void setModified(boolean modified){ if(isReadOnly()) throw ExceptionFactory.createIsReadOnlyException(); - fIsModified = true; + fIsModified = modified; + } + void setModified(){ + setModified(true); } private Map getSessionPropertiesMap(boolean create){ 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 e98bd179b68..9c8c790b028 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 @@ -23,7 +23,6 @@ import org.eclipse.cdt.core.settings.model.ICSettingContainer; import org.eclipse.cdt.core.settings.model.ICSettingObject; import org.eclipse.cdt.core.settings.model.ICSettingsStorage; import org.eclipse.cdt.core.settings.model.ICStorageElement; -import org.eclipse.cdt.core.settings.model.IModificationContext; import org.eclipse.cdt.core.settings.model.WriteAccessException; import org.eclipse.cdt.core.settings.model.extension.CConfigurationData; import org.eclipse.cdt.core.settings.model.util.CSettingEntryFactory; @@ -206,15 +205,17 @@ public class CProjectDescription implements ICProjectDescription, ICDataProxyCon // fIsLoadding = false; } - void applyDatas(IModificationContext context){ + boolean applyDatas(SettingsContext context){ if(!fIsReadOnly || !fIsApplying) - return; + return false; CSettingEntryFactory factory = new CSettingEntryFactory(); + boolean modified = false; for(Iterator iter = fCfgMap.values().iterator(); iter.hasNext();){ CConfigurationDescriptionCache cache = (CConfigurationDescriptionCache)iter.next(); try { - cache.applyData(factory, context); + if(cache.applyData(factory, context)) + modified = true; } catch (CoreException e) { CCorePlugin.log(e); e.printStackTrace(); @@ -227,6 +228,8 @@ public class CProjectDescription implements ICProjectDescription, ICDataProxyCon factory.clear(); // fIsApplying = false; + + return modified; } @@ -280,10 +283,12 @@ public class CProjectDescription implements ICProjectDescription, ICDataProxyCon IInternalCCfgInfo cfgDes = (IInternalCCfgInfo)iter.next(); if(fIsReadOnly){ CConfigurationData baseData = cfgDes.getConfigurationData(false); + CConfigurationDescriptionCache baseCache = null; if(baseData instanceof CConfigurationDescriptionCache){ - baseData = ((CConfigurationDescriptionCache)baseData).getConfigurationData(); + baseCache = (CConfigurationDescriptionCache)baseData; + baseData = baseCache.getConfigurationData(); } - CConfigurationDescriptionCache cache = new CConfigurationDescriptionCache((ICConfigurationDescription)cfgDes, baseData, cfgDes.getSpecSettings(), this, null); + CConfigurationDescriptionCache cache = new CConfigurationDescriptionCache((ICConfigurationDescription)cfgDes, baseData, baseCache, cfgDes.getSpecSettings(), this, null); configurationCreated(cache); } else { CConfigurationData baseData = cfgDes.getConfigurationData(false); 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 dbfb173d268..7e13b6f7ab8 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 @@ -69,7 +69,6 @@ import org.eclipse.cdt.core.settings.model.ICSettingsStorage; import org.eclipse.cdt.core.settings.model.ICSourceEntry; import org.eclipse.cdt.core.settings.model.ICStorageElement; import org.eclipse.cdt.core.settings.model.ICTargetPlatformSetting; -import org.eclipse.cdt.core.settings.model.IModificationContext; import org.eclipse.cdt.core.settings.model.extension.CConfigurationData; import org.eclipse.cdt.core.settings.model.extension.CConfigurationDataProvider; import org.eclipse.cdt.core.settings.model.extension.CFileData; @@ -1671,11 +1670,12 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager { return provider.loadConfiguration(des, monitor); } - CConfigurationData applyData(ICConfigurationDescription des, ICConfigurationDescription baseDescription, CConfigurationData base, IModificationContext context, IProgressMonitor monitor) throws CoreException { + CConfigurationData applyData(CConfigurationDescriptionCache des, ICConfigurationDescription baseDescription, CConfigurationData base, SettingsContext context, IProgressMonitor monitor) throws CoreException { if(monitor == null) monitor = new NullProgressMonitor(); CConfigurationDataProvider provider = getProvider(des); + context.init(des); return provider.applyConfiguration(des, baseDescription, base, context, monitor); } @@ -3095,8 +3095,10 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager { private CConfigurationDescriptionCache createPreferenceCache(ICConfigurationDescription des) throws CoreException{ IInternalCCfgInfo cfgDes = (IInternalCCfgInfo)des; CConfigurationData baseData = cfgDes.getConfigurationData(false); + CConfigurationDescriptionCache baseCache = null; if(baseData instanceof CConfigurationDescriptionCache){ - baseData = ((CConfigurationDescriptionCache)baseData).getConfigurationData(); + baseCache = (CConfigurationDescriptionCache)baseData; + baseData = baseCache.getConfigurationData(); } CConfigurationSpecSettings settings = cfgDes.getSpecSettings(); ICStorageElement rootEl = getBuildSystemConfigPreferenceStorage(des.getBuildSystemId(), true, false); @@ -3104,7 +3106,7 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager { rootParent.removeChild(rootEl); ICStorageElement baseRootEl = settings.getRootStorageElement(); rootEl = rootParent.importChild(baseRootEl); - CConfigurationDescriptionCache cache = new CConfigurationDescriptionCache(des, baseData, cfgDes.getSpecSettings(), null, rootEl); + CConfigurationDescriptionCache cache = new CConfigurationDescriptionCache(des, baseData, baseCache, cfgDes.getSpecSettings(), null, rootEl); CSettingEntryFactory factory = new CSettingEntryFactory(); SettingsContext context = new SettingsContext(null); cache.applyData(factory, context); 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 c2d80592a90..7df2215b456 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,7 +45,7 @@ public class SetCProjectDescriptionOperation extends CModelOperation { mngr.notifyListeners(event); CProjectDescription fNewDescriptionCache = null; SettingsContext context = new SettingsContext(project); - + boolean modified; if(fSetDescription != null){ InternalXmlStorageElement el = null; try { @@ -63,10 +63,12 @@ public class SetCProjectDescriptionOperation extends CModelOperation { fNewDescriptionCache = new CProjectDescription(fSetDescription, true, el, creating); try { mngr.setDescriptionApplying(project, fNewDescriptionCache); - fNewDescriptionCache.applyDatas(context); + modified = fNewDescriptionCache.applyDatas(context); } finally { mngr.clearDescriptionApplying(project); } + } else { + modified = fOldDescriptionCache != null; } ICDescriptionDelta delta = mngr.createDelta(fNewDescriptionCache, fOldDescriptionCache); @@ -115,8 +117,11 @@ public class SetCProjectDescriptionOperation extends CModelOperation { mngr.notifyListeners(event); try { - if(fNewDescriptionCache != null && !CProjectDescriptionManager.checkFlags(fFlags, ICProjectDescriptionManager.SET_NO_SERIALIZE)) - context.addWorkspaceRunnable(mngr.createDesSerializationRunnable(fNewDescriptionCache)); + if(fNewDescriptionCache != null && !CProjectDescriptionManager.checkFlags(fFlags, ICProjectDescriptionManager.SET_NO_SERIALIZE)){ + if(modified || isPersistentCoreSettingChanged(event)){ + context.addWorkspaceRunnable(mngr.createDesSerializationRunnable(fNewDescriptionCache)); + } + } IWorkspaceRunnable toRun = context.createOperationRunnable(); if(toRun != null) @@ -126,6 +131,23 @@ public class SetCProjectDescriptionOperation extends CModelOperation { } } + private static boolean isPersistentCoreSettingChanged(CProjectDescriptionEvent event){ + ICDescriptionDelta delta = event.getProjectDelta(); + if(delta == null) + return false; + if(delta.getDeltaKind() != ICDescriptionDelta.CHANGED) + return true; + + if(delta.getChildren().length != 0) + return true; + + int flags = delta.getChangeFlags(); + if(flags != 0 && flags != ICDescriptionDelta.ACTIVE_CFG) + return true; + + return false; + } + public boolean isReadOnly() { return false; } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/SettingsContext.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/SettingsContext.java index 5f567eaecea..34f0723bf49 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/SettingsContext.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/SettingsContext.java @@ -22,6 +22,8 @@ public final class SettingsContext implements IModificationContext{ private IProjectDescription fEDes; private IProject fProject; private CompositeWorkspaceRunnable fRunnable; + private boolean fCfgDataModifyState; + private boolean fCfgDataCacheState; SettingsContext(IProject project){ fProject = project; @@ -31,6 +33,11 @@ public final class SettingsContext implements IModificationContext{ return fProject; } + void init(CConfigurationDescriptionCache cfg){ + fCfgDataModifyState = true; + fCfgDataCacheState = cfg.getBaseCache() != null; + } + IProjectDescription getEclipseProjectDescription(boolean create) throws CoreException{ IProjectDescription eDes = fEDes; if(eDes == null && create){ @@ -89,4 +96,16 @@ public final class SettingsContext implements IModificationContext{ } return null; } + + public boolean getBaseConfigurationDataCacheState() { + return fCfgDataCacheState; + } + + public void setConfiguratoinDataModifiedState(boolean modified) { + fCfgDataModifyState = modified; + } + + public boolean getConfiguratoinDataModifiedState(){ + return fCfgDataModifyState; + } }