uidesigner/com.nokia.sdt.series60.componentlibrary/components/containers/CAknForm.component
author Deepak Modgil <Deepak.Modgil@Nokia.com>
Fri, 03 Apr 2009 23:33:03 +0100
changeset 0 fb279309251b
permissions -rw-r--r--
DP tools release version Revision: 200912

<?xml version="1.0" encoding="UTF-8"?>
<!-- Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). -->
<!-- All rights reserved. -->
<!-- This component and the accompanying materials are made available -->
<!-- under the terms of the License "Eclipse Public License v1.0" -->
<!-- which accompanies this distribution, and is available -->
<!-- at the URL "http://www.eclipse.org/legal/epl-v10.html". -->

<componentDefinition xmlns="http://www.nokia.com/sdt/emf/component" 
xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
	<component baseComponent="com.nokia.sdt.series60.DialogBase" 
			friendlyName="%friendlyName" 
			qualifiedName="com.nokia.sdt.series60.CAknForm" 
			category="Basic"
			instanceNameRoot="form"
			version="1.0">
		<documentation>
			<information>%information</information>
			<wizardDescription>%information</wizardDescription>
		</documentation>
		<symbian sdkName="com.nokia.series60" minSDKVersion="2.0" 
			className="CAknForm" classHelpTopic="" />
		<designerImages 
			smallIconFile="CAknForm_sm.png" 
			largeIconFile="CAknForm.png" 
			thumbnailFile="form_tn.png"/>
			
		<attributes>
			<attribute key="is-initial-content">true</attribute>
			<attribute key="has-builtin-options-menu">true</attribute>
			<attribute key="event-handler-target">true</attribute>
			<attribute key="base-container-class">CAknForm</attribute>
			<attribute key="base-control-observer-class">CAknForm</attribute>
			<attribute key="default-cba-value">R_AVKON_SOFTKEYS_OPTIONS_BACK</attribute>
			<attribute key="use-restricted-cba">true</attribute>
			<attribute key="associated-palette-drawer">Editors</attribute>
		</attributes>

		<properties>
			<property category="Form" name="EEikFormHideEmptyFields" type="boolean" default="false"
				descriptionKey="EEikFormHideEmptyFieldsKey" />
			<property category="Form" name="EEikFormShowBitmaps" type="boolean" default="false"
				descriptionKey="EEikFormShowBitmapsKey" />
			<property category="Form" name="EEikFormEditModeOnly" type="boolean" default="false"
				descriptionKey="EEikFormEditModeOnlyKey" />
			<property category="Form" name="EEikFormUseDoubleSpacedFormat" type="boolean" default="false"
				descriptionKey="EEikFormUseDoubleSpacedFormat" />
			<property category="Behavior" name="exitsApp" type="boolean" default="true"
				descriptionKey="exitsAppKey" />
		</properties>
		
		<extensionProperties name="default">
			<property category="Item" name="prompt" type="localizedString" default="prompt"
				descriptionKey="promptDescription"
				editorClass="com.nokia.sdt.symbian.ui.editors.ScalableTextEditorFactory" />
			<property category="Item" name="EEikDlgItemTakesEnterKey" 
				type="boolean" default="false"
				descriptionKey="EEikDlgItemTakesEnterKeyDescription" />
			<property category="Item" name="EEikDlgItemOfferAllHotKeys" 
				type="boolean" default="false"
				descriptionKey="EEikDlgItemOfferAllHotKeysDescription" />
			<property category="Item" name="EEikDlgItemSeparatorBefore" 
				type="boolean" default="false"
				descriptionKey="EEikDlgItemSeparatorBeforeDescription" /> 
			<compoundProperty category="Item" name="promptImage" 
				type="com.nokia.sdt.symbian.imageProperty"
				descriptionKey="promptImageDescription" />
		</extensionProperties>
	
		<implementations>
			<implementation>
				<interface id="com.nokia.sdt.datamodel.adapter.IVisualAppearance"/>
				<interface id="com.nokia.sdt.datamodel.adapter.ILayout"/>
				<interface id="com.nokia.sdt.datamodel.adapter.IScrollBoundsProvider"/>
				<code class="com.nokia.sdt.series60.component.AknFormVisualAndLayoutImplFactory"/>
			</implementation>
			<implementation>
				<interface id="com.nokia.sdt.datamodel.adapter.IPropertyExtenders"/>
				<script file="CAknForm_propertyExtenders.js" prototype="CAknFormPropertyExtenders"/>
			</implementation>
			<implementation>
				<interface id="com.nokia.sdt.datamodel.adapter.IQueryContainment"/>
				<script file="CAknForm_queryContainment.js" prototype="CAknFormQueryContainment"/>
			</implementation>
			</implementations>
	
		<sourceMapping>
			<mapResource struct="DIALOG" headers="avkon.rsg avkon.rh eikon.rh">
				<mapBitmaskMember property="." member="flags"
					includedProperties="wait notifyEsc modeless">
					<!-- initial blank entries force bits on -->
					<mapBitmaskValue properties="" value="EEikDialogFlagNoDrag" />
					<mapBitmaskValue properties="" value="EEikDialogFlagNoTitleBar" />
					<mapBitmaskValue properties="" value="EEikDialogFlagCbaButtons" />
					<mapBitmaskValue properties="" value="EEikDialogFlagFillAppClientRect" />
					
					<mapBitmaskValue properties="notifyEsc" value="EEikDialogFlagNotifyEsc" />
					<mapBitmaskValue properties="modeless" value="EEikDialogFlagModeless" />
					<mapBitmaskValue properties="wait" value="EEikDialogFlagWait" />
				</mapBitmaskMember>
	  		    <select property="[parent].[com.nokia.sdt.series60.CBARestricted]">
	   		        <choice value="">
	  		          <!-- no CBA -->
	  		        </choice>
	  		        <choice>
						<mapIdentifierMember property="[parent].[com.nokia.sdt.series60.CBARestricted].info" member="buttons" />
					</choice>
				</select>
				<mapResourceMember struct="FORM" property="." member="form" headers="eikon.rh">
				<mapBitmaskMember property="." member="flags"
					includedProperties="EEikFormHideEmptyFields EEikFormShowBitmaps EEikFormEditModeOnly EEikFormUseDoubleSpacedFormat">
					<mapBitmaskValue properties="EEikFormHideEmptyFields" value="EEikFormHideEmptyFields" />
					<mapBitmaskValue properties="EEikFormShowBitmaps" value="EEikFormShowBitmaps" />
					<mapBitmaskValue properties="EEikFormEditModeOnly" value="EEikFormEditModeOnly" />
					<mapBitmaskValue properties="EEikFormUseDoubleSpacedFormat" value="EEikFormUseDoubleSpacedFormat" />
				</mapBitmaskMember>
					<mapArrayMember property="." member="items">
						<select attribute="is-form-content">
							<!-- only map visible items, not menu bars, etc. -->
							<choice value="true">
								<mapResourceElement struct="DLG_LINE" headers="avkon.rh"
									instanceIdentifyingMember="id">
									<!-- looking at the current array element, always
										create a unique value from the dialog and instance name -->
									<mapEnumMember property="." member="type"
										nameAlgorithm="com.nokia.sdt.component.symbian.NAME_ALG_CONTROL_TYPE"
									/>
									<mapSimpleMember property="prompt" member="prompt"/>
									<mapEnumMember property="." member="id"
										uniqueValue="*"
										nameAlgorithm="com.nokia.sdt.component.symbian.NAME_ALG_DIALOG_LINE_ID"
									/>
									<!-- looking at the current array element, get the
										enumerator for the instance's control type -->
									<mapBitmaskMember property="." member="itemflags"
										includedProperties="EEikDlgItemTakesEnterKey EEikDlgItemOfferAllHotKeys EEikDlgItemSeparatorBefore">
										<mapBitmaskValue properties="EEikDlgItemTakesEnterKey" value="EEikDlgItemTakesEnterKey" />
										<mapBitmaskValue properties="EEikDlgItemOfferAllHotKeys" value="EEikDlgItemOfferAllHotKeys" />
										<mapBitmaskValue properties="EEikDlgItemSeparatorBefore" value="EEikDlgItemSeparatorBefore" />
									</mapBitmaskMember>
									<mapResourceMember property="." member="control"/>
								<!-- initialized in code for SVG support
									<mapSimpleMember property="promptImage.bmpfile" member="bmpfile"/>
									<mapIdentifierMember property="promptImage.bmpid" member="bmpid"/>
									// stupid header doesn't initialize bmpmask to -1
									<select property="promptImage.bmpmask">
										<choice value="">
											<mapFixedMember member="bmpmask" value="-1"/>
										</choice>
										<choice>
											<mapIdentifierMember property="promptImage.bmpmask" member="bmpmask"/>
										</choice>
									</select>
								-->
								</mapResourceElement>
							</choice>
							<!-- default case does nothing -->
							<choice/>
						</select>						
					</mapArrayMember>
				</mapResourceMember>
			</mapResource>
		</sourceMapping>
		
		<sourceGen forms="AppUi AknView RootAppUi">
		
			<!-- contributions as Form -->

			<defineLocation id="HEADER_FILE" domain="cpp" dir="${inc}" 
				file="${instanceName}.h"
				owned="false"
				location="">
			</defineLocation>
			
			<template location="HEADER_FILE">
