﻿<?xml version="1.0" encoding="utf-8"?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           targetNamespace="http://www.mendix.com/widget/1.0/"
           xmlns="http://www.mendix.com/widget/1.0/"
           xmlns:p="http://www.mendix.com/widget/1.0/"
           elementFormDefault="qualified">

  <xs:element name="widget" type="widgetType" />

  <xs:complexType name="widgetType">
    <xs:sequence>
      <xs:element name="name" type="xs:string" />
      <xs:element name="description" type="xs:string" />
      <xs:element name="studioProCategory" type="xs:string" minOccurs="0" />
      <xs:element name="studioCategory" type="xs:string" minOccurs="0" />
      <xs:element name="helpUrl" type="xs:string" minOccurs="0" />
      <xs:element name="icon" type="xs:base64Binary" minOccurs="0" />
      <xs:element name="phonegap" type="phonegapType" minOccurs="0" />
      <xs:element name="properties" type="propertiesType">
        <xs:unique name="propertyKeyUnique">
          <xs:selector xpath="p:property|p:propertyGroup/p:property|p:propertyGroup/p:propertyGroup/p:property" />
          <xs:field xpath="@key" />
        </xs:unique>
        <xs:unique name="propertyCaptionUnique1">
          <xs:selector xpath="p:property" />
          <xs:field xpath="caption" />
        </xs:unique>
        <xs:unique name="propertyGroupCaptionUnique1">
          <xs:selector xpath="p:propertyGroup" />
          <xs:field xpath="@caption" />
        </xs:unique>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="id" type="xs:string" use="required" />
    <xs:attribute name="needsEntityContext" type="xs:boolean" default="false" />
    <xs:attribute name="pluginWidget" type="xs:boolean" />
    <xs:attribute name="mobile" type="xs:boolean" default="false" />
    <xs:attribute name="supportedPlatform" type="platformType" default="Web"/>
    <xs:attribute name="offlineCapable" type="xs:boolean" default="false" />
  </xs:complexType>

  <xs:complexType name="phonegapType">
    <xs:attribute name="enabled" type="xs:boolean" use="required" />
  </xs:complexType>

  <xs:complexType name="propertiesType">
    <xs:choice>
      <xs:sequence>
        <xs:element name="propertyGroup" type="propertyGroupType" minOccurs="1" maxOccurs="unbounded">
          <xs:unique name="propertyCaptionUnique2">
            <xs:selector xpath="p:property" />
            <xs:field xpath="caption" />
          </xs:unique>
          <xs:unique name="propertyGroupCaptionUnique2">
            <xs:selector xpath="p:propertyGroup" />
            <xs:field xpath="@caption" />
          </xs:unique>
        </xs:element>
      </xs:sequence>
      <xs:sequence>
        <xs:choice maxOccurs="unbounded">
          <xs:element name="property" type="propertyType" minOccurs="1" maxOccurs="unbounded" />
          <xs:element name="systemProperty" type="systemPropertyType" minOccurs="0" maxOccurs="unbounded" />
        </xs:choice>
      </xs:sequence>
    </xs:choice>
  </xs:complexType>

  <xs:complexType name="propertyGroupType">
    <xs:complexContent>
      <xs:extension base="propertiesType">
        <xs:attribute name="caption" type="captionType" use="required" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="propertyType">
    <xs:sequence>
      <xs:element name="caption" type="captionType" />
      <xs:element name="category" type="xs:string" minOccurs="0" />
      <xs:element name="description" type="xs:string" />
      <xs:element name="attributeTypes" type="attributeTypesType" minOccurs="0" />
      <xs:element name="associationTypes" type="associationTypesType" minOccurs="0" />
      <xs:element name="selectionTypes" type="selectionTypesType" minOccurs="0" />
      <xs:element name="enumerationValues" type="enumerationValuesType" minOccurs="0" />
      <xs:element name="properties" type="propertiesType" minOccurs="0" />
      <xs:element name="returnType" type="returnTypeType" minOccurs="0" />
      <xs:element name="translations" type="translationsType" minOccurs="0" />
      <xs:element name="actionVariables" type="actionVariablesType" minOccurs="0" />
    </xs:sequence>
    <xs:attribute name="key" type="propertyKey" use="required" />
    <xs:attribute name="type" type="propertyTypeType" use="required" />
    <xs:attribute name="isList" type="xs:boolean" default="false" />
    <xs:attribute name="entityProperty" type="propertyPath" />
    <xs:attribute name="allowNonPersistableEntities" type="xs:boolean" default="false" />
    <xs:attribute name="isPath" type="isPathType" default="no" />
    <xs:attribute name="pathType" type="pathTypeType" />
    <xs:attribute name="parameterIsList" type="xs:boolean" default="false" />
    <xs:attribute name="multiline" type="xs:boolean" default="false" />
    <xs:attribute name="defaultValue" type="xs:string" default="" />
    <xs:attribute name="required" type="xs:boolean" default="true" />
    <xs:attribute name="isDefault" type="xs:boolean" default="false" />
    <xs:attribute name="onChange" type="propertyPath" />
    <xs:attribute name="dataSource" type="propertyPath" />
    <xs:attribute name="selectableObjects" type="propertyPath" />
    <xs:attribute name="setLabel" type="xs:boolean" default="false" />
    <xs:attribute name="isLinked" type="xs:boolean" default="false" />
    <xs:attribute name="isMetaData" type="xs:boolean" default="false" />
    <xs:attribute name="defaultType" type="DefaultActionTypeType"/>
  </xs:complexType>

  <xs:simpleType name="propertyTypeType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="action" />
      <xs:enumeration value="association" />
      <xs:enumeration value="attribute" />
      <xs:enumeration value="boolean" />
      <xs:enumeration value="datasource" />
      <xs:enumeration value="decimal" />
      <xs:enumeration value="entity" />
      <xs:enumeration value="entityConstraint" />
      <xs:enumeration value="enumeration" />
      <xs:enumeration value="expression" />
      <xs:enumeration value="file" />
      <xs:enumeration value="form" />
      <xs:enumeration value="icon" />
      <xs:enumeration value="image" />
      <xs:enumeration value="integer" />
      <xs:enumeration value="microflow" />
      <xs:enumeration value="nanoflow" />
      <xs:enumeration value="object" />
      <xs:enumeration value="selection" />
      <xs:enumeration value="string" />
      <xs:enumeration value="translatableString" />
      <xs:enumeration value="textTemplate" />
      <xs:enumeration value="widgets" />
    </xs:restriction>
  </xs:simpleType>

  <xs:complexType name="attributeTypesType">
    <xs:sequence>
      <xs:element name="attributeType" type="attributeTypeType" minOccurs="1" maxOccurs="unbounded" />
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="attributeTypeType">
    <xs:attribute name="name" type="attributeTypeNameType" use="required" />
  </xs:complexType>

  <xs:simpleType name="attributeTypeNameType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="AutoNumber" />
      <xs:enumeration value="Binary" />
      <xs:enumeration value="Boolean" />
      <xs:enumeration value="Currency" />
      <xs:enumeration value="DateTime" />
      <xs:enumeration value="Enum" />
      <xs:enumeration value="Float" />
      <xs:enumeration value="HashString" />
      <xs:enumeration value="Integer" />
      <xs:enumeration value="Long" />
      <xs:enumeration value="String" />
      <xs:enumeration value="Decimal" />
    </xs:restriction>
  </xs:simpleType>

  <xs:complexType name="associationTypesType">
    <xs:sequence>
      <xs:element name="associationType" type="associationTypeType" minOccurs="1" maxOccurs="unbounded" />
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="associationTypeType">
      <xs:attribute name="name" type="associationTypeNameType" use="required" />
  </xs:complexType>

  <xs:simpleType name="associationTypeNameType">
      <xs:restriction base="xs:string">
          <xs:enumeration value="Reference" />
          <xs:enumeration value="ReferenceSet" />
      </xs:restriction>
  </xs:simpleType>

  <xs:complexType name="selectionTypesType">
      <xs:sequence>
          <xs:element name="selectionType" type="selectionTypeType" minOccurs="1" maxOccurs="unbounded" />
      </xs:sequence>
  </xs:complexType>
    
  <xs:complexType name="selectionTypeType">
      <xs:attribute name="name" type="selectionTypeNameType" use="required" />
  </xs:complexType>
    
  <xs:simpleType name="selectionTypeNameType">
      <xs:restriction base="xs:string">
          <xs:enumeration value="None" />
          <xs:enumeration value="Single" />
          <xs:enumeration value="Multi" />
      </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="isPathType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="no" />
      <xs:enumeration value="optional" />
      <xs:enumeration value="yes" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="pathTypeType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="reference" />
      <xs:enumeration value="referenceSet" />
    </xs:restriction>
  </xs:simpleType>

  <xs:complexType name="enumerationValuesType">
    <xs:sequence>
      <xs:element name="enumerationValue" type="enumerationValueType" minOccurs="1" maxOccurs="unbounded" />
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="enumerationValueType">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute name="key" type="xs:string" use="required" />
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

  <xs:complexType name="returnTypeType">
    <xs:attribute name="type" type="returnTypeTypeType" />
    <xs:attribute name="isList" type="xs:boolean" default="false" />
    <xs:attribute name="entityProperty" type="propertyPath" />
    <xs:attribute name="assignableTo" type="propertyPath" />
  </xs:complexType>

  <xs:simpleType name="returnTypeTypeType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Void" />
      <xs:enumeration value="Boolean" />
      <xs:enumeration value="Integer" />
      <xs:enumeration value="Float" />
      <xs:enumeration value="DateTime" />
      <xs:enumeration value="String" />
      <xs:enumeration value="Object" />
      <xs:enumeration value="Decimal" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="variableTypeType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Boolean" />
      <xs:enumeration value="Integer" />
      <xs:enumeration value="DateTime" />
      <xs:enumeration value="String" />
      <xs:enumeration value="Decimal" />
    </xs:restriction>
  </xs:simpleType>

  <xs:complexType name="translationsType">
    <xs:sequence>
      <xs:element name="translation" type="translationType" minOccurs="1" maxOccurs="unbounded" />
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="translationType">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute name="lang" type="xs:string" use="required" />
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

  <xs:complexType name="actionVariablesType">
      <xs:sequence>
          <xs:element name="actionVariable" type="variableType" minOccurs="1" maxOccurs="unbounded"/>
      </xs:sequence>
  </xs:complexType>

  <xs:complexType name="variableType">
    <xs:attribute name="key" type="xs:string" use="required"/>
    <xs:attribute name="type" type="variableTypeType" use="required"/>
    <xs:attribute name="caption" type="xs:string" use="required"/>
  </xs:complexType>

  <xs:simpleType name="platformType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="All"/>
      <xs:enumeration value="Native"/>
      <xs:enumeration value="Web"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:complexType name="systemPropertyType">
    <xs:sequence>
      <xs:element name="category" type="xs:string" minOccurs="0" />
    </xs:sequence>
    <xs:attribute name="key" type="systemPropertyKey" use="required" />
  </xs:complexType>

  <xs:simpleType name="systemPropertyKey">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Label" />
      <xs:enumeration value="Name" />
      <xs:enumeration value="TabIndex" />
      <xs:enumeration value="Editability" />
      <xs:enumeration value="Visibility" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="propertyKey">
    <xs:restriction base="xs:string">
      <xs:pattern value="[a-zA-Z_][a-zA-Z0-9_]*" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="propertyPath">
    <xs:restriction base="xs:string">
      <xs:pattern value="(\.\./)*[a-zA-Z_][a-zA-Z0-9_]*" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="captionType">
    <xs:restriction base="xs:string">
      <xs:whiteSpace value="preserve" />
      <xs:minLength value="1" />
    </xs:restriction>
  </xs:simpleType>

    <xs:simpleType name="DefaultActionTypeType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="None"/>
            <xs:enumeration value="CallMicroflow"/>
            <xs:enumeration value="CallNanoflow"/>
            <xs:enumeration value="OpenPage"/>
            <xs:enumeration value="Database" />
            <xs:enumeration value="Microflow" />
            <xs:enumeration value="Nanoflow" />
            <xs:enumeration value="Association" />
        </xs:restriction>
    </xs:simpleType>
</xs:schema>
