phonebookui/Phonebook2/Application/src/CPbk2ViewActivationTransaction.cpp
changeset 0 e686773b3f54
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/Application/src/CPbk2ViewActivationTransaction.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,360 @@
+/*
+* 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 view activation transaction.
+*
+*/
+
+
+#include "CPbk2ViewActivationTransaction.h"
+
+// Phonebook 2
+#include "CPbk2ViewExplorer.h"
+#include "CPbk2AppUi.h"
+#include <CPbk2TabGroupContainer.h>
+#include <CPbk2ViewGraph.h>
+
+// System includes
+#include <aknnavi.h>
+#include <aknnavide.h>
+#include <akntabgrp.h>
+#include <akntitle.h>
+#include <akncontext.h>
+#include <eikimage.h>
+#include <eikspane.h>
+#include <AknsUtils.h>
+
+// --------------------------------------------------------------------------
+// CPbk2ViewActivationTransaction::CPbk2ViewActivationTransaction
+// --------------------------------------------------------------------------
+//
+CPbk2ViewActivationTransaction::CPbk2ViewActivationTransaction
+        ( CPbk2AppUi& aAppUi, CPbk2ViewExplorer& aViewExplorer,
+          const TUid& aViewId, const TVwsViewId& aPrevViewId,
+          TUint aFlags ) :
+            iAppUi( &aAppUi ),
+            iViewExplorer( aViewExplorer ),
+            iViewId( aViewId ),
+            iPrevViewId( aPrevViewId ),
+            iFlags( aFlags )
+    {
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ViewActivationTransaction::~CPbk2ViewActivationTransaction
+// --------------------------------------------------------------------------
+//
+CPbk2ViewActivationTransaction::~CPbk2ViewActivationTransaction()
+    {
+    // Rollback previous view (if necessary)
+    Rollback();
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ViewActivationTransaction::NewLC
+// --------------------------------------------------------------------------
+//
+CPbk2ViewActivationTransaction* CPbk2ViewActivationTransaction::NewLC
+        ( CPbk2AppUi& aAppUi, CPbk2ViewExplorer& aViewExplorer,
+          const TUid& aViewId, const TVwsViewId& aPrevViewId,
+          const TDesC* aTitlePaneText, const CEikImage* aContextPanePicture,
+          TUint aFlags )
+    {
+    CPbk2ViewActivationTransaction* self =
+        new ( ELeave ) CPbk2ViewActivationTransaction
+            ( aAppUi, aViewExplorer, aViewId, aPrevViewId, aFlags );
+    CleanupStack::PushL( self);
+    self->ConstructL( aTitlePaneText, aContextPanePicture );
+    return self;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ViewActivationTransaction::ConstructL
+// --------------------------------------------------------------------------
+//
+void CPbk2ViewActivationTransaction::ConstructL
+        ( const TDesC* aTitlePaneText,
+          const CEikImage* aContextPanePicture )
+    {
+    iNaviPane = static_cast<CAknNavigationControlContainer*>
+        ( iAppUi->StatusPane()->ControlL
+            ( TUid::Uid( EEikStatusPaneUidNavi ) ) );
+
+    // Make changes to state and save rollback data
+    UpdateViewNavigationState();
+
+    if (iFlags & Phonebook2::EUpdateNaviPane)
+        {
+        UpdateNaviPaneL(iViewId);
+        }
+    if (iFlags & Phonebook2::EUpdateTitlePane)
+        {
+        SetTitlePaneTextL(aTitlePaneText);
+        }
+    if (iFlags & Phonebook2::EUpdateContextPane)
+        {
+        SetContextPanePictureL(aContextPanePicture);
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ViewActivationTransaction::Commit
+// --------------------------------------------------------------------------
+//
+void CPbk2ViewActivationTransaction::Commit()
+    {
+    // Delete and reset all rollback data
+    delete iSaveContextPanePicture;
+    iSaveContextPanePicture = NULL;
+    delete iSaveTitlePaneText;
+    iSaveTitlePaneText = NULL;
+    iPushedNaviDecorator = NULL;
+    iTabGroup = NULL;
+    iSavePreviousViewNode = NULL;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ViewActivationTransaction::RollbackL
+// --------------------------------------------------------------------------
+//
+void CPbk2ViewActivationTransaction::RollbackL()
+    {
+    // First rollback as in destructor
+    Rollback();
+    // Then switch back to previous view
+    iViewExplorer.ActivatePreviousViewL( NULL );
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ViewActivationTransaction::UpdateViewNavigationState
+// --------------------------------------------------------------------------
+//
+void CPbk2ViewActivationTransaction::UpdateViewNavigationState()
+    {
+    // Reset saved state
+    iSavePreviousViewNode = NULL;
+
+    // Find activated view node in the graph
+    CPbk2ViewNode* activatedNode =
+        iViewExplorer.ViewGraph().FindNodeWithViewId( iViewId );
+
+    if ( activatedNode )
+        {
+        // Set previous node for the newly activated view
+        if ( iViewExplorer.IsPhonebook2View( iPrevViewId ) )
+            {
+            // Find the previous view in the graph
+            CPbk2ViewNode* prevNode =
+                iViewExplorer.ViewGraph().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 ==
+                            EPbk2ViewTransitionBack &&
+                         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() );
+            }
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ViewActivationTransaction::UpdateNaviPaneL
+// --------------------------------------------------------------------------
+//
+void CPbk2ViewActivationTransaction::UpdateNaviPaneL( TUid aViewId )
+    {
+    // Reset saved state
+    iPushedNaviDecorator = NULL;
+    iTabGroup = NULL;
+    iSaveTabIndex = 0;
+
+    CAknNavigationDecorator* decorator=
+        iAppUi->TabGroups()->TabGroupFromViewId( aViewId.iUid );
+
+    if (decorator)
+        {
+        CAknTabGroup* tabGroup = static_cast<CAknTabGroup*>
+            ( decorator->DecoratedControl() );
+        if (iNaviPane->Top() != decorator)
+            {
+            iNaviPane->PushL(*decorator);
+            iPushedNaviDecorator = decorator;
+            }
+        iTabGroup = tabGroup;
+        iSaveTabIndex = tabGroup->ActiveTabIndex();
+        tabGroup->SetActiveTabById( aViewId.iUid );
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ViewActivationTransaction::SetTitlePaneTextL
+// --------------------------------------------------------------------------
+//
+void CPbk2ViewActivationTransaction::SetTitlePaneTextL
+        ( const TDesC* aTitlePaneText )
+    {
+    // Reset saved state
+    delete iSaveTitlePaneText;
+    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();
+                }
+            }
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ViewActivationTransaction::SetContextPanePictureL
+// --------------------------------------------------------------------------
+//
+void CPbk2ViewActivationTransaction::SetContextPanePictureL
+        ( const CEikImage* aContextPanePicture )
+    {
+    // Reset saved state
+    delete iSaveContextPanePicture;
+    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 = CopyImageL( iContextPane->Picture() );
+            if (aContextPanePicture)
+                {
+                iContextPane->SetPicture
+                    ( CopyImageL( *aContextPanePicture) );
+                }
+            else
+                {
+                iContextPane->SetPictureToDefaultL();
+                }
+            }
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ViewActivationTransaction::CopyImageL
+// --------------------------------------------------------------------------
+//
+CEikImage* CPbk2ViewActivationTransaction::CopyImageL
+        ( 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;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ViewActivationTransaction::Rollback
+// --------------------------------------------------------------------------
+//
+void CPbk2ViewActivationTransaction::Rollback()
+    {
+    // Undo changes in reverse order
+    if ( iContextPane && iSaveContextPanePicture )
+        {
+        // iContextPane takes ownership of iSaveContextPanePicture
+        iContextPane->SetPicture( iSaveContextPanePicture );
+        iSaveContextPanePicture = NULL;
+        }
+    if ( iTitlePane && iSaveTitlePaneText )
+        {
+        // iTitlePane takes ownership of iSaveTitlePaneText
+        iTitlePane->SetText( iSaveTitlePaneText );
+        iSaveTitlePaneText = NULL;
+        }
+    if ( iTabGroup && iSaveTabIndex != KErrNotFound )
+        {
+        iTabGroup->SetActiveTabByIndex( iSaveTabIndex );
+        iSaveTabIndex = KErrNotFound;
+        iTabGroup = NULL;
+        }
+    if ( iNaviPane && iPushedNaviDecorator )
+        {
+        iNaviPane->Pop( iPushedNaviDecorator );
+        iPushedNaviDecorator = NULL;
+        }
+    if ( iSavePreviousViewNode )
+        {
+        CPbk2ViewNode* activatedNode =
+            iViewExplorer.ViewGraph().FindNodeWithViewId( iViewId );
+        if ( activatedNode )
+            {
+            activatedNode->SetPreviousNode( iSavePreviousViewNode );
+            }
+        iSavePreviousViewNode = NULL;
+        }
+    }
+
+// End of File