meetingrequest/mrgui/mrfieldbuildercommon/src/cesmrfield.cpp
branchRCL_3
changeset 25 3533d4323edc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/meetingrequest/mrgui/mrfieldbuildercommon/src/cesmrfield.cpp	Wed Sep 01 12:28:57 2010 +0100
@@ -0,0 +1,1036 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  ESMR policy implementation
+*
+*/
+
+#include "cesmrfield.h"
+
+#include "esmrcommands.h"
+#include "nmrlayoutmanager.h"
+#include "mesmrfieldeventqueue.h"
+#include "cesmrfieldcommandevent.h"
+#include "cmrbackground.h"
+#include "esmrcommands.h"
+#include "cmrrecordinggc.h"
+
+#include "emailtrace.h"
+
+#include <txtrich.h>
+#include <eikenv.h>
+#include <baclipb.h>
+#include <eikbtgpc.h>
+#include <StringLoader.h>
+#include <AknUtils.h>
+#include <touchfeedback.h>
+
+namespace
+{
+// Off-screen x coordinate for fields
+const TInt KOffScreenPositionX = 1000;
+}
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CESMRField::CESMRField
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CESMRField::CESMRField()
+    : iCustomMsk( EFalse ),
+      iDisableRedraw( EFalse ),
+      iDefaultMskVisible( EFalse ),
+      iMskVisible( EFalse ),
+      iLocked( EFalse )
+    {
+    FUNC_LOG;
+    // do nothing
+    }
+
+
+// ---------------------------------------------------------------------------
+// CESMRField::~CESMRField
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CESMRField::~CESMRField()
+    {
+    FUNC_LOG;
+    delete iExtControl;
+    if ( iEventQueue )
+        {
+        iEventQueue->RemoveObserver( this );
+        }
+    delete iBackground;
+    delete iRecordingGc;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::ConstructL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CESMRField::ConstructL(
+        CCoeControl* aControl )
+    {
+    FUNC_LOG;
+    iExtControl = aControl;
+
+    iBackground = CMRBackground::NewL();
+    this->SetBackground( iBackground );
+    iRecordingGc = new( ELeave ) CMRRecordingGc( SystemGc() );
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::InitializeL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CESMRField::InitializeL()
+    {
+    FUNC_LOG;
+    /* Empty implementation, subclasses should overwrite */
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::FontChangedL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CESMRField::FontChangedL()
+    {
+    FUNC_LOG;
+    // This method re-initializes field
+    InitializeL();
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::SetFieldId
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CESMRField::SetFieldId( TESMREntryFieldId aFieldId )
+    {
+    FUNC_LOG;
+    iFieldId = aFieldId;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CESMRField::SetPreItemIndex
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CESMRField::SetPreItemIndex( TInt aPreItemIndex )
+    {
+    FUNC_LOG;
+    iPreItemIndex = aPreItemIndex;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CESMRField::SetCurrentItemIndex
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CESMRField::SetCurrentItemIndex( TInt aCurrentItemIndex )
+    {
+    FUNC_LOG;
+    iCurrentItemIndex = aCurrentItemIndex;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::FieldId
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TESMREntryFieldId CESMRField::FieldId() const
+    {
+    FUNC_LOG;
+    return iFieldId;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::PreItemIndex
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt CESMRField::PreItemIndex() const
+    {
+    FUNC_LOG;
+    return iPreItemIndex;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::CurrentItemIndex
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt CESMRField::CurrentItemIndex() const
+    {
+    FUNC_LOG;
+    return iCurrentItemIndex;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::SizeChanged
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CESMRField::SizeChanged()
+    {
+    FUNC_LOG;
+    TRect rect( Rect() );
+    if ( iExtControl )
+        {
+        iExtControl->SetRect( rect );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::CountComponentControls
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt CESMRField::CountComponentControls() const
+    {
+    FUNC_LOG;
+    TInt count( 0 );
+    if ( iExtControl )
+    	{
+        ++count;
+    	}
+
+    return count;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::ComponentControl
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CCoeControl* CESMRField::ComponentControl( TInt /*aInd*/ ) const
+    {
+    FUNC_LOG;
+    return iExtControl;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::MinimumSize
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TSize CESMRField::MinimumSize()
+    {
+    TRect parentRect( Parent()->Rect() );
+    TAknLayoutRect listareaLayoutRect =
+        NMRLayoutManager::GetLayoutRect( parentRect, NMRLayoutManager::EMRLayoutListArea );
+    TAknLayoutRect fieldLayoutRect =
+        NMRLayoutManager::GetFieldLayoutRect( listareaLayoutRect.Rect(), 1 );
+    return TSize( Parent()->Size().iWidth, fieldLayoutRect.Rect().Height() );
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::Draw
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CESMRField::Draw( const TRect& aRect ) const
+    {
+    FUNC_LOG;
+
+    // Draw only if field is not on screen
+    if ( Position().iX != Parent()->Position().iX )
+        {
+        // Flush cached drawing commands from custom graphics context
+        iRecordingGc->FlushBuffer( aRect );
+        }
+
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::HandlePointerEventL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CESMRField::HandlePointerEventL(
+        const TPointerEvent& aPointerEvent )
+    {
+    FUNC_LOG;
+    // Sanity check that pointer event occurs in field area
+    if ( Rect().Contains( aPointerEvent.iPosition ) )
+        {
+        if ( aPointerEvent.iType == TPointerEvent::EButton1Up )
+            {
+            if ( !HandleSingletapEventL( aPointerEvent.iPosition ) )
+                {
+                // Provide raw pointer event to field
+                HandleRawPointerEventL( aPointerEvent );
+                }
+            }
+        else // Provide other pointer events to fields
+            {
+            if ( !HandleRawPointerEventL( aPointerEvent ) )
+                {
+                // Provide pointer events to child components if field
+                // did not already consume the event
+                CCoeControl::HandlePointerEventL( aPointerEvent );
+                }
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::SetContainerWindowL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CESMRField::SetContainerWindowL(const CCoeControl& aContainer)
+    {
+    FUNC_LOG;
+
+    // Use container window from aContainer
+    // This will set also aContainer as MOP parent and CCoeControl parent
+    CCoeControl::SetContainerWindowL( aContainer );
+
+    // Set this same window and this as parent for component controls
+    TInt count( CountComponentControls() );
+
+    for ( TInt i = 0; i < count; ++i )
+        {
+        ComponentControl( i )->SetContainerWindowL( *this );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::SetListObserver
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CESMRField::SetListObserver( MESMRListObserver* aObserver )
+    {
+    FUNC_LOG;
+    iObserver = aObserver;
+    ListObserverSet();
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::ListObserverSet
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CESMRField::ListObserverSet()
+    {
+    FUNC_LOG;
+    // default implementation.
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::OfferKeyEventL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TKeyResponse CESMRField::OfferKeyEventL(
+		const TKeyEvent& aEvent, TEventCode aType )
+    {
+    FUNC_LOG;
+
+    TKeyResponse response( EKeyWasNotConsumed );
+
+    if ( iExtControl )
+        {
+        response = iExtControl->OfferKeyEventL( aEvent, aType );
+        }
+
+    // If key event was not consumed, and it is the Enter,
+    // let's execute generic command Open
+    if ( response == EKeyWasNotConsumed
+         && aType == EEventKey
+         && ( aEvent.iCode == EKeyEnter
+              || aEvent.iScanCode == EStdKeyEnter ) )
+        {
+        ExecuteGenericCommandL( EAknCmdOpen );
+        }
+
+    return response;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::SetOutlineFocusL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CESMRField::SetOutlineFocusL( TBool aFocus )
+    {
+    FUNC_LOG;
+    iOutlineFocus = aFocus;
+
+    if ( iExtControl )
+        {
+        iExtControl->SetFocus( aFocus );
+        }
+    if ( aFocus )
+        {
+        CEikButtonGroupContainer* cba = CEikButtonGroupContainer::Current();
+        if ( cba )
+            {
+            iDefaultMskVisible = cba->IsCommandVisibleByPosition(
+                    CEikButtonGroupContainer::EMiddleSoftkeyPosition );
+            iMskVisible = iDefaultMskVisible;
+            }
+        }
+    else
+        {
+        RestoreMiddleSoftKeyL();
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::OkToLoseFocusL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TBool CESMRField::OkToLoseFocusL( // codescanner::LFunctionCantLeave
+        TESMREntryFieldId /*aNextItem*/ )
+    {
+    FUNC_LOG;
+    return ETrue;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::GetMinimumVisibleVerticalArea
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CESMRField::GetMinimumVisibleVerticalArea(
+		TInt& aUpper, TInt& aLower)
+    {
+    FUNC_LOG;
+    aUpper = 0;
+    aLower = Rect().iBr.iY - Rect().iTl.iY;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::GetCursorLineVerticalPos
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CESMRField::GetCursorLineVerticalPos(TInt& aUpper, TInt& aLower)
+    {
+    FUNC_LOG;
+    aUpper = 0;
+    aLower = Rect().iBr.iY - Rect().iTl.iY;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::InternalizeL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CESMRField::InternalizeL( // codescanner::LFunctionCantLeave
+        MESMRCalEntry& /*aEntry*/ )
+    {
+    FUNC_LOG;
+    /* Empty implementation, subclasses should overwrite */
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::ExternalizeL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CESMRField::ExternalizeL( // codescanner::LFunctionCantLeave
+        MESMRCalEntry& /*aEntry*/ )
+    {
+    FUNC_LOG;
+    /* Empty implementation, subclasses should overwrite */
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::ExecuteGenericCommandL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TBool CESMRField::ExecuteGenericCommandL( TInt /*aCommand*/ )
+    {
+    FUNC_LOG;
+    return EFalse;
+    /* Subclasses should overwrite */
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::LongtapDetectedL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CESMRField::LongtapDetectedL( const TPoint& aPosition )
+    {
+    FUNC_LOG;
+
+    HandleLongtapEventL( aPosition );
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::SetTitlePaneObserver
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CESMRField::SetTitlePaneObserver(
+		MESMRTitlePaneObserver* /*aObserver*/ )
+    {
+    FUNC_LOG;
+    /* Empty implementation, subclasses should overwrite */
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::ChangeMiddleSoftKeyL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CESMRField::ChangeMiddleSoftKeyL(
+        TInt aCommandId,
+        TInt aResourceId )
+    {
+    FUNC_LOG;
+
+    if ( AknLayoutUtils::MSKEnabled() )
+        {
+        CEikButtonGroupContainer* cba = CEikButtonGroupContainer::Current();
+        if ( cba )
+            {
+            HBufC* middleSKText = StringLoader::LoadLC( aResourceId,
+                                                        iCoeEnv );
+            cba->SetCommandL(
+                    CEikButtonGroupContainer::EMiddleSoftkeyPosition,
+                    aCommandId, *middleSKText );
+            CleanupStack::PopAndDestroy( middleSKText );
+            if ( !iMskVisible )
+                {
+                cba->MakeCommandVisibleByPosition(
+                        CEikButtonGroupContainer::EMiddleSoftkeyPosition,
+                        ETrue );
+                iMskVisible = ETrue;
+                }
+            cba->DrawDeferred();
+            iCustomMsk = ETrue;
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::SetValidatorL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CESMRField::SetValidatorL( MESMRFieldValidator* aValidator )
+    {
+    FUNC_LOG;
+
+    iValidator = aValidator;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::IsFieldActivated
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TBool CESMRField::IsFieldActivated() const
+    {
+    FUNC_LOG;
+
+    return IsActivated();
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::DynInitMenuPaneL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CESMRField::DynInitMenuPaneL(
+        TInt /*aResourceId*/,
+        CEikMenuPane* /*aMenuPane*/ )
+    {
+    FUNC_LOG;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::ChangeMiddleSoftKeyL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CESMRField::ChangeMiddleSoftKeyL( TInt aResourceId )
+    {
+    FUNC_LOG;
+
+    if ( AknLayoutUtils::MSKEnabled() )
+        {
+        CEikButtonGroupContainer* cba = CEikButtonGroupContainer::Current();
+        if ( cba )
+            {
+            cba->SetCommandL(
+                    CEikButtonGroupContainer::EMiddleSoftkeyPosition,
+                    aResourceId );
+            if ( !iMskVisible )
+                {
+                cba->MakeCommandVisibleByPosition(
+                        CEikButtonGroupContainer::EMiddleSoftkeyPosition,
+                        ETrue );
+                iMskVisible = ETrue;
+                }
+            cba->DrawDeferred();
+            iCustomMsk = ETrue;
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::SetEventQueueL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CESMRField::SetEventQueueL( MESMRFieldEventQueue* aEventQueue )
+    {
+    FUNC_LOG;
+    if ( aEventQueue != iEventQueue )
+        {
+        if ( aEventQueue )
+            {
+            // Add self to new queue
+            aEventQueue->AddObserverL( this );
+            }
+
+        if ( iEventQueue )
+            {
+            // Remove self from old queue
+            iEventQueue->RemoveObserver( this );
+            }
+
+        iEventQueue = aEventQueue;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::HasOutlineFocus
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TBool CESMRField::HasOutlineFocus() const
+    {
+    FUNC_LOG;
+    return iOutlineFocus;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::GetFocusRect
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TRect CESMRField::GetFocusRect() const
+    {
+    FUNC_LOG;
+    return iFocusRect;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::SetFocusRect
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CESMRField::SetFocusRect( const TRect& aFocusRect )
+    {
+    FUNC_LOG;
+    iFocusRect = aFocusRect;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::GetFocusType
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TESMRFieldFocusType CESMRField::GetFocusType() const
+    {
+    FUNC_LOG;
+    return iFocusType;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::SetFocusType
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CESMRField::SetFocusType( TESMRFieldFocusType aFocusType )
+    {
+    FUNC_LOG;
+    iFocusType = aFocusType;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::NotifyEventL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CESMRField::NotifyEventL( const MESMRFieldEvent& aEvent )
+    {
+    FUNC_LOG;
+    if ( iEventQueue )
+        {
+        iEventQueue->NotifyEventL( aEvent );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::NotifyEventL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CESMRField::NotifyEventL( TInt aCommand )
+    {
+    FUNC_LOG;
+    CESMRFieldCommandEvent* event = CESMRFieldCommandEvent::NewLC( this,
+                                                                   aCommand );
+    NotifyEventL( *event );
+    CleanupStack::PopAndDestroy( event );
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::NotifyEventAsyncL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CESMRField::NotifyEventAsyncL( MESMRFieldEvent* aEvent )
+    {
+    FUNC_LOG;
+    if ( iEventQueue )
+        {
+        iEventQueue->NotifyEventAsyncL( aEvent );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::NotifyEventAsyncL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CESMRField::NotifyEventAsyncL( TInt aCommand )
+    {
+    FUNC_LOG;
+    CESMRFieldCommandEvent* event = CESMRFieldCommandEvent::NewLC( this,
+                                                                   aCommand );
+    NotifyEventAsyncL( event );
+    CleanupStack::Pop( event );
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::RestoreMiddleSoftKeyL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CESMRField::RestoreMiddleSoftKeyL()
+    {
+    FUNC_LOG;
+    if ( AknLayoutUtils::MSKEnabled() )
+        {
+        if ( iMskVisible != iDefaultMskVisible )
+            {
+            SetMiddleSoftKeyVisible( iDefaultMskVisible );
+            }
+
+        if ( iCustomMsk )
+            {
+            NotifyEventL( EESMRCmdRestoreMiddleSoftKey );
+            iCustomMsk = EFalse;
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::SetMiddleSoftKeyVisible
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CESMRField::SetMiddleSoftKeyVisible( TBool aVisible )
+    {
+    FUNC_LOG;
+    if ( AknLayoutUtils::MSKEnabled() )
+        {
+        if ( iMskVisible != aVisible )
+            {
+            CEikButtonGroupContainer* cba = CEikButtonGroupContainer::Current();
+            if ( cba )
+                {
+                cba->MakeCommandVisibleByPosition(
+                        CEikButtonGroupContainer::EMiddleSoftkeyPosition,
+                        aVisible );
+                iMskVisible = aVisible; // Visibility has been changed
+                }
+            }
+
+        iCustomMsk = ETrue; // Field has modified editor default MSK
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::HandleLongtapEventL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CESMRField::HandleLongtapEventL( const TPoint& /*aPosition*/ )
+    {
+    FUNC_LOG;
+    // Default action for long tap event.
+    ExecuteGenericCommandL( EESMRCmdLongtapDetected );
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::HandleSingletapEventL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TBool CESMRField::HandleSingletapEventL( const TPoint& /*aPosition*/ )
+    {
+    FUNC_LOG;
+    // Subclasses may override for field specific actions
+    return EFalse;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::HandleRawPointerEventL
+// Default implementation for pointer event handling in field
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TBool CESMRField::HandleRawPointerEventL(
+        const TPointerEvent& aPointerEvent )
+    {
+    FUNC_LOG;
+
+    if ( aPointerEvent.iType == TPointerEvent::EButton1Up )
+        {
+		// Default action for touch release
+		if ( !ExecuteGenericCommandL( EAknCmdOpen ) )
+			{
+			// If the base class implementation does not use the command
+			// then the pointer event is propagated to children.
+			CCoeControl::HandlePointerEventL( aPointerEvent );
+			}
+        }
+    else
+        {
+        // Propagate the pointer event to child components
+        CCoeControl::HandlePointerEventL( aPointerEvent );
+        }
+
+    return ETrue;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::HandleFieldEventL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CESMRField::HandleFieldEventL( const MESMRFieldEvent& aEvent )
+    {
+    FUNC_LOG;
+    if ( aEvent.Type() == MESMRFieldEvent::EESMRFieldCommandEvent )
+        {
+        TInt* command = static_cast<TInt*>( aEvent.Param( 0 ) );
+        if ( EESMRCmdSizeExceeded != *command )
+        	{
+            ExecuteGenericCommandL( *command );
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::EventObserver
+// ---------------------------------------------------------------------------
+//
+EXPORT_C MESMRFieldEventObserver* CESMRField::EventObserver() const
+    {
+    FUNC_LOG;
+    return const_cast< CESMRField* >( this );
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::SetFieldMode
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CESMRField::SetFieldMode( TESMRFieldMode aMode )
+    {
+    FUNC_LOG;
+    iFieldMode = aMode;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::FieldMode
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TESMRFieldMode CESMRField::FieldMode() const
+    {
+    FUNC_LOG;
+    return iFieldMode;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::SetFieldViewMode
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CESMRField::SetFieldViewMode( TESMRFieldType aViewMode )
+    {
+    FUNC_LOG;
+    iFieldViewMode = aViewMode;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::FieldViewMode
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TESMRFieldType CESMRField::FieldViewMode() const
+    {
+    FUNC_LOG;
+    return iFieldViewMode;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::UpdateExtControlL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CESMRField::UpdateExtControlL(
+             CCoeControl* aControl )
+    {
+    FUNC_LOG;
+    delete iExtControl;
+    iExtControl = aControl;
+
+    // Set also container window
+    iExtControl->SetContainerWindowL( *this );
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::Lock
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CESMRField::LockL()
+	{
+    FUNC_LOG;
+	iLocked = ETrue;
+	}
+
+// ---------------------------------------------------------------------------
+// CESMRField::IsLocked
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TBool CESMRField::IsLocked()
+	{
+    FUNC_LOG;
+	return iLocked;
+	}
+
+// ---------------------------------------------------------------------------
+// CESMRField::SupportsLongTapFunctionalityL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TBool CESMRField::SupportsLongTapFunctionalityL(
+		const TPointerEvent& /*aPointerEvent*/ )
+	{
+    FUNC_LOG;
+    // Subclasses may override for field specific actions
+	return EFalse;
+	}
+
+// ---------------------------------------------------------------------------
+// CESMRField::MoveToScreen
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CESMRField::MoveToScreen( TBool aVisible )
+    {
+    FUNC_LOG
+
+    // Check that field is activated
+    if ( IsActivated() )
+        {
+        TPoint pos( Position() );
+
+        if ( aVisible )
+            {
+            // Set x coordinate to parent (field container) x coordinate
+            pos.iX = Parent()->Position().iX;
+            }
+        else
+            {
+            // Move field outside screen
+            pos.iX = KOffScreenPositionX;
+            // Record field drawing commands
+            RecordField();
+            }
+
+        if ( pos != Position() )
+            {
+            // Set new position only if it different from current one
+            // Setting new position potentially causes relayout in field
+            SetPosition( pos );
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::HandleTactileFeedbackL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CESMRField::HandleTactileFeedbackL()
+    {
+    FUNC_LOG;
+
+    AquireTactileFeedback();
+
+    if ( iTactileFeedback && iTactileFeedback->FeedbackEnabledForThisApp() )
+        {
+        iTactileFeedback->InstantFeedback( ETouchFeedbackBasic );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::AquireTactileFeedback
+// ---------------------------------------------------------------------------
+//
+void CESMRField::AquireTactileFeedback()
+    {
+	if( !iTactileFeedback )
+		{
+		// Aquire tactile feedback pointer from TLS
+		iTactileFeedback = MTouchFeedback::Instance();
+		}
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::RecordField
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CESMRField::RecordField()
+    {
+    FUNC_LOG;
+
+    // Record only activated field
+    if ( IsActivated() )
+        {
+        // Purge old draw commands
+        iRecordingGc->PurgeBuffer();
+
+        // Set recording graphics context to be used for drawing
+        SetCustomGc( iRecordingGc );
+
+        // Set gc origin to point (-x,-y)
+        // This will cause drawing commands to be relative to point (0,0)
+        iRecordingGc->SetOrigin( -iPosition );
+
+        // Draw custom background if available
+        const MCoeControlBackground* bg = Background();
+        if ( bg )
+            {
+            bg->Draw( *iRecordingGc, *this, Rect() );
+            }
+
+        // Draw child controls
+        DrawControl( this );
+
+        // Reset custom gc
+        SetCustomGc( NULL );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRField::DrawControl
+// ---------------------------------------------------------------------------
+//
+void CESMRField::DrawControl( CCoeControl* aControl ) const
+    {
+    TInt count( aControl->CountComponentControls() );
+
+    for ( TInt i = 0; i < count; ++i )
+        {
+        CCoeControl* control = aControl->ComponentControl( i );
+
+        // Draw only non-window owning children
+        if ( !control->OwnsWindow() )
+            {
+            TRect rect( control->Rect() );
+
+            // Draw control background if available
+            const MCoeControlBackground* bg = control->Background();
+            if ( bg )
+                {
+                bg->Draw( *iRecordingGc, *control, rect );
+                }
+
+            // Draw control foreground
+            control->DrawForeground( rect );
+
+            // Draw child components
+            DrawControl( control );
+            }
+        }
+    }
+
+// EOF
+