/*******************************************************************************
* Copyright (c) 2004, 2010 Intel Corporation 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:
* Intel Corporation - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.managedbuilder.core;
import org.eclipse.cdt.managedbuilder.buildproperties.IBuildPropertyValue;
import org.eclipse.cdt.managedbuilder.envvar.IProjectEnvironmentVariableSupplier;
import org.eclipse.cdt.managedbuilder.macros.IProjectBuildMacroSupplier;
/**
* This class represents project-types in the managed build system.
* A project-type is a tool-integrator defined class of project which
* acts as a template for the projects that a user will create.
* The project-type contains one or more children of type configuration.
* These are the default configurations that the user can choose from.
* Note that there is no reason to define a project-type element in a
* .cdtbuild file. It would never be used since project-type elements
* are used to primarily populate the "New Project" dialog boxes.
* Project types can be arranged into hierarchies to promote the efficient
* sharing of configurations. If you have defined a project type that
* should not be selected by the user, but is a root for other project
* types, it may be declared abstract by setting the isAbstract attribute
* to 'true'. Abstract project types do not appear in the UI. You must
* provide a unique identifier for the project type in the id attribute.
* Children of the abstract project type will have the same configurations
* that the abstract project type has, unless they are explicitly named
* in the unusedChildren attribute of the child project. For these
* children to function properly, their superClass attribute must contain
* the unique identifier of the super class project type.
* A concrete project type must have at least one configuration defined
* for it. A project type must also define (or inherit) a set of tool-chain
* definitions that work together to produce the build goal as an output.
* You must also provide a meaningful name that will be displayed to the
* user in the UI and New Project wizards.
*
* @since 2.1
* @noextend This class is not intended to be subclassed by clients.
* @noimplement This interface is not intended to be implemented by clients.
*/
public interface IProjectType extends IBuildObject, IBuildObjectPropertiesContainer {
public static final String PROJECTTYPE_ELEMENT_NAME = "projectType"; //$NON-NLS-1$
public static final String SUPERCLASS = "superClass"; //$NON-NLS-1$
public static final String IS_ABSTRACT = "isAbstract"; //$NON-NLS-1$
public static final String UNUSED_CHILDREN = "unusedChildren"; //$NON-NLS-1$
public static final String IS_TEST = "isTest"; //$NON-NLS-1$
public static final String CONVERT_TO_ID = "convertToId"; //$NON-NLS-1$
public static final String CONFIGURATION_NAME_PROVIDER = "configurationNameProvider"; //$NON-NLS-1$
public static final String PROJECT_ENVIRONMENT_SUPPLIER = "projectEnvironmentSupplier"; //$NON-NLS-1$
public static final String PROJECT_MACRO_SUPPLIER = "projectMacroSupplier"; //$NON-NLS-1$
public static final String BUILD_PROPERTIES = "buildProperties"; //$NON-NLS-1$
public static final String BUILD_ARTEFACT_TYPE = "buildArtefactType"; //$NON-NLS-1$
/**
* Creates a configuration for this project-type populated with the tools
* and options settings from the parent configuration. As options and
* tools change in the parent, unoverridden values are updated in the
* child configuration as well.
* <p>
* NOTE: This routine affects the in-memory representation of the
* project-type, but since project-types are never written to the
* .cdtbuild file, the manifest definition does not change.
*
* @param parent The <code>IConfiguration</code> to use as a settings template
* @param id The unique id the new configuration will have
* @param name The name the new configuration will have
* @return IConfiguration of the new configuration
*/
public IConfiguration createConfiguration(IConfiguration parent, String id, String name);
/**
* Removes the configuration with the ID specified in the argument.
* <p>
* NOTE: This routine affects the in-memory representation of the
* project-type, but since project-types are never written to the
* .cdtbuild file, the manifest definition does not change.
*
* @param id The unique id of the configuration
*/
public void removeConfiguration(String id);
/**
* Returns all of the configurations defined by this project-type.
*
* @return IConfiguration[]
*/
public IConfiguration[] getConfigurations();
/**
* Returns the configuration with the given id, or <code>null</code> if not found.
*
* @param id The unique id of the configuration
* @return IConfiguration
*/
public IConfiguration getConfiguration(String id);
/**
* Returns the <code>IProjectType</code> that is the superclass of this
* project-type, or <code>null</code> if the attribute was not specified.
*
* @return IProjectType
*/
public IProjectType getSuperClass();
/**
* Returns whether this element is abstract. Returns <code>false</code>
* if the attribute was not specified.
* @return boolean
*/
public boolean isAbstract();
/**
* Sets the isAbstract attribute of the tool-chain.
*/
public void setIsAbstract(boolean b);
/**
* Returns a semi-colon delimited list of child Ids of the superclass'
* children that should not be automatically inherited by this element.
* Returns an empty string if the attribute was not specified.
* @return String
*/
public String getUnusedChildren();
/**
* Returns <code>true</code> if the project-type is defined
* for testing purposes only, else <code>false</code>. A test project-type will
* not be shown in the UI but can still be manipulated programmatically.
* Returns <code>false</code> if the attribute was not specified.
*
* @return boolean
*/
public boolean isTestProjectType();
/**
* Returns <code>true</code> if at least one project-type contiguration is supported on the system
* otherwise returns <code>false</code>
*
* @return boolean
*/
public boolean isSupported();
/**
* Returns the configurationNameProvider.
*
* @return IConfigurationNameProvider
*/
public IConfigurationNameProvider getConfigurationNameProvider();
/**
* Returns the tool-integrator provided implementation of the project environment variable supplier
* or <code>null</code> if none.
*
* @return IProjectEnvironmentVariableSupplier
*/
public IProjectEnvironmentVariableSupplier getEnvironmentVariableSupplier();
/**
* Returns the tool-integrator provided implementation of the project build macro supplier
* or <code>null</code> if none.
*
* @return IProjectBuildMacroSupplier
*/
public IProjectBuildMacroSupplier getBuildMacroSupplier();
/**
* Returns the 'convertToId' of this project type.
*
* @return String
*/
public String getConvertToId();
/**
* Sets the 'convertToId' attribute of the project type.
*/
public void setConvertToId(String convertToId);
/**
* check for migration support.
* @return boolean
*/
public boolean checkForMigrationSupport();
public String getNameAttribute();
public IBuildPropertyValue getBuildArtefactType();
boolean isSystemObject();
}