--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrrecurencefield.cpp Wed Sep 01 12:28:57 2010 +0100
@@ -0,0 +1,389 @@
+/*
+* 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 Recurrence field implementation
+ *
+*/
+
+#include "emailtrace.h"
+#include "cesmrrecurencefield.h"
+#include "cesmrrecurrence.h"
+#include "mesmrlistobserver.h"
+#include "cesmrlistquery.h"
+#include "mesmrmeetingrequestentry.h"
+#include "mesmrfieldvalidator.h"
+#include "cesmrglobalnote.h"
+#include "nmrlayoutmanager.h"
+#include "cmrimage.h"
+#include "cmrlabel.h"
+
+#include <barsread.h>
+#include <esmrgui.rsg>
+//<cmail>
+#include "esmrdef.h"
+//</cmail>
+
+
+// Unnamed namespace for local definitions
+namespace { // codescanner::namespace
+
+#ifdef _DEBUG
+
+/** Panic code literal */
+_LIT( KESMRRecurenceFieldPanicTxt, "ESMRRecurenceField" );
+
+/** Panic code enumeration */
+enum TESMRRecurenceFieldPanic
+ {
+ /** Observer is not set */
+ EESMRRecurenceFieldNoObserver = 0
+ };
+
+/**
+ * Raises system panic.
+ * @param aPanic CESMRRecurenceField panic code.
+ */
+void Panic( TESMRRecurenceFieldPanic aPanic )
+ {
+ User::Panic( KESMRRecurenceFieldPanicTxt, aPanic );
+ }
+
+#endif // DEBUG
+
+ }
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CESMRRecurrenceField::CESMRRecurrenceField
+// ---------------------------------------------------------------------------
+//
+CESMRRecurenceField::CESMRRecurenceField( MESMRFieldValidator* aValidator )
+ : iIndex( 0 )
+ {
+ FUNC_LOG;
+
+ iValidator = aValidator;
+
+ SetFieldId ( EESMRFieldRecurrence );
+ SetFocusType( EESMRHighlightFocus );
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRRecurrenceField::~CESMRRecurrenceField
+// ---------------------------------------------------------------------------
+//
+CESMRRecurenceField::~CESMRRecurenceField( )
+ {
+ FUNC_LOG;
+ iArray.ResetAndDestroy();
+ iArray.Close();
+
+ delete iFieldIcon;
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRRecurrenceField::NewL
+// ---------------------------------------------------------------------------
+//
+CESMRRecurenceField* CESMRRecurenceField::NewL(
+ MESMRFieldValidator* aValidator )
+ {
+ FUNC_LOG;
+ CESMRRecurenceField* self =
+ new( ELeave )CESMRRecurenceField( aValidator );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRRecurrenceField::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CESMRRecurenceField::ConstructL( )
+ {
+ FUNC_LOG;
+ iRecurrence = CMRLabel::NewL();
+ iRecurrence->SetParent( this );
+ CESMRField::ConstructL( iRecurrence );
+
+ iRecurrence->SetTextL( KNullDesC() );
+
+ iFieldIcon = CMRImage::NewL( NMRBitmapManager::EMRBitmapRecurrence );
+ iFieldIcon->SetParent( this );
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRRecurrenceField::InternalizeL
+// ---------------------------------------------------------------------------
+//
+void CESMRRecurenceField::InternalizeL( MESMRCalEntry& aEntry )
+ {
+ FUNC_LOG;
+ if ( aEntry.CanSetRecurrenceL() )
+ {
+ CCoeEnv* env = CCoeEnv::Static ( );
+ TResourceReader reader;
+ env->CreateResourceReaderLC( reader, R_ESMREDITOR_RECURRENCE );
+
+ TESMRRecurrenceValue recurrenceVal;
+ TTime until;
+ aEntry.GetRecurrenceL(recurrenceVal, until );
+
+ iArray.ResetAndDestroy( );
+ TInt count = reader.ReadInt16 ( );
+ for (TInt i(0); i < count; ++i )
+ {
+ CESMRRecurrence* recurrence = new (ELeave) CESMRRecurrence;
+ CleanupStack::PushL( recurrence );
+ recurrence->ConstructFromResourceL( env, reader );
+ iArray.AppendL( recurrence );
+ CleanupStack::Pop( recurrence );
+ // set default recurrence
+ if ( recurrence->RecurrenceValue() == recurrenceVal )
+ {
+ iIndex = i;
+ SetRecurrenceL ( iIndex );
+ }
+ }
+ // resource reader
+ CleanupStack::PopAndDestroy(); // codescanner::cleanup
+ }
+ else
+ {
+ __ASSERT_DEBUG( iObserver, Panic( EESMRRecurenceFieldNoObserver ) );
+ iObserver->HideControl ( iFieldId );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRRecurenceField::SetOutlineFocusL
+// ---------------------------------------------------------------------------
+//
+void CESMRRecurenceField::SetOutlineFocusL( TBool aFocus )
+ {
+ FUNC_LOG;
+ CESMRField::SetOutlineFocusL ( aFocus );
+
+ //Focus gained
+ if ( aFocus )
+ {
+ ChangeMiddleSoftKeyL(EESMRCmdOpenRecurrenceQuery, R_QTN_MSK_OPEN);
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRRecurenceField::ExecuteGenericCommandL
+// ---------------------------------------------------------------------------
+//
+TBool CESMRRecurenceField::ExecuteGenericCommandL( TInt aCommand )
+ {
+ FUNC_LOG;
+ TBool isUsed( EFalse );
+ if (aCommand == EESMRCmdOpenRecurrenceQuery ||
+ aCommand == EAknCmdOpen )
+ {
+ HandleTactileFeedbackL();
+
+ ExecuteRecurrenceQueryL();
+ isUsed = ETrue;
+ }
+ return isUsed;
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRRecurenceField::ExecuteRecurrenceQueryL
+// ---------------------------------------------------------------------------
+//
+void CESMRRecurenceField::ExecuteRecurrenceQueryL()
+ {
+ FUNC_LOG;
+ TInt ret = CESMRListQuery::ExecuteL(
+ CESMRListQuery::EESMRRecurrenceQuery );
+
+ if ( ret != KErrCancel )
+ {
+ SetRecurrenceL( ret );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRRecurrenceField::OfferKeyEventL
+// ---------------------------------------------------------------------------
+//
+TKeyResponse CESMRRecurenceField::OfferKeyEventL(
+ const TKeyEvent& aEvent,
+ TEventCode aType )
+ {
+ FUNC_LOG;
+ TKeyResponse response( EKeyWasNotConsumed);
+ if ( EEventKey == aType )
+ {
+ switch ( aEvent.iScanCode )
+ {
+ case EStdKeyLeftArrow:
+ {
+ if ( iIndex > 0 )
+ {
+ SetRecurrenceL ( iIndex - 1 );
+ response = EKeyWasConsumed;
+ }
+ }
+ break;
+
+ case EStdKeyRightArrow:
+ {
+ if ( iIndex < (iArray.Count() - 1) )
+ {
+ SetRecurrenceL ( iIndex + 1 );
+ response = EKeyWasConsumed;
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+ return response;
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRRecurrenceField::SetRecurrence
+// ---------------------------------------------------------------------------
+//
+void CESMRRecurenceField::SetRecurrenceL(
+ TInt aIndex )
+ {
+ FUNC_LOG;
+ if ( aIndex < 0 || aIndex >= iArray.Count() )
+ {
+ User::Leave( KErrArgument );
+ }
+
+ CESMRRecurrence* rec = iArray[ aIndex ];
+ TRAPD( err, iValidator->RecurrenceChangedL( rec->RecurrenceValue() ) );
+ if ( err == KErrNone )
+ {
+ iRecurrence->SetTextL( rec->RecurrenceText() );
+ iRecurrence->DrawDeferred();
+
+ iIndex = aIndex;
+
+ if ( rec->RecurrenceValue() != ERecurrenceNot )
+ {
+ // if recurrence is switched "on", the end date should be removed
+ iObserver->HideControl ( EESMRFieldStopDate );
+ iObserver->ShowControl ( EESMRFieldRecurrenceDate );
+ }
+ else
+ {
+ // if recurrence is switched off, end date should be visible
+ iObserver->ShowControl ( EESMRFieldStopDate );
+ iObserver->HideControl ( EESMRFieldRecurrenceDate );
+ }
+ }
+ else
+ {
+ // Error occured
+ CESMRGlobalNote::ExecuteL(
+ CESMRGlobalNote::EESMRRepeatDifferentStartAndEndDate );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRRecurenceField::SizeChanged
+// ---------------------------------------------------------------------------
+//
+void CESMRRecurenceField::SizeChanged()
+ {
+ FUNC_LOG;
+ TRect rect = Rect();
+
+ TAknLayoutRect rowLayoutRect =
+ NMRLayoutManager::GetFieldRowLayoutRect( rect, 1 );
+ rect = rowLayoutRect.Rect();
+
+ TAknWindowComponentLayout iconLayout =
+ NMRLayoutManager::GetWindowComponentLayout(
+ NMRLayoutManager::EMRLayoutTextEditorIcon );
+ AknLayoutUtils::LayoutImage( iFieldIcon, rect, iconLayout );
+
+ 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 );
+
+ TAknTextComponentLayout editorLayout =
+ NMRLayoutManager::GetTextComponentLayout(
+ NMRLayoutManager::EMRTextLayoutTextEditor );
+
+ AknLayoutUtils::LayoutLabel( iRecurrence, rect, editorLayout );
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRRecurenceField::CountComponentControls
+// ---------------------------------------------------------------------------
+//
+TInt CESMRRecurenceField::CountComponentControls( ) const
+ {
+ FUNC_LOG;
+ TInt count( 0 );
+ if ( iFieldIcon )
+ {
+ ++count;
+ }
+ if ( iRecurrence )
+ {
+ ++count;
+ }
+ return count;
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRRecurenceField::ComponentControl
+// ---------------------------------------------------------------------------
+//
+CCoeControl* CESMRRecurenceField::ComponentControl( TInt aInd ) const
+ {
+ FUNC_LOG;
+ switch ( aInd )
+ {
+ case 0:
+ return iFieldIcon;
+ case 1:
+ return iRecurrence;
+ default:
+ return NULL;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRRecurenceField::SetContainerWindowL
+// ---------------------------------------------------------------------------
+//
+void CESMRRecurenceField::SetContainerWindowL(
+ const CCoeControl& aContainer )
+ {
+ CCoeControl::SetContainerWindowL( aContainer );
+ iRecurrence->SetContainerWindowL( aContainer );
+
+ iRecurrence->SetParent( this );
+ }
+
+// EOF