uifw/EikStd/coctlsrc/AknTouchPane.cpp
changeset 0 2f259fa3e83a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uifw/EikStd/coctlsrc/AknTouchPane.cpp	Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,1716 @@
+/*
+* 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:  Implementation of the concrete touch pane class.
+*
+*/
+
+
+// INCLUDE FILES
+#include <eikaufty.h>   // MEikAppUiFactory
+#include <eikenv.h>     // CEikonEnv
+#include <eikapp.h>     // CEikApplication
+#include <eikpanic.h>
+#include <AknCapServerClient.h> // RAknUiServer
+#include <barsread.h>           // TResourceReader
+#include <AknDef.h>             // View ids
+#include <AknsUtils.h>
+#include <AknsDrawUtils.h>
+#include <AknsFrameBackgroundControlContext.h>
+#include <aknview.h>            // CAknView
+#include <aknViewAppUi.h>       // CAknViewAppUi
+#include <StringLoader.h>       // StringLoader
+#include <hlplch.h>             // HlpLauncher
+#include <AknSgcc.h>
+#include <AknUtils.h>
+#include <AknStatuspaneUtils.h>
+#include <aknbutton.h>
+#include <akntoolbar.h>
+#include <aknfeppensupportinterface.h> // MAknFepPenSupportInterface
+#include <AknCapServerDefs.h>
+
+#include <AknTasHook.h> // for testability hooks
+#include <avkon.mbg>
+#include <avkon.rsg>
+#include <aknpriv.rsg>
+#include <layoutmetadata.cdl.h>
+#include <aknlayoutscalable_avkon.cdl.h>
+
+#include <gfxtranseffect/gfxtranseffect.h> 
+#include <akntranseffect.h>
+#include <akntransitionutils.h>
+
+#include "touchtoolbardata.h"
+
+#include "akntouchpane.hrh"
+#include "akntouchpane.h"
+
+#ifdef RD_SCALABLE_UI_V2
+
+const TInt KDisableToolbar = 0xfff1;
+const TInt KEnableToolbar = 0xfff2;
+
+// UIDs for contacts application.
+#ifdef RD_PHONEBOOK2
+#define KAknTouchPaneContactsAppUid TUid::Uid(0x101f4cce)
+#else
+#define KAknTouchPaneContactsAppUid TUid::Uid(0x101f87b1)
+#endif
+#define KAknTouchPaneContactsViewUid TUid::Uid(1)
+
+// UIDs for dialler application.
+#define KAknTouchPaneDiallerAppUid TUid::Uid(0x100058B3)
+#define KAknTouchPaneDiallerViewUid TUid::Uid(0x10282D81)
+#define KTouchPaneDiallerVievCommand TUid::Uid(0x1)
+
+#define KAknTouchPaneHelpAppUid TUid::Uid(0x10005234)
+
+#define KAknTouchPaneAutoLockAppUid TUid::Uid(0x100059B5)
+
+
+// Class for storing touch pane item description.
+class TAknTouchPaneItem
+    {
+public:
+
+    TAknTouchPaneItem()
+        : iPriority( -1 ),
+          iId( ETouchPaneElementNone ),
+          iPlugin( NULL ) {}
+
+    TInt iPriority;
+    TUint iId;
+    TUint iPlugin;
+    };
+
+// Enumeration for touch pane flags.
+enum TAknTouchPaneFlags
+    {
+    ENoAutomaticVisibilityChanges   = 0,
+    ETouchPaneActive                = 1,
+    EHasForeground                  = 2,
+    EShellIconActive                = 3,
+    ESwapperIconActive              = 4,
+    EIdleViewIconActive             = 5,
+    EDiallerIconActive              = 6,
+    ERotateIconActive               = 7,
+    EHelpIconActive                 = 8,
+    EInputMethodIconActive          = 9,
+    EToolbarIconActive              = 10,
+    EContactsIconActive            = 11
+    };
+
+#endif // RD_SCALABLE_UI_V2
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// RectFromLayout
+// Gets a rect by mapping the given component layout with the given parent
+// rect.
+// -----------------------------------------------------------------------------
+//
+#ifdef RD_SCALABLE_UI_V2
+TRect RectFromLayout( const TRect& aParent,
+    const TAknWindowComponentLayout& aComponentLayout )
+    {
+    TAknLayoutRect layoutRect;
+    layoutRect.LayoutRect( aParent, aComponentLayout.LayoutLine() );
+    return layoutRect.Rect();
+    }
+#endif // RD_SCALABLE_UI_V2
+
+// -----------------------------------------------------------------------------
+// Reads default touch pane content from the resources.
+// -----------------------------------------------------------------------------
+//
+#ifdef RD_SCALABLE_UI_V2
+TUint ReadDefaultTouchPaneContentL( RArray<TAknTouchPaneItem>& aItems )
+    {
+    TResourceReader reader;
+    CEikonEnv::Static()->CreateResourceReaderLC( reader, R_AKNPRIV_TOUCHPANE );
+    TUint flags = reader.ReadUint32();
+    
+    TAknTouchPaneItem item;
+    for ( TUint itemCount = reader.ReadInt16(); itemCount > 0; itemCount-- )
+        {
+        TUint version = reader.ReadUint8();
+        if ( version != 1 )
+            {
+            User::Leave( KErrNotSupported );
+            }
+
+        item.iPriority = reader.ReadUint8();
+        item.iId = reader.ReadUint8();
+        item.iPlugin = reader.ReadUint32();
+        aItems.AppendL( item );
+        }
+
+    CleanupStack::PopAndDestroy(); // reader
+    return flags;
+    };
+#endif // RD_SCALABLE_UI_V2
+
+// -----------------------------------------------------------------------------
+// Reads the given resource and modifies the given item set based on the
+// customizations specified in the resource.
+// -----------------------------------------------------------------------------
+//
+#ifdef RD_SCALABLE_UI_V2
+void ReadCustomTouchPaneContentL( TInt aResourceId,
+    RArray<TAknTouchPaneItem>& aItems, TBool aAllowCustomization )
+    {
+    TResourceReader reader;
+    CEikonEnv::Static()->CreateResourceReaderLC( reader, aResourceId );
+
+    // Check resource version.
+    const TUint version = reader.ReadUint8();
+    if ( version != 1 )
+        {
+        User::Leave( KErrNotSupported );
+        }
+
+    // Read application specific touch pane flags.
+    const TUint flags = reader.ReadUint32();
+
+    if ( flags & EAknNoTouchPane )
+        {
+        aItems.Reset();
+        }
+    else if ( aAllowCustomization && ( flags & EAknCustomTouchPane ) )
+        {
+        const TInt itemCount = reader.ReadInt16();
+        for ( TInt ii = itemCount; ii > 0; --ii )
+            {
+            // Read custom item.
+            const TInt version = reader.ReadInt8();
+            if ( version != 1 )
+                {
+                User::Leave( KErrNotSupported );
+                }
+            const TUint id = reader.ReadUint8();
+            const TUint plugin = reader.ReadUint32();
+
+            // Find optional item with lowest priority.
+            TInt optionalItemPriority = 0;
+            TInt optionalItemIndex = -1;
+            for ( TInt jj = aItems.Count() - 1; jj >= 0; --jj )
+                {
+                if ( aItems[jj].iPriority > optionalItemPriority )
+                    {
+                    optionalItemPriority = aItems[jj].iPriority;
+                    optionalItemIndex = jj;
+                    }
+                }
+
+            // Replace optional item.
+            if ( optionalItemIndex >= 0 )
+                {
+                aItems[optionalItemIndex].iPriority = -1;
+                aItems[optionalItemIndex].iId = id;
+                aItems[optionalItemIndex].iPlugin = plugin;
+                }
+            }
+        }
+
+    CleanupStack::PopAndDestroy(); // reader
+    return;
+    }
+#endif // RD_SCALABLE_UI_V2
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CAknTouchPane::CAknTouchPane
+// C++ default constructor.
+// -----------------------------------------------------------------------------
+//
+#ifdef RD_SCALABLE_UI_V2
+CAknTouchPane::CAknTouchPane()
+    : iAppUi( iAvkonAppUi ),
+      iUid( TUid::Null() )
+    {
+    __ASSERT_DEBUG( iAppUi, User::Invariant() );
+    SetMopParent( iAppUi );
+
+    CApaApplication* application = iAppUi->Application();
+    if ( application )
+        {
+        iUid = application->AppDllUid();
+        }
+
+    iFlags.Assign( ETouchPaneActive, iUid != KAknTouchPaneAutoLockAppUid );
+    }
+#endif // RD_SCALABLE_UI_V2
+
+// -----------------------------------------------------------------------------
+// CAknTouchPane::ConstructL
+// Symbian 2nd phase constructor.
+// -----------------------------------------------------------------------------
+//
+#ifdef RD_SCALABLE_UI_V2
+void CAknTouchPane::ConstructL( RArray<TAknTouchPaneItem>& aItems )
+    {
+    CreateWindowL();
+    Window().SetPointerGrab( ETrue );
+    Window().SetNonFading( ETrue );
+    Window().SetOrdinalPosition( 0, ECoeWinPriorityHigh );
+    SetFocusing( EFalse );
+
+    InitComponentArrayL();
+
+    CCoeControl* component = NULL;
+    for ( TInt ii = 0; ii < aItems.Count(); ++ii )
+        {
+        if ( aItems[ii].iId != ETouchPaneElementPlugin )
+            {
+            component = ConstructDefaultComponentL( aItems[ii].iId );
+            }
+        if ( component )
+            {
+            Components().AppendLC( component, KCoeNoControlId );
+            CleanupStack::Pop( component );
+            component = NULL;
+            }
+        }
+
+    iBgContext = CAknsBasicBackgroundControlContext::NewL(
+        KAknsIIDQsnBgScreen, TRect(), ETrue );
+
+    iFrameContext = CAknsFrameBackgroundControlContext::NewL(
+        KAknsIIDNone, TRect(), TRect(), ETrue );
+
+    // Touch pane is set visible only in touch layouts.
+    if ( AknLayoutUtils::PenEnabled() && Layout_Meta_Data::IsTouchPaneEnabled() )
+        {
+        SetWindowLayout();
+        CCoeControl::MakeVisible( ETrue );
+        }
+    else
+        {
+        CCoeControl::MakeVisible( EFalse );
+        }
+        
+    ActivateL();
+    }
+#endif // RD_SCALABLE_UI_V2
+
+// -----------------------------------------------------------------------------
+// CAknTouchPane::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+#ifdef RD_SCALABLE_UI_V2
+EXPORT_C CAknTouchPane* CAknTouchPane::NewL()
+    {
+    return CAknTouchPane::NewL( NULL );
+    }
+#else
+EXPORT_C CAknTouchPane* CAknTouchPane::NewL()
+    {
+    return NULL;
+    }
+#endif // RD_SCALABLE_UI_V2
+
+// -----------------------------------------------------------------------------
+// CAknTouchPane::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+#ifdef RD_SCALABLE_UI_V2
+EXPORT_C CAknTouchPane* CAknTouchPane::NewL( TInt aResourceId )
+    {
+    RArray<TAknTouchPaneItem> items;
+    CleanupClosePushL( items );
+
+    const TUint flags = ReadDefaultTouchPaneContentL( items );
+
+    if ( aResourceId )
+        {
+        ReadCustomTouchPaneContentL( aResourceId, items,
+            !( flags & EAknDisabeTouchPaneCustomizations ) );
+        }
+    else if ( !( flags & EAknConstructTouchPaneByDefault ) )
+        {
+        items.Reset();
+        }
+
+    CAknTouchPane* self = NULL;
+    if ( items.Count() )
+        {
+        self = new ( ELeave ) CAknTouchPane;
+        CleanupStack::PushL( self );
+        self->ConstructL( items );
+        CleanupStack::Pop( self );
+        }
+
+    CleanupStack::Pop( &items );
+    items.Close();
+    AKNTASHOOK_ADDL( self, "CAknTouchPane" );
+    return self;
+    }
+#else
+EXPORT_C CAknTouchPane* CAknTouchPane::NewL( TInt )
+    {
+    return NULL;
+    }
+#endif // RD_SCALABLE_UI_V2
+
+// -----------------------------------------------------------------------------
+// CAknTouchPane::~CAknTouchPane
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CAknTouchPane::~CAknTouchPane()
+    {
+    AKNTASHOOK_REMOVE();
+#ifdef RD_SCALABLE_UI_V2
+    DeregisterControlPositions();
+
+    if ( iAppUi )
+        {
+        iAppUi->RemoveFromStack( this );
+        iAppUi = NULL; // Not owned
+        }
+
+    // Although, these elements are owned by touch pane, they are deleted
+    // through component array.
+    iShellIcon = NULL;
+    iSwapperIcon = NULL;
+    iIdleViewIcon = NULL;
+    iDiallerIcon = NULL;
+    iRotateIcon = NULL;
+    iHelpIcon = NULL;
+    iInputMethodIcon = NULL;
+    iToolbarIcon = NULL;
+    iContactsIcon = NULL;
+
+    iObserver = NULL; // Not owned
+    delete iBgContext;
+    delete iFrameContext;
+#endif // RD_SCALABLE_UI_V2
+    }
+
+// -----------------------------------------------------------------------------
+// CAknTouchPane::ReduceRect
+// -----------------------------------------------------------------------------
+//
+#ifdef RD_SCALABLE_UI_V2
+EXPORT_C void CAknTouchPane::ReduceRect( TRect& aBoundingRect ) const
+    {
+    if ( !IsVisible() )
+        {
+        return;
+        }
+
+    TRect rect( Position(), Size() );
+
+    if ( rect.Intersects( aBoundingRect ) )
+        {
+        rect.Intersection( aBoundingRect );
+
+        if ( Layout_Meta_Data::IsLandscapeOrientation() )
+            {
+            aBoundingRect.iTl.iX = rect.iBr.iX;
+            }
+        else 
+            {
+            aBoundingRect.iTl.iY = rect.iBr.iY;
+            }
+        }
+    }
+#else
+EXPORT_C void CAknTouchPane::ReduceRect( TRect& ) const
+    {
+    }
+#endif // RD_SCALABLE_UI_V2
+
+// -----------------------------------------------------------------------------
+// CAknTouchPane::SetObserver
+// -----------------------------------------------------------------------------
+//
+#ifdef RD_SCALABLE_UI_V2
+EXPORT_C void CAknTouchPane::SetObserver( MAknTouchPaneObserver* aObserver )
+    {
+    iObserver = aObserver;
+    }
+#else
+EXPORT_C void CAknTouchPane::SetObserver( MAknTouchPaneObserver* )
+    {
+    }
+#endif // RD_SCALABLE_UI_V2
+
+// -----------------------------------------------------------------------------
+// CAknTouchPane::SetVisibilityMode
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAknTouchPane::SetVisibilityMode( TVisibilityMode aMode )
+    {
+#ifdef RD_SCALABLE_UI_V2
+    if ( aMode == EAutomaticVisibilityChanges )
+        {
+        iFlags.Clear( ENoAutomaticVisibilityChanges );
+        }
+    else if ( aMode == EManualVisibilityChanges )
+        {
+        iFlags.Set( ENoAutomaticVisibilityChanges );
+        }
+#else
+    (void)aMode;
+#endif // RD_SCALABLE_UI_V2
+    }
+
+// -----------------------------------------------------------------------------
+// CAknTouchPane::AllowInputMethodActivation
+// -----------------------------------------------------------------------------
+//
+#ifdef RD_SCALABLE_UI_V2
+EXPORT_C void CAknTouchPane::AllowInputMethodActivation( TBool aValue )
+    {
+    if ( iInputMethodIcon )
+        {
+        iFlags.Assign( EInputMethodIconActive, aValue );
+
+        // Icon dimming is updated only when touch pane is active.
+        if ( iFlags.IsSet( ETouchPaneActive ) )
+            {
+            iInputMethodIcon->SetDimmed( !aValue );
+            Window().Invalidate( iInputMethodIcon->Rect() );
+            }
+        }
+    }
+#else
+EXPORT_C void CAknTouchPane::AllowInputMethodActivation( TBool )
+    {
+    }
+#endif // RD_SCALABLE_UI_V2
+
+// -----------------------------------------------------------------------------
+// CAknTouchPane::SetInputMethodIconActivated
+// -----------------------------------------------------------------------------
+//
+#ifdef RD_SCALABLE_UI_V2
+EXPORT_C void CAknTouchPane::SetInputMethodIconActivated( TBool aActivated )
+    {
+    if ( iInputMethodIcon )
+        {
+        iInputMethodIcon->SetCurrentState( aActivated ? 1 : 0, 
+            !iInputMethodIcon->IsDimmed() );
+        }
+    }
+#else
+EXPORT_C void CAknTouchPane::SetInputMethodIconActivated( TBool )
+    {
+    }
+#endif // RD_SCALABLE_UI_V2
+
+// -----------------------------------------------------------------------------
+// CAknTouchPane::RefreshL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAknTouchPane::RefreshL()
+    {
+#ifdef RD_SCALABLE_UI_V2
+    if ( iHelpIcon && iUid != KAknTouchPaneHelpAppUid )
+        {
+        CArrayFix<TCoeHelpContext>* help = iAppUi->AppHelpContextL();
+        TBool helpActive = help && help->Count();
+        iFlags.Assign( EHelpIconActive, helpActive );
+        delete help; help = NULL;
+        }
+
+    if ( iRotateIcon )
+        {
+        if ( iAppUi->Orientation() == CAknAppUiBase::EAppUiOrientationUnspecified )
+            {
+            iFlags.Set( ERotateIconActive );
+            }
+        else 
+            {
+            iFlags.Clear( ERotateIconActive );
+            }
+        }
+
+    if ( iToolbarIcon )
+        {
+        CAknToolbar* toolbar = iAppUi->CurrentPopupToolbar();
+        if ( toolbar && !toolbar->IsToolbarDisabled() )
+            {
+            iFlags.Set( EToolbarIconActive );
+            TInt nextState = toolbar->IsShown() ? 1 : 0;
+            if ( nextState != iToolbarIcon->StateIndex() )
+                {
+                iToolbarIcon->SetCurrentState( nextState, EFalse );
+                Window().Invalidate( iToolbarIcon->Rect() );
+                }
+            }
+        else
+            {
+            iFlags.Clear( EToolbarIconActive );
+            }
+        }
+
+    // Updates the dimming of buttons.
+    DoRefresh();
+#endif // RD_SCALABLE_UI_V2
+    }
+
+// -----------------------------------------------------------------------------
+// CAknTouchPane::SetFepPenSupportInterface
+// -----------------------------------------------------------------------------
+//
+#ifdef RD_SCALABLE_UI_V2
+EXPORT_C void CAknTouchPane::SetFepPenSupportInterface(
+    MAknFepPenSupportInterface* aFepPenSupportInterface )
+    {
+    iFepPenSupportInterface = aFepPenSupportInterface;
+    }
+#else
+EXPORT_C void CAknTouchPane::SetFepPenSupportInterface(
+    MAknFepPenSupportInterface* )
+    {
+    }
+#endif // RD_SCALABLE_UI_V2
+
+// -----------------------------------------------------------------------------
+// CAknTouchPane::HandleStatusPaneSizeChange
+// -----------------------------------------------------------------------------
+//
+#ifdef RD_SCALABLE_UI_V2
+void CAknTouchPane::HandleStatusPaneSizeChange( TInt aInitialResourceId,
+    TInt aLastRequestedResourceId )
+    {
+    if ( !iFlags.IsSet( ENoAutomaticVisibilityChanges ) )
+        {
+        TInt resourceId = aLastRequestedResourceId ?
+            aLastRequestedResourceId : aInitialResourceId;
+
+        __ASSERT_DEBUG( iAvkonAppUi->StatusPane(), User::Invariant() );
+        TBool visible = iAvkonAppUi->StatusPane()->IsVisible();
+        if ( visible )
+            {
+            visible = AknStatuspaneUtils::TouchPaneCompatibleLayoutActive() &&
+                !( AknStatuspaneUtils::StaconPaneActive() &&
+                    resourceId == R_AVKON_STATUS_PANE_LAYOUT_EMPTY );
+            }
+        MakeVisible( visible );
+        }
+    }
+#endif // RD_SCALABLE_UI_V2
+
+// -----------------------------------------------------------------------------
+// CAknTouchPane::CountComponentControls
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CAknTouchPane::CountComponentControls() const
+    {
+#ifdef RD_SCALABLE_UI_V2
+    return CCoeControl::CountComponentControls();
+#else
+    return NULL;
+#endif // RD_SCALABLE_UI_V2
+    }
+
+// -----------------------------------------------------------------------------
+// CAknTouchPane::ComponentControl
+// -----------------------------------------------------------------------------
+//
+#ifdef RD_SCALABLE_UI_V2
+EXPORT_C CCoeControl* CAknTouchPane::ComponentControl( TInt aIndex ) const
+    {
+    __ASSERT_DEBUG(aIndex >= 0, Panic(EEikPanicInvalidIndex));
+    __ASSERT_DEBUG(aIndex < Components().Count(), Panic(EEikPanicInvalidIndex));
+
+    return CCoeControl::ComponentControl( aIndex );
+    }
+#else
+EXPORT_C CCoeControl* CAknTouchPane::ComponentControl( TInt ) const
+    {
+    return NULL;
+    }
+#endif // RD_SCALABLE_UI_V2
+
+// -----------------------------------------------------------------------------
+// CAknTouchPane::Draw
+// -----------------------------------------------------------------------------
+//
+#ifdef RD_SCALABLE_UI_V2
+EXPORT_C void CAknTouchPane::Draw( CWindowGc& aGc, 
+    const CCoeControl& /*aControl*/, const TRect& aRect ) const
+    {
+    MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+    MAknsControlContext* cc = AknsDrawUtils::ControlContext( this );
+    
+    if ( !cc )
+        {
+        iFrameContext->SetParentContext( iBgContext );
+        }
+    else
+        {
+        iFrameContext->SetParentContext( cc );
+        }
+    
+    if ( !AknsDrawUtils::DrawBackground( skin, iFrameContext, this, aGc,
+            aRect.iTl, aRect, KAknsDrawParamNoClearUnderImage ) )
+        {
+        aGc.SetBrushColor( KRgbRed );
+        aGc.SetBrushStyle( CGraphicsContext::ESolidBrush );
+        aGc.SetClippingRect( aRect );
+        aGc.DrawRect( Rect() );
+        }
+    }
+#else
+EXPORT_C void CAknTouchPane::Draw( CWindowGc&, const CCoeControl&,
+    const TRect& ) const
+    {
+    }
+#endif // RD_SCALABLE_UI_V2
+
+// -----------------------------------------------------------------------------
+// CAknTouchPane::HandleControlEventL
+// -----------------------------------------------------------------------------
+//
+#ifdef RD_SCALABLE_UI_V2
+EXPORT_C void CAknTouchPane::HandleControlEventL( CCoeControl* aControl,
+    TCoeEvent aEventType )
+    {
+    if ( aControl && ( aEventType == EEventStateChanged ) )
+        {
+        if ( aControl == iShellIcon )
+            {
+            if ( iUid != KAknApplicationShellViewId.iAppUid )
+                {                
+                ActivateApplicationShellL();
+                }
+            else
+                {
+                ActivateIdleViewL();
+                }
+            }
+        else if ( aControl == iSwapperIcon )
+            {
+            ActivateFastSwapL();
+            }
+        else if ( aControl == iIdleViewIcon )
+            {
+            ActivateIdleViewL();
+            }
+        else if ( aControl == iDiallerIcon )
+            {
+            ActivateDiallerL( iUid != KAknTouchPaneDiallerAppUid );
+            }
+        else if ( aControl == iRotateIcon )
+            {
+            RotateScreenL();
+            }
+        else if ( aControl == iHelpIcon )
+            {
+            ActivateHelpL( iUid != KAknTouchPaneHelpAppUid );
+            }
+        else if ( aControl == iInputMethodIcon )
+            {
+            ActivateStylusInputL( iInputMethodIcon->StateIndex() == 1 );
+            }
+        else if ( aControl == iToolbarIcon )
+            {
+            ActivateToolbarL( iToolbarIcon->StateIndex() == 1 );
+            }
+        else if ( aControl == iContactsIcon )
+            {
+            ActivateContactsL( iUid != KAknTouchPaneContactsAppUid );
+            }
+
+        // Update the toolbar button state, if current toolbar notifies of a
+        // change in its state
+        else if ( aControl == iAppUi->CurrentPopupToolbar() && 
+                  iToolbarIcon )
+            {
+            CAknToolbar* toolbar = iAppUi->CurrentPopupToolbar();
+            iToolbarIcon->SetDimmed( EFalse );
+            iFlags.Set( EToolbarIconActive );
+            iToolbarIcon->SetCurrentState( toolbar->IsShown() ? 1 : 0, ETrue );
+            }
+        }
+
+    else if ( aControl && ( aEventType == CAknButton::ELongPressEvent ) )
+        {
+        if ( aControl == iShellIcon || aControl == iSwapperIcon )
+            {
+            ActivateFastSwapL();
+            }
+        }
+
+    else if ( aControl && ( aEventType == KDisableToolbar ) )
+        {
+        CAknToolbar* toolbar = iAppUi->CurrentPopupToolbar(); 
+        if ( aControl == toolbar && iToolbarIcon )
+            {
+            iToolbarIcon->SetDimmed( ETrue );
+            iFlags.Clear( EToolbarIconActive );
+            }
+        Window().Invalidate( iToolbarIcon->Rect() );
+        }
+    else if ( aControl && ( aEventType == KEnableToolbar ) )
+        {
+        CAknToolbar* toolbar = iAppUi->CurrentPopupToolbar(); 
+        if ( aControl == toolbar && iToolbarIcon )
+            {
+            iToolbarIcon->SetDimmed( EFalse );
+            iFlags.Set( EToolbarIconActive );
+            }
+        Window().Invalidate( iToolbarIcon->Rect() );
+        }
+    }
+#else
+EXPORT_C void CAknTouchPane::HandleControlEventL( CCoeControl*, TCoeEvent )
+    {
+    }
+#endif // RD_SCALABLE_UI_V2
+
+// -----------------------------------------------------------------------------
+// CAknTouchPane::HandleResourceChange
+// -----------------------------------------------------------------------------
+//
+#ifdef RD_SCALABLE_UI_V2
+EXPORT_C void CAknTouchPane::HandleResourceChange( TInt aType )
+    {
+    CCoeControl::HandleResourceChange( aType );
+
+    if ( aType == KEikDynamicLayoutVariantSwitch )
+        {
+        if ( AknLayoutUtils::PenEnabled() && Layout_Meta_Data::IsTouchPaneEnabled() )
+            {
+            SetWindowLayout();
+            }
+        else
+            {
+            CCoeControl::MakeVisible( EFalse );
+            }
+        }
+    }
+#else
+EXPORT_C void CAknTouchPane::HandleResourceChange( TInt )
+    {
+    }
+#endif // RD_SCALABLE_UI_V2
+
+// -----------------------------------------------------------------------------
+// CAknTouchPane::MakeVisible
+// -----------------------------------------------------------------------------
+//
+#ifdef RD_SCALABLE_UI_V2
+EXPORT_C void CAknTouchPane::MakeVisible( TBool aVisible )
+    {
+    if ( ( !aVisible || AknLayoutUtils::PenEnabled() ) && 
+        ( aVisible != IsVisible() ) && Layout_Meta_Data::IsTouchPaneEnabled() )
+        {
+        CCoeControl::MakeVisible( aVisible );
+        ReportSizeChange();
+        }
+    }
+#else
+EXPORT_C void CAknTouchPane::MakeVisible( TBool )
+    {
+    }
+#endif // RD_SCALABLE_UI_V2
+
+// -----------------------------------------------------------------------------
+// CAknTouchPane::OfferKeyEventL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TKeyResponse CAknTouchPane::OfferKeyEventL(
+    const TKeyEvent& /*aKeyEvent*/, TEventCode /*aType*/ )
+    {
+    return EKeyWasNotConsumed;
+    }
+
+// -----------------------------------------------------------------------------
+// Handles window server events.
+// -----------------------------------------------------------------------------
+//
+void CAknTouchPane::HandleWsEventL( const TWsEvent& aEvent,
+    CCoeControl* /*aDestination*/ )
+    {
+#ifdef RD_SCALABLE_UI_V2
+    TInt eventType = aEvent.Type();
+    if ( eventType == EEventFocusLost )
+        {
+        iFlags.Clear( EHasForeground );
+        DoRefresh();
+        }
+    else if ( eventType == EEventFocusGained )
+        {
+        iFlags.Set( EHasForeground );
+        DoRefresh();
+        }
+#else
+    (void) aEvent;
+#endif // RD_SCALABLE_UI_V2
+    }
+
+// -----------------------------------------------------------------------------
+// CAknTouchPane::HandlePointerEventL
+// When application is displaying menu or dialog, this method ignores pointer
+// events on other than application shell, application swapper, and idle view
+// icons.
+// -----------------------------------------------------------------------------
+//
+#ifdef RD_SCALABLE_UI_V2
+EXPORT_C void CAknTouchPane::HandlePointerEventL(
+    const TPointerEvent& aPointerEvent )
+    {
+    TPoint position = aPointerEvent.iPosition;
+    TBool isDisplayingMenu = EFalse;
+    CEikMenuBar* menuBar = NULL;
+
+    TVwsViewId viewId;
+    TInt err = iAppUi->GetActiveViewId( viewId );
+    if ( err == KErrNone && viewId.iAppUid != viewId.iViewUid )
+        {
+        // Application has active view
+        CAknView* view = iAvkonViewAppUi->View( viewId.iViewUid );
+        if ( view )
+            {
+            //menuBar = view->MenuBar();
+            menuBar = view->CAknView::MenuBar();
+            }
+        }
+    else
+        {
+        menuBar = iEikonEnv->AppUiFactory()->MenuBar();
+        }
+
+    if ( menuBar )
+        {
+        isDisplayingMenu = menuBar->IsDisplayed();
+        }
+
+    // Close menu on button up event
+    if ( isDisplayingMenu && Rect().Contains( position ) && 
+         aPointerEvent.iType == TPointerEvent::EButton1Up )
+        {
+        menuBar->StopDisplayingMenuBar(); //lint !e613
+        }
+
+    if ( !isDisplayingMenu ||
+         ( iShellIcon && iShellIcon->Rect().Contains( position ) ) ||
+         ( iSwapperIcon && iSwapperIcon->Rect().Contains( position ) ) ||
+         ( iIdleViewIcon && iIdleViewIcon->Rect().Contains( position ) ) )
+        {
+        CCoeControl::HandlePointerEventL( aPointerEvent );
+        }
+    }
+#else
+EXPORT_C void CAknTouchPane::HandlePointerEventL( const TPointerEvent& )
+    {
+    }
+#endif // RD_SCALABLE_UI_V2
+
+// -----------------------------------------------------------------------------
+// CAknTouchPane::PositionChanged
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAknTouchPane::PositionChanged()
+    {
+#ifdef RD_SCALABLE_UI_V2
+    RegisterControlPositions();
+#endif // RD_SCALABLE_UI_V2
+    }
+
+// -----------------------------------------------------------------------------
+// CAknTouchPane::SizeChanged
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAknTouchPane::SizeChanged()
+    {
+#ifdef RD_SCALABLE_UI_V2
+    // Update frame and background control contexts
+    if ( Layout_Meta_Data::IsLandscapeOrientation() )
+        {
+        iFrameContext->SetFrame( KAknsIIDQgnGrafBgTouchVertical );
+        }
+    else
+        {
+        iFrameContext->SetFrame( KAknsIIDQgnGrafBgTouchHorizontal );
+        }
+    iFrameContext->SetFrameRects( Rect(), TRect() );
+    iFrameContext->SetParentPos( Position() );
+
+    iBgContext->SetParentPos( iAvkonAppUi->ApplicationRect().iTl );
+    iBgContext->SetRect( iAvkonAppUi->ApplicationRect() );
+
+    TInt gridVariety = Layout_Meta_Data::IsLandscapeOrientation() ? 1 : 0;
+
+    TInt cellVariety = Layout_Meta_Data::IsLandscapeOrientation() ? 1 : 0;
+    if ( Components().Count() < 4 )
+        {
+        if ( Components().Count() == 3 )
+            {
+            cellVariety += 2;
+            }
+        else
+            {
+            cellVariety += 4;
+            }
+        }
+
+    TRect gridRect = RectFromLayout( Rect(),
+        AknLayoutScalable_Avkon::grid_touch_3_pane( gridVariety ) );
+
+    TAknLayoutScalableParameterLimits limits =
+        AknLayoutScalable_Avkon::cell_touch_3_pane_ParamLimits( cellVariety );
+
+    const TInt gridSize = ( ( limits.LastRow() - limits.FirstRow() ) + 1 ) *
+        ( ( limits.LastColumn() - limits.FirstColumn() ) + 1 );
+
+    const TInt maxItemCount = Min( gridSize, Components().Count() );
+
+    TInt row = 0;
+    TInt col = 0;
+    TInt index = 0;
+    TRect cellRect;
+    for ( row = limits.FirstRow(); row <= limits.LastRow(); ++row )
+        {
+        for ( col = limits.FirstColumn(); col <= limits.LastColumn(); ++col )
+            {
+            if ( index < maxItemCount )
+                {
+                cellRect = RectFromLayout( gridRect, AknLayoutScalable_Avkon::
+                    cell_touch_3_pane( cellVariety, col, row ) );
+                Components().At( index ).iControl->SetRect( cellRect );
+                ++index;
+                }
+            }
+        }
+
+    // Set empty rect for controls that should not be visible (no layout data)
+    TInt count = CountComponentControls();
+    for ( TInt ii = maxItemCount; ii < count; ++ii )
+        {
+        Components().At( ii ).iControl->SetRect( TRect() );
+        }
+
+    // Set the tooltip positions. Code assumes that touch pane is always
+    // horizontal in portrait mode and vertical in landscape mode.
+    CAknButton::TTooltipPosition tooltipPosition;
+    if ( Layout_Meta_Data::IsLandscapeOrientation() )
+        {
+        if ( Position().iX > iAppUi->ClientRect().Center().iX )
+            {
+            tooltipPosition = CAknButton::EPositionLeft;
+            }
+        else
+            {
+            tooltipPosition = CAknButton::EPositionRight;
+            }
+        }
+    else
+        {
+        if ( Position().iY > iAppUi->ClientRect().Center().iY )
+            {
+            tooltipPosition = CAknButton::EPositionTop;
+            }
+        else
+            {
+            tooltipPosition = CAknButton::EPositionBottom;
+            }
+        }
+
+    for ( TInt ii = 0; ii < maxItemCount; ++ii )
+        {
+        // This assumes that every control in touch pane is button
+        CAknButton* button =  
+            static_cast<CAknButton*>( Components().At( ii ).iControl );
+        button->SetTooltipPosition( tooltipPosition );
+        
+        // recalculate icon size
+        TRect sizeRect = RectFromLayout( cellRect, 
+            AknLayoutScalable_Avkon::cell_touch_3_pane_g2() );
+        button->SetIconSize( sizeRect.Size() );
+        
+        // recalculate margins
+        TRect graphicsRect = RectFromLayout( cellRect, 
+            AknLayoutScalable_Avkon::cell_touch_3_pane_g1() );
+        graphicsRect.BoundingRect( sizeRect );
+        
+        TMargins8 margins;
+        margins.iTop = sizeRect.iTl.iY - graphicsRect.iTl.iY;
+        margins.iBottom = graphicsRect.iBr.iY - sizeRect.iBr.iY;
+        margins.iLeft = sizeRect.iTl.iX - graphicsRect.iTl.iX;
+        margins.iRight = graphicsRect.iBr.iX - sizeRect.iBr.iX;
+        
+        button->SetMargins( margins );
+        }
+
+    RegisterControlPositions();
+    ReportSizeChange();
+#endif // RD_SCALABLE_UI_V2
+    }
+
+// -----------------------------------------------------------------------------
+// CAknTouchPane::ActivateApplicationShellL
+// -----------------------------------------------------------------------------
+//
+#ifdef RD_SCALABLE_UI_V2
+void CAknTouchPane::ActivateApplicationShellL()
+    {
+    TVwsViewId shellView = KAknApplicationShellViewId;
+    iAppUi->CreateActivateViewEventL( shellView, TUid::Uid(1), KNullDesC8() );
+    }
+#endif // RD_SCALABLE_UI_V2
+
+// -----------------------------------------------------------------------------
+// CAknTouchPane::ActivateFastSwapL
+// -----------------------------------------------------------------------------
+//
+#ifdef RD_SCALABLE_UI_V2
+void CAknTouchPane::ActivateFastSwapL() const
+    {
+    RAknUiServer* uiServer = CAknSgcClient::AknSrv();
+    uiServer->MakeTaskListVisible( ETrue );
+    }
+#endif // RD_SCALABLE_UI_V2
+
+// -----------------------------------------------------------------------------
+// CAknTouchPane::ActivateIdleViewL
+// -----------------------------------------------------------------------------
+//
+#ifdef RD_SCALABLE_UI_V2
+void CAknTouchPane::ActivateIdleViewL() const
+    {
+    TVwsViewId idleView;
+    RAknUiServer* uiServer = CAknSgcClient::AknSrv();
+    TInt error = uiServer->GetPhoneIdleViewId( idleView );
+    if ( !error && iUid != idleView.iAppUid )
+        {
+        iAppUi->CreateActivateViewEventL( idleView, KNullUid, KNullDesC8() );
+        }
+    }
+#endif // RD_SCALABLE_UI_V2
+
+// -----------------------------------------------------------------------------
+// CAknTouchPane::RotateScreenL
+// -----------------------------------------------------------------------------
+//
+#ifdef RD_SCALABLE_UI_V2
+void CAknTouchPane::RotateScreenL() const
+    {
+    RAknUiServer* uiServer = CAknSgcClient::AknSrv();
+    User::LeaveIfError( uiServer->RotateScreen() );
+    }
+#endif // RD_SCALABLE_UI_V2
+
+// -----------------------------------------------------------------------------
+// CAknTouchPane::ActivateStylusInputL
+// -----------------------------------------------------------------------------
+//
+#ifdef RD_SCALABLE_UI_V2
+void CAknTouchPane::ActivateStylusInputL( TBool aActivate ) const
+    {
+    if( iFepPenSupportInterface != NULL)
+        {
+        if ( aActivate )
+            {
+            iFepPenSupportInterface->ActivatePenInputL();
+            }
+        else
+            {
+            iFepPenSupportInterface->DeactivatePenInputL();
+            }
+        }
+    }
+#endif // RD_SCALABLE_UI_V2
+
+// -----------------------------------------------------------------------------
+// CAknTouchPane::ActivateToolbarL
+// -----------------------------------------------------------------------------
+//
+#ifdef RD_SCALABLE_UI_V2
+void CAknTouchPane::ActivateToolbarL( TBool aActivate ) const
+    {
+    CAknToolbar* toolbar = iAppUi->CurrentPopupToolbar();
+    if ( toolbar )
+        {
+        // Toolbar transition effects integration.
+        // This code just does the registration part, and sets the demarcation
+        // rect, as that comes from the icon in the touchpane, which is only
+        // available here.  For toolbar animations where the touchpane aren't
+        // involved, registering etc. is done in AknToolbar.cpp.
+        TRect iconRect( iToolbarIcon->Position(),
+                        iToolbarIcon->Position() + iToolbarIcon->Size() );
+
+        if ( CTouchToolbarData::SetData( toolbar, iconRect, ETrue ) ==
+             KErrNone )
+            {
+            GfxTransEffect::Register( toolbar, KGfxTouchToolbarControlUid,
+                                      EFalse );
+            GfxTransEffect::Enable();
+            CTouchToolbarData* ttb = CTouchToolbarData::GetData( toolbar );
+            if( ttb )
+                {
+                ttb->SetBetweenRegisterAndBegin( ETrue );    
+                }
+            
+            }
+        toolbar->SetToolbarVisibility( aActivate, EFalse );
+        }
+    }
+#endif // RD_SCALABLE_UI_V2
+
+// -----------------------------------------------------------------------------
+// CAknTouchPane::ActivateHelpL
+// -----------------------------------------------------------------------------
+//
+#ifdef RD_SCALABLE_UI_V2
+void CAknTouchPane::ActivateHelpL( TBool aActivate )
+    {
+    if ( aActivate )
+        {
+        CArrayFix<TCoeHelpContext>* help = iAppUi->AppHelpContextL();
+        if ( help )
+            {
+            CleanupStack::PushL( help );
+            HlpLauncher::LaunchHelpApplicationL( iEikonEnv->WsSession(), help );
+            CleanupStack::Pop( help );
+            }
+        }
+    else
+        {
+        iAppUi->HandleCommandL( EEikCmdExit );
+        }
+    }
+#endif // RD_SCALABLE_UI_V2
+
+// -----------------------------------------------------------------------------
+// CAknTouchPane::ActivateDiallerL
+// -----------------------------------------------------------------------------
+//
+#ifdef RD_SCALABLE_UI_V2
+void CAknTouchPane::ActivateDiallerL( TBool aActivate )
+    {
+    if ( aActivate )
+        {
+        TVwsViewId diallerView( KAknTouchPaneDiallerAppUid,
+            KAknTouchPaneDiallerViewUid );
+        iAppUi->CreateActivateViewEventL( diallerView,
+            KTouchPaneDiallerVievCommand, KNullDesC8() );
+        }
+    else
+        {
+        iAppUi->HandleCommandL( EAknCmdExit );
+        }
+    }
+#endif // RD_SCALABLE_UI_V2
+
+// -----------------------------------------------------------------------------
+// CAknTouchPane::ActivateContactsL
+// -----------------------------------------------------------------------------
+//
+#ifdef RD_SCALABLE_UI_V2
+void CAknTouchPane::ActivateContactsL( TBool aActivate )
+    {
+    if ( aActivate )
+        {
+        TVwsViewId contactsView( KAknTouchPaneContactsAppUid,
+            KAknTouchPaneContactsViewUid );
+        iAppUi->CreateActivateViewEventL( contactsView, TUid::Null(),
+            KNullDesC8() );
+        }
+    else
+        {
+        iAppUi->HandleCommandL( EAknCmdExit );
+        }
+    }
+#endif // RD_SCALABLE_UI_V2
+
+// -----------------------------------------------------------------------------
+// CAknTouchPane::ConstructDefaultComponentL
+// -----------------------------------------------------------------------------
+//
+#ifdef RD_SCALABLE_UI_V2
+CAknButton* CAknTouchPane::ConstructDefaultComponentL( TInt aId )
+    {
+    CAknButton* element = NULL;
+    HBufC* tooltip = NULL;
+    HBufC* helpText = NULL;
+
+    switch ( aId )
+        {
+        case ETouchPaneElementNone:
+            {
+            // Creates an empty button
+            element = CAknButton::NewLC();
+            element->AddStateL( NULL, NULL, NULL, NULL, KNullDesC(),
+                                KNullDesC(), NULL );
+            element->SetDimmed( ETrue );
+            break;
+            }
+        case ETouchPaneElementAppsGrid:
+            {
+            if ( !iShellIcon )
+                {
+                tooltip = StringLoader::LoadLC( R_QTN_GEN_APP_SHELL_TOOLTIP );
+                element = CAknButton::NewLC(
+                    AknIconUtils::AvkonIconFileName(),
+                    EMbmAvkonQgn_indi_tp_appsgrid,
+	                EMbmAvkonQgn_indi_tp_appsgrid_mask,
+                    -1, -1, -1, -1, -1, -1,
+                    KNullDesC, *tooltip, KAknButtonReportOnLongPress, NULL,
+                    KAknsIIDQgnIndiTpAppsgrid );
+                iShellIcon = element;
+                CleanupStack::Pop( element );
+                CleanupStack::Pop( tooltip );
+                CleanupStack::PushL( element ); // will not leave
+                iFlags.Set( EShellIconActive );
+                }
+            break;
+            }
+        case ETouchPaneElementAppSwapper:
+            {
+            if ( !iSwapperIcon )
+                {
+                tooltip = StringLoader::LoadLC( R_QTN_GEN_FAST_SWAPPER_TOOLTIP );
+                element = CAknButton::NewLC(
+                    AknIconUtils::AvkonIconFileName(),
+                    EMbmAvkonQgn_indi_tp_appswapper,
+                    EMbmAvkonQgn_indi_tp_appswapper_mask,
+                    -1, -1, -1, -1, -1, -1,
+                    KNullDesC, *tooltip, KAknButtonReportOnLongPress, NULL,
+                    KAknsIIDQgnIndiTpAppswapper );
+                iSwapperIcon = element;
+                CleanupStack::Pop( element );
+                CleanupStack::Pop( tooltip );
+                CleanupStack::PushL( element ); // will not leave
+                iFlags.Set( ESwapperIconActive );
+                }
+            break;
+            }
+        case ETouchPaneElementIdle:
+            {
+            if ( !iIdleViewIcon )
+                {
+                tooltip = StringLoader::LoadLC( R_QTN_GEN_IDLE_VIEW_TOOLTIP );
+                element = CAknButton::NewLC(
+                    AknIconUtils::AvkonIconFileName(),
+                    EMbmAvkonQgn_indi_tp_idle,
+                    EMbmAvkonQgn_indi_tp_idle_mask,
+                    -1, -1, -1, -1, -1, -1,
+                    KNullDesC, *tooltip, NULL, NULL,
+                    KAknsIIDQgnIndiTpIdle );
+                iIdleViewIcon = element;
+                CleanupStack::Pop( element );
+                CleanupStack::Pop( tooltip );
+                CleanupStack::PushL( element ); // will not leave
+                iFlags.Set( EIdleViewIconActive );
+                }
+            break;
+            }
+        case ETouchPaneElementInput:
+            {
+            if ( !iInputMethodIcon )
+                {
+                tooltip = StringLoader::LoadLC( 
+                    R_QTN_GEN_INPUT_ACTIVATION_TOOLTIP );
+                helpText = StringLoader::LoadLC( 
+                    R_QTN_GEN_INFO_POP_UP_DIMMED_ITEM, *tooltip );
+                element = CAknButton::NewLC(
+                    AknIconUtils::AvkonIconFileName(),
+                    EMbmAvkonQgn_indi_tp_input,
+                    EMbmAvkonQgn_indi_tp_input_mask,
+                    -1, -1, -1, -1, -1, -1,
+                    KNullDesC, *tooltip, NULL, NULL,
+                    KAknsIIDQgnIndiTpInput );
+                element->AddStateL(
+                    AknIconUtils::AvkonIconFileName(),
+                    EMbmAvkonQgn_indi_tp_input,
+                    EMbmAvkonQgn_indi_tp_input_mask,
+                    -1, -1, -1, -1, -1, -1,
+                    KNullDesC, *tooltip, KAknButtonStateHasLatchedFrame,
+                    KAknsIIDQgnIndiTpInput, KAknsIIDNone,
+                    KAknsIIDNone, KAknsIIDNone );
+                element->SetDimmed( ETrue );
+                element->SetDimmedHelpTextL( *helpText );
+                iInputMethodIcon = element;
+                CleanupStack::Pop( element );
+                CleanupStack::Pop( helpText );
+                CleanupStack::Pop( tooltip );
+                CleanupStack::PushL( element ); // will not leave
+                iFlags.Clear( EInputMethodIconActive );
+                }
+            break;
+            }
+        case ETouchPaneElementRotateScreen:
+            {
+            if ( !iRotateIcon )
+                {
+                tooltip = StringLoader::LoadLC( 
+                    R_QTN_GEN_ROTATE_ICON_TOOLTIP );
+                element = CAknButton::NewLC(
+                    AknIconUtils::AvkonIconFileName(),
+                    EMbmAvkonQgn_indi_tp_rotate_screen,
+                    EMbmAvkonQgn_indi_tp_rotate_screen_mask,
+                    -1, -1, -1, -1, -1, -1,
+                    KNullDesC, *tooltip, NULL, NULL,
+                    KAknsIIDQgnIndiTpRotateScreen );
+                iRotateIcon = element;
+                CleanupStack::Pop( element );
+                CleanupStack::Pop( tooltip );
+                CleanupStack::PushL( element ); // will not leave
+                iFlags.Set( ERotateIconActive );
+                }
+            break;
+            }
+        case ETouchPaneElementToolbar:
+            {
+            if ( !iToolbarIcon )
+                {
+                tooltip = StringLoader::LoadLC( 
+                    R_QTN_GEN_TOOLBAR_ICON_TOOLTIP );
+                helpText = StringLoader::LoadLC( 
+                    R_QTN_GEN_INFO_POP_UP_DIMMED_ITEM, *tooltip );
+                element = CAknButton::NewLC(
+                    AknIconUtils::AvkonIconFileName(),
+                    EMbmAvkonQgn_indi_tp_toolbar,
+                    EMbmAvkonQgn_indi_tp_toolbar_mask,
+                    -1, -1, -1, -1, -1, -1,
+                    KNullDesC, *tooltip, NULL, NULL,
+                    KAknsIIDQgnIndiTpToolbar );
+                element->AddStateL(
+                    AknIconUtils::AvkonIconFileName(),
+                    EMbmAvkonQgn_indi_tp_toolbar,
+                    EMbmAvkonQgn_indi_tp_toolbar_mask,
+                    -1, -1, -1, -1, -1, -1,
+                    KNullDesC, *tooltip, KAknButtonStateHasLatchedFrame,
+                    KAknsIIDQgnIndiTpToolbar, KAknsIIDNone,
+                    KAknsIIDNone, KAknsIIDNone );
+                element->SetDimmed( ETrue );
+                element->SetDimmedHelpTextL( *helpText );
+                iToolbarIcon = element;
+                CleanupStack::Pop( element );
+                CleanupStack::Pop( helpText );
+                CleanupStack::Pop( tooltip );
+                CleanupStack::PushL( element ); // will not leave
+                iFlags.Clear( EToolbarIconActive );
+                }
+            break;
+            }
+        case ETouchPaneElementHelp:
+            {
+            if ( !iHelpIcon )
+                {
+                TInt stateFlags = ( iUid == KAknTouchPaneHelpAppUid ) ?
+                    KAknButtonStateHasLatchedFrame : NULL;
+                tooltip = StringLoader::LoadLC( R_QTN_GEN_HELP_TOOLTIP );
+                helpText = StringLoader::LoadLC( 
+                    R_QTN_GEN_INFO_POP_UP_DIMMED_ITEM, *tooltip );
+                element = CAknButton::NewLC(
+                    AknIconUtils::AvkonIconFileName(),
+                    EMbmAvkonQgn_indi_tp_help,
+                    EMbmAvkonQgn_indi_tp_help_mask,
+                    -1, -1, -1, -1, -1, -1,
+                    KNullDesC, *tooltip, NULL, stateFlags,
+                    KAknsIIDQgnIndiTpHelp );
+                element->SetDimmedHelpTextL( *helpText );
+                iHelpIcon = element;
+                CleanupStack::Pop( element );
+                CleanupStack::Pop( helpText );
+                CleanupStack::Pop( tooltip );
+                CleanupStack::PushL( element ); // will not leave
+                iFlags.Set( EHelpIconActive );
+                }
+            break;
+            }
+        case ETouchPaneElementDialler:
+            {
+            if ( !iDiallerIcon )
+                {
+                tooltip = StringLoader::LoadLC( 
+                    R_QTN_GEN_DIALLER_ICON_TOOLTIP );
+                element = CAknButton::NewLC( 
+                    AknIconUtils::AvkonIconFileName(),
+                    EMbmAvkonQgn_indi_tp_dialler,
+                    EMbmAvkonQgn_indi_tp_dialler_mask,
+                    -1, -1, -1, -1, -1, -1,
+                    KNullDesC, *tooltip, NULL, NULL,
+                    KAknsIIDQgnIndiTpDialler );
+                element->AddStateL(
+                    AknIconUtils::AvkonIconFileName(),
+                    EMbmAvkonQgn_indi_tp_dialler,
+                    EMbmAvkonQgn_indi_tp_dialler_mask,
+                    -1, -1, -1, -1, -1, -1,
+                    KNullDesC, *tooltip, KAknButtonStateHasLatchedFrame,
+                    KAknsIIDQgnIndiTpDialler, KAknsIIDNone,
+                    KAknsIIDNone, KAknsIIDNone );
+                iDiallerIcon = element;
+                CleanupStack::Pop( element );
+                CleanupStack::Pop( tooltip );
+                CleanupStack::PushL( element ); // will not leave
+                iFlags.Set( EDiallerIconActive );
+                }
+            break;
+            }
+        case ETouchPaneElementContacts:
+            {
+            if ( !iContactsIcon )
+                {
+                _LIT( KContactsTooltip, "Contacts" );
+                tooltip = KContactsTooltip().AllocLC();
+                element = CAknButton::NewLC(
+                    AknIconUtils::AvkonIconFileName(),
+                    EMbmAvkonQgn_indi_tp_contacts,
+                    EMbmAvkonQgn_indi_tp_contacts_mask,
+                    -1, -1, -1, -1, -1, -1,
+                    KNullDesC, *tooltip, NULL, NULL,
+                    KAknsIIDQgnIndiTpContacts );
+                iContactsIcon = element;
+                element->AddStateL(
+                    AknIconUtils::AvkonIconFileName(),
+                    EMbmAvkonQgn_indi_tp_contacts,
+                    EMbmAvkonQgn_indi_tp_contacts_mask,
+                    -1, -1, -1, -1, -1, -1,
+                    KNullDesC, *tooltip, KAknButtonStateHasLatchedFrame,
+                    KAknsIIDQgnIndiTpContacts, KAknsIIDNone,
+                    KAknsIIDNone, KAknsIIDNone );
+                CleanupStack::Pop( element );
+                CleanupStack::Pop( tooltip );
+                CleanupStack::PushL( element ); // will not leave
+                iFlags.Set( EContactsIconActive );
+                }
+            break;
+            }
+        default:
+            {
+            User::Leave( KErrNotSupported );
+            }
+        }
+ 
+    delete tooltip; tooltip = NULL;
+    delete helpText; helpText = NULL;
+ 
+    if ( element )
+        {
+        // Set background for the element.
+        if ( aId != ETouchPaneElementNone )
+            {
+            element->SetBackgroundIds( KAknsIIDQsnFrButtonTpNormal,
+                KAknsIIDQsnFrButtonTpPressed, KAknsIIDQsnFrButtonTpInactive,
+                KAknsIIDQsnFrButtonTpPressed, KAknsIIDQsnFrButtonTpInactive );
+            }
+        else
+            {
+            element->SetBackgroundIds( KAknsIIDNone, KAknsIIDNone,
+                KAknsIIDNone, KAknsIIDNone, KAknsIIDNone );
+            }
+
+        SetDefaultPropertiesL( element );
+        CleanupStack::Pop( element );
+        }
+    return element;
+    }
+#endif // RD_SCALABLE_UI_V2
+
+// -----------------------------------------------------------------------------
+// CAknTouchPane::ReportSizeChange
+// -----------------------------------------------------------------------------
+//
+#ifdef RD_SCALABLE_UI_V2
+void CAknTouchPane::ReportSizeChange() const
+    {
+    if ( iObserver )
+        {
+        iObserver->HandleTouchPaneSizeChange();
+        }
+    }
+#endif // RD_SCALABLE_UI_V2
+
+// -----------------------------------------------------------------------------
+// CAknTouchPane::SetDefaultProperties
+// -----------------------------------------------------------------------------
+//
+#ifdef RD_SCALABLE_UI_V2
+void CAknTouchPane::SetDefaultPropertiesL( CCoeControl* aControl )
+    {
+    aControl->SetContainerWindowL( *this );
+    aControl->SetObserver( this );
+    aControl->SetFocusing( EFalse );
+    aControl->SetBackground( this );
+    }
+#endif // RD_SCALABLE_UI_V2
+
+// -----------------------------------------------------------------------------
+// CAknTouchPane::SetWindowLayout
+// -----------------------------------------------------------------------------
+//
+#ifdef RD_SCALABLE_UI_V2
+void CAknTouchPane::SetWindowLayout()
+    {
+    const TInt variety = Layout_Meta_Data::IsLandscapeOrientation() ? 1 : 0;
+    TRect touchPaneRect = RectFromLayout( iAppUi->ApplicationRect(),
+        AknLayoutScalable_Avkon::touch_pane( variety ) );
+    SetRect( touchPaneRect );
+    Window().Invalidate();
+    }
+#endif // RD_SCALABLE_UI_V2
+
+// -----------------------------------------------------------------------------
+// CAknTouchPane::RegisterControlPositions
+// -----------------------------------------------------------------------------
+//
+#ifdef RD_SCALABLE_UI_V2
+void CAknTouchPane::RegisterControlPositions() const
+    {
+    TInt count = CountComponentControls();
+    CCoeControl* control = NULL;
+    AknsUtils::RegisterControlPosition( this, Position() );
+    for ( TInt ii = 0; ii < count; ++ii )
+        {
+        control = ComponentControl( ii );
+        AknsUtils::RegisterControlPosition( control,
+            Position() + control->Position() );
+        }
+    }
+#endif // RD_SCALABLE_UI_V2
+
+// -----------------------------------------------------------------------------
+// CAknTouchPane::DeregisterControlPositions
+// -----------------------------------------------------------------------------
+//
+#ifdef RD_SCALABLE_UI_V2
+void CAknTouchPane::DeregisterControlPositions() const
+    {
+    TInt count = CountComponentControls();
+    CCoeControl* control = NULL;
+    AknsUtils::DeregisterControlPosition( this );
+    for ( TInt ii = 0; ii < count; ++ii )
+        {
+        control = ComponentControl( ii );
+        AknsUtils::DeregisterControlPosition( control );
+        }
+    }
+#endif // RD_SCALABLE_UI_V2
+
+// -----------------------------------------------------------------------------
+// CAknTouchPane::DoRefresh
+// -----------------------------------------------------------------------------
+//
+#ifdef RD_SCALABLE_UI_V2
+void CAknTouchPane::DoRefresh()
+    {
+    if ( iDiallerIcon )
+        {
+        // Set dialler icon pressed only in dialler application.
+        TInt state = ( iUid == KAknTouchPaneDiallerAppUid ? 1 : 0 );
+        if ( state != iDiallerIcon->StateIndex() )
+            {
+            iDiallerIcon->SetCurrentState( state, EFalse );
+            Window().Invalidate( iDiallerIcon->Rect() );
+            }
+        }
+
+    if ( iContactsIcon )
+        {
+        // Set Contacts icon pressed only in contacts application.
+        TInt state = ( iUid == KAknTouchPaneContactsAppUid ? 1 : 0 );
+        if ( state != iContactsIcon->StateIndex() )
+            {
+            iContactsIcon->SetCurrentState( state, EFalse );
+            Window().Invalidate( iContactsIcon->Rect() );
+            }
+        }
+
+    // Update icon dimming depending on whether the touch pane is active.
+    const TBool active = iFlags.IsSet( ETouchPaneActive ) &&
+        iFlags.IsSet( EHasForeground );
+
+    if ( iShellIcon && iShellIcon->IsDimmed() == ( active &&
+         iFlags.IsSet( EShellIconActive ) ) )
+        {
+        iShellIcon->SetDimmed( !iShellIcon->IsDimmed() );
+        Window().Invalidate( iShellIcon->Rect() );
+        }
+
+    if ( iSwapperIcon && iSwapperIcon->IsDimmed() == ( active &&
+         iFlags.IsSet( ESwapperIconActive ) ) )
+        {
+        iSwapperIcon->SetDimmed( !iSwapperIcon->IsDimmed() );
+        Window().Invalidate( iSwapperIcon->Rect() );
+        }
+
+    if ( iIdleViewIcon && iIdleViewIcon->IsDimmed() == ( active &&
+         iFlags.IsSet( EIdleViewIconActive ) ) )
+        {
+        iIdleViewIcon->SetDimmed( !iIdleViewIcon->IsDimmed() );
+        Window().Invalidate( iIdleViewIcon->Rect() );
+        }
+
+    if ( iDiallerIcon && iDiallerIcon->IsDimmed() == ( active &&
+         iFlags.IsSet( EDiallerIconActive ) ) )
+        {
+        iDiallerIcon->SetDimmed( !iDiallerIcon->IsDimmed() );
+        Window().Invalidate( iDiallerIcon->Rect() );
+        }
+
+    if ( iRotateIcon && iRotateIcon->IsDimmed() == ( active &&
+         iFlags.IsSet( ERotateIconActive ) ) )
+        {
+        iRotateIcon->SetDimmed( !iRotateIcon->IsDimmed() );
+        Window().Invalidate( iRotateIcon->Rect() );
+        }
+
+    if ( iHelpIcon && iHelpIcon->IsDimmed() == ( active &&
+         iFlags.IsSet( EHelpIconActive ) ) )
+        {
+        iHelpIcon->SetDimmed( !iHelpIcon->IsDimmed() );
+        Window().Invalidate( iHelpIcon->Rect() );
+        }
+
+    if ( iInputMethodIcon && iInputMethodIcon->IsDimmed() == ( active &&
+         iFlags.IsSet( EInputMethodIconActive ) ) )
+        {
+        iInputMethodIcon->SetDimmed( !iInputMethodIcon->IsDimmed() );
+        Window().Invalidate( iInputMethodIcon->Rect() );
+        }
+
+    if ( iToolbarIcon && iToolbarIcon->IsDimmed() == ( active &&
+         iFlags.IsSet( EToolbarIconActive ) ) )
+        {
+        iToolbarIcon->SetDimmed( !iToolbarIcon->IsDimmed() );
+        Window().Invalidate( iToolbarIcon->Rect() );
+        }
+
+    if ( iContactsIcon && iContactsIcon->IsDimmed() == ( active &&
+         iFlags.IsSet( EContactsIconActive ) ) )
+        {
+        iContactsIcon->SetDimmed( !iContactsIcon->IsDimmed() );
+        Window().Invalidate( iContactsIcon->Rect() );
+        }
+    }
+#endif // RD_SCALABLE_UI_V2
+
+// -----------------------------------------------------------------------------
+// CAknTouchPane::Draw
+// -----------------------------------------------------------------------------
+//
+#ifdef RD_SCALABLE_UI_V2
+void CAknTouchPane::Draw( const TRect& aRect ) const
+    {
+    CWindowGc& gc = SystemGc();
+    Draw( gc, *this, aRect );
+    }
+#else
+void CAknTouchPane::Draw( const TRect& ) const
+    {
+    }
+#endif // RD_SCALABLE_UI_V2
+
+//  End of File