uifw/EikStd/coctlsrc/EIKMENUP.CPP
branchRCL_3
changeset 55 aecbbf00d063
parent 51 fcdfafb36fe7
child 56 d48ab3b357f1
--- a/uifw/EikStd/coctlsrc/EIKMENUP.CPP	Thu Aug 19 10:11:06 2010 +0300
+++ b/uifw/EikStd/coctlsrc/EIKMENUP.CPP	Tue Aug 31 15:28:30 2010 +0300
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2002-2010 Nokia Corporation and/or its subsidiary(-ies).
+* Copyright (c) 2002-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"
@@ -46,6 +46,7 @@
 #include <AknsDrawUtils.h>
 #include <AknsFrameBackgroundControlContext.h>
 #include <AknBidiTextUtils.h>
+#include <AknMarqueeControl.h>
 #include <skinlayout.cdl.h>
 #include <aknlayoutscalable_avkon.cdl.h>
 #include <AknLayoutFont.h>
@@ -54,6 +55,8 @@
 #include <AknIconUtils.h>
 #include <aknappui.h>
 
+#include <AknsEffectAnim.h>
+#include <systemwarninglevels.hrh>
 #include <layoutmetadata.cdl.h>
 #include <AknStatuspaneUtils.h>
 #include <aknCharMap.h>
@@ -61,9 +64,16 @@
 #include <akntranseffect.h> //For transition effects
 #include <akntransitionutils.h> // SetAllParents method
 #include <featmgr.h>
+#include <hal.h>
 #include <avkondomainpskeys.h>
 #include <e32property.h>
 
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+#include <aknlistboxtfxinternal.h> // LISTBOX EFFECTS IMPLEMENTATION
+#include <aknlistloadertfx.h>
+#include <aknlistboxtfx.h>
+#endif // RD_UI_TRANSITION_EFFECTS_LIST
+
 #include <touchfeedback.h>
 #include <AknTasHook.h>
 #include <aknphysics.h>
@@ -105,15 +115,40 @@
  * Extension now contains menu/submenu highlight animation functionality.
  */
 NONSHARABLE_CLASS( CEikMenuPaneExtension ):
-    public CBase,
+    public CActive,
+    public MCoeForegroundObserver,
+    public MAknsEffectAnimObserver,
     public MCoeControlObserver,
     public MAknPhysicsObserver    
     {
 public:
+    enum TFlag
+        {
+        /**
+        * If set, animation creation is attempted. If not set, animation will
+        * never be created.
+        */
+        EFlagUseAnimation = 0
+        };
+        
+    enum TScreen
+        {
+        EQhdHeight = 360,
+        EQhdWidth = 640        
+        };        
+
     CEikMenuPaneExtension();
     ~CEikMenuPaneExtension();
 
     void ConstructL( CEikMenuPane* aControl );
+    void CreateAnimation();
+    void NoAnimIfError( TInt aError );
+    void UseNoAnimation();
+    void FocusGained();
+    void FocusLost();
+
+    void HandleLayoutSwitch();
+    void ChangeHighlightBackground();
     void MenuClosed();
 
     void ConstructMenuSctRowL( TDes& aSpecialChars, TInt aResourceId );
@@ -132,7 +167,29 @@
     void ChangePosition( TPointerEvent& aPointerEvent );
     void CalculateParentEvent( const TPointerEvent& aPointerEvent, 
                                TPointerEvent& aParentEvent );
+    TRect GetBackgroundRect( const TRect& aWindowRect ) const;                               
+    static void AdjustPopupLayoutData( TAknWindowLineLayout& aListScrollPaneLayout );
+                               
+    const TAknLayoutText GetMenuItemTextLayout(const TRect& aItemRect, TBool cascade);
+
+public: // Implementation of MCoeForegroundObserver
+    void HandleGainingForeground();
+    void HandleLosingForeground();
+
+public: // Implementation of MAknsEffectAnimObserver
+    void AnimFrameReady( TInt aError, TInt );
     void HandleControlEventL(CCoeControl* aControl,TCoeEvent aEventType);
+
+protected: // CActive overloads
+    void DoCancel();
+    void RunL();
+
+private: // New internal methods
+    void Play();
+    TBool DrawHighlightBackground( CFbsBitGc& aGc );
+    void PostDeleteAnimation();
+    void CreateAnimationL( const TSize& aHighlightSize );
+    void DoResizeL( const TSize& aHighlightSize, TBool aAboutToStart );
 public:
     void ImmediateFeedback( TTouchLogicalFeedback aType,
                             TTouchFeedbackType aFbType );
@@ -140,10 +197,14 @@
 public:
     void StartCascadeMenuAppearTransition();
 
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+    void CalcItemSize( MAknListBoxTfxInternal* transApi ) const;
+#endif
+
     /**
      * Prepares cascade menu for item specific commands.
      */
-    void PrepareCascadeForItemCommandsL();
+    void PrepareCascadeForItemCommands();
 
     /**
      * Returns ETrue if this menu pane belongs to a CS menu.
@@ -175,7 +236,7 @@
      * 
      * @return ETrue if highlight is enabled
      */
-    TBool HighlightEnabled();
+    TBool  HighlightEnabled();
 
     /**
      * Sets the default highlight to options menu
@@ -184,6 +245,8 @@
     void SetDefaultHighlight();
     
 public: // Data
+    TBool iHasIcon;
+    TBool iIsPenEnable;   
     CFbsBitmap* iCascadeBitmap;
     CFbsBitmap* iCascadeBitmapMask;
     CAknsFrameBackgroundControlContext* iBgContext;
@@ -194,7 +257,14 @@
     CFbsBitmap* iRadioButtonBitmapMask;   // mask for the above bitmap
     TBool       iHasRadioGroup;           // is ETrue if submenu contains radio button group.
     TInt        iSelectedRadioButtonItem; // index of the radio button item which is currently selected (one must be selected)
+    CCoeControl* iGrabbingCBAComponent;    // component control of CBA which is currently grabbing the pointer
     CEikMenuPane* iControl;
+    CAknsEffectAnim* iAnimation;
+    /**
+    * Stored flags are explained in enumeration TFlags.
+    */
+    TBitFlags32 iAnimFlags;
+
     CAknCharMap* iSct;      // Menu SCT row, created only when needed.
     TBool iSctHighlighted;  // No "normal" menu item can be highlighted if ETrue
 
@@ -207,17 +277,26 @@
     // needs to be mutable since we need to get information from Draw methods
     // (that are declared const)
     mutable TRect iCascadeDRect;
+    TBool iTransitionsOn;   // Transitions FtMgr flag on
     TBool iShowCascadeTransition;
     // For later deletion of cascade menu, this allows the transition system
     // to correctly handle the aborted transitions
     CEikMenuPane* iCascadeMenuObject;
     TBool iDraggedOutside;    
     TPointerEvent iLastPointerEvent;
+
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+    CWindowGc* iGc;
+#endif
     TInt iItemsThatFitInView;
     TRect iScrollBarRect;
     TRect iSctRect;
+    TInt iTotalNumberOfItemsInView; // this value includes partial items
+
+
     CIdle* iTaskSwapIdle;
     CRedirectionListener* iRedirectionListener;
+    TRect iSBRect;
     RWindow* iMenuPaneWindow; // Not own, used by SCT
     TBool iLaunchCascadeMenu; 
     TBool isUpdateScrollDirectly;
@@ -236,39 +315,13 @@
         ESingleClickEnabled,
         EHideItemSpecificCommands,
         EContextSensitive,
-        ESkipScrollbarUpdate,
-        EHighlightEnabled,
-        EHideViewSpecificCommands, 
-        EHideMarkAndUnmark,
-        EHideItemActionCommands
+        EHighlightEnabled
         };
 
     /**
      * Menu pane extension flags.
      */
     TBitFlags iFlags;
-    
-    /**
-     * Cached rectangle occupied by menu items (excluding scrollbar's area).
-     */
-    TRect iItemAreaRect;
-    
-    /**
-     * Cached rectangle occupied by menu items and scrollbar.
-     */
-    TRect iMenuAreaRect;
-    
-    /**
-     * Index of the item were highlight was previously drawn to.
-     * Can be KErrNotFound.
-     */
-    TInt iHighlightedItem;
-    
-    /**
-     * Scrollbar's desired visibility. This is calculated in conjunction with
-     * menu pane's size and used later on when calculating scrollbar's layout.
-     */
-    CEikScrollBarFrame::TScrollBarVisibility iScrollbarVisibility;
 
 private: // Data
     CPeriodic* iTimer; // timer to launch submenu, own
@@ -400,6 +453,12 @@
 inline void CEikMenuPane::CMenuScroller::SetTopItemIndex(TInt aIndex)
     { 
     iTopItemIndex=aIndex;
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+    if ( iMenuPane.iExtension )
+        {
+        iTopItemIndex = aIndex;
+        }
+#endif
     }
 
 inline CIdle* CEikMenuPane::CMenuScroller::Idle() const
@@ -415,8 +474,16 @@
     iLastFeedbackTopItemIndex = 0;
     iPressedDown = EFalse;
     iFlickActive = EFalse;
-
-    TRect rect( iMenuPaneRect );
+    
+    TRect rect;
+    if ( !iControl->iOwner )
+        {
+        rect = iMenuPaneRect;    
+        }
+    else
+        {
+        rect = iControl->Rect();    
+        }    
     
     TInt itemHeight = iControl->iItemHeight;
     TInt itemsInRect = rect.Height() / itemHeight;
@@ -470,18 +537,19 @@
 void CEikMenuPaneExtension::ViewPositionChanged( const TPoint& aNewPosition,
                                                  TBool aDrawNow,
                                                  TUint /*aFlags*/ )
