Adichatz generates XML file using Scenarios and from the XML files use Generators which produce Java classes.
The result (editors, navigators, entities…) is rather a draft but by changing manually Adichatz XML file, developers can easily improve layouts and behaviors.

Original XML File

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<includeTree xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" coreClassName="org.adichatz.engine.core.ASectionCore" entityURI="adi://myproject/model.film/FilmMM" xsi:noNamespaceSchemaLocation="http://www.adichatz.org/xsd/v0.9.1/generator/includeTree.xsd">
    <section text="#MSG(film, detailContainerText)" id="detailContainer">
        <layout layoutConstraints="wrap 4" columnConstraints="[fill, align right]10[fill,grow]25[align right]10[fill,grow]"/>
        <include adiResourceURI="getToolBarURI((String) #PARAM(TOOL_BAR_TYPE))" id="detailToolbarMenu">
            <params>
                <param value="#CONTROLLER(detailContainer)" id="CONTROLLER"/>
                <param optional="true" value="#PARAM(TOOL_BAR_TYPE)" id="TOOL_BAR_TYPE"/>
            </params>
        </include>
        <formattedText editPattern="#####" format="Integer" property="filmId" enabled="false" id="filmId"/>
        <refText property="languageByOriginalLanguageId" style="SWT.BORDER | AdiSWT.FIND_BUTTON | AdiSWT.EDITOR_BUTTON | AdiSWT.DELETE_BUTTON" id="languageByOriginalLanguageId">
            <convertModelToTarget>return null==value ? "" : #FV().name;</convertModelToTarget>
        </refText>
        <refText property="languageByLanguageId" mandatory="true" style="SWT.BORDER | AdiSWT.FIND_BUTTON | AdiSWT.EDITOR_BUTTON" id="languageByLanguageId">
            <convertModelToTarget>return null==value ? "" : #FV().name;</convertModelToTarget>
        </refText>
        <text textLimit="255" property="title" mandatory="true" id="title"/>
        <text textLimit="255" property="description" id="description"/>
        <formattedText editPattern="####" format="Integer" property="releaseYear" id="releaseYear">
            <validators>
                <validator key="invalidYear" errorMessage="#MSG(film, invalid.year.value, #FV())">
                    <errorWhen>return #FV() &lt; 1900 ||  #FV() &gt; 2155;</errorWhen>
                </validator>
            </validators>
        </formattedText>
        <checkBox property="active" mandatory="true" style="SWT.CHECK" id="active"/>
        <formattedText editPattern="#####" format="Short" property="rentalDuration" mandatory="true" id="rentalDuration"/>
        <formattedText editPattern="##.##" format="Double" property="rentalRate" mandatory="true" id="rentalRate">
            <convertModelToTarget>return null == value ? null : ((java.math.BigDecimal) value).doubleValue();</convertModelToTarget>
            <convertTargetToModel>return null == value ? null : new java.math.BigDecimal((Double) value);</convertTargetToModel>
        </formattedText>
        <formattedText editPattern="#####" format="Short" property="length" id="length"/>
        <formattedText editPattern="###.##" format="Double" property="replacementCost" mandatory="true" id="replacementCost">
            <convertModelToTarget>return null == value ? null : ((java.math.BigDecimal) value).doubleValue();</convertModelToTarget>
            <convertTargetToModel>return null == value ? null : new java.math.BigDecimal((Double) value);</convertTargetToModel>
        </formattedText>
        <ccombo property="rating" id="rating">
            <labelProvider>
                <textCode>return ((#MODELPACKAGE().MpaaRatingEnum) element).getValue();</textCode>
            </labelProvider>
            <initValues>return java.util.Arrays.asList(#MODELPACKAGE().MpaaRatingEnum.values());</initValues>
        </ccombo>
        <text textLimit="255" property="imageUrl" id="imageUrl"/>
        <dateText property="lastUpdate" enabled="false" style="SWT.BORDER | SWT.TIME" id="lastUpdate"/>
        <multiChoice popupToolbar="true" multiChoiceType="Array" values="Trailers,Commentaries,Deleted Scenes,Behind the Scenes" property="specialFeatures" id="specialFeatures">
            <convertTargetToModel>return java.util.Arrays.copyOf((Object[]) value, ((Object[]) value).length, String[].class);</convertTargetToModel>
        </multiChoice>
    </section>
</includeTree>

Original layout

 Film detail (brute)

Using Adichatz XML file editor, it is very easy to change completely the behavior:

Improved XML File

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<includeTree xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" coreClassName="org.adichatz.engine.core.ASectionCore" entityURI="adi://myproject/model.film/FilmMM" xsi:noNamespaceSchemaLocation="http://www.adichatz.org/xsd/v0.9.1/generator/includeTree.xsd">
    <section text="#MSG(film, detailContainerText)" id="detailContainer">
        <layout layoutConstraints="wrap 4" columnConstraints="[fill, align right]10[fill,grow]25[align right]10[fill,grow]"/>
        <include adiResourceURI="getToolBarURI((String) #PARAM(TOOL_BAR_TYPE))" id="detailToolbarMenu">
            <params>
                <param value="#CONTROLLER(detailContainer)" id="CONTROLLER"/>
                <param optional="true" value="#PARAM(TOOL_BAR_TYPE)" id="TOOL_BAR_TYPE"/>
            </params>
        </include>
        <formattedText editPattern="######" format="Short" property="filmId" enabled="false" id="filmId"/>
        <text textLimit="255" property="title" mandatory="true" id="title"/>
        <text layoutData="span 3" textLimit="255" property="description" id="description"/>
        <composite layoutData="newline, grow, push, span 4" id="bottomComposite">
            <layout layoutConstraints="wrap 2" columnConstraints="[fill, grow][fill, grow]" rowConstraints="[fill, grow, al top]"/>
            <imageViewer imageType="Url" fitCanvas="true" toolBarStyle="AdiSWT.DELETE_BUTTON | AdiSWT.EXPANDABLE | AdiSWT.EDITABLE" noLabel="true" layoutData="hmax 300" property="imageUrl" id="imageUrl"/>
            <composite id="fieldComposite">
                <layout layoutConstraints="wrap 2" columnConstraints="[align right]10[fill,grow]"/>
                <refText property="languageByOriginalLanguageId" style="SWT.BORDER | AdiSWT.FIND_BUTTON | AdiSWT.EDITOR_BUTTON | AdiSWT.DELETE_BUTTON" id="languageByOriginalLanguageId">
                    <convertModelToTarget>return null==value ? &quot;&quot; : #FV().name;</convertModelToTarget>
                </refText>
                <refText property="languageByLanguageId" mandatory="true" style="SWT.BORDER | AdiSWT.EDITOR_BUTTON | AdiSWT.FIND_BUTTON" id="languageByLanguageId">
                    <convertModelToTarget>return null==value ? &quot;&quot; : #FV().name;</convertModelToTarget>
                </refText>
                <ccombo property="rating" id="rating">
                    <labelProvider>
                            <textCode>return ((#MODELPACKAGE().MpaaRatingEnum) element).getValue();</textCode>
                    </labelProvider>
                    <initValues>return java.util.Arrays.asList(#MODELPACKAGE().MpaaRatingEnum.values());</initValues>
                </ccombo>
                <checkBox text="#MSG(film,active)" property="active" noLabel="true" style="SWT.CHECK" id="active"/>
                <composite id="activeComposite">
                    <layout layoutConstraints="wrap 1, ins 0, hidemode 3" columnConstraints="[fill, grow]"/>
                    <pgroup text="#MSG(film,active)" id="activeGroup" dirtyManagement="false">
                        <dynamicClause listenedFieldId="active">
                            <conditionCode>#BEAN().isActive()</conditionCode>
                            <postCode>#CONTROLLER(detailContainer).reflowControllers();</postCode>
                        </dynamicClause>
                        <layout layoutConstraints="wrap 2" columnConstraints="[align right]10[fill,grow]"/>
                        <formattedText editPattern="######" format="Short" property="rentalDuration" mandatory="true" id="rentalDuration"/>
                        <numericText pattern="##.##" property="rentalRate" mandatory="true" style="SWT.BORDER | SWT.RIGHT" id="rentalRate"/>
                        <numericText pattern="###.##" property="replacementCost" mandatory="true" style="SWT.BORDER | SWT.RIGHT" id="replacementCost"/>
                    </pgroup>
                </composite>
                <formattedText editPattern="######" format="Short" property="length" id="length"/>
                <multiChoice popupToolbar="true" multiChoiceType="Array" values="Trailers,Commentaries,Deleted Scenes,Behind the Scenes" property="specialFeatures" id="specialFeatures">
                    <convertTargetToModel>return java.util.Arrays.copyOf((Object[]) value, ((Object[]) value).length, String[].class);</convertTargetToModel>
                </multiChoice>
                <dateText property="lastUpdate" enabled="false" style="SWT.BORDER | SWT.TIME" id="lastUpdate"/>
            </composite>
        </composite>
    </section>
</includeTree>

Improved layout

 Film detail (improved)

The differences are:

  • A better layout.
  • an Image field rather a Text field containing an URL.
  • Combo field replace a text field.
  • A dynamic block for the rent issue.

So in a few minutes you can completely change the behavior of generated editors. That only a small part of what you can do. For example, Three other staways are available: