phonebookui/Phonebook2/UIExtensionManager/src/CPbk2UIExtensionMenuManager.cpp
changeset 0 e686773b3f54
child 32 2828b4d142c0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/UIExtensionManager/src/CPbk2UIExtensionMenuManager.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,176 @@
+/*
+* Copyright (c) 2005-2007 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:  Phonebook 2 UI extension menu manager.
+*
+*/
+
+
+#include "CPbk2UIExtensionMenuManager.h"
+
+// Phonebook 2
+#include "CPbk2UIExtensionLoader.h"
+#include "CPbk2UIExtensionInformation.h"
+#include "CPbk2UIExtensionMenu.h"
+#include "CPbk2ThinUIExtensionLoader.h"
+#include <CPbk2UIExtensionThinPlugin.h>
+#include <CPbk2UIExtensionPlugin.h>
+
+// System includes
+#include <eikmenup.h>
+
+// --------------------------------------------------------------------------
+// CPbk2UIExtensionMenuManager::CPbk2UIExtensionMenuManager
+// --------------------------------------------------------------------------
+//
+CPbk2UIExtensionMenuManager::CPbk2UIExtensionMenuManager(
+        CPbk2UIExtensionLoader& aExtensionLoader,
+        CPbk2ThinUIExtensionLoader& aThinExtensionLoader ) :
+        iExtensionLoader( aExtensionLoader ),
+        iThinExtensionLoader( aThinExtensionLoader )
+    {
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2UIExtensionMenuManager::~CPbk2UIExtensionMenuManager
+// --------------------------------------------------------------------------
+//
+CPbk2UIExtensionMenuManager::~CPbk2UIExtensionMenuManager()
+    {
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2UIExtensionMenuManager::NewL
+// --------------------------------------------------------------------------
+//
+CPbk2UIExtensionMenuManager* CPbk2UIExtensionMenuManager::NewL(
+        CPbk2UIExtensionLoader& aExtensionLoader,
+        CPbk2ThinUIExtensionLoader& aThinExtensionLoader )
+    {
+    CPbk2UIExtensionMenuManager* self =
+        new ( ELeave ) CPbk2UIExtensionMenuManager
+            ( aExtensionLoader, aThinExtensionLoader );
+    return self;
+	}
+
+// --------------------------------------------------------------------------
+// CPbk2UIExtensionMenuManager::DynInitMenuPaneL
+// --------------------------------------------------------------------------
+//
+void CPbk2UIExtensionMenuManager::DynInitMenuPaneL(
+        TUid aViewId, TUint32 aFilteringFlags, TInt aResourceId,
+        CEikMenuPane* aMenuPane, MPbk2ContactUiControl& aUiControl )
+    {
+    const TInt informationCount =
+        iExtensionLoader.PluginInformation().Count();
+
+    for (TInt i = 0; i < informationCount; ++i)
+        {
+        CPbk2UIExtensionInformation* pluginInformation =
+            iExtensionLoader.PluginInformation()[i];
+
+        // Call for UI extensions
+        DoDynInitMenuPaneL( *pluginInformation, aViewId, aFilteringFlags,
+            aResourceId, aMenuPane, aUiControl );
+        }
+        
+    // Call dynamic filtering for thin extension that are always loaded
+    const TInt thinExtCount = iThinExtensionLoader.PluginCount();
+    for ( TInt i = 0; i < thinExtCount; ++i )
+        {
+        iThinExtensionLoader.PluginAt(i).DynInitMenuPaneL( aResourceId,
+            aMenuPane, aUiControl );
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2UIExtensionMenuManager::PluginForCommandIdL
+// --------------------------------------------------------------------------
+//
+void CPbk2UIExtensionMenuManager::PluginForCommandIdL(
+        TInt aCommandId, RArray<TUid>& aPluginUids ) const
+    {
+    const TInt informationCount =
+        iExtensionLoader.PluginInformation().Count();
+    for ( TInt i = 0; i < informationCount; ++i )
+        {
+        CPbk2UIExtensionInformation* pluginInformation =
+            iExtensionLoader.PluginInformation()[i];
+        if ( pluginInformation->ImplementsMenuCommand( aCommandId ) )
+            {
+            aPluginUids.AppendL( pluginInformation->ImplementationUid() );
+            }
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2UIExtensionMenuManager::DoDynInitMenuPaneL
+// --------------------------------------------------------------------------
+//
+void CPbk2UIExtensionMenuManager::DoDynInitMenuPaneL(
+        CPbk2UIExtensionInformation& aPluginInformation,
+        TUid aViewId, TUint32 aFilteringFlags, TInt aResourceId,
+        CEikMenuPane* aMenuPane, MPbk2ContactUiControl& aUiControl )
+    {
+    // Check has the extension been loaded
+    TBool isLoaded =
+        iExtensionLoader.IsLoaded( aPluginInformation.ImplementationUid() );
+
+    // 1) Do filtering according to resource definitions
+    TInt count = aPluginInformation.MenuCount();
+    for ( TInt j = 0; j < count; ++j )
+        {
+        CPbk2UIExtensionMenu& menu = aPluginInformation.MenuAt(j);
+
+        // Check is menu visible
+        TBool isVisible =
+            menu.IsVisible( aViewId, aResourceId, aFilteringFlags );
+
+        if ( isVisible )
+            {
+            TInt position = KErrNotFound;
+
+            // Menu is  visible, now check that the previous item exists
+            TBool prevItemExists = aMenuPane->MenuItemExists
+                ( menu.PreviousCommand(), position );
+            // Check does the menu item already exist, or does the cascading
+            // menu item exist
+            TBool menuItemExists = ETrue;
+            TInt cascadeMenuCmd = menu.CascadingMenuCmd();
+            if ( cascadeMenuCmd == 0 ||
+                    !aMenuPane->MenuItemExists( cascadeMenuCmd, position ) )
+                {
+                menuItemExists = EFalse;
+                }
+
+            if ( prevItemExists && !menuItemExists )
+                {
+                // The menu pane is visible with current flags and
+                // the cascading menu has not been inserted by any
+                // other extension yet
+                aMenuPane->AddMenuItemsL
+                    ( menu.MenuResId(), menu.PreviousCommand() );
+                }
+            }
+        }
+
+    // 2) If extension is loaded -> use dynamic filtering
+    if ( isLoaded )
+        {
+        CPbk2UIExtensionPlugin* plugin = iExtensionLoader.LoadedPlugin
+            ( aPluginInformation.ImplementationUid() );
+        plugin->DynInitMenuPaneL( aResourceId, aMenuPane, aUiControl );
+        }
+    }
+
+// End of File