diff -r 8ca85d2f0db7 -r aabf2c525e0f uifw/EikStd/coctlsrc/aknitemactionmenuregister.cpp --- a/uifw/EikStd/coctlsrc/aknitemactionmenuregister.cpp Fri Feb 19 23:04:46 2010 +0200 +++ b/uifw/EikStd/coctlsrc/aknitemactionmenuregister.cpp Fri Mar 12 15:43:43 2010 +0200 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2009-2010 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" @@ -20,6 +20,7 @@ #include #include #include +#include #include "aknitemactionmenuregister.h" #include "aknitemactionmenuregisterarray.h" @@ -34,14 +35,16 @@ EXPORT_C void AknItemActionMenuRegister::SetConstructingMenuBarOwnerL( MObjectProvider* aMenuBarOwner ) { - if ( AppUiSingleClickCompatible() ) + _AKNTRACE_FUNC_ENTER; + + AknItemActionMenuRegister* instance( Instance() ); + + if ( instance ) { - AknItemActionMenuRegister* instance( Instance() ); - if ( instance ) - { - instance->iMenuBarOwner = aMenuBarOwner; - } + instance->iMenuBarOwner = aMenuBarOwner; } + + _AKNTRACE_FUNC_EXIT; } @@ -52,6 +55,8 @@ EXPORT_C void AknItemActionMenuRegister::SetOverridingMenuBarOwnerL( MObjectProvider* aMenuBarOwner, TUint /*aFlags*/ ) { + _AKNTRACE_FUNC_ENTER; + if ( AppUiSingleClickCompatible() ) { AknItemActionMenuRegister* instance( Instance() ); @@ -60,6 +65,8 @@ instance->iOverridingMenuBarOwner = aMenuBarOwner; } } + + _AKNTRACE_FUNC_EXIT; } @@ -70,6 +77,8 @@ CAknItemActionMenu* AknItemActionMenuRegister::RegisterCollectionL( MAknCollection& aCollectionState ) { + _AKNTRACE_FUNC_ENTER; + CAknItemActionMenu* menu( NULL ); if ( AppUiSingleClickCompatible() ) { @@ -79,6 +88,8 @@ menu = instance->DoRegisterCollectionL( aCollectionState ); } } + + _AKNTRACE_FUNC_EXIT; return menu; } @@ -90,6 +101,8 @@ void AknItemActionMenuRegister::RegisterMenuBarL( CEikMenuBar& aMenuBar ) { + _AKNTRACE_FUNC_ENTER; + if ( AppUiSingleClickCompatible() ) { AknItemActionMenuRegister* instance( Instance() ); @@ -98,6 +111,8 @@ instance->DoRegisterMenuBarL( aMenuBar ); } } + + _AKNTRACE_FUNC_EXIT; } @@ -108,6 +123,8 @@ void AknItemActionMenuRegister::UnregisterMenuBar( CEikMenuBar& aMenuBar ) { + _AKNTRACE_FUNC_ENTER; + if ( AppUiSingleClickCompatible() ) { AknItemActionMenuRegister* instance( Instance() ); @@ -116,7 +133,9 @@ instance->DoUnregisterMenuBar( aMenuBar ); } } - } + + _AKNTRACE_FUNC_EXIT; + } // --------------------------------------------------------------------------- @@ -126,11 +145,15 @@ void AknItemActionMenuRegister::RegisterItemActionMenuL( CAknItemActionMenu& aItemActionMenu ) { + _AKNTRACE_FUNC_ENTER; + AknItemActionMenuRegister* instance( Instance() ); if ( instance ) { instance->DoRegisterItemActionMenuL( aItemActionMenu ); } + + _AKNTRACE_FUNC_EXIT; } @@ -141,6 +164,8 @@ void AknItemActionMenuRegister::UnregisterItemActionMenu( CAknItemActionMenu& aItemActionMenu ) { + _AKNTRACE_FUNC_ENTER; + if ( AppUiSingleClickCompatible() ) { AknItemActionMenuRegister* instance( Instance() ); @@ -149,6 +174,8 @@ instance->DoUnregisterItemActionMenu( aItemActionMenu ); } } + + _AKNTRACE_FUNC_EXIT; } @@ -159,6 +186,8 @@ void AknItemActionMenuRegister::RegisterCollectionObserverL( MAknCollectionObserver& aObserver ) { + _AKNTRACE_FUNC_ENTER; + if ( AppUiSingleClickCompatible() ) { AknItemActionMenuRegister* instance( Instance() ); @@ -167,6 +196,8 @@ instance->DoRegisterCollectionObserverL( aObserver ); } } + + _AKNTRACE_FUNC_EXIT; } @@ -177,6 +208,8 @@ void AknItemActionMenuRegister::UnregisterCollectionObserver( MAknCollectionObserver& aObserver ) { + _AKNTRACE_FUNC_ENTER; + if ( AppUiSingleClickCompatible() ) { AknItemActionMenuRegister* instance( Instance() ); @@ -185,6 +218,8 @@ instance->DoUnregisterCollectionObserver( aObserver ); } } + + _AKNTRACE_FUNC_EXIT; } @@ -194,6 +229,8 @@ // AknItemActionMenuRegister::~AknItemActionMenuRegister() { + _AKNTRACE_FUNC_ENTER; + for ( TInt i = 0; i < iUnregisteredMenus.Count(); i++ ) { TAknUnregisteredMenuData& data( iUnregisteredMenus[ i ] ); @@ -203,6 +240,8 @@ iUnregisteredMenus.Close(); iUnregisteredObservers.Close(); delete iRegisterArray; + + _AKNTRACE_FUNC_EXIT; } @@ -214,6 +253,8 @@ : CCoeStatic( KAknItemActionMenuRegister, KRegisterDestructionPriority ), iMenuBarOwner( NULL ) { + _AKNTRACE_FUNC_ENTER; + _AKNTRACE_FUNC_EXIT; } @@ -223,7 +264,11 @@ // void AknItemActionMenuRegister::ConstructL() { + _AKNTRACE_FUNC_ENTER; + iRegisterArray = CAknItemActionMenuRegisterArray::NewL(); + + _AKNTRACE_FUNC_EXIT; } @@ -233,9 +278,19 @@ // TBool AknItemActionMenuRegister::AppUiSingleClickCompatible() { - CAknAppUi* appUi = - static_cast( CEikonEnv::Static()->AppUi() ); - return appUi->IsSingleClickCompatible(); + _AKNTRACE_FUNC_ENTER; + + TBool isCompatible = EFalse; + CAknAppUi* appUi = AppUI(); + + if ( appUi ) + { + isCompatible = appUi->IsSingleClickCompatible(); + } + + _AKNTRACE_FUNC_EXIT; + + return isCompatible; } // --------------------------------------------------------------------------- @@ -244,6 +299,8 @@ // AknItemActionMenuRegister* AknItemActionMenuRegister::Instance() { + _AKNTRACE_FUNC_ENTER; + AknItemActionMenuRegister* instance = static_cast( CCoeEnv::Static( KAknItemActionMenuRegister ) ); @@ -251,6 +308,9 @@ { TRAP_IGNORE( instance = CreateInstanceL() ); } + + _AKNTRACE_FUNC_EXIT; + return instance; } @@ -262,9 +322,14 @@ CAknItemActionMenu* AknItemActionMenuRegister::DoRegisterCollectionL( MAknCollection& aCollectionState ) { + _AKNTRACE_FUNC_ENTER; + CAknItemActionMenu* menu( NULL ); CEikMenuBar* menuBar = FindCurrentMenuBarL(); menu = RegisterStateToItemActionMenuL( menuBar, aCollectionState ); + + _AKNTRACE_FUNC_EXIT; + return menu; } @@ -275,6 +340,8 @@ // void AknItemActionMenuRegister::DoRegisterMenuBarL( CEikMenuBar& aMenuBar ) { + _AKNTRACE_FUNC_ENTER; + CAknItemActionMenu* menu( NULL ); for ( TInt i = 0; i < iUnregisteredMenus.Count(); i++ ) { @@ -287,11 +354,13 @@ if ( menu ) { AddRegisterEntryL( aMenuBar, *menu ); + iUnregisteredMenus.Remove( i ); } - iUnregisteredMenus.Remove( i ); break; } } + + _AKNTRACE_FUNC_EXIT; } @@ -301,7 +370,11 @@ // void AknItemActionMenuRegister::DoUnregisterMenuBar( CEikMenuBar& aMenuBar ) { + _AKNTRACE_FUNC_ENTER; + iRegisterArray->UnregisterMenuBar( aMenuBar ); + + _AKNTRACE_FUNC_EXIT; } @@ -312,6 +385,8 @@ void AknItemActionMenuRegister::DoRegisterItemActionMenuL( CAknItemActionMenu& aItemActionMenu ) { + _AKNTRACE_FUNC_ENTER; + CEikMenuBar* menuBar( NULL ); for ( TInt i = 0; i < iUnregisteredMenus.Count(); i++ ) { @@ -322,11 +397,13 @@ if ( menuBar ) { AddRegisterEntryL( *menuBar, aItemActionMenu ); + iUnregisteredMenus.Remove( i ); } - iUnregisteredMenus.Remove( i ); break; } } + + _AKNTRACE_FUNC_EXIT; } @@ -337,6 +414,8 @@ void AknItemActionMenuRegister::DoUnregisterItemActionMenu( CAknItemActionMenu& aItemActionMenu ) { + _AKNTRACE_FUNC_ENTER; + iRegisterArray->UnregisterItemActionMenu( aItemActionMenu ); for ( TInt i = 0; i < iUnregisteredMenus.Count(); i++ ) @@ -349,6 +428,8 @@ break; } } + + _AKNTRACE_FUNC_EXIT; } @@ -359,13 +440,21 @@ void AknItemActionMenuRegister::DoRegisterCollectionObserverL( MAknCollectionObserver& aObserver ) { + _AKNTRACE_FUNC_ENTER; + CEikMenuBar* menuBar = FindCurrentMenuBarL(); if ( !menuBar || !iRegisterArray->RegisterCollectionObserverL( *menuBar, aObserver ) ) { - TAknUnregisteredObserverData newData( menuBar, aObserver ); + TAknUnregisteredObserverData newData( menuBar, + aObserver, Owner() ); + + + _AKNTRACE( " Added observer %d", &aObserver ); iUnregisteredObservers.AppendL( newData ); } + + _AKNTRACE_FUNC_EXIT; } @@ -376,6 +465,8 @@ void AknItemActionMenuRegister::DoUnregisterCollectionObserver( MAknCollectionObserver& aObserver ) { + _AKNTRACE_FUNC_ENTER; + iRegisterArray->UnregisterCollectionObserver( aObserver ); for ( TInt i = 0; i < iUnregisteredObservers.Count(); i++ ) @@ -384,6 +475,8 @@ if ( &data.iObserver == &aObserver ) { iUnregisteredObservers.Remove( i ); + _AKNTRACE_FUNC_EXIT; + return; } } @@ -393,6 +486,8 @@ TAknUnregisteredMenuData& data( iUnregisteredMenus[ i ] ); data.iMenu->RemoveCollectionObserver( aObserver ); } + + _AKNTRACE_FUNC_EXIT; } @@ -402,9 +497,11 @@ // CEikMenuBar* AknItemActionMenuRegister::DialogMenuBar( CAknAppUi* aAppUi ) { + _AKNTRACE_FUNC_ENTER; + CEikMenuBar* menuBar( NULL ); // Check if there is an active dialog and fetch its menubar - if ( aAppUi->IsDisplayingMenuOrDialog() ) + if ( aAppUi && aAppUi->IsDisplayingMenuOrDialog() ) { CCoeControl* ctrl = aAppUi->TopFocusedControl(); if ( ctrl ) @@ -416,6 +513,9 @@ } } } + + _AKNTRACE_FUNC_EXIT; + return menuBar; } @@ -426,22 +526,18 @@ // CEikMenuBar* AknItemActionMenuRegister::ViewMenuBar( CAknAppUi* aAppUi ) { - CEikMenuBar* menuBar( NULL ); - CAknViewAppUi* appUi( static_cast( aAppUi ) ); + _AKNTRACE_FUNC_ENTER; - // Check if there is an active view - TVwsViewId uid; - if ( appUi->GetActiveViewId( uid ) == KErrNone ) + CEikMenuBar* menuBar( NULL ); + CAknView* view = View( aAppUi ); + + if ( view ) { - if ( uid.iAppUid != uid.iViewUid ) - { - CAknView* view = appUi->View( uid.iViewUid ); - if ( view ) - { - menuBar = view->MenuBar(); - } - } + menuBar = view->MenuBar(); } + + _AKNTRACE_FUNC_EXIT; + return menuBar; } @@ -452,11 +548,16 @@ // CEikMenuBar* AknItemActionMenuRegister::ConstructingObjectMenuBar() { + _AKNTRACE_FUNC_ENTER; + CEikMenuBar* menuBar( NULL ); if ( iMenuBarOwner ) { iMenuBarOwner->MopGetObjectNoChaining( menuBar ); } + + _AKNTRACE_FUNC_EXIT; + return menuBar; } @@ -467,16 +568,112 @@ // CEikMenuBar* AknItemActionMenuRegister::OverridingObjectMenuBar() { + _AKNTRACE_FUNC_ENTER; + CEikMenuBar* menuBar( NULL ); if ( iOverridingMenuBarOwner ) { iOverridingMenuBarOwner->MopGetObjectNoChaining( menuBar ); } + + _AKNTRACE_FUNC_EXIT; + return menuBar; } // --------------------------------------------------------------------------- +// AknItemActionMenuRegister::Owner +// --------------------------------------------------------------------------- +// +MObjectProvider* AknItemActionMenuRegister::Owner() const + { + _AKNTRACE_FUNC_ENTER; + + MObjectProvider* owner = NULL; + CAknAppUi* appUi = AppUI(); + + if ( iOverridingMenuBarOwner ) + { + owner = iOverridingMenuBarOwner; + } + else + { + owner = View( appUi ); + + if ( !owner ) + { + owner = iMenuBarOwner; + } + } + + if ( !owner ) + { + owner = appUi; + } + + __ASSERT_DEBUG( owner, User::Invariant() ); + _AKNTRACE_FUNC_EXIT; + + return owner; + } + + +// --------------------------------------------------------------------------- +// AknItemActionMenuRegister::View +// --------------------------------------------------------------------------- +// +CAknView* AknItemActionMenuRegister::View( CAknAppUi* aAppUi ) const + { + _AKNTRACE_FUNC_ENTER; + + CAknView* view = NULL; + + if ( aAppUi ) + { + // Check if there is an active view + TVwsViewId uid; + + if ( aAppUi->GetActiveViewId( uid ) == KErrNone ) + { + if ( uid.iAppUid != uid.iViewUid ) + { + view = static_cast( + aAppUi )->View( uid.iViewUid ); + } + } + } + + _AKNTRACE_FUNC_EXIT; + + return view; + } + + +// --------------------------------------------------------------------------- +// AknItemActionMenuRegister::AppUI +// --------------------------------------------------------------------------- +// +CAknAppUi* AknItemActionMenuRegister::AppUI() + { + _AKNTRACE_FUNC_ENTER; + + CAknAppUi* appUi = NULL; + CCoeEnv* env = CCoeEnv::Static(); + + if ( env ) + { + appUi = static_cast( env->AppUi() ); + } + + + _AKNTRACE_FUNC_EXIT; + + return appUi; + } + + +// --------------------------------------------------------------------------- // AknItemActionMenuRegister::RegisterStateToItemActionMenuL // --------------------------------------------------------------------------- // @@ -484,6 +681,8 @@ CEikMenuBar* aMenuBar, MAknCollection& aCollectionState ) { + _AKNTRACE_FUNC_ENTER; + CAknItemActionMenu* menu( NULL ); // View / dialog / appUi menubar was found @@ -493,7 +692,7 @@ // menubar does not have item action menu -> create one if ( !menu ) { - menu = CAknItemActionMenu::NewLC( aCollectionState ); + menu = CAknItemActionMenu::NewLC( aCollectionState, Owner() ); AddRegisterEntryL( *aMenuBar, *menu ); CleanupStack::Pop( menu ); } @@ -525,18 +724,22 @@ // No unregistered menu found -> create one and add to list if ( !viewRegistered ) { - menu = CAknItemActionMenu::NewL( aCollectionState ); + menu = CAknItemActionMenu::NewLC( aCollectionState, Owner() ); TAknUnregisteredMenuData newData; newData.iOwner = iMenuBarOwner; newData.iMenu = menu; iUnregisteredMenus.AppendL( newData ); + CleanupStack::Pop( menu ); } } if ( menu ) { // Set observers with menubar to menu - AddObserversToItemActionMenuL( aMenuBar, *menu ); + AddObserversToItemActionMenuL( *menu ); } + + _AKNTRACE_FUNC_EXIT; + return menu; } @@ -547,8 +750,10 @@ // CEikMenuBar* AknItemActionMenuRegister::FindCurrentMenuBarL() { + _AKNTRACE_FUNC_ENTER; + + CAknAppUi* appUi = AppUI(); CEikonEnv* eikonEnv( CEikonEnv::Static() ); - CAknAppUi* appUi( static_cast( eikonEnv->AppUi() ) ); TBool isConstructingDialog( EFalse ); CEikMenuBar* menuBar( NULL ); @@ -557,6 +762,7 @@ // isn't proper one available. if ( iOverridingMenuBarOwner ) { + _AKNTRACE_FUNC_EXIT; return OverridingObjectMenuBar(); } @@ -589,10 +795,13 @@ } // Finally, if no luck with others, fetch pointer to appUi menu bar. - if ( !menuBar ) + if ( !menuBar && eikonEnv ) { menuBar = eikonEnv->AppUiFactory()->MenuBar(); } + + _AKNTRACE_FUNC_EXIT; + return menuBar; } @@ -604,9 +813,13 @@ void AknItemActionMenuRegister::AddRegisterEntryL( CEikMenuBar& aMenuBar, CAknItemActionMenu& aItemActionMenu ) { + _AKNTRACE_FUNC_ENTER; + aMenuBar.SetItemActionMenu( &aItemActionMenu ); iRegisterArray->AddEntryL( aMenuBar, aItemActionMenu ); - AddObserversToItemActionMenuL( &aMenuBar, aItemActionMenu ); + AddObserversToItemActionMenuL( aItemActionMenu ); + + _AKNTRACE_FUNC_EXIT; } @@ -615,35 +828,56 @@ // --------------------------------------------------------------------------- // void AknItemActionMenuRegister::AddObserversToItemActionMenuL( - CEikMenuBar* aMenuBar, CAknItemActionMenu& aItemActionMenu ) + CAknItemActionMenu& aItemActionMenu ) { - for ( TInt i = 0; i < iUnregisteredObservers.Count(); i++ ) + _AKNTRACE_FUNC_ENTER; + + TInt i = 0; + + while ( i < iUnregisteredObservers.Count() ) { - TAknUnregisteredObserverData& data( iUnregisteredObservers[ i ] ); - // Add if matching menubar or observer with no menubar - if ( data.iMenuBar == aMenuBar || !data.iMenuBar ) + TAknUnregisteredObserverData& data( iUnregisteredObservers[i] ); + + // Register to item action menu if observer's owner matches item action + // menu's owner. + if ( data.iOwner == aItemActionMenu.Owner() ) { + _AKNTRACE( " Observer %d added to item action menu", &data.iObserver ); + aItemActionMenu.RegisterCollectionObserverL( data.iObserver ); + + iUnregisteredObservers.Remove( i ); + } + else + { + ++i; } } - iUnregisteredObservers.Reset(); + + _AKNTRACE_FUNC_EXIT; } + // --------------------------------------------------------------------------- // AknItemActionMenuRegister::CreateInstanceL // --------------------------------------------------------------------------- // AknItemActionMenuRegister* AknItemActionMenuRegister::CreateInstanceL() { + _AKNTRACE_FUNC_ENTER; + AknItemActionMenuRegister* instance = NULL; instance = new ( ELeave ) AknItemActionMenuRegister(); CleanupStack::PushL( instance ); instance->ConstructL(); CleanupStack::Pop( instance ); + + _AKNTRACE_FUNC_EXIT; return instance; } + // --------------------------------------------------------------------------- // AknItemActionMenuRegister::TAknUnregisteredObserverData // ::TAknUnregisteredObserverData @@ -651,12 +885,13 @@ // AknItemActionMenuRegister::TAknUnregisteredObserverData::\ TAknUnregisteredObserverData( - CEikMenuBar* aMenuBar, MAknCollectionObserver& aObserver ) + CEikMenuBar* aMenuBar, MAknCollectionObserver& aObserver, + MObjectProvider* aOwner ) : iMenuBar( aMenuBar ), - iObserver( aObserver ) + iObserver( aObserver ), + iOwner( aOwner ) { } - // End of File