//
// 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 java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;

/**
 * 
 * Widget foreground, background (color) and font are in principle configurable,
 * though the font setting may not always work.
 * 
 * 
 * <p>
 * Java class for widget-type complex type.
 * 
 * <p>
 * The following schema fragment specifies the expected content contained within
 * this class.
 * 
 * <pre>
 * &lt;complexType name="widget-type">
 *   &lt;complexContent>
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *       &lt;sequence>
 *         &lt;element name="layout-data" type="{http://org.eclipse.ptp/rm}layout-data-type" minOccurs="0"/>
 *         &lt;element name="font" type="{http://org.eclipse.ptp/rm}font-type" minOccurs="0"/>
 *         &lt;element name="tooltip" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
 *         &lt;element name="items-from" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
 *         &lt;element name="fixed-text" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
 *         &lt;element name="dynamic-text" minOccurs="0">
 *           &lt;complexType>
 *             &lt;complexContent>
 *               &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *                 &lt;sequence>
 *                   &lt;element name="arg" type="{http://org.eclipse.ptp/rm}arg-type" maxOccurs="unbounded"/>
 *                 &lt;/sequence>
 *               &lt;/restriction>
 *             &lt;/complexContent>
 *           &lt;/complexType>
 *         &lt;/element>
 *       &lt;/sequence>
 *       &lt;attribute name="background" type="{http://www.w3.org/2001/XMLSchema}string" />
 *       &lt;attribute name="foreground" type="{http://www.w3.org/2001/XMLSchema}string" />
 *       &lt;attribute name="readOnly" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
 *       &lt;attribute name="saveValueTo" type="{http://www.w3.org/2001/XMLSchema}string" />
 *       &lt;attribute name="style" type="{http://www.w3.org/2001/XMLSchema}string" />
 *       &lt;attribute name="title" type="{http://www.w3.org/2001/XMLSchema}string" />
 *       &lt;attribute name="type" default="text">
 *         &lt;simpleType>
 *           &lt;restriction base="{http://www.w3.org/2001/XMLSchema}string">
 *             &lt;enumeration value="label"/>
 *             &lt;enumeration value="text"/>
 *             &lt;enumeration value="checkbox"/>
 *             &lt;enumeration value="spinner"/>
 *             &lt;enumeration value="combo"/>
 *             &lt;enumeration value="radioButton"/>
 *             &lt;enumeration value="browseLocal"/>
 *             &lt;enumeration value="browseRemote"/>
 *           &lt;/restriction>
 *         &lt;/simpleType>
 *       &lt;/attribute>
 *     &lt;/restriction>
 *   &lt;/complexContent>
 * &lt;/complexType>
 * </pre>
 * 
 * 
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "widget-type", propOrder = { "layoutData", "font", "tooltip", "itemsFrom", "fixedText", "dynamicText" })
public class WidgetType {

	@XmlElement(name = "layout-data")
	protected LayoutDataType layoutData;
	protected FontType font;
	protected String tooltip;
	@XmlElement(name = "items-from")
	protected String itemsFrom;
	@XmlElement(name = "fixed-text")
	protected String fixedText;
	@XmlElement(name = "dynamic-text")
	protected WidgetType.DynamicText dynamicText;
	@XmlAttribute
	protected String background;
	@XmlAttribute
	protected String foreground;
	@XmlAttribute
	protected Boolean readOnly;
	@XmlAttribute
	protected String saveValueTo;
	@XmlAttribute
	protected String style;
	@XmlAttribute
	protected String title;
	@XmlAttribute
	protected String type;

	/**
	 * Gets the value of the layoutData property.
	 * 
	 * @return possible object is {@link LayoutDataType }
	 * 
	 */
	public LayoutDataType getLayoutData() {
		return layoutData;
	}

	/**
	 * Sets the value of the layoutData property.
	 * 
	 * @param value
	 *            allowed object is {@link LayoutDataType }
	 * 
	 */
	public void setLayoutData(LayoutDataType value) {
		this.layoutData = value;
	}

	/**
	 * Gets the value of the font property.
	 * 
	 * @return possible object is {@link FontType }
	 * 
	 */
	public FontType getFont() {
		return font;
	}

	/**
	 * Sets the value of the font property.
	 * 
	 * @param value
	 *            allowed object is {@link FontType }
	 * 
	 */
	public void setFont(FontType value) {
		this.font = value;
	}

	/**
	 * Gets the value of the tooltip property.
	 * 
	 * @return possible object is {@link String }
	 * 
	 */
	public String getTooltip() {
		return tooltip;
	}

	/**
	 * Sets the value of the tooltip property.
	 * 
	 * @param value
	 *            allowed object is {@link String }
	 * 
	 */
	public void setTooltip(String value) {
		this.tooltip = value;
	}

	/**
	 * Gets the value of the itemsFrom property.
	 * 
	 * @return possible object is {@link String }
	 * 
	 */
	public String getItemsFrom() {
		return itemsFrom;
	}

	/**
	 * Sets the value of the itemsFrom property.
	 * 
	 * @param value
	 *            allowed object is {@link String }
	 * 
	 */
	public void setItemsFrom(String value) {
		this.itemsFrom = value;
	}

	/**
	 * Gets the value of the fixedText property.
	 * 
	 * @return possible object is {@link String }
	 * 
	 */
	public String getFixedText() {
		return fixedText;
	}

	/**
	 * Sets the value of the fixedText property.
	 * 
	 * @param value
	 *            allowed object is {@link String }
	 * 
	 */
	public void setFixedText(String value) {
		this.fixedText = value;
	}

	/**
	 * Gets the value of the dynamicText property.
	 * 
	 * @return possible object is {@link WidgetType.DynamicText }
	 * 
	 */
	public WidgetType.DynamicText getDynamicText() {
		return dynamicText;
	}

	/**
	 * Sets the value of the dynamicText property.
	 * 
	 * @param value
	 *            allowed object is {@link WidgetType.DynamicText }
	 * 
	 */
	public void setDynamicText(WidgetType.DynamicText value) {
		this.dynamicText = value;
	}

	/**
	 * Gets the value of the background property.
	 * 
	 * @return possible object is {@link String }
	 * 
	 */
	public String getBackground() {
		return background;
	}

	/**
	 * Sets the value of the background property.
	 * 
	 * @param value
	 *            allowed object is {@link String }
	 * 
	 */
	public void setBackground(String value) {
		this.background = value;
	}

	/**
	 * Gets the value of the foreground property.
	 * 
	 * @return possible object is {@link String }
	 * 
	 */
	public String getForeground() {
		return foreground;
	}

	/**
	 * Sets the value of the foreground property.
	 * 
	 * @param value
	 *            allowed object is {@link String }
	 * 
	 */
	public void setForeground(String value) {
		this.foreground = value;
	}

	/**
	 * Gets the value of the readOnly property.
	 * 
	 * @return possible object is {@link Boolean }
	 * 
	 */
	public boolean isReadOnly() {
		if (readOnly == null) {
			return false;
		} else {
			return readOnly;
		}
	}

	/**
	 * Sets the value of the readOnly property.
	 * 
	 * @param value
	 *            allowed object is {@link Boolean }
	 * 
	 */
	public void setReadOnly(Boolean value) {
		this.readOnly = value;
	}

	/**
	 * Gets the value of the saveValueTo property.
	 * 
	 * @return possible object is {@link String }
	 * 
	 */
	public String getSaveValueTo() {
		return saveValueTo;
	}

	/**
	 * Sets the value of the saveValueTo property.
	 * 
	 * @param value
	 *            allowed object is {@link String }
	 * 
	 */
	public void setSaveValueTo(String value) {
		this.saveValueTo = value;
	}

	/**
	 * Gets the value of the style property.
	 * 
	 * @return possible object is {@link String }
	 * 
	 */
	public String getStyle() {
		return style;
	}

	/**
	 * Sets the value of the style property.
	 * 
	 * @param value
	 *            allowed object is {@link String }
	 * 
	 */
	public void setStyle(String value) {
		this.style = value;
	}

	/**
	 * Gets the value of the title property.
	 * 
	 * @return possible object is {@link String }
	 * 
	 */
	public String getTitle() {
		return title;
	}

	/**
	 * Sets the value of the title property.
	 * 
	 * @param value
	 *            allowed object is {@link String }
	 * 
	 */
	public void setTitle(String value) {
		this.title = value;
	}

	/**
	 * Gets the value of the type property.
	 * 
	 * @return possible object is {@link String }
	 * 
	 */
	public String getType() {
		if (type == null) {
			return "text"; //$NON-NLS-1$
		} else {
			return type;
		}
	}

	/**
	 * Sets the value of the type property.
	 * 
	 * @param value
	 *            allowed object is {@link String }
	 * 
	 */
	public void setType(String value) {
		this.type = value;
	}

	/**
	 * <p>
	 * Java class for anonymous complex type.
	 * 
	 * <p>
	 * The following schema fragment specifies the expected content contained
	 * within this class.
	 * 
	 * <pre>
	 * &lt;complexType>
	 *   &lt;complexContent>
	 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
	 *       &lt;sequence>
	 *         &lt;element name="arg" type="{http://org.eclipse.ptp/rm}arg-type" maxOccurs="unbounded"/>
	 *       &lt;/sequence>
	 *     &lt;/restriction>
	 *   &lt;/complexContent>
	 * &lt;/complexType>
	 * </pre>
	 * 
	 * 
	 */
	@XmlAccessorType(XmlAccessType.FIELD)
	@XmlType(name = "", propOrder = { "arg" })
	public static class DynamicText {

		@XmlElement(required = true)
		protected List<ArgType> arg;

		/**
		 * Gets the value of the arg property.
		 * 
		 * <p>
		 * This accessor method returns a reference to the live list, not a
		 * snapshot. Therefore any modification you make to the returned list
		 * will be present inside the JAXB object. This is why there is not a
		 * <CODE>set</CODE> method for the arg property.
		 * 
		 * <p>
		 * For example, to add a new item, do as follows:
		 * 
		 * <pre>
		 * getArg().add(newItem);
		 * </pre>
		 * 
		 * 
		 * <p>
		 * Objects of the following type(s) are allowed in the list
		 * {@link ArgType }
		 * 
		 * 
		 */
		public List<ArgType> getArg() {
			if (arg == null) {
				arg = new ArrayList<ArgType>();
			}
			return this.arg;
		}

	}

}
