--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrtimefield.cpp Thu Dec 17 08:39:21 2009 +0200
@@ -0,0 +1,748 @@
+/*
+* Copyright (c) 2007-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 time (start-end) field implementation
+ *
+*/
+
+#include "emailtrace.h"
+#include "cesmrtimefield.h"
+
+#include <eikmfne.h>
+#include <avkon.hrh>
+#include <eiklabel.h>
+#include <AknUtils.h>
+#include <AknsFrameBackgroundControlContext.h>
+#include <AknsDrawUtils.h>
+
+#include "mesmrfieldvalidator.h"
+#include "cesmrglobalnote.h"
+//<cmail>
+#include "esmrdef.h"
+//</cmail>
+#include "esmrfieldbuilderdef.h"
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CESMRTimeField::CESMRTimeField
+// ---------------------------------------------------------------------------
+//
+CESMRTimeField::CESMRTimeField( )
+ {
+ FUNC_LOG;
+ // do nothing
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRTimeField::~CESMRTimeField
+// ---------------------------------------------------------------------------
+//
+CESMRTimeField::~CESMRTimeField( )
+ {
+ FUNC_LOG;
+ // iContainer is deleted by framework
+ // do nothing
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRTimeField::NewL
+// ---------------------------------------------------------------------------
+//
+CESMRTimeField* CESMRTimeField::NewL(
+ MESMRFieldValidator* aValidator )
+ {
+ FUNC_LOG;
+ CESMRTimeField* self = new (ELeave) CESMRTimeField;
+ CleanupStack::PushL ( self );
+ self->ConstructL ( aValidator );
+ CleanupStack::Pop ( self );
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRTimeField::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CESMRTimeField::ConstructL(
+ MESMRFieldValidator* aValidator )
+ {
+ FUNC_LOG;
+ SetFieldId ( EESMRFieldMeetingTime );
+ iContainer =
+ CTimeContainer::NewL(
+ aValidator,
+ this,
+ EESMRFieldMeetingTime );
+
+ CESMRIconField::ConstructL(
+ KAknsIIDQgnMeetReqIndiClock,
+ iContainer );
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRTimeField::SetContainerWindowL
+// ---------------------------------------------------------------------------
+//
+void CESMRTimeField::SetContainerWindowL(
+ const CCoeControl& aControl )
+ {
+ FUNC_LOG;
+ CCoeControl::SetContainerWindowL ( aControl );
+ if ( iContainer )
+ {
+ iContainer->SetContainerWindowL ( aControl );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRTimeField::OfferKeyEventL
+// ---------------------------------------------------------------------------
+//
+TKeyResponse CESMRTimeField::OfferKeyEventL(
+ const TKeyEvent& aEvent,
+ TEventCode aType )
+ {
+ FUNC_LOG;
+ TKeyResponse response( EKeyWasNotConsumed);
+ if ( iContainer )
+ {
+ response = iContainer->OfferKeyEventL ( aEvent, aType );
+ }
+ return response;
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRTimeField::InitializeL
+// ---------------------------------------------------------------------------
+//
+void CESMRTimeField::InitializeL()
+ {
+ FUNC_LOG;
+ if ( iContainer )
+ {
+ iContainer->SetFontL( iLayout->Font ( iCoeEnv, iFieldId ), iLayout );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRTimeField::OkToLoseFocusL
+// ---------------------------------------------------------------------------
+//
+TBool CESMRTimeField::OkToLoseFocusL(
+ TESMREntryFieldId aNext )
+ {
+ FUNC_LOG;
+ if ( iContainer )
+ {
+ return iContainer->OkToLoseFocusL ( FieldId ( ), aNext );
+ }
+ return EFalse;
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRTimeField::SetOutlineFocusL
+// ---------------------------------------------------------------------------
+//
+void CESMRTimeField::SetOutlineFocusL( TBool aFocus )
+ {
+ FUNC_LOG;
+ CESMRField::SetOutlineFocusL ( aFocus );
+ if ( aFocus )
+ {
+ ChangeMiddleSoftKeyL(EESMRCmdSaveMR,R_QTN_MSK_SAVE);
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CTimeContainer::CTimeContainer
+// ---------------------------------------------------------------------------
+//
+CTimeContainer::CTimeContainer(
+ MESMRFieldValidator* aValidator,
+ TESMREntryFieldId aFieldId ) :
+ iValidator(aValidator),
+ iFieldId( aFieldId )
+ {
+ FUNC_LOG;
+ // do nothing
+ }
+
+// ---------------------------------------------------------------------------
+// CTimeContainer::~CTimeContainer
+// ---------------------------------------------------------------------------
+//
+CTimeContainer::~CTimeContainer( )
+ {
+ FUNC_LOG;
+ delete iStartTime;
+ delete iEndTime;
+ delete iSeparator;
+ delete iStartTimeBgContext;
+ delete iEndTimeBgContext;
+ }
+
+// ---------------------------------------------------------------------------
+// CTimeContainer::NewL
+// ---------------------------------------------------------------------------
+//
+CTimeContainer* CTimeContainer::NewL(
+ MESMRFieldValidator* aValidator,
+ CCoeControl* aParent,
+ TESMREntryFieldId aFieldId )
+ {
+ FUNC_LOG;
+ CTimeContainer* self =
+ new (ELeave) CTimeContainer( aValidator, aFieldId );
+ CleanupStack::PushL ( self );
+ self->ConstructL ( aParent );
+ CleanupStack::Pop ( self );
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CTimeContainer::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CTimeContainer::ConstructL(
+ CCoeControl* /*aParent*/)
+ {
+ FUNC_LOG;
+ TTime startTime;
+ startTime.UniversalTime ( );
+
+ iStartTime = new (ELeave) CEikTimeEditor;
+ iEndTime = new (ELeave) CEikTimeEditor;
+ iSeparator = new (ELeave) CEikLabel;
+
+ iStartTime->ConstructL ( TTIME_TIMEFIELDMINIMUMDATE,
+ TTIME_TIMEFIELDMAXIMUMDATE,
+ startTime,
+ EEikTimeWithoutSecondsField );
+
+ iEndTime->ConstructL ( TTIME_TIMEFIELDMINIMUMDATE,
+ TTIME_TIMEFIELDMAXIMUMDATE,
+ startTime,
+ EEikTimeWithoutSecondsField );
+
+ iBackground = AknsDrawUtils::ControlContext( this );
+
+ TInt align = CESMRLayoutManager::IsMirrored ( ) ? EAknEditorAlignRight
+ : EAknEditorAlignLeft;
+ iStartTime->SetMfneAlignment ( align );
+ iEndTime->SetMfneAlignment ( align );
+
+ iSeparator->SetTextL ( KTimeFieldSeparator );
+
+ if ( iValidator )
+ {
+ iValidator->SetStartTimeFieldL( *iStartTime );
+ iValidator->SetEndTimeFieldL( *iEndTime );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CTimeContainer::SetContainerWindowL
+// ---------------------------------------------------------------------------
+//
+void CTimeContainer::SetContainerWindowL(
+ const CCoeControl& aControl )
+ {
+ FUNC_LOG;
+ CCoeControl::SetContainerWindowL ( aControl );
+ iStartTime->SetContainerWindowL ( aControl );
+ iEndTime->SetContainerWindowL ( aControl );
+ }
+
+// ---------------------------------------------------------------------------
+// CTimeContainer::CountComponentControls
+// ---------------------------------------------------------------------------
+//
+TInt CTimeContainer::CountComponentControls() const
+ {
+ FUNC_LOG;
+ TInt count( 0);
+
+ if ( iStartTime )
+ {
+ ++count;
+ }
+
+ if ( iSeparator )
+ {
+ ++count;
+ }
+
+ if ( iEndTime )
+ {
+ ++count;
+ }
+
+ return count;
+ }
+
+// ---------------------------------------------------------------------------
+// CTimeContainer::ComponentControl
+// ---------------------------------------------------------------------------
+//
+CCoeControl* CTimeContainer::ComponentControl(
+ TInt aInd ) const
+ {
+ FUNC_LOG;
+ switch ( aInd )
+ {
+ case 0:
+ return iStartTime;
+ case 1:
+ return iSeparator;
+ case 2:
+ return iEndTime;
+ default:
+ return NULL;
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// CTimeContainer::PositionChanged()
+// ---------------------------------------------------------------------------
+//
+void CTimeContainer::PositionChanged()
+ {
+ FUNC_LOG;
+ CCoeControl::PositionChanged();
+ if( iStartTimeBgContext )
+ {
+ iStartTimeBgContext->SetFrameRects(
+ iStartTime->Rect(),
+ iStartTime->Rect() );
+ }
+
+ if( iEndTimeBgContext )
+ {
+ iEndTimeBgContext->SetFrameRects(
+ iEndTime->Rect(),
+ iEndTime->Rect() );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CTimeContainer::SizeChanged
+// ---------------------------------------------------------------------------
+//
+void CTimeContainer::SizeChanged()
+ {
+ FUNC_LOG;
+ TInt x = CESMRLayoutManager::IsMirrored ( ) ? Rect().iBr.iX : Rect().iTl.iX;
+ TPoint p( x, Rect().iTl.iY);
+
+ TSize editorSize;
+ TSize separatorSize;
+
+ editorSize = iStartTime->MinimumSize();
+ editorSize.iHeight = Rect().Height();
+
+ separatorSize = iSeparator->MinimumSize();
+ separatorSize.iHeight = Rect().Height();
+
+ iStartTime->SetBorder( TGulBorder::ENone );
+ iEndTime->SetBorder( TGulBorder::ENone );
+
+ if ( CESMRLayoutManager::IsMirrored ( ) )
+ {
+ p.iX -= editorSize.iWidth;
+ iStartTime->SetExtent ( p, editorSize );
+
+ p.iX -= separatorSize.iWidth;
+ iSeparator->SetExtent ( p, separatorSize );
+
+ p.iX -= editorSize.iWidth;
+ iEndTime->SetExtent ( p, editorSize );
+ }
+ else
+ {
+ iStartTime->SetExtent ( p, editorSize );
+ p.iX += editorSize.iWidth;
+
+ iSeparator->SetExtent ( p, separatorSize );
+ p.iX += separatorSize.iWidth;
+
+ iEndTime->SetExtent ( p, editorSize );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CTimeContainer::OfferKeyEventL
+// ---------------------------------------------------------------------------
+//
+TKeyResponse CTimeContainer::OfferKeyEventL(
+ const TKeyEvent& aEvent,
+ TEventCode aType )
+ {
+ FUNC_LOG;
+ TBool startFocusedBefore( iStartTime->IsFocused() );
+ TInt startIndex( iStartTime->CurrentField() );
+
+ TBool endFocusedBefore( iEndTime->IsFocused() );
+ TInt endIndex( iEndTime->CurrentField() );
+
+ TKeyResponse response = EKeyWasNotConsumed;
+ if ( aType == EEventKey )
+ {
+ switch ( aEvent.iScanCode )
+ {
+ case EStdKeyLeftArrow:
+ response = ChangeFocusLeftL( aEvent, aType );
+ break;
+
+ case EStdKeyRightArrow:
+ response = ChangeFocusRightL( aEvent, aType );
+ break;
+
+ default: // other events than left/right arrows
+ {
+ response = FocusedEditor()->OfferKeyEventL( aEvent, aType );
+ }
+ break;
+ }
+ }
+
+ if ( EKeyWasConsumed == response )
+ {
+ CheckIfValidatingNeededL(
+ startFocusedBefore,
+ startIndex,
+ endFocusedBefore,
+ endIndex );
+ }
+
+ return response;
+ }
+
+// ---------------------------------------------------------------------------
+// CTimeContainer::FocusChanged
+// ---------------------------------------------------------------------------
+//
+void CTimeContainer::FocusChanged(
+ TDrawNow /*aDrawNow*/)
+ {
+ FUNC_LOG;
+ if ( IsFocused ( ) ) // if focus is gained
+ {
+ iStartTime->SetFocus ( ETrue );
+ }
+ else
+ {
+ if ( iStartTime->IsFocused() )
+ {
+ iStartTime->SetFocus( EFalse, EDrawNow );
+ }
+
+ if ( iEndTime->IsFocused() )
+ {
+ iEndTime->SetFocus( EFalse, EDrawNow );
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CTimeContainer::SetFont
+// ---------------------------------------------------------------------------
+//
+void CTimeContainer::SetFontL(
+ const CFont* aFont,
+ CESMRLayoutManager* aLayout )
+ {
+ FUNC_LOG;
+ iLayout = aLayout;
+
+ iStartTime->SetFont ( aFont );
+ iSeparator->SetFont ( aFont );
+ iEndTime->SetFont ( aFont );
+
+ iStartTime->SetSkinTextColorL( aLayout->NormalTextColorID() );
+ iEndTime->SetSkinTextColorL( aLayout->NormalTextColorID() );
+
+ AknLayoutUtils::OverrideControlColorL ( *iSeparator, EColorLabelText,
+ aLayout->NormalTextColor() );
+ }
+
+// ---------------------------------------------------------------------------
+// CTimeContainer::FocusedEditor
+// ---------------------------------------------------------------------------
+//
+CEikTimeEditor* CTimeContainer::FocusedEditor( )
+ {
+ FUNC_LOG;
+ return iStartTime->IsFocused ( ) ? iStartTime : iEndTime;
+ }
+
+// ---------------------------------------------------------------------------
+// CTimeContainer::OkToLoseFocusL
+// ---------------------------------------------------------------------------
+//
+TBool CTimeContainer::OkToLoseFocusL(
+ TESMREntryFieldId /*aFrom*/,
+ TESMREntryFieldId /*aTo*/ )
+ {
+ FUNC_LOG;
+ // validate the current time
+ FocusedEditor()->PrepareForFocusLossL();
+
+ if ( iStartTime->IsFocused() )
+ {
+ TriggerStartTimeChangedL();
+ }
+ else
+ {
+ TriggerEndTimeChangedL();
+ }
+
+ return ETrue;
+ }
+
+// ---------------------------------------------------------------------------
+// CTimeContainer::ActivateL
+// ---------------------------------------------------------------------------
+//
+void CTimeContainer::ActivateL()
+ {
+ FUNC_LOG;
+ CCoeControl::ActivateL();
+ TRect rect(TPoint(iStartTime->Position()), iStartTime->Size());
+ TRect inner(rect);
+ TRect outer(rect);
+
+ delete iStartTimeBgContext;
+ delete iEndTimeBgContext;
+ iStartTimeBgContext = NULL;
+ iEndTimeBgContext = NULL;
+
+ iStartTimeBgContext =
+ CAknsFrameBackgroundControlContext::NewL(
+ KAknsIIDQsnFrInput,
+ outer,
+ inner,
+ EFalse ) ;
+
+ rect.SetRect( iEndTime->Position(), iEndTime->Size());
+ inner = rect;
+ iEndTimeBgContext =
+ CAknsFrameBackgroundControlContext::NewL(
+ KAknsIIDQsnFrInput,
+ outer,
+ inner,
+ EFalse ) ;
+
+ iStartTimeBgContext->SetParentContext( iBackground );
+ iEndTimeBgContext->SetParentContext( iBackground );
+ iStartTime->SetSkinBackgroundControlContextL(iStartTimeBgContext);
+ iEndTime->SetSkinBackgroundControlContextL(iEndTimeBgContext);
+ }
+
+// ---------------------------------------------------------------------------
+// CTimeContainer::ChangeFocusRightL
+// ---------------------------------------------------------------------------
+//
+TKeyResponse CTimeContainer::ChangeFocusRightL(const TKeyEvent& aEvent,
+ TEventCode aType )
+ {
+ FUNC_LOG;
+ TKeyResponse response = EKeyWasNotConsumed;
+
+ if ( iStartTime->IsFocused ( ) )
+ {
+ // if the focus is in the last field of start time, move focus
+ // to end times first field.
+ TInt current = iStartTime->CurrentField();
+ TInt count = iStartTime->NumFields();
+ if ( current == (count - 1) )
+ {
+ iStartTime->SetFocus( EFalse, EDrawNow );
+ iEndTime->SetFocus( ETrue, EDrawNow );
+ response = EKeyWasConsumed;
+ }
+ else
+ {
+ response = iStartTime->OfferKeyEventL ( aEvent, aType );
+ }
+ TriggerStartTimeChangedL();
+ }
+
+ else if ( iEndTime->IsFocused ( ) )
+ {
+ if ( iEndTime->CurrentField() == (iEndTime->NumFields() - 1) )
+ {
+ iEndTime->SetFocus ( EFalse, EDrawNow );
+ iStartTime->SetFocus ( ETrue, EDrawNow );
+ response = EKeyWasConsumed;
+ }
+ else
+ {
+ response = iEndTime->OfferKeyEventL ( aEvent, aType );
+ }
+ TriggerEndTimeChangedL();
+ }
+ return response;
+ }
+
+// ---------------------------------------------------------------------------
+// CTimeContainer::ChangeFocusLeftL
+// ---------------------------------------------------------------------------
+//
+TKeyResponse CTimeContainer::ChangeFocusLeftL(
+ const TKeyEvent& aEvent,
+ TEventCode aType )
+ {
+ FUNC_LOG;
+ TKeyResponse response = EKeyWasNotConsumed;
+ if ( iStartTime->IsFocused ( ) )
+ {
+ // if the focus is in the first field of start time, move focus
+ // to end times last field.
+ if ( iStartTime->CurrentField ( )== 0 )
+ {
+ iStartTime->SetFocus ( EFalse, EDrawNow );
+ iEndTime->SetFocus ( ETrue, EDrawNow );
+ // last item should highlighted, API does not export the highlight
+ // function, so emulate key presses
+ response = iEndTime->OfferKeyEventL ( aEvent, aType );
+ }
+ else
+ {
+ response = iStartTime->OfferKeyEventL ( aEvent, aType );
+ }
+ TriggerStartTimeChangedL();
+ }
+
+ else if ( iEndTime->IsFocused ( ) )
+ {
+ if ( iEndTime->CurrentField ( )== 0 )
+ {
+ iEndTime->SetFocus ( EFalse, EDrawNow );
+ iStartTime->SetFocus ( ETrue, EDrawNow );
+ // last item should highlighted, API does not export the highlight
+ // function, so emulate key presses
+ response = iStartTime->OfferKeyEventL ( aEvent, aType );
+ }
+ else
+ {
+ response = iEndTime->OfferKeyEventL ( aEvent, aType );
+ }
+
+ TriggerEndTimeChangedL();
+ }
+ return response;
+ }
+
+// ---------------------------------------------------------------------------
+// CTimeContainer::CheckIfValidatingNeededL
+// ---------------------------------------------------------------------------
+//
+void CTimeContainer::CheckIfValidatingNeededL(
+ TBool aStartFocusedBefore,
+ TInt aStartFieldIndex,
+ TBool aEndFocusedBefore,
+ TInt aEndFieldIndex )
+ {
+ FUNC_LOG;
+ TBool startFocusedAfter( iStartTime->IsFocused() );
+ TBool endFocusedAfter( iEndTime->IsFocused() );
+
+ if ( aStartFocusedBefore != startFocusedAfter )
+ {
+ if ( startFocusedAfter )
+ {
+ TriggerEndTimeChangedL();
+ }
+ else
+ {
+ TriggerStartTimeChangedL();
+ }
+ }
+
+ else if ( startFocusedAfter &&
+ aStartFocusedBefore == startFocusedAfter )
+ {
+ TInt fieldIndex( iStartTime->CurrentField() );
+ if ( fieldIndex != aStartFieldIndex )
+ {
+ TriggerStartTimeChangedL();
+ }
+ }
+
+ else if ( endFocusedAfter &&
+ aEndFocusedBefore == endFocusedAfter )
+ {
+ TInt fieldIndex( iEndTime->CurrentField() );
+ if ( fieldIndex != aEndFieldIndex )
+ {
+ TriggerEndTimeChangedL();
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CTimeContainer::TriggerStartTimeChangedL
+// ---------------------------------------------------------------------------
+//
+void CTimeContainer::TriggerStartTimeChangedL()
+ {
+ FUNC_LOG;
+ if ( iValidator )
+ {
+ TRAPD( err, iValidator->StartTimeChangedL() );
+ if ( err != KErrNone )
+ {
+ switch ( err )
+ {
+ case KErrOverflow:
+ CESMRGlobalNote::ExecuteL(
+ CESMRGlobalNote::EESMRRepeatReSchedule );
+ break;
+ }
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CTimeContainer::TriggerEndTimeChangedL
+// ---------------------------------------------------------------------------
+//
+void CTimeContainer::TriggerEndTimeChangedL()
+ {
+ FUNC_LOG;
+ if ( iValidator )
+ {
+ TRAPD( err, iValidator->EndTimeChangedL() );
+ if ( err != KErrNone )
+ {
+ switch ( err )
+ {
+ case KErrArgument:
+ // Assuming that end date is different
+ // and this is repeating entry
+ CESMRGlobalNote::ExecuteL(
+ CESMRGlobalNote::EESMRRepeatDifferentStartAndEndDate );
+ break;
+ case KErrOverflow:
+ CESMRGlobalNote::ExecuteL(
+ CESMRGlobalNote::EESMRRepeatReSchedule );
+ break;
+ }
+ }
+ }
+ }
+
+// EOF
+