/******************************************************************************* * Copyright (c) 2000, 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: * QNX Software Systems - Initial API and implementation *******************************************************************************/ package org.eclipse.cdt.internal.autotools.ui.wizards; import org.eclipse.cdt.autotools.core.AutotoolsNewProjectNature; import org.eclipse.cdt.autotools.ui.AutotoolsUIPlugin; import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.settings.model.ICConfigurationDescription; import org.eclipse.cdt.internal.autotools.core.AutotoolsPropertyConstants; import org.eclipse.cdt.internal.autotools.core.configure.AutotoolsConfigurationManager; import org.eclipse.cdt.managedbuilder.core.BuildException; import org.eclipse.cdt.managedbuilder.core.IConfiguration; import org.eclipse.cdt.managedbuilder.core.IManagedBuildInfo; import org.eclipse.cdt.managedbuilder.core.IManagedProject; import org.eclipse.cdt.managedbuilder.core.IProjectType; import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; import org.eclipse.cdt.managedbuilder.core.ManagedCProjectNature; import org.eclipse.cdt.ui.wizards.conversion.ConvertProjectWizardPage; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.SubMonitor; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.wizards.newresource.BasicNewResourceWizard; /** * * ConvertToAutotoolsProjectWizardPage * Standard main page for a wizard that adds a Managed Make C project Nature to a project with no nature associated with it. * This conversion is one way in that the project cannot be converted back (i.e have the nature removed). * * @author Jeff Johnston * @since Feb 8, 2006 *<p> * Example useage: * <pre> * mainPage = new ConvertToAutotoolsProjectWizardPage("ConvertProjectPage"); * mainPage.setTitle("Project Conversion"); * mainPage.setDescription("Add C or C++ Managed Make Nature to a project."); * </pre> * </p> */ public class ConvertToAutotoolsProjectWizardPage extends ConvertProjectWizardPage { private static final String WZ_TITLE = "WizardAutotoolsProjectConversion.title"; //$NON-NLS-1$ private static final String WZ_DESC = "WizardAutotoolsProjectConversion.description"; //$NON-NLS-1$ private static final String PREFIX = "WizardAutotoolsProjectConversion"; protected static final String MSG_ADD_NATURE = PREFIX + ".message.add_nature"; //$NON-NLS-1$ protected static final String MSG_ADD_BUILDER = PREFIX + ".message.add_builder"; //$NON-NLS-1$ protected static final String MSG_SAVE = PREFIX + ".message.save"; //$NON-NLS-1$ /** * Constructor for ConvertToStdMakeProjectWizardPage. * @param pageName */ public ConvertToAutotoolsProjectWizardPage(String pageName, ConvertToAutotoolsProjectWizard wizard) { super(pageName); setWizard(wizard); } /** * Method getWzTitleResource returns the correct Title Label for this class * overriding the default in the superclass. */ @Override protected String getWzTitleResource(){ return AutotoolsUIPlugin.getResourceString(WZ_TITLE); } /** * Method getWzDescriptionResource returns the correct description * Label for this class overriding the default in the superclass. */ @Override protected String getWzDescriptionResource(){ return AutotoolsUIPlugin.getResourceString(WZ_DESC); } /** * Method isCandidate returns true for all projects. * * @param project * @return boolean */ @Override public boolean isCandidate(IProject project) { return true; // all } protected IProjectType getProjectType() { return ((ConvertToAutotoolsProjectWizard)getWizard()).getProjectType(); } protected IConfiguration[] getSelectedConfigurations() { return ((ConvertToAutotoolsProjectWizard)getWizard()).getSelectedConfigurations(); } protected void applyOptions(IProject project, IProgressMonitor monitor) { ((ConvertToAutotoolsProjectWizard)getWizard()).applyOptions(project, monitor); } @Override public void convertProject(IProject project, IProgressMonitor monitor, String projectID) throws CoreException { monitor.beginTask(AutotoolsUIPlugin.getResourceString("WizardMakeProjectConversion.monitor.convertingToMakeProject"), 7); //$NON-NLS-1$ IConfiguration defaultCfg = null; Boolean convertingNewAutotoolsProject = false; try { super.convertProject(project, SubMonitor.convert(monitor, 1), projectID); // Bug 289834 - Converting C Autotools project to C++ loses configurations if (project.hasNature(AutotoolsNewProjectNature.AUTOTOOLS_NATURE_ID)) { convertingNewAutotoolsProject = true; // set this for finally clause return; // We have converted C to C++ or vice-versa for an existing Autotools project and are done } // Otherwise, we must scrap existing configurations as they will have tool settings we cannot use monitor.subTask(AutotoolsUIPlugin.getResourceString(MSG_ADD_NATURE)); ManagedCProjectNature.addManagedNature(project, SubMonitor.convert(monitor, 1)); AutotoolsNewProjectNature.addAutotoolsNature(project, SubMonitor.convert(monitor, 1)); // We need to remove any old Autotools nature, if one exists. AutotoolsNewProjectNature.removeOldAutotoolsNature(project, SubMonitor.convert(monitor, 1)); monitor.subTask(AutotoolsUIPlugin.getResourceString(MSG_ADD_BUILDER)); AutotoolsNewProjectNature.addAutotoolsBuilder(project, SubMonitor.convert(monitor, 1)); // FIXME: Default scanner property: make -w - eventually we want to use Make core's build scanner project.setPersistentProperty(AutotoolsPropertyConstants.SCANNER_USE_MAKE_W, AutotoolsPropertyConstants.TRUE); // Specify false for override in next call as override can cause the method to throw an // exception. CCorePlugin.getDefault().mapCProjectOwner(project, projectID, false); // Add the ManagedProject to the project IManagedProject newManagedProject = null; IManagedBuildInfo info = null; try { info = ManagedBuildManager.createBuildInfo(project); IProjectType parent = getProjectType(); newManagedProject = ManagedBuildManager.createManagedProject(project, parent); if (newManagedProject != null) { IConfiguration [] selectedConfigs = getSelectedConfigurations(); for (int i = 0; i < selectedConfigs.length; i++) { IConfiguration config = selectedConfigs[i]; int id = ManagedBuildManager.getRandomNumber(); IConfiguration newConfig = newManagedProject.createConfiguration(config, config.getId() + "." + id); //$NON-NLS-1$ newConfig.setArtifactName(newManagedProject.getDefaultArtifactName()); } // Now add the first supported config in the list as the default IConfiguration[] newConfigs = newManagedProject.getConfigurations(); for(int i = 0; i < newConfigs.length; i++) { if(newConfigs[i].isSupported()){ defaultCfg = newConfigs[i]; break; } } if(defaultCfg == null && newConfigs.length > 0) defaultCfg = newConfigs[0]; if(defaultCfg != null) { ManagedBuildManager.setDefaultConfiguration(project, defaultCfg); ManagedBuildManager.setSelectedConfiguration(project, defaultCfg); } ManagedBuildManager.setNewProjectVersion(project); } } catch (BuildException e) { AutotoolsUIPlugin.log(e); } // Modify the project settings if (project != null) { applyOptions(project, SubMonitor.convert(monitor, 2)); } // Save the build options monitor.subTask(AutotoolsUIPlugin.getResourceString(MSG_SAVE)); if (info != null) { info.setValid(true); ManagedBuildManager.saveBuildInfo(project, true); } } finally { if (!convertingNewAutotoolsProject) { // Bug 289834 - don't create new config if switching between C and C++ // Create a default Autotools configuration and save it. // We must do this after the ManagedBuildManager does a save because // we might not yet have a Configuration Description set up for the // default configuration and we need the id to create our own form // of configuration. ICConfigurationDescription cfgd = ManagedBuildManager.getDescriptionForConfiguration(defaultCfg); String id = cfgd.getId(); AutotoolsConfigurationManager.getInstance().getConfiguration(project, id, true); AutotoolsConfigurationManager.getInstance().saveConfigs(project); IStatus initResult = ManagedBuildManager.initBuildInfoContainer(project); if (initResult.getCode() != IStatus.OK) { // At this point, I can live with a failure AutotoolsUIPlugin.log(initResult); } } monitor.done(); } } @Override public void createControl(Composite parent) { super.createControl(parent); IStructuredSelection sel = ((BasicNewResourceWizard)getWizard()).getSelection(); if ( sel != null) { tableViewer.setCheckedElements(sel.toArray()); setPageComplete(validatePage()); } } }