Differences

This shows you the differences between two versions of the page.

Link to this comparison view

tutorial:improve_customer_detail [2020/04/16 10:56] (current)
Line 1: Line 1:
 +File <wrap adicode>​$projectDirectory/​resources/​xml/​model/​film/​CustomerDIGENERATED.xml</​wrap>​ describes the layout of <wrap adicode>​Customer</​wrap>​ entity. ​
 +
 +**Following XML elements:**
 +<sxh xml; first-line: 1; title: excerpt from '​CustomerDIGENERATED.axml'​ file.>
 +<?xml version="​1.0"​ encoding="​UTF-8"​ standalone="​yes"?>​
 +<​includeTree xmlns:​xsi="​http://​www.w3.org/​2001/​XMLSchema-instance"​ XMLSchema-instance"​ coreClassName="​org.adichatz.engine.core.ASectionCore"​ entityURI="​adi:/​entityURI="​adi://​myproject/​model.customer/​CustomerMM"​ xsi:​noNamespaceSchemaLocation="​http://​www.adichatz.org/​xsd/​v0.8.7/​generator/​includeTree.xsd">​
 +    <section text="#​MSG(customer,​ detailContainerText)"​ style="​Section.TWISTIE | Section.TITLE_BAR | Section.EXPANDED"​ 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="​customerId"​ enabled="​false"​ id="​customerId"/>​
 +        <refText property="​address"​ mandatory="​true"​ style="​SWT.BORDER | AdiSWT.FIND_BUTTON | AdiSWT.EDITOR_BUTTON"​ id="​address">​
 +            <​convertModelToTarget>​return null==value ? &​quot;&​quot;​ : #​FV().address + &quot; &quot; + #​FV().city.city + &quot; - &quot; + #​FV().city.country.country;</​convertModelToTarget>​
 +        </​refText>​
 +        <refText property="​store"​ lazyFetches="​store"​ mandatory="​true"​ style="​SWT.BORDER | AdiSWT.FIND_BUTTON | AdiSWT.EDITOR_BUTTON"​ id="​store">​
 +            <​convertModelToTarget>​return null==value ? &​quot;&​quot;​ : String.valueOf(#​FV().getStoreId());</​convertModelToTarget>​
 +        </​refText>​
 +        <text textLimit="​45"​ property="​firstName"​ mandatory="​true"​ id="​firstName"/>​
 +        <text textLimit="​45"​ property="​lastName"​ mandatory="​true"​ id="​lastName"/>​
 +        <text textLimit="​50"​ property="​email"​ id="​email"/>​
 +        <​checkBox property="​active"​ mandatory="​true"​ style="​SWT.CHECK"​ id="​active"/>​
 +        <​dateText property="​createDate"​ mandatory="​true"​ style="​SWT.BORDER | SWT.TIME"​ id="​createDate"/>​
 +        <​dateText property="​lastUpdate"​ mandatory="​true"​ style="​SWT.BORDER | SWT.TIME"​ id="​lastUpdate"/>​
 +    </​section>​
 +</​includeTree></​sxh>​\\
 +**renders the following layout:**\\
 +{{ customer_detail_generated.png | Customer detail (brute)}}
 +\\ \\ \\
 +**Change XML elements**
 +  * Copy <wrap adicode>​CustomerDIGENERATED.axml</​wrap>​ file to <wrap adicode>​CustomerDI.axml</​wrap>​ which will become the reference for generated code.
 +  * Replace above XML lines with the following ones:
 +<sxh xml; first-line: 1; title: excerpt from '​CustomerDI.axml'​ file (new version).>​
 +<?xml version="​1.0"​ encoding="​UTF-8"​ standalone="​yes"?>​
 +<​includeTree xmlns:​xsi="​http://​www.w3.org/​2001/​XMLSchema-instance"​ XMLSchema-instance"​ coreClassName="​org.adichatz.engine.core.ASectionCore"​ entityURI="​adi:/​entityURI="​adi://​myproject/​model.customer/​CustomerMM"​ xsi:​noNamespaceSchemaLocation="​http://​www.adichatz.org/​xsd/​v0.8.7/​generator/​includeTree.xsd">​
 +    <section text="#​MSG(customer,​ detailContainerText)"​ style="​Section.TWISTIE | Section.TITLE_BAR | Section.EXPANDED"​ 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="​customerId"​ enabled="​false"​ id="​customerId"/>​
 +        <refText property="​address"​ mandatory="​true"​ style="​SWT.BORDER | AdiSWT.FIND_BUTTON | AdiSWT.EDITOR_BUTTON"​ id="​address">​
 +            <​convertModelToTarget>​return null==value ? &​quot;&​quot;​ : #​FV().address + &quot; &quot; + #​FV().city.city + &quot; - &quot; + #​FV().city.country.country;</​convertModelToTarget>​
 +            <​params>​
 +                <param id="​CONTEXT_MENU"​ value="​adi://​org.adichatz.jpa/​common.contextMenu/​RefTextDialogPlusCM"/>​
 +                <param id="​POPUP_SIZE " value="​600,​400"/>​
 +                <param xsi:​type="​customizationsType"​ id="​NEW_ENTITY_POPUP_CUSTOMIZATION">​
 +                    <text layoutData="​wmin 400" id="​detailINC:​name"/>​
 +                </​param>​
 +            </​params>​
 +        </​refText>​
 +        <refText property="​store"​ lazyFetches="​store"​ mandatory="​true"​ style="​SWT.BORDER | AdiSWT.FIND_BUTTON | AdiSWT.EDITOR_BUTTON"​ id="​store">​
 +            <​convertModelToTarget>​return null==value ? &​quot;&​quot;​ : String.valueOf(#​FV().getStoreId());</​convertModelToTarget>​
 +        </​refText>​
 +        <text textLimit="​45"​ property="​firstName"​ mandatory="​true"​ id="​firstName"/>​
 +        <text textLimit="​45"​ property="​lastName"​ mandatory="​true"​ id="​lastName"/>​
 +        <text textLimit="​50"​ property="​email"​ id="​email"/>​
 +        <​checkBox property="​active"​ mandatory="​true"​ style="​SWT.CHECK"​ id="​active"/>​
 +        <​dateText property="​createDate"​ mandatory="​true"​ style="​SWT.BORDER | SWT.TIME"​ id="​createDate"/>​
 +        <​dateText property="​lastUpdate"​ mandatory="​true"​ style="​SWT.BORDER | SWT.TIME"​ id="​lastUpdate"/>​
 +    </​section>​
 +</​includeTree>​
 +</​sxh>​
 +
 +Create editor file for Customer as shown:\\
 +<sxh xml; first-line: 1; title: excerpt from '​CustomerEDITOR.axml'​ file (new version).>​
 +<?xml version="​1.0"​ encoding="​UTF-8"​ standalone="​yes"?>​
 +<​partTree xmlns:​xsi="​http://​www.w3.org/​2001/​XMLSchema-instance"​ bindingServiceClassName="​org.adichatz.engine.e4.resource.PartBindingService"​ entityURI="​adi://​myproject/​model.customer/​CustomerMM"​ image="#​PARAM(IMAGE)"​ outlinePageClassName="​org.adichatz.jpa.editor.EditorOutlinePage"​ title="#​PARAM(TITLE)"​ toolTipText="#​PARAM(TOOL_TIP_TEXT)"​ xsi:​noNamespaceSchemaLocation="​http://​www.adichatz.org/​xsd/​v0.8.7/​generator/​partTree.xsd">​
 +    <​config>​
 +        <​customizations>​
 +            <​tableColumn id="​rentalsTSI:​customerTC"​ valid="​false"/>​
 +            <tabular refreshAtStart="​true"​ id="​rentalsTSI:​table">​
 +                <​listeners>​
 +                    <​listener id="​rentalsTSIDCLsnr"​ listenerTypes="​DOUBLE_CLICK">​
 +                        <​code>​org.adichatz.jpa.extra.JPAUtil.openForm(getFromRegister(&​quot;​rentalsTSI:​table&​quot;​));</​code>​
 +                    </​listener>​
 +                    <​listener id="​rentalsTSISCLsnr"​ listenerTypes="​SELECTION_CHANGED">​
 +                        <​code>#​CONTROLLER(dependenciesCompositeBag).showChildController(#​CONTROLLER(),​ #​CONTROLLER(rentalsDIPart:​detailContainer));</​code>​
 +                    </​listener>​
 +                </​listeners>​
 +                <include adiResourceURI="​adi://​org.adichatz.jpa/​common.contextMenu/​ChildCM"​ id="​rentalsCM"/>​
 +                <​contentProvider xsi:​type="​entitySetContentProviderType"​ fieldName="​rentals"​ adiResourceURI="​adi://​myproject/​model.rental/​RentalQUERY"​ id="​rentalsCP"/>​
 +            </​tabular>​
 +            <section id="​rentalsDIPart:​detailContainer">​
 +                <layout layoutConstraints="​wrap 2" columnConstraints="​[fill,​ align right]10[fill,​grow]"/>​
 +            </​section>​
 +            <​controlField id="​rentalsDIPart:​customer"​ valid="​false"/>​
 +            <​tableColumn id="​paymentsTSI:​customerTC"​ valid="​false"/>​
 +            <tabular refreshAtStart="​true"​ id="​paymentsTSI:​table">​
 +                <​listeners>​
 +                    <​listener id="​paymentsTSIDCLsnr"​ listenerTypes="​DOUBLE_CLICK">​
 +                        <​code>​org.adichatz.jpa.extra.JPAUtil.openForm(getFromRegister(&​quot;​paymentsTSI:​table&​quot;​));</​code>​
 +                    </​listener>​
 +                    <​listener id="​paymentsTSISCLsnr"​ listenerTypes="​SELECTION_CHANGED">​
 +                        <​code>#​CONTROLLER(dependenciesCompositeBag).showChildController(#​CONTROLLER(),​ #​CONTROLLER(paymentsDIPart:​detailContainer));</​code>​
 +                    </​listener>​
 +                </​listeners>​
 +                <include adiResourceURI="​adi://​org.adichatz.jpa/​common.contextMenu/​ChildCM"​ id="​paymentsCM"/>​
 +                <​contentProvider xsi:​type="​entitySetContentProviderType"​ fieldName="​payments"​ adiResourceURI="​adi://​myproject/​model.payment/​PaymentQUERY"​ id="​paymentsCP"/>​
 +            </​tabular>​
 +            <section id="​paymentsDIPart:​detailContainer">​
 +                <layout layoutConstraints="​wrap 2" columnConstraints="​[fill,​ align right]10[fill,​grow]"/>​
 +            </​section>​
 +            <​controlField id="​paymentsDIPart:​customer"​ valid="​false"/>​
 +        </​customizations>​
 +        <​navigationPaths>​
 +            <​navigationPath name="#​MSG(customer,​ editFormTitle)"​ path="​Page1"/>​
 +            <​navigationPath name="#​MSG(customer,​ rentals)"​ path="​Page1,​ DependenciesTabFolder,​ rentalsItem"/>​
 +            <​navigationPath name="#​MSG(customer,​ payments)"​ path="​Page1,​ DependenciesTabFolder,​ paymentsItem"/>​
 +        </​navigationPaths>​
 +    </​config>​
 +    <​formPage formText="#​MSG(customer,​ editFormText)"​ image="#​IMG(adi://​org.adichatz.engine/​./​IMG_DETAIL.png)"​ title="#​MSG(customer,​ editFormText)"​ id="​Page1">​
 +        <include adiResourceURI="​adi://​org.adichatz.jpa/​common.toolBar/​OnePageMasterDetailTBM"​ id="​masterDetailTBM"/>​
 +        <​sashForm weights="​3,​2"​ id="​firstSashForm">​
 +            <layout layoutConstraints="​wrap 2, ins 0" columnConstraints="​[grow,​fill][grow,​fill]"​ rowConstraints="​grow,​fill"/>​
 +            <​sashForm orientation="​SWT.HORIZONTAL"​ weights="​1,​1"​ id="​secondSashForm">​
 +                <​scrolledComposite id="​detailComposite">​
 +                <​listeners>​
 +                    <​listener listenerTypes="​AFTER_SYNCHRONIZE | AFTER_PROPERTY_CHANGE | POST_REFRESH">​
 +                        <​code>​displayGMap();</​code>​
 +                    </​listener>​
 +                </​listeners>​
 +                <​additionalCode>​import org.adichatz.engine.widgets.gmaps.GMap;​
 +private boolean doit = true;
 +private void displayGMap() {
 +    if (doit) {
 +        doit = false;
 +        GMap gmapControl = #​CONTROL(map);​
 +        Customer customer = #BEAN();
 +        if (null != customer.getAddress()) {
 +            StringBuffer addresSB = new StringBuffer();​
 +            addresSB.append(customer.getAddress()).append(&​quot;​ &​quot;​);​
 +            addresSB.append(customer.getAddress().getCity().getCity()).append(&​quot;​ &​quot;​);​
 +            addresSB.append(customer.getAddress().getCity().getCountry().getCountry());​
 +            gmapControl.setValue(addresSB.toString().trim());​
 +        } else
 +            gmapControl.setValue(null);​
 +        doit = true;
 +    }
 +}</​additionalCode>​
 +                    <layout layoutConstraints="​wrap 1, ins 0" columnConstraints="​[grow,​fill]"​ rowConstraints="​grow,​fill"/>​
 +                    <include adiResourceURI="​adi://​model.customer/​CustomerDI"​ id="​customerDetail">​
 +                        <​params>​
 +                            <param id="​TOOL_BAR"​ value="​adi://​org.adichatz.jpa/​common.toolBar/​DetailTBM"/>​
 +                        </​params>​
 +                    </​include>​
 +                </​scrolledComposite>​
 +             <​composite id="​gmapComposite">​
 +                 <layout layoutConstraints="​wrap 1, ins 0" columnConstraints="​grow,​fill"​ rowConstraints="​grow,​fill"/>​
 +                 <gMap editable="​false"​ toolBarStyle="​AdiSWT.EXPANDABLE"​ zoom="​14"​ id="​map"/>​
 +             </​composite>​
 +            </​sashForm>​
 +            <​sashForm orientation="​SWT.HORIZONTAL"​ weights="​1,​1"​ id="​dependenciesSashForm">​
 +             <​composite id="​tableComposite">​
 +                 <layout layoutConstraints="​wrap 1, ins 0" columnConstraints="​[grow,​fill]"​ rowConstraints="​grow,​fill"/>​
 +                 <​cTabFolder delayed="​true"​ selection="​0"​ id="​DependenciesTabFolder">​
 +                     <​listeners>​
 +                         <​listener id="​DependenciesTabFolderWSLsnr"​ listenerTypes="​WIDGET_SELECTED">​
 +                             <​code>#​CONTROLLER(dependenciesCompositeBag).showChildController(getSelectedController());</​code>​
 +                         </​listener>​
 +                     </​listeners>​
 +                     <​cTabItem text="#​MSG(customer,​ rentals)"​ entityURI="​adi://​myproject/​model.rental/​RentalMM"​ id="​rentalsItem">​
 +                         <include adiResourceURI="​adi://​model.rental/​RentalTI"​ id="​rentalsTSI"/>​
 +                     </​cTabItem>​
 +                     <​cTabItem text="#​MSG(customer,​ payments)"​ entityURI="​adi://​myproject/​model.payment/​PaymentMM"​ id="​paymentsItem">​
 +                         <include adiResourceURI="​adi://​model.payment/​PaymentTI"​ id="​paymentsTSI"/>​
 +                     </​cTabItem>​
 +                 </​cTabFolder>​
 +             </​composite>​
 +                <​compositeBag id="​dependenciesCompositeBag">​
 +                    <include adiResourceURI="​adi://​model.rental/​RentalDI"​ id="​rentalsDIPart">​
 +                        <​params>​
 +                            <param id="​TOOL_BAR"​ value="​adi://​org.adichatz.jpa/​common.toolBar/​ChildDetailTBM"/>​
 +                        </​params>​
 +                    </​include>​
 +                    <include adiResourceURI="​adi://​model.payment/​PaymentDI"​ id="​paymentsDIPart">​
 +                        <​params>​
 +                            <param id="​TOOL_BAR"​ value="​adi://​org.adichatz.jpa/​common.toolBar/​ChildDetailTBM"/>​
 +                        </​params>​
 +                    </​include>​
 +                </​compositeBag>​
 +            </​sashForm>​
 +        </​sashForm>​
 +    </​formPage>​
 +</​partTree>​
 +</​sxh>​
 +
 +** renders the new layout:**\\
 +{{ customer_editor.png | Editor and detail from Customer (improved)}}
 +<​html><​br clear="​all"></​html>​
 +<WRAP indic>
 +<wrap adititle>​Remark</​wrap>:​\\
 +File <wrap adicode>​CustomerDIGENERATED.axml</​wrap>​ is copied as file <wrap adicode>​CustomerDI.axml</​wrap>​ and File <wrap adicode>​CustomerEDITORGENERATED.axml</​wrap>​ is copied as file <wrap adicode>​CustomerEDITOR.axml</​wrap>​. So that, if a generation process occurs, changes will not be affected.
 +\\
 +Change completely layouts is made easy.
 +</​WRAP>​