camerauis/cameraapp/generic/src/CamSceneSettingContainer.cpp
branchRCL_3
changeset 24 bac7acad7cb3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/camerauis/cameraapp/generic/src/CamSceneSettingContainer.cpp	Wed Sep 01 12:30:54 2010 +0100
@@ -0,0 +1,1639 @@
+/*
+* 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:  Container class for scene settings view*
+*/
+
+// INCLUDE FILES
+#include "CamSceneSettingContainer.h"
+#include "CamUtility.h"
+#include "CamPanic.h"
+
+#include <eikenv.h>
+#include <eikappui.h> // For CCoeAppUiBase
+#include <eikapp.h>   // For CEikApplication
+#include <stringloader.h>
+#include <AknBidiTextUtils.h>
+#include <AknsUtils.h>
+#include <AknsDrawUtils.h>
+#include <cameraapp.mbg>
+#include <BitmapTransforms.h>
+#include <AknUtils.h>
+#include <AknLayoutFont.h>
+#include <barsRead.h>    // resource reader
+
+#include <cameraapp.rsg>
+#include <vgacamsettings.rsg>
+
+
+// CONSTANTS
+
+const TInt KStepSize = 4;  // Pixels the animation moves each timer event 
+
+const TInt KCornerSize = 3;
+const TInt KBorderSize = 1;
+
+const TReal KNumIconStages = 7;
+
+#define KRgbGray4 TRgb(0xEEEEEE)
+#define KRgbGray3 TRgb(0xDDDDDD)
+#define KRgbGray2 TRgb(0xCCCCCC)
+#define KRgbGray1 TRgb(0xBBBBBB)
+
+
+#ifdef __WINS__
+static const TInt KTimerPeriod = 10000;
+#else
+static const TInt KTimerPeriod = 150000;
+#endif
+
+// ================= MEMBER FUNCTIONS =======================
+
+// -----------------------------------------------------------------------------
+// TCamAnimationData::Initialise
+// Sets up the animation data
+// -----------------------------------------------------------------------------
+//
+void TCamAnimationData::Initialise( const TRect& aRect )
+    {
+    iDeltaY = KStepSize;
+    // scrolling needs to be faster (2 times?) than the fade in/out
+    iScrollingY = iDeltaY * 2;
+
+    iCurrentRect = aRect;
+    iPreviousRect = iCurrentRect;
+    iCurrentRectOld = iCurrentRect;
+    iPreviousRectOld = iCurrentRect;
+
+    iStep = 0;
+    iPenFadeOut = KRgbBlack;
+    iPenFadeIn = KRgbWhite;
+    iScrolling = EFalse;
+    }
+
+// ---------------------------------------------------------------------------
+// CCamSceneSettingItem::NewL
+// Symbian OS two-phased constructor
+// ---------------------------------------------------------------------------
+//
+CCamSceneSettingItem* CCamSceneSettingItem::NewL( TCamSceneId aSceneId,
+                                                  const TSize& aLargeBmpSize,
+                                                  const TSize& aSmallBmpSize )
+    {
+    CCamSceneSettingItem* self =  new( ELeave ) CCamSceneSettingItem( aSceneId );
+    CleanupStack::PushL( self );
+    self->ConstructL( aLargeBmpSize, aSmallBmpSize );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CCamSceneSettingItem::~CCamSceneSettingItem
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CCamSceneSettingItem::~CCamSceneSettingItem()
+  {
+  PRINT( _L("Camera => ~CCamSceneSettingItem") );
+  delete iBitmapSmall;
+  delete iBitmap1;
+  delete iBitmap2;
+  delete iBitmap3;
+  delete iBitmap4;
+  delete iBitmap5;
+  delete iBitmap6;
+  delete iBitmapLarge;
+  delete iTitle;
+  delete iDescription;
+  PRINT( _L("Camera <= ~CCamSceneSettingItem") );
+  }
+
+// ---------------------------------------------------------------------------
+// CCamSceneSettingItem::SceneId
+// Returns the sceneId
+// ---------------------------------------------------------------------------
+//
+TCamSceneId CCamSceneSettingItem::SceneId() const
+    {
+    return iSceneId;
+    }
+
+// ---------------------------------------------------------------------------
+// CCamSceneSettingItem::Icon
+// Returns the bitmap specified by aSize
+// ---------------------------------------------------------------------------
+//
+const CFbsBitmap* CCamSceneSettingItem::Icon( TCamIconSize aSize ) const
+    {
+    if ( aSize == ECamIconSizeLarge )
+        {
+        return iBitmapLarge;
+        }
+    else if ( aSize == ECamIconSizeSmall )
+        {
+        return iBitmapSmall;
+        }
+    else if ( aSize == ECamIconSizeOne )
+        {
+        return iBitmap1;
+        }
+    else if ( aSize == ECamIconSizeTwo )
+        {
+        return iBitmap2;
+        }
+    else if ( aSize == ECamIconSizeThree )
+        {
+        return iBitmap3;
+        }
+    else if ( aSize == ECamIconSizeFour )
+        {
+        return iBitmap4;
+        }
+    else if ( aSize == ECamIconSizeFive )
+        {
+        return iBitmap5;
+        }
+    else if ( aSize == ECamIconSizeSix )
+        {
+        return iBitmap6;
+        }
+    else
+        {
+        return iBitmapLarge;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CCamSceneSettingItem::Title
+// returns the title text
+// ---------------------------------------------------------------------------
+//
+const HBufC* CCamSceneSettingItem::Title() const
+    {
+    return iTitle;
+    }
+
+// ---------------------------------------------------------------------------
+// CCamSceneSettingItem::Description
+// returns the title text
+// ---------------------------------------------------------------------------
+//
+const HBufC* CCamSceneSettingItem::Description() const
+    {
+    return iDescription;
+    }
+
+// ---------------------------------------------------------------------------
+// CCamSceneSettingItem::ConstructL
+// Symbian OS second phase constructor
+// ---------------------------------------------------------------------------
+//
+void CCamSceneSettingItem::ConstructL( const TSize& aLargeBmpSize, 
+                                       const TSize& aSmallBmpSize )
+    {
+    TInt bmpLarge = 0;
+    TInt bmpSmall = 0;
+    TInt title = 0;
+    TInt description = 0;
+    switch ( iSceneId )
+        {
+        case ECamSceneNight:
+            {
+            bmpSmall = EMbmCameraappQgn_ico_lcam_sce_night_s;
+            bmpLarge = EMbmCameraappQgn_ico_lcam_sce_night_l;
+            title = R_CAM_SCENE_TITLE_NIGHT;
+            description = R_CAM_SCENE_DESCRIPTION_NIGHT;
+            }
+            break;
+        case ECamSceneMacro:
+            {
+            bmpSmall = EMbmCameraappQgn_ico_lcam_sce_macro_s;
+            bmpLarge = EMbmCameraappQgn_ico_lcam_sce_macro_l;    
+            title = R_CAM_SCENE_TITLE_MACRO;
+            description = R_CAM_SCENE_DESCRIPTION_MACRO;
+            }
+            break;
+        case ECamScenePortrait:
+            {
+            bmpSmall = EMbmCameraappQgn_ico_lcam_sce_port_s;
+            bmpLarge = EMbmCameraappQgn_ico_lcam_sce_port_l;          
+            title = R_CAM_SCENE_TITLE_PORTRAIT;
+            description = R_CAM_SCENE_DESCRIPTION_PORTRAIT;
+            }
+            break;
+        case ECamSceneAuto:
+            {
+            bmpSmall = EMbmCameraappQgn_ico_lcam_sce_auto_s;
+            bmpLarge = EMbmCameraappQgn_ico_lcam_sce_auto_l;
+            title = R_CAM_SCENE_TITLE_AUTO;
+            description = R_CAM_SCENE_DESCRIPTION_AUTO;
+            }
+            break;
+        case ECamSceneScenery:
+            {
+            bmpSmall = EMbmCameraappQgn_ico_lcam_sce_land_s;
+            bmpLarge = EMbmCameraappQgn_ico_lcam_sce_land_l;           
+            title = R_CAM_SCENE_TITLE_LANDSCAPE;
+            description = R_CAM_SCENE_DESCRIPTION_LANDSCAPE;
+            }
+            break;
+        case ECamSceneSports:
+            {
+            bmpSmall = EMbmCameraappQgn_ico_lcam_sce_sport_s;
+            bmpLarge = EMbmCameraappQgn_ico_lcam_sce_sport_l;           
+            title = R_CAM_SCENE_TITLE_SPORTS;
+            description = R_CAM_SCENE_DESCRIPTION_SPORTS;
+            }
+            break;
+        case ECamSceneUser:
+            {
+            bmpSmall = EMbmCameraappQgn_ico_lcam_sce_user_s;
+            bmpLarge = EMbmCameraappQgn_ico_lcam_sce_user_l;           
+            title = R_CAM_SCENE_TITLE_USER;
+            description = R_CAM_SCENE_DESCRIPTION_USER;
+            }
+            break;
+        case ECamSceneNormal:
+            {
+            bmpSmall = EMbmCameraappQgn_ico_lcam_sce_auto_s;
+            bmpLarge = EMbmCameraappQgn_ico_lcam_sce_auto_l;           
+            title = R_CAM_SCENE_TITLE_NORMAL;
+            description = R_CAM_SCENE_DESCRIPTION_NORMAL;
+            }
+            break;
+        case ECamSceneNightScenery:
+            {
+            bmpSmall = EMbmCameraappQgn_ico_lcam_sce_nightland_s;
+            bmpLarge = EMbmCameraappQgn_ico_lcam_sce_nightland_l;
+            title = R_CAM_SCENE_TITLE_NIGHT_LANDSCAPE;
+            description = R_CAM_SCENE_DESCRIPTION_NIGHT_LANDSCAPE;
+            }
+            break;
+        case ECamSceneNightPortrait:
+            {
+            bmpSmall = EMbmCameraappQgn_ico_lcam_sce_nightport_s;
+            bmpLarge = EMbmCameraappQgn_ico_lcam_sce_nightport_l;
+            title = R_CAM_SCENE_TITLE_NIGHT_PORTRAIT;
+            description = R_CAM_SCENE_DESCRIPTION_NIGHT_PORTRAIT;
+            }
+            break;
+        case ECamSceneCandlelight:
+            {
+            bmpSmall = EMbmCameraappQgn_ico_lcam_sce_candle_s;
+            bmpLarge = EMbmCameraappQgn_ico_lcam_sce_candle_l;           
+            title = R_CAM_SCENE_TITLE_CANDLELIGHT;
+            description = R_CAM_SCENE_DESCRIPTION_CANDLELIGHT;
+            }
+            break;
+        default:
+            User::Leave( KErrGeneral );
+            break;
+        }
+
+    // Find the name and path of the MBM file for bitmaps
+    TFileName mbmFileName;
+    CamUtility::ResourceFileName( mbmFileName );
+
+    iBitmapSmall = AknIconUtils::CreateIconL( mbmFileName, bmpSmall );
+    AknIconUtils::SetSize( iBitmapSmall, aSmallBmpSize, EAspectRatioNotPreserved );
+
+    TReal xInc = TReal( aLargeBmpSize.iWidth - aSmallBmpSize.iWidth ) / KNumIconStages;
+    TReal yInc = TReal( aLargeBmpSize.iHeight - aSmallBmpSize.iHeight ) / KNumIconStages;
+
+    TSize size;
+    TReal width = aSmallBmpSize.iWidth;
+    TReal height = aSmallBmpSize.iHeight;
+    
+    width += xInc;
+    height += yInc;
+    size.SetSize( ( TInt ) width, ( TInt ) height );
+
+    iBitmap1 = AknIconUtils::CreateIconL( mbmFileName, bmpLarge );
+    AknIconUtils::SetSize( iBitmap1, size, EAspectRatioNotPreserved);
+
+    width += xInc;
+    height += yInc;
+    size.SetSize( ( TInt ) width, ( TInt ) height );
+
+    iBitmap2 = AknIconUtils::CreateIconL( mbmFileName, bmpLarge );
+    AknIconUtils::SetSize( iBitmap2, size, EAspectRatioNotPreserved );
+
+    width += xInc;
+    height += yInc;
+    size.SetSize( ( TInt ) width, ( TInt ) height );
+
+    iBitmap3 = AknIconUtils::CreateIconL( mbmFileName, bmpLarge );
+    AknIconUtils::SetSize( iBitmap3, size, EAspectRatioNotPreserved );
+
+    width += xInc;
+    height += yInc;
+    size.SetSize( ( TInt ) width, ( TInt ) height );
+
+    iBitmap4 = AknIconUtils::CreateIconL( mbmFileName, bmpLarge );
+    AknIconUtils::SetSize( iBitmap4, size, EAspectRatioNotPreserved );
+
+    width += xInc;
+    height += yInc;
+    size.SetSize( ( TInt ) width, ( TInt ) height );
+
+    iBitmap5 = AknIconUtils::CreateIconL( mbmFileName, bmpLarge );
+    AknIconUtils::SetSize( iBitmap5, size, EAspectRatioNotPreserved );
+
+    width += xInc;
+    height += yInc;
+    size.SetSize( ( TInt ) width, ( TInt ) height );
+
+    iBitmap6 = AknIconUtils::CreateIconL( mbmFileName, bmpLarge );
+    AknIconUtils::SetSize( iBitmap6, size, EAspectRatioNotPreserved );
+
+    iBitmapLarge = AknIconUtils::CreateIconL( mbmFileName, bmpLarge );
+    AknIconUtils::SetSize( iBitmapLarge, aLargeBmpSize, EAspectRatioNotPreserved );
+    
+    iTitle = StringLoader::LoadL( title );
+    iDescription = StringLoader::LoadL( description );
+    }
+
+// ---------------------------------------------------------------------------
+// CCamSceneSettingItem::CCamSceneSettingContainer
+// C++ constructor
+// ---------------------------------------------------------------------------
+//
+CCamSceneSettingItem::CCamSceneSettingItem( TCamSceneId aSceneId ) :
+    iSceneId( aSceneId )
+    {
+    }  
+
+// ---------------------------------------------------------------------------
+// CCamSceneSettingContainer::NewL
+// Symbian OS two-phased constructor
+// ---------------------------------------------------------------------------
+//
+CCamSceneSettingContainer* 
+CCamSceneSettingContainer::NewL( const TRect& aRect, 
+                                 CAknView& aView,
+                                 TCamCameraMode aMode,
+                                 CCamAppController& aController,
+                                 TBool aUserBaseScenes )
+  {
+  CCamSceneSettingContainer* self = 
+      new( ELeave ) CCamSceneSettingContainer( aMode,
+                                               aController,
+                                               aView, 
+                                               aUserBaseScenes );
+  CleanupStack::PushL( self );
+  self->ConstructL( aRect );
+  CleanupStack::Pop( self );
+  return self;
+  }
+
+// ---------------------------------------------------------------------------
+// CCamSceneSettingContainer::~CCamSceneSettingContainer
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CCamSceneSettingContainer::~CCamSceneSettingContainer()
+  {
+  PRINT( _L( "Camera => ~CCamSceneSettingContainer" ) );
+  
+  iSettingItemArray.ResetAndDestroy();
+  iSettingItemArray.Close();
+  
+  iHighlightIcons.Close();
+  iNormalIcons.Close();
+  iDisplacedIcons.Close();
+  
+  iHighlightArray.Close();
+  iHighlightTitles.Close();
+  iHighlightDescriptions.Close();
+  
+  iNormalTitles.Close();
+  iDisplacedTitles.Close();
+  
+  if (iAnimTimer)
+    {
+    iAnimTimer->Cancel();
+    }
+  delete iAnimTimer;
+  delete iScrollFrame;
+  delete iAnimData.iOffScreenBitmap;
+  
+  PRINT( _L( "Camera <= ~CCamSceneSettingContainer" ) );    
+  }
+  
+// ---------------------------------------------------------
+// CCamSceneSettingContainer::ConstructL
+// Symbian OS 2nd phase constructor
+// ---------------------------------------------------------
+//
+void CCamSceneSettingContainer::ConstructL( const TRect& aRect )
+  {
+  PRINT(_L("Camera => CCamSceneSettingContainer::ConstructL") )
+  
+  CCamContainerBase::BaseConstructL( aRect );
+
+  TBool secondCameraOn = 
+      static_cast<CCamAppUiBase*>( iEikonEnv->AppUi() )->IsSecondCameraEnabled();
+
+  if( !AknLayoutUtils::LayoutMirrored() )
+    {
+    // get the icon positions from the resource
+    ReadLayoutL( ROID(R_CAM_SCENE_ICON_HIGHLIGHT_ARRAY_ID), iHighlightIcons );
+    ReadLayoutL( ROID(R_CAM_SCENE_ICON_DISPLACED_ARRAY_ID), iDisplacedIcons );
+    ReadLayoutL( ROID(R_CAM_SCENE_ICON_NORMAL_ARRAY_ID), iNormalIcons );
+
+    // get the highlight rects
+    ReadLayoutL( ROID(R_CAM_SCENE_HIGHLIGHT_LAYOUT_ARRAY_ID), iHighlightArray );
+
+    // Check if we require APAC layouts
+    if( AknLayoutUtils::Variant() == EApacVariant )
+      {
+      // get the layout texts
+      ReadLayoutL( ROID(R_CAM_SCENE_HIGHLIGHT_TITLE_ARRAY_APAC_ID), iHighlightTitles );
+      ReadLayoutL( ROID(R_CAM_SCENE_HIGHLIGHT_DESCRIPTION_ARRAY_APAC_ID), iHighlightDescriptions );
+
+      ReadLayoutL( ROID(R_CAM_SCENE_TITLE_NORMAL_ARRAY_APAC_ID), iNormalTitles );
+      ReadLayoutL( ROID(R_CAM_SCENE_TITLE_DISPLACED_ARRAY_APAC_ID), iDisplacedTitles );
+      }
+    else
+      {
+      // get the layout texts
+      ReadLayoutL( ROID(R_CAM_SCENE_HIGHLIGHT_TITLE_ARRAY_ID), iHighlightTitles );
+      ReadLayoutL( ROID(R_CAM_SCENE_HIGHLIGHT_DESCRIPTION_ARRAY_ID), iHighlightDescriptions );
+      
+      ReadLayoutL( ROID(R_CAM_SCENE_TITLE_NORMAL_ARRAY_ID), iNormalTitles );
+      ReadLayoutL( ROID(R_CAM_SCENE_TITLE_DISPLACED_ARRAY_ID), iDisplacedTitles );
+      }
+    }
+  else
+    {
+    // get the icon positions from the resource
+    ReadLayoutL( ROID(R_CAM_SCENE_ICON_HIGHLIGHT_ARRAY_AH_ID), iHighlightIcons );
+    ReadLayoutL( ROID(R_CAM_SCENE_ICON_DISPLACED_ARRAY_AH_ID), iDisplacedIcons );
+    ReadLayoutL( ROID(R_CAM_SCENE_ICON_NORMAL_ARRAY_AH_ID), iNormalIcons );
+
+    // get the highlight rects
+    ReadLayoutL( ROID(R_CAM_SCENE_HIGHLIGHT_LAYOUT_ARRAY_AH_ID), iHighlightArray );
+
+    // get the layout texts
+    ReadLayoutL( ROID(R_CAM_SCENE_HIGHLIGHT_TITLE_ARRAY_AH_ID), iHighlightTitles );
+    ReadLayoutL( ROID(R_CAM_SCENE_HIGHLIGHT_DESCRIPTION_ARRAY_AH_ID), iHighlightDescriptions );
+
+    ReadLayoutL( ROID(R_CAM_SCENE_TITLE_NORMAL_ARRAY_AH_ID), iNormalTitles );
+    ReadLayoutL( ROID(R_CAM_SCENE_TITLE_DISPLACED_ARRAY_AH_ID), iDisplacedTitles );
+    }
+
+  TResourceReader reader;                                                                                     
+  iEikonEnv->CreateResourceReaderLC( reader, ROID(R_CAM_SCENE_MAX_ITEMS_TO_DISPLAY_ID));    
+  iNumberOfIconsToDisplay = reader.ReadInt16();
+  CleanupStack::PopAndDestroy(); // reader
+
+  if ( iUserBaseScenes )
+    {
+    CreateSceneArrayL( R_CAM_SCENE_LIST_USER );
+    TCamSceneId currentScene = static_cast<TCamSceneId>( 
+        iController.IntegerSettingValue( 
+            ECamSettingItemUserSceneBasedOnScene ) );
+    SetCurrentPositionToScene( currentScene );      
+    SetupScrollbarL();
+    }
+  else if ( ECamControllerImage == iMode )
+    {
+    if ( secondCameraOn )
+      {
+      CreateSceneArrayL( R_CAM_SCENE_LIST_PHOTO_CAM2 );
+      }
+    else
+      {
+      CreateSceneArrayL( R_CAM_SCENE_LIST_PHOTO);         
+      SetupScrollbarL();
+      }
+
+    TCamSceneId currentScene = static_cast<TCamSceneId>( 
+            iController.IntegerSettingValue( 
+                ECamSettingItemDynamicPhotoScene ) );
+    SetCurrentPositionToScene( currentScene );      
+    }
+  else
+    {
+    if ( secondCameraOn )
+      {
+      CreateSceneArrayL( R_CAM_SCENE_LIST_VIDEO_CAM2);
+      }
+    else
+      {
+      CreateSceneArrayL( R_CAM_SCENE_LIST_VIDEO );
+      }
+    
+    TCamSceneId currentScene = static_cast<TCamSceneId>( 
+            iController.IntegerSettingValue( 
+                ECamSettingItemDynamicVideoScene ) );
+    SetCurrentPositionToScene( currentScene );      
+    }
+
+  TInt index = iCurrentArrayPosition - iTopDisplayPosition;
+  iAnimData.Initialise( iHighlightArray[index].Rect() );
+
+  // create a bitmap to be used off-screen
+  iAnimData.iOffScreenBitmap = new ( ELeave ) CFbsBitmap();
+  User::LeaveIfError( iAnimData.iOffScreenBitmap->Create( aRect.Size(), EColor256 ) );
+
+  TInt leftMarginDiff = iNormalIcons[0].Rect().iTl.iX - 
+                        iHighlightIcons[0].Rect().iTl.iX;
+  iAnimData.iIconLeftInc = TReal( leftMarginDiff / KNumIconStages );
+
+
+  // Create the timeout timer
+  iAnimTimer = CPeriodic::NewL( EPriorityHigh );
+  
+  PRINT(_L("Camera <= CCamSceneSettingContainer::ConstructL") )    
+  }
+
+// ---------------------------------------------------------------------------
+// CCamSceneSettingContainer::ReadLayoutL
+// Read the TAknLayoutRect info from the resource file
+// ---------------------------------------------------------------------------
+//
+void CCamSceneSettingContainer::ReadLayoutL( TInt aResourceId, 
+                                             RArray<TAknLayoutRect>& aArray) const
+  {
+  TResourceReader reader;                                                                                     
+  iEikonEnv->CreateResourceReaderLC( reader, aResourceId );    
+  const TInt count = reader.ReadInt16();
+  
+  TInt i;
+  // Read all of the layout entries from the resource file
+  for ( i = 0; i < count; i++ )
+    {
+    TAknLayoutRect layoutRect;
+    layoutRect.LayoutRect( Rect(), reader );
+    User::LeaveIfError( aArray.Append( layoutRect ) );
+    }
+  CleanupStack::PopAndDestroy(); // reader
+  }
+
+// ---------------------------------------------------------------------------
+// CCamSceneSettingContainer::ReadLayoutL
+// Read the TAknLayoutText info from the resource file
+// ---------------------------------------------------------------------------
+//
+void CCamSceneSettingContainer::ReadLayoutL( TInt aResourceId, 
+                                             RArray<TAknLayoutText>& aArray) const
+  {
+  TResourceReader reader;                                                                                     
+  iEikonEnv->CreateResourceReaderLC( reader, aResourceId );    
+  const TInt count = reader.ReadInt16();
+  
+  TInt i;
+  // Read all of the layout entries from the resource file
+  for ( i = 0; i < count; i++ )
+    {
+    TAknLayoutText layoutText;
+    layoutText.LayoutText( Rect(), reader );
+    User::LeaveIfError( aArray.Append( layoutText ) );
+    }
+  CleanupStack::PopAndDestroy(); // reader
+  }
+    
+// ---------------------------------------------------------------------------
+// CCamSceneSettingContainer::CCamSceneSettingContainer
+// C++ constructor
+// ---------------------------------------------------------------------------
+//
+CCamSceneSettingContainer::CCamSceneSettingContainer( 
+    TCamCameraMode aMode,
+    CCamAppController& aController,
+    CAknView& aView,
+    TBool aUserBaseScenes )
+  : CCamContainerBase( aController, aView ), 
+    iMode( aMode ), 
+    iUserBaseScenes( aUserBaseScenes )
+  {
+  }
+
+// ----------------------------------------------------------------
+// CCamSceneSettingContainer::UserSceneHighlighted
+// Returns ETrue if the current selected scene is User
+// ----------------------------------------------------------------
+//
+TBool CCamSceneSettingContainer::UserSceneHighlighted()
+  {
+  return ( iSettingItemArray[iCurrentArrayPosition]->SceneId() == 
+           ECamSceneUser );
+  }
+
+// ----------------------------------------------------------------
+// CCamSceneSettingContainer::SaveSceneSetting
+// Stores the currently selected scene in the dynamic settings model
+// ----------------------------------------------------------------
+//
+TBool CCamSceneSettingContainer::SaveSceneSettingL()
+  {
+  TInt scene = 0;
+  if ( iUserBaseScenes )
+    {
+    scene = ECamSettingItemUserSceneBasedOnScene;
+    }
+  else if ( ECamControllerImage == iMode )
+    {
+    scene = ECamSettingItemDynamicPhotoScene;
+    }
+  else
+    {
+    scene = ECamSettingItemDynamicVideoScene;
+    }
+
+  iController.SetIntegerSettingValueL( scene,
+              iSettingItemArray[iCurrentArrayPosition]->SceneId() );
+
+  // If user selected sports scene from list.
+  if ( iSettingItemArray[iCurrentArrayPosition]->SceneId() == ECamSceneSports )
+    {
+    // if the selection was for user scene base scene, and user 
+    // scene is active, but request was cancelled, return false.
+    if ( ( iController.IntegerSettingValue( ECamSettingItemDynamicPhotoScene )
+             == ECamSceneUser ) &&
+         ( iController.IntegerSettingValue( ECamSettingItemUserSceneBasedOnScene )
+             != ECamSceneSports ) )
+      {
+      return EFalse;
+      }
+    // if the selection was for the photo/video scene, but request was 
+    // cancelled, return false.
+    if ( ( iController.IntegerSettingValue( ECamSettingItemDynamicPhotoScene )
+         != ECamSceneUser )  && 
+         ( iController.IntegerSettingValue( scene ) != ECamSceneSports ) )
+      {
+      return EFalse;
+      }
+    }
+  // Otherwise, if the user selected user scene from the list, but request
+  // was cancelled, return false.
+  else if ( ( iSettingItemArray[iCurrentArrayPosition]->SceneId() 
+            == ECamSceneUser ) &&
+            ( iController.IntegerSettingValue( ECamSettingItemDynamicPhotoScene )
+           != ECamSceneUser ) )
+    {
+    return EFalse;
+    }
+
+  // Remove lint warning.
+  else
+    {
+    }
+
+  // In all other cases, return true.
+  return ETrue;
+  }
+
+
+// ---------------------------------------------------------
+// CCamSceneSettingContainer::CountComponentControls 
+// Returns the number of controls owned
+// ---------------------------------------------------------
+//
+TInt CCamSceneSettingContainer::CountComponentControls() const
+  {
+  TInt count = CCamContainerBase::CountComponentControls(); // Return the number of controls inside this container    
+  if ( iScrollFrame )
+    {
+    count += iScrollFrame->CountComponentControls();
+    }
+  return count;
+  }
+
+// ---------------------------------------------------------
+// CCamSceneSettingContainer::ComponentControl
+// Returns the requested component control
+// ---------------------------------------------------------
+//
+CCoeControl* CCamSceneSettingContainer::ComponentControl( TInt aIndex ) const
+  {
+  CCoeControl* control = NULL;
+  if( aIndex == 0 )
+      control = CCamContainerBase::ComponentControl( aIndex );
+  else
+      {
+      if ( iScrollFrame )
+          {
+          return iScrollFrame->ComponentControl( aIndex - 1 );
+          }
+      }
+  return control;
+  }
+
+// ---------------------------------------------------------
+// CCamSceneSettingContainer::Draw
+// Draw control
+// ---------------------------------------------------------
+//
+void CCamSceneSettingContainer::Draw( const TRect& /*aRect*/ ) const
+  {
+  PRINT(_L("Camera => CCamSceneSettingContainer::Draw") )
+  
+  CWindowGc& gc = SystemGc();
+  // Draw the background
+  gc.SetBrushColor( KRgbWhite );
+  gc.SetBrushStyle( CGraphicsContext::ESolidBrush );
+  gc.SetPenStyle( CGraphicsContext::ENullPen );
+  gc.DrawRect( Rect() );
+  gc.SetPenStyle( CGraphicsContext::ESolidPen );
+  
+  TBool drawnHighlight = EFalse;
+  TInt index = 0;
+  
+  TInt i;
+  for ( i = 0; i < iNumberOfIconsToDisplay; i++ )
+    {
+    TInt position = iTopDisplayPosition + i;
+    CCamSceneSettingItem* item = iSettingItemArray[position];
+    const HBufC* title = item->Title();
+    const HBufC* description = item->Description();
+
+    // Drawing currently selected icon and text
+    if ( position == iCurrentArrayPosition )
+      {
+      // Draw the highlight
+      gc.DrawRoundRect( iHighlightArray[i].Rect(), 
+                        TSize( KCornerSize, KCornerSize ) );
+      
+      // Draw the enlarged icon
+      iHighlightIcons[i].DrawImage( gc, 
+          const_cast<CFbsBitmap*>( item->Icon( ECamIconSizeLarge ) ), NULL );
+      
+      // Draw the enlarged header text
+      iHighlightTitles[i].DrawText( gc, *title );
+      
+      // Draw the description text
+      iHighlightDescriptions[i].DrawText( gc, *description );
+      
+#if 0       // debug drawing code
+      gc.SetPenColor(KRgbRed);
+      gc.DrawRect( iHighlightTitles[i].TextRect() );
+      gc.DrawRect( iHighlightDescriptions[i].TextRect() );
+#endif
+      drawnHighlight = ETrue;
+      }
+    else    // Drawing normal items
+      {
+      // Draw the highlight box
+      TAknLayoutRect layoutRect;
+      TAknLayoutText layoutText;
+      if ( drawnHighlight )
+        {
+        layoutRect = iNormalIcons[index];
+        layoutText = iNormalTitles[index];
+        }
+      else
+        {
+        layoutRect = iDisplacedIcons[index];
+        layoutText = iDisplacedTitles[index];
+        }
+
+      // Draw the standard icon
+      layoutRect.DrawImage( gc, 
+          const_cast<CFbsBitmap*>( item->Icon( ECamIconSizeSmall ) ), NULL );
+      // Draw the header text
+      layoutText.DrawText( gc, *title );
+            
+#if 0       // debug drawing code
+      gc.SetPenColor(KRgbRed);
+      gc.DrawRect( layoutText.TextRect() );
+#endif
+      index++;
+      }
+    }
+  PRINT(_L("Camera <= CCamSceneSettingContainer::Draw") )
+  }
+
+// ----------------------------------------------------------------
+// CCamSceneSettingContainer::OfferKeyEventL
+// Handles this application view's command keys. Forwards other
+// keys to child control(s).
+// ----------------------------------------------------------------
+//
+TKeyResponse CCamSceneSettingContainer::OfferKeyEventL( 
+    const TKeyEvent& aKeyEvent,
+    TEventCode aType )
+    {
+    PRINT( _L( "Camera => CCamSceneSettingContainer::OfferKeyEventL" ) );
+
+    if ( iAnimTimer->IsActive() )
+        {
+        return EKeyWasNotConsumed;
+        }
+
+    // Moving down the list
+    if ( aKeyEvent.iScanCode == EStdKeyDownArrow && aType == EEventKey )
+        {
+        // at the bottom of the list and pressing down key
+        if ( iCurrentArrayPosition == iSettingItemArray.Count() - 1 )
+            {
+            // wrap to the top of the list and redraw
+            iCurrentArrayPosition = 0;
+            iPreviousArrayPosition = 0;
+            iTopDisplayPosition = 0;
+
+            iAnimData.iCurrentRect = iHighlightArray[0].Rect();
+            iAnimData.iPreviousRect = iAnimData.iCurrentRect;
+
+            if ( iScrollFrame )
+                {
+                iScrollFrame->MoveVertThumbTo( 0 );
+                }
+
+            DrawDeferred();
+            return EKeyWasConsumed;
+            }
+
+        iAnimData.iMovingDown = ETrue;
+        iPreviousArrayPosition = iCurrentArrayPosition;
+        iCurrentArrayPosition++;
+
+        // need to scroll the list
+        if( iCurrentArrayPosition > iNumberOfIconsToDisplay - 1 )
+            {
+            iAnimData.iScrolling = ETrue;
+            iScrollFrame->MoveThumbsBy( 0, 1 );
+            iTopDisplayPosition++;
+            DrawListL();
+
+            // blit the bitmap at above the 2nd displaced icon
+            TInt yPos = iDisplacedIcons[1].Rect().iTl.iY;
+            // less the difference between the top of the first icon on 
+            // the off-screen bitmap and the top of the off-screen bitmap
+            yPos -= iDisplacedIcons[0].Rect().iTl.iY;
+            // less the scrolling value
+            yPos -= iAnimData.iScrollingY;
+            iAnimData.iOffScreenPos.SetXY( 0, yPos );
+
+            TInt curIndex = iCurrentArrayPosition - iTopDisplayPosition;
+            TInt defaultIndex = curIndex - 1;
+            iAnimData.iTitleFadeIn = iNormalTitles[defaultIndex].TextRect();
+
+            iAnimData.iCurrentRect = iHighlightArray[curIndex].Rect();
+            TRect rect = iNormalIcons[defaultIndex].Rect();
+            iAnimData.iCurrentRect.iTl.iY = rect.iTl.iY;
+            iAnimData.iCurrentRect.iBr.iY = iAnimData.iCurrentRect.iTl.iY + rect.Height();
+
+            // clear the top item from the list
+            ActivateGc();
+            SystemGc().Clear( iHighlightArray[0].Rect() );
+            DeactivateGc();
+            }
+        else // just move to the next position
+            {
+            MoveHighlight();
+            }
+
+        StartAnimation();
+        return EKeyWasConsumed;
+        }
+    else if ( aKeyEvent.iScanCode == EStdKeyUpArrow && aType == EEventKey )
+        {
+        // At the top of list and pressing the up key
+        if ( iCurrentArrayPosition == 0 )
+            {
+            // wrap to the bottom of the list and redraw
+            TInt lastItem = iSettingItemArray.Count() - 1;
+            iCurrentArrayPosition = lastItem;
+            iPreviousArrayPosition = lastItem;
+            iTopDisplayPosition = iSettingItemArray.Count() - iNumberOfIconsToDisplay;
+            
+            TInt pos = iCurrentArrayPosition - iTopDisplayPosition;
+            iAnimData.iCurrentRect = iHighlightArray[pos].Rect();
+            iAnimData.iPreviousRect = iAnimData.iCurrentRect;
+
+            if ( iScrollFrame )
+                {
+                iScrollFrame->MoveThumbsBy( 0, iTopDisplayPosition );
+                }
+
+            DrawDeferred();
+            iController.StartIdleTimer();
+            return EKeyWasConsumed;
+            }
+
+        iAnimData.iMovingDown = EFalse;
+        iPreviousArrayPosition = iCurrentArrayPosition;
+        iCurrentArrayPosition--;
+
+        // need to scroll the list
+        if ( iPreviousArrayPosition > iNumberOfIconsToDisplay - 1 )
+            {
+            iAnimData.iScrolling = ETrue;
+            iScrollFrame->MoveThumbsBy( 0, -1 );
+            // draw the list before decrementing top display pos
+            DrawListL();
+            iTopDisplayPosition--;
+
+            iAnimData.iOffScreenPos.SetXY( 0, iAnimData.iScrollingY );
+
+            TInt curIndex = iCurrentArrayPosition - iTopDisplayPosition;
+            TInt defaultIndex = curIndex - 1;
+            iAnimData.iTitleFadeIn = iNormalTitles[defaultIndex].TextRect();
+
+            iAnimData.iCurrentRect = iHighlightArray[curIndex].Rect();
+            TRect rect = iNormalIcons[defaultIndex].Rect();
+            iAnimData.iCurrentRect.iTl.iY = rect.iTl.iY;
+            iAnimData.iCurrentRect.iBr.iY = iAnimData.iCurrentRect.iTl.iY + rect.Height();
+            }
+        else // just move to the next position
+            {
+            MoveHighlight();
+            }
+
+        StartAnimation();
+        iController.StartIdleTimer();
+        return EKeyWasConsumed;
+        }
+    else
+        {
+        return CCamContainerBase::OfferKeyEventL( aKeyEvent, aType );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CCamSceneSettingContainer::HandleScrollEventL
+// Called when a scroll event is detected
+// ---------------------------------------------------------------------------
+//
+void CCamSceneSettingContainer::HandleScrollEventL( CEikScrollBar* /*aScrollBar*/, 
+                                                    TEikScrollEvent /*aEventType*/ )
+    {
+    }
+
+// ----------------------------------------------------------------
+// CCamBurstThumbnailGrid::SetupScrollbarL
+// Sets up the scrollbar for the list
+// ----------------------------------------------------------------
+//
+void CCamSceneSettingContainer::SetupScrollbarL()
+    {
+    if ( !AknLayoutUtils::LayoutMirrored() )
+        {
+        iScrollLayout.LayoutRect( Rect(), ROID(R_CAM_SCENE_SCROLLBAR_POSITION_ID));
+        }
+    else
+        {
+        iScrollLayout.LayoutRect( Rect(), ROID(R_CAM_SCENE_SCROLLBAR_POSITION_AH_ID));
+        }
+
+    // Create scrollbar frame
+    iScrollFrame = new (ELeave) CEikScrollBarFrame( this, this, ETrue );
+
+    // Set up the model accordingly
+    ivModel.SetScrollSpan( iSettingItemArray.Count() );
+    ivModel.SetFocusPosition( 0 );
+    ivModel.SetWindowSize( iNumberOfIconsToDisplay );
+            
+    iScrollFrame->SetScrollBarVisibilityL( CEikScrollBarFrame::EOff, 
+                                           CEikScrollBarFrame::EOn );
+    iScrollFrame->CreateDoubleSpanScrollBarsL( ETrue, EFalse );
+    
+    TRect rect = iScrollLayout.Rect();
+    iScrollFrame->Tile( &ivModel, rect );
+    iScrollFrame->MoveVertThumbTo( iTopDisplayPosition );
+    }
+
+// ----------------------------------------------------------------
+// CCamSceneSettingContainer::CreateSceneArrayL
+// Populates the scene array with scenes using a resource
+// ----------------------------------------------------------------
+//
+void CCamSceneSettingContainer::CreateSceneArrayL( TInt aResourceId )
+    {
+    // Create a resource reader for the scene array resource id.
+    TResourceReader reader;                                                                                     
+    iEikonEnv->CreateResourceReaderLC( reader, aResourceId );    
+
+    // Create all scene list items from the resource reader.
+    TInt sceneCount = reader.ReadInt16();
+
+    TInt i;
+    for ( i = 0; i < sceneCount; ++i )
+        {
+        TCamSceneId sceneId = static_cast<TCamSceneId> ( reader.ReadInt16() );
+        if ( iController.IsSceneSupported( sceneId ) )
+            {
+            TSize large = iHighlightIcons[0].Rect().Size();
+            TSize small = iNormalIcons[0].Rect().Size();
+            CCamSceneSettingItem* settingItem = CCamSceneSettingItem::NewL( 
+                                                sceneId, large, small );
+            CleanupStack::PushL( settingItem );
+            iSettingItemArray.AppendL( settingItem );
+            CleanupStack::Pop( settingItem );            
+            }
+
+        }
+
+    CleanupStack::PopAndDestroy(); // reader
+
+    // If total number of scenes is less than the current number 
+    // of icons to display on screen then reset the current number of
+    // icons to display on screen.
+    if ( sceneCount < iNumberOfIconsToDisplay )
+        {
+        iNumberOfIconsToDisplay = sceneCount;
+        }    
+    }
+
+// ----------------------------------------------------------------
+// CCamSceneSettingContainer::SetCurrentPositionToScene
+// Sets the current position of the scene array to the element
+// associated with a particular scene id.
+// ----------------------------------------------------------------
+//
+void CCamSceneSettingContainer::SetCurrentPositionToScene
+( TCamSceneId aSceneId )
+    {
+    // Find scene in scene array.
+    TInt count = iSettingItemArray.Count();
+    TInt j;
+    for ( j = 0; j < count; j++ )
+        {
+        if ( aSceneId == iSettingItemArray[j]->SceneId() )
+            {  
+            iCurrentArrayPosition = j;
+            j = count; // stop loop
+            }
+        }
+
+    // If scene array position is offscreen, move top display position.
+    if ( iCurrentArrayPosition >= iNumberOfIconsToDisplay )
+        {
+        iTopDisplayPosition = ( iCurrentArrayPosition - 
+                                iNumberOfIconsToDisplay ) + 1;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CCamSceneSettingContainer::StartAnimation
+// Called to start the animation
+// ---------------------------------------------------------------------------
+//
+void CCamSceneSettingContainer::StartAnimation()
+    {
+#ifndef _ANIMATION_OFF
+    iAnimTimer->Start( KTimerPeriod, KTimerPeriod, TCallBack( TimerExpired, this ) );
+#else
+    DrawDeferred();
+#endif
+    }
+
+// ---------------------------------------------------------------------------
+// CCamSceneSettingContainer::TimerExpired
+// Called when the timer expires
+// ---------------------------------------------------------------------------
+//
+TInt CCamSceneSettingContainer::TimerExpired( TAny* aAny )
+    {
+    CCamSceneSettingContainer* container = 
+                    static_cast<CCamSceneSettingContainer*>( aAny );
+    __ASSERT_DEBUG( container != NULL, CamPanic( ECamPanicNullPointer ) );
+    container->Animate();
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CCamSceneSettingContainer::Animate
+// Called every time the timer expires to update the animation
+// The animation works by changing a single line non-highlighted item
+// into a double line highlighted item.
+// When a highlighted item comes into focus, the title text remains the same
+// size, but its position is moved up to indicate moving from a single to
+// double line.
+// The description text fades in underneath the title text - the title text
+// moves up to make way for the description text.
+// When a highlighted item looses the focus, the title text remains the same
+// size, but its position moves down to indicate moving from a double line
+// to a single line.
+// The description text fades out and the title text moves down into the 
+// position occupied by the description text.
+// ---------------------------------------------------------------------------
+//
+void CCamSceneSettingContainer::Animate()
+    {
+    iAnimData.iStep++;
+
+    // update the pen/bitmaps
+    UpdateAnimationData();
+
+    // font is the same for all titles
+    const CAknLayoutFont* layoutFont = CAknLayoutFont::AsCAknLayoutFontOrNull( 
+                                       iHighlightTitles[0].Font() );
+    __ASSERT_DEBUG( layoutFont != NULL, CamPanic( ECamPanicNullPointer ) );
+    TInt baseline = layoutFont->TextPaneTopToBaseline();
+
+    const CCamSceneSettingItem* previousItem = iSettingItemArray[iPreviousArrayPosition];
+    const CCamSceneSettingItem* currentItem = iSettingItemArray[iCurrentArrayPosition];
+
+    TInt currentPosition = iCurrentArrayPosition - iTopDisplayPosition;
+    TInt previousPosition = iPreviousArrayPosition - iTopDisplayPosition;
+
+    CWindowGc& gc = SystemGc();
+    ActivateGc();
+
+    TBool animScrolled = ETrue;
+    TBool animCompleted = ETrue;
+    if ( iAnimData.iScrolling )
+        {
+        animScrolled = ScrollList();
+
+        // update the highlight rects
+        animCompleted = UpdateHighlight();
+
+        DrawIcon( EFalse );
+
+        if ( iAnimData.iMovingDown )
+            {
+            // Save the current position, so we can rub it out later
+            iAnimData.iTitleFadeInOld = iAnimData.iTitleFadeIn;
+
+            TRect rectLimit = iHighlightTitles[currentPosition].TextRect();
+            iAnimData.iTitleFadeIn.Move( 0, -iAnimData.iDeltaY );
+            if ( iAnimData.iTitleFadeIn.iTl.iY <= rectLimit.iTl.iY )
+                {
+                // finish
+                iAnimData.iTitleFadeIn.iTl.iY = rectLimit.iTl.iY;
+                iAnimData.iTitleFadeIn.iBr.iY = rectLimit.iBr.iY;
+                }
+            DrawText( *currentItem->Title(), layoutFont, baseline, EFalse );
+            }
+
+        // draw the description text
+        iHighlightDescriptions[currentPosition].DrawText( gc, 
+                *currentItem->Description(), ETrue, iAnimData.iPenFadeIn );
+
+        // draw the highlighted border
+        DrawHighlight();
+        }
+    else
+        {
+        // update the highlight rects
+        animCompleted = UpdateHighlight();
+
+        // draw the highlighted border
+        DrawHighlight();
+
+/**** PREVIOUS ITEM - FADE OUT ****/
+        DrawIcon( ETrue );
+
+        // fade description text out
+        iHighlightDescriptions[previousPosition].DrawText( gc, 
+               *previousItem->Description(), ETrue, iAnimData.iPenFadeOut );
+
+        // Save the current position, so we can rub it out later
+        iAnimData.iTitleFadeOutOld = iAnimData.iTitleFadeOut;
+
+        // Draw the title text if moving down the list
+        TRect rectLimit;
+        if ( iAnimData.iMovingDown )
+            {
+            rectLimit = iDisplacedTitles[previousPosition].TextRect();
+            }
+        else // Draw the title text if moving up the list
+            {
+            rectLimit = iNormalTitles[previousPosition-1].TextRect();
+            } 
+
+        iAnimData.iTitleFadeOut.Move( 0, iAnimData.iDeltaY );
+        if ( iAnimData.iTitleFadeOut.iTl.iY >= rectLimit.iTl.iY )
+            {
+            // finish
+            iAnimData.iTitleFadeOut.iTl.iY = rectLimit.iTl.iY;
+            iAnimData.iTitleFadeOut.iBr.iY = rectLimit.iBr.iY;
+            }
+
+        DrawText( *previousItem->Title(), layoutFont, baseline, ETrue );
+
+/**** NEXT ITEM - FADE IN ****/
+        DrawIcon( EFalse );
+
+        if ( iAnimData.iMovingDown )
+            {
+            iHighlightDescriptions[currentPosition].DrawText( gc, 
+                *currentItem->Description(), ETrue, iAnimData.iPenFadeIn );
+            }
+        else
+            {
+            // don't fade in straight away otherwise looks messy
+            if ( iAnimData.iStep > 3 )
+                {
+                iHighlightDescriptions[currentPosition].DrawText( gc, 
+                    *currentItem->Description(), ETrue, iAnimData.iPenFadeIn );
+                }
+            }
+
+        // Save the current position, so we can rub it out later
+        iAnimData.iTitleFadeInOld = iAnimData.iTitleFadeIn;
+
+        rectLimit = iHighlightTitles[currentPosition].TextRect();
+        iAnimData.iTitleFadeIn.Move( 0, -iAnimData.iDeltaY );
+        if ( iAnimData.iTitleFadeIn.iTl.iY <= rectLimit.iTl.iY )
+            {
+            // finish
+            iAnimData.iTitleFadeIn.iTl.iY = rectLimit.iTl.iY;
+            iAnimData.iTitleFadeIn.iBr.iY = rectLimit.iBr.iY;
+            }
+        DrawText( *currentItem->Title(), layoutFont, baseline, EFalse );
+        }
+
+    DeactivateGc();
+
+    if ( animScrolled && animCompleted )
+        {
+        iAnimTimer->Cancel();
+        iAnimData.iScrolling = EFalse;
+        iAnimData.iPenFadeOut = KRgbBlack;
+        iAnimData.iPenFadeIn = KRgbWhite;
+        iAnimData.iStep = 0;
+        iAnimData.iIconLeftOffset = 0;
+        DrawNow();
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CCamSceneSettingContainer::UpdateHighlight
+// Updates the highlight rect each time Animate() is called
+// ---------------------------------------------------------------------------
+//
+TBool CCamSceneSettingContainer::UpdateHighlight()
+    {
+    TInt currentPosition = iCurrentArrayPosition - iTopDisplayPosition;
+    TInt previousPosition = iPreviousArrayPosition - iTopDisplayPosition;
+
+    // Save the current position, so we can rub it out later
+    iAnimData.iCurrentRectOld = iAnimData.iCurrentRect;
+    iAnimData.iPreviousRectOld = iAnimData.iPreviousRect;
+    
+    TBool completedCurrentTop = EFalse;
+    TBool completedCurrentBottom = EFalse;
+    TBool completedPreviousTop = EFalse;
+    TBool completedPreviousBottom = EFalse;
+
+    TInt currentRectTopLimit = iHighlightArray[currentPosition].Rect().iTl.iY;
+    TInt currentRectBottomLimit = iHighlightArray[currentPosition].Rect().iBr.iY;
+        
+    iAnimData.iCurrentRect.iTl.iY -= iAnimData.iDeltaY;
+    if ( iAnimData.iCurrentRect.iTl.iY <= currentRectTopLimit )
+        {
+        iAnimData.iCurrentRect.iTl.iY = currentRectTopLimit;
+        completedCurrentTop = ETrue;
+        }
+    iAnimData.iCurrentRect.iBr.iY += iAnimData.iDeltaY;
+    if ( iAnimData.iCurrentRect.iBr.iY >= currentRectBottomLimit )
+        {
+        iAnimData.iCurrentRect.iBr.iY = currentRectBottomLimit;
+        completedCurrentBottom = ETrue;
+        }
+
+    // not scrolling so fade the previous highlight
+    if ( !iAnimData.iScrolling )
+        {
+        TInt previousRectTopLimit;
+        TInt previousRectBottomLimit;
+        if ( iAnimData.iMovingDown )
+            {    
+            previousRectTopLimit = iDisplacedIcons[previousPosition].Rect().iTl.iY;
+            previousRectBottomLimit = iDisplacedIcons[previousPosition].Rect().iBr.iY;
+            }
+        else // moving up
+            {
+            previousRectTopLimit = iNormalIcons[previousPosition-1].Rect().iTl.iY;
+            previousRectBottomLimit = iNormalIcons[previousPosition-1].Rect().iBr.iY;
+            }
+
+        iAnimData.iPreviousRect.iTl.iY += iAnimData.iDeltaY;
+        if ( iAnimData.iPreviousRect.iTl.iY >= previousRectTopLimit )
+            {
+            iAnimData.iPreviousRect.iTl.iY = previousRectTopLimit;
+            completedPreviousTop = ETrue;
+            }
+
+        iAnimData.iPreviousRect.iBr.iY -= iAnimData.iDeltaY;
+        if ( iAnimData.iPreviousRect.iBr.iY <= previousRectBottomLimit )
+            {
+            iAnimData.iPreviousRect.iBr.iY = previousRectBottomLimit;
+            completedPreviousBottom = ETrue;
+            }
+        }
+    else // scrolling - don't draw the previous rect
+        {
+        completedPreviousTop = ETrue;
+        completedPreviousBottom = ETrue;
+        }
+
+    return ( completedCurrentTop && completedCurrentBottom && 
+             completedPreviousTop && completedPreviousBottom );
+    }
+
+// ---------------------------------------------------------------------------
+// CCamSceneSettingContainer::UpdateAnimationData
+// Updates the pen/icons each time Animate() is called
+// ---------------------------------------------------------------------------
+//
+void CCamSceneSettingContainer::UpdateAnimationData()
+    {
+    const CCamSceneSettingItem* previousItem = iSettingItemArray[iPreviousArrayPosition];
+    const CCamSceneSettingItem* currentItem = iSettingItemArray[iCurrentArrayPosition];
+
+    if ( iAnimData.iStep == 1 )
+        {
+        iAnimData.iPenFadeOut = KRgbDarkGray;
+        iAnimData.iPenFadeIn = KRgbGray4;
+        iAnimData.iIconFadeOut = previousItem->Icon( ECamIconSizeSix );
+        iAnimData.iIconFadeIn = currentItem->Icon( ECamIconSizeOne );
+        } 
+    else if ( iAnimData.iStep == 2 )
+        {
+        iAnimData.iPenFadeOut = KRgbGray;
+        iAnimData.iPenFadeIn = KRgbGray3;
+        iAnimData.iIconFadeOut = previousItem->Icon( ECamIconSizeFive );
+        iAnimData.iIconFadeIn = currentItem->Icon( ECamIconSizeTwo );
+        }
+    else if ( iAnimData.iStep == 3 )
+        {
+        iAnimData.iPenFadeOut = KRgbGray1;
+        iAnimData.iPenFadeIn = KRgbGray2;
+        iAnimData.iIconFadeOut = previousItem->Icon( ECamIconSizeFour );
+        iAnimData.iIconFadeIn = currentItem->Icon( ECamIconSizeThree );
+        }
+    else if ( iAnimData.iStep == 4 )
+        {
+        iAnimData.iPenFadeOut = KRgbGray2;
+        iAnimData.iPenFadeIn = KRgbGray1;
+        iAnimData.iIconFadeOut = previousItem->Icon( ECamIconSizeThree );
+        iAnimData.iIconFadeIn = currentItem->Icon( ECamIconSizeFour );
+        }
+    else if ( iAnimData.iStep == 5 )
+        {
+        iAnimData.iPenFadeOut = KRgbGray3;
+        iAnimData.iPenFadeIn = KRgbGray;
+        iAnimData.iIconFadeOut = previousItem->Icon( ECamIconSizeTwo );
+        iAnimData.iIconFadeIn = currentItem->Icon( ECamIconSizeFive );
+        }
+    else if ( iAnimData.iStep == 6 )
+        {
+        iAnimData.iPenFadeOut = KRgbGray4;
+        iAnimData.iPenFadeIn = KRgbDarkGray;
+
+        iAnimData.iIconFadeOut = previousItem->Icon( ECamIconSizeOne );
+        iAnimData.iIconFadeIn = currentItem->Icon( ECamIconSizeSix );
+        }
+    else if ( iAnimData.iStep == 7 )
+        {
+        iAnimData.iPenFadeOut = KRgbWhite;
+        iAnimData.iPenFadeIn = KRgbBlack;
+        iAnimData.iIconFadeOut = previousItem->Icon( ECamIconSizeSmall );
+        iAnimData.iIconFadeIn = currentItem->Icon( ECamIconSizeLarge );
+        }
+    else
+        {
+        
+        }
+    iAnimData.iIconLeftOffset += iAnimData.iIconLeftInc;
+    }
+
+// ---------------------------------------------------------------------------
+// CCamSceneSettingContainer::DrawText
+// Draws the title text each time Animate() is called
+// ---------------------------------------------------------------------------
+//
+void CCamSceneSettingContainer::DrawText( const TDesC& aText, 
+                                          const CAknLayoutFont* aFont, 
+                                          TInt aBaseline,
+                                          TBool aFadeOut ) const
+    {
+    CWindowGc& gc = SystemGc();
+
+    TRect oldRect;
+    TRect rect;
+    if ( aFadeOut )
+        {
+        rect = iAnimData.iTitleFadeOut;
+        oldRect = iAnimData.iTitleFadeOutOld;
+        }
+    else
+        {
+        rect = iAnimData.iTitleFadeIn;
+        oldRect = iAnimData.iTitleFadeInOld;
+        }
+    gc.UseFont( aFont );
+    TLogicalRgb backgroundColour( TLogicalRgb::ESystemBackgroundColor );
+    gc.SetPenColor( backgroundColour );
+    // draw test aligned left or right depending on layout
+    if( !AknLayoutUtils::LayoutMirrored() )
+        {
+        gc.DrawText( aText, oldRect, aBaseline, CGraphicsContext::ELeft );
+        gc.SetPenColor( KRgbBlack );
+        gc.DrawText( aText, rect, aBaseline, CGraphicsContext::ELeft );
+        }
+    else
+        {
+        gc.DrawText( aText, oldRect, aBaseline, CGraphicsContext::ERight );
+        gc.SetPenColor( KRgbBlack );
+        gc.DrawText( aText, rect, aBaseline, CGraphicsContext::ERight );
+        }
+
+    gc.DiscardFont();
+    }
+
+// ---------------------------------------------------------------------------
+// CCamSceneSettingContainer::DrawIcon
+// Draws the icon each time Animate() is called
+// ---------------------------------------------------------------------------
+//
+void CCamSceneSettingContainer::DrawIcon( TBool aFadeOut )
+    {
+    TRect oldRect;
+    TRect bmpRect;
+    const CFbsBitmap* bitmap = NULL;
+
+    TRect largeIcon = iHighlightIcons[0].Rect();
+    TRect smallIcon = iNormalIcons[0].Rect();
+
+    if ( aFadeOut )
+        {
+        bitmap = iAnimData.iIconFadeOut;
+        TSize bmpSize = bitmap->SizeInPixels();
+
+        TInt iconYPos = ( iAnimData.iPreviousRect.Height() - bmpSize.iHeight ) / 2;
+
+        TPoint iconPos( ( largeIcon.iTl.iX + (TInt)iAnimData.iIconLeftOffset ), 
+                      ( iAnimData.iPreviousRect.iTl.iY + iconYPos ) );
+
+        iAnimData.iIconRectFadeOutOld = iAnimData.iIconRectFadeOut;
+        iAnimData.iIconRectFadeOut.SetRect( iconPos, bmpSize );
+
+        oldRect = iAnimData.iIconRectFadeOutOld;
+        bmpRect = iAnimData.iIconRectFadeOut;
+        }
+    else
+        {
+        bitmap = iAnimData.iIconFadeIn;
+        TSize bmpSize = bitmap->SizeInPixels();
+ 
+        TInt iconYPos = ( iAnimData.iCurrentRect.Height() - bmpSize.iHeight ) / 2;
+        
+        TPoint iconPos( ( smallIcon.iTl.iX - (TInt)iAnimData.iIconLeftOffset ), 
+                        ( iAnimData.iCurrentRect.iTl.iY + iconYPos ) );
+
+        iAnimData.iIconRectFadeInOld = iAnimData.iIconRectFadeIn;
+        iAnimData.iIconRectFadeIn.SetRect( iconPos, bmpSize );
+
+        oldRect = iAnimData.iIconRectFadeInOld;
+        bmpRect = iAnimData.iIconRectFadeIn;
+        }
+
+    CWindowGc& gc = SystemGc();
+    gc.Clear( oldRect );
+    gc.BitBlt( bmpRect.iTl, bitmap );
+    }
+
+// ---------------------------------------------------------------------------
+// CCamSceneSettingContainer::DrawHighlight
+// Draws the highlight rect each time Animate() is called
+// ---------------------------------------------------------------------------
+//
+void CCamSceneSettingContainer::DrawHighlight() const
+    {
+    if( Flags() & CListItemDrawer::ESingleClickDisabledHighlight ) 
+        {
+        return;
+        }
+
+    CWindowGc& gc = SystemGc();
+
+    TSize corner( KCornerSize,KCornerSize );
+    // Clear the old highlight
+    gc.SetPenSize( TSize( KBorderSize, KBorderSize ) );
+    TLogicalRgb backgroundColour( TLogicalRgb::ESystemBackgroundColor );
+    gc.SetPenColor( backgroundColour );
+    gc.DrawRoundRect( iAnimData.iCurrentRectOld, corner );
+    if ( !iAnimData.iScrolling )
+        {
+        gc.DrawRoundRect( iAnimData.iPreviousRectOld, corner );
+        }
+    // Draw the new highlight
+    gc.SetPenSize( TSize( KBorderSize, KBorderSize ) );
+    gc.SetPenColor( iAnimData.iPenFadeIn );
+    gc.DrawRoundRect( iAnimData.iCurrentRect, corner );
+    if ( !iAnimData.iScrolling )
+        {
+        gc.SetPenColor( iAnimData.iPenFadeOut );
+        gc.DrawRoundRect( iAnimData.iPreviousRect, corner );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CCamSceneSettingContainer::DrawListL
+// Draws the list to an off-screen bitmap
+// ---------------------------------------------------------------------------
+//
+void CCamSceneSettingContainer::DrawListL()
+    {
+    // create an off-screen device and context
+    CFbsBitGc* bitmapGc = NULL;
+    CFbsBitmapDevice* bitmapDevice = CFbsBitmapDevice::NewL( iAnimData.iOffScreenBitmap );
+    CleanupStack::PushL( bitmapDevice );
+    User::LeaveIfError( bitmapDevice->CreateContext( bitmapGc ) );
+    CleanupStack::PushL( bitmapGc );
+
+    bitmapGc->SetPenStyle( CGraphicsContext::ENullPen );
+    bitmapGc->SetBrushStyle( CGraphicsContext::ESolidBrush );
+    bitmapGc->DrawRect( TRect( iAnimData.iOffScreenBitmap->SizeInPixels() ) );
+
+    TInt i;
+    // only draw top 4 items in the list
+    for ( i = 0; i < iNumberOfIconsToDisplay-1; i++ )
+        {
+        TInt position = iTopDisplayPosition + i;
+        CCamSceneSettingItem* item = iSettingItemArray[position];
+
+        // Draw the standard icon
+        iDisplacedIcons[i].DrawImage( *bitmapGc, 
+                const_cast<CFbsBitmap*>( item->Icon( ECamIconSizeSmall ) ), NULL );
+        // Draw the header text
+        iDisplacedTitles[i].DrawText( *bitmapGc, *item->Title() );
+        }
+
+    CleanupStack::PopAndDestroy( bitmapGc );
+    CleanupStack::PopAndDestroy( bitmapDevice );
+    }
+
+// ---------------------------------------------------------------------------
+// CCamSceneSettingContainer::ScrollList
+// Scrolls the list
+// ---------------------------------------------------------------------------
+//
+TBool CCamSceneSettingContainer::ScrollList()
+    {
+    SystemGc().BitBlt( iAnimData.iOffScreenPos, iAnimData.iOffScreenBitmap );
+    if ( iAnimData.iMovingDown )
+        {
+        iAnimData.iOffScreenPos.iY -= iAnimData.iScrollingY;
+        if ( iAnimData.iOffScreenPos.iY <= 0 )
+            {
+            return ETrue;
+            }
+        }
+    else
+        {
+        iAnimData.iOffScreenPos.iY += iAnimData.iScrollingY;
+        if ( iAnimData.iOffScreenPos.iY >= iDisplacedIcons[1].Rect().iTl.iY )
+            {
+            return ETrue;
+            }
+        }
+    return EFalse;
+    }
+
+// ---------------------------------------------------------------------------
+// CCamSceneSettingContainer::MoveHighlight
+// Moves the highlight to its new position, ready to be animated
+// ---------------------------------------------------------------------------
+//
+void CCamSceneSettingContainer::MoveHighlight()
+    {
+    iAnimData.iPreviousRect = iAnimData.iCurrentRect;
+
+    TInt curIndex = iCurrentArrayPosition - iTopDisplayPosition;
+    TInt prevIndex = iPreviousArrayPosition - iTopDisplayPosition;
+
+    TRect iconRect;
+    TRect titleRect;
+
+    if ( iAnimData.iMovingDown )
+        {
+        TInt defaultIndex = curIndex - 1;
+        iconRect = iNormalIcons[defaultIndex].Rect();
+        titleRect = iNormalTitles[defaultIndex].TextRect();
+        }
+    else
+        {        
+        iconRect = iDisplacedIcons[curIndex].Rect();
+        titleRect = iDisplacedTitles[curIndex].TextRect();
+        }
+
+    iAnimData.iCurrentRect = iHighlightArray[curIndex].Rect();
+    iAnimData.iCurrentRect.iTl.iY = iconRect.iTl.iY;
+    iAnimData.iCurrentRect.iBr.iY = iAnimData.iCurrentRect.iTl.iY + iconRect.Height();
+
+    iAnimData.iTitleFadeOut = iHighlightTitles[prevIndex].TextRect();
+    iAnimData.iTitleFadeIn = titleRect;
+
+    iAnimData.iIconRectFadeOut = iHighlightIcons[prevIndex].Rect();
+    iAnimData.iIconRectFadeIn = iconRect;
+    }
+
+// End of File