diff -r a3a1ae9acec6 -r da5135c61bad meetingrequest/mrgui/mrfieldbuilderplugin/src/cmrmulticalenfield.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/meetingrequest/mrgui/mrfieldbuilderplugin/src/cmrmulticalenfield.cpp Wed Mar 31 21:08:33 2010 +0300 @@ -0,0 +1,450 @@ +/* +* 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: MR multi calendar field implementation + * +*/ + +#include "cmrmulticalenfield.h" +#include "cmrimage.h" +#include "cmrlabel.h" +#include "cesmrtextitem.h" +#include "cesmrlistquery.h" +#include "nmrlayoutmanager.h" +#include "nmrcolormanager.h" +#include "mesmrmeetingrequestentry.h" +#include "cesmrglobalnote.h" +#include +#include +#include +#include +#include +#include +#include +#include +// DEBUG +#include "emailtrace.h" +#include "cesmrcaldbmgr.h" + + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CMRMultiCalenField::NewL +// --------------------------------------------------------------------------- +// +CMRMultiCalenField* CMRMultiCalenField::NewL( ) + { + FUNC_LOG; + CMRMultiCalenField* self = new (ELeave) CMRMultiCalenField; + CleanupStack::PushL ( self ); + self->ConstructL ( ); + CleanupStack::Pop ( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CMRMultiCalenField::~CMRMultiCalenField +// --------------------------------------------------------------------------- +// +CMRMultiCalenField::~CMRMultiCalenField( ) + { + FUNC_LOG; + iCalenNameList.Close(); + delete iIcon; + delete iLockIcon; + } + +// --------------------------------------------------------------------------- +// CMRMultiCalenField::InitializeL() +// --------------------------------------------------------------------------- +// +void CMRMultiCalenField::InitializeL() + { + TAknLayoutText text = NMRLayoutManager::GetLayoutText( + Rect(), + NMRLayoutManager::EMRTextLayoutTextEditor ); + + iCalenName->SetFont( text.Font() ); + // This is called so that theme changes will apply when changing theme "on the fly" + if ( IsFocused() ) + { + iCalenName->FocusChanged( EDrawNow ); + } + } +// --------------------------------------------------------------------------- +// CMRMultiCalenField::InternalizeL +// --------------------------------------------------------------------------- +// +void CMRMultiCalenField::InternalizeL( MESMRCalEntry& aEntry ) + { + FUNC_LOG; + MESMRCalDbMgr& dbMgr = aEntry.GetDBMgr(); + iCalenNameList.Reset(); + + dbMgr.GetMultiCalendarNameListL( iCalenNameList ); + TPtrC calenName = dbMgr.GetCalendarNameByEntryL( aEntry ); + iIndex = dbMgr.GetCurCalendarIndex(); + iCalenName->SetTextL( calenName ); + + iEntry = &aEntry; + + // Set's the calendar type change enabled or disabled. + if( FieldMode() == EESMRFieldModeEdit && !TypeChangeEnabledL() ) + { + iTypeChangeEnabled = EFalse; + + LockL(); + } + else + { + iTypeChangeEnabled = ETrue; + } + } + +// --------------------------------------------------------------------------- +// CMRMultiCalenField::SetOutlineFocusL +// --------------------------------------------------------------------------- +// +void CMRMultiCalenField::SetOutlineFocusL( TBool aFocus ) + { + FUNC_LOG; + CESMRField::SetOutlineFocusL ( aFocus ); + + //Focus gained + if ( aFocus ) + { + ChangeMiddleSoftKeyL( + EESMRCmdOpenMultiCalenSelectQuery, R_QTN_MSK_OPEN ); + } + } + +// --------------------------------------------------------------------------- +// CMRMultiCalenField::ExecuteGenericCommandL +// --------------------------------------------------------------------------- +// +TBool CMRMultiCalenField::ExecuteGenericCommandL( TInt aCommand ) + { + FUNC_LOG; + + TBool isUsed( EFalse ); + if( aCommand == EESMRCmdOpenMultiCalenSelectQuery || + aCommand == EAknCmdOpen ) + { + if( IsLocked() ) + { + HandleTactileFeedbackL(); + + CESMRGlobalNote::ExecuteL( + CESMRGlobalNote::EESMRUnableToEdit ); + isUsed = ETrue; + } + + else if( iTypeChangeEnabled ) + { + ExecuteTypeQueryL(); + isUsed = ETrue; + + HandleTactileFeedbackL(); + } + } + + return isUsed; + } + +// --------------------------------------------------------------------------- +// CMRMultiCalenField::Lock +// --------------------------------------------------------------------------- +// +void CMRMultiCalenField::LockL() + { + FUNC_LOG; + if( IsLocked() ) + { + return; + } + + CESMRField::LockL(); + + delete iLockIcon; + iLockIcon = NULL; + iLockIcon = CMRImage::NewL( NMRBitmapManager::EMRBitmapLockField, ETrue ); + iIcon->SetParent( this ); + } + +// --------------------------------------------------------------------------- +// CMRMultiCalenField::ExecuteTypeQueryL +// --------------------------------------------------------------------------- +// +void CMRMultiCalenField::ExecuteTypeQueryL() + { + FUNC_LOG; + if ( FieldMode() == EESMRFieldModeView ) + return; + + TInt ret = + CESMRListQuery::ExecuteL( + CESMRListQuery::EESMRMultiCalenQuery, + iCalenNameList ); + + if ( ret != KErrCancel ) + { + iIndex = ret; + iEntry->GetDBMgr().SetCurCalendarByIndex( iIndex ); + + // Send command to dialog + NotifyEventAsyncL( EESMRCmdCalendarChange ); + UpdateLabelL( ret ); + } + } + +// --------------------------------------------------------------------------- +// CMRMultiCalenField::CMRMultiCalenField +// --------------------------------------------------------------------------- +// +CMRMultiCalenField::CMRMultiCalenField( ) : + iIndex( 0 ) + { + FUNC_LOG; + SetFieldId( EESMRFieldCalendarName ); + SetFocusType( EESMRHighlightFocus ); + } + +// --------------------------------------------------------------------------- +// CMRMultiCalenField::ConstructL +// --------------------------------------------------------------------------- +// +void CMRMultiCalenField::ConstructL( ) + { + FUNC_LOG; + + iCalenName = CMRLabel::NewL(); + CESMRField::ConstructL( iCalenName ); + iCalenName->SetTextL( KNullDesC() ); + + TGulAlignment align; + align.SetHAlignment( EHLeft ); + align.SetVAlignment( EVCenter ); + iCalenName->SetAlignment( align ); + + iIcon = CMRImage::NewL( NMRBitmapManager::EMRBitmapCalendarSelection ); + + } + +// --------------------------------------------------------------------------- +// CMRMultiCalenField::UpdateLabelL +// --------------------------------------------------------------------------- +// +void CMRMultiCalenField::UpdateLabelL( TInt aIndex ) + { + FUNC_LOG; + + iCalenName->SetTextL( iCalenNameList[aIndex] ); + iCalenName->DrawDeferred(); + } + +// --------------------------------------------------------------------------- +// CMRMultiCalenField::CountComponentControls +// --------------------------------------------------------------------------- +// +TInt CMRMultiCalenField::CountComponentControls() const + { + FUNC_LOG; + TInt count( 0 ); + if ( iIcon ) + { + ++count; + } + + if ( iCalenName ) + { + ++count; + } + + if ( iLockIcon ) + { + ++count; + } + return count; + + } + +// --------------------------------------------------------------------------- +// CMRMultiCalenField::ComponentControl +// --------------------------------------------------------------------------- +// +CCoeControl* CMRMultiCalenField::ComponentControl( TInt aIndex ) const + { + FUNC_LOG; + CCoeControl* control = NULL; + switch( aIndex ) + { + case 0: + { + control = iCalenName; + break; + } + case 1: + { + control = iIcon; + break; + } + case 2: + { + control = iLockIcon; + break; + } + default: + ASSERT( EFalse ); + } + + return control; + } + +// --------------------------------------------------------------------------- +// CMRMultiCalenField::SizeChanged +// --------------------------------------------------------------------------- +// +void CMRMultiCalenField::SizeChanged() + { + FUNC_LOG; + TRect rect( Rect() ); + TAknLayoutRect iconLayout = + NMRLayoutManager::GetLayoutRect( + rect, NMRLayoutManager::EMRLayoutTextEditorIcon ); + TRect iconRect( iconLayout.Rect() ); + iIcon->SetRect( iconRect ); + + // Layouting lock icon + TAknLayoutRect rowLayoutRect( + NMRLayoutManager::GetFieldRowLayoutRect( rect, 1 ) ); + TRect rowRect( rowLayoutRect.Rect() ); + if( iLockIcon ) + { + TAknWindowComponentLayout iconLayout( + NMRLayoutManager::GetWindowComponentLayout( + NMRLayoutManager::EMRLayoutSingleRowDColumnGraphic ) ); + AknLayoutUtils::LayoutImage( iLockIcon, rowRect, iconLayout ); + } + + // Layouting label + TAknLayoutText viewerLayoutText; + if( iLockIcon ) + { + viewerLayoutText = NMRLayoutManager::GetLayoutText( rowRect, + NMRLayoutManager::EMRTextLayoutSingleRowEditorText ); + } + else + { + viewerLayoutText = NMRLayoutManager::GetLayoutText( rowRect, + NMRLayoutManager::EMRTextLayoutTextEditor ); + } + + TRect viewerRect( viewerLayoutText.TextRect() ); + iCalenName->SetRect( viewerRect ); + + // Move focus rect so that it's relative to field's position. + viewerRect.Move( -Position() ); + SetFocusRect( viewerRect ); + } + +// --------------------------------------------------------------------------- +// CMRMultiCalenField::SetContainerWindowL +// --------------------------------------------------------------------------- +// +void CMRMultiCalenField::SetContainerWindowL( + const CCoeControl& aContainer ) + { + FUNC_LOG; + CCoeControl::SetContainerWindowL( aContainer ); + iCalenName->SetContainerWindowL( aContainer ); + iCalenName->SetParent( this ); + iIcon->SetContainerWindowL( aContainer ); + iIcon->SetParent( this ); + } + +// --------------------------------------------------------------------------- +// CMRMultiCalenField::SetTextDimmed +// --------------------------------------------------------------------------- +// +void CMRMultiCalenField::SetTextDimmed() + { + FUNC_LOG; + + NMRColorManager::SetColor( + *iCalenName, + NMRColorManager::EMRMainAreaTextColorDimmed ); + } + +// --------------------------------------------------------------------------- +// CMRMultiCalenField::TypeChangeEnabledL +// --------------------------------------------------------------------------- +// +TBool CMRMultiCalenField::TypeChangeEnabledL() + { + TBool ret( ETrue ); + + /* + * Case 1: + * If entry is single occurancy of a series, calendar type change + * is disabled for the user. + */ + if( iEntry->IsRecurrentEventL() && + iEntry->RecurrenceModRule() == MESMRCalEntry::EESMRThisOnly && + FieldMode() == EESMRFieldModeEdit ) + { + ret = EFalse; + } + + /* + * Case 2: + * If entry is meeting request, and opened from mailbox that does not + * support multiple calendar, calendar type change is disabled + * for the user. + */ + if( ret && CCalenInterimUtils2::IsMeetingRequestL( iEntry->Entry() ) && + FieldMode() == EESMRFieldModeEdit ) + { + MESMRMeetingRequestEntry* entry = + static_cast< MESMRMeetingRequestEntry* >( iEntry ); + + // If entry's current plugin is active sync, it means that + // Mail For Exchange is in use. This means, that multiple calendar + // functionality is not supported. + if( entry->CurrentPluginL() == EESMRActiveSync ) + { + ret = EFalse; + } + } + + /* + * Case 3: + * When the organizer of the MR edits an already sent MR, calendar + * cannot be changed --> calendar selection needs to be locked. + */ + if( ret && CCalenInterimUtils2::IsMeetingRequestL( iEntry->Entry() ) && + FieldMode() == EESMRFieldModeEdit ) + { + MESMRMeetingRequestEntry* entry = + static_cast< MESMRMeetingRequestEntry* >( iEntry ); + if( entry->RoleL() == EESMRRoleOrganizer && entry->IsSentL() ) + { + ret = EFalse; + } + } + + return ret; + } + +// EOF +