phonebookui/Phonebook2/ccapplication/ccamycardplugin/src/ccappmycardcontainer.cpp
branchRCL_3
changeset 63 f4a778e096c2
child 64 c1e8ba0c2b16
child 68 9da50d567e3c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/ccapplication/ccamycardplugin/src/ccappmycardcontainer.cpp	Wed Sep 01 12:29:52 2010 +0100
@@ -0,0 +1,1233 @@
+/*
+* 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:  Implementation of mycard plugin control container
+*
+*/
+
+
+// INCLUDE FILES
+#include <ccaextensionfactory.h>
+
+#include <aknlists.h>
+#include <eiktxlbm.h>
+#include <barsread.h>
+#include <AknsDrawUtils.h>
+#include <AknsBasicBackgroundControlContext.h>
+#include <AknUtils.h>
+#include <s32mem.h>
+
+#include <MPbk2ContactNameFormatter.h>
+#include <MVPbkStoreContact.h>
+#include <CPbk2IconArray.h>
+#include <Pbk2UIControls.rsg>
+#include <MPbk2Command.h>
+#include <Pbk2MenuFilteringFlags.hrh>
+#include <MVPbkContactLink.h>
+
+#include "ccappmycard.hrh"
+#include "ccappmycard.h"
+#include "ccappmycardcontainer.h"
+#include "ccappmycardcommon.h"
+#include "ccappmycardheadercontrol.h"
+#include "ccappmycardplugin.h"
+#include "ccafactoryextensionnotifier.h"
+
+#include <spbcontentprovider.h>
+#include <spbcontactdatamodel.h> 
+
+#include <MVPbkContactFieldTextData.h>
+#include <ccaextensionfactory.hrh>
+#include <mccaparameter.h>
+
+#include <aknlayoutscalable_avkon.cdl.h>
+#include <layoutmetadata.cdl.h>
+#include <AknsUtils.h>
+#include <ccappmycardpluginrsc.rsg>
+#include <gulicon.h>
+#include <phonebook2ece.mbg>
+#include <VPbkEng.rsg>
+#include "MVPbkFieldType.h"
+#include <aknstyluspopupmenu.h>
+#include <e32std.h>
+#include <aknlayoutscalable_apps.cdl.h>
+#include <Pbk2PresentationUtils.h>
+#include <Pbk2Presentation.rsg>
+#include <RPbk2LocalizedResourceFile.h>
+#include <Pbk2DataCaging.hrh>
+#include <pbk2nameordercenrep.h>
+#include <centralrepository.h>
+#include <Phonebook2PrivateCRKeys.h>
+#include <CPbk2PresentationContact.h>
+#include <CPbk2PresentationContactFieldCollection.h>
+
+#include <CPbk2ApplicationServices.h>
+#include <CPbk2ServiceManager.h>
+#include <TPbk2IconId.h>
+#include <CPbk2IconInfo.h>
+#include <csxhelp/phob.hlp.hrh>
+#include <Pbk2UID.h>
+#include <f32file.h>
+#include <AknsConstants.h>
+
+// unnamed namespace
+namespace
+{
+_LIT( KMyCardIconDefaultFileName, "\\resource\\apps\\phonebook2ece.mif" );
+const TInt KSubComponentCount = 2;
+const TInt KNumberOfContacts = 1;
+const TInt KNoContacts = 0;
+const TInt KPbk2UiSpecNameOrderFirstNameLastName = 0;
+const TInt KPbk2UiSpecNameOrderLastNameFirstName = 1;
+}
+
+// =========================== MEMBER FUNCTIONS ===============================
+
+// ----------------------------------------------------------------------------
+// CCCAppMyCardContainer::CCCAppMyCardContainer()
+// ----------------------------------------------------------------------------
+//
+CCCAppMyCardContainer::CCCAppMyCardContainer(
+    CCCAppMyCardPlugin& aPlugin ) :
+    iPlugin( aPlugin ),
+    iModel( aPlugin.Model() ),
+    iNameOrder(KPbk2UiSpecNameOrderFirstNameLastName)
+    {
+    }
+
+// ----------------------------------------------------------------------------
+// CCCAppMyCardContainer::~CCCAppMyCardContainer()
+// ----------------------------------------------------------------------------
+//
+CCCAppMyCardContainer::~CCCAppMyCardContainer()
+    {
+    iModel.SetClipListBoxText( NULL );
+	iPlugin.MyCard().RemoveObserver( this );
+	delete iBackground;
+    delete iHeaderCtrl;
+    delete iListBox;
+    delete iImageLoader;
+    delete iFactoryExtensionNotifier;
+    delete iViewLauncher;
+    delete iImageSelectionPopup;
+    }
+
+// ----------------------------------------------------------------------------
+// CCCAppMyCardContainer::ConstructL()
+// ----------------------------------------------------------------------------
+//
+void CCCAppMyCardContainer::ConstructL()
+    {
+    CCA_DP(KMyCardLogFile, CCA_L("->CCCAppMyCardContainer::ConstructL()"));
+
+    iPlugin.MyCard().AddObserverL( this );
+
+    ResolveNameOrderL();
+    
+    // Header UI control
+    iHeaderCtrl = CCCAppMyCardHeaderControl::NewL( *this );
+    iHeaderCtrl->SetContainerWindowL( *this );
+    iHeaderCtrl->AddObserverL( this );
+
+    // Details list UI control
+    iListBox = new(ELeave) CAknFormDoubleGraphicStyleListBox;
+    iListBox->ConstructL( this, EAknListBoxSelectionList );
+    iListBox->SetContainerWindowL( *this );
+    iListBox->EnableStretching( EFalse );
+    
+    // Setup listbox
+    iListBox->View()->SetListEmptyTextL( KNullDesC );
+    iListBox->CreateScrollBarFrameL( ETrue );
+    iListBox->ScrollBarFrame()->SetScrollBarVisibilityL(
+        CEikScrollBarFrame::EOff,
+        CEikScrollBarFrame::EAuto );
+
+    // Create icons for listbox.
+    TResourceReader reader;
+    iCoeEnv->CreateResourceReaderLC( reader, R_PBK2_FIELDTYPE_ICONS );
+    iIconArray = CPbk2IconArray::NewL( reader );
+  
+    // 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::InstanceL();
+    CPbk2ServiceManager& servMan = appServices->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, service.iBitmapId );
+            CPbk2IconInfo* info = CPbk2IconInfo::NewLC(
+               id, service.iBitmap, service.iMask, size );
+            iIconArray->AppendIconL( info );
+            CleanupStack::Pop( info );
+            }        
+        }
+    
+    Release( appServices );
+        
+    iListBox->ItemDrawer()->ColumnData()->SetIconArray( iIconArray );
+    CleanupStack::PopAndDestroy(); // reader
+
+    // setup model
+    iModel.SetClipListBoxText( this );
+    iModel.UpdateIconsL( *iIconArray );
+    SetNameForHeaderControlL();
+    
+    iListBox->Model()->SetItemTextArray( &iModel.ListBoxModel() );
+    iListBox->Model()->SetOwnershipType( ELbmDoesNotOwnItemArray );
+
+    // Get the skin background for the view
+    iBackground = CAknsBasicBackgroundControlContext::NewL(
+        KAknsIIDQsnBgAreaMain, TRect(0, 0, 0, 0), EFalse );
+
+    // Start observing now that the class is ready
+    iListBox->SetListBoxObserver( this );
+    iPlugin.MyCard().AddObserverL( this );
+
+    if( iPlugin.MyCard().IsContactLinkReady() )
+    	{
+        CCCAppStatusControl* statusControl = iHeaderCtrl->StatusControl();
+    	if( statusControl )
+    	    {
+            statusControl->SetContactLinkL( iPlugin.MyCard().ContactLink() );
+    	    }
+		iControlLink = ETrue;
+    	}
+    iFactoryExtensionNotifier = CCCaFactoryExtensionNotifier::NewL();
+
+    TCallBack callBack( CCCAppMyCardContainer::CheckExtensionFactoryL, this );
+    iFactoryExtensionNotifier->ObserveExtensionFactoryL( callBack );
+    
+    CCA_DP(KMyCardLogFile, CCA_L("<-CCCAppMyCardContainer::ConstructL()"));
+    }
+
+/**
+ * Gets a digit from a descriptor.
+ *
+ * @param aReaderToBuf  Resource reader pointed to a descriptor resource.
+ * @return  The digit.
+ */
+inline TInt GetDigitFromDescriptorL( TResourceReader& aReaderToBuf )
+    {
+    HBufC* orderBuf = aReaderToBuf.ReadHBufCL();
+    CleanupStack::PushL( orderBuf );
+
+    TInt result = KPbk2UiSpecNameOrderFirstNameLastName;
+    TPtrC ptr( orderBuf->Des() );
+    if ( ptr.Length() > 0 && TChar(ptr[0]).IsDigit() )
+        {
+        result = TChar(ptr[0]).GetNumericValue();
+        }
+
+    CleanupStack::PopAndDestroy( orderBuf );
+    
+    return result;
+    }
+
+// ----------------------------------------------------------------------------
+// CCCAppMyCardContainer::ResolveNameOrderL()
+// ----------------------------------------------------------------------------
+//
+inline void CCCAppMyCardContainer::ResolveNameOrderL()
+    {
+    TInt orderInCenRep = EPbk2CenRepNameOrderUndefined;
+
+    CRepository* sortOrderSettings = CRepository::NewLC(TUid::Uid(KCRUidPhonebook));
+    sortOrderSettings->Get(KPhonebookNameOrdering, orderInCenRep);
+    CleanupStack::PopAndDestroy(sortOrderSettings);    
+    
+    
+    if( orderInCenRep == EPbk2CenRepLastNameFirstName ||
+        orderInCenRep == EPbk2CenRepFirstNameLastName )
+        {
+        iNameOrder = KPbk2UiSpecNameOrderFirstNameLastName;
+        if( orderInCenRep == EPbk2CenRepLastNameFirstName )
+            {
+            iNameOrder = KPbk2UiSpecNameOrderLastNameFirstName;
+            }
+        }
+    else
+        {
+        // Read order from resource
+        
+        // Open resource file for reading language specific default values
+        RPbk2LocalizedResourceFile resFile;
+        resFile.OpenLC( KPbk2RomFileDrive,
+                KDC_RESOURCE_FILES_DIR, 
+                Pbk2PresentationUtils::PresentationResourceFile() );
+
+        // Read the name order value from the resource file
+        TResourceReader reader;
+        reader.SetBuffer( resFile.AllocReadLC( R_QTN_PHOB_NAME_ORDER ) );
+        TInt digit = GetDigitFromDescriptorL( reader );
+        CleanupStack::PopAndDestroy( 2 ); // reader & resFile
+        if( ( digit == KPbk2UiSpecNameOrderFirstNameLastName ) ||
+            ( digit == KPbk2UiSpecNameOrderLastNameFirstName ) )
+            {
+            iNameOrder = digit;
+            }    
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CCCAppMyCardContainer::Draw()
+// ----------------------------------------------------------------------------
+//
+void CCCAppMyCardContainer::Draw(const TRect& /*aRect*/) const
+    {
+    // Draw the background using skin
+    if (iBackground)
+        {
+        AknsDrawUtils::Background(
+            AknsUtils::SkinInstance(), iBackground, this, SystemGc(), Rect());
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CCCAppMyCardContainer::SizeChanged()
+// ----------------------------------------------------------------------------
+//
+void CCCAppMyCardContainer::SizeChanged()
+    {
+    TRect rect( Rect() );
+
+    // Background skin
+    iBackground->SetRect( rect );
+
+    LayoutControls();
+    
+	delete iImageSelectionPopup;
+	iImageSelectionPopup = NULL;
+
+	if( !iImageLoader )
+	    {
+        if( !iModel.IsEmpty() )
+            {
+            TPtrC8 data( iModel.Data( CSpbContactDataModel::EDataImageContent ) );
+            TInt err = KErrNotFound;
+            if( data.Length() )
+                {
+                // thumbnail image in model -> load it
+                TPtrC file( iModel.Text( CSpbContactDataModel::ETextImageFileName ) );
+                TRAP( err, 
+                    iImageLoader = CCCAppMyCardImageLoader::NewL( *this );
+                    iImageLoader->LoadImageL( data, file, iHeaderCtrl->ThumbnailSize() );
+                    );
+                }
+            
+            if( err )
+                {
+                // no thumbnail image available -> load default
+                ThumbnailLoadError( KErrNotFound ); 
+                }
+            }
+	    }
+	else
+	    {
+        // No need to call ResizeImageL() which would invoke the image decoder re-stating
+        // to show the previous user-assigned image if MyCard image is not set. 
+        if ( iMyCardImageSet )
+            {
+            TRAP_IGNORE( iImageLoader->ResizeImageL(iHeaderCtrl->ThumbnailSize()));
+            }
+	    }
+	
+    DrawDeferred();
+    }
+
+// ---------------------------------------------------------------------------
+// CCCAppMyCardContainer::LayoutControls
+// ---------------------------------------------------------------------------
+//
+void CCCAppMyCardContainer::LayoutControls()
+    {
+    /**
+     * Option0 (w button, prt)
+     * Option2 (w/o button, prt)
+     * Option1 (w button, lsc)
+     * Option3 (w/o button, lsc)
+     */
+    
+    const TBool isLandscape( Layout_Meta_Data::IsLandscapeOrientation() );
+    
+    TInt option( isLandscape ? 3 : 2 ); // (w/o button)
+    CCCAppStatusControl* statusControl = iHeaderCtrl->StatusControl();
+    if( statusControl && statusControl->IsVisible() )
+        {
+        // (w button)
+        if( isLandscape )
+            {
+            option = 1;
+            }
+        else
+            {
+            option = 0;
+            }
+        }
+    
+    // contact card pane layout
+    TAknWindowComponentLayout contactCardPaneLayout( 
+            TAknWindowComponentLayout::Compose( 
+                    AknLayoutScalable_Apps::main_phob2_pane( 0 ),
+                    AknLayoutScalable_Apps::phob2_contact_card_pane( 1 ) ) );
+    
+    // header layout
+    TAknWindowComponentLayout headerPaneLayout( 
+        TAknWindowComponentLayout::Compose( 
+            contactCardPaneLayout,
+            AknLayoutScalable_Apps::phob2_cc_data_pane( option ) ) );
+    
+    TAknLayoutRect headerPaneLayoutRect;
+    headerPaneLayoutRect.LayoutRect( Rect(), headerPaneLayout.LayoutLine() );
+    TRect headerPaneRect( headerPaneLayoutRect.Rect() );
+    iHeaderCtrl->SetRect( headerPaneRect );
+    
+    // list layout
+    TAknWindowComponentLayout listPaneLayout( 
+        TAknWindowComponentLayout::Compose( 
+            contactCardPaneLayout,
+            AknLayoutScalable_Apps::phob2_cc_listscroll_pane( option ) ) );
+    
+    TAknLayoutRect listPaneLayoutRect;
+    listPaneLayoutRect.LayoutRect( Rect(), listPaneLayout.LayoutLine() );
+    TRect listPaneRect( listPaneLayoutRect.Rect() );
+    iListBox->SetRect( listPaneRect );
+    }
+
+
+// ----------------------------------------------------------------------------
+// CCCAppMyCardContainer::CheckExtensionFactoryL()
+// ----------------------------------------------------------------------------
+//
+TInt CCCAppMyCardContainer::CheckExtensionFactoryL(TAny* aPtr)
+    {
+    CCCAppMyCardContainer* self = static_cast<CCCAppMyCardContainer*>( aPtr );
+    self->DoCheckExtensionFactoryL();
+    return 0;
+    }
+
+// ----------------------------------------------------------------------------
+// CCCAppMyCardContainer::DoCheckExtensionFactoryL()
+// ----------------------------------------------------------------------------
+//
+void CCCAppMyCardContainer::DoCheckExtensionFactoryL()
+    {
+    CCCAExtensionFactory* extension = iFactoryExtensionNotifier->ExtensionFactory();
+    TBool visible = EFalse;
+    MCCAStatusProvider* ccaStatusProvider = NULL;
+    
+    if( extension )
+        {
+        if ( !iViewLauncher )
+            {
+            iViewLauncher = extension->CreateViewLauncherL();
+            }
+        if ( iControlLink  // my card link has been set
+                && iViewLauncher->IsViewSupported( MCCAViewLauncher::EMyCardView ) )
+            {
+            visible = ETrue;
+            }
+        }
+    else
+        {
+        delete iViewLauncher;
+        iViewLauncher = NULL;
+        }
+            
+    CCCAppStatusControl* statusControl = iHeaderCtrl->StatusControl();
+    
+    if( statusControl )
+        {
+		if( extension )
+        	{				
+			TAny* factoryExtension = extension->FactoryExtension( KCCAExtensionFactoryStatusProviderCreatorUid );        	
+        	
+			 if( factoryExtension )
+				 {
+				 MCCAExtensionFactoryStatusProviderCreator* statusProviderCreator =
+						 static_cast<MCCAExtensionFactoryStatusProviderCreator*>( factoryExtension );
+
+				   if( statusProviderCreator )
+					   {
+					   ccaStatusProvider = statusProviderCreator->CreateStatusProviderL();					   
+					   }
+				 }
+        	}
+		
+		statusControl->SetStatusProvider( ccaStatusProvider );
+        statusControl->MakeVisible( visible );        
+        LayoutControls();
+        DrawDeferred();
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CCCAppMyCardContainer::CountComponentControls()
+// ----------------------------------------------------------------------------
+//
+TInt CCCAppMyCardContainer::CountComponentControls() const
+    {
+    return KSubComponentCount;
+    }
+
+// ----------------------------------------------------------------------------
+// CCCAppMyCardContainer::ComponentControl()
+// ----------------------------------------------------------------------------
+//
+CCoeControl* CCCAppMyCardContainer::ComponentControl( TInt aIndex ) const
+    {
+    switch( aIndex )
+        {
+        case 0:
+            {
+            return iHeaderCtrl;
+            }
+        case 1:
+        	{
+			return iListBox;
+			}
+        }
+    return NULL;
+    }
+
+// ----------------------------------------------------------------------------
+// CCCAppMyCardContainer::MopSupplyObject()
+// ----------------------------------------------------------------------------
+//
+TTypeUid::Ptr CCCAppMyCardContainer::MopSupplyObject(TTypeUid aId)
+    {
+    // For skinning
+    if( iBackground && aId.iUid == MAknsControlContext::ETypeId )
+        {
+        return MAknsControlContext::SupplyMopObject( aId, iBackground );
+        }
+
+    return CCoeControl::MopSupplyObject(aId);
+    }
+
+// ----------------------------------------------------------------------------
+// CCCAppMyCardContainer::OfferKeyEventL()
+// ----------------------------------------------------------------------------
+//
+TKeyResponse CCCAppMyCardContainer::OfferKeyEventL(
+    const TKeyEvent& aKeyEvent,
+    TEventCode aType )
+    {
+    TKeyResponse resp = CCCAppViewPluginAknContainer::OfferKeyEventL( aKeyEvent, aType );
+    if( iListBox && resp == EKeyWasNotConsumed )
+        {
+        resp = iListBox->OfferKeyEventL( aKeyEvent, aType );
+        }
+    return resp;
+    }
+
+// ----------------------------------------------------------------------------
+// CCCAppMyCardContainer::MyCardEventL()
+// ----------------------------------------------------------------------------
+//
+void CCCAppMyCardContainer::MyCardEventL( MMyCardObserver::TEvent aEvent )
+    {
+    if( aEvent == MMyCardObserver::EEventContactChanged ||
+        ( aEvent == MMyCardObserver::EEventContactLoaded && iModel.IsEmpty() ) )
+        {   
+        TInt itemCount_BeforeChange = iModel.ListBoxModel().MdcaCount();
+        TInt focusItem_BeforeChange = iListBox->CurrentItemIndex();
+    
+        CCCAppMyCard& mycard = iPlugin.MyCard();
+        iModel.SetDataL( mycard.PresentationContactL(), iIconArray );
+        
+        TInt itemCount_AfterChange = iModel.ListBoxModel().MdcaCount();
+        TInt focusItem_AfterChange = iListBox->CurrentItemIndex();
+        
+        if( itemCount_BeforeChange > itemCount_AfterChange && 
+                focusItem_AfterChange == KErrNotFound )
+            {
+            if( focusItem_BeforeChange >= itemCount_AfterChange )
+            	{
+                iListBox->SetCurrentItemIndex( itemCount_AfterChange-1 );
+            	}
+            else if( focusItem_BeforeChange >= 0 )
+            	{
+                iListBox->SetCurrentItemIndex( focusItem_BeforeChange );
+            	}
+            else
+            	{
+                iListBox->SetCurrentItemIndex( 0 );
+            	}
+            }
+        
+        if( iListBox )
+            {
+            iListBox->HandleItemAdditionL();
+            }
+          
+        // Set own contact name
+        SetNameForHeaderControlL();
+        
+        // start loading image
+        if( !iImageLoader )
+            {
+            // lazy initialization
+            iImageLoader = CCCAppMyCardImageLoader::NewL( *this );
+            }
+        iImageLoader->LoadContactImageL( mycard.StoreContact(), 
+                iHeaderCtrl->ThumbnailSize() );
+        }
+
+    CCCAppStatusControl* statusControl = iHeaderCtrl->StatusControl();
+
+    if( iPlugin.MyCard().IsContactLinkReady() && !iControlLink )
+		{
+		if( statusControl )
+		    {
+            statusControl->SetContactLinkL( iPlugin.MyCard().ContactLink() );
+            iControlLink = ETrue;
+		    }
+		}
+
+    if ( statusControl && !statusControl->IsVisible() &&
+            iControlLink && iViewLauncher &&
+            iViewLauncher->IsViewSupported( MCCAViewLauncher::EMyCardView ) )
+        {
+        statusControl->MakeVisible( ETrue );
+        LayoutControls();
+        DrawDeferred();
+        }
+    }
+
+
+// ----------------------------------------------------------------------------
+// CCCAppMyCardContainer::ThumbnailReady()
+// ----------------------------------------------------------------------------
+//
+void CCCAppMyCardContainer::ThumbnailReady( CFbsBitmap* aThumbnail )
+    {
+    // takes ownership
+    TRAPD( err, iHeaderCtrl->SetPortraitBitmapL( aThumbnail ) );
+    if( err != KErrNone )
+        {
+        iPlugin.HandleError( err );
+        }
+    // Contact Image set. Set the flag.
+    iMyCardImageSet = ETrue;
+    }
+
+// ----------------------------------------------------------------------------
+// CCCAppMyCardContainer::ThumbnailLoadError()
+// ----------------------------------------------------------------------------
+//
+void CCCAppMyCardContainer::ThumbnailLoadError( TInt /*aError*/ )
+    {
+    CFbsBitmap* bitmap = NULL;
+    CFbsBitmap* mask = NULL;
+    
+    TRAPD( err, AknsUtils::CreateIconL(
+        AknsUtils::SkinInstance(),
+        KAknsIIDQgnPropPbThumpMycard,
+        bitmap,
+        mask,
+        KMyCardIconDefaultFileName,
+        EMbmPhonebook2eceQgn_prop_pb_thump_mycard,
+        EMbmPhonebook2eceQgn_prop_pb_thump_mycard_mask ) );
+    if( !err )
+        {
+        iHeaderCtrl->SetPortraitIcon( bitmap, mask ); // takes ownership
+        }
+    // Default contact image used.
+    iMyCardImageSet = EFalse;
+    }
+
+// ----------------------------------------------------------------------------
+// CCCAppMyCardContainer::HandleListBoxEventL
+// ----------------------------------------------------------------------------
+//
+void CCCAppMyCardContainer::HandleListBoxEventL(
+    CEikListBox* /*aListBox*/, TListBoxEvent aEventType )
+    {
+    switch( aEventType )
+        {
+        case EEventEnterKeyPressed:
+        case EEventItemDoubleClicked:
+        case EEventItemSingleClicked:
+            {
+            // start the editor and pass tapped field index
+            iPlugin.EditL( FocusedFieldIndex() );
+            break;
+            }
+        default:
+            {
+            // ignored
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CCCAppMyCardContainer::Plugin
+// ---------------------------------------------------------------------------
+//
+CCCAppMyCardPlugin& CCCAppMyCardContainer::Plugin()
+    {
+    return iPlugin;
+    }
+
+
+/************************ FUNCTIONS FROM UI CONTROL ************************/
+
+// --------------------------------------------------------------------------
+// CCCAppMyCardContainer::ParentControl
+// --------------------------------------------------------------------------
+//
+MPbk2ContactUiControl* CCCAppMyCardContainer::ParentControl() const
+	{
+    // Contact info control has no parent control
+    return NULL;
+	}
+
+// --------------------------------------------------------------------------
+// CCCAppMyCardContainer::NumberOfContacts
+// --------------------------------------------------------------------------
+//
+TInt CCCAppMyCardContainer::NumberOfContacts() const
+	{
+    return KNumberOfContacts;
+	}
+
+// --------------------------------------------------------------------------
+// CCCAppMyCardContainer::FocusedContactL
+// --------------------------------------------------------------------------
+//
+const MVPbkBaseContact* CCCAppMyCardContainer::FocusedContactL() const
+	{
+    return static_cast<MVPbkBaseContact*>( &iPlugin.MyCard().StoreContact() );
+	}
+
+// --------------------------------------------------------------------------
+// CCCAppMyCardContainer::FocusedViewContactL
+// --------------------------------------------------------------------------
+//
+const MVPbkViewContact* CCCAppMyCardContainer::FocusedViewContactL() const
+	{
+    return NULL;
+	}
+
+
+// --------------------------------------------------------------------------
+// CCCAppMyCardContainer::FocusedStoreContact
+// --------------------------------------------------------------------------
+//
+const MVPbkStoreContact* CCCAppMyCardContainer::FocusedStoreContact() const
+	{
+	return &iPlugin.MyCard().StoreContact();
+    }
+
+// --------------------------------------------------------------------------
+// CCCAppMyCardContainer::SetFocusedContactL
+// --------------------------------------------------------------------------
+//
+void CCCAppMyCardContainer::SetFocusedContactL(
+    const MVPbkBaseContact& /*aContact*/ )
+	{
+    // do nothing
+	}
+
+// --------------------------------------------------------------------------
+// CCCAppMyCardContainer::SetFocusedContactL
+// --------------------------------------------------------------------------
+//
+void CCCAppMyCardContainer::SetFocusedContactL(
+    const MVPbkContactBookmark& /*aContactBookmark*/)
+	{
+    // Do nothing
+	}
+
+// --------------------------------------------------------------------------
+// CCCAppMyCardContainer::SetFocusedContactL
+// --------------------------------------------------------------------------
+//
+void CCCAppMyCardContainer::SetFocusedContactL(
+    const MVPbkContactLink& /*aContactLink*/ )
+	{
+	}
+
+// --------------------------------------------------------------------------
+// CCCAppMyCardContainer::FocusedContactIndex
+// --------------------------------------------------------------------------
+//
+TInt CCCAppMyCardContainer::FocusedContactIndex() const
+	{
+    return KErrNotSupported;
+	}
+
+// --------------------------------------------------------------------------
+// CCCAppMyCardContainer::SetFocusedContactIndexL
+// --------------------------------------------------------------------------
+//
+void CCCAppMyCardContainer::SetFocusedContactIndexL(TInt /*aIndex*/)
+	{
+    // Do nothing
+	}
+
+// --------------------------------------------------------------------------
+// CCCAppMyCardContainer::NumberOfContactFields
+// --------------------------------------------------------------------------
+//
+TInt CCCAppMyCardContainer::NumberOfContactFields() const
+	{
+    TInt cnt = KErrNotSupported;
+    cnt =  iPlugin.MyCard().StoreContact().Fields().FieldCount();
+    return cnt;
+	}
+
+// --------------------------------------------------------------------------
+// CCCAppMyCardContainer::FocusedField
+// --------------------------------------------------------------------------
+//
+const MVPbkBaseContactField* CCCAppMyCardContainer::FocusedField() const
+	{
+	TInt index = FocusedFieldIndex();
+	if( index != KErrNotFound )
+		{
+		return &iPlugin.MyCard().StoreContact().Fields().FieldAt(index);
+		}
+    return NULL;
+	}
+
+// --------------------------------------------------------------------------
+// CCCAppMyCardContainer::FocusedFieldIndex
+// --------------------------------------------------------------------------
+//
+TInt CCCAppMyCardContainer::FocusedFieldIndex() const
+	{
+    TInt index = KErrNotFound;
+    TRAP_IGNORE( 
+        CPbk2PresentationContact& contact = iPlugin.MyCard().PresentationContactL();
+        index = contact.PresentationFields().StoreIndexOfField( 
+            iModel.PresentationFieldIndex( iListBox->CurrentItemIndex() ) );
+        );
+	return index;
+	}
+
+// --------------------------------------------------------------------------
+// CCCAppMyCardContainer::SetFocusedFieldIndex
+// --------------------------------------------------------------------------
+//
+void CCCAppMyCardContainer::SetFocusedFieldIndex( TInt /*aIndex*/ )
+	{
+	// do nothing
+	}
+
+// --------------------------------------------------------------------------
+// CCCAppMyCardContainer::ContactsMarked
+// --------------------------------------------------------------------------
+//
+TBool CCCAppMyCardContainer::ContactsMarked() const
+	{
+    // This control does not support contacts marking
+    return EFalse;
+	}
+
+// --------------------------------------------------------------------------
+// CCCAppMyCardContainer::SelectedContactsL
+// --------------------------------------------------------------------------
+//
+MVPbkContactLinkArray* CCCAppMyCardContainer::SelectedContactsL() const
+	{
+    // No selection support in contact info control
+    return NULL;
+	}
+
+// --------------------------------------------------------------------------
+// CCCAppMyCardContainer::SelectedContactsOrFocusedContactL
+// --------------------------------------------------------------------------
+//
+MVPbkContactLinkArray*
+CCCAppMyCardContainer::SelectedContactsOrFocusedContactL() const
+	{
+    CVPbkContactLinkArray* array = CVPbkContactLinkArray::NewLC();
+    const MVPbkBaseContact* focusedContact = FocusedContactL();
+
+    if( focusedContact )
+    	{
+        MVPbkContactLink* link = focusedContact->CreateLinkLC();
+        CleanupStack::Pop(); // link
+        array->AppendL(link);
+    	}
+    CleanupStack::Pop(array);
+    return array;
+	}
+
+// --------------------------------------------------------------------------
+// CCCAppMyCardContainer::SelectedContactsIteratorL
+// --------------------------------------------------------------------------
+//
+MPbk2ContactLinkIterator*
+CCCAppMyCardContainer::SelectedContactsIteratorL() const
+	{
+    // No selection support in contact info control
+    return NULL;
+	}
+
+// --------------------------------------------------------------------------
+// CCCAppMyCardContainer::SelectedContactStoresL
+// --------------------------------------------------------------------------
+//
+CArrayPtr<MVPbkContactStore>*
+CCCAppMyCardContainer::SelectedContactStoresL() const
+	{
+    // This is not a contact store control
+    return NULL;
+	}
+
+// --------------------------------------------------------------------------
+// CCCAppMyCardContainer::ClearMarks
+// --------------------------------------------------------------------------
+//
+
+void CCCAppMyCardContainer::ClearMarks()
+	{
+	// Do nothing
+	}
+
+// --------------------------------------------------------------------------
+// CCCAppMyCardContainer::SetSelectedContactL
+// --------------------------------------------------------------------------
+//
+void CCCAppMyCardContainer::SetSelectedContactL(
+    TInt /*aIndex*/,
+    TBool /*aSelected*/)
+	{
+    // Not supported in Contact Info
+	}
+
+// --------------------------------------------------------------------------
+// CCCAppMyCardContainer::SetSelectedContactL
+// --------------------------------------------------------------------------
+//
+void CCCAppMyCardContainer::SetSelectedContactL(
+    const MVPbkContactBookmark& /*aContactBookmark*/,
+    TBool /*aSelected*/)
+	{
+    // Not supported
+	}
+
+// --------------------------------------------------------------------------
+// CCCAppMyCardContainer::SetSelectedContactL
+// --------------------------------------------------------------------------
+//
+void CCCAppMyCardContainer::SetSelectedContactL(
+    const MVPbkContactLink& /*aContactLink*/,
+    TBool /*aSelected*/)
+	{
+    // Not supported
+	}
+
+// --------------------------------------------------------------------------
+// CCCAppMyCardContainer::DynInitMenuPaneL
+// --------------------------------------------------------------------------
+//
+void CCCAppMyCardContainer::DynInitMenuPaneL(
+    TInt /*aResourceId*/,
+    CEikMenuPane* /*aMenuPane*/) const
+    {
+    // Nothing to do
+    }
+
+// --------------------------------------------------------------------------
+// CCCAppMyCardContainer::ProcessCommandL
+// --------------------------------------------------------------------------
+//
+void CCCAppMyCardContainer::ProcessCommandL(TInt /*aCommandId*/) const
+        {
+    // Nothing to do
+        }
+
+// --------------------------------------------------------------------------
+// CCCAppMyCardContainer::UpdateAfterCommandExecution
+// --------------------------------------------------------------------------
+//
+void CCCAppMyCardContainer::UpdateAfterCommandExecution()
+	{
+    if (iCommand)
+    	{
+        /// Reset command pointer, command has completed
+        iCommand->ResetUiControl(*this);
+        iCommand = NULL;
+    	}
+	}
+
+// --------------------------------------------------------------------------
+// CCCAppMyCardContainer::GetMenuFilteringFlagsL
+// --------------------------------------------------------------------------
+//
+TInt CCCAppMyCardContainer::GetMenuFilteringFlagsL() const
+	{
+    const TInt fieldCount =
+		 iPlugin.MyCard().StoreContact().Fields().FieldCount();
+    // If negative will leave
+    User::LeaveIfError( fieldCount );
+
+    TInt ret = KPbk2MenuFilteringFlagsNone;
+    if( fieldCount > KNoContacts )
+    	{
+        ret |= KPbk2ListContainsItems;
+    	}
+    return ret;
+	}
+
+// --------------------------------------------------------------------------
+// CCCAppMyCardContainer::ControlStateL
+// --------------------------------------------------------------------------
+//
+CPbk2ViewState* CCCAppMyCardContainer::ControlStateL() const
+	{
+    return NULL;
+	}
+
+// --------------------------------------------------------------------------
+// CCCAppMyCardContainer::RestoreControlStateL
+// --------------------------------------------------------------------------
+//
+void CCCAppMyCardContainer::RestoreControlStateL(
+    CPbk2ViewState* /*aState*/)
+	{
+    // Do nothing
+	}
+
+// --------------------------------------------------------------------------
+// CCCAppMyCardContainer::FindTextL
+// --------------------------------------------------------------------------
+//
+const TDesC& CCCAppMyCardContainer::FindTextL()
+	{
+    // No find box in this control
+    return KNullDesC;
+	}
+
+// --------------------------------------------------------------------------
+// CCCAppMyCardContainer::ResetFindL
+// --------------------------------------------------------------------------
+//
+void CCCAppMyCardContainer::ResetFindL()
+	{
+    // Do nothing
+	}
+
+// --------------------------------------------------------------------------
+// CCCAppMyCardContainer::ShowThumbnail
+// --------------------------------------------------------------------------
+//
+void CCCAppMyCardContainer::ShowThumbnail()
+	{
+    // Do nothing
+	}
+
+// --------------------------------------------------------------------------
+// CCCAppMyCardContainer::HideThumbnail
+// --------------------------------------------------------------------------
+//
+void CCCAppMyCardContainer::HideThumbnail()
+	{
+    // Do nothing
+	}
+
+// --------------------------------------------------------------------------
+// CCCAppMyCardContainer::SetBlank
+// --------------------------------------------------------------------------
+//
+void CCCAppMyCardContainer::SetBlank( TBool /*aBlank*/ )
+	{
+    // This control does not support blanking
+	}
+
+// --------------------------------------------------------------------------
+// CCCAppMyCardContainer::RegisterCommand
+// --------------------------------------------------------------------------
+//
+void CCCAppMyCardContainer::RegisterCommand( MPbk2Command* aCommand )
+	{
+    iCommand = aCommand;
+	}
+
+// --------------------------------------------------------------------------
+// CCCAppMyCardContainer::SetTextL
+// --------------------------------------------------------------------------
+//
+void CCCAppMyCardContainer::SetTextL( const TDesC& /*aText*/ )
+	{
+    // Do nothing
+	}
+
+// --------------------------------------------------------------------------
+// CCCAppMyCardContainer::ContactUiControlExtension
+// --------------------------------------------------------------------------
+//
+TAny* CCCAppMyCardContainer::ContactUiControlExtension( TUid /*aExtensionUid*/ )
+	{
+    return NULL;
+	}
+
+//-----------------------------------------------------------------------------
+// void CCCAppMyCardContainer::StatusClickedL()
+//-----------------------------------------------------------------------------
+//
+void CCCAppMyCardContainer::StatusClickedL()
+	{
+    if ( iViewLauncher )
+		{
+        iViewLauncher->LaunchViewL( MCCAViewLauncher::EMyCardView );
+		}		
+	}
+
+//------------------------------------------------------------------------------
+// void CCCAppMyCardContainer::SetNameForHeaderContorl()
+//------------------------------------------------------------------------------
+//
+void CCCAppMyCardContainer::SetNameForHeaderControlL()
+	{
+    TPtrC fname( iModel.Text( CSpbContactDataModel::ETextFirstName ) );
+    TPtrC lname( iModel.Text( CSpbContactDataModel::ETextLastName ) );
+    switch ( iNameOrder )
+        {
+        case KPbk2UiSpecNameOrderFirstNameLastName:
+            {
+            iHeaderCtrl->SetLabel1TextL( fname );
+            iHeaderCtrl->SetLabel2TextL( lname );
+            break;
+            }
+        case KPbk2UiSpecNameOrderLastNameFirstName: // FALL THROUGH
+        default:
+            {
+            iHeaderCtrl->SetLabel2TextL( fname );
+            iHeaderCtrl->SetLabel1TextL( lname );
+            break;
+            }
+        }
+	}
+
+//------------------------------------------------------------------------------
+// void CCCAppMyCardContainer::MyCardHeaderControlClickL()
+//------------------------------------------------------------------------------
+//
+void CCCAppMyCardContainer::MyCardHeaderControlClickL( TPoint aPos )
+{
+    if( iPlugin.MyCard().HeaderControlBlocked() )
+        {
+        return;
+        }
+            
+    if ( !iImageSelectionPopup )
+        {
+        iImageSelectionPopup = CAknStylusPopUpMenu::NewL( &iPlugin, aPos );
+        TInt resourceReaderId = R_MYCARD_CONTACT_IMAGE_STYLUS_MENU; 
+        TResourceReader reader;
+        iCoeEnv->CreateResourceReaderLC( reader , resourceReaderId );
+        iImageSelectionPopup->ConstructFromResourceL( reader );
+        CleanupStack::PopAndDestroy(); // reader
+        }
+    
+    // MyCard image has been set. Dim option menu items accordingly
+    if( iMyCardImageSet )
+        {        
+        // If the image has been deleted in the memory, "view image" should be hidden.
+        TPtrC imageFileName( iModel.Text( CSpbContactDataModel::ETextImageFileName ) );                        
+        RFs& fs( iCoeEnv->FsSession() );
+        TEntry entry;
+        iImageSelectionPopup->SetItemDimmed( ECCAppMyCardCmdStylusViewImageCmd, 
+                ( fs.Entry( imageFileName , entry ) == KErrNone ) ? EFalse : ETrue );                                                    
+        iImageSelectionPopup->SetItemDimmed(ECCAppMyCardCmdStylusChangeImageCmd, EFalse);
+        iImageSelectionPopup->SetItemDimmed(ECCAppMyCardCmdStylusRemoveImageCmd, EFalse);
+        iImageSelectionPopup->SetItemDimmed(ECCAppMyCardCmdStylusAddImageCmd, ETrue);
+        }
+    // MyCard image has not been set
+    else
+        {
+        iImageSelectionPopup->SetItemDimmed(ECCAppMyCardCmdStylusViewImageCmd, ETrue);
+        iImageSelectionPopup->SetItemDimmed(ECCAppMyCardCmdStylusChangeImageCmd, ETrue);
+        iImageSelectionPopup->SetItemDimmed(ECCAppMyCardCmdStylusRemoveImageCmd, ETrue);
+        iImageSelectionPopup->SetItemDimmed(ECCAppMyCardCmdStylusAddImageCmd, EFalse);
+        } 
+          
+    PosToScreenCoordinates( this, aPos );
+   
+    iImageSelectionPopup->SetPosition( aPos );
+    iImageSelectionPopup->ShowMenu();   
+}
+ 
+// ----------------------------------------------------------------------------
+// CCCAppCommLauncherContainer::HandlePointerEventL()
+// ----------------------------------------------------------------------------
+//
+void CCCAppMyCardContainer::HandlePointerEventL(
+    const TPointerEvent& aPointerEvent )
+    {               
+    CCoeControl::HandlePointerEventL( aPointerEvent );              
+    }
+
+// --------------------------------------------------------------------------
+// CCCAppMyCardContainer::ClipFromBeginning
+// --------------------------------------------------------------------------
+//
+TBool CCCAppMyCardContainer::ClipFromBeginning(
+    TDes& aBuffer, TInt aItemIndex, TInt aSubCellNumber )
+    {
+    if( iListBox )
+        {   
+        return AknTextUtils::ClipToFit( aBuffer, AknTextUtils::EClipFromBeginning,
+            iListBox, aItemIndex, aSubCellNumber );
+        }
+    return EFalse;
+    }
+
+// ---------------------------------------------------------------------------
+// CCCAppCommLauncherContainer::PosToScreenCoordinates
+// ---------------------------------------------------------------------------
+//
+void CCCAppMyCardContainer::PosToScreenCoordinates( 
+        CCoeControl* aControl, TPoint& aPos )
+     {
+     TPoint leftUpperPos = aControl->PositionRelativeToScreen();
+     aPos += leftUpperPos;
+     }
+
+// ----------------------------------------------------------------------------
+// CCCAppMyCardContainer::GetHelpContext()
+// ----------------------------------------------------------------------------
+//
+void CCCAppMyCardContainer::GetHelpContext(TCoeHelpContext& aContext) const
+    {
+    aContext.iMajor.iUid = KPbk2UID3;
+    aContext.iContext = KHLP_CCA_MY_CARD;
+    }
+
+// End of File