#ifndef ${instanceName.toUpperCase()}_H
#define ${instanceName.toUpperCase()}_H

			</template>
			
			<defineLocation id="HEADER_INCLUDES" baseLocation="HEADER_FILE"
				location="region(Generated Includes)"
				filter="unique-includes">
			</defineLocation>
			
			<template location="HEADER_INCLUDES"><![CDATA[
#include <aknform.h>
]]>			</template>

			<defineLocation id="EVENT_INCLUDES" baseLocation="HEADER_FILE"
				owned="false"
				filter="unique-includes"
				location="region(Event Handler Includes)">
			</defineLocation>
			
			<template location="EVENT_INCLUDES" />
		
			<defineLocation id="HEADER_FORWARD_DECLARATIONS" baseLocation="HEADER_FILE"
				location="region(Generated Forward Declarations)">
				<template><![CDATA[
class MEikCommandObserver;		
]]>				</template>
			</defineLocation>	
				
			<template location="HEADER_FORWARD_DECLARATIONS"/>
			
	
			<defineLocation id="CLASS" baseLocation="HEADER_FILE"
				owned="false"
				location="class(${className})">
				<template><![CDATA[
/**
 * @class	${className} ${instanceName}.h
 */
class ${className} : public CAknForm
	{
public: // constructors and destructor

	${className}( MEikCommandObserver* aCommandObserver );
	static ${className}* NewL( MEikCommandObserver* aCommandObserver );
	static ${className}* NewLC( MEikCommandObserver* aCommandObserver );
	virtual ~${className}();
	
	// from CEikDialog
	TKeyResponse OfferKeyEventL( 
			const TKeyEvent& aKeyEvent, 
			TEventCode aType );
	
protected: 
	// from CAknDialog	
	void PreLayoutDynInitL();
	TBool OkToExitL( TInt aButtonId );

	// from CAknForm
	void DynInitMenuPaneL( TInt aResourceId, CEikMenuPane* aMenuPane );
	TBool QuerySaveChangesL();
	TBool SaveFormDataL(); 
	void DoNotSaveFormDataL();

private:
	void LoadFromDataL();
	MEikCommandObserver* iCommandObserver;
	};
]]>
				</template>
			</defineLocation>
			
			<template location="CLASS"/>

			<defineLocation id="CLASS_METHODS" baseLocation="CLASS"
				filter="unique-prototypes"
				location="region(Generated Methods)">
				<template><![CDATA[
public: <% contrib.indentAdjust(-1); %>
]]>				</template>
			</defineLocation>
			
			<template location="CLASS_METHODS"/>

		<defineLocation id="CLASS_TYPES" baseLocation="CLASS"
			location="region(Generated Type Declarations)">
				<template><![CDATA[
public: <% contrib.indentAdjust(-1); %>
]]>				</template>
			</defineLocation>

			<template location="CLASS_TYPES"/>

			<defineLocation id="CLASS_IVARS" baseLocation="CLASS"
			location="region(Generated Instance Variables)">
				<template><![CDATA[
private: <% contrib.indentAdjust(-1); %>
]]>				</template>
			</defineLocation>

			<template location="CLASS_IVARS"/>

			<defineLocation id="BASE_CLASS_LIST" baseLocation="CLASS"
				owned="false"
				filter="unique-bases"
				location="bases()">
			</defineLocation>
			
			<template location="BASE_CLASS_LIST" />
			
			<defineLocation id="CLASS_OVERRIDES" baseLocation="CLASS"
				owned="false"
				filter="unique-prototypes"
				location="region(Overridden Methods)">
				<template><![CDATA[
protected: <% contrib.indentAdjust(-1); %>
]]>				</template>
				
			</defineLocation>			
				
			<template location="CLASS_OVERRIDES"/>
			
			<defineLocation id="CLASS_USERHANDLERS" baseLocation="CLASS"
				owned="false"
				filter="unique-prototypes"
				location="region(User Handlers)">
				<template><![CDATA[
protected: <% contrib.indentAdjust(-1); %>
]]>				</template>
				
			</defineLocation>				
			
			<template location="CLASS_USERHANDLERS"/>

			<template location="HEADER_FILE">
