diff -r d189ee25cf9d -r 3533d4323edc meetingrequest/mrgui/mrfieldbuildercommon/src/cesmrfield.cpp --- /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 +#include +#include +#include +#include +#include +#include + +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( 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 +