//
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 
// 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.10 at 02:31:08 PM CET 
//


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

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;



/**
 * Settings will not be inherited through hierarchy, but default layout will be set for all scheme-elements, which are not defined
 * 
 * <p>Java class for nodedisplaylayout_type complex type.
 * 
 * <p>The following schema fragment specifies the expected content contained within this class.
 * 
 * <pre>
 * &lt;complexType name="nodedisplaylayout_type">
 *   &lt;complexContent>
 *     &lt;extension base="{http://www.llview.de}componentlayout_type">
 *       &lt;sequence>
 *         &lt;element name="el0" type="{http://www.llview.de}nodedisplayelement0"/>
 *       &lt;/sequence>
 *     &lt;/extension>
 *   &lt;/complexContent>
 * &lt;/complexType>
 * </pre>
 * 
 * 
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "nodedisplaylayout_type", propOrder = {
    "el0"
})
public class NodedisplaylayoutType
    extends ComponentlayoutType
{

    @XmlElement(required = true)
    protected Nodedisplayelement0 el0;

    /**
     * Gets the value of the el0 property.
     * 
     * @return
     *     possible object is
     *     {@link Nodedisplayelement0 }
     *     
     */
    public Nodedisplayelement0 getEl0() {
        return el0;
    }

    /**
     * Sets the value of the el0 property.
     * 
     * @param value
     *     allowed object is
     *     {@link Nodedisplayelement0 }
     *     
     */
    public void setEl0(Nodedisplayelement0 value) {
        this.el0 = value;
    }

}
