uifw/AvKon/AknListLoaderTfx/src/aknlistloadertfx.cpp
changeset 0 2f259fa3e83a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uifw/AvKon/AknListLoaderTfx/src/aknlistloadertfx.cpp	Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,298 @@
+/*
+* Copyright (c) 2006 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:  CAknListLoader is used to load the APIs needed for listbox effects
+*
+*/
+
+
+#include "aknlistloadertfx.h"
+#include "aknlistboxtfx.h"
+#include "aknlistboxtfxinternal.h"
+#include "aknlistboxtfxplugin.h"
+#include "aknlistboxecomids.h"
+#include <ecom/ecom.h>
+#include <eiklbx.h>
+#include <eiklbv.h>
+#include <eiklbi.h>
+#include <eikmenup.h>
+
+const TUid KUid = { 0x10282E46 }; // Uid for the CCoeStatic
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+EXPORT_C MAknListBoxTfx *CAknListLoader::TfxApi(CWindowGc *aGc)
+    {
+    CAknListLoader *singleton = CAknListLoader::Static();
+
+    if ( singleton && singleton->iListBoxPlugin &&
+         singleton->iGcArray.Find( aGc ) != KErrNotFound )
+        {
+        return singleton->iListBoxPlugin->AknListBoxTfx(aGc);
+        }
+    return NULL;
+    }
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+EXPORT_C MAknListBoxTfxInternal *CAknListLoader::TfxApiInternal(CWindowGc *aGc)
+    {
+    CAknListLoader *singleton = CAknListLoader::Static();
+
+    if ( singleton && singleton->iListBoxPlugin &&
+         singleton->iGcArray.Find( aGc ) != KErrNotFound )
+        {
+        return singleton->iListBoxPlugin->AknListBoxTfxInternal(aGc);
+        }
+    return NULL;
+    }
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CWindowGc* CAknListLoader::CreateTfxGc( CEikListBox& aListBox )
+    {
+    CAknListLoader* singleton = CAknListLoader::Static();
+    if ( !singleton )
+        {
+        singleton = new CAknListLoader();
+        }
+
+    if( singleton && ( !singleton->iListBoxPlugin ) )
+        {
+        // load plugin
+        TInt err = KErrNone;
+        TUid implementationUidCtrl = { KAknListBoxPluginEcomImpl };
+
+        TRAP( err,singleton->iListBoxPlugin = ( MAknListBoxTfxPlugin* )
+            REComSession::CreateImplementationL( implementationUidCtrl,
+                                    singleton->iListBoxPluginEComDtorUID ) );
+        }
+    if ( singleton && singleton->iListBoxPlugin &&
+         singleton->iGcArray.Reserve( singleton->iGcArray.Count() + 1 ) == KErrNone )
+        {
+        CWindowGc* ret = singleton->iListBoxPlugin->CreateTfxGc( aListBox );
+        if ( ret && ret != aListBox.View()->ItemDrawer()->Gc() )
+            {
+            singleton->iGcArray.Append( ret );
+            return ret;
+            }
+        }
+    return aListBox.View()->ItemDrawer()->Gc();
+    }
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CWindowGc *CAknListLoader::CreateTfxGc( CEikMenuPane& aMenuPane,
+                                                 TInt& aTopIndex,
+                                                 TInt& aItemsThatFitInView )
+    {
+    CAknListLoader* singleton = CAknListLoader::Static();
+    if( !singleton )
+        {
+        singleton = new CAknListLoader();
+        }
+
+    if ( singleton && ( !singleton->iListBoxPlugin ) )
+        {
+        // load plugin
+        TInt err = KErrNone;
+        TUid implementationUidCtrl = { KAknListBoxPluginEcomImpl };
+
+        TRAP( err, singleton->iListBoxPlugin = ( MAknListBoxTfxPlugin* )
+                            REComSession::CreateImplementationL(
+                                    implementationUidCtrl,
+                                    singleton->iListBoxPluginEComDtorUID ) );
+        }
+    CWindowGc* ret = NULL;
+    if ( singleton && singleton->iListBoxPlugin &&
+         singleton->iGcArray.Reserve( singleton->iGcArray.Count() + 1 )
+         == KErrNone )
+        {
+        ret = singleton->iListBoxPlugin->CreateTfxGc( aMenuPane, aTopIndex,
+                                                       aItemsThatFitInView );
+        if ( ret )
+            {
+            singleton->iGcArray.Append( ret );
+            }
+        }
+    return ret;
+    }
+    
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CWindowGc *CAknListLoader::CreateTfxGc( CAknTreeList& aTreeList,
+                                                 TInt& aTopIndex,
+                                                 TInt& aBottomIndex,
+                                                 TInt& aHighlightIndex,
+                                                 TInt& aRows )
+    {
+    CAknListLoader* singleton = CAknListLoader::Static();
+    if( !singleton )
+        {
+        singleton = new CAknListLoader();
+        }
+
+    if ( singleton && ( !singleton->iListBoxPlugin ) )
+        {
+        // load plugin
+        TInt err = KErrNone;
+        TUid implementationUidCtrl = { KAknListBoxPluginEcomImpl };
+
+        TRAP( err, singleton->iListBoxPlugin = ( MAknListBoxTfxPlugin* )
+                            REComSession::CreateImplementationL(
+                                    implementationUidCtrl,
+                                    singleton->iListBoxPluginEComDtorUID ) );
+        }
+    CWindowGc* ret = NULL;
+    if ( singleton && singleton->iListBoxPlugin &&
+         singleton->iGcArray.Reserve( singleton->iGcArray.Count() + 1 )
+         == KErrNone )
+        {
+        ret = singleton->iListBoxPlugin->CreateTfxGc( aTreeList, aTopIndex,
+                                      aBottomIndex, aHighlightIndex, aRows );
+        if ( ret )
+            {
+            singleton->iGcArray.Append( ret );
+            }
+        }
+    return ret;
+    }
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CWindowGc* CAknListLoader::CreateTfxGc( CCoeControl& aAdapter )
+    {
+    CAknListLoader* singleton = CAknListLoader::Static();
+    if( !singleton )
+        {
+        singleton = new CAknListLoader();
+        }
+
+    if ( singleton && !singleton->iListBoxPlugin )
+        {
+        // load plugin
+        TUid implementationUidCtrl = { KAknListBoxPluginEcomImpl };
+
+        TRAP_IGNORE( singleton->iListBoxPlugin = ( MAknListBoxTfxPlugin* )
+                            REComSession::CreateImplementationL(
+                                    implementationUidCtrl,
+                                    singleton->iListBoxPluginEComDtorUID ) );
+        }
+    if ( singleton && singleton->iListBoxPlugin &&
+         singleton->iGcArray.Reserve( singleton->iGcArray.Count() + 1 )
+         == KErrNone )
+        {
+        CWindowGc* ret = singleton->iListBoxPlugin->CreateTfxGc( aAdapter );
+        if ( ret )
+            {
+            singleton->iGcArray.Append( ret );
+            return ret;
+            }
+        }
+    return &aAdapter.SystemGc();
+    }
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAknListLoader::RemoveTfxGc ( CWindowGc* aGc )
+    {
+    CAknListLoader* singleton = CAknListLoader::Static();
+    if( singleton )
+        {
+        TInt index = singleton->iGcArray.Find( aGc );
+        if ( index != KErrNotFound )
+            {
+            singleton->iGcArray.Remove( index );
+            }
+        }
+
+    }
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAknListLoader::InvalidateAll()
+    {
+    CAknListLoader* singleton = CAknListLoader::Static();
+    if ( singleton )
+        {
+        for ( TInt i = 0; i < singleton->iGcArray.Count(); i++ )
+            {
+            MAknListBoxTfxInternal* api = TfxApiInternal( singleton->iGcArray[i] );
+            if ( api )
+                {
+                api->Remove( MAknListBoxTfxInternal:: EListEverything );
+                }
+            }
+        }
+    }
+
+#ifdef RD_UI_TRANSITION_EFFECTS_TOUCH_P2
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt CAknListLoader::LongTap( MAknListBoxTfxInternal::TLongTapEvent aEvent,
+                                       TInt aDuration, const TPoint* aPoint )
+    {
+    CAknListLoader* singleton = CAknListLoader::Static();
+    if ( singleton )
+        {
+        for ( TInt i = 0; i < singleton->iGcArray.Count(); i++ )
+            {
+            MAknListBoxTfxInternal* api =
+                TfxApiInternal( singleton->iGcArray[i] );
+            if ( api && api->LongTap( aEvent, aDuration, aPoint ) == KErrNone )
+                {
+                return KErrNone;
+                }
+            }
+        }
+    return KErrNotReady;
+    }
+#endif // RD_UI_TRANSITION_EFFECTS_TOUCH_P2
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+CAknListLoader *CAknListLoader::Static()
+    {
+    CAknListLoader *singleton = reinterpret_cast<CAknListLoader*>(CCoeEnv::Static(KUid));
+    return singleton;
+    }
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+CAknListLoader::CAknListLoader() : CCoeStatic(KUid, -1, CCoeStatic::EThread)
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+CAknListLoader::~CAknListLoader()
+    {
+    iGcArray.ResetAndDestroy();
+    if(iListBoxPlugin)
+        {
+        delete iListBoxPlugin;
+        REComSession::DestroyedImplementation( iListBoxPluginEComDtorUID );
+        }
+    }