widgetmodel/alfwidgetmodel/src/alfwidgetenvextension.cpp
changeset 0 e83bab7cf002
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/widgetmodel/alfwidgetmodel/src/alfwidgetenvextension.cpp	Thu Dec 17 08:56:02 2009 +0200
@@ -0,0 +1,222 @@
+/*
+* Copyright (c) 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:  Extensions can be added to AlfEnv through this class.
+               Currently resourcepool,widgetfactory can be added as extensions to AlfEnv.
+*
+*/
+
+
+#include <alf/alfenv.h>
+#include <alf/alfenvobject.h>
+#include <alf/alfresourcepool.h>
+
+#include <osn/osnnew.h>
+#include <alf/alfwidgetexception.h>
+#include <alf/alfwidgetenvextension.h>
+
+#include <alf/alfwidgetfactoryloader.h>
+#include <alf/ialfwidgetfactory.h>
+namespace Alf
+    {
+    const int KAlfExtensionResourcePoolUid( 89 ); // Bogus id for resource 
+                                                  // pool extension
+    
+    const int KAlfExtensionWidgetFactoryUid( 106 ); // Bogus id for widget
+                                                    // factory extension
+    
+    // Env extension for the resource pool
+    class AlfExtensionResourcePoolContainer : public MAlfEnvObject
+        {
+    public:        
+
+        AlfExtensionResourcePoolContainer( ResourcePool* aResourcePool) :
+        mResourcePool(aResourcePool )
+            {
+            }
+
+        virtual void Release()
+            {
+            delete this;
+            }
+
+        ~AlfExtensionResourcePoolContainer()
+            {
+            delete mResourcePool;
+            }
+        // Owned
+        ResourcePool* mResourcePool;
+        };
+        
+
+    // Env extension for the widget factory
+    class AlfExtensionWidgetFactory : public MAlfEnvObject
+        {
+    public:        
+
+        AlfExtensionWidgetFactory( 
+            AlfWidgetFactoryLoader* amWidgetFactoryLoader,
+            IAlfWidgetFactory* aWidgetFactory) :
+        mWidgetFactoryLoader( amWidgetFactoryLoader ),
+        mWidgetFactory( aWidgetFactory )
+            {
+            }
+
+        virtual void Release()
+            {
+            delete this;
+            }
+
+        ~AlfExtensionWidgetFactory()
+            {
+            delete mWidgetFactoryLoader;
+            }
+        // Owned
+        AlfWidgetFactoryLoader* mWidgetFactoryLoader;
+        // Not owned
+        IAlfWidgetFactory* mWidgetFactory;
+        };    
+    
+// ---------------------------------------------------------------------------
+// Initializes environment with resource pool and factory extensions
+// ---------------------------------------------------------------------------
+//    
+OSN_EXPORT void AlfWidgetEnvExtension::initializeEnvironment(CAlfEnv& aEnv)
+    {
+	AlfExtensionResourcePoolContainer* poolContainer = 
+        static_cast<AlfExtensionResourcePoolContainer*>(
+            aEnv.Extension( KAlfExtensionResourcePoolUid));
+    if ( poolContainer == NULL)
+        {
+        // Initialize the env with resource pool extension
+        initializeEnvironmentForResourcePool(aEnv);
+        }
+	AlfExtensionWidgetFactory* widgetFactoryExtension = 
+        static_cast<AlfExtensionWidgetFactory*>(
+            aEnv.Extension( KAlfExtensionWidgetFactoryUid));
+    if ( widgetFactoryExtension == NULL)
+        {
+        // Initialize the env with widget factory extension
+        initializeEnvironmentForFactory(aEnv);
+        }
+    }
+// ---------------------------------------------------------------------------
+// Initializes environment with Theme Manager extension
+// ---------------------------------------------------------------------------
+//   
+void AlfWidgetEnvExtension::initializeEnvironmentForTheme(CAlfEnv& /*aEnv*/ )
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// Initializes environment with resource pool extension
+// ---------------------------------------------------------------------------
+//        
+void AlfWidgetEnvExtension::initializeEnvironmentForResourcePool(CAlfEnv& aEnv)
+    {
+    auto_ptr<ResourcePool> pool(new(EMM) ResourcePool(
+                                             aEnv.TextureManager(), NULL));
+    auto_ptr<AlfExtensionResourcePoolContainer> poolContainer(
+        new(EMM) AlfExtensionResourcePoolContainer( pool.release()));
+    int err = aEnv.AddExtension( KAlfExtensionResourcePoolUid,
+                       (MAlfEnvObject*)(poolContainer.get()));
+    if ( err != KErrNone)
+        {
+        ALF_THROW(AlfWidgetException, ECommonError, "Failed to add AlfEnv extension");
+        }
+    else
+        {
+        poolContainer.release();
+        }   
+    }
+// ---------------------------------------------------------------------------
+// Returns the reference for Resource Pool extension object. 
+// ---------------------------------------------------------------------------
+//
+OSN_EXPORT ResourcePool& AlfWidgetEnvExtension::resourcePool( CAlfEnv& aEnv)
+    {
+    Alf::AlfExtensionResourcePoolContainer* poolContainer = 
+        static_cast<Alf::AlfExtensionResourcePoolContainer*>(aEnv.Extension( KAlfExtensionResourcePoolUid));
+    if ( poolContainer == NULL)
+        {
+        initializeEnvironment(aEnv);
+        }
+    //re-fetch the pool
+    poolContainer = 
+        static_cast<Alf::AlfExtensionResourcePoolContainer*>(aEnv.Extension( KAlfExtensionResourcePoolUid));
+    return *(poolContainer->mResourcePool);
+}
+
+// ---------------------------------------------------------------------------
+// Initializes environment with factory extension
+// ---------------------------------------------------------------------------
+//    
+void AlfWidgetEnvExtension::initializeEnvironmentForFactory(CAlfEnv& aEnv)
+    {
+    auto_ptr<AlfWidgetFactoryLoader> widgetFactoryLoader( 
+                                         new (EMM) AlfWidgetFactoryLoader() );
+    
+    IAlfWidgetFactory* widgetFactory = NULL;
+    widgetFactory = widgetFactoryLoader->loadWidgetFactory(aEnv);
+    if(!widgetFactory)
+        {
+        ALF_THROW(AlfWidgetException, ECommonError, "Failed to create widget factory");
+        }
+    auto_ptr<AlfExtensionWidgetFactory> widgetFactoryExtension(
+        new(EMM) AlfExtensionWidgetFactory( widgetFactoryLoader.release(),
+                     widgetFactory));
+    int err = aEnv.AddExtension( KAlfExtensionWidgetFactoryUid,
+                       (MAlfEnvObject*)(widgetFactoryExtension.get()));
+    if ( err != 0)
+        {
+        ALF_THROW(AlfWidgetException, ECommonError, "Failed to add AlfEnv extension");
+        }
+    else
+        {
+    	widgetFactoryExtension.release();
+        }        
+    }
+
+// ---------------------------------------------------------------------------
+// Returns the reference for Theme Manager extension object. 
+// ---------------------------------------------------------------------------
+//    
+OSN_EXPORT AlfThemeManagerUtil& AlfWidgetEnvExtension::themeManagerUtil( CAlfEnv& /*aEnv*/)
+    {
+    // Depricated
+    ALF_THROW(AlfWidgetException, EInvalidArgument, "Depricated Module");
+    }
+
+    
+// ---------------------------------------------------------------------------
+//Access to the widget factory
+// ---------------------------------------------------------------------------
+//        
+OSN_EXPORT IAlfWidgetFactory& AlfWidgetEnvExtension::widgetFactory( 
+    CAlfEnv& aEnv)
+    {
+    AlfExtensionWidgetFactory* widgetFactoryExtension = 
+        static_cast<AlfExtensionWidgetFactory*>(
+            aEnv.Extension( KAlfExtensionWidgetFactoryUid));
+    if ( widgetFactoryExtension == NULL)
+        {
+        initializeEnvironmentForFactory(aEnv);
+        }
+    //re-fetch the widget factory extension
+    widgetFactoryExtension = 
+        static_cast<AlfExtensionWidgetFactory*>(
+            aEnv.Extension( KAlfExtensionWidgetFactoryUid));
+    return *(widgetFactoryExtension->mWidgetFactory);
+    }    
+
+    } // Alf