:Notice: Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at. http://www.apache.org/licenses/LICENSE-2.0 . Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR  CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

.Layout Diagram
[plantuml,file="class-diagram_layout.png"]
----
@startuml

class Property{
}
class PropertyLt{
}
class PropertyBs{
}

class ColumnProperties{
    property: Property
    friendlyName: String
    layout: PropertyLt
    grid: PropertyBs
    hidden: Boolean
}
ColumnProperties o-- Property
ColumnProperties o-- PropertyLt
ColumnProperties o-- PropertyBs
class CollectionProperties {
    list : List<ColumnProperties>
    propertyDescriptionList : List<Property>
    propertyLayoutList : List<PropertyLt>
    propertyGridList : List<PropertyBs>
    propertyList : List<Property>
    descriptionsComplete:Boolean
}
CollectionProperties o-- Property
CollectionProperties o-- PropertyLt
CollectionProperties o-- PropertyBs
CollectionProperties o-- ColumnProperties

class Exposer {
    delegate: TObject
    iconName: String
    + dynamise()
    + get(propertyName: String)
    + setIcon(icon: Icon)
}
note as ExposerNote
dynamise() and get()
use <b>Kotlin/JS</b> function
<b>asDynamic()</b>
end note
Exposer..ExposerNote

abstract class BaseDisplayModel {
    isRendered:Boolean
    title:String
    {abstract} readyToRender():Boolean
}

abstract class DisplayModelWithLayout {
    layout: Layout
    grid: Grid
    collectionProperties: CollectionProperties
    icon: Icon
    + readyToRender()
}

DisplayModelWithLayout --> CollectionProperties

class ObjectDM {
    + data:Exposer
    + collections:Map<String,CollectionDM>
    - dirty:Boolean
    + readyToRender()
}
note left of ObjectDM::dirty
Used in
UI editing
to signal
object
change.
end note

class CollectionDM {
    data:List<Exposer>
    - rawData:List<TransferObject>
}

ObjectDM --> Exposer
CollectionDM o-- Exposer

BaseDisplayModel <|-- DisplayModelWithLayout
DisplayModelWithLayout <|-- CollectionDM
DisplayModelWithLayout <|-- ObjectDM
ObjectDM o-- CollectionDM
note left on link
An <b>ObjectDM</b>
can have zero or more
<b><i>parented collections</i></b>.
end note

@enduml
----
