uifw/EikStd/coctlsrc/aknitemactionmenuregister.cpp
branchRCL_3
changeset 16 71dd06cfe933
parent 10 9f56a4e1b8ab
child 23 3d340a0166ff
--- a/uifw/EikStd/coctlsrc/aknitemactionmenuregister.cpp	Wed Mar 31 21:59:52 2010 +0300
+++ b/uifw/EikStd/coctlsrc/aknitemactionmenuregister.cpp	Wed Apr 14 16:14:00 2010 +0300
@@ -71,11 +71,34 @@
 
 
 // ---------------------------------------------------------------------------
+// AknItemActionMenuRegister::RemoveConstructingMenuBarOwner
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void AknItemActionMenuRegister::RemoveConstructingMenuBarOwner( 
+        MObjectProvider* aMenuBarOwner )
+    {
+    _AKNTRACE_FUNC_ENTER;
+
+    if ( AppUiSingleClickCompatible() )
+        {
+        AknItemActionMenuRegister* instance( Instance() );
+
+        if ( instance )
+            {
+            instance->DoRemoveConstructingMenuBarOwner( aMenuBarOwner );
+            }
+        }
+
+    _AKNTRACE_FUNC_EXIT;
+    }
+
+
+// ---------------------------------------------------------------------------
 // AknItemActionMenuRegister::RegisterCollectionL
 // ---------------------------------------------------------------------------
 //
 CAknItemActionMenu* AknItemActionMenuRegister::RegisterCollectionL(
-        MAknCollection& aCollectionState )
+        MAknCollection& aCollectionState, MObjectProvider* aMenuBarOwner )
     {
     _AKNTRACE_FUNC_ENTER;
 
@@ -85,7 +108,8 @@
         AknItemActionMenuRegister* instance( Instance() );
         if ( instance )
             {
-            menu = instance->DoRegisterCollectionL( aCollectionState );
+            menu = instance->DoRegisterCollectionL( 
+                    aCollectionState, aMenuBarOwner );
             }
         }
 
