//
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.0.5-b02-fcs 
// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
// Any modifications to this file will be lost upon recompilation of the source schema. 
// Generated on: 2011.04.21 at 02:35:28 PM CDT 
//

package org.eclipse.ptp.rm.jaxb.core.data;

import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.XmlElementDecl;
import javax.xml.bind.annotation.XmlRegistry;
import javax.xml.namespace.QName;

/**
 * This object contains factory methods for each Java content interface and Java
 * element interface generated in the org.eclipse.ptp.rm.jaxb.core.data package.
 * <p>
 * An ObjectFactory allows you to programatically construct new instances of the
 * Java representation for XML content. The Java representation of XML content
 * can consist of schema derived interfaces and classes representing the binding
 * of schema type definitions, element declarations and model groups. Factory
 * methods for each of these are provided in this class.
 * 
 */
@XmlRegistry
public class ObjectFactory {

	private final static QName _ResourceManagerBuilder_QNAME = new QName("http://org.eclipse.ptp/rm", "resource-manager-builder"); //$NON-NLS-1$ //$NON-NLS-2$

	/**
	 * Create a new ObjectFactory that can be used to create new instances of
	 * schema derived classes for package: org.eclipse.ptp.rm.jaxb.core.data
	 * 
	 */
	public ObjectFactory() {
	}

	/**
	 * Create an instance of {@link AddType }
	 * 
	 */
	public AddType createAddType() {
		return new AddType();
	}

	/**
	 * Create an instance of {@link AppendType }
	 * 
	 */
	public AppendType createAppendType() {
		return new AppendType();
	}

	/**
	 * Create an instance of {@link ArgType }
	 * 
	 */
	public ArgType createArgType() {
		return new ArgType();
	}

	/**
	 * Create an instance of {@link AttributeType }
	 * 
	 */
	public AttributeType createAttributeType() {
		return new AttributeType();
	}

	/**
	 * Create an instance of {@link AttributeViewerType }
	 * 
	 */
	public AttributeViewerType createAttributeViewerType() {
		return new AttributeViewerType();
	}

	/**
	 * Create an instance of {@link ColumnDataType }
	 * 
	 */
	public ColumnDataType createColumnDataType() {
		return new ColumnDataType();
	}

	/**
	 * Create an instance of {@link CommandType }
	 * 
	 */
	public CommandType createCommandType() {
		return new CommandType();
	}

	/**
	 * Create an instance of {@link CompositeType }
	 * 
	 */
	public CompositeType createCompositeType() {
		return new CompositeType();
	}

	/**
	 * Create an instance of {@link ControlType }
	 * 
	 */
	public ControlType createControlType() {
		return new ControlType();
	}

	/**
	 * Create an instance of {@link EntryType }
	 * 
	 */
	public EntryType createEntryType() {
		return new EntryType();
	}

	/**
	 * Create an instance of {@link FileMatchType }
	 * 
	 */
	public FileMatchType createFileMatchType() {
		return new FileMatchType();
	}

	/**
	 * Create an instance of {@link FillLayoutType }
	 * 
	 */
	public FillLayoutType createFillLayoutType() {
		return new FillLayoutType();
	}

	/**
	 * Create an instance of {@link FontType }
	 * 
	 */
	public FontType createFontType() {
		return new FontType();
	}

	/**
	 * Create an instance of {@link FormAttachmentType }
	 * 
	 */
	public FormAttachmentType createFormAttachmentType() {
		return new FormAttachmentType();
	}

	/**
	 * Create an instance of {@link FormDataType }
	 * 
	 */
	public FormDataType createFormDataType() {
		return new FormDataType();
	}

	/**
	 * Create an instance of {@link FormLayoutType }
	 * 
	 */
	public FormLayoutType createFormLayoutType() {
		return new FormLayoutType();
	}

	/**
	 * Create an instance of {@link GridDataType }
	 * 
	 */
	public GridDataType createGridDataType() {
		return new GridDataType();
	}

	/**
	 * Create an instance of {@link GridLayoutType }
	 * 
	 */
	public GridLayoutType createGridLayoutType() {
		return new GridLayoutType();
	}

	/**
	 * Create an instance of {@link LaunchTabType }
	 * 
	 */
	public LaunchTabType createLaunchTabType() {
		return new LaunchTabType();
	}

	/**
	 * Create an instance of {@link LayoutDataType }
	 * 
	 */
	public LayoutDataType createLayoutDataType() {
		return new LayoutDataType();
	}

	/**
	 * Create an instance of {@link LayoutType }
	 * 
	 */
	public LayoutType createLayoutType() {
		return new LayoutType();
	}

	/**
	 * Create an instance of {@link LineType }
	 * 
	 */
	public LineType createLineType() {
		return new LineType();
	}

