emailuis/uicomponents/src/fsactionmenu.cpp
changeset 0 8466d47a6819
child 2 5253a20d2a1e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/emailuis/uicomponents/src/fsactionmenu.cpp	Thu Dec 17 08:39:21 2009 +0200
@@ -0,0 +1,862 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Implementation of an action menu component.
+*
+*/
+
+
+#include "emailtrace.h"
+#include "fsactionmenu.h"
+#include "fstreevisualizerbase.h"
+#include "fslayoutmanager.h"
+#include "fsactionmenucontrol.h"
+
+//SYSTEM INCLUDES
+#include <AknUtils.h>
+#include <eikbtgpc.h>
+#include <eikenv.h>
+#include <eikspane.h> 
+//TOOLKIT INCLUDES
+// <cmail>
+#include <alf/alfenv.h>
+#include <alf/alfdecklayout.h>
+#include <alf/alfcontrol.h>
+#include <alf/alfcontrolgroup.h>
+#include <alf/alfdisplay.h>
+#include <alf/alfroster.h>
+#include <alf/alfborderbrush.h>
+#include <alf/alfgradientbrush.h>
+#include <alf/alfbrusharray.h>
+// </cmail>
+// ---------------------------------------------------------------------------
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CFsActionMenu* CFsActionMenu::NewL( CAlfDisplay& aDisplay, TInt aCbaResource )
+    {
+    FUNC_LOG;
+    CFsActionMenu* self = new( ELeave ) CFsActionMenu( aDisplay );
+    CleanupStack::PushL( self );
+    self->ConstructL( aCbaResource );
+    CleanupStack::Pop( self );
+    
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// C++ destructor.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CFsActionMenu::~CFsActionMenu() 
+    {
+    FUNC_LOG;
+    delete iWait;
+    delete iButtonGroupContainer;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Exetutes action menu at predefined vertical position.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TFsActionMenuResult CFsActionMenu::ExecuteL( TFsVActionMenuPosition aPos )
+    {
+    FUNC_LOG;
+
+    iResult = EFsMenuDismissed;
+        
+    TInt count = Count();
+    if ( count > 0  )
+        {
+        iVPos = aPos;
+        iIsCustVPos = EFalse;
+        
+        FadeBehindActionMenuL( ETrue ); // <cmail>
+        DoExecuteL();
+        FadeBehindActionMenuL( EFalse ); // <cmail>
+        HideCbaButtonsL();
+        }
+               
+    return iResult;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Exetutes action menu at a custom vertical position.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TFsActionMenuResult CFsActionMenu::ExecuteL(  const TInt aYPos  )
+    {
+    FUNC_LOG;
+    iResult = EFsMenuDismissed;
+    
+    TInt count = Count();
+    if ( count > 0  )
+        {
+        iCustVPos = aYPos;
+        iIsCustVPos = ETrue;
+        
+        FadeBehindActionMenuL( ETrue ); // <cmail>
+        DoExecuteL();
+        FadeBehindActionMenuL( EFalse ); // <cmail>
+        HideCbaButtonsL();
+        }
+    
+    return iResult;
+    }
+
+
+// ---------------------------------------------------------------------------
+// The function returns size of Action Menu with the curent number of item.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TSize CFsActionMenu::ActionMenuSize ( )
+    {
+    FUNC_LOG;
+    // <cmail>
+    TRAP_IGNORE( SetAMSizeFromLayoutMgrL( ) );
+    // </cmail>
+    return iSize;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Sets visiblity of the border
+// ---------------------------------------------------------------------------
+//     
+EXPORT_C void CFsActionMenu::SetBorderL( const TBool aVisible, CAlfTexture* aBorderTexture )
+    {
+    FUNC_LOG;
+    CFsTreeList::SetBorderL( aVisible, aBorderTexture );
+        
+    const TInt KZero(0);
+    
+    if ( aVisible )
+        {
+        iAmXPadd = KZero;
+        iAmYPadd = KZero;
+        }
+    else
+        {
+        iAmXPadd = KListBorderPadding;
+        iAmYPadd = KListBorderPadding;
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// The function returns a button group container.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CEikButtonGroupContainer* CFsActionMenu::ButtonGroupContainer()
+    {
+    FUNC_LOG;
+    return iButtonGroupContainer;
+    }
+
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void CFsActionMenu::RootLayoutUpdatedL()
+    {
+    FUNC_LOG;
+    TInt count = Count();
+    if ( count > 0  )
+        {
+        iRootLayout->ClearFlag(EAlfVisualFlagLayoutUpdateNotification);
+        UpdateActionMenuWindowL( );
+        iRootLayout->SetFlag(EAlfVisualFlagLayoutUpdateNotification);
+        }    
+    }
+
+
+// ---------------------------------------------------------------------------
+// Processes user commands.
+// ---------------------------------------------------------------------------
+//
+void CFsActionMenu::ProcessCommandL(TInt aCommandId)
+    {
+    FUNC_LOG;
+    switch ( aCommandId )
+        {
+        case EAknSoftkeyCancel:
+        case EAknSoftkeyExit:
+        case EAknSoftkeyClose:
+        case EAknSoftkeyNo:
+        case EAknSoftkeyBack:
+            {
+            iResult = EFsMenuDismissed;
+            DoDismissL();
+            break;
+            }
+        case EAknSoftkeySelect:        
+        case EAknSoftkeyYes:
+        case EAknSoftkeyOk:
+        case EAknSoftkeyDone:
+            {
+            iResult = EFsMenuItemSelected;
+            DoDismissL();
+            break;
+            }
+        default:
+            {
+            // Nothing to do
+            break;
+            }
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// Shows action menu's cba.
+// ---------------------------------------------------------------------------
+//
+// <cmail> Touch
+void CFsActionMenu::TreeListEventL( const TFsTreeListEvent aEvent, const TFsTreeItemId /*aId*/ )
+    {
+    FUNC_LOG;
+// </cmail>
+    switch ( aEvent )
+        {
+        case MFsTreeListObserver::EFsTreeItemSelected:
+            {
+            iResult = EFsMenuItemSelected;
+            DoDismissL(); // <cmail>
+            break;
+            }
+        case MFsTreeListObserver::EFsTreeItemWithMenuSelected:
+            {
+            iResult = EFsMenuItemSelected;
+            DoDismissL(); // <cmail>
+            break;
+            }
+        case MFsTreeListObserver::EFsTreeListKeyRightArrow:
+            {//right arrow click acts like "Cancel" in AH (mirrored) layouts
+            if ( CFsLayoutManager::IsMirrored() )
+                {
+                iResult = EFsMenuDismissed;
+                DoDismissL(); // <cmail>
+                }
+            break;
+            }
+        case MFsTreeListObserver::EFsTreeListKeyLeftArrow:
+            {//left arrow click acts like "Cancel" in western layouts
+            if ( !CFsLayoutManager::IsMirrored() )
+                {
+            	iResult = EFsMenuDismissed;
+				DoDismissL(); // <cmail>
+                }
+            break;
+            }
+        case MFsTreeListObserver::EFsTreeListHidden:
+            {//list fully hidden -> remove from the roster;
+            iDisplay->Roster().Hide( *iCtrlGroup );
+            break;
+            }
+        case MFsTreeListObserver::EFsTreeListShown:
+            {//list fully shown
+            break;
+            }
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// Shows action menu's cba.
+// ---------------------------------------------------------------------------
+//
+void CFsActionMenu::ShowCbaButtonsL()
+    {
+    FUNC_LOG;
+    iButtonGroupContainer->MakeVisible(ETrue);
+    }
+
+
+// ---------------------------------------------------------------------------
+// Hides action menu's cba.
+// ---------------------------------------------------------------------------
+//
+void CFsActionMenu::HideCbaButtonsL()
+    {
+    FUNC_LOG;
+    iButtonGroupContainer->MakeVisible(EFalse);
+    }
+    
+
+// ---------------------------------------------------------------------------
+// Executes action menu. 
+// ---------------------------------------------------------------------------
+//
+void CFsActionMenu::DoExecuteL()
+    {
+    FUNC_LOG;
+    iRootLayout->ClearFlag(EAlfVisualFlagLayoutUpdateNotification);
+    TAlfTimedValue opacity;
+    opacity.SetValueNow(0.0);
+    iRootLayout->SetOpacity(opacity);
+       
+    UpdateActionMenuWindowL( );
+    SetFirstItemAsFocusedL( );
+    ShowCbaButtonsL( );
+    //////////////////////////////////////////
+    iDisplay->Roster().ShowL( *iCtrlGroup );
+    
+    TBool fadeIn(EFalse), slideIn(EFalse);
+        
+    fadeIn = IsFadeIn();
+    slideIn = IsSlideIn();
+    
+    this->ShowListL( fadeIn, slideIn );
+
+    //show root layout
+    opacity.SetValueNow(1.0);
+    iRootLayout->SetOpacity(opacity);
+    
+    iRootLayout->SetFlag(EAlfVisualFlagLayoutUpdateNotification);
+    
+    StartWait();
+    
+    }
+
+
+// ---------------------------------------------------------------------------
+// Dismiss action menu. 
+// ---------------------------------------------------------------------------
+//
+void CFsActionMenu::DoDismissL()
+    {
+    FUNC_LOG;
+    TBool fadeOut(EFalse), slideOut(EFalse);
+    
+    fadeOut = IsFadeOut();
+    slideOut = IsSlideOut();
+    this->HideListL( fadeOut, slideOut );
+        
+    //after the list is fully hidden we get a notification in TreeListEvent and
+    //action menu is removed from roster
+    
+    StopWait();
+    }
+
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void CFsActionMenu::StartWait()
+    {
+    FUNC_LOG;
+    iWait->Start();
+    }
+    
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void CFsActionMenu::StopWait()
+    {
+    FUNC_LOG;
+    if ( iWait->IsStarted() )
+        {
+        iWait->AsyncStop();
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// The function sets size and position of Action Menu.
+// ---------------------------------------------------------------------------
+//
+void CFsActionMenu::UpdateActionMenuWindowL( )
+    {
+    FUNC_LOG;
+    //AM's size
+    SetAMSizeFromLayoutMgrL( );
+    //AM's position
+    CalculatePosition( );
+    
+    iVisualizer->SetPadding( TAlfBoxMetric(iAmXPadd, iAmXPadd, iAmYPadd, iAmYPadd) );        
+    
+    iRootLayout->SetSize( iSize, 0 );
+    iRootLayout->SetPos( iPos, 0 );
+    iRootLayout->UpdateChildrenLayout( 0 );
+    }
+
+// ---------------------------------------------------------------------------
+// The function retrieves Action Menu's size from Layout Manager.
+// ---------------------------------------------------------------------------
+//
+void CFsActionMenu::SetAMSizeFromLayoutMgrL( )
+    {
+    FUNC_LOG;
+    TInt count(0), variety(0);
+    
+    count = Count();
+    if ( count <= 0 )
+        {
+        iSize.iWidth = 0;
+        iSize.iHeight = 0;
+        }
+    else
+        {
+        variety = count + 1;//0-6 variety for 1-7 row AM
+        if ( variety < 2 )
+            {
+            variety = 2; //lowest variety to avoid crashes
+            }
+        
+        if ( count > 7 )
+            {
+            variety = 8; //highest variety
+            SetScrollbarVisibilityL(EFsScrollbarShowAlways);
+            }
+        else
+            {
+            SetScrollbarVisibilityL(EFsScrollbarHideAlways);
+            }
+        
+        TRect parentRect;
+        AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EScreen, parentRect );
+
+        TRect clientRect;
+        CFsLayoutManager::LayoutMetricsRect( parentRect, CFsLayoutManager::EFsLmMainPane, clientRect );
+        
+        CFsLayoutManager::TFsLayoutMetrics actionMenuMetrics(CFsLayoutManager::EFsLmPopupSpFsActionMenuPane);
+        
+        TRect actionMenuPopupRect;
+        CFsLayoutManager::LayoutMetricsRect(
+                        clientRect, //parent
+                        actionMenuMetrics, //queried item
+                        actionMenuPopupRect, // result
+                        variety ); 
+        
+        iSize.iWidth = actionMenuPopupRect.Width();
+        iSize.iHeight = actionMenuPopupRect.Height();
+        iSize.iHeight += 1;
+        }
+
+    }
+
+
+// ---------------------------------------------------------------------------
+// The function calculates AM's position based on it's size and predefined vertical
+// position (top,center,bottom) or custom vertical position set by the user.
+// ---------------------------------------------------------------------------
+//
+void CFsActionMenu::CalculatePosition( )
+    {
+    FUNC_LOG;
+    TRect clientRect;
+    AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, clientRect );    
+     
+    //horizontal position
+    TRect amRect;
+    if ( CFsLayoutManager::IsMirrored() )
+        {
+        amRect.iTl.iX = 0;
+        }
+    else
+        {
+        amRect.iTl.iX = clientRect.iBr.iX - iSize.iWidth;        
+        }
+    
+    amRect.iBr.iX = amRect.iTl.iX + iSize.iWidth;
+    
+    //vertical position
+    if ( iIsCustVPos )
+        {
+        amRect.iTl.iY = iCustVPos;
+        amRect.iBr.iY = amRect.iTl.iY + iSize.iHeight;
+        }
+    else
+        {
+        switch ( iVPos )
+            {
+            case EFsVPosTop:
+                amRect.iTl.iY = 0;
+                amRect.iBr.iY = amRect.iTl.iY + iSize.iHeight;
+                break;
+            case EFsVPosCenter:           
+                amRect.iTl.iY = (clientRect.Height() - iSize.iHeight) / 2;
+                amRect.iBr.iY = amRect.iTl.iY + iSize.iHeight;
+                break;
+            case EFsVPosBottom:
+            default:
+                amRect.iBr.iY = clientRect.Height();
+                amRect.iTl.iY = amRect.iBr.iY - iSize.iHeight;
+                break;
+            }
+        }
+    
+    iPos = amRect.iTl;
+    }
+
+
+// ---------------------------------------------------------------------------
+// The function returns whether the slide in effect is set.
+// ---------------------------------------------------------------------------
+//
+TBool CFsActionMenu::IsSlideIn()
+    {
+    FUNC_LOG;
+    TBool slideIn(EFalse);
+    if ( iVisualizer->SlideInDirection() != MFsTreeVisualizer::ESlideNone && 
+         iVisualizer->SlideInDuration() > 0 )
+        {
+        slideIn = ETrue;
+        }
+    else
+        {
+        slideIn = EFalse;
+        }
+    return slideIn;
+    }
+
+
+// ---------------------------------------------------------------------------
+// The function returns whether the fade in effect is set.
+// ---------------------------------------------------------------------------
+//
+TBool CFsActionMenu::IsFadeIn()
+    {
+    FUNC_LOG;
+    TBool fadeIn(EFalse);
+    if ( iVisualizer->FadeInEffectTime() > 0 )
+        {
+        fadeIn = ETrue;
+        }
+    else
+        {
+        fadeIn = EFalse;
+        }
+    return fadeIn;
+    }
+
+
+// ---------------------------------------------------------------------------
+// The function returns whether the slide out effect is set.
+// ---------------------------------------------------------------------------
+//
+TBool CFsActionMenu::IsSlideOut()
+    {
+    FUNC_LOG;
+    TBool slideOut(EFalse);
+    if ( iVisualizer->SlideOutDirection() != MFsTreeVisualizer::ESlideNone && 
+         iVisualizer->SlideOutDuration() > 0 )
+        {
+        slideOut = ETrue;
+        }
+    else
+        {
+        slideOut = EFalse;
+        }
+    return slideOut;
+    }
+
+
+// ---------------------------------------------------------------------------
+// The function returns whether the fade out effect is set.
+// ---------------------------------------------------------------------------
+//
+TBool CFsActionMenu::IsFadeOut()
+    {
+    FUNC_LOG;
+    TBool fadeOut(EFalse);
+    if ( iVisualizer->FadeOutEffectTime() > 0 )
+        {
+        fadeOut = ETrue;
+        }
+    else
+        {
+        fadeOut = EFalse;
+        }
+    return fadeOut;
+    }
+
+
+// ---------------------------------------------------------------------------
+// The function sets first list item as focused.
+// ---------------------------------------------------------------------------
+//
+void CFsActionMenu::SetFirstItemAsFocusedL()
+    {
+    FUNC_LOG;
+    const TInt KZero( 0 );
+    
+    if ( !IsEmpty( KFsTreeRootID ) )
+        {
+        TFsTreeItemId firstItemId( KFsTreeNoneID );
+        
+        firstItemId = Child( KFsTreeRootID, KZero );
+        if ( firstItemId != KFsTreeNoneID )
+            {
+            iVisualizer->SetFocusedItemL( firstItemId );
+            }
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+//  The function fades screen behind popup.
+// ---------------------------------------------------------------------------
+//
+void CFsActionMenu::FadeBehindActionMenuL( TBool aFaded ) // <cmail>
+    {
+    FUNC_LOG;
+    TBool faded (aFaded);
+    
+    CEikStatusPane* statusPane =  CEikonEnv::Static()->AppUiFactory()->StatusPane();
+   
+    if ( statusPane )
+        {
+        CCoeControl* control(NULL);
+        TUid uid;
+        
+        uid.iUid = EEikStatusPaneUidSignal;     
+        CEikStatusPaneBase::TPaneCapabilities subPane = statusPane->PaneCapabilities(uid);
+        subPane = statusPane->PaneCapabilities( uid );
+        if ( subPane.IsPresent() && subPane.IsAppOwned() )
+            {
+            control = statusPane->ControlL( uid );
+            control->DrawableWindow()->SetFaded( faded, RWindowTreeNode::EFadeIncludeChildren );
+            }
+        
+        
+        uid.iUid = EEikStatusPaneUidBattery;
+        subPane = statusPane->PaneCapabilities( uid );
+        if ( subPane.IsPresent() && subPane.IsAppOwned() )
+            {
+            control = statusPane->ControlL( uid );
+            control->DrawableWindow()->SetFaded( faded, RWindowTreeNode::EFadeIncludeChildren );
+            }
+        
+
+        uid.iUid = EEikStatusPaneUidContext;
+        subPane = statusPane->PaneCapabilities( uid );
+        if ( subPane.IsPresent() && subPane.IsAppOwned() )
+            {
+            control = statusPane->ControlL( uid );
+            control->DrawableWindow()->SetFaded( faded, RWindowTreeNode::EFadeIncludeChildren );
+            }
+        
+        
+        uid.iUid = EEikStatusPaneUidTitle;
+        subPane = statusPane->PaneCapabilities( uid );
+        if ( subPane.IsPresent() && subPane.IsAppOwned() )
+            {
+            control = statusPane->ControlL( uid );
+            control->DrawableWindow()->SetFaded( faded, RWindowTreeNode::EFadeIncludeChildren );
+            }
+        
+
+        uid.iUid = EEikStatusPaneUidNavi;
+        subPane = statusPane->PaneCapabilities( uid );
+        if ( subPane.IsPresent() && subPane.IsAppOwned() )
+            {
+            control = statusPane->ControlL( uid );
+            control->DrawableWindow()->SetFaded( faded, RWindowTreeNode::EFadeIncludeChildren );
+            }
+        
+
+        uid.iUid = EEikStatusPaneUidIndic;
+        subPane = statusPane->PaneCapabilities( uid );
+        if ( subPane.IsPresent() && subPane.IsAppOwned() )
+            {
+            control = statusPane->ControlL( uid );
+            control->DrawableWindow()->SetFaded( faded, RWindowTreeNode::EFadeIncludeChildren );
+            }
+        
+
+        uid.iUid = EEikStatusPaneUidMessage;
+        subPane = statusPane->PaneCapabilities( uid );
+        if ( subPane.IsPresent() && subPane.IsAppOwned() )
+            {
+            control = statusPane->ControlL( uid );
+            control->DrawableWindow()->SetFaded( faded, RWindowTreeNode::EFadeIncludeChildren );
+            }
+            
+
+        uid.iUid = EEikStatusPaneUidClock;
+        subPane = statusPane->PaneCapabilities( uid );
+        if ( subPane.IsPresent() && subPane.IsAppOwned() )
+            {
+            control = statusPane->ControlL( uid );
+            control->DrawableWindow()->SetFaded( faded, RWindowTreeNode::EFadeIncludeChildren );
+            }
+        
+        
+        uid.iUid = EEikStatusPaneUidDigitalClock;
+        subPane = statusPane->PaneCapabilities( uid );
+        if ( subPane.IsPresent() && subPane.IsAppOwned() )
+            {
+            control = statusPane->ControlL( uid );
+            control->DrawableWindow()->SetFaded( faded, RWindowTreeNode::EFadeIncludeChildren );
+            }
+        
+        
+        uid.iUid = EEikStatusPaneUidEmpty;
+        subPane = statusPane->PaneCapabilities( uid );    
+        if ( subPane.IsPresent() && subPane.IsAppOwned() )
+            {
+            control = statusPane->ControlL( uid );
+            control->DrawableWindow()->SetFaded( faded, RWindowTreeNode::EFadeIncludeChildren );
+            }
+        }
+    
+    
+
+    TAlfTimedValue opacity;
+    CAlfGradientBrush* brush(NULL);    
+    if ( faded )
+        {
+        if (iFadeLayout->Brushes())
+            {
+            if ( iFadeLayout->Brushes()->Count() <= 0 )
+                {
+                TRgb color(240,240,240);
+                brush = CAlfGradientBrush::NewL( iControl->Env() );
+                brush->SetColor( color );
+                brush->SetLayer(EAlfBrushLayerBackground);
+                opacity.SetTarget( 0.55 , 0);
+                brush->SetOpacity( opacity );            
+                iFadeLayout->Brushes()->AppendL(brush,EAlfHasOwnership);
+                }
+            else
+                {
+                opacity.SetTarget( 0.55 , 0);
+                brush = reinterpret_cast<CAlfGradientBrush*>(&iFadeLayout->Brushes()->At(0));
+                brush->SetOpacity( opacity );
+                }
+            }        
+        }
+    else
+        {
+        if (iFadeLayout->Brushes())
+            {
+            opacity.SetTarget( 0.0 , 0);
+            brush = reinterpret_cast<CAlfGradientBrush*>(&iFadeLayout->Brushes()->At(0));
+            brush->SetOpacity( opacity );
+            }
+        }    
+    }
+
+
+// ---------------------------------------------------------------------------
+//  C++ constructor.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CFsActionMenu::CFsActionMenu( CAlfDisplay& aDisplay )
+: CFsTreeList( aDisplay.Env(), *iVisualizer ), //setting NULL visualizer, visualizer created in ConstructL
+  iDisplay( &aDisplay ),
+  iVPos( EFsVPosTop ),
+  iCustVPos(0),
+  iIsCustVPos( EFalse ), 
+  KListBorderPadding(5),
+  iAmXPadd(5),
+  iAmYPadd(5)
+    {
+    FUNC_LOG;
+    
+    }    
+
+
+// ---------------------------------------------------------------------------
+//  Second phase constructor.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFsActionMenu::ConstructL( TInt aCbaResource )
+    {
+    FUNC_LOG;
+    iWait = new ( ELeave ) CActiveSchedulerWait();
+    //create action list's control group
+    //check if the group exists - take first free slot
+    iCtrlGroup = &iDisplay->Env().NewControlGroupL( KFsGroupActionMenu );
+    
+    iControl = new (ELeave) CFsActionMenuControl(this);
+    // <cmail> Removed cleanup stack usage of mthe meber variables. </cmail>
+    iControl->ConstructL( iDisplay->Env());
+    
+    iFadeLayout = CAlfDeckLayout::AddNewL (*iControl);
+    iFadeLayout->EnableBrushesL();
+    
+    iRootLayout = CAlfDeckLayout::AddNewL (*iControl);
+    // <cmail> Removed cleanup stack usage of mthe meber variables. </cmail>
+
+    iRootLayout->SetFlag(EAlfVisualFlagManualLayout);
+    iRootLayout->SetFlag(EAlfVisualFlagLayoutUpdateNotification);
+    
+    
+    //set initial pos/size - proper values set by ExecuteL
+    iRootLayout->ClearFlag(EAlfVisualFlagLayoutUpdateNotification);
+    iRootLayout->SetPos(TAlfRealPoint(30,15));
+    iRootLayout->SetSize(TSize ( 150, 100 ) );
+    iRootLayout->UpdateChildrenLayout();
+    iRootLayout->SetFlag(EAlfVisualFlagLayoutUpdateNotification);
+    iControl->SetRootVisual( iRootLayout );
+
+    ///////////////////////////////////////
+    //DEBUG BORDER
+    /*
+    iRootLayout->EnableBrushesL( ETrue );
+    CAlfBorderBrush* border = CAlfBorderBrush::NewLC(aEnv,1, 1, 0, 0);
+    border->SetColor(KRgbRed);
+    iRootLayout->Brushes()->AppendL(border, EAlfHasOwnership);
+    CleanupStack::Pop(border);
+    */
+    ///////////////////////////////////////
+
+    
+    //create list's visualizer
+    iVisualizer = CFsTreeVisualizerBase::NewL( iControl, *iRootLayout );
+    // <cmail> Removed cleanup stack usage of mthe meber variables. </cmail>
+    //construct the list's base class
+    CFsTreeList::SetTreeVisualizer( *iVisualizer );
+    CFsTreeList::ConstructL( iDisplay->Env() );
+    //use custom padding - turn off list's padding
+    iVisualizer->EnableListPanePadding( EFalse );
+    //set some list's properties
+    CFsTreeList::SetMarkTypeL( CFsTreeList::EFsTreeListNonMarkable );
+    CFsTreeList::SetLoopingType( EFsTreeListLoopingDisabled );
+    CFsTreeList::SetScrollTime( KFsActionMenuScrollTime, KFsActionMenuAccelerationRate );
+    //Observe the list.
+    CFsTreeList::AddObserverL(*this);
+    
+    iCtrlGroup->AppendL( iControl );
+    iCtrlGroup->AppendL( this->TreeControl() );    
+    
+    iRootLayout->UpdateChildrenLayout();
+    
+    //hide the list
+    this->HideListL( EFalse, EFalse );       
+    iDisplay->Roster().Hide( *iCtrlGroup );
+    
+    //construct Cba buttons
+    iButtonGroupContainer = CEikButtonGroupContainer::NewL( 
+            CEikButtonGroupContainer::ECba,
+            CEikButtonGroupContainer::EHorizontal,
+            this, aCbaResource );
+    //hide cba buttons
+    iButtonGroupContainer->MakeVisible(EFalse);
+    // <cmail> Removed cleanup stack usage of mthe meber variables. </cmail>
+    }
+
+
+
+
+//End Of File
+