phonebookui/Phonebook/App/src/CViewActivationTransactionImpl.cpp
changeset 0 e686773b3f54
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook/App/src/CViewActivationTransactionImpl.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,267 @@
+/*
+* Copyright (c) 2002 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 activation view transaction implementation definition.
+*
+*/
+
+
+// INCLUDE FILES
+#include    "CViewActivationTransactionImpl.h"
+#include    <aknnavi.h>     // CAknNavigationControlContainer
+#include    <aknnavide.h>   // CAknNavigationDecorator
+#include    <akntabgrp.h>   // CAknTabGroup
+#include    <akntitle.h>    // CAknTitlePane
+#include    <akncontext.h>  // CAknContextPane
+#include    <eikimage.h>    // CEikImage
+#include    <DigViewGraph.h>
+#include    "CPbkViewNavigator.h"
+
+
+// ================= MEMBER FUNCTIONS =======================
+
+CPbkAppUi::CViewActivationTransactionImpl* CPbkAppUi::CViewActivationTransactionImpl::NewLC
+        (CPbkAppUi& aAppUi, 
+        const TUid& aViewId, const TVwsViewId& aPrevViewId,
+        const TDesC* aTitlePaneText, 
+        const CEikImage* aContextPanePicture,
+        TUint aFlags)
+    {
+    // Create object. new(ELeave) resets all members to zero.
+    CViewActivationTransactionImpl* self = new(ELeave)
+		CViewActivationTransactionImpl(aAppUi, aViewId, aPrevViewId, aFlags);
+    CleanupStack::PushL(self);
+	self->ConstructL(aTitlePaneText, aContextPanePicture);
+    return self;
+    }
+
+
+CPbkAppUi::CViewActivationTransactionImpl::CViewActivationTransactionImpl
+		(CPbkAppUi& aAppUi, const TUid& aViewId, const TVwsViewId& aPrevViewId,
+		TUint aFlags) : iAppUi(&aAppUi), iViewId(aViewId),
+		iPrevViewId(aPrevViewId), iFlags(aFlags)
+	{
+
+	}
+
+
+void CPbkAppUi::CViewActivationTransactionImpl::ConstructL
+		(const TDesC* aTitlePaneText, const CEikImage* aContextPanePicture)
+	{
+    // Make changes to state and save rollback data
+    UpdateViewNavigationState();
+    
+	if (iFlags & EUpdateNaviPane) 
+        {
+        UpdateNaviPaneL(iViewId);
+        }
+    if (iFlags & EUpdateTitlePane)
+        {
+        SetTitlePaneTextL(aTitlePaneText);
+        }
+    if (iFlags & EUpdateContextPane)
+        {
+        SetContextPanePictureL(aContextPanePicture);
+        }
+	}
+
+
+CPbkAppUi::CViewActivationTransactionImpl::~CViewActivationTransactionImpl()
+    {
+    // Undo changes in reverse order
+    if (iSaveContextPanePicture)
+        {
+        // iContextPane takes ownership of iSaveContextPanePicture
+        iContextPane->SetPicture(iSaveContextPanePicture);
+        }
+    if (iSaveTitlePaneText)
+        {
+        // iTitlePane takes ownership of iSaveTitlePaneText
+        iTitlePane->SetText(iSaveTitlePaneText);
+        }
+    if (iPushedNaviDecorator)
+        {
+        iAppUi->NaviPane()->Pop(iPushedNaviDecorator);
+        }
+    if (iTabGroup)
+        {
+        iTabGroup->SetActiveTabByIndex(iSaveTabIndex);
+        }
+    if (iSavePreviousViewNode)
+        {
+        CDigViewNode* activatedNode = 
+            iAppUi->iViewGraph->FindNodeWithViewId(iViewId);
+        activatedNode->SetPreviousNode(iSavePreviousViewNode);
+        }
+    }
+
+void CPbkAppUi::CViewActivationTransactionImpl::Commit()
+    {
+    // Delete and reset all rollback data
+    delete iSaveContextPanePicture;
+    iSaveContextPanePicture = NULL;
+    delete iSaveTitlePaneText;
+    iSaveTitlePaneText = NULL;
+    iPushedNaviDecorator = NULL;
+    iTabGroup = NULL;
+    iSavePreviousViewNode = NULL;
+    }
+
+void CPbkAppUi::CViewActivationTransactionImpl::UpdateViewNavigationState()
+    {
+    // Reset saved state
+    iSavePreviousViewNode = NULL;
+
+    // Find activated view node in the graph
+    CDigViewNode* activatedNode = 
+        iAppUi->iViewGraph->FindNodeWithViewId(iViewId);
+    if (activatedNode)
+        {
+        // Set previous node for the newly activated view
+        if (iAppUi->IsPhonebookView(iPrevViewId))
+            {
+            // Find the previous view in the graph
+            CDigViewNode* prevNode = 
+                iAppUi->iViewGraph->FindNodeWithViewId(iPrevViewId.iViewUid);
+            while (prevNode)
+                {
+                // Get transitions from the new view
+                const TInt count = activatedNode->TransitionCount();
+                TInt i;
+                for (i = 0; i < count; ++i)
+                    {
+                    // Set previous view if there is a back transition
+                    if (activatedNode->TransitionAt(i).iEvent == EPbkViewTransitionBack && 
+                        activatedNode->TransitionAt(i).iNode == prevNode)
+                        {
+                        iSavePreviousViewNode = activatedNode->PreviousNode();
+                        activatedNode->SetPreviousNode(prevNode);
+                        break;
+                        }
+                    }
+                if (i >= count)
+                    {
+                    // Matching back transition not found: Move back in 
+                    // previous view chain
+                    prevNode = prevNode->PreviousNode();
+                    }
+                else
+                    {
+                    // Transition found, exit while loop
+                    break;
+                    }
+                }
+            }
+        else
+            {
+            iSavePreviousViewNode = activatedNode->PreviousNode();
+            activatedNode->SetPreviousNode(activatedNode->DefaultPreviousNode());
+            }
+        }
+    }
+
+void CPbkAppUi::CViewActivationTransactionImpl::UpdateNaviPaneL(TUid aViewId)
+    {
+    // Reset saved state
+    iPushedNaviDecorator = NULL;
+    iTabGroup = NULL;
+    iSaveTabIndex = 0;
+
+    CAknNavigationDecorator* decorator= 
+        iAppUi->iViewNavigator->TabGroupFromId(aViewId.iUid);
+    if (decorator)
+        {
+        CAknTabGroup* tabGroup = static_cast<CAknTabGroup*>
+            (decorator->DecoratedControl());
+        if (iAppUi->NaviPane()->Top() != decorator)
+            {
+            iAppUi->NaviPane()->PushL(*decorator);
+            iPushedNaviDecorator = decorator;
+            }
+        iTabGroup = tabGroup;
+        iSaveTabIndex = tabGroup->ActiveTabIndex();
+        tabGroup->SetActiveTabById(aViewId.iUid);
+        }
+    }
+
+void CPbkAppUi::CViewActivationTransactionImpl::SetTitlePaneTextL
+        (const TDesC* aTitlePaneText)
+    {
+    // Reset saved state
+    iSaveTitlePaneText = NULL;
+
+    CEikStatusPane* statusPane = iAppUi->StatusPane();
+    if (statusPane)
+        {
+        if (statusPane->PaneCapabilities(TUid::Uid(EEikStatusPaneUidTitle)).IsPresent())
+            {
+            iTitlePane = static_cast<CAknTitlePane*>
+                (statusPane->ControlL(TUid::Uid(EEikStatusPaneUidTitle)));
+            if (iTitlePane->Text())
+                {
+                iSaveTitlePaneText = iTitlePane->Text()->AllocL();
+                }
+            if (aTitlePaneText)
+                {
+                iTitlePane->SetTextL(*aTitlePaneText);
+                }
+            else
+                {
+                iTitlePane->SetTextToDefaultL();
+                }
+            }
+        }
+    }
+
+CEikImage* CPbkAppUi::CViewActivationTransactionImpl::CopyL(const CEikImage& aSrc)
+    {
+    CEikImage* copy = new(ELeave) CEikImage;
+    CleanupStack::PushL(copy);
+    copy->SetPictureOwnedExternally(EFalse);
+    CFbsBitmap* bitmap = new(ELeave) CFbsBitmap;
+    copy->SetBitmap(bitmap);
+    CFbsBitmap* mask = new(ELeave) CFbsBitmap;
+    copy->SetMask(mask);
+    User::LeaveIfError(bitmap->Duplicate(aSrc.Bitmap()->Handle()));
+    User::LeaveIfError(mask->Duplicate(aSrc.Mask()->Handle()));
+    CleanupStack::Pop();  // copy
+    return copy;
+    }
+
+void CPbkAppUi::CViewActivationTransactionImpl::SetContextPanePictureL(const CEikImage* aContextPanePicture)
+    {
+    // Reset saved state
+    iSaveContextPanePicture = NULL;
+
+    CEikStatusPane* statusPane = iAppUi->StatusPane();
+    if (statusPane)
+        {
+        if (statusPane->PaneCapabilities(TUid::Uid(EEikStatusPaneUidContext)).IsInCurrentLayout())
+            {
+            iContextPane = static_cast<CAknContextPane*>
+                (statusPane->ControlL(TUid::Uid(EEikStatusPaneUidContext)));
+            iSaveContextPanePicture = CopyL(iContextPane->Picture());
+            if (aContextPanePicture)
+                {
+                iContextPane->SetPicture(CopyL(*aContextPanePicture));
+                }
+            else
+                {
+                iContextPane->SetPictureToDefaultL();
+                }
+            }
+        }
+    }
+
+//  End of File