meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrtimefield.cpp
branchRCL_3
changeset 12 4ce476e64c59
parent 0 8466d47a6819
--- a/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrtimefield.cpp	Mon Mar 15 12:39:10 2010 +0200
+++ b/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrtimefield.cpp	Wed Mar 31 21:08:33 2010 +0300
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). 
+* 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"
@@ -15,22 +15,21 @@
  *
 */
 
-#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"
+#include "cmrtimecontainer.h"
 //<cmail>
 #include "esmrdef.h"
 //</cmail>
-#include "esmrfieldbuilderdef.h"
+#include "cmrimage.h"
+#include "nmrlayoutmanager.h"
+
+// DEBUG
+#include "emailtrace.h"
+
+namespace // codescanner::namespace
+    {
+    const TInt KFieldComponentCount( 2 );
+    } // unnamed namespace
 
 // ======== MEMBER FUNCTIONS ========
 
@@ -41,7 +40,8 @@
 CESMRTimeField::CESMRTimeField( )
     {
     FUNC_LOG;
-    // do nothing
+    SetFieldId ( EESMRFieldMeetingTime );
+    SetFocusType( EESMRHighlightFocus );
     }
 
 // ---------------------------------------------------------------------------
@@ -52,7 +52,7 @@
     {
     FUNC_LOG;
     // iContainer is deleted by framework
-    // do nothing
+    delete iFieldIcon;
     }
 
 // ---------------------------------------------------------------------------
@@ -78,16 +78,17 @@
         MESMRFieldValidator* aValidator )
     {
     FUNC_LOG;
-    SetFieldId ( EESMRFieldMeetingTime );
+    CCoeControl::SetComponentsToInheritVisibility( ETrue );
     iContainer =
-            CTimeContainer::NewL(
+            CMRTimeContainer::NewL(
                     aValidator,
                     this,
                     EESMRFieldMeetingTime );
+    // This is taking ownership
+    CESMRField::ConstructL( iContainer );
 
-    CESMRIconField::ConstructL(
-            KAknsIIDQgnMeetReqIndiClock,
-            iContainer );
+    iFieldIcon = CMRImage::NewL( NMRBitmapManager::EMRBitmapClock );
+    iFieldIcon->SetParent( this );
     }
 
 // ---------------------------------------------------------------------------
@@ -102,6 +103,12 @@
     if ( iContainer )
         {
         iContainer->SetContainerWindowL ( aControl );
+        iContainer->SetParent( this );
+        }
+    if ( iFieldIcon )
+        {
+        iFieldIcon->SetContainerWindowL( aControl );
+        iFieldIcon->SetParent( this );
         }
     }
 
@@ -123,19 +130,6 @@
     }
 
 // ---------------------------------------------------------------------------
-// CESMRTimeField::InitializeL
-// ---------------------------------------------------------------------------
-//
-void CESMRTimeField::InitializeL()
-    {
-    FUNC_LOG;
-    if ( iContainer )
-        {
-        iContainer->SetFontL( iLayout->Font ( iCoeEnv, iFieldId ), iLayout );
-        }
-    }
-
-// ---------------------------------------------------------------------------
 // CESMRTimeField::OkToLoseFocusL
 // ---------------------------------------------------------------------------
 //
@@ -165,584 +159,95 @@
     }
 
 // ---------------------------------------------------------------------------
-// CTimeContainer::CTimeContainer
-// ---------------------------------------------------------------------------
-//
-CTimeContainer::CTimeContainer(
-        MESMRFieldValidator* aValidator,
-        TESMREntryFieldId aFieldId  ) :
-    iValidator(aValidator),
-    iFieldId( aFieldId )
-    {
-    FUNC_LOG;
-    // do nothing
-    }
-
-// ---------------------------------------------------------------------------
-// CTimeContainer::~CTimeContainer
+// CESMRTimeField::SetValidatorL
 // ---------------------------------------------------------------------------
 //
-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 )
+void CESMRTimeField::SetValidatorL( MESMRFieldValidator* aValidator )
     {
     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 );
+    
+    // Update iValidator member
+    CESMRField::SetValidatorL( aValidator );
     
-    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 )
+    if ( iContainer )
         {
-        iValidator->SetStartTimeFieldL( *iStartTime );
-        iValidator->SetEndTimeFieldL( *iEndTime );
+        iContainer->SetValidatorL( iValidator );
         }
     }
 
 // ---------------------------------------------------------------------------
-// CTimeContainer::SetContainerWindowL
+// CESMRTimeField::SizeChanged()
 // ---------------------------------------------------------------------------
 //
-void CTimeContainer::SetContainerWindowL(
-        const CCoeControl& aControl )
+TBool CESMRTimeField::ExecuteGenericCommandL( TInt aCommand )
     {
     FUNC_LOG;
-    CCoeControl::SetContainerWindowL ( aControl );
-    iStartTime->SetContainerWindowL ( aControl );
-    iEndTime->SetContainerWindowL ( aControl );
+    
+    TBool retValue( EFalse );
+    
+    if ( iContainer && EMRCmdDoEnvironmentChange == aCommand )
+        {
+        iContainer->EnvironmentChangedL();
+        SizeChanged();
+        DrawDeferred();
+    
+        retValue = ETrue;
+        }
+    
+    return retValue;
     }
 
 // ---------------------------------------------------------------------------
-// CTimeContainer::CountComponentControls
+// CESMRTimeField::SizeChanged()
 // ---------------------------------------------------------------------------
 //
-TInt CTimeContainer::CountComponentControls() const
+void CESMRTimeField::SizeChanged()
     {
-    FUNC_LOG;
-    TInt count( 0);
-
-    if ( iStartTime )
-        {
-        ++count;
-        }
+    TRect rect( Rect() );
+    TAknLayoutRect iconLayout = 
+        NMRLayoutManager::GetLayoutRect( 
+                rect, NMRLayoutManager::EMRLayoutTimeEditorIcon );
+    TRect iconRect( iconLayout.Rect() );
+    iFieldIcon->SetRect( iconRect );
+    
+    TAknLayoutRect bgLayoutRect = 
+        NMRLayoutManager::GetLayoutRect( 
+                rect, NMRLayoutManager::EMRLayoutTextEditorBg );
+    TRect bgRect( bgLayoutRect.Rect() );
+    // Move focus rect so that it's relative to field's position.
+    bgRect.Move( -Position() );
+    SetFocusRect( bgRect );
+    
+    iContainer->SetRect( rect );    
+    iContainer->SetBgRect( bgRect );
+    }
 
-    if ( iSeparator )
-        {
-        ++count;
-        }
-
-    if ( iEndTime )
-        {
-        ++count;
-        }
-
+// ---------------------------------------------------------------------------
+// CESMRTimeField::CountComponentControls()
+// ---------------------------------------------------------------------------
+//
+TInt CESMRTimeField::CountComponentControls() const
+    {
+    TInt count( KFieldComponentCount );
     return count;
     }
 
 // ---------------------------------------------------------------------------
-// CTimeContainer::ComponentControl
+// CESMRTimeField::ComponentControl()
 // ---------------------------------------------------------------------------
 //
-CCoeControl* CTimeContainer::ComponentControl(
-        TInt aInd ) const
+CCoeControl* CESMRTimeField::ComponentControl( TInt aIndex ) const
     {
-    FUNC_LOG;
-    switch ( aInd )
+    switch ( aIndex )
         {
         case 0:
-            return iStartTime;
+            return iFieldIcon;
         case 1:
-            return iSeparator;
-        case 2:
-            return iEndTime;
+            return iContainer;
         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