#endif // ${instanceName.toUpperCase()}_H
			</template>
							
			<defineLocation id="MAIN_FILE" domain="cpp" dir="${src}" 
				file="${instanceName}.cpp"
				owned="false"
				location="">
			</defineLocation>

			<template location="MAIN_FILE"/>
			
			<defineLocation id="MAIN_SYSTEM_INCLUDES" baseLocation="MAIN_FILE"
				location="region(Generated System Includes)"
				filter="unique-includes">
				<template><![CDATA[
#include <avkon.hrh>
]]>				</template>
				<template><![CDATA[
#include <avkon.rsg>
]]>				</template>
				<template><![CDATA[
#include <eikmenup.h>
]]>				</template>
				<template><![CDATA[
#include <aknappui.h>
]]>				</template>
				<template><![CDATA[
#include <eikcmobs.h>
]]>				</template>
			</defineLocation>

			<template location="MAIN_SYSTEM_INCLUDES"/>
	
			<defineLocation id="MAIN_USER_INCLUDES" baseLocation="MAIN_FILE"
				location="region(Generated User Includes)"
				filter="unique-includes">
				<template><![CDATA[
#include "${instanceName}.h"
]]>				</template>
			</defineLocation>		

			<template location="MAIN_USER_INCLUDES"/>
			
			<inline>
