phonebookui/Phonebook2/UIControls/src/CPbk2SelectFieldDlg.cpp
changeset 0 e686773b3f54
child 21 9da50d567e3c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/UIControls/src/CPbk2SelectFieldDlg.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,773 @@
+/*
+* Copyright (c) 2005-2007 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:  Phonebook 2 field selection dialog.
+*
+*/
+
+
+#include "CPbk2SelectFieldDlg.h"
+
+// Phonebook 2
+#include "MPbk2ControlKeyObserver.h"
+#include "MPbk2ClipListBoxText.h"
+#include <CPbk2IconArray.h>
+#include <CPbk2PresentationContactFieldCollection.h>
+#include <CPbk2StorePropertyArray.h>
+#include <CPbk2UIExtensionManager.h>
+#include <MPbk2UIExtensionIconSupport.h>
+#include <Pbk2UIControls.rsg>
+#include <CPbk2PresenceIconInfo.h>
+#include "CPbk2FieldAnalyzer.h"
+#include <CPbk2ApplicationServices.h>
+
+// Virtual Phonebook
+#include <CVPbkContactManager.h>
+#include <MVPbkContactStore.h>
+#include <MVPbkBaseContact.h>
+#include <MVPbkContactLink.h>
+
+// System includes
+#include <avkon.rsg>
+#include <aknPopup.h>
+#include <aknlists.h>
+#include <eikclbd.h>
+#include <calslbs.h>
+#include <barsread.h>
+#include <MPbk2AppUi.h>
+#include "CPbk2IconInfo.h"
+#include <CPbk2ServiceManager.h>
+#include <MPbk2ApplicationServices.h>
+#include <MPbk2ApplicationServices2.h>
+#include <aknlayoutscalable_avkon.cdl.h>
+
+/// Unnamed namespace for local definitions
+namespace {
+
+//uid for presence icons
+const TInt32 KPbk2PrecenceIconsId = 0x2001E63D;
+
+#ifdef _DEBUG
+enum TPanicCode
+    {
+    EPanicPostCond_Constructor = 1,
+    EPanicPreCond_ExecuteLD,
+    EPanicPreCond_AttemptExitL,
+    EPanicPreCond_ResetWhenDestroyed
+    };
+
+void Panic(TPanicCode aReason)
+    {
+    _LIT(KPanicText, "CPbkSelectFieldDlg");
+    User::Panic(KPanicText, aReason);
+    }
+#endif // _DEBUG
+
+
+/**
+ * Creates and returns an icon array with Phonebook 2
+ * default and extension icons.
+ *
+ * @param aPresenceIconsArray Presence icons array
+ * @return  An array filled with icons.
+ */
+CPbk2IconArray* CreateListBoxIconArrayL(
+    const TArray<CPbk2PresenceIconInfo*>* aPresenceIconsArray,
+    RArray<CPbk2FieldListBoxModel::TPresenceIconPosInIconArray>&
+        aPresenceIconsPos )
+    {
+    // Create icon array
+    TResourceReader reader;
+    CCoeEnv::Static()->CreateResourceReaderLC( reader,
+        R_PBK2_FIELDTYPE_ICONS );
+    CPbk2IconArray* iconArray = CPbk2IconArray::NewL( reader );
+    CleanupStack::PushL( iconArray );
+    
+    //Calculate preferred size for xsp service icons 
+    TRect mainPane;
+    AknLayoutUtils::LayoutMetricsRect(
+        AknLayoutUtils::EMainPane, mainPane );
+    TAknLayoutRect listLayoutRect;
+    listLayoutRect.LayoutRect(
+        mainPane,
+        AknLayoutScalable_Avkon::list_single_graphic_pane_g1(0).LayoutLine() );
+    TSize size(listLayoutRect.Rect().Size());
+      
+    // Add xsp service icons
+    CPbk2ApplicationServices* appServices =
+        CPbk2ApplicationServices::InstanceLC();
+    MPbk2ApplicationServices2* servicesExtension = 
+        reinterpret_cast<MPbk2ApplicationServices2*>
+            ( appServices->MPbk2ApplicationServicesExtension(
+                    KMPbk2ApplicationServicesExtension2Uid ) );
+    CleanupStack::PopAndDestroy(); // appServices
+    CPbk2ServiceManager& servMan = servicesExtension->ServiceManager();
+    const CPbk2ServiceManager::RServicesArray& services = servMan.Services();
+    TUid uid;
+    uid.iUid = KPbk2ServManId;
+    for ( TInt i = 0; i < services.Count(); i++ )
+        {
+        const CPbk2ServiceManager::TService& service = services[i];
+        if ( service.iBitmapId && service.iBitmap )
+            {
+        	AknIconUtils::SetSize(
+        	           service.iBitmap,
+        	           size );
+        	AknIconUtils::SetSize(
+        	           service.iMask,
+        	           size );
+            
+            TPbk2IconId id = TPbk2IconId( uid, services[i].iBitmapId );
+            CPbk2IconInfo* info = CPbk2IconInfo::NewLC(
+                id, services[i].iBitmap, services[i].iMask, size );
+            iconArray->AppendIconL(info);
+            CleanupStack::Pop(info);
+            }
+        }    
+
+    // Add icons from UI extensions
+    CPbk2UIExtensionManager* extManager = CPbk2UIExtensionManager::InstanceL();
+    extManager->PushL();
+    extManager->IconSupportL().AppendExtensionIconsL( *iconArray );
+    CleanupStack::PopAndDestroy(); // extManager
+    
+    // add presence icons if exist
+    if ( aPresenceIconsArray != NULL )
+        {
+        TUid presenceIconsUid;
+        presenceIconsUid.iUid = KPbk2PrecenceIconsId;
+        TInt count = aPresenceIconsArray->Count();
+        for ( TInt j = 0; j < count; j++ )
+            {
+            TPbk2IconId presenceIconId = TPbk2IconId( presenceIconsUid, j );
+            CPbk2IconInfo* presenceIconInfo = CPbk2IconInfo::NewLC(
+                presenceIconId,
+                aPresenceIconsArray->operator[](j)->IconBitmap(),
+                aPresenceIconsArray->operator[](j)->IconBitmapMask(),
+                size );
+            iconArray->AppendIconL( presenceIconInfo );
+            CleanupStack::Pop( presenceIconInfo );
+            
+            // save presence icon position
+            CPbk2FieldListBoxModel::TPresenceIconPosInIconArray presenceIconPos( 
+                aPresenceIconsArray->operator[](j)->ServiceName() );
+            presenceIconPos.iIconId = presenceIconId;
+            aPresenceIconsPos.AppendL( presenceIconPos );
+            }
+        }
+    
+    CleanupStack::Pop( iconArray );
+    CleanupStack::PopAndDestroy(); // reader
+
+    return iconArray;
+    }
+
+} /// namespace
+
+
+/**
+ * Specialized popup list class.
+ */
+NONSHARABLE_CLASS( CPbk2SelectFieldDlg::CPopupList ) :
+        public CAknPopupList
+    {
+    public: // Interface
+
+        /**
+         * Like CAknPopupList::NewL.
+         * @see CAknPopupList::NewL
+         */
+        static CPopupList* NewL(
+                CEikListBox* aListBox,
+                TInt aCbaResource,
+                AknPopupLayouts::TAknPopupLayouts aType =
+                    AknPopupLayouts::EMenuWindow );
+
+        /**
+         * Sets the listbox item to focus initially.
+         * By default focus is on the first item.
+         *
+         * @param aFocusIndex  Index of the listbox item to focus initially.
+         */
+        inline void SetInitialFocus(
+                TInt aFocusIndex );
+
+        /**
+         * Like CAknPopupList::AttemptExitL.
+         * @see CAknPopupList::AttemptExitL
+         */
+        inline void AttemptExitL(
+                TBool aAccept );
+
+    private: // From CAknPopupList
+        void SetupWindowLayout(
+                AknPopupLayouts::TAknPopupLayouts aType );
+        
+        TKeyResponse OfferKeyEventL(
+                const TKeyEvent& aKeyEvent,TEventCode aType );
+
+    private: // Implementation
+        inline CPopupList();
+
+    private: // Data
+        /// Own: Focus index
+        TInt iFocusIndex;
+    };
+
+/**
+ * Specialized listbox class.
+ */
+NONSHARABLE_CLASS( CPbk2SelectFieldDlg::CListBox ) :
+        public CAknDoubleGraphicPopupMenuStyleListBox,
+        public MPbk2ClipListBoxText
+    {
+    public: // Interface
+
+        /**
+         * Constructor.
+         */
+        inline CListBox();
+
+        /**
+         * Sets the observer.
+         *
+         * @param aKeyObserver      The observer to set.
+         */
+        inline void SetObserver(
+                MPbk2ControlKeyObserver* aKeyObserver );
+
+        /**
+         * Returns CONE environment.
+         *
+         * @return  CONE environment.
+         */
+        inline CCoeEnv* CoeEnv();
+
+    private: // From CAknDoubleGraphicPopupMenuStyleListBox
+        TKeyResponse OfferKeyEventL(
+            const TKeyEvent& aKeyEvent,
+            TEventCode aType );
+
+    private: // From MPbk2ClipListBoxText
+        TBool ClipFromBeginning(
+            TDes& aBuffer,
+            TInt aItemIndex,
+            TInt aSubCellNumber );
+
+    private: // Data
+        /// Ref: Observer
+        MPbk2ControlKeyObserver* iKeyObserver;
+    };
+
+
+// --------------------------------------------------------------------------
+// CPbk2SelectFieldDlg::CListBox::CPopupList
+// --------------------------------------------------------------------------
+//
+inline CPbk2SelectFieldDlg::CPopupList::CPopupList() :
+        iFocusIndex( KErrNotFound )
+    {
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2SelectFieldDlg::CListBox::NewL
+// --------------------------------------------------------------------------
+//
+CPbk2SelectFieldDlg::CPopupList* CPbk2SelectFieldDlg::CPopupList::NewL
+        ( CEikListBox* aListBox,  TInt aCbaResource,
+          AknPopupLayouts::TAknPopupLayouts aType )
+    {
+    CPopupList* self = new ( ELeave ) CPopupList();
+    CleanupStack::PushL( self );
+    self->ConstructL( aListBox, aCbaResource, aType );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2SelectFieldDlg::CListBox::SetInitialFocus
+// --------------------------------------------------------------------------
+//
+inline void CPbk2SelectFieldDlg::CPopupList::SetInitialFocus
+        ( TInt aFocusIndex )
+    {
+    iFocusIndex = aFocusIndex;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2SelectFieldDlg::CPopupList::AttemptExitL
+// --------------------------------------------------------------------------
+//
+inline void CPbk2SelectFieldDlg::CPopupList::AttemptExitL( TBool aAccept )
+    {
+    CAknPopupList::AttemptExitL( aAccept );
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2SelectFieldDlg::CListBox::SetupWindowLayout
+// --------------------------------------------------------------------------
+//
+void CPbk2SelectFieldDlg::CPopupList::SetupWindowLayout
+        ( AknPopupLayouts::TAknPopupLayouts aType )
+    {
+    // Call base class
+    CAknPopupList::SetupWindowLayout( aType );
+    // Set initial focus
+    if ( iFocusIndex >= 0 )
+        {
+        ListBox()->SetCurrentItemIndex( iFocusIndex );
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2SelectFieldDlg::CListBox::OfferKeyEventL
+// --------------------------------------------------------------------------
+//
+TKeyResponse CPbk2SelectFieldDlg::CPopupList::OfferKeyEventL
+        (const TKeyEvent& aKeyEvent, TEventCode aType)
+    {
+    // The focus can display after clicking on navigation key and MSK key.
+    // Then, both LSK and RSK should be visible.
+    // Check whether LSK is hidden, if yes, make it visible
+    if ( !ButtonGroupContainer()->IsCommandVisible( EAknSoftkeySelect ) )
+    	{
+        // Whether navigation key or MSK key is pressed.
+    	if ( aKeyEvent.iCode == EKeyUpArrow  
+          || aKeyEvent.iCode == EKeyDownArrow 
+          || aKeyEvent.iCode == EKeyDevice3 )
+            {
+            ButtonGroupContainer()->MakeCommandVisible( EAknSoftkeySelect, ETrue );
+            }
+    	}
+    TKeyResponse response = ListBox()->OfferKeyEventL( aKeyEvent, aType );
+    return response;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2SelectFieldDlg::CListBox::CListBox
+// --------------------------------------------------------------------------
+//
+inline CPbk2SelectFieldDlg::CListBox::CListBox()
+    {
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2SelectFieldDlg::CListBox::SetObserver
+// --------------------------------------------------------------------------
+//
+inline void CPbk2SelectFieldDlg::CListBox::SetObserver
+        ( MPbk2ControlKeyObserver* aKeyObserver )
+    {
+    iKeyObserver = aKeyObserver;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2SelectFieldDlg::CListBox::CoeEnv
+// --------------------------------------------------------------------------
+//
+inline CCoeEnv* CPbk2SelectFieldDlg::CListBox::CoeEnv()
+    {
+    return iCoeEnv;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2SelectFieldDlg::CListBox::OfferKeyEventL
+// --------------------------------------------------------------------------
+//
+TKeyResponse CPbk2SelectFieldDlg::CListBox::OfferKeyEventL
+        ( const TKeyEvent& aKeyEvent, TEventCode aType )
+    {
+    TKeyResponse ret = EKeyWasNotConsumed;
+
+    if ( iKeyObserver &&
+         iKeyObserver->Pbk2ControlKeyEventL( aKeyEvent,aType )
+            == EKeyWasConsumed )
+        {
+        ret = EKeyWasConsumed;
+        }
+    else
+        {
+        ret = CAknDoubleGraphicPopupMenuStyleListBox::OfferKeyEventL
+            ( aKeyEvent, aType );
+        }
+
+    return ret;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2SelectFieldDlg::CListBox::ClipFromBeginning
+// --------------------------------------------------------------------------
+//
+TBool CPbk2SelectFieldDlg::CListBox::ClipFromBeginning
+        ( TDes& aBuffer, TInt aItemIndex, TInt aSubCellNumber )
+    {
+    return AknTextUtils::ClipToFit
+        ( aBuffer, AknTextUtils::EClipFromBeginning, this,
+          aItemIndex, aSubCellNumber );
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2SelectFieldDlg::CPbk2SelectFieldDlg
+// --------------------------------------------------------------------------
+//
+CPbk2SelectFieldDlg::CPbk2SelectFieldDlg()
+    {
+    __ASSERT_DEBUG(
+        !iListBox && !iPopupList && !iKeyObserver && !iDestroyedPtr,
+        Panic(EPanicPostCond_Constructor));
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2SelectFieldDlg::~CPbk2SelectFieldDlg
+// --------------------------------------------------------------------------
+//
+CPbk2SelectFieldDlg::~CPbk2SelectFieldDlg()
+    {
+    if ( iSelfPtr )
+        {
+        *iSelfPtr = NULL;
+        }
+    if ( iDestroyedPtr )
+        {
+        *iDestroyedPtr = ETrue;
+        }
+    if ( iPopupList )
+        {
+        iPopupList->CancelPopup();
+        }
+    
+    delete iFieldAnalyzer;
+    delete iListBox;
+    iFieldCollectionArray.ResetAndDestroy();
+    iPresenceIconsPos.Reset();
+    
+    delete iContactLink;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2SelectFieldDlg::StoreReady
+// --------------------------------------------------------------------------
+//
+void CPbk2SelectFieldDlg::StoreReady( 
+        MVPbkContactStore& /*aContactStore*/ )
+    {
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2SelectFieldDlg::StoreUnavailable
+// --------------------------------------------------------------------------
+//
+void CPbk2SelectFieldDlg::StoreUnavailable( 
+        MVPbkContactStore& /*aContactStore*/, 
+        TInt /*aReason*/ )
+    {
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2SelectFieldDlg::HandleStoreEventL
+// --------------------------------------------------------------------------
+//
+void CPbk2SelectFieldDlg::HandleStoreEventL( 
+        MVPbkContactStore& /*aContactStore*/, 
+        TVPbkContactStoreEvent aStoreEvent )
+    {
+    if ( iContactLink && 
+            aStoreEvent.iContactLink &&
+            aStoreEvent.iContactLink->IsSame( *iContactLink ) )
+        {
+        switch( aStoreEvent.iEventType )
+            {
+            case TVPbkContactStoreEvent::EContactDeleted:
+                {
+                iPopupList->CancelPopup();
+                break;
+                }
+                
+            default:
+                break;
+            }
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2SelectFieldDlg::ExecuteLCD
+// --------------------------------------------------------------------------
+//
+const MVPbkStoreContactField* CPbk2SelectFieldDlg::ExecuteLCD
+        ( MVPbkStoreContactFieldCollection& aFieldCollection,
+          RPointerArray<CVPbkFieldFilter>& aFieldCollectionArray,
+          const TArray<CPbk2PresenceIconInfo*>* aPresenceIconsArray,
+          const CVPbkContactManager& aContactManager,
+          const MPbk2FieldPropertyArray& aFieldProperties,
+          TInt aCbaResourceId, 
+          VPbkFieldTypeSelectorFactory::TVPbkContactActionTypeSelector aCommMethod,
+          const TDesC& aHeading /*=KNullDesC*/,
+          TInt aFocusIndex /*=KErrNotFound*/ )
+    {
+    __ASSERT_DEBUG(!iListBox && !iPopupList, Panic(EPanicPreCond_ExecuteLD));
+
+    // "D" function semantics
+    CleanupStack::PushL( this );
+    TBool thisDestroyed = EFalse;
+    // Destructor will set thisDestroyed to ETrue if this object is destroyed
+    iDestroyedPtr = &thisDestroyed;
+
+    CPbk2PresentationContactFieldCollection* fields =
+        CPbk2PresentationContactFieldCollection::NewL(
+            aFieldProperties,
+            aFieldCollection,
+            aFieldCollection.ParentStoreContact() );
+    CleanupStack::PushL( fields );
+
+    if ( aFocusIndex != KErrNotFound )
+        {
+        // The focus index is from store contact field order and
+        // we have to map it to presentation contact field order
+        MVPbkStoreContactField* initiallyFocusedField =
+            aFieldCollection.FieldAtLC( aFocusIndex );
+        for ( TInt i( 0 ); i < fields->FieldCount(); ++i )
+            {
+            if ( fields->FieldAt( i ).IsSame( *initiallyFocusedField ) )
+                {
+                // Fix the focus index to match with
+                // presentation contact fields
+                aFocusIndex = i;
+                break;
+                }
+            }
+        CleanupStack::PopAndDestroy(); // initiallyFocusedField
+        }
+
+    // Create presentation fields for additional contacts
+    if ( aFieldCollectionArray.Count() > 0 )
+        {
+        TInt count = aFieldCollectionArray.Count();
+        for( TInt i = 0; i < count; i++ )
+            {
+            CPbk2PresentationContactFieldCollection* xspFields =
+                CPbk2PresentationContactFieldCollection::NewL(
+                    aFieldProperties,
+                    *aFieldCollectionArray[i],
+                    aFieldCollectionArray[i]->ParentStoreContact() );
+            CleanupStack::PushL( xspFields );
+
+            iFieldCollectionArray.AppendL( xspFields );
+            CleanupStack::Pop(); //xspFields
+            }
+        }
+
+    // Create list box
+    CreateListBoxL( *fields, aPresenceIconsArray, aContactManager, 
+        aFieldProperties, aCbaResourceId, aHeading, aFocusIndex, aCommMethod );
+                    
+    // Show the list query, if there are more than 1 field in the listbox
+    TInt dlgResult = 0;
+    if ( iListBoxModel->MdcaCount() > 1 )
+        {
+        MVPbkBaseContact& contact = fields->ParentContact();
+        MVPbkContactLink* link = contact.CreateLinkLC();
+        MVPbkContactStore& store = link->ContactStore();
+        store.OpenL( *this );
+        delete iContactLink;
+        iContactLink = link;
+        CleanupStack::Pop(); // link
+        
+        TRAPD( err, dlgResult = iPopupList->ExecuteLD() );
+        store.Close( *this );
+        
+        if ( !thisDestroyed )
+            {
+            iPopupList = NULL;
+            }
+        if ( err != KErrNone )
+            {
+            User::Leave( err );
+            }
+        }
+   else
+       {
+       dlgResult = 1; // simulate user's selection
+       delete iPopupList;
+       iPopupList = NULL;
+       }
+
+    // Get the return value
+    MVPbkStoreContactField* result = NULL;
+    if ( thisDestroyed )
+        {
+        // This object has been destroyed
+        CleanupStack::PopAndDestroy( fields );
+        CleanupStack::Pop();  // this
+        }
+    else
+        {
+        if ( dlgResult )
+            {
+            TInt index = iListBoxModel->GetModelIndex(
+                iListBox->CurrentItemIndex() );
+            if ( index < fields->FieldCount() )
+                {
+                // field from the main contact
+                result = fields->FieldAt( index ).CloneLC();
+                CleanupStack::Pop();
+                }
+            else if ( iFieldCollectionArray.Count() > 0 )
+                {
+                // field from the addiotnal contact
+                TInt offset = fields->FieldCount();
+                for ( TInt i = 0; i < iFieldCollectionArray.Count(); i++ )
+                    {
+                    TInt xspFieldCount = iFieldCollectionArray.operator[](i)->
+                        FieldCount();
+                    if ( index < offset + xspFieldCount )
+                        {
+                        // selected field belongs to iFieldCollectionArray[i] contact
+                        result = iFieldCollectionArray.operator[](i)->FieldAt(
+                            index - offset ).CloneLC();
+                        CleanupStack::Pop();
+                        break;
+                        }
+                    else
+                        {
+                        offset += xspFieldCount;
+                        }
+                    }
+                }
+            }
+        CleanupStack::PopAndDestroy( fields );
+        CleanupStack::PopAndDestroy(); // this
+        }
+
+    CleanupDeletePushL( result );
+    return result;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2SelectFieldDlg::SetObserver
+// --------------------------------------------------------------------------
+//
+void CPbk2SelectFieldDlg::SetObserver
+        ( MPbk2ControlKeyObserver* aKeyObserver )
+    {
+    iKeyObserver = aKeyObserver;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2SelectFieldDlg::AttemptExitL
+// --------------------------------------------------------------------------
+//
+void CPbk2SelectFieldDlg::AttemptExitL( TBool aAccept )
+    {
+    __ASSERT_DEBUG( iPopupList, Panic( EPanicPreCond_AttemptExitL ) );
+    iPopupList->MakeVisible( EFalse );
+    iPopupList->AttemptExitL( aAccept );
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2SelectFieldDlg::ResetWhenDestroyed
+// --------------------------------------------------------------------------
+//
+void CPbk2SelectFieldDlg::ResetWhenDestroyed
+        ( CPbk2SelectFieldDlg** aSelfPtr )
+    {
+    __ASSERT_DEBUG(!aSelfPtr || *aSelfPtr==this,
+        Panic(EPanicPreCond_ResetWhenDestroyed));
+
+    iSelfPtr = aSelfPtr;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2SelectFieldDlg::CreateListBoxL
+// --------------------------------------------------------------------------
+//
+void CPbk2SelectFieldDlg::CreateListBoxL
+        ( const CPbk2PresentationContactFieldCollection& aFieldCollection,
+          const TArray<CPbk2PresenceIconInfo*>* aPresenceIconsArray,
+          const CVPbkContactManager& aContactManager,
+          const MPbk2FieldPropertyArray& aFieldProperties,
+          TInt aCbaResourceId, const TDesC& aHeading,
+          TInt aFocusIndex,
+          VPbkFieldTypeSelectorFactory::TVPbkContactActionTypeSelector aCommMethod)
+    {
+    // Create a list box
+    iListBox = new(ELeave) CListBox;
+
+    // Create a popup list
+    CPopupList* popupList = CPopupList::NewL(
+        iListBox,
+        aCbaResourceId,
+        AknPopupLayouts::EMenuDoubleLargeGraphicWindow );
+    CleanupStack::PushL( popupList );
+
+    // Init list box
+    iListBox->ConstructL( popupList, CEikListBox::ELeftDownInViewRect );
+    iListBox->SetObserver( iKeyObserver );
+
+    // Set title of popuplist
+    if ( aHeading.Length() > 0 )
+        {
+        popupList->SetTitleL( aHeading );
+        }
+
+    // There is no focus at the initial phase, hence, LSK is not necessary.
+    popupList->ButtonGroupContainer()->MakeCommandVisible( EAknSoftkeySelect, EFalse );
+
+    // Create icon array
+    CPbk2IconArray* iconArray = CreateListBoxIconArrayL( aPresenceIconsArray,
+        iPresenceIconsPos );
+    iListBox->ItemDrawer()->ColumnData()->SetIconArray( iconArray );
+
+    // Create list box model
+    HBufC* timeFormat =
+        iListBox->CoeEnv()->AllocReadResourceLC( R_QTN_DATE_USUAL );
+
+    iFieldAnalyzer = CPbk2FieldAnalyzer::NewL( const_cast<CVPbkContactManager&>( aContactManager ) );
+    
+    CPbk2FieldListBoxModel::TParams params( 
+        aFieldCollection,
+        aContactManager,
+        aFieldProperties,
+        *timeFormat,
+        *iconArray,
+        iFieldAnalyzer,
+        NULL,
+        ETrue,
+		aCommMethod );
+    CPbk2FieldListBoxModel* listBoxModel = CPbk2FieldListBoxModel::NewL(
+        params, &iFieldCollectionArray.Array(), &iPresenceIconsPos.Array() );
+    CleanupStack::PushL( listBoxModel );
+    listBoxModel->FormatFieldsL();
+    CleanupStack::Pop( listBoxModel );
+    CleanupStack::PopAndDestroy();  // timeFormat
+    listBoxModel->SetClipper( *iListBox );
+    iListBox->Model()->SetItemTextArray( listBoxModel );
+    iListBox->Model()->SetOwnershipType( ELbmOwnsItemArray );
+    iListBox->Reset();
+
+    if ( aFocusIndex >= 0 && aFocusIndex <
+            iListBox->Model()->NumberOfItems() )
+        {
+        popupList->SetInitialFocus( aFocusIndex );
+        }
+
+    iListBox->CreateScrollBarFrameL( ETrue );
+    iListBox->ScrollBarFrame()->SetScrollBarVisibilityL(
+        CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto );
+
+    CleanupStack::Pop();  // listBox
+    iPopupList = popupList;
+    
+    iListBoxModel = listBoxModel;
+    }
+
+// End of File