@@ -320,12 +344,22 @@
 // ---------------------------------------------------------------------------
 //
 CAknItemActionMenu* AknItemActionMenuRegister::DoRegisterCollectionL(
-        MAknCollection& aCollectionState )
+        MAknCollection& aCollectionState, MObjectProvider* aMenuBarOwner )
     {
     _AKNTRACE_FUNC_ENTER;
     
     CAknItemActionMenu* menu( NULL );
-    CEikMenuBar* menuBar = FindCurrentMenuBarL();
+    CEikMenuBar* menuBar = NULL;
+    
+    if ( aMenuBarOwner )
+        {
+        aMenuBarOwner->MopGetObject( menuBar );
+        }
+
+    if ( !menuBar )
+        {
+        menuBar = FindCurrentMenuBar();
+        }
     menu = RegisterStateToItemActionMenuL( menuBar, aCollectionState );
 
     _AKNTRACE_FUNC_EXIT;
@@ -448,7 +482,7 @@
     {
     _AKNTRACE_FUNC_ENTER;
 
-    CEikMenuBar* menuBar = FindCurrentMenuBarL();
+    CEikMenuBar* menuBar = FindCurrentMenuBar();
     if ( !menuBar || !iRegisterArray->RegisterCollectionObserverL(
             *menuBar, aObserver ) )
         {
@@ -751,16 +785,15 @@
 
 
 // ---------------------------------------------------------------------------
-// AknItemActionMenuRegister::FindCurrentMenuBarL
+// AknItemActionMenuRegister::FindCurrentMenuBar
 // ---------------------------------------------------------------------------
 //
-CEikMenuBar* AknItemActionMenuRegister::FindCurrentMenuBarL()
+CEikMenuBar* AknItemActionMenuRegister::FindCurrentMenuBar()
     {
     _AKNTRACE_FUNC_ENTER;
 
     CAknAppUi* appUi = AppUI();
     CEikonEnv* eikonEnv( CEikonEnv::Static() );
-    TBool isConstructingDialog( EFalse );
     CEikMenuBar* menuBar( NULL );
     
     // If overriding menubar owner is set then it's the one to obey. If the
@@ -771,34 +804,23 @@
         _AKNTRACE_FUNC_EXIT;
         return OverridingObjectMenuBar();
         }
-    
-    // Check if there is existing constructing dialog
+
+    // by default choose the current constructing menubar owner
     if ( iMenuBarOwner )
         {
-        CEikDialog* dialog( NULL );
-        iMenuBarOwner->MopGetObjectNoChaining( dialog );
-        if ( dialog )
-            {
-            isConstructingDialog = ETrue;
-            }
+        menuBar = ConstructingObjectMenuBar();
         }
-    // No constructing dialog
-    if ( !isConstructingDialog )
+    else
         {
         // Fetch pointer to dialog that is currently displayed
         menuBar = DialogMenuBar( appUi );
+
         // No dialog - pointer to active view menu bar
         if ( !menuBar )
             {
             menuBar = ViewMenuBar( appUi );
             }
         }
-    
-    // Fetch pointer to constructing object menu bar
-    if ( !menuBar )
-        {
-        menuBar = ConstructingObjectMenuBar();
-        }
 
     // Finally, if no luck with others, fetch pointer to appUi menu bar.
     if ( !menuBar && eikonEnv )
@@ -901,31 +923,67 @@
             iIsConstructingDialog = ETrue; 
             }
         }
-    else if ( !aMenuBarOwner && iIsConstructingDialog )
+    
+    iMenuBarOwner = aMenuBarOwner;
+    }
+
+
+// ---------------------------------------------------------------------------
+// AknItemActionMenuRegister::DoRemoveConstructingMenuBarOwner
+// ---------------------------------------------------------------------------
+//
+void AknItemActionMenuRegister::DoRemoveConstructingMenuBarOwner( 
+        MObjectProvider* aMenuBarOwner )
+    {
+    TInt i = 0;
+    
+    // set all references to removed menubar owner to NULL
+    while ( i  < iUnregisteredMenus.Count() )
         {
-        // When setting constructing menubar owner to NULL from a dialog check
-        // if there is item with the same menubar owner in iUnregisteredMenus 
-        // and try to find correct menubar for it.
-        for ( TInt i = 0; i < iUnregisteredMenus.Count(); i++ )
+        TAknUnregisteredMenuData& data( iUnregisteredMenus[i] );
+
+        if ( data.iOwner == iMenuBarOwner ) 
             {
-            TAknUnregisteredMenuData& data( iUnregisteredMenus[ i ] );
-            if ( data.iOwner == iMenuBarOwner ) 
+            data.iOwner = iMenuBarOwner = NULL;
+            
+            // When setting constructing menubar owner to NULL from a dialog
+            // check if there is item with the same menubar owner in 
+            // iUnregisteredMenus and try to find correct menubar for it.
+            if ( iIsConstructingDialog )
                 {
-                data.iOwner = iMenuBarOwner = NULL; 
-                CEikMenuBar* menuBar = FindCurrentMenuBarL(); 
+                CEikMenuBar* menuBar = FindCurrentMenuBar(); 
+
                 if ( menuBar )
                     {
-                    AddRegisterEntryL( *menuBar, *data.iMenu );
+                    TRAP_IGNORE( AddRegisterEntryL( *menuBar, *data.iMenu ) );
                     iUnregisteredMenus.Remove( i );
+                    continue;
                     }
-                iIsConstructingDialog = EFalse; 
-                return; 
                 }
             }
+        
+        ++i;
         }
-    iMenuBarOwner = aMenuBarOwner;
+    
+    // NULL also possible references in unregistered observers
+    for ( i = 0; i < iUnregisteredObservers.Count(); ++i )
+        {
+        TAknUnregisteredObserverData& data( iUnregisteredObservers[i] );
+        
+        if ( data.iOwner == aMenuBarOwner )
+            {
+            data.iOwner = NULL;
+            }
+        }
+    
+    if ( iMenuBarOwner == aMenuBarOwner )
+        {
+        iIsConstructingDialog = EFalse; 
+        iMenuBarOwner = NULL;
+        }
     }
 
+
 // ---------------------------------------------------------------------------
 // AknItemActionMenuRegister::TAknUnregisteredObserverData
 // ::TAknUnregisteredObserverData