phonebookui/Phonebook2/Application/src/CPbk2ContactInfoAppViewOld.cpp
changeset 0 e686773b3f54
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/Application/src/CPbk2ContactInfoAppViewOld.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,1230 @@
+/*
+* 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 contact info application view.
+*
+*/
+
+// INCLUDE FILES
+#include "cpbk2contactinfoappview.h"
+
+// Phonebook 2
+#include "cpbk2appui.h"
+#include "cpbk2document.h"
+#include "cpbk2startupmonitor.h"
+#include "cpbk2viewexplorer.h"
+#include "cpbk2viewactivationtransaction.h"
+#include "pbk2internalcommands.hrh"
+#include "cpbk2viewloader.h"
+#include <phonebook2.rsg>
+#include <pbk2uicontrols.rsg>
+#include <pbk2commands.rsg>
+#include <cpbk2viewstate.h>
+#include <mpbk2contactnavigation.h>
+#include <cpbk2controlcontainer.h>
+#include <cpbk2contactinfocontrol.h>
+#include <mpbk2commandhandler.h>
+#include <mpbk2contactdetailscontrol.h>
+#include <cpbk2storeconfiguration.h>
+#include <cpbk2memoryentrycontactloader.h>
+#include <pbk2commands.hrh>
+#include <cpbk2viewstatetransformer.h>
+#include <tpbk2storecontactanalyzer.h>
+#include <cpbk2fieldpropertyarray.h>
+#include <cpbk2sortordermanager.h>
+#include <cpbk2viewgraph.h>
+#include <mpbk2pointereventinspector.h>
+#include <pbk2navigatorfactory.h>
+#include <mpbk2applicationservices.h>
+#include <mpbk2contactviewsupplier.h>
+#include <pbk2uid.h>
+#include <csxhelp/phob.hlp.hrh>
+
+// Virtual Phonebook
+#include <cvpbkcontactmanager.h>
+#include <mvpbkstorecontact.h>
+#include <mvpbkcontactlink.h>
+#include <mvpbkcontactviewbase.h>
+#include <mvpbkexpandable.h>
+#include <cvpbkcontactstoreuriarray.h>
+#include <mvpbkcontactstorelist.h>
+#include <tvpbkcontactstoreuriptr.h>
+
+// System includes
+#include <avkon.rsg>
+#include <aiwcommon.hrh>
+#include <eikmenub.h>
+#include <aknutils.h>
+#include <stringloader.h>
+
+// Debugging headers
+#include <pbk2debug.h>
+#include <pbk2profile.h>
+#include <pbk2config.hrh>
+
+/// Unnamed namespace for local definitions
+namespace {
+
+#ifdef _DEBUG
+enum TPanicCode
+    {
+    EPanicPostCond_DoActivateL = 1,
+    EPanicPostCond_DoDeactivate,
+    EPanicPreCond_HandleCommandL,
+    EPanicPreCond_HandleCommandKeyL,
+    EPanicPreCond_ConstructL,
+    EPanicPostCond_ConstructL,
+    EPanicPreCond_DynInitMenuPaneL,
+    EPanicPreCond_ContactChangedL,
+    EPanicPreCond_SetNavigatorViewL,
+    EPanicPreCond_GetViewSpecificMenuFilteringFlagsL,
+    EPanicPreCond_NULLPointer,
+    EPanicPreCond_ViewLoaded,
+    EPanicLogic_LoadContactL
+    };
+
+void Panic(TPanicCode aReason)
+    {
+    _LIT( KPanicText, "CPbk2ContactInfoAppView" );
+    User::Panic( KPanicText, aReason );
+    }
+#endif // _DEBUG
+
+} /// namespace
+
+
+// --------------------------------------------------------------------------
+// CPbk2ContactInfoAppView::CPbk2ContactInfoAppView
+// --------------------------------------------------------------------------
+//
+inline CPbk2ContactInfoAppView::CPbk2ContactInfoAppView
+        ( CVPbkContactManager& aContactManager ) :
+            iContactManager( aContactManager )
+    {
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactInfoAppView::~CPbk2ContactInfoAppView
+// --------------------------------------------------------------------------
+//
+CPbk2ContactInfoAppView::~CPbk2ContactInfoAppView()
+    {
+    PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+        ("CPbk2ContactInfoAppView(%x)::~CPbk2ContactInfoAppView()"), this);
+
+    delete iViewLoader;
+    delete iControlState;
+    delete iViewActivationTransaction;
+    delete iNavigation;
+    delete iContactLoader;
+    iStoreList.Reset();
+    iStoreList.Close();
+
+    if (iContainer)
+        {
+        AppUi()->RemoveFromViewStack(*this, iContainer);
+        delete iContainer;
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactInfoAppView::NewL
+// --------------------------------------------------------------------------
+//
+CPbk2ContactInfoAppView* CPbk2ContactInfoAppView::NewL
+        ( CVPbkContactManager& aContactManager )
+    {
+    CPbk2ContactInfoAppView* self =
+        new ( ELeave ) CPbk2ContactInfoAppView( aContactManager );
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop();  // self
+    return self;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactInfoAppView::ConstructL
+// --------------------------------------------------------------------------
+//
+inline void CPbk2ContactInfoAppView::ConstructL()
+    {
+    PBK2_PROFILE_START(Pbk2Profile::EContactInfoConstructL);
+
+    // Init base class
+    PBK2_PROFILE_START(Pbk2Profile::EContactInfoViewBaseConstruct);
+    CAknView::BaseConstructL(R_PHONEBOOK2_CONTACTINFO_APPVIEW);
+    PBK2_PROFILE_END(Pbk2Profile::EContactInfoViewBaseConstruct);
+
+    iCommandHandler = Pbk2AppUi()->ApplicationServices().CommandHandlerL();
+    iStoreConfiguration =  &Pbk2AppUi()->ApplicationServices().
+        StoreConfiguration();
+
+    PBK2_PROFILE_END(Pbk2Profile::EContactInfoConstructL);
+
+    __ASSERT_DEBUG(iCommandHandler,
+        Panic(EPanicPostCond_ConstructL));
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactInfoAppView::HandleCommandL
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactInfoAppView::HandleCommandL
+        (TInt aCommandId)
+    {
+    __ASSERT_DEBUG(iControl,
+        Panic(EPanicPreCond_HandleCommandL));
+
+    switch (aCommandId)
+        {
+        case EAknSoftkeyBack:       // FALLTHROUGH
+        case EPbk2CmdOpenPreviousView:
+            {
+            // Set the focused contact according to control state -> NULL
+            ReturnToPreviousViewL( NULL );
+            break;
+            }
+        default:
+            {
+            // No command handling in this class, forward to Commands
+            if ( !iCommandHandler->HandleCommandL
+                    ( aCommandId, *iControl, this ) )
+                {
+                iControl->ProcessCommandL(aCommandId);
+                // Command was not handled in Pbk2Commands,
+                // forward it to AppUi
+                AppUi()->HandleCommandL(aCommandId);
+                }
+            break;
+            }
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactInfoAppView::DynInitMenuPaneL
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactInfoAppView::DynInitMenuPaneL
+        (TInt aResourceId, CEikMenuPane* aMenuPane)
+    {
+    __ASSERT_DEBUG(iControl,
+        Panic(EPanicPreCond_DynInitMenuPaneL));
+
+    if( aResourceId != R_PHONEBOOK2_SIND_INFOVIEW_MENU )
+        {
+        // Ask the control to do control specific filtering
+        iControl->DynInitMenuPaneL(aResourceId, aMenuPane);
+
+        // Phonebook 2 menu filtering happens in Commands
+        iCommandHandler->DynInitMenuPaneL(
+                aResourceId, aMenuPane, *this, *iControl);
+        }
+    else
+        {
+        // SIND InfoView menu option should not be available
+        aMenuPane->SetItemDimmed( KAiwCmdInfoView, ETrue );
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactInfoAppView::Id
+// --------------------------------------------------------------------------
+//
+TUid CPbk2ContactInfoAppView::Id() const
+    {
+    return Phonebook2::KPbk2ContactInfoViewUid;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactInfoAppView::HandleStatusPaneSizeChange
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactInfoAppView::HandleStatusPaneSizeChange()
+    {
+    // Resize the container to fill the client rectangle
+    if (iContainer)
+        {
+        iContainer->SetRect(ClientRect());
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactInfoAppView::DoActivateL
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactInfoAppView::DoActivateL
+        ( const TVwsViewId& aPrevViewId,
+          TUid aCustomMessageId, const TDesC8& aCustomMessage )
+    {
+    PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+        ("CPbk2ContactInfoAppView(%x)::DoActivateL()"), this);
+
+    PBK2_PROFILE_START(Pbk2Profile::EContactInfoStartTime);
+    PBK2_PROFILE_START(Pbk2Profile::EContactInfoDoActivateContactChanged);
+    PBK2_PROFILE_START(Pbk2Profile::EContactInfoDoActivateL);
+
+    UpdateViewGraphL( aPrevViewId );
+
+    iCommandHandler->AddMenuCommandObserver( *this );
+    iStoreConfiguration->AddObserverL( *this );
+
+    // Update application-wide state. UI control updates the title pane.
+    delete iViewActivationTransaction;
+    iViewActivationTransaction = NULL;
+    iViewActivationTransaction =
+        Pbk2AppUi()->Pbk2ViewExplorer()->HandleViewActivationLC
+            ( Id(), aPrevViewId, NULL, NULL,
+              Phonebook2::EUpdateNaviPane | Phonebook2::EUpdateContextPane );
+    CleanupStack::Pop(); // iViewActivationTransaction
+
+    if (aCustomMessageId == CPbk2ViewState::Uid() ||
+        aCustomMessageId == TUid::Uid(KPbkViewStateUid))
+        {
+        // Handles both new and legacy view state parameters
+        UpdateViewStateL(aCustomMessageId, aCustomMessage);
+        }
+    else
+        {
+        // No UI state specified, restore in previous state
+        if (!iControlState)
+            {
+            // No previous state
+            User::Leave(KErrArgument);
+            }
+        }
+
+     if ( !iControlState->FocusedContact() )
+        {
+        User::Leave( KErrArgument );
+        }
+
+    ConstructNavigatorL();
+    CreateControlsL();
+    AttachAIWProvidersL();
+
+    LoadContactViewL(aPrevViewId);
+    iPreviousViewId = aPrevViewId;
+
+    PBK2_PROFILE_END(Pbk2Profile::EContactInfoDoActivateL);
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactInfoAppView::DoDeactivate
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactInfoAppView::DoDeactivate()
+    {
+    PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+        ("CPbk2ContactInfoAppView(%x)::DoDeactivate()"), this);
+
+    delete iViewLoader;
+    iViewLoader = NULL;
+
+    iCommandHandler->RemoveMenuCommandObserver( *this );
+    
+    iStoreConfiguration->RemoveObserver( *this );
+
+    delete iViewActivationTransaction;
+    iViewActivationTransaction = NULL;
+    delete iNavigation;
+    iNavigation = NULL;
+
+    // Trash the old states
+    delete iControlState;
+    iControlState = NULL;
+
+    // Reset store list
+    iStoreList.Reset();
+
+    if (iContainer)
+        {
+        iContainer->Control()->HideThumbnail();
+
+        // Remove view and its control from the view stack
+        AppUi()->RemoveFromViewStack(*this, iContainer);
+
+        // Store current state, safe to ignore. There's no real harm,
+        // if theres no stored state when activating this view again
+        TRAP_IGNORE(StoreStateL());
+
+        // Destroy the container control
+        delete iContainer;
+        iContainer = NULL;
+        iControl = NULL;
+        }
+        
+    delete iContactLoader;
+    iContactLoader = NULL;    
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactInfoAppView::HandleForegroundEventL
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactInfoAppView::HandleForegroundEventL( TBool aForeground )
+    {
+    CPbk2AppView::HandleForegroundEventL(aForeground);
+
+    // If this view is gaining foreground, then make sure that thumbnail
+    // gets drawn
+    if (aForeground && iContainer && iContainer->Control())
+        {
+        if ( iContainer->Control()->IsVisible() )
+            {
+            iContainer->Control()->ShowThumbnail();
+            }
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactInfoAppView::ViewStateLC
+// --------------------------------------------------------------------------
+//
+CPbk2ViewState* CPbk2ContactInfoAppView::ViewStateLC() const
+    {
+    __ASSERT_DEBUG( iControl ,Panic(EPanicPreCond_NULLPointer));
+
+    CPbk2ViewState* state = iControl->ControlStateL();
+    CleanupStack::PushL(state);
+    return state;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactInfoAppView::HandleCommandKeyL
+// --------------------------------------------------------------------------
+//
+TBool CPbk2ContactInfoAppView::HandleCommandKeyL
+        (const TKeyEvent& aKeyEvent, TEventCode aType)
+    {
+    __ASSERT_DEBUG(iContainer && iNavigation,
+        Panic(EPanicPreCond_HandleCommandKeyL));
+
+    // Pass the key event to the strategy
+    TBool ret = iNavigation->HandleCommandKeyL(aKeyEvent, aType);
+
+    if (!ret && aType == EEventKey)
+        {
+        switch (aKeyEvent.iCode)
+            {
+            case EKeyOK:
+                {
+                LaunchPopupMenuL(R_PHONEBOOK2_CONTACTINFO_CONTEXTBAR);
+                ret = ETrue;
+                break;
+                }
+            case EKeyBackspace:  // Clear key
+                {
+                HandleCommandL(EPbk2CmdDeleteMe);
+                ret = ETrue;
+                break;
+                }
+            case EKeyPhoneSend:
+                {
+                // If focused field is either url or email field
+                // the proper context menu should be launched.
+                if ( IsFocusedFieldTypeL( R_PHONEBOOK2_URL_SELECTOR )
+                    || IsFocusedFieldTypeL( R_PHONEBOOK2_EMAIL_SELECTOR ) )
+                    {
+                    LaunchPopupMenuL( R_PHONEBOOK2_CONTACTINFO_CONTEXTBAR );
+                    }
+                else
+                    {
+                    // Use the EPbk2CmdCall id to identify that
+                    // call is being launched with send key
+                    HandleCommandL( EPbk2CmdCall );
+                    }
+                ret = ETrue;
+                break;
+                }
+            case EKeyPoC:
+                {
+                // Use the EPbk2CmdPoC id to identify that
+                // call is being launched with PoC key
+                HandleCommandL( EPbk2CmdPoC );
+                ret = ETrue;
+                break;
+                }
+            default:
+                {
+                break;
+                }
+            }
+        }
+    return ret;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactInfoAppView::HandlePointerEventL
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactInfoAppView::HandlePointerEventL(
+        const TPointerEvent& aPointerEvent )
+    {
+    if ( AknLayoutUtils::PenEnabled() )
+        {
+        CPbk2AppView::HandlePointerEventL( aPointerEvent );
+
+        switch ( aPointerEvent.iType )
+            {
+            case TPointerEvent::EButton1Up:
+                {
+                if ( iPointerInspector &&
+                     iPointerInspector->FocusedItemPointed() )
+                    {
+                    // launch context menu if user tapped a focused detail
+                    LaunchPopupMenuL( R_PHONEBOOK2_CONTACTINFO_CONTEXTBAR );
+                    }
+                break;
+                }
+            default:;
+            }
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactInfoAppView::GetViewSpecificMenuFilteringFlagsL
+// --------------------------------------------------------------------------
+//
+TInt CPbk2ContactInfoAppView::GetViewSpecificMenuFilteringFlagsL() const
+    {
+    __ASSERT_DEBUG( iControl,
+        Panic( EPanicPreCond_GetViewSpecificMenuFilteringFlagsL ) );
+
+    return iControl->GetMenuFilteringFlagsL();
+    }
+
+
+// --------------------------------------------------------------------------
+// CPbk2ContactInfoAppView::PrepareForContactChangeL
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactInfoAppView::PrepareForContactChangeL()
+    {
+    StoreStateL();
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactInfoAppView::ContactChangedL
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactInfoAppView::ContactChangedL( MVPbkStoreContact* aContact )
+    {
+    PBK2_PROFILE_END(Pbk2Profile::EContactInfoDoActivateContactChanged);
+
+    PBK2_PROFILE_START(Pbk2Profile::EContactInfoContactChangedL);
+
+    PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+        ("CPbk2ContactInfoAppView(%x)::ContactChangedL() begin"), this);
+
+    if ( !iContainer )
+        {
+        // It is possible that this method get called before
+        // the container and control get constructed.
+        // In that case, ignore the given contact by deleting
+        // it and do not continue the contact changed process.
+        delete aContact;
+
+        // iViewActivationTransaction should not be deleted here
+        // since it is not tied to this ContactChangedL request
+
+        PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+            ("CPbk2ContactInfoAppView(%x)::ContactChangedL() controls not ready"),
+            this);
+        }
+    else
+        {
+        __ASSERT_DEBUG(iViewActivationTransaction,
+            Panic(EPanicPreCond_ContactChangedL));
+        __ASSERT_DEBUG(iNavigation, Panic(EPanicPreCond_ContactChangedL));
+
+        PBK2_PROFILE_START(Pbk2Profile::EContactInfoContactChangedLUpdateControls);
+
+        // Update controls
+        if (aContact)
+            {
+            CleanupDeletePushL( aContact );
+            iContainer->Control()->UpdateL(aContact);
+            CleanupStack::Pop(aContact);    // ownership was taken
+            }
+        SetEmptyTextL( R_QTN_PHOB_NO_ITEMS );
+
+        PBK2_PROFILE_END(Pbk2Profile::EContactInfoContactChangedLUpdateControls);
+
+        PBK2_PROFILE_START(Pbk2Profile::EContactInfoContactChangedLSetFocusedField);
+
+        if ( iControlState->FocusedContact() )
+            {
+            if ( !iControlState->FocusedContact()->RefersTo( *aContact ) )
+                {
+                iContainer->Control()->SetFocusedFieldIndex( KErrNotFound );
+                iControlState->SetFocusedFieldIndex( KErrNotFound );
+                }
+            }
+        PBK2_PROFILE_END(Pbk2Profile::EContactInfoContactChangedLSetFocusedField);
+
+        PBK2_PROFILE_START(Pbk2Profile::EContactInfoContactChangedLRestoreControlState);
+        iContainer->Control()->RestoreControlStateL(iControlState);
+        PBK2_PROFILE_END(Pbk2Profile::EContactInfoContactChangedLRestoreControlState);
+
+        // Commit application-wide state changes
+        PBK2_PROFILE_START(Pbk2Profile::EContactInfoContactChangedLCommitViewTransaction);
+        iViewActivationTransaction->Commit();
+        PBK2_PROFILE_END(Pbk2Profile::EContactInfoContactChangedLCommitViewTransaction);
+
+        // notifies startup monitor of view activation
+        PBK2_PROFILE_START(Pbk2Profile::EContactInfoContactChangedLNotifyStartupMonitor);
+        if (Pbk2AppUi()->Pbk2StartupMonitor())
+            {
+            Pbk2AppUi()->Pbk2StartupMonitor()->NotifyViewActivationL(Id());
+            }
+        PBK2_PROFILE_END(Pbk2Profile::EContactInfoContactChangedLNotifyStartupMonitor);
+        }
+
+    PBK2_PROFILE_END(Pbk2Profile::EContactInfoContactChangedL);
+
+    PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+        ("CPbk2ContactInfoAppView(%x)::ContactChangedL() end"), this);
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactInfoAppView::ContactChangeFailed
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactInfoAppView::ContactChangeFailed()
+    {
+    PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+        ("CPbk2ContactInfoAppView(%x)::ContactChangeFailed()"), this);
+
+    TInt err = KErrNone;
+    
+    TRAP( err, SetEmptyTextL( R_QTN_PHOB_NO_ITEMS ) );
+    if ( err != KErrNone )
+        {
+        CEikonEnv::Static()->HandleError( err );
+        }
+
+    // Rollback
+    if ( iViewActivationTransaction )
+        {
+        // Rollback by force
+        TRAP( err, iViewActivationTransaction->RollbackL() );
+        delete iViewActivationTransaction;
+        iViewActivationTransaction = NULL;
+
+        if ( err != KErrNone )
+            {
+            CEikonEnv::Static()->HandleError( err );
+            }
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactInfoAppView::Contact
+// --------------------------------------------------------------------------
+//
+const MVPbkStoreContact* CPbk2ContactInfoAppView::Contact() const
+    {
+    const MVPbkStoreContact* result = NULL;
+    if (iControl)
+        {
+        result = iControl->FocusedStoreContact();
+        }
+    return result;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactInfoAppView::HandleControlEventL
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactInfoAppView::HandleControlEventL
+        ( MPbk2ContactUiControl& /*aControl*/,
+        const TPbk2ControlEvent& aEvent)
+    {
+    switch (aEvent.iEventType)
+        {
+        case TPbk2ControlEvent::EReady:
+            {
+            UpdateCbasL();
+            break;
+            }
+
+        default:
+            {
+            // Do nothing
+            break;
+            }
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactInfoAppView::ConfigurationChanged
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactInfoAppView::ConfigurationChanged()
+    {
+    if (iPreviousViewId.iViewUid != KNullUid)
+        {
+        TRAPD(err, LoadContactViewL(iPreviousViewId));
+        if (err != KErrNone)
+            {
+            CCoeEnv::Static()->HandleError(err);
+            }
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactInfoAppView::ConfigurationChangedComplete
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactInfoAppView::ConfigurationChangedComplete()
+    {
+    // Do nothing
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactInfoAppView::PreCommandExecutionL
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactInfoAppView::PreCommandExecutionL
+        ( const MPbk2Command& /*aCommand*/ )
+    {
+    if (iContainer && iContainer->Control())
+        {
+        iContainer->Control()->HideThumbnail();
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactInfoAppView::PostCommandExecutionL
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactInfoAppView::PostCommandExecutionL
+        ( const MPbk2Command& /*aCommand*/ )
+    {
+    if (iContainer && iContainer->Control())
+        {
+        iContainer->Control()->ShowThumbnail();
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactInfoAppView::CreateControlsL
+// --------------------------------------------------------------------------
+//
+inline void CPbk2ContactInfoAppView::CreateControlsL()
+    {
+    PBK2_PROFILE_START(Pbk2Profile::EContactInfoCreateControlsL);
+
+    if (!iContainer)
+        {
+        // Create the container and control
+        CContainer* container = CContainer::NewLC(this, this, *this);
+
+        container->SetHelpContext( TCoeHelpContext( ApplicationUid(),
+            KPHOB_HLP_CONTACT_INFO_VIEW ));
+
+        CPbk2ContactInfoControl* control = CPbk2ContactInfoControl::NewL
+            ( container, iContactManager,
+              Pbk2AppUi()->ApplicationServices().NameFormatter(),
+              Pbk2AppUi()->ApplicationServices().FieldProperties(),
+              Pbk2AppUi()->ApplicationServices().StoreProperties(),
+              iNavigation );
+
+        container->SetControl(control, ClientRect()); // takes ownership
+        control->AddObserverL(*this);
+
+        // Add this view and container to the view stack
+        AppUi()->AddToViewStackL(*this, container);
+        CleanupStack::Pop(container);
+        iContainer = container;
+        iControl = control;
+
+        // Assign pointer event inspector
+        iPointerInspector =
+            AknLayoutUtils::PenEnabled() ? control : NULL;
+
+        iContainer->ActivateL();
+        iContainer->Control()->MakeVisible( ETrue );
+        }
+
+    PBK2_PROFILE_END(Pbk2Profile::EContactInfoCreateControlsL);
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactInfoAppView::HandleNavigationEvent
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactInfoAppView::HandleNavigationEvent
+        ( const TEventType& aEventType )
+    {
+    if ( aEventType == MPbk2NavigationObserver::EContactDeleted )
+        {
+        // Contact was deleted which means that we must go back to previous
+        // view. The previous view must know the contact to focus and it
+        // obviously can not be the deleted contact. The navigator works
+        // in a same logic as the focus in the previous view. It knows the
+        // the contact after deletion.
+        TRAPD( err,
+            {
+            MVPbkContactLink* curContact = CurrentContactInNavigatorLC();
+            CleanupStack::Pop(); // curContact
+            // Give ownership of curContact
+            ReturnToPreviousViewL( curContact );
+            });
+        if ( err != KErrNone )
+            {
+            CCoeEnv::Static()->HandleError( err );
+            }
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactInfoAppView::ViewLoaded
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactInfoAppView::ViewLoaded( MVPbkContactViewBase& aView )
+    {
+    __ASSERT_DEBUG(iContactLoader && iControlState,
+        Panic(EPanicPreCond_ViewLoaded));
+
+    if ( &aView == iContactView )
+        {
+        TRAPD( error, HandleViewLoadedL() );
+        if ( error != KErrNone )
+            {
+            ViewError( aView, error );
+            }
+        }
+    delete iViewLoader;
+    iViewLoader = NULL;
+
+    PBK2_PROFILE_END(Pbk2Profile::EContactInfoStartTime);
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactInfoAppView::ViewError
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactInfoAppView::ViewError
+        ( MVPbkContactViewBase& aView, TInt /*aError*/ )
+    {
+    delete iViewLoader;
+    iViewLoader = NULL;
+
+    if ( &aView == iContactView )
+        {
+        TRAPD( error, iViewActivationTransaction->RollbackL() );
+        if ( error != KErrNone )
+            {
+            CCoeEnv::Static()->HandleError(error);
+            }
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactInfoAppView::UpdateViewStateL
+// --------------------------------------------------------------------------
+//
+inline void CPbk2ContactInfoAppView::UpdateViewStateL
+        ( const TUid aCustomMessageId,
+        const TDesC8& aCustomMessage)
+    {
+    CPbk2ViewState* viewState = NULL;
+    if (aCustomMessageId == TUid::Uid(KPbkViewStateUid))
+        {
+        // handle legacy view state
+        CPbk2ViewStateTransformer* transformer =
+            CPbk2ViewStateTransformer::NewLC( iContactManager );
+        viewState = transformer->
+                TransformLegacyViewStateToPbk2ViewStateLC( aCustomMessage );
+        CleanupStack::Pop();
+        CleanupStack::PopAndDestroy(transformer);
+        }
+    else if (aCustomMessageId == CPbk2ViewState::Uid())
+        {
+        // Read the desired UI state from aCustomMessage
+        viewState = CPbk2ViewState::NewL(aCustomMessage);
+        }
+    else
+        {
+        // a parameter must be passed to this view
+        User::Leave(KErrNotSupported);
+        }
+
+    if (iControlState)
+        {
+        // Merge parameter view state with the stored state
+        if ( viewState->FocusedContact() &&
+            !viewState->FocusedContact()->IsSame
+                ( *iControlState->FocusedContact() ))
+            {
+            iControlState->SetFocusedContact(
+                    viewState->TakeFocusedContact());
+            iControlState->SetFocusedFieldIndex(KErrNotFound);
+            iControlState->SetTopFieldIndex(KErrNotFound);
+            }
+        if (viewState->FocusedFieldIndex() >= 0)
+            {
+            iControlState->SetFocusedFieldIndex(
+                    viewState->FocusedFieldIndex());
+            }
+        if (viewState->TopFieldIndex() >= 0)
+            {
+            iControlState->SetTopFieldIndex(
+                    viewState->TopFieldIndex());
+            }
+        if ( viewState->ParentContact() )
+            {
+            iControlState->SetParentContact(
+                viewState->TakeParentContact());
+            }
+        // Delete parameter view state
+        delete viewState;
+        }
+    else
+        {
+        // No stored state, use the parameter supplied one
+        iControlState = viewState;
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactInfoAppView::SetNavigatorViewL
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactInfoAppView::SetNavigatorViewL()
+    {
+    __ASSERT_DEBUG(iNavigation,
+        Panic(EPanicPreCond_SetNavigatorViewL));
+
+    // Set default navigation
+    iNavigation->SetScrollViewL( iContactView, EFalse );
+
+    // Inspect if the parent contact is set and if the parent
+    // contact is expandable. In that case set the navigation
+    // view to the expandable view.
+    const MVPbkContactLink* parentLink = iControlState->ParentContact();
+    if ( parentLink )
+        {
+        // Find parent index in the contact view
+        const TInt parentIndex =
+            iContactView->IndexOfLinkL( *parentLink );
+        // Get the view contact by view index
+        const MVPbkViewContact& viewContact =
+            iContactView->ContactAtL( parentIndex );
+
+        // Expand the scroll view from the view contact
+        MVPbkExpandable* expandable = viewContact.Expandable();
+        if ( expandable )
+            {
+            MVPbkContactViewBase* scrollView = expandable->ExpandLC
+                ( *iNavigation, Pbk2AppUi()->ApplicationServices().
+                    SortOrderManager().SortOrder() );
+            CleanupStack::Pop(); // scrollView
+
+            // Set the navigation scroll view, transfer ownership
+            iNavigation->SetScrollViewL( scrollView, ETrue );
+            }
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactInfoAppView::StoreStateL
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactInfoAppView::StoreStateL()
+    {
+    CPbk2ViewState* state = ViewStateLC();
+    CleanupStack::Pop(); // state
+
+    // state should be always created, but valid state
+    // has focusedContact
+    if ( state && state->FocusedContact() )
+        {
+        delete iControlState;
+        iControlState = state;
+        }
+    else
+        {
+        delete state;
+        state = NULL;
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactInfoAppView::IsFocusedFieldTypeL
+// --------------------------------------------------------------------------
+//
+TBool CPbk2ContactInfoAppView::IsFocusedFieldTypeL( TInt aSelectorResId )
+    {
+    TPbk2StoreContactAnalyzer analyzer( iContactManager, NULL );
+    const MVPbkBaseContactField* field = iContainer->Control()->FocusedField();
+
+    if ( field )
+        {
+        return analyzer.IsFieldTypeIncludedL( *field, aSelectorResId );
+        }
+    else
+        {
+        return EFalse;
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactInfoAppView::UpdateCbasL
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactInfoAppView::UpdateCbasL()
+    {
+    if ( iControl )
+        {
+        // Set cba command set "Options - Context Menu - Back"
+        Cba()->SetCommandSetL( R_PBK2_SOFTKEYS_OPTIONS_BACK_CONTEXT );
+        Cba()->DrawDeferred();
+        // Set context menu
+        MenuBar()->SetContextMenuTitleResourceId
+            ( R_PHONEBOOK2_CONTACTINFO_CONTEXTBAR );
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactInfoAppView::AttachAIWProvidersL
+// --------------------------------------------------------------------------
+//
+inline void CPbk2ContactInfoAppView::AttachAIWProvidersL()
+    {
+    PBK2_PROFILE_START(Pbk2Profile::EContactInfoAttachAIWProvidersL);
+
+    iCommandHandler->RegisterAiwInterestL
+        ( KAiwCmdCall, R_PHONEBOOK2_CALL_MENU,
+        R_PHONEBOOK2_CALLUI_AIW_INTEREST, ETrue );
+    
+    iCommandHandler->RegisterAiwInterestL
+        (KAiwCmdCall, R_PHONEBOOK2_CALL_CONTEXT_MENU,
+        R_PHONEBOOK2_CALLUI_AIW_INTEREST, EFalse);
+
+    iCommandHandler->RegisterAiwInterestL
+        ( KAiwCmdPoC, R_PHONEBOOK2_POC_MENU,
+        R_PHONEBOOK2_POCUI_AIW_INTEREST, ETrue );
+
+    iCommandHandler->RegisterAiwInterestL
+        (KAiwCmdPoC, R_PHONEBOOK2_POC_CONTEXT_MENU,
+        R_PHONEBOOK2_POCUI_AIW_INTEREST, EFalse);
+
+    PBK2_PROFILE_END(Pbk2Profile::EContactInfoAttachAIWProvidersL);
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactInfoAppView::HandleLongTapEventL
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactInfoAppView::HandleLongTapEventL
+        ( const TPoint& /*aPenEventLocation*/,
+        const TPoint& /*aPenEventScreenLocation*/ )
+    {
+    // Do nothing
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactInfoAppView::CurrentContactInNavigatorLC
+// --------------------------------------------------------------------------
+//
+MVPbkContactLink* CPbk2ContactInfoAppView::CurrentContactInNavigatorLC()
+    {
+    if ( iNavigation )
+        {
+        return iNavigation->CurrentContactLC();
+        }
+    else
+        {
+        MVPbkContactLink* link = NULL;
+        // LC semantics also in NULL case.
+        CleanupStack::PushL( link );
+        return link;
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactInfoAppView::ReturnToPreviousViewL
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactInfoAppView::ReturnToPreviousViewL
+        ( MVPbkContactLink* aFocusedContact ) const
+    {
+    // Ownership of aFocusedContact is taken by this function
+    CleanupDeletePushL( aFocusedContact );
+
+    CPbk2ViewState* state = ViewStateLC();
+    CleanupStack::Pop( state );
+
+    // aFocusedContact contact overwrites the focused contact from control's
+    // state.
+    if ( aFocusedContact )
+        {
+        // state takes the ownership if aFocusedContact
+        state->SetFocusedContact( aFocusedContact );
+        CleanupStack::Pop(); // aFocusedContact
+        }
+    else
+        {
+        CleanupStack::PopAndDestroy(); // aFocusedContact
+        }
+
+    CleanupStack::PushL( state );
+
+    Pbk2AppUi()->Pbk2ViewExplorer()->ActivatePreviousViewL( state );
+    CleanupStack::PopAndDestroy( state );
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactInfoAppView::LoadContactViewL
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactInfoAppView::LoadContactViewL
+        ( const TVwsViewId& aPrevViewId )
+    {
+    delete iViewLoader;
+    iViewLoader = NULL;
+
+    if ( Pbk2AppUi()->Pbk2ViewExplorer()->
+            IsPhonebook2View( aPrevViewId ) &&
+            ( aPrevViewId.iViewUid == TUid::Uid
+                ( EPbk2GroupMembersListViewId ) ) )
+        {
+        iContactView = Phonebook2::Pbk2AppUi()->ApplicationServices().
+                ViewSupplier().AllGroupsViewL();
+        }
+    else
+        {
+        iContactView = Phonebook2::Pbk2AppUi()->ApplicationServices().
+                ViewSupplier().AllContactsViewL();
+        }
+
+    iViewLoader = CPbk2ViewLoader::NewL( *iContactView, *this );
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactInfoAppView::HandleViewLoadedL
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactInfoAppView::HandleViewLoadedL()
+    {
+    SetNavigatorViewL();
+    LoadContactL();
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactInfoAppView::LoadContactL
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactInfoAppView::LoadContactL()
+    {
+    const MVPbkContactLink* link = iControlState->FocusedContact();
+    __ASSERT_DEBUG( link, Panic( EPanicLogic_LoadContactL ) );
+    __ASSERT_DEBUG( iContactLoader, Panic( EPanicLogic_LoadContactL ) );
+
+    // Load the contact from view state, this is asynchronous
+    iContactLoader->ChangeContactL( *link );
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactInfoAppView::ConstructNavigatorL
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactInfoAppView::ConstructNavigatorL()
+    {
+    CVPbkContactStoreUriArray* uriList =
+        Pbk2AppUi()->ApplicationServices().StoreConfiguration().
+            CurrentConfigurationL();
+    CleanupStack::PushL( uriList );
+    MVPbkContactStoreList& fullStoreList =
+        iContactManager.ContactStoresL();
+    for (TInt i = 0; i < uriList->Count(); ++i)
+        {
+        // Add all the contact stores to the store list
+        TVPbkContactStoreUriPtr uri = (*uriList)[i];
+        MVPbkContactStore* store = fullStoreList.Find(uri);
+        iStoreList.AppendL(store);
+        }
+    CleanupStack::PopAndDestroy( uriList );
+
+    /// Create contact loader and contact info scroll navigator
+    delete iContactLoader;
+    iContactLoader = NULL;
+    iContactLoader = CPbk2MemoryEntryContactLoader::NewL( *this );
+
+    MVPbkContactStore& storeFromState =
+        iControlState->FocusedContact()->ContactStore();
+    TBool storeNotInConfiguration = EFalse;
+    if ( iStoreList.Find( &storeFromState ) == KErrNotFound )
+        {
+        storeNotInConfiguration = ETrue;
+        // Do not add store into list, opening of this lone
+        // store is not navigator's responsibility
+        }
+
+    if ( !storeNotInConfiguration )
+        {
+        iNavigation = Pbk2NavigatorFactory::CreateContactNavigatorL
+            ( Id(), *this, *iContactLoader, iStoreList.Array(),
+              R_QTN_PHOB_NAVI_POS_INDICATOR_CONTACT_INFO_VIEW );
+        }
+    else
+        {
+        // Store was not in configuration --> contact to be shown is not
+        // included in the scroll view --> no point to use sideways
+        // navigation strategy
+        iNavigation = Pbk2NavigatorFactory::CreateVoidNavigatorL
+            ( Id(), *this, *iContactLoader, iStoreList.Array() );
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactInfoAppView::UpdateViewGraphL
+// Sets previous view node. Previous node should be set dynamically
+// because it could be some extension view.
+// Default is names list view.
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactInfoAppView::UpdateViewGraphL
+        ( const TVwsViewId& aPrevViewId )
+    {
+    CPbk2ViewGraph& viewGraph = static_cast<CPbk2ViewExplorer*>
+        ( Pbk2AppUi()->Pbk2ViewExplorer() )->ViewGraph();
+    CPbk2ViewNode* prevNode =
+        viewGraph.FindNodeWithViewId( aPrevViewId.iViewUid );
+    if ( prevNode )
+        {
+        CPbk2ViewNode* thisNode = viewGraph.FindNodeWithViewId( Id() );
+        if ( thisNode )
+            {
+            thisNode->SetPreviousNode( prevNode );
+            }
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactInfoAppView::SetEmptyTextL
+// Sets empty text for contact info list box from given resource id.
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactInfoAppView::SetEmptyTextL(
+		TInt aResourceId )
+	{
+    HBufC* emptyText = StringLoader::LoadLC( aResourceId );
+    iContainer->Control()->SetTextL( *emptyText );
+    CleanupStack::PopAndDestroy( emptyText );
+	}
+
+
+// End of File