﻿<?xml version="1.0" encoding="utf-8"?>
<!--
set xsd="C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools\x64\xsd.exe"
%xsd% D:\IduIT\DotNet\Libraries\IduIT.Core\PropertyModel\PM.xsd /classes /out:D:\IduIT\DotNet\Libraries\IduIT.Core\PropertyModel\ /namespace:IduIT.Core.PropertyModel.Auto /fields
-->
<xs:schema id="PM"
	targetNamespace="http://www.cardogis.com/cardo4/PropertyModel"
	elementFormDefault="qualified"
	xmlns="http://www.cardogis.com/cardo4/PropertyModel"
	xmlns:mstns="http://www.cardogis.com/cardo4/PropertyModel"
	xmlns:xs="http://www.w3.org/2001/XMLSchema"
>

	<xs:simpleType name="LabelAlignType" final="#all">
		<xs:restriction base="xs:string">
			<xs:enumeration value="None"/>
			<xs:enumeration value="Top"/>
			<xs:enumeration value="Left"/>
			<xs:enumeration value="LeftTop"/>
			<xs:enumeration value="LeftBottom"/>
		</xs:restriction>
	</xs:simpleType>

	<xs:simpleType name="KissLayoutType" final="#all">
		<xs:restriction base="xs:string">
			<xs:enumeration value="None"/>
			<xs:enumeration value="VBox"/>
			<xs:enumeration value="HBox"/>
			<xs:enumeration value="Fit"/>
		</xs:restriction>
	</xs:simpleType>


	<xs:complexType name="DefaultsType">
		<xs:sequence>
			<xs:element name="Flex" minOccurs="0" maxOccurs="1" type="xs:unsignedShort"/>
			<xs:element name="Align" minOccurs="0" maxOccurs="1" type="LabelAlignType"/>
			<xs:element name="FieldWidth" minOccurs="0" maxOccurs="1" type="xs:unsignedShort"/>
			<xs:element name="LabelWidth" minOccurs="0" maxOccurs="1" type="xs:unsignedShort"/>
		</xs:sequence>
	</xs:complexType>

	<xs:simpleType name="DependencyPropertyTargetPropertyType">
		<xs:restriction base="xs:string">
			<xs:enumeration value="visible"/>
			<xs:enumeration value="enabled"/>
			<xs:enumeration value="setValuesToNullIfFalse"/>
		</xs:restriction>
	</xs:simpleType>

	<xs:simpleType name="DependencyPropertyTargetPropertyTypes" final="#all">
		<xs:list itemType="DependencyPropertyTargetPropertyType"/>
	</xs:simpleType>

	<xs:simpleType name="BindingsList">
		<xs:list itemType="xs:string"/>
	</xs:simpleType>

	<xs:complexType name="PropertyDependencyType">
		<xs:sequence>
			<xs:element name="Evaluation" type="xs:string">
				<xs:annotation>
					<xs:documentation>
						Der Rumpf einer Funktion, die einen Boolean Wert zurückgegeben muss, der dann die Eigenschaft targetProperty steuert.

						Es werden immer die Argumente "value ... value(1+N)" übergeben (siehe bindings).
						<![CDATA[
						Bsp: "return value === 1 && value1 == 2"
						]]>
					</xs:documentation>
				</xs:annotation>
			</xs:element>
		</xs:sequence>
		<xs:attribute name="bindings" type="BindingsList" use="required">
			<xs:annotation>
				<xs:documentation>Die Namen der Properties  (C#-Name), deren Werte die Abhängigkeiten steuern. In Evaluation werden diese als value0 ... valueN übergeben</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="targetProperty" type="DependencyPropertyTargetPropertyTypes" use="required">
			<xs:annotation>
				<xs:documentation>
					Die Eigenschaft des Elementes an dem die Abhängigkeit definiert ist, die geändert wird.
				</xs:documentation>
			</xs:annotation>
		</xs:attribute>
	</xs:complexType>

	<xs:complexType name="LayoutElementBaseType" abstract="true">
		<xs:sequence>
			<xs:element name="DependendProperty" type="PropertyDependencyType" minOccurs="0" maxOccurs="1"></xs:element>
		</xs:sequence>
	</xs:complexType>




	<xs:complexType name="FieldType">
		<xs:complexContent>
			<xs:extension base="DefaultsType">
				<xs:sequence>
					<xs:element name="DependendProperty" type="PropertyDependencyType" minOccurs="0" maxOccurs="1"></xs:element>
					<xs:element name="Description" minOccurs="0" maxOccurs="1" type="xs:string"></xs:element>
					<xs:element name="FieldConfigJson" type="xs:string" minOccurs="0">
						<xs:annotation>
							<xs:documentation>JSON Objekt, der Konfiguration der Komponente, mit {} etc.</xs:documentation>
						</xs:annotation>
					</xs:element>
				</xs:sequence>
				<xs:attribute name="name" type="xs:string" use="required">
					<xs:annotation>
						<xs:documentation>Der Name der C# Eigenschaft, unter Beachtung der Groß/Kleinschreibung.</xs:documentation>
					</xs:annotation>
				</xs:attribute>
				<xs:attribute name="title" type="xs:string" use="optional"/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>

	<!--
	ComponentTypeBase
	-->
	<xs:complexType name="ComponentTypeBase" abstract="true">
		<xs:sequence>
			<xs:element name="ConfigJson" type="xs:string" minOccurs="0">
				<xs:annotation>
					<xs:documentation>JSON Objekt, der Konfiguration der Komponente, mit {} etc.</xs:documentation>
				</xs:annotation>
			</xs:element>
		</xs:sequence>
	</xs:complexType>

	<!--
	ComponentType
	-->
	<xs:complexType name="ComponentType">
		<xs:annotation>
			<xs:documentation>
				Fügt eine beliebige KISS Komponente ein.
			</xs:documentation>
		</xs:annotation>
		<xs:complexContent>
			<xs:extension base="ComponentTypeBase">
				<xs:attribute name="clientClassName" type="xs:string" use="required">
					<xs:annotation>
						<xs:documentation>Der vollständige Name der Komponente, die in der Umgebung registriert sein muss.</xs:documentation>
						<xs:documentation>Bsp.: "IduIT.Core.Kiss.Ui.Button.Button"</xs:documentation>
					</xs:annotation>
				</xs:attribute>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>

	<!--
	TextComponentType
	-->
	<xs:complexType name="TextComponentType">
		<xs:annotation>
			<xs:documentation>Spezialisierung einer "Component", hier immer ein Text (=IduIT.Core.Kiss.Ui.Core.Text). Die Konfig ist optional, Standard ist flex:1. mode und content werden immer ignoriert und durch die Werte aus den Einstellungen ersetzt.</xs:documentation>
		</xs:annotation>
		<xs:complexContent>
			<xs:extension base="ComponentTypeBase">
				<xs:sequence>
					<xs:element name="Content" type="xs:string">
						<xs:annotation>
							<xs:documentation>
								Der Plain- oder HTML Text (Standard ist html, siehe gleichnamiges Attribut)
							</xs:documentation>
						</xs:annotation>
					</xs:element>
				</xs:sequence>
				<xs:attribute name="html" type="xs:boolean" default="true">
					<xs:annotation>
						<xs:documentation>Setzt den mode der Text-Komponente auf IduIT.Core.Kiss.Ui.Core.ETextMode.Html oder IduIT.Core.Kiss.Ui.Core.ETextMode.Text, Standard ist HTML</xs:documentation>
					</xs:annotation>
				</xs:attribute>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>

	<xs:complexType name="LayoutRowType">
		<xs:sequence>
			<xs:choice>
				<xs:element name="Field" type="FieldType" minOccurs="0" maxOccurs="unbounded"/>
				<xs:element name="Component" type="ComponentType" minOccurs="0" maxOccurs="unbounded"/>
				<xs:element name="TextComponent" type="TextComponentType" minOccurs="0" maxOccurs="unbounded"/>
			</xs:choice>
		</xs:sequence>
	</xs:complexType>

	<xs:complexType name="LayoutResponsiveContainerType">
		<xs:sequence>
			<xs:element name="Breakpoint" minOccurs="0" maxOccurs="unbounded" type="xs:int">
				<xs:annotation>
					<xs:documentation>Bei welchen Pixelbreiten umgebrochen werden soll.</xs:documentation>
				</xs:annotation>
			</xs:element>
			<xs:choice minOccurs="0" maxOccurs="unbounded">
				<xs:element name="Field" type="FieldType" minOccurs="0" maxOccurs="unbounded"/>
				<xs:element name="Component" type="ComponentType" minOccurs="0" maxOccurs="unbounded"/>
				<xs:element name="TextComponent" type="TextComponentType" minOccurs="0" maxOccurs="unbounded"/>
				<xs:element name="Group" type="GroupType" minOccurs="0" maxOccurs="unbounded"/>
			</xs:choice>
		</xs:sequence>
		<xs:attribute name="columns" type="xs:int" default="2">
			<xs:annotation>
				<xs:documentation>Anzahl der Spalten, die bei maximaler Breite verfügbar sein sollen</xs:documentation>
			</xs:annotation>
		</xs:attribute>
	</xs:complexType>

	<xs:complexType name="GroupType">
		<xs:complexContent>
			<xs:extension base="LayoutElementBaseTypeWithTitle">
				<xs:choice minOccurs="0" maxOccurs="unbounded">
					<xs:element name="Default" type="DefaultsType" minOccurs="1" maxOccurs="1">
						<xs:annotation>
							<xs:documentation>Setzt vollständig neue Default-Werte, für alle folgenden Felder in der Gruppe, kann mit &lt;ResetDefault/&gt; wieder auf den globalen zurückgesetzt werden.</xs:documentation>
						</xs:annotation>
					</xs:element>
					<xs:element name="ResetDefault" type="xs:string" fixed="">
						<xs:annotation>
							<xs:documentation>Setzt den Default ab hier wieder auf den globalen zurück.</xs:documentation>
						</xs:annotation>
					</xs:element>
					<xs:element name="Field" type="FieldType" minOccurs="1" maxOccurs="1">
						<xs:annotation>
							<xs:documentation>Eine neue Zeile mit diesem Feld. Default kann hier in Fragmenten überschrieben werden.</xs:documentation>
						</xs:annotation>
					</xs:element>

					<xs:element name="Component" type="ComponentType" minOccurs="1" maxOccurs="1"/>

					<xs:element name="TextComponent" type="TextComponentType" minOccurs="1" maxOccurs="1"/>

					<xs:element name="Row" type="LayoutRowType" minOccurs="1" maxOccurs="1">
						<xs:annotation>
							<xs:documentation>Eine Zeile, d.h. alle Fields in dieser Zeile werden in Spalten angeordnet.</xs:documentation>
						</xs:annotation>
					</xs:element>
					<xs:element name="ResponsiveContainer" type="LayoutResponsiveContainerType" minOccurs="1" maxOccurs="1">
						<xs:annotation>
							<xs:documentation>Ein Responsive-Container</xs:documentation>
						</xs:annotation>
					</xs:element>
				</xs:choice>

			</xs:extension>

		</xs:complexContent>

	</xs:complexType>

	<xs:complexType name="LayoutElementBaseTypeWithTitle" abstract="true">
		<xs:complexContent>
			<xs:extension base="LayoutElementBaseType">
				<xs:attribute name="title" use="optional"/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>

	<xs:complexType name="SubTabType">
		<xs:complexContent>
			<xs:extension base="LayoutElementBaseTypeWithTitle">
				<xs:sequence>
					<xs:element name="Group" type="GroupType" minOccurs="1" maxOccurs="unbounded"></xs:element>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>

	<xs:complexType name="TabType">
		<xs:complexContent>
			<xs:extension base="LayoutElementBaseTypeWithTitle">
				<xs:sequence>
					<xs:choice>
						<xs:element name="Group" type="GroupType" minOccurs="1" maxOccurs="unbounded"></xs:element>
						<xs:element name="Tab" type="SubTabType" minOccurs="1" maxOccurs="unbounded"></xs:element>
					</xs:choice>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>

	<xs:complexType name="LayoutType">
		<xs:sequence>
			<xs:element name="Default" type="DefaultsType" minOccurs="0" maxOccurs="1">
				<xs:annotation>
					<xs:documentation>Die globalen Default-Werte für alle Felder, kann am Feld überschrieben werden, oder durch das Einfügen eine Default in einer Gruppe.</xs:documentation>
				</xs:annotation>
			</xs:element>
			<xs:element name="Tabs">
				<xs:complexType>
					<xs:sequence>
						<xs:element name="Tab" type="TabType" minOccurs="1" maxOccurs="unbounded"/>
					</xs:sequence>
				</xs:complexType>
			</xs:element>
		</xs:sequence>

		<xs:attribute name="mainViewLayout" type="KissLayoutType" use="optional">

		</xs:attribute>

		<xs:attribute name="validateInDebug" default="true" type="xs:boolean">
			<xs:annotation>
				<xs:documentation>Wenn true (Standard), dann wird Debug-Modus Generieren des Property-Models geprüft, ob alle Eigenschaften vorhanden sind, und auch das nicht mehr als in der Klasse vorhanden sind.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="overrideBaseClass" type="xs:boolean" default="false">
			<xs:annotation>
				<xs:documentation>
					Normalerweise werden die Felder aus der Basisklasse geerbt und dürfen nicht überschrieben werden (Standard).
					Wenn ein Überschreibung erfolgen soll, dann das Attribut auf true stellen.
					Es *müssen* in diesem Falle alle Felder überschrieben werden.
				</xs:documentation>
			</xs:annotation>
		</xs:attribute>
	</xs:complexType>

	<xs:element name="Layout" type="LayoutType"/>

	<xs:element name="Layouts">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="Layout" minOccurs="0" maxOccurs="unbounded">
					<xs:complexType>
						<xs:complexContent>
							<xs:extension base="LayoutType">
								<xs:attribute name="typeName" type="xs:string"></xs:attribute>
							</xs:extension>
						</xs:complexContent>
					</xs:complexType>
				</xs:element>
			</xs:sequence>
			<xs:attribute name="defaultMainViewLayout" type="KissLayoutType" use="optional">
			</xs:attribute>
		</xs:complexType>
	</xs:element>
</xs:schema>
