diff -r 000000000000 -r 8466d47a6819 meetingrequest/mrgui/mrfieldbuilderpluginextension/src/cesmrattendeefield.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/meetingrequest/mrgui/mrfieldbuilderpluginextension/src/cesmrattendeefield.cpp Thu Dec 17 08:39:21 2009 +0200 @@ -0,0 +1,1021 @@ +/* +* 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 titled field implementation + * +*/ + +#include "emailtrace.h" +#include "cesmrattendeefield.h" + +#include +#include +#include +#include +#include +#include +#include +// +#include "esmrcommands.h" +#include "CFSMailClient.h" +// +#include "cesmrncspopuplistbox.h" +#include "cesmrncsemailaddressobject.h" +#include "mesmrlistobserver.h" +#include "cesmrborderlayer.h" +#include "cesmrcontacthandler.h" +#include "mesmrmeetingrequestentry.h" +#include "esmrfieldbuilderdef.h" +#include "cesmrlayoutmgr.h" +// Removed profiling. + +using namespace ESMRLayout; + +//CONSTANTS + +// unnamed namespace for local definitions +namespace { // codescanner::namespace + +const TInt KMaxRemoteSearchResponseLength = 255; + +static void RPointerArrayResetAndDestroy( TAny* aPtr ) + { + static_cast*>( aPtr )->ResetAndDestroy(); + } + +#ifdef _DEBUG + +// Panic code literal +_LIT( KESMRAttendeeField, "ESMRAttendeeField" ); + +/** Panic code enumeration */ +enum TESMRAttendeeFieldPanic + { + EESMRAttendeeFieldNotMeetingRequestEntry // Passed entry is not MR + }; + +void Panic( TESMRAttendeeFieldPanic aPanic ) + { + User::Panic( KESMRAttendeeField, aPanic ); + } + +#endif // _DEBUG + +}//namespace + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CESMRAttendeeField::CESMRAttendeeField +// --------------------------------------------------------------------------- +// +CESMRAttendeeField::CESMRAttendeeField( CCalAttendee::TCalRole aRole ) : + iRole( aRole) + { + FUNC_LOG; + //do nothing + } + +// --------------------------------------------------------------------------- +// CESMRAttendeeField::~CESMRAttendeeField +// --------------------------------------------------------------------------- +// +CESMRAttendeeField::~CESMRAttendeeField( ) + { + FUNC_LOG; + delete iAacListBox; + delete iTitle; + delete iContactHandler; + delete iDefaultText; + delete iFrameBgContext; + delete iPhoneOwnerAddr; + } + +// --------------------------------------------------------------------------- +// CESMRAttendeeField::NewL +// --------------------------------------------------------------------------- +// +CESMRAttendeeField* CESMRAttendeeField::NewL( CCalAttendee::TCalRole aRole ) + { + FUNC_LOG; + CESMRAttendeeField* self = new (ELeave) CESMRAttendeeField( aRole ); + CleanupStack::PushL ( self ); + self->ConstructL ( ); + CleanupStack::Pop ( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CESMRAttendeeField::ConstructL +// --------------------------------------------------------------------------- +// +void CESMRAttendeeField::ConstructL( ) + { + FUNC_LOG; + SetExpandable ( ); + + SetFieldId ( (iRole == CCalAttendee::EReqParticipant) ? EESMRFieldAttendee + : EESMRFieldOptAttendee ); + + iTitle = new (ELeave) CEikLabel(); + iTitle->SetLabelAlignment ( CESMRLayoutManager::IsMirrored ( ) ? ELayoutAlignRight + : ELayoutAlignLeft ); + + iContactHandler = CESMRContactHandler::NewL(); + + iDefaultText = StringLoader::LoadL ( R_QTN_MEET_REQ_CONTACT_FIELD ); + iEditor = new ( ELeave ) CESMRNcsAifEditor( *iContactHandler, iDefaultText ); + + iEditor->SetPopupList(this ); + + HBufC* label = StringLoader::LoadLC (iRole == CCalAttendee::EReqParticipant ? + R_QTN_MEET_REQ_LABEL_REQUIRED:R_QTN_MEET_REQ_LABEL_OPT ); + + iTitle->SetTextL ( *label ); + CleanupStack::PopAndDestroy (label ); + + iBackground = AknsDrawUtils::ControlContext( this ); + + CESMRField::ConstructL ( iEditor ); + } + +// --------------------------------------------------------------------------- +// CESMRAttendeeField::InitializeL +// --------------------------------------------------------------------------- +// +void CESMRAttendeeField::InitializeL() + { + FUNC_LOG; + iEditor->SetFontL( iLayout->Font(iCoeEnv, iFieldId), iLayout ); + iEditor->SetAlignment ( EAknEditorAlignBidi | EAknEditorAlignCenter ); + iEditor->SetAknEditorInputMode ( EAknEditorTextInputMode ); + iEditor->SetAknEditorFlags ( EAknEditorFlagNoT9| EAknEditorFlagUseSCTNumericCharmap ); + iEditor->SetAknEditorCurrentCase ( EAknEditorLowerCase ); + iEditor->CreateScrollBarFrameL()->SetScrollBarVisibilityL ( CEikScrollBarFrame::EOff, + CEikScrollBarFrame::EOff ); + iEditor->SetEdwinSizeObserver ( this ); + + iTitleSize = iLayout->FieldSize ( EESMRFieldAttendeeLabel ); + iTitle->SetFont( iLayout->Font(iCoeEnv, EESMRFieldAttendeeLabel) ); + + iAacListBox->Initialise(iLayout); + } + +// --------------------------------------------------------------------------- +// CESMRAttendeeField::InternalizeL +// --------------------------------------------------------------------------- +// +void CESMRAttendeeField::InternalizeL( MESMRCalEntry& aEntry ) + { + FUNC_LOG; + CCalEntry& entry = aEntry.Entry ( ); + RPointerArray< CCalAttendee > attendees = entry.AttendeesL ( ); + RPointerArray< CESMRNcsEmailAddressObject > addressList; // codescanner::resourcenotoncleanupstack + TCleanupItem arrayCleanup( RPointerArrayResetAndDestroy, &addressList ); + CleanupStack::PushL( arrayCleanup ); + + for (TInt i(0); i < attendees.Count ( ); i++ ) + { + if ( attendees[i]->RoleL() == iRole ) + { + const TDesC& addr = attendees[i]->Address ( ); + const TDesC& commonName = attendees[i]->CommonName ( ); + + CESMRNcsEmailAddressObject* obj = CESMRNcsEmailAddressObject::NewL ( commonName, addr ); + CleanupStack::PushL (obj ); + addressList.AppendL( obj ); + CleanupStack::Pop( obj ); + } + } + + if (attendees.Count() > 0 ) + { + if ( !iObserver->IsControlVisible(iFieldId ) ) + { + iObserver->InsertControl(iFieldId ); + } + iEditor->SetAddressesL( addressList ); + } + else + { + AppendDefaultTextL(); + //during initialisation, SelectAllL() in setoutlinefocus gets overridden so this is needed + iEditor->SelectAllL(); + } + + //don't show optional attendees field on initialisation if there are none + if ( iRole == CCalAttendee::EOptParticipant ) + { + if ( addressList.Count() == 0 ) + { + this->MakeVisible(EFalse); + } + } + + CleanupStack::PopAndDestroy( &addressList ); + // this is needed to be re-called here, otherwise the CEikEdwin + // does not get correctly instantiated with default text + iEditor->FocusChanged(EDrawNow); + + UpdateSendOptionL(); + } + +// --------------------------------------------------------------------------- +// CESMRAttendeeField::ExternalizeL +// --------------------------------------------------------------------------- +// +void CESMRAttendeeField::ExternalizeL( MESMRCalEntry& aEntry ) + { + FUNC_LOG; + MESMRMeetingRequestEntry* mrEntry = NULL; + if ( MESMRCalEntry::EESMRCalEntryMeetingRequest == aEntry.Type() ) + { + mrEntry = static_cast(&aEntry); + } + + // This should always be called for MR entries + __ASSERT_DEBUG( mrEntry, Panic(EESMRAttendeeFieldNotMeetingRequestEntry ) ); + + if(iEditor->HasDefaultText()) + { + ClearDefaultTextL(); + } + + // remove all previous attendees from the attendee list + CCalEntry& entry = mrEntry->Entry(); + + if ( !iPhoneOwnerAddr ) + { + CCalUser* phoneOwner = entry.PhoneOwnerL(); + if (phoneOwner) + { + iPhoneOwnerAddr = phoneOwner->Address().AllocL(); + } + } + + ClearAttendeeListL ( entry ); + ParseAttendeesL ( *mrEntry ); + + HBufC *text = iEditor->GetTextInHBufL(); + + //If there is no added attendees put back the default text + if(!text) + { + AppendDefaultTextL(); + //during initialisation, SelectAllL() in setoutlinefocus gets overridden so this is needed + iEditor->SelectAllL(); + } + delete text; + } + +// --------------------------------------------------------------------------- +// CESMRAttendeeField::ExpandedHeight +// --------------------------------------------------------------------------- +// +TInt CESMRAttendeeField::ExpandedHeight( ) const + { + FUNC_LOG; + return iTitleSize.iHeight + iExpandedSize.iHeight; + } + +// --------------------------------------------------------------------------- +// CESMRSubjectField::GetMinimumVisibleVerticalArea +// --------------------------------------------------------------------------- +// +void CESMRAttendeeField::GetMinimumVisibleVerticalArea(TInt& aUpper, TInt& aLower) + { + FUNC_LOG; + TRect rect; + + TRAPD( err, iEditor->GetLineRectL( rect ) ); + + if ( err == KErrNone ) + { + rect.Move( 0, iTitleSize.iHeight ); + aUpper = rect.iTl.iY; + aLower = rect.iBr.iY; + } + else + { + // This isn't expected to happen in any situation. + // but if it does at least there will be no zero size + CESMRField::GetMinimumVisibleVerticalArea( aUpper, aLower ); + } + } + +// --------------------------------------------------------------------------- +// CESMRAttendeeField::CountComponentControls +// --------------------------------------------------------------------------- +// +TInt CESMRAttendeeField::CountComponentControls( ) const + { + FUNC_LOG; + TInt count = CESMRField::CountComponentControls ( ); + + if ( iTitle ) + { + ++count; + } + + return count; + } + +// --------------------------------------------------------------------------- +// CESMRAttendeeField::ComponentControl +// --------------------------------------------------------------------------- +// +CCoeControl* CESMRAttendeeField::ComponentControl( TInt aInd ) const + { + FUNC_LOG; + if ( aInd == 0 ) + { + return iTitle; + } + return CESMRField::ComponentControl ( aInd ); + } + +// --------------------------------------------------------------------------- +// CESMRAttendeeField::SizeChanged +// --------------------------------------------------------------------------- +// +void CESMRAttendeeField::SizeChanged( ) + { + FUNC_LOG; + TRect rect = Rect ( ); + + if ( CESMRLayoutManager::IsMirrored ( ) ) + { + TPoint titlePos( rect.iBr.iX - iTitleSize.iWidth, rect.iTl.iY ); + iTitle->SetExtent ( titlePos, iTitleSize ); + + TSize textSize( rect.Width ( ) - ( KIconSize.iWidth + KIconBorderMargin ), + iExpandedSize.iHeight ); + TPoint textPos( rect.iBr.iX - KIconSize.iWidth- textSize.iWidth, + rect.iTl.iY + iTitleSize.iHeight ); + iBorder->SetExtent ( textPos, textSize ); + } + else + { + // title + iTitle->SetExtent ( rect.iTl, iTitleSize ); + + // editor (editor is wrapped inside the 'iBorder' member) + TRect borderRect(TPoint ( + rect.iTl.iX + KIconSize.iWidth + KIconBorderMargin, + rect.iTl.iY + iTitleSize.iHeight ), TSize ( + rect.Width ( )- KIconSize.iWidth + KIconBorderMargin - KFieldEndMargin, + iExpandedSize.iHeight )); + + iBorder->SetRect (borderRect ); + } + + if ( iAacListBox && iAacListBox->IsVisible ( ) ) + { + TRAPD( error, iAacListBox->SetPopupMaxRectL( ResolvePopupRectL()) ) + if ( error ) + { + CEikonEnv::Static()->// codescanner::eikonenvstatic + HandleError( error ); + } + } + + if( iFrameBgContext ) + { + TRect visibleRect = CalculateVisibleRect( iEditor->Rect() ); + iFrameBgContext->SetFrameRects( visibleRect, visibleRect ); + } + } + +// --------------------------------------------------------------------------- +// CESMRAttendeeField::PositionChanged +// --------------------------------------------------------------------------- +// +void CESMRAttendeeField::PositionChanged( ) + { + FUNC_LOG; + if ( iAacListBox && iAacListBox->IsVisible ( ) ) + { + TRAPD( error, iAacListBox->SetPopupMaxRectL( ResolvePopupRectL()) ) + if ( error ) + { + CEikonEnv::Static()->// codescanner::eikonenvstatic + HandleError( error ); + } + } + + if( iFrameBgContext ) + { + TRect visibleRect = CalculateVisibleRect( iEditor->Rect() ); + iFrameBgContext->SetFrameRects( visibleRect, visibleRect ); + } + } + +// ----------------------------------------------------------------------------- +// CESMRAttendeeField::ResolvePopupRectL +// ----------------------------------------------------------------------------- +// +TRect CESMRAttendeeField::ResolvePopupRectL( ) + { + FUNC_LOG; + if ( !iAacListBox ) + { + return TRect(0,0,0,0); + } + + TRect popupRect = iBorder->Rect(); + TRect lineRect; + iEditor->GetLineRectL( lineRect ); + lineRect.Move( 0, popupRect.iTl.iY ); + TRect parentRect = Parent()->Rect(); + + TInt listBoxBorderHeight = iAacListBox->CalcHeightBasedOnNumOfItems( 0 ); + TInt listBoxItemHeight = iAacListBox->CalcHeightBasedOnNumOfItems( 1 ) + - listBoxBorderHeight; + + if ( lineRect.iTl.iY > ( parentRect.Height() >> 1 ) ) + { + // Draw popup list on top of cursor + popupRect.iTl.iY = parentRect.iTl.iY; + popupRect.iBr.iY = lineRect.iTl.iY; + + TInt diff = popupRect.Height() % listBoxItemHeight; + popupRect.iTl.iY += diff - listBoxBorderHeight; + } + else + { + // Draw popup list below cursor + popupRect.iTl.iY = lineRect.iBr.iY; + popupRect.iBr.iY = parentRect.iBr.iY; + + TInt diff = popupRect.Height() % listBoxItemHeight; + popupRect.iBr.iY -= diff - listBoxBorderHeight; + } + + return popupRect; + } + +// ----------------------------------------------------------------------------- +// CNcsAddressInputField:::AppendDefaultTextL() +// ----------------------------------------------------------------------------- +// +void CESMRAttendeeField::AppendDefaultTextL() + { + FUNC_LOG; + iEditor->SetTextL( iDefaultText ); + iEditor->HandleTextChangedL(); + } + +// ----------------------------------------------------------------------------- +// CNcsAddressInputField::ClearDefaultTextL() +// ----------------------------------------------------------------------------- +// +void CESMRAttendeeField::ClearDefaultTextL() + { + FUNC_LOG; + iEditor->SetTextL( &KNullDesC ); + iEditor->HandleTextChangedL(); + } + +// --------------------------------------------------------------------------- +// CESMRAttendeeField::OfferKeyEventL +// --------------------------------------------------------------------------- +// +TKeyResponse CESMRAttendeeField::OfferKeyEventL( + const TKeyEvent& aKeyEvent, + TEventCode aType ) + { + FUNC_LOG; + + TKeyResponse ret( EKeyWasNotConsumed); + + if ( aKeyEvent.iCode == EKeyEnter || + aKeyEvent.iScanCode == EStdKeyEnter || + aKeyEvent.iCode == EKeyYes || + aKeyEvent.iScanCode == EStdKeyYes ) + {//prevent these keys from being used in any attendee field editor + return EKeyWasConsumed; + } + + if ( aKeyEvent.iCode == EKeyUpArrow || aKeyEvent.iCode == EKeyDownArrow ) + { + if( iAacListBox && iAacListBox->IsVisible() && !iAacListBox->IsPopupEmpty() ) + { + return iAacListBox->OfferKeyEventL( aKeyEvent, aType ); + } + else + { + ret = iEditor->OfferKeyEventL (aKeyEvent, aType ); + } + } + else + { + if ( iAacListBox && iAacListBox->IsVisible ( ) ) + { + if( aKeyEvent.iCode == EKeyDevice3 || aKeyEvent.iCode == EKeyDevice4 || + aKeyEvent.iCode == EKeyOK ) + { + DoPopupSelectL(); + ret = EKeyWasConsumed; + } + } + } + + if ( ret == EKeyWasNotConsumed ) + { + ret = iEditor->OfferKeyEventL (aKeyEvent, aType ); + UpdateSendOptionL(); + } + + // Scroll editor. + if ( iObserver && aType == EEventKey ) + { + CTextLayout* textLayout = iEditor->TextLayout(); + TInt lineHeight = iEditor->GetLineHeightL(); + + TPoint cursorPos( 0,0 ); + textLayout->DocPosToXyPosL( iEditor->CursorPos(), cursorPos ); + + TInt editorTlY = iEditor->Position().iY; + TInt listHeight = iObserver->ListHeight(); + + TInt cursorTopY = cursorPos.iY - lineHeight + editorTlY; + TInt cursorBottomY = cursorPos.iY + lineHeight + editorTlY; + + // If cursor is below visible area + if ( cursorBottomY > listHeight ) + { + iObserver->MoveListAreaUpL( cursorBottomY - listHeight ); + } + // If cursor is over the top of visible area + else if ( cursorTopY < 0 ) + { + iObserver->MoveListAreaDownL( -cursorTopY ); + } + // Latch on top of the screen + else if ( textLayout->GetLineNumber( iEditor->CursorPos() ) < 2 ) + { + iObserver->MoveListAreaDownL( iTitleSize.iHeight ); + } + + } + return ret; + } + +// --------------------------------------------------------------------------- +// CESMRAttendeeField::SetContainerWindowL() +// --------------------------------------------------------------------------- +// +void CESMRAttendeeField::SetContainerWindowL( const CCoeControl& aControl ) + { + FUNC_LOG; + CESMRField::SetContainerWindowL ( aControl ); + + iEditor->ConstructL ( + this, + KMaxAddressFieldLines, + 0, + CEikEdwin::EAvkonEditor | CEikEdwin::EResizable | + CEikEdwin::ENoAutoSelection |CEikEdwin::EInclusiveSizeFixed | + CEikEdwin::ENoHorizScrolling + ); + + iAacListBox = CESMRNcsPopupListBox::NewL ( this, *iContactHandler ); + iAacListBox->MakeVisible ( EFalse ); + iAacListBox->SetObserver( this ); + iAacListBox->ActivateL(); + iButtonGroupContainer = CEikButtonGroupContainer::Current(); + + } + +// --------------------------------------------------------------------------- +// CESMRAttendeeField::ActivateL +// --------------------------------------------------------------------------- +// +void CESMRAttendeeField::ActivateL() + { + CCoeControl::ActivateL(); + + TRect editorRect = iEditor->Rect(); + + delete iFrameBgContext; + iFrameBgContext = NULL; + iFrameBgContext = CAknsFrameBackgroundControlContext::NewL( KAknsIIDQsnFrInput, editorRect, editorRect, EFalse ) ; + + iFrameBgContext->SetParentContext( iBackground ); + iEditor->SetSkinBackgroundControlContextL( iFrameBgContext ); + } + +// --------------------------------------------------------------------------- +// CESMRAttendeeField::HandleEdwinSizeEventL +// --------------------------------------------------------------------------- +// +TBool CESMRAttendeeField::HandleEdwinSizeEventL(CEikEdwin* /*aEdwin*/, + TEdwinSizeEvent /*aType*/, TSize aSize ) + { + FUNC_LOG; + iExpandedSize = aSize; + if ( iObserver ) + { + iObserver->ControlSizeChanged ( this ); + } + + if ( iFrameBgContext ) + { + TRect visibleRect = CalculateVisibleRect( iEditor->Rect() ); + iFrameBgContext->SetFrameRects( visibleRect, visibleRect ); + } + + return ETrue; + } + +// --------------------------------------------------------------------------- +// CESMRAttendeeField::UpdatePopupContactListL +// --------------------------------------------------------------------------- +// +void CESMRAttendeeField::UpdatePopupContactListL( + const TDesC& aMatchString, + TBool /*iListAll*/) + { + FUNC_LOG; + if ( aMatchString.CompareC ( KNullDesC )== 0 ) + { + ClosePopupContactListL ( ); + } + else if ( iAacListBox ) + { + // Popup will be shown when async HandleControlEventL is received + iAacListBoxEnabled = ETrue; + + if ( iAacListBox->IsVisible() ) + { + iAacListBox->SetSearchTextL( aMatchString ); + } + else + { + iAacListBox->InitAndSearchL ( aMatchString ); + } + } + } + +// --------------------------------------------------------------------------- +// CESMRHeaderContainer:ShowPopupCbaL +// --------------------------------------------------------------------------- +// +void CESMRAttendeeField::ShowPopupCbaL( TBool aShow ) + { + if( aShow ) + { + iButtonGroupContainer->SetCommandSetL( + R_CONTACT_POPUP_SOFTKEYS_SELECT_CANCEL); + } + else + { + iButtonGroupContainer->SetCommandSetL( + R_CONTACT_EDITOR_SOFTKEYS_OPTIONS_DONE__ADD); + } + iButtonGroupContainer->DrawDeferred(); + } + +// --------------------------------------------------------------------------- +// CESMRHeaderContainer:ExecuteGenericCommandL +// --------------------------------------------------------------------------- +// +void CESMRAttendeeField::ExecuteGenericCommandL( TInt aCommand ) + { + FUNC_LOG; + switch ( aCommand ) + { + case EESMRCmdAttendeeInsertContact: + { + iContactHandler->GetAddressesFromPhonebookL( this ); + } + break; + case EESMRCmdAttendeeSoftkeySelect: + { + DoPopupSelectL(); + } + break; + case EESMRCmdAttendeeSoftkeyCancel: + { + ClosePopupContactListL(); + } + break; + default: + break; + } + } + +// --------------------------------------------------------------------------- +// CESMRBooleanField::SetOutlineFocusL +// --------------------------------------------------------------------------- +// +void CESMRAttendeeField::SetOutlineFocusL( TBool aFocus ) + { + FUNC_LOG; + CESMRField::SetOutlineFocusL( aFocus ); + + if (aFocus) //Focus is gained on the field + { + if ( iEditor->HasDefaultText() ) + { + iEditor->SelectAllL(); + } + ChangeMiddleSoftKeyL( R_MR_ADD_SOFTKEY ); + } + } + +// --------------------------------------------------------------------------- +// CESMRAttendeeField::OperationComplete() +// --------------------------------------------------------------------------- +// +void CESMRAttendeeField::OperationCompleteL( + TContactHandlerCmd /*aCmd*/, + const RPointerArray* aContacts ) + { + FUNC_LOG; + if ( aContacts ) + { + RPointerArray ncsObjects; // codescanner::resourcenotoncleanupstack + TCleanupItem arrayCleanup( RPointerArrayResetAndDestroy, &ncsObjects ); + CleanupStack::PushL( arrayCleanup ); + for ( int i = 0; i < aContacts->Count(); i++ ) + { + CESMRNcsEmailAddressObject* object = + CESMRNcsEmailAddressObject::NewL( + (*aContacts)[i]->DisplayName(), + (*aContacts)[i]->EmailAddress() ); + object->SetDisplayFull( (*aContacts)[i]->MultipleEmails() ); + ncsObjects.Append( object ); + } + + iEditor->AppendAddressesL(ncsObjects); + CleanupStack::PopAndDestroy( &ncsObjects ); + UpdateSendOptionL(); + } + } + +// --------------------------------------------------------------------------- +// CESMRAttendeeField::OperationError +// --------------------------------------------------------------------------- +// +void CESMRAttendeeField::OperationErrorL( TContactHandlerCmd /*aCmd*/, + TInt /*aError*/ ) + { + FUNC_LOG; + //Nothing to do + } + +// --------------------------------------------------------------------------- +// CESMRAttendeeField::HandleControlEventL +// --------------------------------------------------------------------------- +// +void CESMRAttendeeField::HandleControlEventL( + CCoeControl *aControl, + TCoeEvent aEventType ) + { + FUNC_LOG; + if ( aControl == iAacListBox && + aEventType == MCoeControlObserver::EEventStateChanged && + iAacListBoxEnabled ) + { + if ( iAacListBox && iAacListBox->IsVisible() && iAacListBox->IsPopupEmpty() ) + { + ClosePopupContactListL(); + } + else if ( iAacListBox && !iAacListBox->IsVisible() && !iAacListBox->IsPopupEmpty() ) + { + iAacListBox->SetPopupMaxRectL( ResolvePopupRectL() ); + iAacListBox->MakeVisible ( ETrue ); + ShowPopupCbaL( ETrue ); + } + else + { + UpdateSendOptionL(); + } + } + } + +// --------------------------------------------------------------------------- +// CESMRAttendeeField::ClearAttendeeListL +// --------------------------------------------------------------------------- +// +void CESMRAttendeeField::ClearAttendeeListL( CCalEntry& aEntry ) + { + FUNC_LOG; + RPointerArray< CCalAttendee > & att = aEntry.AttendeesL( ); + for (TInt i(0); i < att.Count( ); ) + { + // if there is an attendee with this fields role, remove it + if ( att[i]->RoleL( )== iRole ) + { + aEntry.DeleteAttendeeL( i ); + } + else + { + ++i; + } + } + } + +// --------------------------------------------------------------------------- +// CESMRAttendeeField::ParseAttendeesL +// --------------------------------------------------------------------------- +// +void CESMRAttendeeField::ParseAttendeesL( + MESMRMeetingRequestEntry& aMREntry ) + { + FUNC_LOG; + iEditor->CheckAddressWhenFocusLostL ( ); + + RPointerArray attendees = iEditor->GetAddressesL ( ); + CCalEntry& entry( aMREntry.Entry() ); + TInt count = attendees.Count ( ); + + for (TInt i=0; iEmailAddress ( ) ); + attendee->SetRoleL ( iRole ); + attendee->SetCommonNameL ( obj->DisplayName ( ) ); + + if ( EESMRRoleOrganizer == aMREntry.RoleL() || + aMREntry.IsForwardedL() ) + { + attendee->SetResponseRequested( ETrue ); + } + + entry.AddAttendeeL ( attendee ); + if (iPhoneOwnerAddr && attendee->Address().CompareF(*iPhoneOwnerAddr) == 0) + { + entry.SetPhoneOwnerL(static_cast(attendee)); + } + } + + } + +// ----------------------------------------------------------------------------- +// CESMRHeaderContainer::DoPopupSelect +// ----------------------------------------------------------------------------- +// +void CESMRAttendeeField::DoPopupSelectL() + { + FUNC_LOG; + if( iAacListBox && iAacListBox->IsRemoteLookupItemSelected() ) + { + // Launch remote lookup + HBufC* lookupText = iEditor->GetLookupTextLC(); + CPbkxRemoteContactLookupServiceUiContext::TResult::TExitReason exitReason; + CESMRNcsEmailAddressObject* address = ExecuteRemoteSearchL( + exitReason, + *lookupText ); + if ( address ) + { + CleanupStack::PushL( address ); + iEditor->AddAddressL( *address ); + CleanupStack::PopAndDestroy( address ); + } + CleanupStack::PopAndDestroy( lookupText ); + } + else if( iAacListBox && !iAacListBox->IsPopupEmpty() ) + { + CESMRNcsEmailAddressObject* emailAddress = + iAacListBox->ReturnCurrentEmailAddressLC(); + if( emailAddress ) + { + if ( emailAddress->EmailAddress().Compare( KNullDesC )) + { + iEditor->AddAddressL( *emailAddress ); + } + else + { + // selected contact doesn't have email address, launch remote contact lookup + // rcl must be usable, since otherwise there couldn't be any items + // without email addresses + CPbkxRemoteContactLookupServiceUiContext::TResult::TExitReason exitReason; + CESMRNcsEmailAddressObject* remAddress = ExecuteRemoteSearchL( + exitReason, + emailAddress->DisplayName() ); + if ( remAddress ) + { + CleanupStack::PushL( remAddress ); + iEditor->AddAddressL( *remAddress ); + CleanupStack::PopAndDestroy( remAddress ); + } + } + CleanupStack::PopAndDestroy( emailAddress ); + } + } + ClosePopupContactListL(); + } + +// ----------------------------------------------------------------------------- +// CNcsHeaderContainer::ClosePopupContactListL() +// ----------------------------------------------------------------------------- +// +void CESMRAttendeeField::ClosePopupContactListL() + { + FUNC_LOG; + // Disable popup if we get async HandleControlEventL later + iAacListBoxEnabled = EFalse; + + if ( iAacListBox && iAacListBox->IsVisible() ) + { + iAacListBox->MakeVisible( EFalse ); + AknsUtils::SetAvkonSkinEnabledL( ETrue ); + ShowPopupCbaL( EFalse ); + } + + UpdateSendOptionL(); + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::ExecuteRemoteSearchL +// --------------------------------------------------------------------------- +// +CESMRNcsEmailAddressObject* CESMRAttendeeField::ExecuteRemoteSearchL( + CPbkxRemoteContactLookupServiceUiContext::TResult::TExitReason& /*aExitReason*/, + const TDesC& aSearchText ) + { + FUNC_LOG; + RBuf displayname; // codescanner::resourcenotoncleanupstack + displayname.CreateL( KMaxRemoteSearchResponseLength ); + displayname.CleanupClosePushL(); + RBuf emailAddress; // codescanner::resourcenotoncleanupstack + emailAddress.CreateL( KMaxRemoteSearchResponseLength ); + emailAddress.CleanupClosePushL(); + + TBool contactSelected = iContactHandler->LaunchRemoteLookupL( aSearchText, + displayname, + emailAddress ); + + CESMRNcsEmailAddressObject* address = NULL; + if ( contactSelected ) + { + if ( !displayname.Length() ) + { + address = CESMRNcsEmailAddressObject::NewL( emailAddress, emailAddress ); + } + else + { + address = CESMRNcsEmailAddressObject::NewL( displayname, emailAddress ); + } + } + + CleanupStack::PopAndDestroy( &emailAddress ); + CleanupStack::PopAndDestroy( &displayname ); + + return address; + } + +// --------------------------------------------------------------------------- +// CESMRAttendeeField::UpdateSendOptionL +// --------------------------------------------------------------------------- +// +void CESMRAttendeeField::UpdateSendOptionL() + { + FUNC_LOG; + // Check if editor has text and it is different from default text. + HBufC *text = iEditor->GetTextInHBufL(); + TBool enable = text && text->Length() > 0 && text->Compare( *iDefaultText ) != 0; + delete text; + + // Send proper command to CESMREditorDialog::ProcessCommandL + TInt command = 0; + if ( iRole == CCalAttendee::EReqParticipant ) + { + if ( enable ) + { + command = EESMRCmdAttendeeRequiredEnabled; + } + else + { + command = EESMRCmdAttendeeRequiredDisabled; + } + } + else if ( iRole == CCalAttendee::EOptParticipant ) + { + if ( enable ) + { + command = EESMRCmdAttendeeOptionalEnabled; + } + else + { + command = EESMRCmdAttendeeOptionalDisabled; + } + } + + NotifyEventL( command ); + } + +//EOF +