--- /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