--- 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 <aknitemactionmenu.h>
#include <eikdialg.h>
#include <eikmenub.h>
+#include <akntrace.h>
#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<CAknAppUi*>( 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<AknItemActionMenuRegister*>(
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<CAknViewAppUi*>( 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<CAknViewAppUi*>(
+ 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<CAknAppUi*>( 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<CAknAppUi*>( 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