/******************************************************************************* * Copyright (c) 2013 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: * QNX Software Systems - initial API and implementation *******************************************************************************/ package org.eclipse.cdt.managedbuilder.templateengine.processes; import org.eclipse.cdt.core.language.settings.providers.ILanguageSettingsProvider; import org.eclipse.cdt.core.language.settings.providers.ILanguageSettingsProvidersKeeper; import org.eclipse.cdt.core.language.settings.providers.LanguageSettingsManager; import org.eclipse.cdt.core.model.CoreModel; import org.eclipse.cdt.core.settings.model.ICConfigurationDescription; import org.eclipse.cdt.core.settings.model.ICProjectDescription; import org.eclipse.cdt.core.settings.model.ICProjectDescriptionManager; import org.eclipse.cdt.core.templateengine.TemplateCore; import org.eclipse.cdt.core.templateengine.process.ProcessArgument; import org.eclipse.cdt.core.templateengine.process.ProcessFailureException; import org.eclipse.cdt.core.templateengine.process.ProcessRunner; import org.eclipse.cdt.managedbuilder.core.IConfiguration; import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; import org.eclipse.cdt.managedbuilder.core.ManagedBuilderCorePlugin; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; /** * A configurable stage of the New Project wizard that is able to add implementations of * {@link ILanguageSettingsProvider} to the new project's build configurations. * E.g., * <pre> <process type="org.eclipse.cdt.managedbuilder.core.AddLanguageSettingsProvider"> <simple name="projectName" value="$(projectName)"/> <simple-array name="languageSettingsProviders"> <element value="org.eclipse.cdt.qt.core.QtPathsProvider"/> </simple-array> </process> * </pre> * * @since 8.3 */ public class AddLanguageSettingsProvider extends ProcessRunner { private static final String PROJECTNAME_VARNAME = "projectName"; //$NON-NLS-1$ private static final String PROVIDERS_VARNAME = "languageSettingsProviderIds"; //$NON-NLS-1$ @Override public void process(TemplateCore template, ProcessArgument[] args, String processId, IProgressMonitor monitor) throws ProcessFailureException { IProject project = null; String[] extraProviderIds = null; for (ProcessArgument arg : args) { String argName = arg.getName(); if (PROJECTNAME_VARNAME.equals(argName)) project = ResourcesPlugin.getWorkspace().getRoot().getProject(arg.getSimpleValue()); else if(PROVIDERS_VARNAME.equals(argName)) extraProviderIds = arg.getSimpleArrayValue(); } if (project == null) throw missingArgException(processId, PROJECTNAME_VARNAME); if (extraProviderIds == null) throw missingArgException(processId, PROVIDERS_VARNAME); ICProjectDescriptionManager mngr = CoreModel.getDefault().getProjectDescriptionManager(); ICProjectDescription des = mngr.getProjectDescription(project, true); ICConfigurationDescription[] configDescs = des.getConfigurations(); for (ICConfigurationDescription configDesc : configDescs) if (configDesc instanceof ILanguageSettingsProvidersKeeper) { IConfiguration config = ManagedBuildManager.getConfigurationForDescription(configDesc); // Create a merged array of the old and new ids String[] ids = config.getDefaultLanguageSettingsProviderIds(); String[] newIds = new String[ids.length + extraProviderIds.length]; System.arraycopy(ids, 0, newIds, 0, ids.length); System.arraycopy(extraProviderIds, 0, newIds, ids.length, extraProviderIds.length); ILanguageSettingsProvidersKeeper keeper = (ILanguageSettingsProvidersKeeper) configDesc; keeper.setLanguageSettingProviders(LanguageSettingsManager.createLanguageSettingsProviders(newIds)); } try { mngr.setProjectDescription(project, des); } catch(CoreException e) { ManagedBuilderCorePlugin.log(e); } } }