if (Engine.formMatches(form, [""])) {
	this.getHrhFiles(contribs);
}
			</inline>
			
			<defineLocation id="CONSTANTS" baseLocation="MAIN_FILE"
				location="region(Generated Constants)">
			</defineLocation>

			<template location="CONSTANTS" />

			<defineLocation id="CONSTRUCTOR" baseLocation="MAIN_FILE"
				owned="false"
				location="function(${className}::${className}(MEikCommandObserver*))">
				<template><![CDATA[
/**
 * Construct the ${className} instance
 * @param aCommandObserver command observer
 */ 
${className}::${className}( MEikCommandObserver* aCommandObserver )
	{
	iCommandObserver = aCommandObserver;
	}
]]>
				</template>			
			</defineLocation>
			
			<template location="CONSTRUCTOR"/>

			<defineLocation id="CONSTRUCTOR_BODY" baseLocation="CONSTRUCTOR"
				location="region(Generated Contents)">
			</defineLocation>

			<template location="CONSTRUCTOR_BODY"/>
			
			<template location="MAIN_FILE"><![CDATA[
/**
 *  Creates an instance and initializes it.
 *  Instance is not left on cleanup stack.
 * @param aCommandObserver command observer
 * @return initialized instance of ${className}
 */
${className}* ${className}::NewL( MEikCommandObserver* aCommandObserver )
	{
	${className}* self = ${className}::NewLC( aCommandObserver );
	CleanupStack::Pop( self );
	return self;
	}

/**
 *  Creates an instance and initializes it.
 *  Instance is left on cleanup stack.
 * @param aCommandObserver command observer
 * @return new instance of ${className}
 */
${className}* ${className}::NewLC( MEikCommandObserver* aCommandObserver )
	{
	${className}* self = new ( ELeave ) ${className}( aCommandObserver );
	CleanupStack::PushL( self );
	self->ConstructL();
	return self;
	}
]]>			
			</template>

				<defineLocation id="OFFER_KEYEVENTL" baseLocation="MAIN_FILE"
					owned="false"
					location="function(${handlerClassName}::OfferKeyEventL(const TKeyEvent&amp;,TEventCode))">
					<template><![CDATA[
/** 
 * Handle key event (override)
 * @param aKeyEvent key event
 * @param aType event code
 * @return EKeyWasConsumed if the event was handled, else EKeyWasNotConsumed
 */
TKeyResponse ${className}::OfferKeyEventL( 
		const TKeyEvent& aKeyEvent, 
		TEventCode aType )
	{
	}
]]>				
					</template>
				</defineLocation>
				
			<defineLocation id="OFFER_KEYEVENTL_BODY" baseLocation="OFFER_KEYEVENTL"
				location="region(Generated Contents)"/>

		<template location="OFFER_KEYEVENTL_BODY"/>
			
		<template location="OFFER_KEYEVENTL"><![CDATA[
<% if (instance.rootContainer.isInstanceOf("com.nokia.sdt.series60.CAknView")) { 
%>if ( ( aKeyEvent.iCode == EKeyLeftArrow 
	|| aKeyEvent.iCode == EKeyRightArrow )
	&& !IsEditable() )
	{
	// allow the tab control to get the arrow keys
	return EKeyWasNotConsumed;
	}
<% } %>
]]>		</template>

			<!-- this is the same template emitted as an event include
			from ContainerBase; we need to omit to reduce duplicates -->
			<template id="OfferKeyEventOverrideContents" location="OFFER_KEYEVENTL"><![CDATA[
<% if (!instance.events["offerKeyEvent"]) {
%>return ${instance.attributes["base-container-class"]}::OfferKeyEventL( aKeyEvent, aType );
<%}%> ]]>	</template>


			<defineLocation id="DESTRUCTOR" baseLocation="MAIN_FILE"
				owned="false"
				location="function(${className}::~${className}())">
				<template><![CDATA[
/** 
 * Destroy any instance variables
 */
${className}::~${className}()
	{
	}
]]>
				</template>			
			</defineLocation>
			
			<template location="DESTRUCTOR"/>

			<defineLocation id="DESTRUCTOR_BODY" baseLocation="DESTRUCTOR"
				location="region(Generated Contents)">
			</defineLocation>
			
			<template location="DESTRUCTOR_BODY"/>

			
			<template location="MAIN_FILE"><![CDATA[
/**
 * Called to handle "Save" menu item. Displays save query.
 * @return TBool ETrue if the form data is to be saved, EFalse otherwise
 */
TBool ${className}::QuerySaveChangesL()
	{
	TBool isAnsYes( CAknForm::QuerySaveChangesL() );
	
	if ( isAnsYes )
		{
		SaveFormDataL();
		}
	else
		{
		DoNotSaveFormDataL();
		}

	return isAnsYes;
	}

/**
 * Called from QuerySaveChangesL when changes made to the form are to be saved.
 * @return TBool ETrue if the form data has been saved, EFalse otherwise
 */
TBool ${className}::SaveFormDataL()
	{
	// TODO save values
	return ETrue;
	}

/**
 * Called from QuerySaveChangesL when changes made to the form are discarded.
 */
void ${className}::DoNotSaveFormDataL()
	{
	LoadFromDataL();
	}

/**
 * Called from DoNotSaveFormDataL when changes are cancelled.
 * Called from PreLayoutDynInitL to load initial values if needed.
 */
void ${className}::LoadFromDataL()
	{
	// TODO load saved values	

	}
]]>
				</template>			
			
			<defineLocation id="PRELAYOUTDYNINITL" baseLocation="MAIN_FILE"
				owned="false"
				location="function(${className}::PreLayoutDynInitL())">
				<template><![CDATA[
/**
 * Initialize controls and settings before a Form is laid out.  (override)
 */
void ${className}::PreLayoutDynInitL()
	{
	}
]]>				
				</template>			
			</defineLocation>
			
			<template location="PRELAYOUTDYNINITL"/>
			
			<defineLocation id="PRELAYOUTDYNINITL_BODY" baseLocation="PRELAYOUTDYNINITL"
				location="region(Generated Contents)">
			</defineLocation>

			<template location="PRELAYOUTDYNINITL_BODY"/>

			<template location="PRELAYOUTDYNINITL">