-    {
+    {  
     _AKNTRACE_FUNC_ENTER;
-    TInt delta = iViewPosition.iY - aNewPosition.iY;
-
-    if ( !iControl->iItemArray || delta == 0 )
+    if ( !iControl->iItemArray )
         {
         return;
         }
-
+    
     iListTopIndex = aNewPosition.iY - iViewHeight / 2;  
+    
     iListBottomIndex = aNewPosition.iY + iViewHeight - iViewHeight / 2;
     
+    TInt delta = iViewPosition.iY - aNewPosition.iY;
+    
     DoOffset( delta );
 
     iViewPosition = aNewPosition; 
@@ -490,29 +558,18 @@
     _AKNTRACE( "delta = %d",  delta );
     _AKNTRACE( "iViewPosition(%d,%d)",  iViewPosition.iX, iViewPosition.iY );
     
-    //here checking the delta whether it is changed.
-    //if it is changed,the view must be drawn using the below code.
-    if ( delta != 0 )
-        {
-        aDrawNow = ETrue;
-    	}
     if ( aDrawNow )
         {
-        if ( iFlags.IsClear( ESkipScrollbarUpdate ) )
-            {
-            TRAP_IGNORE( iControl->DoUpdateScrollBarL() );
-            }
-
-        // Redraw only item area if scrollbar is invisible, otherwise include 
-        // also scrollbar's area in order to avoid drawdeferred.
-        TRect drawRect( iItemAreaRect );
-        
-        if ( iScrollbarVisibility == CEikScrollBarFrame::EOn )
-            {
-            drawRect = iMenuAreaRect;
-            }
-
-        iControl->DrawNow( drawRect );
+        TRAP_IGNORE( iControl->DoUpdateScrollBarL() );
+
+        if ( iControl->iOwner ) // Submenu
+            {
+            iControl->DrawNow();
+            }
+        else
+            {
+            iControl->DrawNow( TRect( iMenuPaneRect.Size() ) );
+            }        
         }
     _AKNTRACE_FUNC_EXIT;
     }
@@ -573,18 +630,24 @@
         if ( iFlickActive || iPanningActive )
             {
             if ( ( aOffset>0 && iListTopIndex <= listBottomLimit && iListTopIndex >= -iViewHeight ) ||
-                  ( aOffset<0 && iListBottomIndex >= 0 && iListBottomIndex <= listBottomLimit+iViewHeight ) ) 
-                {
-                if ( iPhysics )
+            	  ( aOffset<0 && iListBottomIndex >= 0 && iListBottomIndex <= listBottomLimit+iViewHeight ) ) 
+            	{
+            	if ( iPhysics )
                     {
-                    switch(iPhysics->OngoingPhysicsAction())
+                    TTouchFeedbackType feedbackType = ETouchFeedbackVibra;
+                    switch( iPhysics->OngoingPhysicsAction() )
                         {
-                        case CAknPhysics::EAknPhysicsActionBouncing:
                         case CAknPhysics::EAknPhysicsActionDragging:
+                            {
+                            feedbackType = static_cast<TTouchFeedbackType> ( ETouchFeedbackVibra | ETouchFeedbackAudio );
+                            }
                         case CAknPhysics::EAknPhysicsActionFlicking:
-                            ImmediateFeedback( ETouchFeedbackSensitiveList,
-                                    ETouchFeedbackVibra );
+                        case CAknPhysics::EAknPhysicsActionBouncing:
+                            {
+                            ImmediateFeedback( ETouchFeedbackSensitiveItem,
+                                               feedbackType );
                             break;
+                            }
                         default:
                             break;
                         }
@@ -673,6 +736,14 @@
     {
     _AKNTRACE_FUNC_ENTER;    
     iFlickActive = EFalse; 
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+    MAknListBoxTfx* tfxApi = CAknListLoader::TfxApi( iGc );
+
+    if ( tfxApi )
+        {
+        tfxApi->EnableEffects( ETrue );
+        }
+#endif // RD_UI_TRANSITION_EFFECTS_LIST
     _AKNTRACE_FUNC_EXIT;
     }    
     
@@ -865,6 +936,7 @@
 // -----------------------------------------------------------------------------
 //
 CEikMenuPaneExtension::CEikMenuPaneExtension() :
+    CActive( EPriorityHigh ),
     // Initialise data members to zero
     iCascadeBitmap( NULL ),
     iCascadeBitmapMask( NULL ),
@@ -876,10 +948,16 @@
     iRadioButtonBitmapMask( NULL ),
     iHasRadioGroup( EFalse ),
     iSelectedRadioButtonItem( KNoSelectedRadioButtonItem ),
+    iGrabbingCBAComponent( NULL ),
     iControl( NULL ),
+    iAnimation( NULL ),
+    iAnimFlags ( 0 ),
     iSct( NULL ),
     iSctHighlighted( EFalse ),
     iSpecialCharPointed( EFalse )
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+    ,iGc ( NULL )
+#endif // RD_UI_TRANSITION_EFFECTS_LIST
     ,iVerticalOffset( 0 )
     ,iPhysics( NULL )
     ,iListTopIndex( 0 )
@@ -889,9 +967,9 @@
     ,iFeedback( MTouchFeedback::Instance() )
     ,iLastFeedbackTopItemIndex( 0 )
     {
-    iItemsReadyForPenSelection = !AknLayoutUtils::PenEnabled();
+    iIsPenEnable = AknLayoutUtils::PenEnabled();
+    iItemsReadyForPenSelection = !iIsPenEnable;
     iNextHighlightItem = KErrNotFound;
-    iHighlightedItem = KErrNotFound;
     }
 
 // -----------------------------------------------------------------------------
@@ -902,6 +980,17 @@
 CEikMenuPaneExtension::~CEikMenuPaneExtension()
     {
     _AKNTRACE_FUNC_ENTER;
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+    if ( CAknListLoader::TfxApiInternal( iGc ) )
+        {
+        delete iGc;
+        }
+#endif
+    Cancel(); // Cancel possibly pending request
+
+    // Stop receiving foreground events
+    CCoeEnv* env = CCoeEnv::Static();
+    env->RemoveForegroundObserver( *this );
 
     delete iCascadeBitmap;
     iCascadeBitmap = NULL;
@@ -926,6 +1015,9 @@
 
     iControl = NULL;
 
+    delete iAnimation;
+    iAnimation = NULL;
+
     delete iSct;
     iSct = NULL;
 
@@ -961,6 +1053,8 @@
     {
     ASSERT( aControl );
     iControl = aControl;
+    iAnimFlags.Set( EFlagUseAnimation ); // Animations are created by default
+    CActiveScheduler::Add( this );
     iDraggedOutside = EFalse;
     iLaunchCascadeMenu = EFalse;
     iButtonDownItem = KErrNotFound;
@@ -970,6 +1064,11 @@
         // Delays submenu opening during appear transitions
         iRedirectionListener = new ( ELeave ) CRedirectionListener( *this );
         }
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+        iGc = CAknListLoader::CreateTfxGc( *aControl,
+                                           iControl->iScroller->iTopItemIndex,
+                                           iTotalNumberOfItemsInView );
+#endif // RD_UI_TRANSITION_EFFECTS_LIST
     if ( static_cast<CAknAppUi*>(
             iControl->ControlEnv()->AppUi() )->IsSingleClickCompatible() )
         {
@@ -985,6 +1084,55 @@
         KAknsIIDQsnFrPopup, TRect( 0, 0, 1, 1 ), TRect( 0, 0, 1, 1 ), EFalse );
     }
 
+// -----------------------------------------------------------------------------
+// CEikMenuPaneExtension::CreateAnimation
+// -----------------------------------------------------------------------------
+//
+void CEikMenuPaneExtension::CreateAnimation()
+    {
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+    return;
+#else    
+    if( !iAnimation && iAnimFlags.IsSet( EFlagUseAnimation ) )
+        {    
+        TRect rect = iControl->HighlightRect();
+        TRAPD( err, CreateAnimationL( rect.Size() ) );
+        if( KErrNone != err )
+            {
+            // Animation has not been drawn -> no need for repaint
+            UseNoAnimation();
+            }
+        }
+#endif //RD_UI_TRANSITION_EFFECTS_LIST  
+    }
+
+// -----------------------------------------------------------------------------
+// CEikMenuPaneExtension::NoAnimIfError
+// -----------------------------------------------------------------------------
+//
+void CEikMenuPaneExtension::NoAnimIfError( TInt aError )
+    {
+    if( KErrNone != aError )
+        UseNoAnimation();
+    }
+
+// -----------------------------------------------------------------------------
+// CEikMenuPaneExtension::UseNoAnimation
+// Falls back to normal highlight rendering.
+// -----------------------------------------------------------------------------
+//
+void CEikMenuPaneExtension::UseNoAnimation()
+    {
+    delete iAnimation;
+    iAnimation = NULL;
+
+    // Do not attempt to create animations in the future
+    iAnimFlags.Clear( EFlagUseAnimation );
+
+    // Stop receiving foreground events
+    CCoeEnv* env = CCoeEnv::Static();
+    env->RemoveForegroundObserver( *this );
+    }
 
 // -----------------------------------------------------------------------------
 // CEikMenuPaneExtension::StartCascadeMenuTimerL
@@ -1009,7 +1157,6 @@
     _AKNTRACE_FUNC_EXIT;
     }
 
-
 // -----------------------------------------------------------------------------
 // CEikMenuPaneExtension::StopCascadeMenuTimer
 // Stops the timer for the sub menu launch
@@ -1113,7 +1260,6 @@
     _AKNTRACE_FUNC_EXIT;
     }
 
-
 // -----------------------------------------------------------------------------
 // CEikMenuPaneExtension::HighlightTimerCallBack
 // Callback function of the timer for pressed down highlight
@@ -1165,12 +1311,11 @@
     {
     if ( !iControl->iSBFrame )
         {
-        return;
-        }
-    
-    TRect scrollBarRect( iControl->iSBFrame->VerticalScrollBar()->Rect() );
-    TPoint scrollerTl( scrollBarRect.iTl ); 
-    TPoint scrollerBr( scrollBarRect.iBr );
+        iControl->CreateScrollBarFrame();
+        }
+    TRect scrollBarRect = iControl->iSBFrame->VerticalScrollBar()->Rect();
+    TPoint scrollerTl = scrollBarRect.iTl; 
+    TPoint scrollerBr = scrollBarRect.iBr;
     TRect gapRect;           
     // For layout that left to right
     if ( !AknLayoutUtils::LayoutMirrored() )
@@ -1218,14 +1363,158 @@
                            TPointerEvent& aParentEvent )
     {
     aParentEvent.iModifiers = aPointerEvent.iModifiers;
-    TPoint subPos = iControl->Position();
-    TPoint ownerPos = iControl->iOwner->Position();
+    TPoint subPos = iControl->PositionRelativeToScreen();
+    TPoint ownerPos = iControl->iOwner->PositionRelativeToScreen();
     aParentEvent.iPosition.SetXY (
         aPointerEvent.iPosition.iX + subPos.iX - ownerPos.iX,
         aPointerEvent.iPosition.iY + subPos.iY - ownerPos.iY);
     aParentEvent.iType = aPointerEvent.iType;    
     }
 
+// -----------------------------------------------------------------------------
+// CEikMenuPaneExtension::GetBackgroundRect
+// Get background rect for landscape mode of menu pane.
+// -----------------------------------------------------------------------------
+//    
+TRect CEikMenuPaneExtension::GetBackgroundRect( const TRect& aWindowRect ) const
+    {
+    return aWindowRect;
+    }
+        
+// -----------------------------------------------------------------------------
+// CEikMenuPaneExtension::AdjustPopupLayoutData
+// Adjust popup layout data for main menu pane in landscape mode
+// -----------------------------------------------------------------------------
+// 
+void CEikMenuPaneExtension::AdjustPopupLayoutData( TAknWindowLineLayout& aListScrollPaneLayout )
+    {
+    TRect screenRect;
+    AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EScreen, screenRect );
+    AknLayoutUtils::TAknCbaLocation cbaPosition = AknLayoutUtils::CbaLocation();
+
+    if ( screenRect.Width() == EQhdWidth && screenRect.Height() == EQhdHeight 
+        && cbaPosition == AknLayoutUtils::EAknCbaLocationBottom ) 
+        {
+        if ( !AknLayoutUtils::LayoutMirrored() )
+            {
+            aListScrollPaneLayout.ir -= 32;
+            }
+        else
+            {
+            aListScrollPaneLayout.il -= 32;
+            }
+        }
+    } 
+
+
+// -----------------------------------------------------------------------------
+// CEikMenuPaneExtension::GetMenuItemTextLayout
+// Get Layout of menu item text.
+// -----------------------------------------------------------------------------
+//
+const TAknLayoutText CEikMenuPaneExtension::GetMenuItemTextLayout(const TRect& aItemRect, TBool cascade)
+    {
+    TAknTextLineLayout menuTextLayout;
+    
+    if ( !iControl->iOwner )
+        {
+        menuTextLayout = AknLayoutScalable_Avkon::list_single_pane_t1_cp2( cascade ? 3 : 0 ).LayoutLine();
+        }
+    else
+        {
+        if ( iHasIcon )
+            {
+            menuTextLayout = TAknTextLineLayout( AknLayoutScalable_Avkon::list_single_popup_submenu_pane_t1( 1 ).LayoutLine() );
+            }
+        else
+            {
+            menuTextLayout = TAknTextLineLayout( AknLayoutScalable_Avkon::list_single_popup_submenu_pane_t1( 0 ).LayoutLine() );
+            }
+        }
+    
+    TAknLayoutText textRect;
+    textRect.LayoutText( aItemRect, menuTextLayout );
+    return textRect;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CEikMenuPaneExtension::FocusGained
+// The owning control has gained focus -> animation should be continued.
+// -----------------------------------------------------------------------------
+//
+void CEikMenuPaneExtension::FocusGained()
+    {
+    Play();
+    }
+
+// -----------------------------------------------------------------------------
+// CEikMenuPaneExtension::FocusLost
+// The owning control has lost focus -> no running animation (even if the
+// control is partially visible).
+// -----------------------------------------------------------------------------
+//
+void CEikMenuPaneExtension::FocusLost()
+    {
+    if( iAnimation )
+        {
+        NoAnimIfError( iAnimation->Pause() );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CEikMenuPaneExtension::HandleLayoutSwitch
+// -----------------------------------------------------------------------------
+//
+void CEikMenuPaneExtension::HandleLayoutSwitch()
+    {
+    if( iAnimation ) // Animation exists -> try to resize
+        {
+        TRect rect( iControl->HighlightRect() );
+
+        // Resize animation
+        TBool aboutToStart = ETrue;
+        if( iAnimation->State() == EAknsAnimStateStopped )
+            aboutToStart = EFalse;
+
+        TRAPD( err, DoResizeL( rect.Size(), aboutToStart ) );
+        NoAnimIfError( err );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CEikMenuPaneExtension::ChangeHighlightBackground
+// -----------------------------------------------------------------------------
+//
+void CEikMenuPaneExtension::ChangeHighlightBackground()
+    {
+    // Every time the current list item is changed we need to change the
+    // animation input layer (animated element is the highlight bacground that
+    // can differ between highlight positions).
+    if( iAnimation )
+        {
+        if( iAnimation->State() == EAknsAnimStateStopped  )
+            {
+            // Input layers don't exist when stopped or finished. We need to
+            // resize to create the input layers and to update the output
+            // layer.
+
+            TRAPD( err, DoResizeL( iAnimation->Size(), EFalse ) );
+            NoAnimIfError( err );
+            }
+        else // Either paused, running or finished
+            {
+            // Update the highlight background
+            if( iAnimation->InputRgbGc() )
+                DrawHighlightBackground( *iAnimation->InputRgbGc() );
+
+            // We need to update the output frame (otherwise the highlight
+            // would drawn with the old output before the next new animation
+            // frame).
+            NoAnimIfError( iAnimation->UpdateOutput() );
+            }
+        }
+    }
 
 // -----------------------------------------------------------------------------
 // CEikMenuPaneExtension::MenuClosed
@@ -1234,9 +1523,20 @@
 void CEikMenuPaneExtension::MenuClosed()
     {
     _AKNTRACE_FUNC_ENTER;
+    delete iAnimation;
+    iAnimation = NULL;
+
+    CCoeEnv* env = CCoeEnv::Static();
+    env->RemoveForegroundObserver( *this );
+
+    iAnimFlags.Set( EFlagUseAnimation );
+
     delete iSct;
     iSct = NULL;
     iSctHighlighted = EFalse;
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST  
+    iSctRect = TRect::EUninitialized;
+#endif
 
     if ( iCba )
         {
@@ -1249,14 +1549,197 @@
         }
 		
     iFlags.Clear( EHideItemSpecificCommands );
-    iFlags.Clear( EHideItemActionCommands );
     iFlags.Clear( EContextSensitive );
     iFlags.Clear( EHighlightEnabled );
-    iFlags.Clear( EHideViewSpecificCommands );
-    iFlags.Clear( EHideMarkAndUnmark ); 
     _AKNTRACE_FUNC_EXIT;
     }
 
+// -----------------------------------------------------------------------------
+// CEikMenuPaneExtension::HandleGainingForeground
+// The application has gained foreground -> animation should be continued.
+// -----------------------------------------------------------------------------
+//
+void CEikMenuPaneExtension::HandleGainingForeground()
+    {
+    // It is safe to start animation in this method because animation is
+    // deleted when the menu is closed -> it is not possible that menu receives
+    // foreground event while it is not visible and the animation exists.
+
+    // We need to check if the menu has focus (to prevent running nonfocused
+    // animation because also the nonfocused menu (menu/submenu) receives
+    // foreground events)
+    Play();
+    }
+
+// -----------------------------------------------------------------------------
+// CEikMenuPaneExtension::HandleLosingForeground
+// The application lost foreground -> no running animation (even if the
+// application is partially visible).
+// -----------------------------------------------------------------------------
+//
+void CEikMenuPaneExtension::HandleLosingForeground()
+    {
+    if( iAnimation )
+        {
+        NoAnimIfError( iAnimation->Stop() );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CEikMenuPaneExtension::AnimFrameReady
+// -----------------------------------------------------------------------------
+//
+void CEikMenuPaneExtension::AnimFrameReady( TInt aError, TInt )
+    {
+    if( KErrNone != aError )
+        {
+        // Animation has failed to run -> schedule the animation for
+        // deletion to fall back to normal rendering.
+        PostDeleteAnimation();
+        }
+    else if( iControl ) // Frame ok
+        {
+        if ( iControl->IsVisible() )
+            {
+            iControl->RepaintHighlight();
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CEikMenuPaneExtension::DoCancel
+// -----------------------------------------------------------------------------
+//
+void CEikMenuPaneExtension::DoCancel()
+    {
+    // Required method, but not needed
+    }
+
+
+// -----------------------------------------------------------------------------
+// CEikMenuPaneExtension::RunL
+// Postponed animation deletion is done here
+// -----------------------------------------------------------------------------
+//
+void CEikMenuPaneExtension::RunL()
+    {
+    UseNoAnimation();
+    }
+
+// -----------------------------------------------------------------------------
+// CEikMenuPaneExtension::Play
+// -----------------------------------------------------------------------------
+//
+void CEikMenuPaneExtension::Play()
+    {
+    if( !iAnimation || !iControl->IsFocused() )
+        {
+        return;
+        }
+
+    // No need to start running/finished animation
+    if( EAknsAnimStateRunning == iAnimation->State() ||
+        EAknsAnimStateFinished == iAnimation->State() )
+        {
+        return;
+        }
+
+    CAknAppUi* aui = static_cast<CAknAppUi*>(CEikonEnv::Static()->AppUi());
+    if( !aui->IsForeground() )
+        {
+        return;
+        }
+
+    if( EAknsAnimStatePaused == iAnimation->State() )
+        {
+        NoAnimIfError( iAnimation->Continue() );
+        }
+    else if( EAknsAnimStateStopped == iAnimation->State() )
+        {
+        if( iAnimation->NeedsInputLayer() )
+            {
+            TRAPD( err, DoResizeL( iAnimation->Size(), ETrue ) );
+            NoAnimIfError( err );
+
+            if( KErrNone != err )
+                return;
+            }
+
+        NoAnimIfError( iAnimation->Start() );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CEikMenuPaneExtension::DrawHighlightBackground
+// Draws skinned highlight background to the provided graphics context.
+// -----------------------------------------------------------------------------
+//
+TBool CEikMenuPaneExtension::DrawHighlightBackground( CFbsBitGc& aGc )
+    {
+    // Draw the background under the current highlight. This simplified
+    // drawing, we only grab a piece from the list background bitmap.
+    MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+
+    return AknsDrawUtils::DrawBackground( skin, iBgContext, iControl, aGc, TPoint(0,0),
+                                          iControl->HighlightRect(),
+                                          KAknsDrawParamRGBOnly );
+    }
+
+// -----------------------------------------------------------------------------
+// CEikMenuPaneExtension::PostDeleteAnimation
+// Schedules the animation for deletion by activating the extension itself.
+// Deletion is postponed because in many error/failure occasions the caller has
+// been animation and direct deletion is possibly not safe (because function
+// stack would return through the deleted object).
+// -----------------------------------------------------------------------------
+//
+void CEikMenuPaneExtension::PostDeleteAnimation()
+    {
+    TRequestStatus* status = &iStatus;
+    User::RequestComplete( status, KErrNone );
+    SetActive();
+    }
+
+// -----------------------------------------------------------------------------
+// CEikMenuPaneExtension::CreateAnimationL
+// -----------------------------------------------------------------------------
+//
+void CEikMenuPaneExtension::CreateAnimationL( const TSize& aHighlightSize )
+    {
+    // Create animation
+    CCoeEnv* env = CCoeEnv::Static();
+    env->AddForegroundObserverL( *this );
+
+    delete iAnimation;
+    iAnimation = NULL;
+
+    iAnimation = CAknsEffectAnim::NewL( this );
+    TBool ok = iAnimation->ConstructFromSkinL( KAknsIIDQsnAnimList );
+
+    if( !ok ) // Animation for the ID was not found from the skin
+        {
+        User::Leave( KErrNotFound );
+        }
+
+    DoResizeL( aHighlightSize, ETrue );
+
+    Play();
+    }
+
+// -----------------------------------------------------------------------------
+// CEikMenuPaneExtension::DoResizeL
+// -----------------------------------------------------------------------------
+//
+void CEikMenuPaneExtension::DoResizeL(
+    const TSize& aHighlightSize, TBool aAboutToStart )
+    {
+    iAnimation->BeginConfigInputLayersL( aHighlightSize, aAboutToStart );
+
+    if( iAnimation->InputRgbGc() )
+        DrawHighlightBackground( *iAnimation->InputRgbGc() );
+
+    iAnimation->EndConfigInputLayersL();
+    }
 
 // -----------------------------------------------------------------------------
 // CEikMenuPaneExtension::ConstructMenuSctRowL
@@ -1279,8 +1762,11 @@
     if ( renew && iMenuPaneWindow && iControl )
         {
         iSct->SetContainerWindowL( *iControl );
-        iSct->SetGloballyCapturing( ETrue );
-        iSct->SetPointerCapture( ETrue );
+        if ( AknLayoutUtils::PenEnabled() )
+            {
+            iSct->SetGloballyCapturing( ETrue );
+            iSct->SetPointerCapture( ETrue );
+            }
         }
     _AKNTRACE_FUNC_EXIT;
     }
@@ -1305,8 +1791,11 @@
     if ( renew && iMenuPaneWindow && iControl)
         {
         iSct->SetContainerWindowL( *iControl );
-        iSct->SetGloballyCapturing( ETrue );
-        iSct->SetPointerCapture( ETrue );
+        if ( AknLayoutUtils::PenEnabled() )
+            {
+            iSct->SetGloballyCapturing( ETrue );
+            iSct->SetPointerCapture( ETrue );
+            }
         }
     }
 
@@ -1317,10 +1806,13 @@
 void CEikMenuPaneExtension::HandleControlEventL(CCoeControl* /*aControl*/,TCoeEvent aEventType)
     {
     _AKNTRACE_FUNC_ENTER;
-    if ( aEventType == EEventStateChanged )
-        {
-        // Something has been selected from CharMap
-        iSpecialCharPointed = ETrue;
+    if ( AknLayoutUtils::PenEnabled() )
+        {
+         if(aEventType == EEventStateChanged)
+            {
+            // Something has been selected from CharMap
+            iSpecialCharPointed = ETrue;
+            }
         }
     _AKNTRACE( "aEventType = %d", aEventType );
     _AKNTRACE_FUNC_EXIT;
@@ -1335,8 +1827,8 @@
     TTouchLogicalFeedback aType,
     TTouchFeedbackType aFbType  = TTouchFeedbackType( ETouchFeedbackAudio |
                                                       ETouchFeedbackVibra ))
-    {
-    if( iFeedback && AknLayoutUtils::PenEnabled() )
+    {   
+    if ( iFeedback )
         {
         iFeedback->InstantFeedback( iControl, aType, aFbType, TPointerEvent() );
         }
@@ -1344,10 +1836,10 @@
 
 
 // -----------------------------------------------------------------------------
-// CEikMenuPaneExtension::PrepareCascadeForItemCommandsL
-// -----------------------------------------------------------------------------
-//
-void CEikMenuPaneExtension::PrepareCascadeForItemCommandsL()
+// CEikMenuPaneExtension::PrepareCascadeForItemCommands
+// -----------------------------------------------------------------------------
+//
+void CEikMenuPaneExtension::PrepareCascadeForItemCommands()
     {
     if ( iFlags.IsSet( ESingleClickEnabled )
             && iControl->iOwner
@@ -1358,16 +1850,9 @@
             {
             iFlags.Set( EContextSensitive );
             }
-        else
-            {
-            if ( ownerFlags.IsSet( EHideItemSpecificCommands ) )
-                {
-                iControl->SetItemCommandsStateL( ETrue );
-                }
-            if ( ownerFlags.IsSet( EHideItemActionCommands ) )
-                {
-                iControl->SetItemActionsStateL( ETrue );
-                }
+        else if ( ownerFlags.IsSet( EHideItemSpecificCommands ) )
+            {
+            iControl->SetItemCommandsDimmed();
             }
         }
     }
@@ -1808,13 +2293,6 @@
     {
     _AKNTRACE_FUNC_ENTER;
     AKNTASHOOK_REMOVE();
-
-    if ( iIsDeleted )
-        {
-        *iIsDeleted = ETrue;
-        iIsDeleted = NULL;
-        }
-    
     CloseCascadeMenu();
     if ( !ItemArrayOwnedExternally() )
         {
@@ -1884,12 +2362,27 @@
     CheckCreateScrollerL();
     CheckCreateExtensionL();
 
+    iExtension->iTransitionsOn = FeatureManager::FeatureSupported( KFeatureIdUiTransitionEffects );
+
     CreateWindowL( iCoeEnv->RootWin() );
     EnableWindowTransparency();
     SetAllowStrayPointers();
     EnableDragEvents();
 
-    iItemHeight = CalculateItemHeight();
+    TAknWindowLineLayout menuLineLayout;
+    if ( iOwner ) // submenu
+        {
+        menuLineLayout = AknLayoutScalable_Avkon::list_single_popup_submenu_pane( 0 ).LayoutLine();
+        }
+    else
+        {
+        menuLineLayout = AknLayoutScalable_Avkon::list_single_pane_cp2( 0 ).LayoutLine();
+        }
+
+    TRect windowRect = Rect();
+    TAknLayoutRect menuLayoutRect;
+    menuLayoutRect.LayoutRect( windowRect, menuLineLayout );
+    iItemHeight = menuLayoutRect.Rect().Height();
 
     if ( iExtension->iSct )
         {
@@ -1897,12 +2390,15 @@
         iExtension->iMenuPaneWindow = window;
         iExtension->iSct->SetContainerWindowL( *this );
 
-        // This is effectively the same as CCoeControl::EnableDragEvents()
-        // which is protected.
-        window->PointerFilter( EPointerFilterDrag, 0 );
-        iExtension->iSct->SetGloballyCapturing( ETrue );
-        iExtension->iSct->SetPointerCapture( ETrue );
-        iExtension->iSct->SetObserver(iExtension);
+        if ( AknLayoutUtils::PenEnabled() )
+            {
+            // This is effectively the same as CCoeControl::EnableDragEvents()
+            // which is protected.
+            window->PointerFilter( EPointerFilterDrag, 0 );
+            iExtension->iSct->SetGloballyCapturing( ETrue );
+            iExtension->iSct->SetPointerCapture( ETrue );
+            iExtension->iSct->SetObserver(iExtension);
+            }
         }
 
     if ( iOwner ) // submenu
@@ -1920,6 +2416,7 @@
         User::Leave( KErrNoMemory );
             
     Window().SetOrdinalPosition( 0 );
+    
     Window().SetPointerGrab( ETrue );
     SetGloballyCapturing( ETrue );
 
@@ -1943,7 +2440,19 @@
         }
     CreateItemArrayL();
 
-    iItemHeight = CalculateItemHeight();
+    TAknWindowLineLayout menuLineLayout;
+    if ( iOwner ) // submenu
+        {
+        menuLineLayout = AKN_LAYOUT_WINDOW_list_single_popup_submenu_pane( 0, 0 );
+        }
+    else
+        {
+        menuLineLayout = AKN_LAYOUT_WINDOW_list_single_popup_menu_pane( 0 );
+        }
+    TRect windowRect = Rect();
+    TAknLayoutRect menuLayoutRect;
+    menuLayoutRect.LayoutRect( windowRect, menuLineLayout );
+    iItemHeight = menuLayoutRect.Rect().Height();
 
     CheckCreateScrollerL();
     CheckCreateExtensionL();
@@ -2266,20 +2775,7 @@
         iEditMenuObserver->DynInitMenuPaneL( aCascadeMenuId, iCascadeMenuPane );
         }
 
-    if ( iExtension->iFlags.IsSet( CEikMenuPaneExtension::EHideMarkAndUnmark ) )
-        {
-        TInt pos; 
-        if ( iCascadeMenuPane->MenuItemExists( EAknCmdMark, pos ) ) 
-            {
-            iCascadeMenuPane->SetItemDimmed( EAknCmdMark, ETrue ); 
-            }
-        if ( iCascadeMenuPane->MenuItemExists( EAknCmdUnmark, pos ) ) 
-            {
-            iCascadeMenuPane->SetItemDimmed( EAknCmdUnmark, ETrue ); 
-            } 
-        }
-    
-    iCascadeMenuPane->iExtension->PrepareCascadeForItemCommandsL();
+    iCascadeMenuPane->iExtension->PrepareCascadeForItemCommands();
     iCascadeMenuPane->iExtension->EnableHighlight( EFalse );
     iCascadeMenuPane->FilterDimmedItems();
 
@@ -2293,13 +2789,16 @@
         iExtension->StartCascadeMenuAppearTransition();
         }
 
-    TTouchLogicalFeedback fbLogicalType = ETouchFeedbackPopUp;
-    if ( CAknTransitionUtils::TransitionsEnabled( AknTransEffect::EComponentTransitionsOff ) )
-        {
-        fbLogicalType = ETouchFeedbackSubMenuOpened;
-        }
-    iExtension->ImmediateFeedback( fbLogicalType,
+    if( AknLayoutUtils::PenEnabled() )
+        {
+        TTouchLogicalFeedback fbLogicalType = ETouchFeedbackPopUp;
+        if ( CAknTransitionUtils::TransitionsEnabled( AknTransEffect::EComponentTransitionsOff ) )
+            {
+            fbLogicalType = ETouchFeedbackPopupOpen;
+            }
+        iExtension->ImmediateFeedback( fbLogicalType,
                                        ETouchFeedbackVibra );
+        }
     _AKNTRACE_FUNC_EXIT;
     }
 
@@ -2320,11 +2819,16 @@
         numItemsInPane = iItemArray->Count();
         }
 
-    if ( iExtension && iExtension->iSct )
+    if ( iExtension->iSct )
         {
         numItemsInPane++;
         }
 
+    TInt maxNumItemsInMenu = AknLayoutScalable_Avkon::
+                    list_single_pane_cp2_ParamLimits().LastRow() + 1;
+    TInt maxNumItemsInSubMenu = AknLayoutScalable_Avkon::
+                    list_single_popup_submenu_pane_ParamLimits().LastRow() + 1;
+
     TInt maxItemsInView = NumberOfItemsThatFitInView();
 
     if (iExtension && iExtension->iSct)
@@ -2362,6 +2866,12 @@
 
     iExtension->iPressedDown = EFalse;
     iExtension->SetOffset( 0 );
+    iExtension->iHasIcon = MenuHasIcon();
+
+    if ( iExtension->iTransitionsOn )
+        {
+        CAknTransitionUtils::SetAllParents( this );
+        }
 
     const TSize screenSize( iEikonEnv->EikAppUi()->ApplicationRect().Size() );
 
@@ -2382,7 +2892,11 @@
         SetDefaultHighlight();
         }    
 
-    SetRect( CalculateSizeAndPosition() );
+    TRect rect( CalculateSizeAndPosition() );
+    TPoint newPos( rect.iTl );
+    TSize menuSize( rect.Size() );
+
+    SetExtent( newPos, menuSize );
 
     // We need to set the background context when calling create for the
     // first time. Otherwise iExtension->iBgContext would have tiny
@@ -2390,6 +2904,15 @@
     // white.
     UpdateBackgroundContext( Rect() );
 
+    // The extent has been set. This is the first safe point in code to
+    // construct animations (because before this highlight related layout code
+    // will produce invalid results
+    if( iExtension )
+        {
+        // Creates animation only if it does not exist
+        iExtension->CreateAnimation();        
+        }
+        
     // Initialize physics engine
     TRAP_IGNORE ( iExtension->InitPhysicsL() );
         
@@ -2444,6 +2967,8 @@
     TAknsItemID frameIID;
     TAknsItemID frameCenterIID;
     
+    TRect backgroundRect( iExtension->GetBackgroundRect( aWindowRect ) );     
+        
     if( iOwner ) //for sub menu
         {
         topLeft.LayoutRect( aWindowRect, SkinLayout::Submenu_skin_placing_Line_2() );
@@ -2453,8 +2978,8 @@
         }
     else
         {
-        topLeft.LayoutRect( aWindowRect, SkinLayout::Popup_windows_skin_placing__frame_general__Line_2() );
-        bottomRight.LayoutRect( aWindowRect, SkinLayout::Popup_windows_skin_placing__frame_general__Line_5() );
+        topLeft.LayoutRect( backgroundRect, SkinLayout::Popup_windows_skin_placing__frame_general__Line_2() );
+        bottomRight.LayoutRect( backgroundRect, SkinLayout::Popup_windows_skin_placing__frame_general__Line_5() );
         frameIID = KAknsIIDQsnFrPopup;
         frameCenterIID = KAknsIIDQsnFrPopupCenterMenu;
         }
@@ -2514,8 +3039,22 @@
     _AKNTRACE( "previousTopItem =  %d", previousTopItem );
     _AKNTRACE( "previousSelectedItem =  %d", previousSelectedItem );
 
-    SetSelectedItem( aNewSelectedItem );
-
+    ActivateGc();
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+    MAknListBoxTfxInternal *transApi = CAknListLoader::TfxApiInternal( iExtension->iGc );
+    if ( transApi )
+        {
+        iExtension->iGc->Activate( *DrawableWindow() );
+        }
+    CWindowGc& gc = transApi ? *iExtension->iGc : SystemGc();
+#else
+    CWindowGc& gc =  SystemGc();
+#endif // RD_UI_TRANSITION_EFFECTS_LIST
+    PrepareGcForDrawingItems( gc );
+
+    // Scrollers top item index must be updated first because setting selected
+    // item results in animation redraw (which requires knowledge about the
+    // current top item).
     if ( aNewSelectedItem >= 0 )
         {
         ScrollToMakeItemVisible( aNewSelectedItem );
@@ -2525,10 +3064,6 @@
         ScrollToMakeItemVisible( 0 );
         }
 
-    ActivateGc();
-    CWindowGc& gc =  SystemGc();
-    PrepareGcForDrawingItems( gc );
-    
     TInt topItem = iScroller->TopItemIndex();
     TInt bottomItem = topItem + NumberOfItemsThatFitInView();
     if( bottomItem > NumberOfItemsInPane() )
@@ -2544,25 +3079,54 @@
         DrawItem( gc, topItem, ERemoveHighlight );
         DrawItem( gc, (bottomItem-1), ERemoveHighlight );
         }
+    SetSelectedItem( aNewSelectedItem );
 
     PrepareHighlightFrame();
 
     if ( previousTopItem == topItem  && aNewSelectedItem >= 0 )
         {
         // then only previuosly and currently selected items should be redrawn
-        if ( iExtension->iHighlightedItem != KErrNotFound )
-            {
-            DrawItem( gc, previousSelectedItem, ERemoveHighlight );
-            }
+        DrawItem( gc, previousSelectedItem, ERemoveHighlight );
 
         if ( !iExtension->iSctHighlighted )
             {
             DrawItem( gc, aNewSelectedItem, EDrawHighlight );
             }
         }
-
+    else
+        {
+        TBool skipHighlight = EFalse;
+        if (iExtension && iExtension->iSct && aNewSelectedItem == 0 &&
+            previousSelectedItem > 1)
+            {
+            skipHighlight = ETrue;
+            }
+        for( TInt i = topItem; i<bottomItem; i++ )
+            {
+            if( i == aNewSelectedItem && !skipHighlight)
+                {
+                DrawItem( gc, i, EDrawHighlight );
+                }
+            else
+                {
+                DrawItem( gc, i, ERemoveHighlight );
+                }
+            }
+        }
+
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+    if ( transApi )
+        {
+        iExtension->iGc->Deactivate();
+        }
+#endif // RD_UI_TRANSITION_EFFECTS_LIST
     DeactivateGc();
+
+    UpdateScrollBarThumbs();
     
+    // Updating view position here prevents some flickering
+    iExtension->ViewPositionChanged( iExtension->iViewPosition );   
+
     _AKNTRACE_FUNC_EXIT;
     }
 
@@ -2572,15 +3136,177 @@
 //
 void CEikMenuPane::PrepareGcForDrawingItems(CGraphicsContext& aGc) const
     {
+
     // BIDI
     /*
      * get the fonts from the LAF!
      * Do we need to get them here? - nope - moved to DrawItem()
      */    
-    aGc.SetPenColor( iEikonEnv->ControlColor( EColorMenuPaneText, *this) );
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+    MAknListBoxTfxInternal* transApi = CAknListLoader::TfxApiInternal( iExtension->iGc );
+    if ( transApi )
+        {
+        transApi->StartDrawing( MAknListBoxTfxInternal::EListNotSpecified );
+        }
+#endif
+
+    aGc.SetPenColor(iEikonEnv->ControlColor( EColorMenuPaneText, *this) );
+#if defined(MENU_TEXTURED_BACKGROUND)
+    iEikonEnv->SetTexturedBrush( aGc );
+#else
     aGc.SetBrushStyle( CGraphicsContext::ESolidBrush );
     aGc.SetBrushColor( iEikonEnv->ControlColor( EColorMenuPaneBackground,*this ) );
-    }
+#endif
+
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+    if ( transApi )
+        {
+        transApi->StopDrawing();
+        }
+#endif
+    }
+
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+/**
+ * Iterate through the visible items in a menu and calculate minimum 
+ * item margins that dont need drawing.
+ */
+void CEikMenuPaneExtension::CalcItemSize( MAknListBoxTfxInternal* transApi ) const
+    {
+    if ( transApi && iControl->iItemArray && iControl->iItemArray->Count() )
+        {
+        TRect marginRect(TRect::EUninitialized);
+        const TInt index = 0;
+
+        // Specifies whether the text should be moved to give some space for icon.
+        TInt hasIcon = iControl->MenuHasIcon() ? 1 : 0;
+
+        TAknWindowLineLayout menuPane( AKN_LAYOUT_WINDOW_list_menu_pane( 0 , 0 ) );
+        TAknWindowLineLayout singleMenuPane(
+                        AKN_LAYOUT_WINDOW_list_single_popup_menu_pane( index ) );
+        TAknTextLineLayout menuTextLayout(
+                        AKN_LAYOUT_TEXT_List_pane_texts__menu_single__Line_1(0) );
+        
+        TAknLayoutRect menuPaneRect;
+        TAknLayoutRect singleMenuPaneRect;
+        TAknLayoutText textRect;
+        
+        TBool hasCascade = EFalse;
+        TBool hasNonCascade = EFalse;
+        
+        // number of items in the whole menu
+        for(TInt i = 0; i < iControl->iItemArray->Count(); i++)
+            {
+            CEikMenuPaneItem* item = (*iControl->iItemArray)[i];
+            
+            // true if a cascade symbol must be drawn (main menu only)
+            TBool cascade = item->iData.iCascadeId != 0;
+            
+            if ( cascade )
+                {
+                if ( hasCascade )
+                    {
+                    if ( hasNonCascade )
+                        {
+                        break;
+                        }
+                    continue;
+                    }
+                hasCascade = ETrue;
+                }
+            else
+                {
+                if ( hasNonCascade )
+                    {
+                    if ( hasCascade )
+                        {
+                        break;
+                        }
+                    continue;
+                    }
+                hasNonCascade = ETrue;
+                }
+    
+            if ( !iControl->iOwner )
+                {
+                TAknWindowLineLayout listScrollPaneLayout( 
+                    AknLayoutScalable_Avkon::listscroll_menu_pane(0).LayoutLine() );
+                AdjustPopupLayoutData( listScrollPaneLayout );                 
+                TAknLayoutRect listScrollPaneRect;
+                listScrollPaneRect.LayoutRect( iControl->Rect(), listScrollPaneLayout );
+    
+                menuPane = AknLayoutScalable_Avkon::list_menu_pane( 0 ).LayoutLine();
+                menuPaneRect.LayoutRect( listScrollPaneRect.Rect(), menuPane );
+    
+                singleMenuPane = AknLayoutScalable_Avkon::list_single_pane_cp2( index ).LayoutLine();
+                singleMenuPaneRect.LayoutRect( menuPaneRect.Rect(), singleMenuPane );
+    
+                menuTextLayout = AknLayoutScalable_Avkon::list_single_pane_t1_cp2( cascade ? 3 : 0 ).LayoutLine();
+                }
+            else // Submenu
+                {
+                TBool hasDoubleSpanScrollBar = EFalse;
+                if ( iControl->iOwner && iControl->iSBFrame && 
+                        iControl->iSBFrame->VScrollBarVisibility() )
+                    {
+                    hasDoubleSpanScrollBar = ETrue;
+                    }
+                TAknWindowLineLayout listScrollPaneLayout( AknLayoutScalable_Avkon::listscroll_popup_sub_pane().LayoutLine() );
+                TAknLayoutRect listScrollPaneRect;
+                listScrollPaneRect.LayoutRect( iControl->Rect(), listScrollPaneLayout );
+    
+                menuPane = AknLayoutScalable_Avkon::list_submenu_pane( !hasDoubleSpanScrollBar ).LayoutLine();
+                menuPaneRect.LayoutRect( listScrollPaneRect.Rect(), menuPane );
+    
+                singleMenuPane = AknLayoutScalable_Avkon::list_single_popup_submenu_pane( index ).LayoutLine();
+                singleMenuPaneRect.LayoutRect( menuPaneRect.Rect(), singleMenuPane );
+    
+                menuTextLayout = TAknTextLineLayout( AknLayoutScalable_Avkon::list_single_popup_submenu_pane_t1( hasIcon ).LayoutLine() );
+                }
+            
+            textRect.LayoutText( singleMenuPaneRect.Rect(), menuTextLayout );
+            if (marginRect == TRect::EUninitialized) 
+                {
+                marginRect = textRect.TextRect();
+                }
+            else
+                {
+                marginRect.BoundingRect(textRect.TextRect());
+                }
+            
+            if ( cascade )
+                {
+                TAknWindowLineLayout elementCascade( AknLayoutScalable_Avkon::list_single_pane_cp2_g3().LayoutLine());
+                TAknLayoutRect cascadeRect;
+                cascadeRect.LayoutRect( singleMenuPaneRect.Rect(), elementCascade );
+                marginRect.BoundingRect(cascadeRect.Rect());
+                }
+            else
+                {
+                TAknLayoutRect activeApplicationsIconRect;
+                activeApplicationsIconRect.LayoutRect( singleMenuPaneRect.Rect(),
+                    AknLayoutScalable_Avkon::list_single_pane_g1_cp2(0).LayoutLine() );
+                marginRect.BoundingRect(activeApplicationsIconRect.Rect());
+                }
+            }
+
+        if ( hasIcon )
+            {
+            TAknLayoutRect iconLayoutRect;
+            iconLayoutRect.LayoutRect( singleMenuPaneRect.Rect(),
+                AknLayoutScalable_Avkon::list_single_popup_submenu_pane_g1().LayoutLine() );
+            marginRect.BoundingRect(iconLayoutRect.Rect());
+            }
+
+        //send margins to tfx
+        TPoint tl ( marginRect.iTl - menuPaneRect.Rect().iTl );
+        transApi->SetPosition( MAknListBoxTfxInternal::EListTLMargin, tl );
+        
+        TPoint br( singleMenuPaneRect.Rect().Size().AsPoint() - marginRect.iBr + menuPaneRect.Rect().iTl );
+        transApi->SetPosition( MAknListBoxTfxInternal::EListBRMargin, br );
+        }
+    }
+#endif
 
 
 // ---------------------------------------------------------------------------
@@ -2590,9 +3316,28 @@
 void CEikMenuPane::DrawItem( TInt aItem, THighlightType aHighlight ) const
     {
     ActivateGc();
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+    MAknListBoxTfxInternal* transApi = 
+        CAknListLoader::TfxApiInternal( iExtension->iGc );
+
+    if ( transApi )
+        {
+        iExtension->iGc->Activate( *DrawableWindow() );
+        }
+    
+    CWindowGc& gc = transApi ? *iExtension->iGc : SystemGc();
+#else
     CWindowGc& gc = SystemGc();
+#endif // RD_UI_TRANSITION_EFFECTS_LIST
     PrepareGcForDrawingItems( gc );
     DrawItem( gc, aItem, aHighlight );
+    
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+    if ( transApi )
+        {
+        iExtension->iGc->Deactivate();
+        }
+#endif // RD_UI_TRANSITION_EFFECTS_LIST
     DeactivateGc();
     }
 
@@ -2618,6 +3363,14 @@
         return;
         }
     
+    // seem to have window owning control in correct place
+    TRect windowRect = Rect();
+
+    if ( !iOwner )
+        {
+        windowRect.iBr.iY -= ( iExtension->iCba->Rect().Height() );    
+        }
+    
     CEikMenuPaneItem* item = (*iItemArray)[aItem];
     // Max visible number of items in menu / submenu
     TInt maxNumberOfItems = NumberOfItemsThatFitInView();
@@ -2651,15 +3404,12 @@
         index += itemLeftInBottom;
         }
 
-    TBool drawSeparator = !( ( index + topIndex ) == numItemsInArray - 1 );
-    TBool drawPartialItem = EFalse;
-    
+    TBool drawPartialItem(EFalse);
     if ( index == maxNumberOfItems )
         {
         // We have partial items to draw because of panning so there
         // is one more item to draw than normally.
         drawPartialItem = ETrue;
-        
         // There is no layout data for the extra item, so we used the one
         // above it. 
         --index;
@@ -2671,32 +3421,58 @@
         return;  // only interested in drawing visible items
         }
 
-    TAknTextLineLayout menuTextLayout;
+    // Collect all of the information from the Layout DLL. Initialise these
+    // variables with DUMMY data. Then replace it with menu/submenu data.
+    TAknWindowLineLayout menuPane( AKN_LAYOUT_WINDOW_list_menu_pane( 0 , 0 ) );
+    TAknWindowLineLayout singleMenuPane(
+                    AKN_LAYOUT_WINDOW_list_single_popup_menu_pane( index ) );
+    TAknTextLineLayout menuTextLayout(
+                    AKN_LAYOUT_TEXT_List_pane_texts__menu_single__Line_1(0) );
+    TAknLayoutRect menuPaneRect;
     TAknLayoutRect singleMenuPaneRect;
 
-    if ( !iOwner ) // main menu
-        {
-        singleMenuPaneRect.LayoutRect( iExtension->iItemAreaRect,
-            AknLayoutScalable_Avkon::list_single_pane_cp2( index ).LayoutLine() );
-        menuTextLayout = 
-            AknLayoutScalable_Avkon::list_single_pane_t1_cp2( cascade ? 1 : 0 ).LayoutLine();
-        }
-    else // submenu
-        {
-        singleMenuPaneRect.LayoutRect( iExtension->iItemAreaRect,
-            AknLayoutScalable_Avkon::list_single_popup_submenu_pane( index ).LayoutLine() );
-        
+    if ( !iOwner )
+        {
+        TAknWindowLineLayout listScrollPaneLayout( 
+            AknLayoutScalable_Avkon::listscroll_menu_pane(0).LayoutLine() );
+        if ( iExtension )
+            {
+            iExtension->AdjustPopupLayoutData( listScrollPaneLayout );
+            }        
+        TAknLayoutRect listScrollPaneRect;
+        listScrollPaneRect.LayoutRect( windowRect, listScrollPaneLayout );
+
+        menuPane = AknLayoutScalable_Avkon::list_menu_pane( 0 ).LayoutLine();
+        menuPaneRect.LayoutRect( listScrollPaneRect.Rect(), menuPane );
+
+        singleMenuPane = AknLayoutScalable_Avkon::list_single_pane_cp2( index ).LayoutLine();
+        singleMenuPaneRect.LayoutRect( menuPaneRect.Rect(), singleMenuPane );
+
+        menuTextLayout = AknLayoutScalable_Avkon::list_single_pane_t1_cp2( cascade ? 3 : 0 ).LayoutLine();
+        }
+    else // Submenu
+        {
+        TBool hasDoubleSpanScrollBar = EFalse;
+        if ( iSBFrame && iSBFrame->VScrollBarVisibility() )
+            {
+            hasDoubleSpanScrollBar = ETrue;
+            }
+
+        TAknWindowLineLayout listScrollPaneLayout( AknLayoutScalable_Avkon::listscroll_popup_sub_pane().LayoutLine() );
+        TAknLayoutRect listScrollPaneRect;
+        listScrollPaneRect.LayoutRect( windowRect, listScrollPaneLayout );
+
+        menuPane = AknLayoutScalable_Avkon::list_submenu_pane( !hasDoubleSpanScrollBar ).LayoutLine();
+        menuPaneRect.LayoutRect( listScrollPaneRect.Rect(), menuPane );
+
+        singleMenuPane = AknLayoutScalable_Avkon::list_single_popup_submenu_pane( index ).LayoutLine();
+        singleMenuPaneRect.LayoutRect( menuPaneRect.Rect(), singleMenuPane );
+
+        menuTextLayout = TAknTextLineLayout( AknLayoutScalable_Avkon::list_single_popup_submenu_pane_t1( 0 ).LayoutLine() );
+
         if ( hasIcon )
             {
-            menuTextLayout = 
-                TAknTextLineLayout( 
-                AknLayoutScalable_Avkon::list_single_popup_submenu_pane_t1( 1 ).LayoutLine() );
-            }
-        else
-            {
-            menuTextLayout = 
-                TAknTextLineLayout( 
-                AknLayoutScalable_Avkon::list_single_popup_submenu_pane_t1( 0 ).LayoutLine() );
+            menuTextLayout = TAknTextLineLayout( AknLayoutScalable_Avkon::list_single_popup_submenu_pane_t1( 1 ).LayoutLine() );
             }
         }
 
@@ -2716,17 +3492,21 @@
 
     RWindow& window = Window();
     
-   if ( &window && window.GetDrawRect() == TRect::EUninitialized )
-        {
+    if ( &window && window.GetDrawRect() == TRect::EUninitialized )
+        {
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+        MAknListBoxTfxInternal* transApi =
+            CAknListLoader::TfxApiInternal( &aGc );
+        drawingInitiated = transApi && !transApi->EffectsDisabled();
+#else
         drawingInitiated = EFalse;
-        }
-
-    if ( !drawingInitiated && !iExtension->iFullRedraw )
-        {
-        TRect drawRect( itemRect ); 
-        drawRect.Intersection( iExtension->iItemAreaRect );
-        window.Invalidate( drawRect );
-        window.BeginRedraw( drawRect );
+#endif
+        }
+
+    if ( !drawingInitiated )
+        {
+        window.Invalidate( itemRect );
+        window.BeginRedraw( itemRect );
         }
 
     MAknsSkinInstance* skin = AknsUtils::SkinInstance();
@@ -2736,70 +3516,136 @@
         cc = iExtension->iBgContext;
         }
     TBool background( ETrue );
-
-    aGc.SetBrushStyle( CGraphicsContext::ESolidBrush );
-    aGc.SetBrushColor( singleMenuPaneRect.Color() );
-
-    // there can be partial items, so clip drawing on menu pane's item area
-    aGc.SetClippingRect( iExtension->iItemAreaRect );
-
-    if (!iExtension->iFullRedraw)
-        {
-        background = AknsDrawUtils::Background(
-            skin, cc, this, aGc, itemRect,
-            KAknsDrawParamNoClearUnderImage );
-        }
-
-    if ( !background )
-        {
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+    MAknListBoxTfxInternal *transApi = CAknListLoader::TfxApiInternal( &aGc );
+    if ( transApi && !transApi->EffectsDisabled() )
+        {
+        iExtension->iGc->Activate( *DrawableWindow() );
+        }
+#endif
+
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST            
+    if ( !transApi || transApi->EffectsDisabled() )
+        {
+#endif                
         aGc.SetBrushStyle( CGraphicsContext::ESolidBrush );
-        aGc.SetPenStyle( CGraphicsContext::ENullPen );
-        aGc.SetPenColor( singleMenuPaneRect.Color() );
-        aGc.SetBrushColor( singleMenuPaneRect.Color() );         
-        aGc.DrawRect( itemRect );
-        }
+        aGc.SetBrushColor( singleMenuPaneRect.Color() );
+
+        if(!iExtension->iFullRedraw)
+            {
+            background = AknsDrawUtils::Background(
+                skin, cc, this, aGc, itemRect,
+                KAknsDrawParamNoClearUnderImage );
+            }
+
+        if( !background )
+            {
+            aGc.SetBrushStyle( CGraphicsContext::ESolidBrush );
+            aGc.SetPenStyle( CGraphicsContext::ENullPen );
+            aGc.SetPenColor( singleMenuPaneRect.Color() );
+            aGc.SetBrushColor( singleMenuPaneRect.Color() );         
+            aGc.DrawRect( itemRect );
+            }
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST            
+        }
+#endif
 
     if ( !iExtension->HighlightEnabled() )
         {
         aHighlight = ENoHighlight;
         }
-    
+
     switch ( aHighlight )
         {
         case EDrawHighlight :
             {
             if ( !iExtension->iSctHighlighted )
                 {
-                iExtension->iHighlightedItem = aItem;
-
-                // Because of transparency, background must be drawn here as well
-                // (as frame may be see-through)
-                aGc.SetBrushStyle( CGraphicsContext::ESolidBrush );
-                aGc.SetBrushColor( singleMenuPaneRect.Color() );
-
-                AknsDrawUtils::Background(
-                    skin, cc, this, aGc, itemRect,
-                    KAknsDrawParamNoClearUnderImage );
-
-                TAknLayoutRect highlightTopLeft;
-                TAknLayoutRect highlightBottomRight;
-
-                highlightTopLeft.LayoutRect(itemRect,
-                    SkinLayout::List_highlight_skin_placing__popup_windows__Line_2() );
-                highlightBottomRight.LayoutRect(itemRect,
-                    SkinLayout::List_highlight_skin_placing__popup_windows__Line_5() );
-                TRect outerRect( highlightTopLeft.Rect().iTl, highlightBottomRight.Rect().iBr );
-                TRect innerRect( highlightTopLeft.Rect().iBr, highlightBottomRight.Rect().iTl );
-
-                TBool drawOk = AknsDrawUtils::DrawFrame( skin,
-                        aGc, 
-                        outerRect, 
-                        innerRect, 
-                        KAknsIIDQsnFrList, 
-                        KAknsIIDDefault );
-
-                // skinned highlight drawing has failed
-                if ( !drawOk )
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST                
+                if ( transApi )
+                    {
+                    // This will remove the old bitmap
+                    transApi->Invalidate( MAknListBoxTfxInternal::EListHighlight ); 
+                                       
+                    transApi->BeginRedraw( MAknListBoxTfxInternal::EListHighlight,
+                                           itemRect );                                           
+                    transApi->StartDrawing( MAknListBoxTfxInternal::EListHighlight );
+                    }
+#endif
+
+                // Partial items, so prevent drawing over the edge of menu pane
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+                if ( !transApi || ( transApi && transApi->EffectsDisabled() ) )
+                    {
+                    aGc.SetClippingRect(menuPaneRect.Rect());
+                    }
+#else
+                aGc.SetClippingRect(menuPaneRect.Rect());
+#endif // RD_UI_TRANSITION_EFFECTS_LIST
+
+                TBool drawOk = EFalse;
+                if( iExtension->iAnimation ) // Draw animated highlight
+                    {
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+                    if ( transApi && transApi->VerifyKml() == KErrNone )
+                        {
+                        Extension()->UseNoAnimation();
+                        }
+                    else
+                        {
+#endif
+                    TAknLayoutRect highlightTopLeft;
+                    TAknLayoutRect highlightBottomRight;
+          
+                    highlightTopLeft.LayoutRect( itemRect,
+                        SkinLayout::List_highlight_skin_placing__popup_windows__Line_2() );
+                    highlightBottomRight.LayoutRect( itemRect,
+                        SkinLayout::List_highlight_skin_placing__popup_windows__Line_5() );
+                       
+                    TRect outerRect( highlightTopLeft.Rect().iTl, highlightBottomRight.Rect().iBr );
+
+                    drawOk = iExtension->iAnimation->Render( aGc, outerRect );
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+                        }
+#endif
+                    }
+                
+                if( !drawOk )
+                    {
+                    // Animated highlight was not available, use normal skinned
+                    // rendering.
+
+                    // Because of transparency, background must be drawn here as well
+                    // (as frame may be see-through)
+                    aGc.SetBrushStyle( CGraphicsContext::ESolidBrush );
+                    aGc.SetBrushColor( singleMenuPaneRect.Color() );
+
+                    AknsDrawUtils::Background(
+                        skin, cc, this, aGc, itemRect,
+                        KAknsDrawParamNoClearUnderImage );
+
+                    TAknLayoutRect highlightTopLeft;
+                    TAknLayoutRect highlightBottomRight;
+
+                    highlightTopLeft.LayoutRect(itemRect,
+                        SkinLayout::List_highlight_skin_placing__popup_windows__Line_2() );
+                    highlightBottomRight.LayoutRect(itemRect,
+                        SkinLayout::List_highlight_skin_placing__popup_windows__Line_5() );
+                    TRect outerRect( highlightTopLeft.Rect().iTl, highlightBottomRight.Rect().iBr );
+                    TRect innerRect( highlightTopLeft.Rect().iBr, highlightBottomRight.Rect().iTl );
+
+                    drawOk = AknsDrawUtils::DrawFrame( skin, 
+                                                       aGc, 
+                                                       outerRect, 
+                                                       innerRect, 
+                                                       KAknsIIDQsnFrList, 
+                                                       KAknsIIDDefault );
+                    
+                    }
+
+                // Both animated highlight and normal highlight drawing have
+                // failed.
+                if( !drawOk )
                     {
                     TAknLayoutRect shadowRect;
                     TAknLayoutRect highlightRect;
@@ -2811,18 +3657,41 @@
                     shadowRect.DrawRect( aGc );
                     highlightRect.DrawRect( aGc );
                     }
+
+                aGc.CancelClippingRect();
+
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+                if ( transApi )
+                    {
+                    transApi->StopDrawing();
+                    transApi->EndRedraw( MAknListBoxTfxInternal::EListHighlight );
+                    }
+#endif
                 }
             break;
             }
         case ERemoveHighlight:
         case ENoHighlight:
-            if ( iExtension->iHighlightedItem == aItem )
-                {
-                iExtension->iHighlightedItem = KErrNotFound;
-                }
         default:
             break;
         }
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+    if ( transApi )
+        {
+        transApi->BeginRedraw( MAknListBoxTfxInternal::EListItem, itemRect, aItem );
+        transApi->StartDrawing( MAknListBoxTfxInternal::EListItem );
+        }
+#endif // RD_UI_TRANSITION_EFFECTS_LIST
+
+    // Partial items, so prevent drawing over the edge of menu pane
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+    if ( !transApi || ( transApi && transApi->EffectsDisabled() ) )
+        {
+        aGc.SetClippingRect(menuPaneRect.Rect());
+        }
+#else
+    aGc.SetClippingRect(menuPaneRect.Rect());
+#endif // RD_UI_TRANSITION_EFFECTS_LIST
 
     // Cascade
     if ( cascade )
@@ -2835,18 +3704,13 @@
             skin->GetCachedItemData( KAknsIIDQgnIndiSubmenu, EAknsITMaskedBitmap ) );
         if( itemData )
             {
-            AknIconUtils::SetSize( itemData->Bitmap(),cascadeRect.Rect().Size() );
             aGc.BitBltMasked( cascadeRect.Rect().iTl, itemData->Bitmap(),
                 cascadeRect.Rect().Size(), itemData->Mask(), ETrue );
             }
         else
             {
-            if ( iExtension->iCascadeBitmap && iExtension->iCascadeBitmapMask )
-               {
-               AknIconUtils::SetSize( iExtension->iCascadeBitmap,cascadeRect.Rect().Size() );
-               aGc.BitBltMasked( cascadeRect.Rect().iTl, iExtension->iCascadeBitmap,
-                   cascadeRect.Rect().Size(), iExtension->iCascadeBitmapMask, ETrue );
-               }
+            aGc.BitBltMasked( cascadeRect.Rect().iTl, iExtension->iCascadeBitmap,
+                cascadeRect.Rect().Size(), iExtension->iCascadeBitmapMask, ETrue );
             }
         }
     else
@@ -2922,10 +3786,8 @@
         }
 
     // Text
-    TAknLayoutText textRect;
-    textRect.LayoutText( itemRect, menuTextLayout );
+    TAknLayoutText textRect( iExtension->GetMenuItemTextLayout( itemRect, cascade ) );
     TRgb textColor = textRect.Color();
-
     if ( aHighlight == EDrawHighlight ) // highlighted text
         {
         AknsUtils::GetCachedColor( skin, textColor, KAknsIIDQsnTextColors, EAknsCIQsnTextColorsCG10 );
@@ -2957,6 +3819,7 @@
        }
     aGc.SetBrushStyle( CGraphicsContext::ENullBrush );
     aGc.SetPenColor( textColor );
+    aGc.UseFont( textRect.Font() );
 
     const CFont* font = textRect.Font();
 
@@ -2983,26 +3846,33 @@
         iExtension->iCascadeDRect.SetRect( cascRect.iTl, cascRect.iBr );        
         }
 
-    TAknLayoutRect highlightRect;
-    highlightRect.LayoutRect( itemRect,
-        AKN_LAYOUT_WINDOW_Highlight_graphics__various__Line_2( itemRect ) );
-
-    // store the calculated y-position to the menu item,
-    // so that it can be used in HandlePointerEventL()
-    item->iPos = highlightRect.Rect().iTl.iY;
-    
-    // don't draw separator line for the last item
-    if ( drawSeparator )
-        {
-        AknListUtils::DrawSeparator( aGc, itemRect, textColor, skin );
-        }
-    
-    if ( !drawingInitiated && !iExtension->iFullRedraw )
+    if(iExtension->iIsPenEnable)
+        {
+        TAknLayoutRect highlightRect;
+        highlightRect.LayoutRect( itemRect,
+            AKN_LAYOUT_WINDOW_Highlight_graphics__various__Line_2( itemRect ) );
+
+        // store the calculated y-position to the menu item,
+        // so that it can be used in HandlePointerEventL()
+        item->iPos = highlightRect.Rect().iTl.iY;
+        aGc.DiscardFont();
+        }
+
+    if ( !drawingInitiated )
         {
         Window().EndRedraw();
         }
 
     aGc.CancelClippingRect();
+
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+    if ( transApi && !transApi->EffectsDisabled() )
+        {
+        transApi->StopDrawing();
+        transApi->EndRedraw( MAknListBoxTfxInternal::EListItem, aItem );
+        iExtension->iGc->Deactivate();
+        }
+#endif // RD_UI_TRANSITION_EFFECTS_LIST
     }
 
 
@@ -3010,8 +3880,36 @@
 // CEikMenuPane::Draw
 // -----------------------------------------------------------------------------
 //
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
 EXPORT_C void CEikMenuPane::Draw( const TRect& aRect ) const
     {
+    CWindowGc& gc = ( iExtension && iExtension->iGc ) ?
+                    *iExtension->iGc : SystemGc();
+    MAknListBoxTfxInternal *transApi = CAknListLoader::TfxApiInternal( &gc );
+
+    if ( transApi )
+        {
+        iExtension->iGc->Activate( *DrawableWindow() );
+        
+        if ( !transApi->EffectsDisabled() )
+            {
+            if ( iExtension->iScrollBarRect.iTl.iX <= aRect.iTl.iX &&
+                 iExtension->iScrollBarRect.iBr.iX >= aRect.iBr.iX )
+                {
+                transApi->BeginRedraw( MAknListBoxTfxInternal::EListUpdateRect, aRect );
+                iExtension->iGc->Deactivate();
+                return;
+                }
+        
+            iExtension->CalcItemSize( transApi );
+            }
+        }
+#else
+EXPORT_C void CEikMenuPane::Draw(const TRect& /*aRect*/) const
+    {
+#endif // RD_UI_TRANSITION_EFFECTS_LIST
+
+    TRect windowRect( Rect() );
     MAknsSkinInstance* skin = AknsUtils::SkinInstance();
     MAknsControlContext* cc = NULL;
 
@@ -3020,11 +3918,37 @@
         cc = iExtension->iBgContext;
         }
 
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+    if ( transApi )
+        {
+        transApi->SetListType( MAknListBoxTfxInternal::EListBoxTypeMenuPane );
+        transApi->BeginRedraw( MAknListBoxTfxInternal::EListView, windowRect );
+        }
+#else
     CWindowGc& gc = SystemGc();
+#endif // RD_UI_TRANSITION_EFFECTS_LIST
     PrepareGcForDrawingItems( gc );
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+    if ( transApi )
+        {
+        transApi->StartDrawing( MAknListBoxTfxInternal::EListView );
+        }
+#endif
+
+    if ( !IsCascadeMenuPane() )
+        {
+        CFbsBitmap* cbaExtension = AknsUtils::GetCachedBitmap( skin, KAknsIIDQsnBgSlicePopup );
+        if ( cbaExtension )
+            {
+            TAknLayoutRect sliceRect;
+            sliceRect.LayoutRect( windowRect, SkinLayout::Popup_windows_skin_placing__background_slice__Line_2() );
+            AknIconUtils::SetSize( cbaExtension, sliceRect.Rect().Size() );
+            gc.BitBlt( TPoint( windowRect.iTl.iX, windowRect.iBr.iY-cbaExtension->SizeInPixels().iHeight ), cbaExtension );
+            windowRect.iBr.iY -=2; // two used as margin when rect layouts were done
+            }
+        }
 
     TInt count=0;
-
     if( iItemArray )
         {
         count=iItemArray->Count();
@@ -3033,37 +3957,97 @@
     // Give the topmost menu item's rect to SCT if needed.
     if ( iExtension->iSct )
         {
-        iExtension->iSct->SetMenuSctRect( ItemRect( 0 ) );
-
+        TAknLayoutRect listScrollPaneRect;
+        TAknLayoutRect menuPaneRect;
+        TAknLayoutRect singleMenuPaneRect;
+
+        TAknWindowLineLayout listScrollPaneLayout( 
+            AknLayoutScalable_Avkon::listscroll_menu_pane(0).LayoutLine() );
+        if ( iExtension )
+            {
+            iExtension->AdjustPopupLayoutData( listScrollPaneLayout );
+            }
+        listScrollPaneRect.LayoutRect( windowRect, listScrollPaneLayout );
+        menuPaneRect.LayoutRect( listScrollPaneRect.Rect(),
+             AknLayoutScalable_Avkon::list_menu_pane( 0 ).LayoutLine() );
+        singleMenuPaneRect.LayoutRect( menuPaneRect.Rect(),
+             AknLayoutScalable_Avkon::list_single_pane_cp2( 0 ).LayoutLine() );
+        // Give the rect of the first menu item to SCT.
+        iExtension->iSct->SetMenuSctRect( singleMenuPaneRect.Rect() );
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST      
+        if( transApi )
+            {
+            iExtension->iSctRect = singleMenuPaneRect.Rect();
+            TAknLayoutRect cellLayRect;
+            cellLayRect.LayoutRect( iExtension->iSctRect,
+                AknLayoutScalable_Avkon::cell_graphic_popup_pane( 0, 0, 0 ) );
+            iExtension->iSctRect.iTl.iX -= 1;
+            iExtension->iSctRect.iTl.iY -= 1;
+            iExtension->iSctRect.iBr.iX += 3;
+            transApi->ResetNonDrawingRects();
+            transApi->AddNonDrawingRect( iExtension->iScrollBarRect );
+            transApi->AddNonDrawingRect( iExtension->iSctRect );
+            }
+#endif // RD_UI_TRANSITION_EFFECTS_LIST
+        }
+
+    if ( iExtension->iSct )
+        {
         TRegionFix<4> region;
-        region.AddRect( aRect );
+        region.AddRect( Rect() );
         region.SubRect( iExtension->iSct->Rect() );
         gc.SetClippingRegion( region );
         }
         
+    TRect backgroundRect( iOwner ? windowRect : iExtension->GetBackgroundRect( windowRect ) );
+        
     // The added flag removes the white bg for transparency
     TBool frameDrawn = AknsDrawUtils::Background( 
-        skin, cc, this, gc, aRect, KAknsDrawParamNoClearUnderImage );        
-
-    if ( aRect.Intersects( iExtension->iItemAreaRect ) )
-        {
-        iExtension->iFullRedraw = ETrue;   
-    
-        for ( TInt ii=0;ii<count;++ii )
-            {
-            if(!iExtension->iSctHighlighted && ii == iSelectedItem  )
-                DrawItem( gc, ii, EDrawHighlight);
-            else
-                DrawItem( gc, ii, ENoHighlight);
-            }    
-      
-        iExtension->iFullRedraw = EFalse;   
-        }
+        skin, cc, this, gc, backgroundRect, KAknsDrawParamNoClearUnderImage );        
+
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+    if ( transApi )
+        {
+        transApi->StopDrawing();
+        }
+#endif // RD_UI_TRANSITION_EFFECTS_LIST
+
+    iExtension->iFullRedraw = ETrue;   
+
+    for ( TInt ii=0;ii<count;++ii )
+        {
+        if(!iExtension->iSctHighlighted && ii == iSelectedItem  )
+            DrawItem( gc, ii, EDrawHighlight);
+        else
+            DrawItem( gc, ii, ENoHighlight);
+        }    
+  
+    iExtension->iFullRedraw = EFalse;   
 
     if ( iExtension->iSct )
         {
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+        if ( transApi )
+            {
+            transApi->StartDrawing( MAknListBoxTfxInternal::EListNotSpecified );
+            }
+#endif
         gc.CancelClippingRegion();
-        }
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+        if ( transApi )
+            {
+            transApi->StopDrawing();
+            }
+#endif
+        }
+        
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+    if ( transApi )
+        {
+        transApi->EndViewRedraw( aRect );
+        iExtension->iGc->Deactivate();
+        }
+#endif // RD_UI_TRANSITION_EFFECTS_LIST
     }
 
 
@@ -3137,38 +4121,11 @@
         CEikMenuPane* menu = iOwner ? iOwner : this;
         MCoeControlObserver* observer = menu->Observer();
 
-        if ( commandId >= EAknCmdMarkingModeEnter 
-                && commandId <= EAknCmdMarkingModeUnmarkAll )
-            {
-            CEikMenuBar* menuBar = static_cast<CEikMenuBar*>( Parent() );
-            if ( menuBar && menuBar->MenuPane() == this )
-                {
-                static_cast<MEikCommandObserver*>(
-                        menuBar)->ProcessCommandL( commandId );
-                }
-            ReportCanceled();
-            }
-        else if ( commandId != EAknCmdTaskSwapper )
+
+        if ( commandId != EAknCmdTaskSwapper )
             {
             _AKNTRACE( "commandId = %d",  commandId );
-            TBool isDeleted = EFalse;
-            iIsDeleted = &isDeleted;
-            
-            CleanupStack::PushL( TCleanupItem( CleanLocalRef, this ) );            
             iMenuObserver->ProcessCommandL( commandId ); 
-            CleanupStack::Pop();
-
-            if ( !isDeleted )
-                {
-                CEikMenuBar* menuBar = static_cast<CEikMenuBar*>( Parent() );
-                if ( menuBar && menuBar->MenuPane() == this )
-                    {
-                    static_cast<MEikCommandObserver*>(
-                            menuBar)->ProcessCommandL( commandId );
-                    }
-                }            
-
-            iIsDeleted = NULL;
             }
         else
             {
@@ -3202,6 +4159,26 @@
     {
     _AKNTRACE_FUNC_ENTER;
     _AKNTRACE( "aDrawNow =  %d", aDrawNow );
+    if( iExtension )
+        {
+        if ( IsFocused() )
+            {
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST        
+            // Focus must be handled here, otherwise it will come to late
+            MAknListBoxTfxInternal *transApi = CAknListLoader::TfxApiInternal( iExtension->iGc );
+    
+            if ( transApi )
+                {
+                transApi->HandleFocusChange( ETrue );
+                }
+#endif // RD_UI_TRANSITION_EFFECTS_LIST
+            iExtension->FocusGained();
+            }
+        else // Not focused
+            {
+            iExtension->FocusLost();
+            }
+        }
 
     if ( !iItemArray || iItemArray->Count() == 0 )
         {
@@ -3393,52 +4370,74 @@
     TInt itemAfterLastItem = loopScrolling ? 0 : max;
     TInt itemAfterFirstItem = loopScrolling ? max : 0;
 
-    // Scroll highlighted item so that it becomes visible,
-    // if it is not visible before (scrolling with scroll bar
-    // can cause highlighted item to go out of screen)
-    TInt topItem = iScroller->TopItemIndex();
-    TInt bottomItem = topItem + NumberOfItemsThatFitInView();
-          
-    if ( iExtension->Offset() < 0 ) 
-        {
-        // Extra bottom item when panning
-        bottomItem++;
-        }
-    
-    if( bottomItem > NumberOfItemsInPane() )
-        {
-        bottomItem = NumberOfItemsInPane();
-        }
-    _AKNTRACE( "topItem = %d,bottomItem = %d", topItem,bottomItem );
-
-    if ( aType != EEventKeyDown && iSelectedItem != ENothingSelected &&
-        !(iExtension->iSctHighlighted && topItem == 0) &&
-        (iSelectedItem < topItem || iSelectedItem > bottomItem - 1) )
-        {
-        _AKNTRACE( "[%s]", "ScrollToMakeItemVisible(iSelectedItem);" );
-        ScrollToMakeItemVisible(iSelectedItem);
-
-        ActivateGc();
-        CWindowGc& gc = SystemGc();
-        PrepareGcForDrawingItems( gc );
-
-        // draw all items that are needed.
-        for( TInt i = 0; i < count; i++ )
-            {
-            if( i == iSelectedItem && !iExtension->iSctHighlighted)
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+    CWindowGc& gc = iExtension->iGc ? *iExtension->iGc : SystemGc();
+    MAknListBoxTfxInternal* transApi = CAknListLoader::TfxApiInternal( &gc );
+#endif //RD_UI_TRANSITION_EFFECTS_LIST
+
+    if(iExtension->iIsPenEnable)
+        {
+        _AKNTRACE( "[%s]", "iExtension->iIsPenEnable = TRUE" );
+        // Scroll highlighted item so that it becomes visible,
+        // if it is not visible before (scrolling with scroll bar
+        // can cause highlighted item to go out of screen)
+        TInt topItem = iScroller->TopItemIndex();
+        TInt bottomItem = topItem + NumberOfItemsThatFitInView();
+              
+        if ( iExtension->Offset() < 0 ) 
+            {
+            // Extra bottom item when panning
+            bottomItem++;
+            }
+        
+        if( bottomItem > NumberOfItemsInPane() )
+            {
+            bottomItem = NumberOfItemsInPane();
+            }
+        _AKNTRACE( "topItem = %d,bottomItem = %d", topItem,bottomItem );
+
+        if ( aType != EEventKeyDown && iSelectedItem != ENothingSelected &&
+            !(iExtension->iSctHighlighted && topItem == 0) &&
+            (iSelectedItem < topItem || iSelectedItem > bottomItem - 1) )
+            {
+            _AKNTRACE( "[%s]", "ScrollToMakeItemVisible(iSelectedItem);" );
+            ScrollToMakeItemVisible(iSelectedItem);
+
+            ActivateGc();
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+            if ( transApi )
                 {
-                DrawItem( gc, i, EDrawHighlight );
-                }
-            else
-                {
-                DrawItem( gc, i, ERemoveHighlight );
+                iExtension->iGc->Activate( *DrawableWindow() );
                 }
-            }
-
-        DeactivateGc();
-        _AKNTRACE( "[%s]", "OfferKeyEventL return 9" );
-        _AKNTRACE_FUNC_EXIT;
-        return EKeyWasConsumed;
+#else
+            CWindowGc& gc = SystemGc();
+#endif // RD_UI_TRANSITION_EFFECTS_LIST
+            PrepareGcForDrawingItems( gc );
+
+            // draw all items that are needed.
+            for( TInt i = 0; i < count; i++ )
+                {
+                if( i == iSelectedItem && !iExtension->iSctHighlighted)
+                    {
+                    DrawItem( gc, i, EDrawHighlight );
+                    }
+                else
+                    {
+                    DrawItem( gc, i, ERemoveHighlight );
+                    }
+                }
+
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+            if ( transApi )
+                {
+                iExtension->iGc->Deactivate();
+                }
+#endif // RD_UI_TRANSITION_EFFECTS_LIST
+            DeactivateGc();
+            _AKNTRACE( "[%s]", "OfferKeyEventL return 9" );
+            _AKNTRACE_FUNC_EXIT;
+            return EKeyWasConsumed;
+            }
         }
 
     if ( iSelectedItem != ENothingSelected || iExtension->iSctHighlighted )
@@ -3455,6 +4454,13 @@
 // loop scrolling always used in options menus
             case EKeyDownArrow:
             	_AKNTRACE( "[%s]", "OfferKeyEventL(EKeyDownArrow)" );
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+                if ( transApi )
+                    {
+                    transApi->SetMoveType(
+                            MAknListBoxTfxInternal::EListMoveDown );
+                    }
+#endif //RD_UI_TRANSITION_EFFECTS_LIST
                 if ( iExtension->iSctHighlighted && iExtension->iSct )
                     {
                     iExtension->iSctHighlighted = EFalse;
@@ -3480,6 +4486,13 @@
                 break;
             case EKeyUpArrow:
             	_AKNTRACE( "[%s]", "OfferKeyEventL(EKeyUpArrow)" );
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+                if ( transApi )
+                    {
+                    transApi->SetMoveType(
+                            MAknListBoxTfxInternal::EListMoveUp );
+                    }
+#endif //RD_UI_TRANSITION_EFFECTS_LIST
                 if ( iExtension->iSct &&
                     iSelectedItem == 0 && !iExtension->iSctHighlighted )
                     {
@@ -3682,72 +4695,100 @@
         
     TInt count( NumberOfItemsInPane() );
         
-    // Scroll highlighted item so that it becomes visible
-    // if it is not visible before (scrolling with scroll bar
-    // can cause highlighted item to go out of screen).
-    TInt topItem( iScroller->TopItemIndex() );
-    TInt bottomItem( topItem + NumberOfItemsThatFitInView() );
-    if ( bottomItem > count )
-        {
-        bottomItem = count;
-        }
-
-    if ( iExtension->Offset() < 0 &&
-         ( iSelectedItem == topItem || iSelectedItem == bottomItem ) )
-        {
-        // Restoring offset with "simulated" ok key event.         
-        iExtension->RestoreOffset( EKeyOK ); 
-        }    
-    else if ( iSelectedItem < topItem ||
-              iSelectedItem > bottomItem - 1 )
-        {
-        if ( count > iSelectedItem )
-            {
-            if ( iExtension->iSctHighlighted && iExtension->iSct )
+    if ( iExtension->iIsPenEnable )
+        {
+        // Scroll highlighted item so that it becomes visible
+        // if it is not visible before (scrolling with scroll bar
+        // can cause highlighted item to go out of screen).
+        TInt topItem( iScroller->TopItemIndex() );
+        TInt bottomItem( topItem + NumberOfItemsThatFitInView() );
+        if ( bottomItem > count )
+            {
+            bottomItem = count;
+            }
+   
+        if ( iExtension->Offset() < 0 &&
+             ( iSelectedItem == topItem || iSelectedItem == bottomItem ) )
+            {
+            // Restoring offset with "simulated" ok key event.         
+            iExtension->RestoreOffset( EKeyOK ); 
+            }    
+        else if ( iSelectedItem < topItem ||
+                  iSelectedItem > bottomItem - 1 )
+            {
+            if ( count > iSelectedItem )
                 {
-                TKeyEvent key;
-                key.iCode = EKeyOK;
-                key.iModifiers = 0;
-
-                TKeyResponse keyResponse( EKeyWasNotConsumed );
-                TEventCode type( EEventNull );
-                keyResponse = iExtension->iSct->OfferKeyEventL( key,
-                                                                type );
-                if ( keyResponse == EKeyWasConsumed )
+                if ( iExtension->iSctHighlighted && iExtension->iSct )
                     {
-                    ReportSelectionMadeL();
+                    TKeyEvent key;
+                    key.iCode = EKeyOK;
+                    key.iModifiers = 0;
+
+                    TKeyResponse keyResponse( EKeyWasNotConsumed );
+                    TEventCode type( EEventNull );
+                    keyResponse = iExtension->iSct->OfferKeyEventL( key,
+                                                                    type );
+                    if ( keyResponse == EKeyWasConsumed )
+                        {
+                        ReportSelectionMadeL();
+                        }
+                    _AKNTRACE( "[%s]" "ActivateCurrentItemL return 2" );
+                    _AKNTRACE_FUNC_EXIT;
+                    return;
                     }
-                _AKNTRACE( "[%s]" "ActivateCurrentItemL return 2" );
-                _AKNTRACE_FUNC_EXIT;
-                return;
+                }
+
+            iExtension->isUpdateScrollDirectly = ETrue;
+            ScrollToMakeItemVisible( iSelectedItem );
+            iExtension->isUpdateScrollDirectly = EFalse;
+
+            ActivateGc();
+
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+
+            MAknListBoxTfxInternal *transApi =
+                CAknListLoader::TfxApiInternal( iExtension->iGc );
+            if ( transApi )
+                {
+                iExtension->iGc->Activate( *DrawableWindow() );
                 }
-            }
-
-        iExtension->isUpdateScrollDirectly = ETrue;
-        ScrollToMakeItemVisible( iSelectedItem );
-        iExtension->isUpdateScrollDirectly = EFalse;
-
-        ActivateGc();
-        CWindowGc& gc = SystemGc();
-        PrepareGcForDrawingItems( gc );
-
-        // Draw all items that are needed.
-        for ( TInt i = 0; i < count; i++ )
-            {
-            if ( i == iSelectedItem && !iExtension->iSctHighlighted )
+            CWindowGc& gc = transApi ? *iExtension->iGc : SystemGc();
+
+#else
+
+            CWindowGc& gc = SystemGc();
+
+#endif // RD_UI_TRANSITION_EFFECTS_LIST
+
+            PrepareGcForDrawingItems( gc );
+
+            // Draw all items that are needed.
+            for ( TInt i = 0; i < count; i++ )
                 {
-                DrawItem( gc, i, EDrawHighlight );
-                }
-            else
-                {
-                DrawItem( gc, i, ERemoveHighlight );
+                if ( i == iSelectedItem && !iExtension->iSctHighlighted )
+                    {
+                    DrawItem( gc, i, EDrawHighlight );
+                    }
+                else
+                    {
+                    DrawItem( gc, i, ERemoveHighlight );
+                    }
                 }
-            }
-
-        DeactivateGc();
-        _AKNTRACE( "[%s]" "ActivateCurrentItemL return 3" );
-        _AKNTRACE_FUNC_EXIT;
-        return;
+
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+
+            if ( transApi )
+                {
+                iExtension->iGc->Deactivate();
+                }
+
+#endif // RD_UI_TRANSITION_EFFECTS_LIST
+
+            DeactivateGc();
+            _AKNTRACE( "[%s]" "ActivateCurrentItemL return 3" );
+            _AKNTRACE_FUNC_EXIT;
+            return;
+            }
         }
 
     if ( iCascadeMenuPane )
@@ -3832,7 +4873,7 @@
         {
         TPointerEvent ptrEvent;
         ptrEvent.iType = TPointerEvent::EButton1Up;
-        TRAP_IGNORE( menubar->HandlePointerEventL( ptrEvent ) );
+        menubar->HandlePointerEventL( ptrEvent );
         }
     else
         {
@@ -3868,6 +4909,11 @@
 //
 EXPORT_C void CEikMenuPane::HandlePointerEventL( const TPointerEvent& aPointerEvent )
     {
+    if( !AknLayoutUtils::PenEnabled() )
+        {
+        return;
+        }
+
     _AKNTRACE_FUNC_ENTER;
 
     if ( iOwner && !IsVisible() )
@@ -3903,28 +4949,19 @@
         {
         if ( aPointerEvent.iType == TPointerEvent::EButton1Down )
             {
-            if ( CAknTransitionUtils::TransitionsEnabled( AknTransEffect::EComponentTransitionsOff ) )
+            if( AknLayoutUtils::PenEnabled() )
                 {
-                iExtension->ImmediateFeedback( ETouchFeedbackSubMenuClosed );
-                }
-            else
-                {
-                iExtension->ImmediateFeedback( ETouchFeedbackPopUp );
+                if ( CAknTransitionUtils::TransitionsEnabled( AknTransEffect::EComponentTransitionsOff ) )
+                    {
+                    iExtension->ImmediateFeedback( ETouchFeedbackPopupClose );
+                    }
+                else
+                    {
+                    iExtension->ImmediateFeedback( ETouchFeedbackPopUp );
+                    }
                 }
             iExtension->iShowCascadeTransition = ETrue;
             CloseCascadeMenu();  
-            // Submenu of submenu was closed
-            if ( iCascadeMenuPane  )
-                {
-                iCascadeMenuPane->iExtension->EnableHighlight( EFalse );
-                iCascadeMenuPane->RepaintHighlight();
-                iExtension->iDownOnMenuArea = EFalse;
-                }
-            else
-                {
-                iExtension->EnableHighlight( EFalse );
-                RepaintHighlight();            
-                }
             IgnoreEventsUntilNextPointerUp();
             _AKNTRACE( "[%s]", "HandlePointerEventL return 2" );
             _AKNTRACE_FUNC_EXIT;
@@ -4011,7 +5048,21 @@
     // Get the option item's rect in Menu SCT
     if ( iExtension->iSct )
         {
-        menuSctRect = iExtension->iItemAreaRect;
+        TAknLayoutRect menuPaneRect;
+        TAknWindowLineLayout menuPane;
+        
+        TAknWindowLineLayout listScrollPaneLayout( 
+            AknLayoutScalable_Avkon::listscroll_menu_pane(0).LayoutLine() );
+        if ( iExtension )
+            {
+            iExtension->AdjustPopupLayoutData( listScrollPaneLayout );
+            }
+        TAknLayoutRect listScrollPaneRect;
+        listScrollPaneRect.LayoutRect( Rect(), listScrollPaneLayout );
+        
+        menuPane = AknLayoutScalable_Avkon::list_menu_pane( 0 ).LayoutLine();
+        menuPaneRect.LayoutRect( listScrollPaneRect.Rect(), menuPane );
+        menuSctRect = menuPaneRect.Rect();
         }
     TRect cascadeMenuRect(0,0,0,0);
 
@@ -4038,8 +5089,8 @@
     // if submenu, then move it's rect coordinates to relative to parent.
     if ( iCascadeMenuPane  )
         {
-        TPoint subPos = iCascadeMenuPane->Position();
-        cascadeMenuRect = TRect(subPos-Position(), iCascadeMenuPane->Size());
+        TPoint subPos = iCascadeMenuPane->PositionRelativeToScreen();
+        cascadeMenuRect = TRect(subPos-PositionRelativeToScreen(), iCascadeMenuPane->Size());
         }
 
     // Pointerevent in case we need to pass event from submenu to parent
@@ -4052,6 +5103,12 @@
         iExtension->ResetPressedHighlight();
         }
 
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+    MAknListBoxTfxInternal *transApi = CAknListLoader::TfxApiInternal(
+                                                            iExtension->iGc );
+    TBool effects = transApi && !transApi->EffectsDisabled();
+#endif
+
     switch (aPointerEvent.iType )
         {
         case TPointerEvent::EButton1Up:
@@ -4059,17 +5116,12 @@
             _AKNTRACE( "[%s]", "TPointerEvent::EButton1Up" );
             if ( !innerRect.Contains( aPointerEvent.iPosition ) ) 
                 {
-                TBool highlightWasEnabled = iExtension->HighlightEnabled();
                 // remove highlight in case highlight is outside of menu pane 
                 iExtension->EnableHighlight( EFalse );
                 if ( iOwner )
                     {
                     RepaintHighlight();
                     }
-                   else if ( highlightWasEnabled && !iCascadeMenuPane )
-                    {
-                    DrawItem( SelectedItem(), ENoHighlight );
-                    }
                 } 
             if ( iOwner && 
                  !innerRect.Contains( aPointerEvent.iPosition ) && 
@@ -4080,10 +5132,10 @@
                 _AKNTRACE_FUNC_EXIT;
                 return iOwner->HandlePointerEventL( parentEvent );
                 }
+            iExtension->iDownOnMenuArea = EFalse;
 
             iExtension->iPanningActive = EFalse;
-            if ( !(iExtension->iSct &&  iExtension->iSct->Rect().Contains( iExtension->iStartPoint ) ) 
-                && iExtension->iDownOnMenuArea )
+            if ( !(iExtension->iSct &&  iExtension->iSct->Rect().Contains( iExtension->iStartPoint ) ) )
                 {
                 TPoint drag = iExtension->iStartPoint - aPointerEvent.iPosition;
                 if ( iExtension->iPhysics->StartPhysics( 
@@ -4093,7 +5145,6 @@
                     iExtension->ResetPressedHighlight();
                     }
                 }
-             iExtension->iDownOnMenuArea = EFalse;
             if ( iExtension->HighlightTimerActive() &&
                  !iExtension->iPressedDown )
                 {
@@ -4174,7 +5225,7 @@
                             }
                         else if ( iExtension->iButtonDownItem == iSelectedItem )
                             {
-                            iExtension->ImmediateFeedback( ETouchFeedbackList,
+                            iExtension->ImmediateFeedback( ETouchFeedbackBasicItem,
                                                            ETouchFeedbackVibra );
                             if( !IsCascadeMenuPane() )
                                 {
@@ -4230,7 +5281,7 @@
                     {
                     noSelection = ETrue;
 					//when touch down during the flicking, play a basic list feedback
-                    iExtension->ImmediateFeedback( ETouchFeedbackList );
+                    iExtension->ImmediateFeedback( ETouchFeedbackBasicItem );
                     }
                 // stop physics for drag
                 iExtension->iPhysics->StopPhysics();
@@ -4257,29 +5308,22 @@
                     // if submenu, and clicked outside of it
                     if ( !cascadeMenuRect.Contains( aPointerEvent.iPosition ) )
                         {
-                        if ( CAknTransitionUtils::TransitionsEnabled( AknTransEffect::EComponentTransitionsOff ) )
-                            {
-                            iExtension->ImmediateFeedback( ETouchFeedbackSubMenuClosed );
-                            }
-                        else
-                            {
-                            iExtension->ImmediateFeedback( ETouchFeedbackPopUp );
+                        if( AknLayoutUtils::PenEnabled() )
+                            {                            
+                            if ( CAknTransitionUtils::TransitionsEnabled( AknTransEffect::EComponentTransitionsOff ) )
+                                {
+                                iExtension->ImmediateFeedback( ETouchFeedbackPopupClose );
+                                }
+                            else
+                                {
+                                iExtension->ImmediateFeedback( ETouchFeedbackPopUp );
+                                }
                             }
                         //Just close sub menu
                         iExtension->iShowCascadeTransition = ETrue;
                         CloseCascadeMenu();
-                        // Submenu of submenu was closed
-                        if ( iCascadeMenuPane  )
-                            {
-                            iCascadeMenuPane->iExtension->EnableHighlight( EFalse );
-                            iCascadeMenuPane->RepaintHighlight();
-                            iExtension->iDownOnMenuArea = EFalse;
-                            }
-                        else
-                            {
-                            iExtension->EnableHighlight( EFalse );
-                            RepaintHighlight();            
-                            }
+                        iExtension->EnableHighlight( EFalse );
+                        RepaintHighlight();
                         IgnoreEventsUntilNextPointerUp();                                                                  
                         break;
                         }
@@ -4312,12 +5356,18 @@
                                     iExtension->iSct->HighlightSctRow( iExtension->iSctHighlighted );
                                     }
 
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+                                if ( effects )
+                                    {
+                                    transApi->SetMoveType( MAknListBoxTfxInternal::EListTap );
+                                    }
+#endif
                                 iExtension->iPressedDown = ETrue;
 
                                 // Start timer for pressed highlight
                                 if ( !noSelection )
                                     {
-                                    iExtension->ImmediateFeedback( ETouchFeedbackList );
+                                    iExtension->ImmediateFeedback( ETouchFeedbackBasicItem );
                                     iExtension->StartHighlightTimerL();
                                     }
                                 iExtension->iNextHighlightItem = ii;
@@ -4326,13 +5376,18 @@
                                 // down even on already highlighted item => list feedback
                                 if ( iExtension->iButtonDownItem == iSelectedItem )
                                     {
-                                    iExtension->ImmediateFeedback( ETouchFeedbackList );
+                                    iExtension->ImmediateFeedback( ETouchFeedbackBasicItem );
                                     }
                                 if ( noSelection )
                                     {
                                     iExtension->iButtonDownItem = KErrNotFound;
                                     }
-
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+                                if ( effects )
+                                    {
+                                    transApi->Draw( Rect() );
+                                    }
+#endif
                                 // if new item has submenu, show it
                                 if ( item->iData.iCascadeId )
                                     {
@@ -4351,7 +5406,6 @@
             else
                 {
                 // Clicked out side submenu, parent handles this
-                iExtension->iDownOnMenuArea = EFalse;
                 if ( iOwner )
                     {
                     iExtension->CalculateParentEvent(aPointerEvent, parentEvent);                                        
@@ -4361,53 +5415,47 @@
                     }
                 else
                     {
-                    // For finger usability, extend to the right.
-                    TRect innerToRightRect;
-                    if ( AknLayoutUtils::LayoutMirrored() )
-                        {
-                        innerToRightRect = TRect( Rect().iTl, innerRect.iBr );
-                        }
-                    else
+                    if ( iExtension->iIsPenEnable ) 
                         {
-                        innerToRightRect = TRect( innerRect.iTl, Rect().iBr );
+                        // For finger usability, extend to the right.
+                        TRect innerToRightRect;
+                        if ( AknLayoutUtils::LayoutMirrored() )
+                            {
+                            innerToRightRect = TRect( Rect().iTl, innerRect.iBr );
+                            }
+                        else
+                            {
+                            innerToRightRect = TRect( innerRect.iTl, Rect().iBr );
+                            }
+                        // Keep opened
+                        if ( innerToRightRect.Contains( aPointerEvent.iPosition ) ) 
+                            {
+                            break;
+                            }
                         }
-                    // Keep opened
-                    if ( innerToRightRect.Contains( aPointerEvent.iPosition ) ) 
-                        {
-                        break;
-                        }
-
                     // clicked outside, then close menu case by case
                     if ( iCascadeMenuPane )
                         {
-                        if ( CAknTransitionUtils::TransitionsEnabled( AknTransEffect::EComponentTransitionsOff ) )
-                            {
-                            iExtension->ImmediateFeedback( ETouchFeedbackSubMenuClosed );
-                            }
-                        else
-                            {
-                            iExtension->ImmediateFeedback( ETouchFeedbackPopUp );
+                        if( AknLayoutUtils::PenEnabled() )
+                            {                            
+                            if ( CAknTransitionUtils::TransitionsEnabled( AknTransEffect::EComponentTransitionsOff ) )
+                                {
+                                iExtension->ImmediateFeedback( ETouchFeedbackPopupClose );
+                                }
+                            else
+                                {
+                                iExtension->ImmediateFeedback( ETouchFeedbackPopUp );
+                                }
                             }
                         iExtension->iShowCascadeTransition = ETrue;
                         CloseCascadeMenu(); //Just close sub menu.
-                        // Submenu of submenu was closed
-                        if ( iCascadeMenuPane  )
-                            {
-                            iCascadeMenuPane->iExtension->EnableHighlight( EFalse );
-                            iCascadeMenuPane->RepaintHighlight();
-                            }
-                        else
-                            {
-                            iExtension->EnableHighlight( EFalse );
-                            RepaintHighlight();                        
-                            }
+                        iExtension->EnableHighlight( EFalse );
+                        RepaintHighlight();
                         IgnoreEventsUntilNextPointerUp();
                         }
                     else
                         {
-                        _AKNTRACE( "[%s]", "HandlePointerEventL return 12.5" );
-                        _AKNTRACE_FUNC_EXIT;                   
-                        return;
+                        ReportCanceled();   //Close main menu.
                         }
                     }
                 }
@@ -4439,17 +5487,25 @@
             TPoint drag = iExtension->iStartPoint - 
                 aPointerEvent.iPosition;
             TInt threshold = drag.iY;      
-            if( Abs( threshold ) > iExtension->iPhysics->DragThreshold() 
-                && iExtension->iDownOnMenuArea )
+            if( Abs( threshold ) > iExtension->iPhysics->DragThreshold() )
                 {
-                iExtension->EnableHighlight( EFalse );
                 iExtension->iButtonDownItem = KErrNotFound;
                 iExtension->ResetPressedHighlight();
                 iExtension->iNextHighlightItem = KErrNotFound;
                 iExtension->iPanningActive = ETrue;
+                iExtension->EnableHighlight( EFalse );
+
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+                MAknListBoxTfx* tfxApi = CAknListLoader::TfxApi( iExtension->iGc );
+
+                if ( tfxApi )
+                    {
+                    tfxApi->EnableEffects( EFalse );
+                    }
+#endif // RD_UI_TRANSITION_EFFECTS_LIST
                 }    
                          
-            if ( iExtension->iPanningActive && iExtension->iDownOnMenuArea )
+            if ( iExtension->iPanningActive )
                 {
                 TPoint delta( 
                     0, iExtension->iPrevPoint.iY - aPointerEvent.iPosition.iY );
@@ -4468,8 +5524,7 @@
        
             // act in Menu Sct or Option Menu repectively
             if (( iExtension->iSct && menuSctRect.Contains(aPointerEvent.iPosition)) ||
-                ( !iExtension->iSct && innerRect.Contains(aPointerEvent.iPosition)) &&
-                iExtension->iDownOnMenuArea ) 
+                ( !iExtension->iSct && innerRect.Contains(aPointerEvent.iPosition)))
                {
                 iExtension->iDraggedOutside = EFalse;
                 // Scroll only through visible items
@@ -4488,21 +5543,46 @@
                                     && !cascadeMenuRect.Contains(
                                             aPointerEvent.iPosition ) )
                                 {
-                                if ( CAknTransitionUtils::TransitionsEnabled(
-                                        AknTransEffect::EComponentTransitionsOff ) )
+                                if ( AknLayoutUtils::PenEnabled() )
                                     {
-                                    iExtension->ImmediateFeedback(
-                                            ETouchFeedbackSubMenuClosed );
-                                    }
-                                else
-                                    {
-                                    iExtension->ImmediateFeedback(
-                                            ETouchFeedbackPopUp );
+                                    if ( CAknTransitionUtils::TransitionsEnabled(
+                                            AknTransEffect::EComponentTransitionsOff ) )
+                                        {
+                                        iExtension->ImmediateFeedback(
+                                                ETouchFeedbackPopupClose );
+                                        }
+                                    else
+                                        {
+                                        iExtension->ImmediateFeedback(
+                                                ETouchFeedbackPopUp );
+                                        }
                                     }
                                 iExtension->iShowCascadeTransition = ETrue;
                                 CloseCascadeMenu();
                                 }
                             }
+                        else
+                            {
+                            TInt oldSelected = iSelectedItem;
+                            // update highlight to new item
+                            if ( oldSelected != ii )
+                                {
+                                iExtension->iPressedDown = EFalse;
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+                                if ( effects
+                                        && !iExtension->iShowCascadeTransition )
+                                    {
+                                    transApi->SetMoveType(
+                                            MAknListBoxTfxInternal::EListDrag );
+                                    }
+#endif
+                                }
+                            TRect screenRect( TPoint( KMinTInt, KMinTInt ),
+                                    TPoint( KMaxTInt, KMaxTInt ) );
+                            TRect repeatRect( screenRect.iTl.iX, item->iPos,
+                                    screenRect.iBr.iX, item->iPos
+                                            + iItemHeight );
+                            }
                         // item found, break                      
                         break;
                         }
@@ -4738,6 +5818,9 @@
 EXPORT_C void CEikMenuPane::SetSelectedItem( TInt aSelectedItem )
     {
     iSelectedItem = (aSelectedItem >= NumberOfItemsInPane() ) ? 0 : aSelectedItem;
+
+    if( iExtension )
+        iExtension->ChangeHighlightBackground();
     }
 
 // -----------------------------------------------------------------------------
@@ -4833,6 +5916,10 @@
 void CEikMenuPane::HandleScrollEventL( CEikScrollBar* aScrollBar, TEikScrollEvent aEventType )
     {
     _AKNTRACE_FUNC_ENTER;
+    if( !AknLayoutUtils::PenEnabled())
+        {
+        return;
+        }
 
     _AKNTRACE( "[%s]", "Stop physics engine");
     iExtension->iPhysics->StopPhysics();
@@ -4880,9 +5967,16 @@
     // Items that becomes topmost and downmost items
     TInt newTopItem = 0;
 
+
     // if update is not wanted, do nothing.
     if ( update )
         {
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+        MAknListBoxTfxInternal* transApi = CAknListLoader::TfxApiInternal(
+                iExtension->iGc );
+        TBool effects = transApi && !transApi->EffectsDisabled();
+#endif
+
         switch (aEventType)
             {
             case EEikScrollUp:
@@ -4944,7 +6038,17 @@
                 {
                 _AKNTRACE( "[%s]", "EEikScrollPageDown");
                 _AKNTRACE( "bottomItem = %d", bottomItem);
-                update = ETrue;
+                // if last item is not visible
+                if ( bottomItem < countOfItems)
+                    {
+                    // move menu to show one site down or then downmost items.
+                    newTopItem = (bottomItem <=  (countOfItems - itemsThatFitToView)) ? (topItem + itemsThatFitToView) : (countOfItems - itemsThatFitToView);
+                    }
+                else
+                    {
+                    update = EFalse;
+                    }
+                _AKNTRACE( "newTopItem = %d", newTopItem);
                 _AKNTRACE( "update = %d", update);
                 }
                 break;
@@ -4952,35 +6056,80 @@
             case EEikScrollThumbDragVert:
                 {
                 _AKNTRACE( "[%s]", "EEikScrollThumbDragVert");
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+
+                if ( effects )
+                    {
+                    MAknListBoxTfx* tfxApi = CAknListLoader::TfxApi( iExtension->iGc );
+                    
+                    if ( tfxApi )
+                        {
+                        tfxApi->EnableEffects( EFalse );
+                        effects = EFalse;
+                        }
+                    }
+#endif
                 // new thumb position
                 TInt thumb = aScrollBar->ThumbPosition();
                 _AKNTRACE( "thumb = %d", thumb);
-                update = ETrue;
+
+                // did dragging cause scrolling
+                if ( thumb != topItem )
+                    {
+                    newTopItem = thumb;
+                    }
+                else
+                    {
+                    update = EFalse;
+                    }
+                _AKNTRACE( "newTopItem = %d", newTopItem);
                 _AKNTRACE( "update = %d", update);
                 }
                 break;
 
+            case EEikScrollThumbReleaseVert:
+                {
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+                MAknListBoxTfx* tfxApi = CAknListLoader::TfxApi( iExtension->iGc );
+                
+                if ( tfxApi )
+                    {
+                    tfxApi->EnableEffects( ETrue );
+                    }
+#endif
+                }
+                return;
+                
             default:
                 update = EFalse;
                 break;
             }
 
         // if topItem changed, then draw menu again.
-        if ( newTopItem != topItem || update )
-            {
+        if ( newTopItem != topItem )
+            {
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+            if ( effects )
+                {
+                transApi->SetMoveType( newTopItem > topItem ?
+                    MAknListBoxTfxInternal::EListScrollDown :
+                    MAknListBoxTfxInternal::EListScrollUp );
+                }
+#endif
+
+            
             iExtension->iListTopIndex = aScrollBar->ThumbPosition();
-            TPoint newPosition( iExtension->iViewPosition.iX,
-                    iExtension->iListTopIndex + iExtension->iViewHeight / 2 );
-            
-            iExtension->iFlags.Set( CEikMenuPaneExtension::ESkipScrollbarUpdate );
-            iExtension->ViewPositionChanged( newPosition );
-            iExtension->iFlags.Clear( CEikMenuPaneExtension::ESkipScrollbarUpdate );
+                           
+            iExtension->iViewPosition.iY = 
+                iExtension->iListTopIndex + iExtension->iViewHeight / 2;              
+                          
+            iExtension->ViewPositionChanged( iExtension->iViewPosition );
+
             }
         }
     _AKNTRACE_FUNC_EXIT;
     }
 
-
 // -----------------------------------------------------------------------------
 // CEikMenuPane::CreateScrollBarFrame
 // -----------------------------------------------------------------------------
@@ -4994,13 +6143,13 @@
         {
         CEikScrollBarFrame::TScrollBarVisibility visibility = CEikScrollBarFrame::EOn;
 
-        if ( iItemArray->Count() <= NumberOfItemsThatFitInView() )
-            {
-            // all items fit, no need to show the scrollbar
+        if ( iOwner && ( iItemArray->Count() <= NumberOfItemsThatFitInView() ) )
+            {
+            // submenu with less than 6 items
             visibility = CEikScrollBarFrame::EOff;
             }
-
-        TRAP_IGNORE( iSBFrame->SetScrollBarVisibilityL( CEikScrollBarFrame::EOff, visibility ) );
+        TRAP_IGNORE( iSBFrame->SetScrollBarVisibilityL( CEikScrollBarFrame::EOff, visibility /*CEikScrollBarFrame::EAuto*/ ) );
+
         TRAP_IGNORE( iSBFrame->CreateDoubleSpanScrollBarsL( EFalse, EFalse, ETrue, EFalse ) );
         iSBFrame->DrawBackground( EFalse, EFalse );
         UpdateScrollBar();
@@ -5014,14 +6163,13 @@
 //
 void CEikMenuPane::UpdateScrollBar()
     {
-    if ( !CheckCreateScroller() || !IsVisible() )
+    if ( !CheckCreateScroller() )
         return;
     CIdle* idle = iScroller->Idle();
     if ( idle && !idle->IsActive() )
         idle->Start( TCallBack( CEikMenuPane::UpdateScrollBarCallBackL, this ) );
     }
 
-
 // -----------------------------------------------------------------------------
 // CEikMenuPane::UpdateScrollBarCallBackL
 // -----------------------------------------------------------------------------
@@ -5032,7 +6180,6 @@
     return 0;
     }
 
-
 // -----------------------------------------------------------------------------
 // CEikMenuPane::DoUpdateScrollBarL
 // -----------------------------------------------------------------------------
@@ -5045,7 +6192,17 @@
     TEikScrollBarModel hSbarModel;
     TEikScrollBarModel vSbarModel;
 
-    TRect clientRect( iExtension->iMenuPaneRect.Size() );
+    TRect menuPaneRect;
+    if ( !iOwner )
+        {
+        menuPaneRect = iExtension->iMenuPaneRect;    
+        }
+    else
+        {
+        menuPaneRect = Rect();    
+        }
+    
+    TRect clientRect( menuPaneRect.Size() ); 
 
     // Panning uses pixel resolution scrollbar
     vSbarModel.iThumbPosition = iExtension->iListTopIndex;      
@@ -5064,40 +6221,79 @@
     layout.SetInclusiveMargin( 0 );
     layout.iTilingMode = TEikScrollBarFrameLayout::EClientRectConstant;
 
-    CEikScrollBarFrame::TScrollBarVisibility visibility = 
-            iSBFrame->ScrollBarVisibility( CEikScrollBar::EVertical );
-    
-    // scrollbar is shown only if needed
-    if ( iExtension->iScrollbarVisibility == CEikScrollBarFrame::EOn 
-            && visibility == CEikScrollBarFrame::EOff )
-        {
-        iSBFrame->SetScrollBarVisibilityL( CEikScrollBarFrame::EOff, 
-                CEikScrollBarFrame::EOn );
-        iExtension->iScrollBarRect = iSBFrame->VerticalScrollBar()->Rect();
-        }
-    else if ( iExtension->iScrollbarVisibility == CEikScrollBarFrame::EOff 
-            && visibility == CEikScrollBarFrame::EOn )
-        {
-        iSBFrame->SetScrollBarVisibilityL( CEikScrollBarFrame::EOff, 
-                CEikScrollBarFrame::EOff );
-        iExtension->iScrollBarRect = TRect::EUninitialized;
-        }
-    
+    // For main menupane scrollbar is always shown, for submenu only when needed
+    if ( !iOwner )
+        {
+        iSBFrame->SetScrollBarVisibilityL( CEikScrollBarFrame::EOff, CEikScrollBarFrame::EOn );
+        }
+    else
+        {
+        TInt maxItems = NumberOfItemsThatFitInView();
+        TInt count = iItemArray->Count();
+        iSBFrame->SetScrollBarVisibilityL( CEikScrollBarFrame::EOff,
+            (count > maxItems) ? CEikScrollBarFrame::EOn : CEikScrollBarFrame::EOff );
+        }
+
     TAknLayoutRect scrollLayoutRect;
-    scrollLayoutRect.LayoutRect( clientRect, 
-            AknLayoutScalable_Avkon::listscroll_popup_sub_pane().LayoutLine() );
-    scrollBarInclusiveRect = scrollLayoutRect.Rect();
-    scrollBarClientRect = scrollBarInclusiveRect;
-
-    AknLayoutUtils::LayoutVerticalScrollBar( iSBFrame, scrollBarClientRect,
-      AknLayoutScalable_Avkon::scroll_pane_cp4().LayoutLine());
+    if ( !iOwner )
+        {
+        TAknWindowLineLayout listScrollPaneLayout( 
+            AknLayoutScalable_Avkon::listscroll_menu_pane(0).LayoutLine() );
+        if ( iExtension )
+            {
+            iExtension->AdjustPopupLayoutData( listScrollPaneLayout );
+            }
+        scrollLayoutRect.LayoutRect( clientRect, listScrollPaneLayout );
+        scrollBarInclusiveRect =  scrollLayoutRect.Rect();
+        scrollBarClientRect = scrollBarInclusiveRect;
+
+        AknLayoutUtils::LayoutVerticalScrollBar( iSBFrame, scrollBarClientRect,
+            AknLayoutScalable_Avkon::scroll_pane_cp25(0).LayoutLine() );
+        }
+    else
+        {
+        scrollLayoutRect.LayoutRect( clientRect, 
+                AknLayoutScalable_Avkon::listscroll_popup_sub_pane().LayoutLine() );
+        scrollBarInclusiveRect = scrollLayoutRect.Rect();
+        scrollBarClientRect = scrollBarInclusiveRect;
+
+        AknLayoutUtils::LayoutVerticalScrollBar( iSBFrame, scrollBarClientRect,
+          AknLayoutScalable_Avkon::scroll_pane_cp4().LayoutLine());
+        }
 
     iSBFrame->TileL( &hDsSbarModel, &vDsSbarModel, scrollBarClientRect, scrollBarInclusiveRect, layout );
     iSBFrame->SetVFocusPosToThumbPos( vDsSbarModel.FocusPosition() );
+    
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+    MAknListBoxTfxInternal* transApi = CAknListLoader::TfxApiInternal( iExtension->iGc );
+    if ( iSBFrame->VerticalScrollBar() &&
+         iSBFrame->VScrollBarVisibility() == CEikScrollBarFrame::EOn )
+        {
+        iExtension->iScrollBarRect = iSBFrame->VerticalScrollBar()->Rect();
+        }
+    else
+        {
+        iExtension->iScrollBarRect = TRect::EUninitialized;
+        }
+    if ( transApi )
+        {
+        transApi->ResetNonDrawingRects();
+        transApi->AddNonDrawingRect( iExtension->iScrollBarRect );
+        transApi->AddNonDrawingRect( iExtension->iSctRect );
+        }
+#endif // RD_UI_TRANSITION_EFFECTS_LIST
+    if ( iSBFrame->VerticalScrollBar() &&
+         iSBFrame->VScrollBarVisibility() == CEikScrollBarFrame::EOn )
+        {
+        iExtension->iSBRect = iSBFrame->VerticalScrollBar()->Rect();       
+        }
+    else
+        {
+        iExtension->iSBRect = TRect::EUninitialized;
+        }        
     _AKNTRACE_FUNC_EXIT;
     }
 
-
 // -----------------------------------------------------------------------------
 // CEikMenuPane::UpdateScrollBarThumbs
 // -----------------------------------------------------------------------------
@@ -5110,7 +6306,6 @@
         }
     }
 
-
 // -----------------------------------------------------------------------------
 // CEikMenuPane::ScrollToMakeItemVisible
 // -----------------------------------------------------------------------------
@@ -5158,14 +6353,13 @@
             }
         else
             {
-            TRAP_IGNORE( DoUpdateScrollBarL() );
+            DoUpdateScrollBarL();
             }        
         }
     _AKNTRACE_FUNC_EXIT;
     return;
     }
 
-
 // -----------------------------------------------------------------------------
 // CEikMenuPane::Scroll
 // -----------------------------------------------------------------------------
@@ -5194,13 +6388,13 @@
     iScroller->SetTopItemIndex( newTop );
     _AKNTRACE( "newTop =  %d", newTop );
  
+    // Menu moved with keys, update panning/flicking data
     iExtension->iListTopIndex = iScroller->TopItemIndex() * iItemHeight;
-    TPoint newPosition( iExtension->iViewPosition );
-    newPosition.iY = iExtension->iListTopIndex + iExtension->iViewHeight / 2;  
+    iExtension->iViewPosition.iY = 
+        iExtension->iListTopIndex + iExtension->iViewHeight / 2;  
 
     iExtension->SetOffset( 0 );
-    iExtension->ViewPositionChanged( newPosition );
-    
+
     _AKNTRACE( "iExtension->iListTopIndex =  %d", iExtension->iListTopIndex );
     _AKNTRACE( "iExtension->iViewPosition.iY =  %d", iExtension->iViewPosition.iY );
     _AKNTRACE( "[%s]", "iExtension->SetOffset( 0 )" );
@@ -5209,7 +6403,6 @@
     return;
     }
 
-
 // -----------------------------------------------------------------------------
 // CEikMenuPane::ViewRect
 // -----------------------------------------------------------------------------
@@ -5219,7 +6412,6 @@
     return Rect();
     }
 
-
 // -----------------------------------------------------------------------------
 // CEikMenuPane::NumberOfItemsThatFitInView
 // -----------------------------------------------------------------------------
@@ -5231,7 +6423,7 @@
         {
         subst = 1;
         }
-
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST        
     iExtension->iItemsThatFitInView = iOwner ? AknLayoutScalable_Avkon::
         list_single_popup_submenu_pane_ParamLimits().LastRow() + 1 :
         AknLayoutScalable_Avkon::
@@ -5242,9 +6434,20 @@
             iExtension->iItemsThatFitInView --;
             }
         
+    if ( iExtension->iPhysics && iExtension->Offset() != 0 )
+        {
+        // with kinetic scrolling there can be partial items on the screen 
+        iExtension->iTotalNumberOfItemsInView = iExtension->iItemsThatFitInView + 1;
+        }
+        
     return iExtension->iItemsThatFitInView;
-    }
-
+#else
+    return iOwner ? AknLayoutScalable_Avkon::
+        list_single_popup_submenu_pane_ParamLimits().LastRow() + 1 :
+        AknLayoutScalable_Avkon::
+        list_single_pane_cp2_ParamLimits().LastRow() + 1 - subst;
+#endif
+    }
 
 // -----------------------------------------------------------------------------
 // CEikMenuPane::TotalItemHeight
@@ -5283,7 +6486,6 @@
     return err == KErrNone;
     }
 
-
 // -----------------------------------------------------------------------------
 // CEikMenuPane::CheckCreateScrollerL
 // -----------------------------------------------------------------------------
@@ -5394,6 +6596,27 @@
             TRect rect( CalculateSizeAndPosition() );
             SetExtent( rect.iTl, rect.Size() );
 
+            TRAP_IGNORE( DoUpdateScrollBarL() );
+
+            UpdateBackgroundContext( Rect() );
+            PrepareHighlightFrame();
+            SetCascadedIconSize();
+
+            // Background under highlight may have changed -> we need to update
+            // highlight background to animation
+            if( iExtension )
+                {
+                iExtension->HandleLayoutSwitch();
+                }
+                          
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST        
+            MAknListBoxTfxInternal *transApi = CAknListLoader::TfxApiInternal( iExtension->iGc );
+            if ( transApi )
+                {
+                transApi->Remove( MAknListBoxTfxInternal:: EListEverything );
+                }
+#endif    
+            
             //Initialize physics engine
             if ( iExtension->iPhysics )
                 {
@@ -5401,14 +6624,9 @@
                 iExtension->iListTopIndex = iScroller->TopItemIndex() * iItemHeight;
                 iExtension->iViewPosition.iY = 
                             iExtension->iListTopIndex + iExtension->iViewHeight / 2;  
-                }             
-         
-            TRAP_IGNORE( DoUpdateScrollBarL() );
-
-            UpdateBackgroundContext( Rect() );
-            PrepareHighlightFrame();
-            SetCascadedIconSize();
-            DrawDeferred();
+                iExtension->ViewPositionChanged( iExtension->iViewPosition );
+                } 
+            
             if ( iCascadeMenuPane )
                 {
                 iCascadeMenuPane->HandleResourceChange( aType );
@@ -5437,7 +6655,7 @@
                     pointerEvent.iType = TPointerEvent::EButton1Up;
                     // Sending a up event to scroll bar for dehighlighting 
                     // the scroll bar.
-                    TRAP_IGNORE ( verScrollBar->HandlePointerEventL(pointerEvent) );   
+                    verScrollBar->HandlePointerEventL(pointerEvent);   
                     iSBFrame->DrawScrollBarsDeferred();
                     ClaimPointerGrab( EFalse );
                     }
@@ -5456,11 +6674,7 @@
         }
     else if ( aType == KAknMessageFocusLost )
         {
-        if ( iCascadeMenuPane )
-            {
-            iCascadeMenuPane->HandleResourceChange( aType );
-            }
-        else if ( iExtension && iExtension->HighlightEnabled() )
+        if ( iExtension && iExtension->HighlightEnabled() )
             {
             iExtension->EnableHighlight( EFalse, EFalse );
             DrawItem( iSelectedItem, ENoHighlight );
@@ -5732,17 +6946,14 @@
 
     // it can be only in submenu in case when scalable layout is available
     TBool hasIcon = MenuHasIcon();
-
-    // scrollbar is shown only if needed
-    if ( iItemArray->Count() > NumberOfItemsThatFitInView() )
-        {
-        iExtension->iScrollbarVisibility = CEikScrollBarFrame::EOn;
-        }
-    else
-        {
-        iExtension->iScrollbarVisibility = CEikScrollBarFrame::EOff;
-        }
-    
+    TBool hasDoubleSpanScrollBar = EFalse;
+
+    if ( iSBFrame && iSBFrame->VScrollBarVisibility() )
+        {
+        _AKNTRACE( "[%s]", "hasDoubleSpanScrollBar = ETrue;" );
+        hasDoubleSpanScrollBar = ETrue;
+        }
+
     TRect parentMenuRect;
     AknLayoutUtils::TAknCbaLocation cbaPosition = AknLayoutUtils::CbaLocation();    
                 
@@ -5834,6 +7045,8 @@
     _AKNTRACE( "parentMenuRect.iTl.iY = %d", parentMenuRect.iTl.iY );
     _AKNTRACE( "parentMenuRect.Width() = %d", parentMenuRect.Width() );
     _AKNTRACE( "parentMenuRect.Height( = %d", parentMenuRect.Height() );
+    // if we have landscape layout then main menu should be positioned vertically centered
+    TRect appRect( iEikonEnv->EikAppUi()->ApplicationRect() );
 
     if ( !iOwner ) // main menu
         {
@@ -5853,46 +7066,28 @@
         // to be in correct place - so we calculate correct position for
         // background and move control rect to match new background top left
         // position.
+        TRect backgroundRect( iExtension->GetBackgroundRect( parentMenuRect ) );
         TPoint backgroundRectPos( 
-            AknPopupUtils::Position( parentMenuRect.Size(), ETrue ) );
+            AknPopupUtils::Position( backgroundRect.Size(), ETrue ) );
         
         retVal = parentMenuRect;
-        retVal.Move( backgroundRectPos - parentMenuRect.iTl );
+        retVal.Move( backgroundRectPos - backgroundRect.iTl );
         
         // Set embedded cba rect
         if ( iExtension->iCba )
             {
             // There is hidden extra touch space for scroll bar in landscape
-            TInt xOffset = parentMenuRect.iTl.iX - parentMenuRect.iTl.iX ; 
+            TInt xOffset = backgroundRect.iTl.iX - parentMenuRect.iTl.iX ; 
             iExtension->iCba->SetRect( TRect( 
                 xOffset,
                 menuRect.Height(),
-                parentMenuRect.Width() + xOffset,
+                backgroundRect.Width() + xOffset,
                 menuRect.Height() + cbaRect.Rect().Height() ) );
             }
 
         iExtension->iMenuPaneRect = TRect( retVal.iTl, 
                                            TSize ( menuRect.Size() ) );
-
-        TInt variety = 4;
-        
-        // reserve area for scrollbar only if it's shown
-        if ( iExtension->iScrollbarVisibility == CEikScrollBarFrame::EOn )
-            {
-            variety = 0;
-            }
-
-        TAknLayoutRect layoutRect;
-        layoutRect.LayoutRect( TRect( iExtension->iMenuPaneRect.Size() ), 
-                AknLayoutScalable_Avkon::listscroll_popup_sub_pane( 0 ) );
-        
-        iExtension->iMenuAreaRect = layoutRect.Rect();
-        
-        layoutRect.LayoutRect( iExtension->iMenuAreaRect,
-                AknLayoutScalable_Avkon::list_menu_pane( variety ) );
-
-        iExtension->iItemAreaRect = layoutRect.Rect();
-        
+                                        
         _AKNTRACE( "[%s]", "the layout of main menu return" );
         _AKNTRACE_FUNC_EXIT;                               
         return retVal;
@@ -5905,13 +7100,20 @@
     iExtension->iSubMenuWidthIndex = KAlternativeSubmenuWidths - 1;
 
     TAknLayoutRect parentListScrollLayoutRect;     // listscroll_menu_pane
+    TAknLayoutRect parentPaneLayoutRect;           // list_menu_pane
 
     TAknTextLineLayout subMenuText;                // layout for the text when item is not indicated
     TAknTextLineLayout subMenuIconText;            // layout for the text when item is indicated
 
     TAknWindowLineLayout parentListScrollPaneLayout( 
         AknLayoutScalable_Avkon::listscroll_menu_pane(0).LayoutLine() );
+    if ( iExtension )
+        {
+        iExtension->AdjustPopupLayoutData( parentListScrollPaneLayout );
+        }    
     parentListScrollLayoutRect.LayoutRect( parentMenuRect, parentListScrollPaneLayout );    
+    parentPaneLayoutRect.LayoutRect( parentListScrollLayoutRect.Rect(),
+        AknLayoutScalable_Avkon::list_menu_pane(0).LayoutLine() );
     subMenuText = AknLayoutScalable_Avkon::list_single_popup_submenu_pane_t1(0).LayoutLine();
     subMenuIconText = AknLayoutScalable_Avkon::list_single_popup_submenu_pane_t1(1).LayoutLine();
 
@@ -5934,13 +7136,6 @@
         }
 
     // find the suitable item width, so that the text would be visible
-    TInt submenuVariety = 1;
-    
-    if ( iExtension->iScrollbarVisibility == CEikScrollBarFrame::EOn )
-        {
-        submenuVariety = 0;
-        }
-
     for ( ii = 6; ii < KAlternativeSubmenuWidths + 6; ++ii )
         {
         TAknWindowLineLayout submenuLayout( AknLayoutScalable_Avkon::popup_submenu_window( ii ).LayoutLine() );
@@ -5951,7 +7146,7 @@
         TAknLayoutRect listScrollPaneRect;
         listScrollPaneRect.LayoutRect( submenuRect.Rect(), listScrollPaneLayout );
 
-        TAknWindowLineLayout listSubmenuPaneLayout( AknLayoutScalable_Avkon::list_submenu_pane( submenuVariety ).LayoutLine() );
+        TAknWindowLineLayout listSubmenuPaneLayout( AknLayoutScalable_Avkon::list_submenu_pane( !hasDoubleSpanScrollBar ).LayoutLine() );
         TAknLayoutRect listSubmenuPaneRect;
         listSubmenuPaneRect.LayoutRect( listScrollPaneRect.Rect(), listSubmenuPaneLayout );
 
@@ -5983,8 +7178,20 @@
     TInt parentPos = iOwner->iScroller->TopItemIndex() - iOwner->SelectedItem() +
         Min( parentCount, iOwner->NumberOfItemsThatFitInView() );
 
-    TRect parentSelectedItemRect( iOwner->HighlightRect() );
-    parentSelectedItemRect.Move( iOwner->Position() );
+    TInt index =  iOwner->SelectedItem() - iOwner->iScroller->TopItemIndex();
+    TInt rows = AknLayoutScalable_Avkon::list_single_pane_cp2_ParamLimits().LastRow();
+
+    // This condition may be true if less items fits to menu view than sub-menu view
+    // and sub-menu under sub-menu is launched.
+    if (index > rows)
+        {
+        // Change the out-of-boundary index to last legal one.
+        index = rows;
+        }
+
+    TAknLayoutRect parentSelectedItemRect;
+    parentSelectedItemRect.LayoutRect( parentPaneLayoutRect.Rect(),
+        AknLayoutScalable_Avkon::list_single_pane_cp2( index ).LayoutLine() );
 
     TAknLayoutRect submenuWindowRect;
     // To prevent a panic in layout code, count has to be at least 1 even if
@@ -6023,7 +7230,7 @@
     if ( ( Layout_Meta_Data::IsLandscapeOrientation()
         && cbaPosition != AknLayoutUtils::EAknCbaLocationBottom ) )
         {
-        if ( ( parentSelectedItemRect.iTl.iY + submenuWindowRect.Rect().Height() ) >
+        if ( ( parentSelectedItemRect.Rect().iTl.iY + submenuWindowRect.Rect().Height() ) >
                 aWindowRect.iBr.iY )
             {
             subMenuPos = EBottom;
@@ -6075,7 +7282,7 @@
         }
     else  // floating
         {
-        TInt yPos = parentSelectedItemRect.iTl.iY -
+        TInt yPos = parentSelectedItemRect.Rect().iTl.iY -
             ( listScrollPaneRect.Rect().iTl.iY - submenuWindowRect.Rect().iTl.iY );
 
         // When a submenu is floating, make sure that the possible panning offset of the
@@ -6104,25 +7311,6 @@
             retVal.Move( 0, -offset );
             }
         }
-    
-    if ( retVal.iTl.iY < 0 )
-        {
-        retVal.Move( 0, -retVal.iTl.iY );
-        }
-
-    iExtension->iMenuPaneRect = retVal;
-
-    TAknLayoutRect layoutRect;
-    layoutRect.LayoutRect( TRect( iExtension->iMenuPaneRect.Size() ), 
-            AknLayoutScalable_Avkon::listscroll_popup_sub_pane( 0 ) );
-    
-    iExtension->iMenuAreaRect = layoutRect.Rect();
-    
-    layoutRect.LayoutRect( iExtension->iMenuAreaRect,
-            AknLayoutScalable_Avkon::list_submenu_pane( submenuVariety ) );
-
-    iExtension->iItemAreaRect = layoutRect.Rect();
-    
     _AKNTRACE( "[%s]", "the layout of sub menu return" );
     _AKNTRACE_FUNC_EXIT;  
     return retVal;
@@ -6143,15 +7331,69 @@
     if( index < 0 )
         index = 0;
 
+    // It is possible that this method is called when iItemArray is NULL.  In
+    // that case we fake numItems as 1 to make layout code work.
+    TInt maxItems = NumberOfItemsThatFitInView();
+    TInt numItems = Min( Max( 1, iItemArray->Count() ), maxItems );
+    if( !iItemArray )
+        numItems = 1;
+    
     // When physics is enabled highlight can be moved to partially visible
     // item which is at the bottom of menu. This causes layout panic and to 
     // avoid that we reduce index by one.
-    if ( index == NumberOfItemsThatFitInView() )
+    if ( index == maxItems )
         {
         index--;
         }
    
-    return ItemRect( index );
+    TRect windowRect = Rect();
+
+    TAknWindowLineLayout menuPane( AKN_LAYOUT_WINDOW_list_menu_pane( 0 , 0 ) );
+    TAknWindowLineLayout singleMenuPane( AKN_LAYOUT_WINDOW_list_single_popup_menu_pane( index ) );
+    TAknLayoutRect menuPaneRect;
+    TAknLayoutRect singleMenuPaneRect;
+
+    TBool hasDoubleSpanScrollBar = EFalse;
+
+    if ( iSBFrame && iSBFrame->VScrollBarVisibility() )
+        {
+        hasDoubleSpanScrollBar = ETrue;
+        }
+
+    if ( !iOwner )
+        {
+        TAknWindowLineLayout listScrollPaneLayout( 
+            AknLayoutScalable_Avkon::listscroll_menu_pane(0).LayoutLine() );
+        if ( iExtension )
+            {
+            iExtension->AdjustPopupLayoutData( listScrollPaneLayout );
+            }                            
+        TAknLayoutRect listScrollPaneRect;
+        listScrollPaneRect.LayoutRect( windowRect, listScrollPaneLayout );
+
+        menuPane = AknLayoutScalable_Avkon::list_menu_pane( 0 ).LayoutLine();
+        menuPaneRect.LayoutRect( listScrollPaneRect.Rect(), menuPane );
+
+        singleMenuPane = AknLayoutScalable_Avkon::list_single_pane_cp2( index ).LayoutLine();
+        singleMenuPaneRect.LayoutRect( menuPaneRect.Rect(), singleMenuPane );
+        }
+    else // Submenu
+        {
+        TAknWindowLineLayout listScrollPaneLayout( AknLayoutScalable_Avkon::listscroll_popup_sub_pane().LayoutLine() );
+        TAknLayoutRect listScrollPaneRect;
+        listScrollPaneRect.LayoutRect( windowRect, listScrollPaneLayout );
+
+        menuPane = AknLayoutScalable_Avkon::list_submenu_pane( !hasDoubleSpanScrollBar ).LayoutLine();
+        menuPaneRect.LayoutRect( listScrollPaneRect.Rect(), menuPane );
+
+        singleMenuPane = AknLayoutScalable_Avkon::list_single_popup_submenu_pane( index ).LayoutLine();
+        singleMenuPaneRect.LayoutRect( menuPaneRect.Rect(), singleMenuPane );
+        }
+
+    // Compared to normal DrawItem the highlight rect step is omitted because
+    // it would shift the highlight towards left.
+
+    return singleMenuPaneRect.Rect();
     }
 
 
@@ -6197,6 +7439,7 @@
         {
         AknIconUtils::SetSize( itemData->Bitmap(),  cascadeRect.Rect().Size() );
         }
+
     else
         {
         if (iExtension->iCascadeBitmap)
@@ -6239,7 +7482,8 @@
 EXPORT_C TInt CEikMenuPane::CountComponentControls() const
     {
     TInt count = 0;
-    if ( iSBFrame && iSBFrame->VerticalScrollBar() )
+    if ( iSBFrame && iSBFrame->VerticalScrollBar() &&
+                            !( iSBFrame->VerticalScrollBar()->OwnsWindow() ) )
         {
         count = 1;
         }
@@ -6266,7 +7510,8 @@
         {
         case 0:
             {
-            if ( iSBFrame && iSBFrame->VerticalScrollBar() )
+            if ( iSBFrame && iSBFrame->VerticalScrollBar() &&
+                        !( iSBFrame->VerticalScrollBar()->OwnsWindow() ) )
                 {
                 return iSBFrame->VerticalScrollBar();
                 }
@@ -6309,10 +7554,6 @@
     }
 
 
-// -----------------------------------------------------------------------------
-// CEikMenuPane::CheckCreateExtensionL
-// -----------------------------------------------------------------------------
-//
 void CEikMenuPane::CheckCreateExtensionL()
     {
     if ( !iExtension )
@@ -6324,50 +7565,6 @@
 
 
 // -----------------------------------------------------------------------------
-// CEikMenuPane::ItemRect
-// -----------------------------------------------------------------------------
-//
-TRect CEikMenuPane::ItemRect( TInt aItemIndex ) const
-    {
-    // this method is valid for the main menu only
-    TInt lastRow = AknLayoutScalable_Avkon::list_single_pane_cp2_ParamLimits().LastRow();
-    aItemIndex = Min( aItemIndex, lastRow );
-
-    TAknLayoutRect layoutRect;
-    layoutRect.LayoutRect( iExtension->iItemAreaRect,
-            AknLayoutScalable_Avkon::list_single_pane_cp2( aItemIndex ) );
-            
-    return layoutRect.Rect();
-    }
-
-
-// -----------------------------------------------------------------------------
-// CEikMenuPane::CalculateItemHeight
-// -----------------------------------------------------------------------------
-//
-TInt CEikMenuPane::CalculateItemHeight() const
-    {
-    TAknWindowLineLayout menuLineLayout;
-
-    if ( iOwner ) // submenu
-        {
-        menuLineLayout = 
-            AknLayoutScalable_Avkon::list_single_popup_submenu_pane( 0 ).LayoutLine();
-        }
-    else
-        {
-        menuLineLayout = 
-            AknLayoutScalable_Avkon::list_single_pane_cp2( 0 ).LayoutLine();
-        }
-
-    TAknLayoutRect menuLayoutRect;
-    menuLayoutRect.LayoutRect( Rect(), menuLineLayout );
-    
-    return menuLayoutRect.Rect().Height();
-    }
-
-
-// -----------------------------------------------------------------------------
 // CEikMenuPane::ConstructMenuSctRowL
 // Creates an sct row for editing menu.
 // @param aSpecialChars Buffer that holds selected characters
@@ -6384,10 +7581,6 @@
         {
         resourceId = R_AVKON_MENU_SCT_ROW_DEFAULT_CONTENTS_CHINESE;
         }
-    if (FeatureManager::FeatureSupported(KFeatureIdKorean))
-        {
-        resourceId = R_AVKON_MENU_SCT_ROW_DEFAULT_CONTENTS_KOREAN;
-        }
     iExtension->ConstructMenuSctRowL( aSpecialChars, resourceId );
     }
 
@@ -6441,15 +7634,6 @@
 EXPORT_C void CEikMenuPane::SetItemSpecific(
         TInt aCommandId, TBool aItemSpecific )
     {
-    if ( !iExtension )
-        {
-        TRAPD( err, CheckCreateExtensionL() );
-        if ( err )
-            {
-            return;
-            }
-        }
-    
     if ( iExtension->iFlags.IsSet(
             CEikMenuPaneExtension::ESingleClickEnabled ) )
         {
@@ -6528,20 +7712,30 @@
     if ( iCascadeMenuPane->IsVisible() )
         {
         okToDraw = AknsUtils::SkinInstance() != NULL;
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+        MAknListBoxTfxInternal *transApi = CAknListLoader::TfxApiInternal( iExtension->iGc );
+        if ( transApi && okToDraw )
+            {
+            iCascadeMenuPane->SetFocus( EFalse, EDrawNow );
+            }
+#endif
         // Stop ongoing comp. transitions, this is mostly for fast clicking
         // cases to make sure that no "scrap" is left behind.
         GfxTransEffect::NotifyExternalState( ENotifyGlobalAbort );
-
         // cascade menu "cancel" animation. This does not apply
         // when something is chosen from the menu
-        if ( iExtension->iShowCascadeTransition && okToDraw )
-            {
-            iCascadeMenuPane->SetParent( this );
-    
-            GfxTransEffect::Begin( iCascadeMenuPane, KGfxControlDisappearAction );
-            GfxTransEffect::SetDemarcation( iCascadeMenuPane, iExtension->iCascadeDRect );
-            iCascadeMenuPane->MakeVisible( EFalse );
-            GfxTransEffect::End( iCascadeMenuPane );
+
+    if( iExtension->iShowCascadeTransition && okToDraw )
+        {
+        iCascadeMenuPane->SetParent( this );
+
+        GfxTransEffect::Begin( iCascadeMenuPane, KGfxControlDisappearAction );
+        GfxTransEffect::SetDemarcation( iCascadeMenuPane, iExtension->iCascadeDRect );
+
+        iCascadeMenuPane->MakeVisible( EFalse );
+
+        GfxTransEffect::End( iCascadeMenuPane );
+
             }
         }
 
@@ -6585,83 +7779,29 @@
 
 
 // -----------------------------------------------------------------------------
-// CEikMenuPane::SetItemCommandsStateL
-// -----------------------------------------------------------------------------
-//
-void CEikMenuPane::SetItemCommandsStateL( TBool aDimmed )
+// CEikMenuPane::SetItemCommandsDimmed
+// -----------------------------------------------------------------------------
+//
+void CEikMenuPane::SetItemCommandsDimmed()
     {
     if ( iExtension && iExtension->iFlags.IsSet(
             CEikMenuPaneExtension::ESingleClickEnabled ) )
         {
-        if ( aDimmed )
-            {
-            iExtension->iFlags.Set(
-                    CEikMenuPaneExtension::EHideItemSpecificCommands );
-            }
-        else
-            {
-            iExtension->iFlags.Set(
-                    CEikMenuPaneExtension::EHideViewSpecificCommands );
-            }
+        iExtension->iFlags.Set(
+                CEikMenuPaneExtension::EHideItemSpecificCommands );
         for ( TInt i = 0; i < iItemArray->Count(); ++i )
             {
             CEikMenuPaneItem* item = iItemArray->At( i );
-            TBool itemSpecificItem(
-                    item->iData.iFlags & EEikMenuItemAction
+            if ( item->iData.iFlags & EEikMenuItemAction
                     || item->iData.iFlags & EEikMenuItemSpecific
-                    || item->iData.iFlags & EEikMenuItemSpecificListQuery );
-            // Dim item specific items
-            if ( aDimmed && itemSpecificItem )
+                    || item->iData.iFlags & EEikMenuItemSpecificListQuery )
                 {
                 item->iData.iFlags |= EEikMenuItemDimmed;
                 }
-            // Dim items not item specific
-            else if ( !aDimmed
-                        && ( !itemSpecificItem
-                        || item->iData.iFlags & EEikMenuItemAction ) )
-                {
-                item->iData.iFlags |= EEikMenuItemDimmed;
-                if ( item->iData.iCascadeId ) 
-                    {
-                    // i is not updated in AddCascadeMenuItemsToMenuL so going 
-                    // through added items again here. Then it goes through
-                    // also submenus of submenus. 
-                    AddCascadeMenuItemsToMenuL(
-                            item->iData.iCascadeId, ETrue, EFalse, NULL, i );
-                    }
-                }
-            }
-        }
-    }
-
-// -----------------------------------------------------------------------------
-// CEikMenuPane::SetItemActionsStateL
-// -----------------------------------------------------------------------------
-//
-void CEikMenuPane::SetItemActionsStateL( TBool aDimmed )
-    {
-    if ( iExtension && iExtension->iFlags.IsSet(
-            CEikMenuPaneExtension::ESingleClickEnabled ) )
-        {
-        if ( aDimmed )
-            {
-            iExtension->iFlags.Set(
-                    CEikMenuPaneExtension::EHideItemActionCommands );
-            }
-
-        for ( TInt i = 0; i < iItemArray->Count(); ++i )
-            {
-            CEikMenuPaneItem* item = iItemArray->At( i );
-            TBool itemActionItem(
-                    item->iData.iFlags & EEikMenuItemAction );
-            // Dim item specific items
-            if ( aDimmed && itemActionItem )
-                {
-                item->iData.iFlags |= EEikMenuItemDimmed;
-                }
-            }
-        }
-    }
+            }
+        }
+    }
+
 
 // -----------------------------------------------------------------------------
 // CEikMenuPane::AddMenuItemsToItemActionMenuL
@@ -6685,8 +7825,8 @@
             if ( !( item->iData.iFlags & EEikMenuItemSpecificListQuery )
                     && item->iData.iCascadeId )
                 {
-                AddCascadeMenuItemsToMenuL(
-                        item->iData.iCascadeId, EFalse, ETrue, &aMenuData );
+                AddCascadeMenuItemsToActionMenuL(
+                        item->iData.iCascadeId, EFalse, aMenuData );
                 }
             // If menu item is list query or it does not have cascade menu
             else
@@ -6702,23 +7842,21 @@
         else if ( item->iData.iCascadeId && 
                 !( item->iData.iFlags & EEikMenuItemDimmed ) )
             {
-            AddCascadeMenuItemsToMenuL(
-                    item->iData.iCascadeId, ETrue, ETrue, &aMenuData );
-            }
-        }
-    }
-
-
-// -----------------------------------------------------------------------------
-// CEikMenuPane::AddCascadeMenuItemsToMenuL
-// -----------------------------------------------------------------------------
-//
-void CEikMenuPane::AddCascadeMenuItemsToMenuL(
+            AddCascadeMenuItemsToActionMenuL(
+                    item->iData.iCascadeId, ETrue, aMenuData );
+            }
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CEikMenuPane::AddCascadeMenuItemsToActionMenuL
+// -----------------------------------------------------------------------------
+//
+void CEikMenuPane::AddCascadeMenuItemsToActionMenuL(
         TInt aCascadeId,
         TBool aItemSpecific,
-        TBool aAddToItemActionMenu,
-        CAknItemActionMenuData* aMenuData,
-        TInt aItemIndex )
+        CAknItemActionMenuData& aMenuData )
     {
     if ( aCascadeId && iCoeEnv->IsResourceAvailableL( aCascadeId ) )
         {
@@ -6737,17 +7875,10 @@
                 || ( !aItemSpecific
                         && !( item->iData.iFlags & EEikMenuItemDimmed ) ) )
                 {
-                if ( aAddToItemActionMenu )
-                    {
-                    aMenuData->AddMenuItemToDataArrayL(
-                            item->iData.iCommandId,
-                            item->iData.iCascadeId,
-                            item->iData.iText );
-                    }
-                else 
-                    {
-                    InsertMenuItemL( item->iData, ++aItemIndex );
-                    }
+                aMenuData.AddMenuItemToDataArrayL(
+                        item->iData.iCommandId,
+                        item->iData.iCascadeId,
+                        item->iData.iText );
                 }
             }
         CleanupStack::PopAndDestroy( cascadeMenu );
@@ -6767,31 +7898,5 @@
         }
     }
 
-// -----------------------------------------------------------------------------
-// CEikMenuPane::HideMarkAndUnmark
-// -----------------------------------------------------------------------------
-//
-void CEikMenuPane::HideMarkAndUnmark( TBool aHide )
-    {
-    if ( aHide )
-        {
-        iExtension->iFlags.Set( CEikMenuPaneExtension::EHideMarkAndUnmark );
-        }
-    else 
-        {
-        iExtension->iFlags.Clear( CEikMenuPaneExtension::EHideMarkAndUnmark );
-        }
-    }
-	
-// -----------------------------------------------------------------------------
-// CEikMenuPane::CleanLocalRef
-// -----------------------------------------------------------------------------
-//
-void CEikMenuPane::CleanLocalRef( TAny* aParam )
-    {
-    static_cast<CEikMenuPane*>( aParam )->iIsDeleted = NULL;
-    }
-
-
 // end of file