/*******************************************************************************
* Copyright (c) 2007, 2010 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.IndexerSetupParticipant;
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.cdt.internal.core.settings.model.CProjectDescriptionManager;
import org.eclipse.core.resources.IProject;
public class CProjectDescriptionListener implements ICProjectDescriptionListener {
private PDOMManager fIndexManager;
private IndexerSetupParticipant fIndexerSetupParticipant;
public CProjectDescriptionListener(PDOMManager manager) {
fIndexManager= manager;
fIndexerSetupParticipant= createIndexerSetupParticipant();
manager.addIndexerSetupParticipant(fIndexerSetupParticipant);
}
private IndexerSetupParticipant createIndexerSetupParticipant() {
return new IndexerSetupParticipant() {
@Override
public boolean postponeIndexerSetup(ICProject project) {
return !isProjectCreationComplete(project.getProject());
}
};
}
@Override
public void handleEvent(CProjectDescriptionEvent event) {
ICProjectDescription old= event.getOldCProjectDescription();
ICProjectDescription act= event.getNewCProjectDescription();
if (act != null) {
if (completedProjectCreation(old, act)) {
ICProject project= getProject(event);
if (project != null) {
fIndexerSetupParticipant.notifyIndexerSetup(project);
}
}
else if (old != null && changedDefaultSettingConfiguration(old, act)) {
ICProject project= getProject(event);
if (project != null) {
fIndexManager.reindex(project);
}
}
}
}
private boolean changedDefaultSettingConfiguration(ICProjectDescription old, ICProjectDescription act) {
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)) {
return true;
}
}
}
return false;
}
private ICProject getProject(CProjectDescriptionEvent event) {
IProject project= event.getProject();
if (project != null && project.isOpen()) {
return CoreModel.getDefault().create(project);
}
return null;
}
protected boolean isProjectCreationComplete(IProject project) {
// Check for a project that has been created by the new project wizard just
// just for the purpose of editing preferences (Advanced button)
ICProjectDescription desc= CProjectDescriptionManager.getInstance().getProjectDescription(project.getProject(), false, false);
return desc==null || !desc.isCdtProjectCreating();
}
private boolean completedProjectCreation(ICProjectDescription old, ICProjectDescription act) {
return (old == null || old.isCdtProjectCreating()) && !act.isCdtProjectCreating();
}
}