--- /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 <eiklabel.h>
+#include <avkon.hrh>
+#include <caluser.h>
+#include <calentry.h>
+#include <StringLoader.h>
+#include <esmrgui.rsg>
+#include <AknsFrameBackgroundControlContext.h>
+//<cmail>
+#include "esmrcommands.h"
+#include "CFSMailClient.h"
+//</cmail>
+#include "cesmrncspopuplistbox.h"
+#include "cesmrncsemailaddressobject.h"
+#include "mesmrlistobserver.h"
+#include "cesmrborderlayer.h"
+#include "cesmrcontacthandler.h"
+#include "mesmrmeetingrequestentry.h"
+#include "esmrfieldbuilderdef.h"
+#include "cesmrlayoutmgr.h"
+// <cmail> Removed profiling. </cmail>
+
+using namespace ESMRLayout;
+
+//CONSTANTS
+
+// unnamed namespace for local definitions
+namespace { // codescanner::namespace
+
+const TInt KMaxRemoteSearchResponseLength = 255;
+
+static void RPointerArrayResetAndDestroy( TAny* aPtr )
+ {
+ static_cast<RPointerArray<CESMRNcsEmailAddressObject>*>( 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<MESMRMeetingRequestEntry*>(&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<CESMRClsItem>* aContacts )
+ {
+ FUNC_LOG;
+ if ( aContacts )
+ {
+ RPointerArray<CESMRNcsEmailAddressObject> 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<CESMRNcsEmailAddressObject> attendees = iEditor->GetAddressesL ( );
+ CCalEntry& entry( aMREntry.Entry() );
+ TInt count = attendees.Count ( );
+
+ for (TInt i=0; i<count; i++ )
+ {
+ CESMRNcsEmailAddressObject* obj = attendees[i];
+ CCalAttendee* attendee = CCalAttendee::NewL ( obj->EmailAddress ( ) );
+ 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<CCalUser*>(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
+