LoadFromDataL();
			</template>

			<defineLocation id="DYNINITMENUPANEL" baseLocation="MAIN_FILE"
				owned="false"
				location="function(${className}::DynInitMenuPaneL(TInt, CEikMenuPane*))">
				<template><![CDATA[
/**
 * Called when built-in menu is displayed.  (override)
 * CAknForm has a built-in menu. In view mode, the only menu item is "Edit" that switches the form to edit mode.
 * In edit mode, the items are "Add field" "Save" "Edit label" and "Delete field"
 * The code below removes all edit mode items except for "Save"
 * To use these items, remove the appropriate lines and override the appropriate CAknForm methods.
 * (E.g., to handle "Add field" remove the line for EAknFormCmdAdd and override CAknForm::AddItemL())
 */
void ${className}::DynInitMenuPaneL( TInt aResourceId, CEikMenuPane* aMenuPane )
	{
	CAknForm::DynInitMenuPaneL( aResourceId, aMenuPane );
	
	if ( aResourceId == R_AVKON_FORM_MENUPANE )
		{
		aMenuPane->SetItemDimmed( EAknFormCmdAdd, ETrue );
		aMenuPane->SetItemDimmed( EAknFormCmdLabel, ETrue );
		aMenuPane->SetItemDimmed( EAknFormCmdDelete, ETrue );

		/* 
		// sample code to add a custom item with command id 'myCommandId'
		TInt pos;
		if ( !aMenuPane->MenuItemExists( myCommandId, pos ) )
			{
			CEikMenuPaneItem::SData menuItem;
			menuItem.iCommandId = myCommandId;
			menuItem.iCascadeId = 0;	// set for submenus
			menuItem.iFlags = 0;		// e.g. EEikMenuItemDimmed
			menuItem.iText = KMyCommandIdText;
			menuItem.iExtraText = _L("");
			aMenuPane->AddMenuItemL( menuItem );
			}
		*/
		}
	}
]]>				
				</template>			
			</defineLocation>
			
			<template location="DYNINITMENUPANEL"/>
			
			<defineLocation id="DYNINITMENUPANEL_BODY" baseLocation="DYNINITMENUPANEL"
				owned="true"
				location="region(Generated Code)"/>
				
			<template location="DYNINITMENUPANEL_BODY"><![CDATA[
<%	var event = instance.events['dynInitMenuPane'];
	if (event) {%>
${event.handlerName}( aResourceId, aMenuPane );
<% } %>
]]>			</template>
			
			<defineLocation id="OKTOEXITL" baseLocation="MAIN_FILE"
				owned="false"
				location="function(${className}::OkToExitL(TInt))">
				<template><![CDATA[
/**
 * Handle a button press and tell whether it closes the dialog.  (override)  
 * @param aButtonId the identifier for the button (avkon.hrh)
 */
TBool ${className}::OkToExitL( TInt aButtonId )
	{
	}
]]>
				</template>			
			</defineLocation>
			
			<template location="OKTOEXITL"/>
			
			<defineLocation id="OKTOEXITL_BODY" baseLocation="OKTOEXITL"
				location="region(Generated Code)">
			</defineLocation>
		
			<inline scope="prototype">
