//
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
// 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.02.15 at 04:31:32 PM CET 
//


package org.eclipse.ptp.rm.lml.internal.core.elements;

import java.io.Serializable;


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 lml 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  implements Serializable {

    private final static QName _Lgui_QNAME = new QName("http://www.llview.de", "lgui");
    private final static QName _LguiTypeInformation_QNAME = new QName("", "information");
    private final static QName _LguiTypeText_QNAME = new QName("", "text");
    private final static QName _LguiTypeUsagebarlayout_QNAME = new QName("", "usagebarlayout");
    private final static QName _LguiTypeTablelayout_QNAME = new QName("", "tablelayout");
    private final static QName _LguiTypeTable_QNAME = new QName("", "table");
    private final static QName _LguiTypeSplitlayout_QNAME = new QName("", "splitlayout");
    private final static QName _LguiTypeNodedisplay_QNAME = new QName("", "nodedisplay");
    private final static QName _LguiTypeInfoboxlayout_QNAME = new QName("", "infoboxlayout");
    private final static QName _LguiTypeUsagebar_QNAME = new QName("", "usagebar");
    private final static QName _LguiTypeAbslayout_QNAME = new QName("", "abslayout");
    private final static QName _LguiTypeRelations_QNAME = new QName("", "relations");
    private final static QName _LguiTypeChartlayout_QNAME = new QName("", "chartlayout");
    private final static QName _LguiTypeChart_QNAME = new QName("", "chart");
    private final static QName _LguiTypeNodedisplaylayout_QNAME = new QName("", "nodedisplaylayout");
    private final static QName _LguiTypeObjects_QNAME = new QName("", "objects");
    private final static QName _LguiTypeChartgroup_QNAME = new QName("", "chartgroup");
    private final static QName _LguiTypeInfobox_QNAME = new QName("", "infobox");
    private final static QName _LguiTypeTextlayout_QNAME = new QName("", "textlayout");

    /**
     * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: lml
     * 
     */
    public ObjectFactory() {
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link LguiType }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "http://www.llview.de", name = "lgui")
    public JAXBElement<LguiType> createLgui(LguiType value) {
        return new JAXBElement<LguiType>(_Lgui_QNAME, LguiType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link InformationType }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "", name = "information", scope = LguiType.class)
    public JAXBElement<InformationType> createLguiTypeInformation(InformationType value) {
        return new JAXBElement<InformationType>(_LguiTypeInformation_QNAME, InformationType.class, LguiType.class, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link TextboxType }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "", name = "text", scope = LguiType.class)
    public JAXBElement<TextboxType> createLguiTypeText(TextboxType value) {
        return new JAXBElement<TextboxType>(_LguiTypeText_QNAME, TextboxType.class, LguiType.class, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link UsagebarlayoutType }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "", name = "usagebarlayout", scope = LguiType.class)
    public JAXBElement<UsagebarlayoutType> createLguiTypeUsagebarlayout(UsagebarlayoutType value) {
        return new JAXBElement<UsagebarlayoutType>(_LguiTypeUsagebarlayout_QNAME, UsagebarlayoutType.class, LguiType.class, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link TablelayoutType }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "", name = "tablelayout", scope = LguiType.class)
    public JAXBElement<TablelayoutType> createLguiTypeTablelayout(TablelayoutType value) {
        return new JAXBElement<TablelayoutType>(_LguiTypeTablelayout_QNAME, TablelayoutType.class, LguiType.class, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link TableType }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "", name = "table", scope = LguiType.class)
    public JAXBElement<TableType> createLguiTypeTable(TableType value) {
        return new JAXBElement<TableType>(_LguiTypeTable_QNAME, TableType.class, LguiType.class, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link SplitlayoutType }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "", name = "splitlayout", scope = LguiType.class)
    public JAXBElement<SplitlayoutType> createLguiTypeSplitlayout(SplitlayoutType value) {
        return new JAXBElement<SplitlayoutType>(_LguiTypeSplitlayout_QNAME, SplitlayoutType.class, LguiType.class, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link Nodedisplay }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "", name = "nodedisplay", scope = LguiType.class)
    public JAXBElement<Nodedisplay> createLguiTypeNodedisplay(Nodedisplay value) {
        return new JAXBElement<Nodedisplay>(_LguiTypeNodedisplay_QNAME, Nodedisplay.class, LguiType.class, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link InfoboxlayoutType }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "", name = "infoboxlayout", scope = LguiType.class)
    public JAXBElement<InfoboxlayoutType> createLguiTypeInfoboxlayout(InfoboxlayoutType value) {
        return new JAXBElement<InfoboxlayoutType>(_LguiTypeInfoboxlayout_QNAME, InfoboxlayoutType.class, LguiType.class, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link UsagebarType }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "", name = "usagebar", scope = LguiType.class)
    public JAXBElement<UsagebarType> createLguiTypeUsagebar(UsagebarType value) {
        return new JAXBElement<UsagebarType>(_LguiTypeUsagebar_QNAME, UsagebarType.class, LguiType.class, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link AbslayoutType }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "", name = "abslayout", scope = LguiType.class)
    public JAXBElement<AbslayoutType> createLguiTypeAbslayout(AbslayoutType value) {
        return new JAXBElement<AbslayoutType>(_LguiTypeAbslayout_QNAME, AbslayoutType.class, LguiType.class, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link RelationsType }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "", name = "relations", scope = LguiType.class)
    public JAXBElement<RelationsType> createLguiTypeRelations(RelationsType value) {
        return new JAXBElement<RelationsType>(_LguiTypeRelations_QNAME, RelationsType.class, LguiType.class, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link ChartlayoutType }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "", name = "chartlayout", scope = LguiType.class)
    public JAXBElement<ChartlayoutType> createLguiTypeChartlayout(ChartlayoutType value) {
        return new JAXBElement<ChartlayoutType>(_LguiTypeChartlayout_QNAME, ChartlayoutType.class, LguiType.class, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link ChartType }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "", name = "chart", scope = LguiType.class)
    public JAXBElement<ChartType> createLguiTypeChart(ChartType value) {
        return new JAXBElement<ChartType>(_LguiTypeChart_QNAME, ChartType.class, LguiType.class, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link NodedisplaylayoutType }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "", name = "nodedisplaylayout", scope = LguiType.class)
    public JAXBElement<NodedisplaylayoutType> createLguiTypeNodedisplaylayout(NodedisplaylayoutType value) {
        return new JAXBElement<NodedisplaylayoutType>(_LguiTypeNodedisplaylayout_QNAME, NodedisplaylayoutType.class, LguiType.class, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link ObjectsType }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "", name = "objects", scope = LguiType.class)
    public JAXBElement<ObjectsType> createLguiTypeObjects(ObjectsType value) {
        return new JAXBElement<ObjectsType>(_LguiTypeObjects_QNAME, ObjectsType.class, LguiType.class, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link ChartgroupType }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "", name = "chartgroup", scope = LguiType.class)
    public JAXBElement<ChartgroupType> createLguiTypeChartgroup(ChartgroupType value) {
        return new JAXBElement<ChartgroupType>(_LguiTypeChartgroup_QNAME, ChartgroupType.class, LguiType.class, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link InfoboxType }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "", name = "infobox", scope = LguiType.class)
    public JAXBElement<InfoboxType> createLguiTypeInfobox(InfoboxType value) {
        return new JAXBElement<InfoboxType>(_LguiTypeInfobox_QNAME, InfoboxType.class, LguiType.class, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link InfoboxlayoutType }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "", name = "textlayout", scope = LguiType.class)
    public JAXBElement<InfoboxlayoutType> createLguiTypeTextlayout(InfoboxlayoutType value) {
        return new JAXBElement<InfoboxlayoutType>(_LguiTypeTextlayout_QNAME, InfoboxlayoutType.class, LguiType.class, value);
    }

}
