--- /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
+