include("../cba/cbaLibrary.js")
include("containerLibrary.js")
			</inline>			

			<template location="OKTOEXITL_BODY"><![CDATA[
<% if (properties.exitsApp) { 
	var id = findCbaRightId(instance.parent.children);
%>
if ( aButtonId == ${id} )
	{
	if ( CAknForm::OkToExitL( EAknSoftkeyBack ) )
		{
		iAvkonAppUi->ProcessCommandL( EEikCmdExit );
		}
	else
		{
		return EFalse;
		}
	}<% } %>
]]>			</template>	

			<template location="OKTOEXITL"><![CDATA[
// The '${lookupString("exitsApp")}' property automatically adds code to exit the 
// application when the right soft key is pressed. If this property is set to false, 
// and AddToStackL has been called on the Form object (e.g., it was not shown as a dialog), 
// code must be added manually to avoid a panic when exiting the application.
return CAknForm::OkToExitL( aButtonId );
]]>			</template>	

			<useTemplateGroup ids="GeneratePrepareForFocusTransition GeneratePageChanged GenerateLineChanged"/>
			<useTemplateGroup ids="GenerateProcessCommand GenerateOfferKeyToApp"/>
			<useTemplateGroup ids="GenerateFocusChanged"/>
			<useTemplateGroup ids="GenerateSizeChanged GeneratePositionChanged"/>
			<useTemplateGroup ids="GenerateDraw GenerateOfferKeyEvent"/>
			<useTemplateGroup ids="GeneratePrepareForFocusLoss GeneratePrepareForFocusGain"/>

<!-- BEGIN EVENT resourceChanged -->
			<templateGroup id="GenerateResourceChanged" ifEvents="resourceChanged">
				<template id="DeclareResourceChangedOverride" phase="OverriddenMethods"><![CDATA[
void HandleResourceChange( TInt aType );
]]>				</template>

				<defineLocation id="ResourceChangedOverride" baseLocation="MAIN_FILE"
					owned="false"
					location="function(${handlerClassName}::HandleResourceChange(TInt))">
					<template><![CDATA[
/** 
 * Handle global resource changes, such as scalable UI or skin events (override)
 */
void ${handlerClassName}::HandleResourceChange( TInt aType )
	{
	${instance.attributes["base-container-class"]}::HandleResourceChange( aType );
	}
]]>				
					</template>
				</defineLocation>
				
			<defineLocation id="ResourceChangedBody" baseLocation="ResourceChangedOverride"
				location="region(Generated Contents)">
				<template/>
			</defineLocation>
			
			<template id="InvokeResourceChangedHandler" location="ResourceChangedBody">
${event.handlerName}( aType );
			</template>

			<template id="DeclareResourceChangedHandler" phase="UserHandlers">
