blob: 03ae8ee323a594ca88866b4b170f7fbf081f5050 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2013, 2015 QNX Software Systems 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:
* Doug Schaefer (QNX) - Initial implementation
*******************************************************************************/
package org.eclipse.cdt.internal.qt.core;
import java.util.Arrays;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.build.CBuilder;
import org.eclipse.cdt.core.dom.ILinkage;
import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.index.IIndexLinkage;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.internal.core.index.CIndex;
import org.eclipse.cdt.internal.core.index.IIndexFragment;
import org.eclipse.core.resources.ICommand;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.resources.IProjectNature;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
@SuppressWarnings("restriction")
public class QtNature implements IProjectNature {
public static final String ID = "org.eclipse.cdt.qt.core.qtNature"; //$NON-NLS-1$
private IProject project;
public static boolean hasNature(IProject project) {
try {
return project.hasNature(ID);
} catch (CoreException e) {
Activator.log(e);
return false;
}
}
public static void addNature(IProject project, IProgressMonitor monitor) throws CoreException {
if (project.isOpen()) {
if (hasNature(project))
return;
IProjectDescription desc = project.getDescription();
String[] oldIds = desc.getNatureIds();
String[] newIds = Arrays.copyOf(oldIds, oldIds.length + 1);
newIds[oldIds.length] = ID;
desc.setNatureIds(newIds);
project.setDescription(desc, monitor);
}
}
public static void setupBuilder(IProjectDescription projDesc) {
ICommand command = projDesc.newCommand();
CBuilder.setupBuilder(command);
projDesc.setBuildSpec(new ICommand[] { command });
}
@Override
public void configure() throws CoreException {
IProjectDescription projDesc = project.getDescription();
setupBuilder(projDesc);
project.setDescription(projDesc, new NullProgressMonitor());
}
// TODO no longer needed?
public void configurex() throws CoreException {
ICProject cProject = CCorePlugin.getDefault().getCoreModel().create(project);
if (cProject == null)
return;
IIndex index = CCorePlugin.getIndexManager().getIndex(cProject);
if (!(index instanceof CIndex))
return;
// Don't reindex the project if it already has a Qt linkage. The index
// will be updated
// by the normal triggers.
for (IIndexFragment fragment : ((CIndex) index).getFragments())
for (IIndexLinkage linkage : fragment.getLinkages())
if (linkage.getLinkageID() == ILinkage.QT_LINKAGE_ID)
return;
// We need to force the index to be rebuilt the first time the Qt nature
// is added. If
// this doesn't happen then the PDOM could have the current version (so
// nothing would trigger
// an update) but no Qt content.
CCorePlugin.log(IStatus.INFO, "Reindexing " + project.getName() + " because Qt nature has been added");
CCorePlugin.getIndexManager().reindex(cProject);
}
@Override
public void deconfigure() throws CoreException {
// This space intentionally left blank.
}
@Override
public IProject getProject() {
return project;
}
@Override
public void setProject(IProject project) {
this.project = project;
}
}