Part can use rich controllers provided by Adichatz as GMapController.

Before using GMapController, get GMap API key and store it in './resources/xml/AdichatzRcpConfig.xml' file as shown below.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<adichatzRcpConfigTree xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.adichatz.org/xsd/v0.9.0/engine/adichatzRcpConfigTree.xsd">
    <rcpConfiguration>
    	...
        <param id="adichatzGMapAPIKey" value="YOUR_GMAP_API_KEY"/>
        ...
    </rcpConfiguration>
</adichatzRcpConfigTree>


For example, open file $projectDirectory/resources/xml/model/address/AddressDIGENERATED.xml.

Following XML elements:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?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.actor/ActorMM" xsi:noNamespaceSchemaLocation="http://www.adichatz.org/xsd/v0.9.1/generator/includeTree.xsd">
    <section text="#MSG(actor, 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="actorId" enabled="false" id="actorId"/>
        <text textLimit="45" property="firstName" mandatory="true" id="firstName"/>
        <text textLimit="45" property="lastName" mandatory="true" id="lastName"/>
        <dateText property="lastUpdate" enabled="false" style="SWT.BORDER | SWT.TIME" id="lastUpdate"/>
    </section>
</includeTree>

renders the following layout:
 Address detail (brute)


Change XML elements:

  • Copy AddressDIGENERATED.axml file to AddressDI.axml which will become the reference for generated code.
  • Replace above XML lines with the following ones:

<?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.address/AddressMM" generationType="DETAIL" xsi:noNamespaceSchemaLocation="http://www.adichatz.org/xsd/v0.8.4/generator/includeTree.xsd">
    <section text="#MSG(actor, detailContainerText)" id="detailContainer">
		<layout layoutConstraints="wrap 2" columnConstraints="[fill]25[fill,grow]" rowConstraints="[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>
		<listeners>
		    <listener listenerTypes="AFTER_SYNCHRONIZE | AFTER_PROPERTY_CHANGE | POST_REFRESH">
		        <code>displayGMap();</code>
		    </listener>
		</listeners>
		<additionalCode>import org.adichatz.engine.widgets.GMap;
import java.lang.Runnable;
private boolean doit = true;
private void displayGMap() {
	if (doit) {
		doit = false;
		GMap gmapControl = #CONTROL(map);
		Address address = #BEAN();
		if (null != address) {
			StringBuffer addresSB = new StringBuffer();
		if (null != address.getAddress())
			addresSB.append(address.getAddress()).append(" ");
		if (null != address.getAddress2())
			addresSB.append(address.getAddress2()).append(" ");
		if (null != address.getPostalCode())
			addresSB.append(address.getPostalCode()).append(" ");
		if (null != address.getCity()) {
			addresSB.append(address.getCity().getCity()).append(" ");
			addresSB.append(#BEAN().city.country.country);
		}
		gmapControl.setValue(addresSB.toString().trim());
	} else
		gmapControl.setValue(null);
	doit = true;
	}
}</additionalCode>
		<composite>
		    <layout layoutConstraints="wrap 2" columnConstraints="[fill, align right]10[grow,fill]" rowConstraints="20[]20[][]"/>
		    <formattedText editPattern="######" format="Short" property="addressId" enabled="false" id="addressId"/>
		    <refText property="city" mandatory="true" style="SWT.BORDER | AdiSWT.FIND_BUTTON | AdiSWT.EDITOR_BUTTON" id="city">
			            <convertModelToTarget>return null==value ? &quot;&quot; : #FV().city;</convertModelToTarget>
		    </refText>
		    <text textLimit="50" property="address" mandatory="true" id="address"/>
		    <text textLimit="50" property="address2" id="address2"/>
		    <text textLimit="20" property="district" mandatory="true" id="district"/>
		    <text textLimit="10" property="postalCode" id="postalCode"/>
		    <text textLimit="20" property="phone" mandatory="true" id="phone"/>
		    <dateText property="lastUpdate" enabled="false" style="SWT.BORDER | SWT.TIME" id="lastUpdate"/>
		</composite>
		<gMap mapDataType="ADDRESS" toolBarStyle="AdiSWT.EXPANDABLE" zoom="12" id="map" delayMillisLoading="500"/>
    </section>
</includeTree>
renders the new layout:
 Address detail (improved)

Remarks:
Lines 12-14: Method displayGMap is called at three moments of the life cycle of the controller:

  • AFTER_SYNCHRONIZE: After received entity is injected inside UI controllers.
  • AFTER_PROPERTY_CHANGE: After UI send a change to a property of the entity.
  • POST_REFRESH: After changes on entity are cancelled by asking to refresh property values from Database.

Lines 16-41: Build an address string from property values and set the string to the GMap control.

Line 55: Set a gmap controller.