void ${event.handlerName}( TInt aType );
			</template>

			<defineLocation id="ResourceChangedHandlerMethod" baseLocation="MAIN_FILE"
				owned="false"
				isEventHandler="true"
				location="function(${handlerClassName}::${event.handlerName}(TInt))">
			<template><![CDATA[
/** 
 * Handle the ${event.eventName} event.
 */
void ${handlerClassName}::${event.handlerName}( TInt aType )
	{
	// TODO: implement ${event.eventName} event handler
	}
]]>				
				</template>
			</defineLocation>
			
			<template id="RealizeResourceChangedHandler" location="ResourceChangedHandlerMethod" />
			</templateGroup>
<!-- END EVENT resourceChanged -->		

<!-- BEGIN EVENT dynInitMenuPane -->
			<templateGroup id="GenerateDynInitMenuPaneForForm" ifEvents="dynInitMenuPane">

			<template id="DeclareDynInitMenuPaneHandler" phase="UserHandlers">
void ${event.handlerName}( TInt aResourceId, CEikMenuPane* aMenuPane );
			</template>

			<defineLocation id="DynInitMenuPaneHandlerMethod" baseLocation="MAIN_FILE"
				owned="false"
				isEventHandler="true"
				location="function(${handlerClassName}::${event.handlerName}(TInt, CEikMenuPane*))">
			<template><![CDATA[
/** 
 * Handle the ${event.eventName} event.
 */
void ${handlerClassName}::${event.handlerName}( TInt aResourceId, CEikMenuPane* aMenuPane )
	{
	// TODO: implement ${event.eventName} event handler
	}
]]>				
				</template>
			</defineLocation>
			
			<template id="RealizeDynInitMenuPaneHandler" location="DynInitMenuPaneHandlerMethod" />
			</templateGroup>
<!-- END EVENT dynInitMenuPane -->

			
			<!-- gather child contributions -->

			<inline scope="prototype">
			include("../srcgenLibrary.js");
			</inline>

			<inline scope="prototype"><![CDATA[
${jsObject}.prototype.gatherFormLineImageContribs = function(contribs, instance) {
	var contrib;

	var any = false;	
	for (var c in instance.children) {
		var child = instance.children[c];
		if (!child.component.attributes["is-form-content"])
			continue;
		var enm = Engine.findBuiltinOrGeneratedEnumeratorForAlgorithm(
			child, ".", "com.nokia.sdt.component.symbian.NAME_ALG_DIALOG_LINE_ID");
		if (enm != null && isImagePropertySet(child.properties.promptImage)) {

			if (!any) {
				contrib = Engine.createContributionForPhase("MainSystemIncludes");
				contrib.setText("#include <eikcapc.h>\n");
				contribs.add(contrib);
			
				contrib = Engine.createContributionForPhase("PostInitialize");
				contrib.setText("CEikCaptionedControl* theLine;\n");
				contribs.add(contrib);
			
				any = true;
			}
		
			contrib = Engine.createContributionForPhase("PostInitialize");
			contrib.setFormattedText("theLine = Line( {1} );\n",
				[ instance.memberName, enm ]);
			contribs.add(contrib);
			
			setupImageFromPropertyViaTuple(contribs, child,	"PostInitialize", null, 0,
				child.properties.promptImage,
				"theLine->SetBitmapFromFileL( {0}, {1} );\n",
				"theLine->SetBitmapFromFileL( {0}, {1}, {2} );\n");
		}
	}		
}

]]>			</inline>

			<inline>


			if (form != 'RootAppUi') {
				
				if (Engine.formMatches(form, [ "AknView", "AppUi" ])) {
					// clear out any image stuff
					resetImagePropertyState(instance);

					// get default and dialog-specific contributions
					contribs.addAll(Engine.generateChildContributions(form+"|Dialog"))
			
					// set images dynamically		
					this.gatherFormLineImageContribs(contribs, instance);
					
				} else {
					// get specific desired contributions
					contribs.addAll(Engine.generateChildContributions(form))
				}
				
				Engine.collateContributionsByPhase(contribs, ["Initialize", "PostInitialize"]);
				
				// fix up the phases so they point to real locations
				Engine.assignLocationsForPhase(contribs, "ClassSource", "MAIN_FILE");
				Engine.assignLocationsForPhase(contribs, "ClassHeader", "HEADER_FILE");

				Engine.assignLocationsForPhase(contribs, "MainConstants", "CONSTANTS");
				Engine.assignLocationsForPhase(contribs, "MainSystemIncludes", "MAIN_SYSTEM_INCLUDES");
				Engine.assignLocationsForPhase(contribs, "MainUserIncludes", "MAIN_USER_INCLUDES");
				Engine.assignLocationsForPhase(contribs, "Construct", "CONSTRUCTOR_BODY");
				Engine.assignLocationsForPhase(contribs, "Initialize", "PRELAYOUTDYNINITL_BODY");
				Engine.assignLocationsForPhase(contribs, "PostInitialize", "PRELAYOUTDYNINITL_BODY");
				Engine.assignLocationsForPhase(contribs, "Destroy", "DESTRUCTOR_BODY");
				Engine.assignLocationsForPhase(contribs, "ClassTypeDeclarations", "CLASS_TYPES");
				Engine.assignLocationsForPhase(contribs, "BaseClassList", "BASE_CLASS_LIST");
				Engine.assignLocationsForPhase(contribs, "OverriddenMethods", "CLASS_OVERRIDES");
				Engine.assignLocationsForPhase(contribs, "UserHandlers", "CLASS_USERHANDLERS");
				Engine.assignLocationsForPhase(contribs, "EventIncludes", "EVENT_INCLUDES");
				
				Engine.assignLocationsForPhase(contribs, "HeaderIncludes", "HEADER_INCLUDES");
				Engine.assignLocationsForPhase(contribs, "ForwardDeclarations", "HEADER_FORWARD_DECLARATIONS");
				Engine.assignLocationsForPhase(contribs, "InstanceVariables", "CLASS_IVARS");
				Engine.assignLocationsForPhase(contribs, "ClassMethods", "CLASS_METHODS");
	
				//Engine.removeDuplicateContributionsForLocation(contribs, "HEADER_INCLUDES");
				Engine.removeDuplicateContributionsForLocation(contribs, "HEADER_FORWARD_DECLARATIONS");
				//Engine.removeDuplicateContributionsForLocation(contribs, "MAIN_SYSTEM_INCLUDES");
				//Engine.removeDuplicateContributionsForLocation(contribs, "MAIN_USER_INCLUDES");
				Engine.removeDuplicateContributionsForLocation(contribs, "DESTRUCTOR_BODY");
			}
						
			</inline>

			<template id="IncludeRsgFile" location="MAIN_SYSTEM_INCLUDES"><![CDATA[
#include <${resourceFileNameBase}.rsg>
]]>			</template>

			<!-- contributions as child  -->

			<template form="AknView" phase="MainUserIncludes">
