/******************************************************************************* * Copyright (c) 2007, 2016 Red Hat 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: * Red Hat Incorporated - initial API and implementation *******************************************************************************/ package org.eclipse.cdt.internal.autotools.core.configure; import org.eclipse.cdt.core.settings.model.ICConfigurationDescription; import org.eclipse.cdt.internal.autotools.core.AutotoolsPropertyConstants; import org.eclipse.cdt.managedbuilder.core.BuildException; import org.eclipse.cdt.managedbuilder.core.IBuildObject; import org.eclipse.cdt.managedbuilder.core.IBuilder; import org.eclipse.cdt.managedbuilder.core.IConfiguration; import org.eclipse.cdt.managedbuilder.core.IHoldsOptions; import org.eclipse.cdt.managedbuilder.core.IManagedOptionValueHandler; import org.eclipse.cdt.managedbuilder.core.IOption; import org.eclipse.cdt.managedbuilder.core.IOptionApplicability; import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; import org.eclipse.cdt.managedbuilder.core.ManagedOptionValueHandler; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; public class AutotoolsOptionValueHandler extends ManagedOptionValueHandler implements IOptionApplicability { public static final String DEFAULT_BUILD_DIR = "build"; //$NON-NLS-1$ public static final String CONFIGURE_TOOL_ID = "org.eclipse.linuxtools.cdt.autotools.core.gnu.toolchain.tool.configure"; //$NON-NLS-1$ public static final String BUILD_DIR_OPTION_ID = "org.eclipse.linuxtools.cdt.autotools.core.option.configure.builddir"; //$NON-NLS-1$ public static final String BUILD_DIR_APPLY = "BuildDir.apply"; //$NON-NLS-1$ public static final String BUILD_DIR_DEFAULT_QUESTION = "BuildDir.default"; //$NON-NLS-1$ public static final String BUILD_DIR_YES = "BuildDir.yes"; //$NON-NLS-1$ public static final String BUILD_DIR_NO = "BuildDir.no"; //$NON-NLS-1$ //FIXME: Use holder to set option value, not the "option" parameter @Override public boolean handleValue(IBuildObject buildObject, IHoldsOptions holder, IOption option, String extraArgument, int event) { // Get the current value of the build dir option. String value = (String)option.getValue(); if (buildObject instanceof IConfiguration && (event == IManagedOptionValueHandler.EVENT_OPEN)) { // SortedSet<Integer> nums = new TreeSet<Integer>(); IConfiguration configuration = (IConfiguration)buildObject; ICConfigurationDescription cfgd = ManagedBuildManager.getDescriptionForConfiguration(configuration); if (option.getName().equals("Name") && cfgd != null) { String cfgId = cfgd.getId(); if (!value.isEmpty() && !value.equals(cfgId)) { // we have a cloned configuration and we know that the // clonee's name is the value of the option IProject project = (IProject)configuration.getManagedProject().getOwner(); String autoName = null; String autoNameTemplate = null; // Check if we are supposed to automatically name the build directory for any // new configuration. If yes, generate a build directory under the project using // the configuration name which must be unique. try { autoName = project.getPersistentProperty(AutotoolsPropertyConstants.AUTO_BUILD_NAME); } catch (CoreException e) { // ignore } if (autoName == null || autoName.equals(AutotoolsPropertyConstants.TRUE)) { autoNameTemplate = "${workspace_loc:/" + project.getName() + //$NON-NLS-1$ "}/build-" + fixName(configuration.getName()); //$NON-NLS-1$ IBuilder cfgBuilder = configuration.getEditableBuilder(); cfgBuilder.setBuildPath(autoNameTemplate); } // Clone old configuration to tmp configuration list boolean isSaved = AutotoolsConfigurationManager.getInstance().cloneCfg(project, value, cfgd); // Check to see if we should patch up the name option. If we aren't synchronizing // configurations or the configuration isn't already saved, we leave the name field alone // so we will trigger this again when the clone will get used. if (!isSaved && !AutotoolsConfigurationManager.getInstance().isSyncing()) { return true; } } try { IOption optionToSet = holder.getOptionToSet(option, false); optionToSet.setValue(cfgId); } catch (BuildException e) { return false; } } } // The event was not handled, thus return false return true; } private String fixName(String cfgName) { // Replace whitespace with underscores. return cfgName.replaceAll("\\s", "_"); } // IOptionApplicability methods @Override public boolean isOptionEnabled(IBuildObject configuration, IHoldsOptions holder, IOption option) { return true; } @Override public boolean isOptionUsedInCommandLine(IBuildObject configuration, IHoldsOptions holder, IOption option) { return false; } @Override public boolean isOptionVisible(IBuildObject configuration, IHoldsOptions holder, IOption option) { return true; } }