| /******************************************************************************* |
| * 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; |
| } |
| } |