uifw/EikStd/coctlsrc/aknitemactionmenuregister.cpp
changeset 0 2f259fa3e83a
child 5 aabf2c525e0f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uifw/EikStd/coctlsrc/aknitemactionmenuregister.cpp	Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,662 @@
+/*
+* Copyright (c) 2009 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: Item action menu register.
+*
+*/
+#include <aknappui.h>
+#include <aknview.h>
+#include <aknViewAppUi.h>
+#include <aknitemactionmenu.h>
+#include <eikdialg.h>
+#include <eikmenub.h>
+
+#include "aknitemactionmenuregister.h"
+#include "aknitemactionmenuregisterarray.h"
+
+const TUid KAknItemActionMenuRegister = { 0x20028760 };
+const TInt KRegisterDestructionPriority( -1 );
+
+// ---------------------------------------------------------------------------
+// AknItemActionMenuRegister::SetConstructingMenuBarOwnerL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void AknItemActionMenuRegister::SetConstructingMenuBarOwnerL(
+        MObjectProvider* aMenuBarOwner )
+    {
+    if ( AppUiSingleClickCompatible() )
+        {
+        AknItemActionMenuRegister* instance( Instance() );
+        if ( instance )
+            {
+            instance->iMenuBarOwner = aMenuBarOwner;
+            }
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// AknItemActionMenuRegister::SetOverridingMenuBarOwnerL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void AknItemActionMenuRegister::SetOverridingMenuBarOwnerL(
+        MObjectProvider* aMenuBarOwner, TUint /*aFlags*/ )
+    {
+    if ( AppUiSingleClickCompatible() )
+        {
+        AknItemActionMenuRegister* instance( Instance() );
+        if ( instance )
+            {
+            instance->iOverridingMenuBarOwner = aMenuBarOwner;
+            }
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// AknItemActionMenuRegister::RegisterCollectionL
+// ---------------------------------------------------------------------------
+//
+CAknItemActionMenu* AknItemActionMenuRegister::RegisterCollectionL(
+        MAknCollection& aCollectionState )
+    {
+    CAknItemActionMenu* menu( NULL );
+    if ( AppUiSingleClickCompatible() )
+        {
+        AknItemActionMenuRegister* instance( Instance() );
+        if ( instance )
+            {
+            menu = instance->DoRegisterCollectionL( aCollectionState );
+            }
+        }
+    return menu;
+    }
+
+
+// ---------------------------------------------------------------------------
+// AknItemActionMenuRegister::RegisterMenuBarL
+// ---------------------------------------------------------------------------
+//
+void AknItemActionMenuRegister::RegisterMenuBarL(
+        CEikMenuBar& aMenuBar )
+    {
+    if ( AppUiSingleClickCompatible() )
+        {
+        AknItemActionMenuRegister* instance( Instance() );
+        if ( instance )
+            {
+            instance->DoRegisterMenuBarL( aMenuBar );
+            }
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// AknItemActionMenuRegister::UnregisterMenuBar
+// ---------------------------------------------------------------------------
+//
+void AknItemActionMenuRegister::UnregisterMenuBar(
+        CEikMenuBar& aMenuBar )
+    {
+    if ( AppUiSingleClickCompatible() )
+        {
+        AknItemActionMenuRegister* instance( Instance() );
+        if ( instance )
+            {
+            instance->DoUnregisterMenuBar( aMenuBar );
+            }
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// AknItemActionMenuRegister::RegisterItemActionMenuL
+// ---------------------------------------------------------------------------
+//
+void AknItemActionMenuRegister::RegisterItemActionMenuL(
+        CAknItemActionMenu& aItemActionMenu )
+    {
+    AknItemActionMenuRegister* instance( Instance() );
+    if ( instance )
+        {
+        instance->DoRegisterItemActionMenuL( aItemActionMenu );
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// AknItemActionMenuRegister::UnregisterItemActionMenu
+// ---------------------------------------------------------------------------
+//
+void AknItemActionMenuRegister::UnregisterItemActionMenu(
+        CAknItemActionMenu& aItemActionMenu )
+    {
+    if ( AppUiSingleClickCompatible() )
+        {
+        AknItemActionMenuRegister* instance( Instance() );
+        if ( instance )
+            {
+            instance->DoUnregisterItemActionMenu( aItemActionMenu );
+            }
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// AknItemActionMenuRegister::RegisterCollectionObserverL
+// ---------------------------------------------------------------------------
+//
+void AknItemActionMenuRegister::RegisterCollectionObserverL(
+        MAknCollectionObserver& aObserver )
+    {
+    if ( AppUiSingleClickCompatible() )
+        {
+        AknItemActionMenuRegister* instance( Instance() );
+        if ( instance )
+            {
+            instance->DoRegisterCollectionObserverL( aObserver );
+            }
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// AknItemActionMenuRegister::UnregisterCollectionObserver
+// ---------------------------------------------------------------------------
+//
+void AknItemActionMenuRegister::UnregisterCollectionObserver(
+        MAknCollectionObserver& aObserver )
+    {
+    if ( AppUiSingleClickCompatible() )
+        {
+        AknItemActionMenuRegister* instance( Instance() );
+        if ( instance )
+            {
+            instance->DoUnregisterCollectionObserver( aObserver );
+            }
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// AknItemActionMenuRegister::~AknItemActionMenuRegister
+// ---------------------------------------------------------------------------
+//
+AknItemActionMenuRegister::~AknItemActionMenuRegister()
+    {
+    for ( TInt i = 0; i < iUnregisteredMenus.Count(); i++ )
+        {
+        TAknUnregisteredMenuData& data( iUnregisteredMenus[ i ] );
+        delete data.iMenu;
+        data.iMenu = NULL;
+        }
+    iUnregisteredMenus.Close();
+    iUnregisteredObservers.Close();
+    delete iRegisterArray;
+    }
+
+
+// ---------------------------------------------------------------------------
+// AknItemActionMenuRegister::AknItemActionMenuRegister
+// ---------------------------------------------------------------------------
+//
+AknItemActionMenuRegister::AknItemActionMenuRegister()
+    : CCoeStatic( KAknItemActionMenuRegister, KRegisterDestructionPriority ),
+    iMenuBarOwner( NULL )
+    {
+    }
+
+
+// ---------------------------------------------------------------------------
+// AknItemActionMenuRegister::ConstructL
+// ---------------------------------------------------------------------------
+//
+void AknItemActionMenuRegister::ConstructL()
+    {
+    iRegisterArray = CAknItemActionMenuRegisterArray::NewL();
+    }
+
+
+// ---------------------------------------------------------------------------
+// AknItemActionMenuRegister::AppUiSingleClickCompatible
+// ---------------------------------------------------------------------------
+//
+TBool AknItemActionMenuRegister::AppUiSingleClickCompatible()
+    {
+    CAknAppUi* appUi =
+        static_cast<CAknAppUi*>( CEikonEnv::Static()->AppUi() );
+    return appUi->IsSingleClickCompatible();
+    }
+
+// ---------------------------------------------------------------------------
+// AknItemActionMenuRegister::Instance
+// ---------------------------------------------------------------------------
+//
+AknItemActionMenuRegister* AknItemActionMenuRegister::Instance()
+    {
+    AknItemActionMenuRegister* instance =
+        static_cast<AknItemActionMenuRegister*>(
+                CCoeEnv::Static( KAknItemActionMenuRegister ) );
+    if ( !instance )
+        {
+        TRAP_IGNORE( instance = CreateInstanceL() ); 
+        }
+    return instance;
+    }
+
+
+// ---------------------------------------------------------------------------
+// AknItemActionMenuRegister::DoRegisterCollectionL
+// ---------------------------------------------------------------------------
+//
+CAknItemActionMenu* AknItemActionMenuRegister::DoRegisterCollectionL(
+        MAknCollection& aCollectionState )
+    {
+    CAknItemActionMenu* menu( NULL );
+    CEikMenuBar* menuBar = FindCurrentMenuBarL();
+    menu = RegisterStateToItemActionMenuL( menuBar, aCollectionState );
+    return menu;
+    }
+
+
+// ---------------------------------------------------------------------------
+// AknItemActionMenuRegister::DoRegisterMenuBarL
+// ---------------------------------------------------------------------------
+//
+void AknItemActionMenuRegister::DoRegisterMenuBarL( CEikMenuBar& aMenuBar )
+    {
+    CAknItemActionMenu* menu( NULL );
+    for ( TInt i = 0; i < iUnregisteredMenus.Count(); i++ )
+        {
+        TAknUnregisteredMenuData& data( iUnregisteredMenus[ i ] );
+        CEikMenuBar* ownerMenubar( NULL );
+        data.iOwner->MopGetObjectNoChaining( ownerMenubar );
+        if ( ownerMenubar == &aMenuBar )
+            {
+            menu = data.iMenu;
+            if ( menu )
+                {
+                AddRegisterEntryL( aMenuBar, *menu );
+                }
+            iUnregisteredMenus.Remove( i );
+            break;
+            }
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// AknItemActionMenuRegister::DoUnregisterMenuBar
+// ---------------------------------------------------------------------------
+//
+void AknItemActionMenuRegister::DoUnregisterMenuBar( CEikMenuBar& aMenuBar )
+    {
+    iRegisterArray->UnregisterMenuBar( aMenuBar );
+    }
+
+
+// ---------------------------------------------------------------------------
+// AknItemActionMenuRegister::DoRegisterItemActionMenuL
+// ---------------------------------------------------------------------------
+//
+void AknItemActionMenuRegister::DoRegisterItemActionMenuL(
+        CAknItemActionMenu& aItemActionMenu )
+    {
+    CEikMenuBar* menuBar( NULL );
+    for ( TInt i = 0; i < iUnregisteredMenus.Count(); i++ )
+        {
+        TAknUnregisteredMenuData& data( iUnregisteredMenus[ i ] );
+        if ( data.iMenu == &aItemActionMenu )
+            {
+            data.iOwner->MopGetObjectNoChaining( menuBar );
+            if ( menuBar )
+                {
+                AddRegisterEntryL( *menuBar, aItemActionMenu );
+                }
+            iUnregisteredMenus.Remove( i );
+            break;
+            }
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// AknItemActionMenuRegister::DoUnregisterItemActionMenu
+// ---------------------------------------------------------------------------
+//
+void AknItemActionMenuRegister::DoUnregisterItemActionMenu(
+        CAknItemActionMenu& aItemActionMenu )
+    {
+    iRegisterArray->UnregisterItemActionMenu( aItemActionMenu );
+
+    for ( TInt i = 0; i < iUnregisteredMenus.Count(); i++ )
+        {
+        TAknUnregisteredMenuData& data( iUnregisteredMenus[ i ] );
+        if ( data.iMenu == &aItemActionMenu )
+            {
+            delete data.iMenu;
+            iUnregisteredMenus.Remove( i ); 
+            break; 
+            }
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// AknItemActionMenuRegister::DoRegisterCollectionObserverL
+// ---------------------------------------------------------------------------
+//
+void AknItemActionMenuRegister::DoRegisterCollectionObserverL(
+        MAknCollectionObserver& aObserver )
+    {
+    CEikMenuBar* menuBar = FindCurrentMenuBarL();
+    if ( !menuBar || !iRegisterArray->RegisterCollectionObserverL(
+            *menuBar, aObserver ) )
+        {
+        TAknUnregisteredObserverData newData( menuBar, aObserver );
+        iUnregisteredObservers.AppendL( newData );
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// AknItemActionMenuRegister::DoUnregisterCollectionObserver
+// ---------------------------------------------------------------------------
+//
+void AknItemActionMenuRegister::DoUnregisterCollectionObserver(
+        MAknCollectionObserver& aObserver )
+    {
+    iRegisterArray->UnregisterCollectionObserver( aObserver );
+
+    for ( TInt i = 0; i < iUnregisteredObservers.Count(); i++ )
+        {
+        TAknUnregisteredObserverData& data( iUnregisteredObservers[ i ] );
+        if ( &data.iObserver == &aObserver )
+            {
+            iUnregisteredObservers.Remove( i );
+            return;
+            }
+        }
+
+    for ( TInt i = 0; i < iUnregisteredMenus.Count(); i++ )
+        {
+        TAknUnregisteredMenuData& data( iUnregisteredMenus[ i ] );
+        data.iMenu->RemoveCollectionObserver( aObserver ); 
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// AknItemActionMenuRegister::DialogMenuBar
+// ---------------------------------------------------------------------------
+//
+CEikMenuBar* AknItemActionMenuRegister::DialogMenuBar( CAknAppUi* aAppUi )
+    {
+    CEikMenuBar* menuBar( NULL );
+    // Check if there is an active dialog and fetch its menubar
+    if ( aAppUi->IsDisplayingMenuOrDialog() )
+        {
+        CCoeControl* ctrl = aAppUi->TopFocusedControl();
+        if ( ctrl )
+            {
+            CEikDialog* dialog = ctrl->MopGetObjectNoChaining( dialog );
+            if ( dialog )
+                {
+                dialog->MopGetObject( menuBar );
+                }
+            }
+        }
+    return menuBar;
+    }
+
+
+// ---------------------------------------------------------------------------
+// AknItemActionMenuRegister::ViewMenuBar
+// ---------------------------------------------------------------------------
+//
+CEikMenuBar* AknItemActionMenuRegister::ViewMenuBar( CAknAppUi* aAppUi )
+    {
+    CEikMenuBar* menuBar( NULL );
+    CAknViewAppUi* appUi( static_cast<CAknViewAppUi*>( aAppUi ) );
+
+    // Check if there is an active view
+    TVwsViewId uid;
+    if ( appUi->GetActiveViewId( uid ) == KErrNone )
+        {
+        if ( uid.iAppUid != uid.iViewUid )
+            {
+            CAknView* view = appUi->View( uid.iViewUid );
+            if ( view )
+                {
+                menuBar = view->MenuBar();
+                }
+            }
+        }
+    return menuBar;
+    }
+
+
+// ---------------------------------------------------------------------------
+// AknItemActionMenuRegister::ConstructingObjectMenuBar
+// ---------------------------------------------------------------------------
+//
+CEikMenuBar* AknItemActionMenuRegister::ConstructingObjectMenuBar()
+    {
+    CEikMenuBar* menuBar( NULL );
+    if ( iMenuBarOwner )
+        {
+        iMenuBarOwner->MopGetObjectNoChaining( menuBar );
+        }
+    return menuBar;
+    }
+
+
+// ---------------------------------------------------------------------------
+// AknItemActionMenuRegister::OverridingObjectMenuBar
+// ---------------------------------------------------------------------------
+//
+CEikMenuBar* AknItemActionMenuRegister::OverridingObjectMenuBar()
+    {
+    CEikMenuBar* menuBar( NULL );
+    if ( iOverridingMenuBarOwner )
+        {
+        iOverridingMenuBarOwner->MopGetObjectNoChaining( menuBar );
+        }
+    return menuBar;
+    }
+
+
+// ---------------------------------------------------------------------------
+// AknItemActionMenuRegister::RegisterStateToItemActionMenuL
+// ---------------------------------------------------------------------------
+//
+CAknItemActionMenu* AknItemActionMenuRegister::RegisterStateToItemActionMenuL(
+        CEikMenuBar* aMenuBar,
+        MAknCollection& aCollectionState )
+    {
+    CAknItemActionMenu* menu( NULL );
+
+    // View / dialog / appUi menubar was found
+    if ( aMenuBar )
+        {
+        menu = aMenuBar->ItemActionMenu();
+        // menubar does not have item action menu -> create one
+        if ( !menu )
+            {
+            menu = CAknItemActionMenu::NewLC( aCollectionState );
+            AddRegisterEntryL( *aMenuBar, *menu );
+            CleanupStack::Pop( menu );
+            }
+        // add new collection state to existing item action menu
+        else
+            {
+            menu->AddCollectionStateL( aCollectionState );
+            }
+        }
+    // View / dialog / appUi menubar was not found
+    // Constructing menu bar owner is existing
+    else if ( iMenuBarOwner )
+        {
+        // Go through unregistered menus
+        TBool viewRegistered( EFalse );
+        for ( TInt i = 0; i < iUnregisteredMenus.Count(); i++ )
+            {
+            TAknUnregisteredMenuData& data( iUnregisteredMenus[ i ] );
+            // This view already has unregistered menu
+            // Add collection state to it
+            if ( data.iOwner == iMenuBarOwner )
+                {
+                viewRegistered = ETrue;
+                data.iMenu->AddCollectionStateL( aCollectionState );
+                menu = data.iMenu;
+                break;
+                }
+            }
+        // No unregistered menu found -> create one and add to list
+        if ( !viewRegistered )
+            {
+            menu = CAknItemActionMenu::NewL( aCollectionState );
+            TAknUnregisteredMenuData newData;
+            newData.iOwner = iMenuBarOwner;
+            newData.iMenu = menu;
+            iUnregisteredMenus.AppendL( newData );
+            }
+        }
+    if ( menu )
+        {
+        // Set observers with menubar to menu
+        AddObserversToItemActionMenuL( aMenuBar, *menu );
+        }
+    return menu;
+    }
+
+
+// ---------------------------------------------------------------------------
+// AknItemActionMenuRegister::FindCurrentMenuBarL
+// ---------------------------------------------------------------------------
+//
+CEikMenuBar* AknItemActionMenuRegister::FindCurrentMenuBarL()
+    {
+    CEikonEnv* eikonEnv( CEikonEnv::Static() );
+    CAknAppUi* appUi( static_cast<CAknAppUi*>( eikonEnv->AppUi() ) );
+    TBool isConstructingDialog( EFalse );
+    CEikMenuBar* menuBar( NULL );
+    
+    // If overriding menubar owner is set then it's the one to obey. If the
+    // overriding menubar owner doesn't supply a menubar object then there
+    // isn't proper one available.
+    if ( iOverridingMenuBarOwner )
+        {
+        return OverridingObjectMenuBar();
+        }
+    
+    // Check if there is existing constructing dialog
+    if ( iMenuBarOwner )
+        {
+        CEikDialog* dialog( NULL );
+        iMenuBarOwner->MopGetObjectNoChaining( dialog );
+        if ( dialog )
+            {
+            isConstructingDialog = ETrue;
+            }
+        }
+    // No constructing dialog
+    if ( !isConstructingDialog )
+        {
+        // 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 )
+        {
+        menuBar = eikonEnv->AppUiFactory()->MenuBar();
+        }
+    return menuBar;
+    }
+
+
+// ---------------------------------------------------------------------------
+// AknItemActionMenuRegister::AddRegisterEntryL
+// ---------------------------------------------------------------------------
+//
+void AknItemActionMenuRegister::AddRegisterEntryL(
+        CEikMenuBar& aMenuBar, CAknItemActionMenu& aItemActionMenu )
+    {
+    aMenuBar.SetItemActionMenu( &aItemActionMenu );
+    iRegisterArray->AddEntryL( aMenuBar, aItemActionMenu );
+    AddObserversToItemActionMenuL( &aMenuBar, aItemActionMenu );
+    }
+
+
+// ---------------------------------------------------------------------------
+// AknItemActionMenuRegister::AddObserversToItemActionMenuL
+// ---------------------------------------------------------------------------
+//
+void AknItemActionMenuRegister::AddObserversToItemActionMenuL(
+        CEikMenuBar* aMenuBar, CAknItemActionMenu& aItemActionMenu )
+    {
+    for ( TInt i = 0; i < iUnregisteredObservers.Count(); i++ )
+        {
+        TAknUnregisteredObserverData& data( iUnregisteredObservers[ i ] );
+        // Add if matching menubar or observer with no menubar
+        if ( data.iMenuBar == aMenuBar || !data.iMenuBar )
+            {
+            aItemActionMenu.RegisterCollectionObserverL(
+                    data.iObserver );
+            }
+        }
+    iUnregisteredObservers.Reset();
+    }
+
+// ---------------------------------------------------------------------------
+// AknItemActionMenuRegister::CreateInstanceL
+// ---------------------------------------------------------------------------
+//
+AknItemActionMenuRegister* AknItemActionMenuRegister::CreateInstanceL()
+    {
+    AknItemActionMenuRegister* instance = NULL; 
+    instance = new ( ELeave ) AknItemActionMenuRegister();
+    CleanupStack::PushL( instance );
+    instance->ConstructL();
+    CleanupStack::Pop( instance );
+    return instance;
+    }
+
+// ---------------------------------------------------------------------------
+// AknItemActionMenuRegister::TAknUnregisteredObserverData
+// ::TAknUnregisteredObserverData
+// ---------------------------------------------------------------------------
+//
+AknItemActionMenuRegister::TAknUnregisteredObserverData::\
+    TAknUnregisteredObserverData(
+        CEikMenuBar* aMenuBar, MAknCollectionObserver& aObserver )
+    : iMenuBar( aMenuBar ),
+    iObserver( aObserver )
+    {
+    }
+
+
+// End of File
+