uifw/EikStd/coctlsrc/aknitemactionmenuregister.cpp
branchRCL_3
changeset 9 aabf2c525e0f
parent 0 2f259fa3e83a
child 10 9f56a4e1b8ab
--- 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