<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns="http://www.nanoscopy.net/fsvarlist" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xi="http://www.w3.org/2001/XInclude" targetNamespace="http://www.nanoscopy.net/fsvarlist" elementFormDefault="qualified" attributeFormDefault="unqualified">
  <xs:import namespace="http://www.w3.org/2001/XInclude"/>
  <xs:annotation>
    <xs:documentation>Versatile Variables Interface definition schema</xs:documentation>
  </xs:annotation>
  <xs:element name="varlist">
    <xs:annotation>
      <xs:documentation>root element</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:complexContent>
        <xs:extension base="paneType">
          <xs:sequence>
            <xs:element name="button" type="defbuttonType" minOccurs="0" maxOccurs="2" />
            <xs:element name="menu" minOccurs="0">
              <xs:complexType>
                <xs:group ref="menuItemsGroup" maxOccurs="unbounded" />
              </xs:complexType>
            </xs:element>
            <xs:element ref="xi:include" minOccurs="0" />
          </xs:sequence>
          <xs:attribute name="autosize" type="xs:boolean" use="optional" default="true" />
          <xs:attribute name="dialogunits" type="xs:boolean" use="optional" default="true" />
          <xs:attribute name="defok" type="xs:boolean" use="optional" default="true" />
          <xs:attribute name="defcancel" type="xs:boolean" use="optional" default="true" />
          <xs:attribute name="name" type="xs:string" use="optional" default="Parameters" />
          <xs:attribute name="btncolor" type="color" use="optional" default="-1" />
          <xs:attribute name="dlgcolor" type="color" use="optional" default="-1" />
          <xs:attribute name="edtcolor" type="color" use="optional" default="-1" />
          <xs:attribute name="statcolor" type="color" use="optional" default="-1" />
          <xs:attribute name="precision" type="color" use="optional" default="3" />
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
    <xs:unique name="singledefvarlist">
      <xs:selector xpath="." />
      <xs:field xpath=".//defaultvarlist" />
    </xs:unique>
  </xs:element>
  <xs:complexType name="paneType">
    <xs:annotation>
      <xs:documentation>generic pane - container for other elements</xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:group ref="paneElements" minOccurs="0" maxOccurs="unbounded" />
      <xs:element name="skin" type="skinType" minOccurs="0" />
    </xs:sequence>
    <xs:attribute name="prefix" type="identifier" use="optional" />
    <xs:attribute name="itemwidth" type="xs:integer" use="optional"/>
    <xs:attribute name="itemheight" type="xs:integer" use="optional"/>
  </xs:complexType>
  <xs:group name="paneElements">
    <xs:annotation>
      <xs:documentation>group of elements that can occur inside pane</xs:documentation>
    </xs:annotation>
    <xs:choice>
      <xs:element name="var" type="varType">
        <xs:annotation>
          <xs:documentation>generic variable</xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="selector" type="selectorType">
        <xs:annotation>
          <xs:documentation>switch</xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="tabgroup" type="tabgroupType">
        <xs:annotation>
          <xs:documentation>tabulator</xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="defaultvarlist">
        <xs:annotation>
          <xs:documentation>here comes all unreferenced variables</xs:documentation>
        </xs:annotation>
        <xs:complexType>
          <xs:attributeGroup ref="positionGroup" />
          <xs:attribute name="readonly" type="xs:boolean" use="optional" default="false" />
          <xs:attribute name="parname" type="xs:string" use="optional" default="Parameter" />
          <xs:attribute name="valname" type="xs:string" use="optional" default="Value" />
        </xs:complexType>
      </xs:element>
      <xs:element name="userbutton">
        <xs:annotation>
          <xs:documentation>user-defined button</xs:documentation>
        </xs:annotation>
        <xs:complexType>
          <xs:attributeGroup ref="positionGroup" />
          <xs:attribute name="name" type="xs:string" use="optional" />
          <xs:attribute name="id" type="identifier" use="required" />
        </xs:complexType>
      </xs:element>
      <xs:element name="switch">
        <xs:complexType>
          <xs:attributeGroup ref="positionGroup" />
          <xs:attribute name="name" type="xs:string" use="optional" />
          <xs:attribute name="name_off" type="xs:string" use="optional" />
          <xs:attribute name="id" type="identifier" use="required" />
        </xs:complexType>
      </xs:element>
    </xs:choice>
  </xs:group>
  <xs:complexType name="selectorType">
    <xs:annotation>
      <xs:documentation>selectable pane group</xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="pane" maxOccurs="unbounded">
        <xs:annotation>
          <xs:documentation>set of switched panes</xs:documentation>
        </xs:annotation>
        <xs:complexType>
          <xs:complexContent>
            <xs:extension base="paneType">
              <xs:attribute name="selector" type="filter" use="required" />
            </xs:extension>
          </xs:complexContent>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="id" type="identifier" use="required" />
    <xs:attributeGroup ref="positionGroup" />
  </xs:complexType>
  <xs:complexType name="tabgroupType">
    <xs:annotation>
      <xs:documentation>tabular selection</xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:group ref="tabgroupElements" maxOccurs="unbounded" />
    </xs:sequence>
    <xs:attributeGroup ref="positionGroup" />
  </xs:complexType>
  <xs:group name="tabgroupElements">
    <xs:annotation>
      <xs:documentation>elments that can occur inside tabgroup</xs:documentation>
    </xs:annotation>
    <xs:choice>
      <xs:element name="item" type="itemType">
        <xs:annotation>
          <xs:documentation>simple item</xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="selitem">
        <xs:annotation>
          <xs:documentation>switched item</xs:documentation>
        </xs:annotation>
        <xs:complexType>
          <xs:complexContent>
            <xs:extension base="itemType">
              <xs:attribute name="selectorid" type="identifier" use="required" />
              <xs:attribute name="selectorval" type="identifier" use="required" />
            </xs:extension>
          </xs:complexContent>
        </xs:complexType>
      </xs:element>
      <xs:element ref="xi:include" />
    </xs:choice>
  </xs:group>
  <xs:complexType name="itemType">
    <xs:annotation>
      <xs:documentation>basic tabgroup item</xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="pane" type="paneType">
        <xs:annotation>
          <xs:documentation>simple pane</xs:documentation>
        </xs:annotation>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="name" type="xs:string" use="required" />
  </xs:complexType>
  <xs:complexType name="varType">
    <xs:annotation>
      <xs:documentation>basic interface element - variable interface</xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="interface" minOccurs="0">
        <xs:annotation>
          <xs:documentation>type of interface</xs:documentation>
        </xs:annotation>
        <xs:complexType>
          <xs:complexContent>
            <xs:extension base="interfaceType" />
          </xs:complexContent>
        </xs:complexType>
      </xs:element>
      <xs:element name="tooltip" minOccurs="0" />
    </xs:sequence>
    <xs:attribute name="id" type="identifier" use="required" />
    <xs:attribute name="name" type="xs:string" use="optional" />
    <xs:attributeGroup ref="positionGroup" />
    <xs:attribute name="full_name" type="xs:string" use="optional" />
    <xs:attribute name="precision" type="color" use="optional" default="3" />
  </xs:complexType>
  <xs:complexType name="interfaceType">
    <xs:annotation>
      <xs:documentation>available interfaces</xs:documentation>
    </xs:annotation>
    <xs:choice minOccurs="0">
      <xs:annotation>
        <xs:documentation>if no interface specified, the default interface type, depending on the variable type, will be used</xs:documentation>
      </xs:annotation>
      <xs:element name="SpinEditbox">
        <xs:annotation>
          <xs:documentation>Editbox with spin button</xs:documentation>
        </xs:annotation>
        <xs:complexType>
          <xs:attribute name="increment" type="xs:double" use="optional" default="0" />
          <xs:attribute name="update_rate" type="xs:double" use="optional" default="0" />
        </xs:complexType>
      </xs:element>
      <xs:element name="Checkbox">
        <xs:annotation>
          <xs:documentation>checkbox or radiobox</xs:documentation>
        </xs:annotation>
        <xs:complexType>
          <xs:sequence>
            <xs:element name="item" maxOccurs="unbounded" minOccurs="0">
              <xs:complexType>
                <xs:attribute name="filter" type="filter" use="required" />
                <xs:attribute name="name" type="xs:string" use="required" />
              </xs:complexType>
            </xs:element>
          </xs:sequence>
          <xs:attribute name="type" type="checkboxType" use="optional" default="simple" />
        </xs:complexType>
      </xs:element>
      <xs:element name="SkinCheckbox">
        <xs:annotation>
          <xs:documentation>Button with user-defined appearance</xs:documentation>
        </xs:annotation>
        <xs:complexType>
          <xs:sequence>
            <xs:element name="bitmap" maxOccurs="unbounded">
              <xs:complexType>
                <xs:complexContent>
                  <xs:restriction base="bitmapType">
                    <xs:attribute name="id" use="required">
                      <xs:simpleType>
                        <xs:restriction base="xs:string">
                          <xs:enumeration value="up" />
                          <xs:enumeration value="down" />
                          <xs:enumeration value="selup" />
                          <xs:enumeration value="seldown" />
                        </xs:restriction>
                      </xs:simpleType>
                    </xs:attribute>
                  </xs:restriction>
                </xs:complexContent>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
          <xs:attribute name="type" type="checkboxType" use="optional" default="simple" />
        </xs:complexType>
        <xs:unique name="button_id_unique">
          <xs:selector xpath="bitmap" />
          <xs:field xpath="@id" />
        </xs:unique>
      </xs:element>
      <xs:element name="Combobox">
        <xs:annotation>
          <xs:documentation>Combobox</xs:documentation>
        </xs:annotation>
        <xs:complexType>
          <xs:sequence>
            <xs:element name="item" maxOccurs="unbounded" minOccurs="0">
              <xs:complexType>
                <xs:attribute name="filter" type="filter" use="required">
                </xs:attribute>
                <xs:attribute name="name" type="xs:string" use="required">
                </xs:attribute>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="EditCombobox">
        <xs:annotation>
          <xs:documentation>Combobox with edit control, based on strlist var option</xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="Editbox">
        <xs:annotation>
          <xs:documentation>Editbox</xs:documentation>
        </xs:annotation>
        <xs:complexType>
          <xs:attribute name="type" type="editboxType" use="optional" default="default" />
        </xs:complexType>
      </xs:element>
      <xs:element name="BrowseEditbox">
        <xs:annotation>
          <xs:documentation>Editbox with "Browse" button for file selection</xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="Trackbar">
        <xs:annotation>
          <xs:documentation>Trackbar (slider)</xs:documentation>
        </xs:annotation>
        <xs:complexType>
          <xs:attribute name="direction" type="trackbarType" use="optional" default="horizontal" />
        </xs:complexType>
      </xs:element>
      <xs:element name="Groupbox">
        <xs:annotation>
          <xs:documentation>Groupbox</xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="ColorChooser">
        <xs:annotation>
          <xs:documentation>Color chooser area</xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="ProgressBar">
        <xs:annotation>
          <xs:documentation>Progress Bar (readonly indicator)</xs:documentation>
        </xs:annotation>
        <xs:complexType>
          <xs:attribute name="direction" type="trackbarType" use="optional" default="horizontal" />
          <xs:attribute name="barcolor" type="color" use="optional"/>
          <xs:attribute name="bkcolor" type="color" use="optional"/>
        </xs:complexType>
      </xs:element>
    </xs:choice>
    <xs:attribute name="name" type="xs:string" use="optional" />
    <xs:attribute name="readonly" type="xs:boolean" use="optional" default="false" />
    <xs:attribute name="hidename" type="xs:boolean" use="optional" default="false" />
    <xs:attribute name="vertical" type="xs:boolean" use="optional" default="false" />
    <xs:attribute name="split" type="xs:integer" use="optional" default="0" />
    <xs:attribute name="tooltip" type="xs:string" use="optional" />
    <xs:attribute name="precision" type="xs:int" use="optional" />
  </xs:complexType>
  <xs:simpleType name="identifier" id="identifier">
    <xs:annotation>
      <xs:documentation>variable id</xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:string">
      <xs:pattern value="[\w._]+" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="trackbarType">
    <xs:annotation>
      <xs:documentation>type of trackbar interface element</xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:NMTOKEN">
      <xs:enumeration value="horizontal" />
      <xs:enumeration value="vertical" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="checkboxType">
    <xs:annotation>
      <xs:documentation>type of checkbox interface element</xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:NMTOKEN">
      <xs:enumeration value="simple" />
      <xs:enumeration value="radio" />
      <xs:enumeration value="button" />
    </xs:restriction>
  </xs:simpleType>
  <xs:attributeGroup name="positionGroup">
    <xs:annotation>
      <xs:documentation>positioning rectangle</xs:documentation>
    </xs:annotation>
    <xs:attribute name="left" type="xs:integer" use="required" />
    <xs:attribute name="top" type="xs:integer" use="required" />
    <xs:attribute name="width" type="xs:integer" use="optional" />
    <xs:attribute name="height" type="xs:integer" use="optional" />
  </xs:attributeGroup>
  <xs:simpleType name="buttonType">
    <xs:annotation>
      <xs:documentation>push button element</xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:NMTOKEN">
      <xs:enumeration value="ok" />
      <xs:enumeration value="cancel" />
      <xs:enumeration value="minimize" />
    </xs:restriction>
  </xs:simpleType>
  <xs:complexType name="defbuttonType">
    <xs:annotation>
      <xs:documentation>default Ok and Cancel buttons</xs:documentation>
    </xs:annotation>
    <xs:attributeGroup ref="positionGroup" />
    <xs:attribute name="name" type="xs:string" use="optional" />
    <xs:attribute name="type" type="buttonType" use="required" />
  </xs:complexType>
  <xs:complexType name="skinType">
    <xs:annotation>
      <xs:documentation>skin definition</xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="bitmap" type="bitmapType">
        <xs:annotation>
          <xs:documentation>the bitmap defines the default rectange region, equal to the bitmap size</xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:annotation>
          <xs:documentation>The very first region will be combined with default region, equal to the bitmap size. All subsequent regions are combyned with the result of previous operations</xs:documentation>
        </xs:annotation>
        <xs:element name="Ellipse">
          <xs:annotation>
            <xs:documentation>elliptic region</xs:documentation>
          </xs:annotation>
          <xs:complexType>
            <xs:attribute name="op" type="rgnOpType" use="required" />
            <xs:attributeGroup ref="positionGroup" />
          </xs:complexType>
        </xs:element>
        <xs:element name="Polygon">
          <xs:annotation>
            <xs:documentation>polygon, defined by it's vertices</xs:documentation>
          </xs:annotation>
          <xs:complexType>
            <xs:sequence>
              <xs:element name="Point" minOccurs="3" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:attribute name="x" type="xs:integer" use="required" />
                  <xs:attribute name="y" type="xs:integer" use="required" />
                </xs:complexType>
              </xs:element>
            </xs:sequence>
            <xs:attribute name="op" type="rgnOpType" use="required" />
          </xs:complexType>
        </xs:element>
        <xs:element name="Rect">
          <xs:annotation>
            <xs:documentation>simple rectangle</xs:documentation>
          </xs:annotation>
          <xs:complexType>
            <xs:attribute name="op" type="rgnOpType" use="required" />
            <xs:attributeGroup ref="positionGroup" />
          </xs:complexType>
        </xs:element>
        <xs:element name="RoundRect">
          <xs:annotation>
            <xs:documentation>rectangle with rounded corners</xs:documentation>
          </xs:annotation>
          <xs:complexType>
            <xs:attribute name="op" type="rgnOpType" use="required" />
            <xs:attributeGroup ref="positionGroup" />
            <xs:attribute name="wr" type="xs:integer" use="required" />
            <xs:attribute name="hr" type="xs:integer" use="required" />
          </xs:complexType>
        </xs:element>
      </xs:choice>
    </xs:sequence>
    <xs:attribute name="x" type="xs:integer" use="optional" default="0" />
    <xs:attribute name="y" type="xs:integer" use="optional" default="0" />
  </xs:complexType>
  <xs:simpleType name="rgnOpType">
    <xs:annotation>
      <xs:documentation>region operation</xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:NMTOKEN">
      <xs:enumeration value="and" />
      <xs:enumeration value="or" />
      <xs:enumeration value="xor" />
      <xs:enumeration value="diff" />
    </xs:restriction>
  </xs:simpleType>
  <xs:complexType name="bitmapType">
    <xs:annotation>
      <xs:documentation>file name and id of bitmap</xs:documentation>
    </xs:annotation>
    <xs:attribute name="data" type="xs:anyURI" use="required" />
    <xs:attribute name="id" type="xs:string" use="optional" />
  </xs:complexType>
  <xs:simpleType name="editboxType">
    <xs:annotation>
      <xs:documentation>type of editbox element</xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:NMTOKEN">
      <xs:enumeration value="default" />
      <xs:enumeration value="simple" />
      <xs:enumeration value="multiline" />
      <xs:enumeration value="password" />
    </xs:restriction>
  </xs:simpleType>
  <xs:group name="menuItemsGroup">
    <xs:annotation>
      <xs:documentation>possible menu items</xs:documentation>
    </xs:annotation>
    <xs:choice>
      <xs:element name="menuitem">
        <xs:complexType>
          <xs:attribute name="id" type="identifier" use="required" />
          <xs:attribute name="name" type="xs:string" use="optional" />
        </xs:complexType>
      </xs:element>
      <xs:element name="separator" />
      <xs:element name="popup">
        <xs:complexType>
          <xs:group ref="menuItemsGroup" maxOccurs="unbounded" />
          <xs:attribute name="name" type="xs:string" use="required" />
        </xs:complexType>
      </xs:element>
    </xs:choice>
  </xs:group>
  <xs:simpleType name="filter">
    <xs:restriction base="xs:string">
      <xs:pattern value="[\w_]+">
      </xs:pattern>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="color">
    <xs:restriction base="xs:string">
      <xs:pattern value="[\+\-]?(0[xX]{1})?[0-9a-fA-F]+">
      </xs:pattern>
    </xs:restriction>
  </xs:simpleType>
</xs:schema>