	/**
	 * Create an instance of {@link ManagedFilesType }
	 * 
	 */
	public ManagedFilesType createManagedFilesType() {
		return new ManagedFilesType();
	}

	/**
	 * Create an instance of {@link ManagedFileType }
	 * 
	 */
	public ManagedFileType createManagedFileType() {
		return new ManagedFileType();
	}

	/**
	 * Create an instance of {@link MatchType }
	 * 
	 */
	public MatchType createMatchType() {
		return new MatchType();
	}

	/**
	 * Create an instance of {@link MonitorType }
	 * 
	 */
	public MonitorType createMonitorType() {
		return new MonitorType();
	}

	/**
	 * Create an instance of {@link NameValuePairType }
	 * 
	 */
	public NameValuePairType createNameValuePairType() {
		return new NameValuePairType();
	}

	/**
	 * Create an instance of {@link PropertyType }
	 * 
	 */
	public PropertyType createPropertyType() {
		return new PropertyType();
	}

	/**
	 * Create an instance of {@link PutType }
	 * 
	 */
	public PutType createPutType() {
		return new PutType();
	}

	/**
	 * Create an instance of {@link RegexType }
	 * 
	 */
	public RegexType createRegexType() {
		return new RegexType();
	}

	/**
	 * Create an instance of {@link JAXBElement }{@code <}
	 * {@link ResourceManagerData }{@code >}
	 * 
	 */
	@XmlElementDecl(namespace = "http://org.eclipse.ptp/rm", name = "resource-manager-builder")
	public JAXBElement<ResourceManagerData> createResourceManagerBuilder(ResourceManagerData value) {
		return new JAXBElement<ResourceManagerData>(_ResourceManagerBuilder_QNAME, ResourceManagerData.class, null, value);
	}

	/**
	 * Create an instance of {@link ResourceManagerData }
	 * 
	 */
	public ResourceManagerData createResourceManagerData() {
		return new ResourceManagerData();
	}

	/**
	 * Create an instance of {@link RowDataType }
	 * 
	 */
	public RowDataType createRowDataType() {
		return new RowDataType();
	}

	/**
	 * Create an instance of {@link RowLayoutType }
	 * 
	 */
	public RowLayoutType createRowLayoutType() {
		return new RowLayoutType();
	}

	/**
	 * Create an instance of {@link ScriptType }
	 * 
	 */
	public ScriptType createScriptType() {
		return new ScriptType();
	}

	/**
	 * Create an instance of {@link SetType }
	 * 
	 */
	public SetType createSetType() {
		return new SetType();
	}

	/**
	 * Create an instance of {@link SiteType }
	 * 
	 */
	public SiteType createSiteType() {
		return new SiteType();
	}

	/**
	 * Create an instance of {@link TabControllerType }
	 * 
	 */
	public TabControllerType createTabControllerType() {
		return new TabControllerType();
	}

	/**
	 * Create an instance of {@link TabFolderType }
	 * 
	 */
	public TabFolderType createTabFolderType() {
		return new TabFolderType();
	}

	/**
	 * Create an instance of {@link TabItemType }
	 * 
	 */
	public TabItemType createTabItemType() {
		return new TabItemType();
	}

	/**
	 * Create an instance of {@link TargetType }
	 * 
	 */
	public TargetType createTargetType() {
		return new TargetType();
	}

	/**
	 * Create an instance of {@link TemplateType }
	 * 
	 */
	public TemplateType createTemplateType() {
		return new TemplateType();
	}

	/**
	 * Create an instance of {@link TestType }
	 * 
	 */
	public TestType createTestType() {
		return new TestType();
	}

	/**
	 * Create an instance of {@link TestType.Else }
	 * 
	 */
	public TestType.Else createTestTypeElse() {
		return new TestType.Else();
	}

	/**
	 * Create an instance of {@link TokenizerType }
	 * 
	 */
	public TokenizerType createTokenizerType() {
		return new TokenizerType();
	}

	/**
	 * Create an instance of {@link ValidatorType }
	 * 
	 */
	public ValidatorType createValidatorType() {
		return new ValidatorType();
	}

	/**
	 * Create an instance of {@link ViewerItemsType }
	 * 
	 */
	public ViewerItemsType createViewerItemsType() {
		return new ViewerItemsType();
	}

	/**
	 * Create an instance of {@link WidgetType }
	 * 
	 */
	public WidgetType createWidgetType() {
		return new WidgetType();
	}

	/**
	 * Create an instance of {@link WidgetType.DynamicText }
	 * 
	 */
	public WidgetType.DynamicText createWidgetTypeDynamicText() {
		return new WidgetType.DynamicText();
	}

}
