diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexManager.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexManager.java index 2e98b26f711..f2bf78b4120 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexManager.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexManager.java @@ -167,7 +167,7 @@ public interface IIndexManager extends IPDOMManager { * @throws CoreException * @since 4.0 */ - public void reindex(ICProject project) throws CoreException; + public void reindex(ICProject project); /** * Updates the index for the given selection of translation units considering diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/CProjectDescriptionListener.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/CProjectDescriptionListener.java new file mode 100644 index 00000000000..435980ee72f --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/CProjectDescriptionListener.java @@ -0,0 +1,54 @@ +/******************************************************************************* + * Copyright (c) 2007 Wind River Systems, Inc. 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Markus Schorn - initial API and implementation + *******************************************************************************/ + +package org.eclipse.cdt.internal.core.pdom; + +import org.eclipse.cdt.core.index.IIndexManager; +import org.eclipse.cdt.core.model.CoreModel; +import org.eclipse.cdt.core.model.ICProject; +import org.eclipse.cdt.core.settings.model.CProjectDescriptionEvent; +import org.eclipse.cdt.core.settings.model.ICConfigurationDescription; +import org.eclipse.cdt.core.settings.model.ICProjectDescription; +import org.eclipse.cdt.core.settings.model.ICProjectDescriptionListener; +import org.eclipse.core.resources.IProject; + +public class CProjectDescriptionListener implements ICProjectDescriptionListener { + + private IIndexManager fIndexManager; + + public CProjectDescriptionListener(IIndexManager manager) { + fIndexManager= manager; + } + + public void handleEvent(CProjectDescriptionEvent event) { + ICProjectDescription old= event.getOldCProjectDescription(); + ICProjectDescription act= event.getNewCProjectDescription(); + if (old != null && act != null) { + ICConfigurationDescription oldConfig= old.getDefaultSettingConfiguration(); + ICConfigurationDescription newConfig= act.getDefaultSettingConfiguration(); + if (oldConfig != null && newConfig != null) { + String oldID= oldConfig.getId(); + String newID= newConfig.getId(); + if (oldID != null && newID != null) { + if (!oldID.equals(newID)) { + IProject project= event.getProject(); + if (project != null && project.isOpen()) { + ICProject cproject= CoreModel.getDefault().getCModel().getCProject(project.getName()); + if (cproject != null) { + fIndexManager.reindex(cproject); + } + } + } + } + } + } + } +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/LanguageMappingChangeListener.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/LanguageMappingChangeListener.java index 65b5b3be0e8..bb58ad0cb4f 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/LanguageMappingChangeListener.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/LanguageMappingChangeListener.java @@ -49,23 +49,18 @@ public class LanguageMappingChangeListener implements // are potentially unaffected due to project settings try { ICProject[] cProjects = manager.getCModel().getCProjects(); - fManager.update(cProjects, IIndexManager.UPDATE_ALL); + for (int i = 0; i < cProjects.length; i++) { + ICProject project = cProjects[i]; + fManager.reindex(project); + } } catch (CModelException e) { CCorePlugin.log(e); - } catch (CoreException e) { - CCorePlugin.log(e); } } else if (event.getType() == ILanguageMappingChangeEvent.TYPE_PROJECT) { // For now, reindex the entire project since we don't know which // files are affected. - try { - ICProject cProject = manager.getCModel().getCProject(event.getProject()); - fManager.reindex(cProject); - } catch (CModelException e) { - CCorePlugin.log(e); - } catch (CoreException e) { - CCorePlugin.log(e); - } + ICProject cProject = manager.getCModel().getCProject(event.getProject()); + fManager.reindex(cProject); } else if (event.getType() == ILanguageMappingChangeEvent.TYPE_FILE) { // Just reindex the affected file. IFile file = event.getFile(); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMManager.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMManager.java index cb5d769785b..abf0ab42582 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMManager.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMManager.java @@ -47,6 +47,8 @@ import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.model.ILanguageMappingChangeListener; import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.core.model.LanguageManager; +import org.eclipse.cdt.core.settings.model.CProjectDescriptionEvent; +import org.eclipse.cdt.core.settings.model.ICProjectDescriptionListener; import org.eclipse.cdt.internal.core.CCoreInternals; import org.eclipse.cdt.internal.core.index.IIndexFragment; import org.eclipse.cdt.internal.core.index.IWritableIndex; @@ -148,6 +150,8 @@ public class PDOMManager implements IWritableIndexManager, IListener { private CModelListener fCModelListener= new CModelListener(this); private ILanguageMappingChangeListener fLanguageChangeListener = new LanguageMappingChangeListener(this); + private ICProjectDescriptionListener fProjectDescriptionListener= new CProjectDescriptionListener(this); + private IndexFactory fIndexFactory= new IndexFactory(this); private IndexProviderManager fIndexProviderManager = new IndexProviderManager(); @@ -173,6 +177,8 @@ public class PDOMManager implements IWritableIndexManager, IListener { ResourcesPlugin.getWorkspace().addResourceChangeListener(fCModelListener, IResourceChangeEvent.POST_BUILD); model.addElementChangedListener(fCModelListener); LanguageManager.getInstance().registerLanguageChangeListener(fLanguageChangeListener); + final int types= CProjectDescriptionEvent.DATA_APPLIED; + CCorePlugin.getDefault().getProjectDescriptionManager().addCProjectDescriptionListener(fProjectDescriptionListener, types); try { ICProject[] projects= model.getCModel().getCProjects(); @@ -185,6 +191,7 @@ public class PDOMManager implements IWritableIndexManager, IListener { } public void shutdown() { + CCorePlugin.getDefault().getProjectDescriptionManager().removeCProjectDescriptionListener(fProjectDescriptionListener); final CoreModel model = CoreModel.getDefault(); model.removeElementChangedListener(fCModelListener); ResourcesPlugin.getWorkspace().removeResourceChangeListener(fCModelListener); @@ -755,7 +762,7 @@ public class PDOMManager implements IWritableIndexManager, IListener { } } - public void reindex(ICProject project) throws CoreException { + public void reindex(ICProject project) { assert !Thread.holdsLock(fProjectToPDOM); IPDOMIndexer indexer= null; synchronized (fUpdatePolicies) { diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/dialogs/IndexerBlock.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/dialogs/IndexerBlock.java index 6da11b7f534..dd0f81a5246 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/dialogs/IndexerBlock.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/dialogs/IndexerBlock.java @@ -481,7 +481,10 @@ public class IndexerBlock extends AbstractCOptionPage { : ICProjectDescriptionPreferences.CONFIGS_INDEPENDENT); } if (!useActive) { - prefs.setDefaultSettingConfiguration(prefs.getConfigurationByName(fBuildConfigComboBox.getText())); + final ICConfigurationDescription config= prefs.getConfigurationByName(fBuildConfigComboBox.getText()); + if (config != null) { + prefs.setDefaultSettingConfiguration(config); + } } prjDescMgr.setProjectDescription(getProject(), prefs); }