diff -r 000000000000 -r e686773b3f54 phonebookui/Phonebook2/Application/src/CPbk2ViewActivationTransaction.cpp --- /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 +#include + +// System includes +#include +#include +#include +#include +#include +#include +#include +#include + +// -------------------------------------------------------------------------- +// 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 + ( 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 + ( 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 + (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 + (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