#include "${instanceName}.h"
			</template>

			<template form="AknView" phase="ForwardDeclarations">
class ${className};
			</template>

			<template form="AknView" phase="InstanceVariables">
${className}* ${instanceMemberName};
			</template>

			<template form="AknView" phase="DoActivateL"><![CDATA[
if ( ${instanceMemberName} == NULL )
	{
	${className}* form = ${className}::NewL( this );
	form->SetMopParent( this ); <%
if ( properties.wait ) {
	var sb = newStatusBuilder();
	sb.add(IStatus.ERROR, lookupString("waitPropertySetInView"), [ instanceName ]);
	logStatus(sb.createStatus("", null));
	} %>
	form->ExecuteLD( ${resourceName$upper} );
	AppUi()->AddToStackL( *this, form );
	${instanceMemberName} = form;
	} 
]]>			</template>
			
			<template form="AknView" phase="DoDeactivate">
if ( ${instanceMemberName} != NULL )
	{
	AppUi()->RemoveFromStack( ${instanceMemberName} );
	delete ${instanceMemberName};
	${instanceMemberName} = NULL;
	}
			</template>


			<template form="RootAppUi" phase="MainUserIncludes">
#include "${instanceName}.h"
			</template>

			<template form="RootAppUi" phase="ForwardDeclarations">
class ${className};
			</template>

			<template form="RootAppUi" phase="InstanceVariables">
${className}* ${instanceMemberName};
			</template>

			<template form="RootAppUi" phase="Initialize"><![CDATA[
<% if (resourceName != null) { %>
${instanceMemberName} = ${className}::NewL( this );
${instanceMemberName}->SetMopParent( this );
${instanceMemberName}->ExecuteLD( ${resourceName$upper} );
AddToStackL( ${instanceMemberName} );
<% } %>
]]>			</template>

			<template form="RootAppUi" phase="Destroy">
if ( ${instanceMemberName} != NULL )
	{
	RemoveFromStack( ${instanceMemberName} );
	delete ${instanceMemberName};
	${instanceMemberName} = NULL;
	}
			</template>

		</sourceGen>

	</component>
</componentDefinition>