camerauis/cameraapp/generic/GsCamcorderPlugin/src/CamLocationSettingContainer.cpp
branchRCL_3
changeset 24 bac7acad7cb3
child 25 2c87b2808fd7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/camerauis/cameraapp/generic/GsCamcorderPlugin/src/CamLocationSettingContainer.cpp	Wed Sep 01 12:30:54 2010 +0100
@@ -0,0 +1,775 @@
+/*
+* Copyright (c) 2007-2010 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:  Implements the location settings for image settings*
+*/
+
+
+
+// INCLUDE FILES
+
+#include <gscamerapluginrsc.rsg>
+#include <barsread.h>
+#include <AknQueryValue.h>
+#include <AknIconUtils.h>
+#include <akntitle.h>  // CAknTitlePane
+#include <aknappui.h>
+#include <AknsUtils.h>
+#include <AknsDrawUtils.h>
+#include <StringLoader.h>
+#include <cameraapp.mbg>
+#include <aknlayoutscalable_apps.cdl.h>
+#include <layoutmetadata.cdl.h>
+#include <touchfeedback.h> 
+
+#include "CamLocationSettingContainer.h"
+#include "CamUtility.h"
+#include "CamCaptureSetupListBox.h"
+#include "CamCaptureSetupListBoxModel.h"
+#include "CamPanic.h"
+#include "camuiconstants.h"
+#include "camuidconstants.h"
+#include "CamAppUiBase.h"
+#include "CamStaticSettingsModel.h"
+#include "GSCamcorderPlugin.h"
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CCamLocationSettingContainer::CCamLocationSettingContainer
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CCamLocationSettingContainer::CCamLocationSettingContainer( MCamAppController& aController,
+                                                            TCamCameraMode aMode,
+                                                            CCoeControl* aParent )
+:   iParent( aParent ),
+    iController( aController ), 
+    iMode( aMode ),
+    iActivateOnTouchRelease( EFalse )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CCamLocationSettingContainer::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CCamLocationSettingContainer::ConstructL()
+    {
+    PRINT(_L("Camera => CCamLocationSettingContainer::ConstructL") )
+	PRINT(_L("Camera <= CCamLocationSettingContainer::ConstructL") )
+    }
+
+// -----------------------------------------------------------------------------
+// CCamLocationSettingContainer::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CCamLocationSettingContainer* 
+CCamLocationSettingContainer::NewL( MCamAppController& aController,
+                                    TCamCameraMode     aMode,
+                                    CCoeControl*       aParent )
+    {
+    CCamLocationSettingContainer* self = 
+        new( ELeave ) CCamLocationSettingContainer( aController, aMode, aParent );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+    return self;
+    }
+
+    
+// -----------------------------------------------------------------------------
+// CCamLocationSettingContainer::~CCamLocationSettingContainer
+// Destructor
+// -----------------------------------------------------------------------------
+//
+CCamLocationSettingContainer::~CCamLocationSettingContainer()
+  {
+  PRINT( _L("Camera => ~CCamLocationSettingContainer") );
+  CCamAppUiBase* appUi = static_cast<CCamAppUiBase*>( iEikonEnv->AppUi() );
+  if ( appUi )
+    {
+    TInt resId = ( ECamControllerVideo == iMode )
+               ? R_CAM_VIDEO_SETTINGS_TITLE_NAME
+               : R_CAM_PHOTO_SETTINGS_TITLE_NAME;
+    
+    TRAP_IGNORE( appUi->SetTitleL( resId ) );
+    }
+    iDescArray.ResetAndDestroy();
+    iDescLayoutArray.Close();
+    if ( iCurrentDescLineArray )
+        {
+        iCurrentDescLineArray->Reset();
+        delete iCurrentDescLineArray;
+        } 
+    delete iListBox;
+    
+    if ( iTextTitle )
+        {
+        delete iTextTitle;
+        iTextTitle = NULL;
+        }
+    
+  PRINT( _L("Camera <= ~CCamLocationSettingContainer") );
+  }
+
+// -----------------------------------------------------------------------------
+// CCamLocationSettingContainer::SelectedQuality
+// Returns the value selected by the listbox
+// -----------------------------------------------------------------------------
+//
+TInt CCamLocationSettingContainer::SelectedValue() const
+    {
+    CCamCaptureSetupListBoxModel *model = static_cast<CCamCaptureSetupListBoxModel *>( iListBox->Model() );
+    return model->ItemValue( iListBox->CurrentItemIndex() ); 
+    }
+
+// -----------------------------------------------------------------------------
+// CCamLocationSettingContainer::ConstructFromResourceL
+// Constructs the container from the resource
+// -----------------------------------------------------------------------------
+//
+void CCamLocationSettingContainer::ConstructFromResourceL( TResourceReader& /*aReader*/ )
+    {
+    CAknViewAppUi* viewAppUi = static_cast<CAknViewAppUi*>( CCoeEnv::Static()->AppUi() );
+    CGSCamcorderPlugin* parent = static_cast<CGSCamcorderPlugin*> 
+                               ( viewAppUi->View( KGSCamcorderGSPluginUid ) );
+
+   // set up the container windows here as setting page window
+    // isn't created until CAknSettingPage::ConstructFromResourceL is called
+    SetContainerWindowL( *iParent );
+    
+    TRect mainPaneRect;
+    AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane,
+            mainPaneRect );
+    TRect statusPaneRect;
+    AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EStatusPane,
+            statusPaneRect );
+    
+    // layout area rectangle contains the area, where components need to be 
+    // drawn to. the container size is the whole screen, but the layouts are 
+    // for the client area. aRect is the container size that might include or
+    // might not include statuspane area. calculating area self will
+    // go around the problem
+    TRect layoutAreaRect;
+    layoutAreaRect = mainPaneRect;
+    layoutAreaRect.BoundingRect( statusPaneRect );
+    
+    // set the layouts for the rect containing the description
+    if ( CamUtility::IsNhdDevice() ) 
+        {
+        if ( Layout_Meta_Data::IsLandscapeOrientation() )
+            {
+            iSummaryRect.LayoutRect( layoutAreaRect, AknLayoutScalable_Apps::main_cset_text2_pane( 0 ) );
+            }
+        else
+            {
+            iSummaryRect.LayoutRect( layoutAreaRect, AknLayoutScalable_Apps::main_cset_text2_pane( 1 ) );
+            }
+        }
+    else
+        {
+        iSummaryRect.LayoutRect( layoutAreaRect, AknLayoutScalable_Apps::main_cset6_text2_pane( 0 ) );
+        }
+    
+	TRAPD( ignore, 
+	       ConstructSummaryDetailsFromResourceL( R_CAM_OFF_ON_LOC_TEXT_LIST_SUMMARY ); 
+	     )
+    if ( ignore )
+        { 
+        // Do nothing ( removes build warning )
+        }
+ 
+	iCurrentDescLineArray  = new( ELeave ) CArrayFixFlat<TPtrC>( 5 );
+	
+    // set layout for 5 lines of descriptive text
+    iDescLayoutArray.Reset();
+    TAknLayoutText layout;
+    TAknLayoutScalableParameterLimits listLimits = 
+        AknLayoutScalable_Apps::main_cset_text2_pane_t1_copy1_ParamLimits( 0 );
+    TInt lineCount = listLimits.LastRow() + 1;
+    for ( TInt i = 0; i < lineCount; i++ )
+        {
+        if ( CamUtility::IsNhdDevice() ) 
+            {
+            layout.LayoutText( iSummaryRect.Rect(), 
+                AknLayoutScalable_Apps::main_cset_text2_pane_t1( i ) );
+            }
+        else
+            {
+            layout.LayoutText( iSummaryRect.Rect(), 
+                AknLayoutScalable_Apps::main_cset_text2_pane_t1_copy1(0,0,i) );
+            }
+        User::LeaveIfError( iDescLayoutArray.Append( layout ) );
+        }
+    
+	TInt listInt = ECamSettingItemRecLocation;
+	iListBox =	new( ELeave ) CCamCaptureSetupListBox( this, iController );
+	iListBox->ConstructL( this, 
+	                      R_CAM_OFF_ON_LOC_TEXT_LIST, 
+	                      TInt( ECamSettingItemRecLocation ), 
+	                      0, 
+	                      EFalse, 
+	                      ETrue );
+	if ( parent )
+	    {
+	    iListBox->InitializeL
+		    ( parent->IntegerSettingValue( listInt ) );
+		}
+	iListBox->SetContainerWindowL( *iParent );
+	
+	TRect listboxRect;
+	ReadListboxLayoutL(listboxRect);
+    
+    // Determine the height of the listbox; Either the height based on the number of items,
+    // or the maximum allowed listbox height.
+    CEikScrollBarFrame::TScrollBarVisibility visibility = CEikScrollBarFrame::EOff;
+    TInt maxListBoxHeight = listboxRect.Height();
+    TInt listBoxHeight = iListBox->CalcHeightBasedOnNumOfItems( 
+                                        iListBox->Model()->NumberOfItems() );
+    if ( maxListBoxHeight < listBoxHeight )
+        {
+        // there are more items than would fit to the listbox rectangle
+        
+        // the maximum height is the total height of items 
+        // that can fit to the maxlistboxheight
+        TInt itemHeight = iListBox->ItemHeight();
+        TInt itemsVisible = maxListBoxHeight / itemHeight;
+        listBoxHeight = itemsVisible * itemHeight;
+        
+        // the scrollbar needs to be turned on
+        visibility = CEikScrollBarFrame::EOn;
+        }
+
+    // get layout for the listbox rect
+    TAknLayoutRect listboxLayoutRect;
+    if ( visibility == CEikScrollBarFrame::EOn )
+        {
+        // if scrollbars are used, use scrollbar layout
+        if ( CamUtility::IsNhdDevice() ) 
+            {
+            listboxLayoutRect.LayoutRect( listboxRect, 
+                AknLayoutScalable_Apps::main_cset_list_pane( 0 ) );
+            }
+        else
+            {
+            listboxLayoutRect.LayoutRect( listboxRect, 
+                AknLayoutScalable_Apps::main_cset_list_pane_copy1( 0 ) );
+            }
+        }
+    else
+        {
+        if ( CamUtility::IsNhdDevice() ) 
+            {
+            listboxLayoutRect.LayoutRect( listboxRect, 
+                AknLayoutScalable_Apps::main_cset_list_pane( 1 ) );
+            }
+        else
+            {
+            listboxLayoutRect.LayoutRect( listboxRect, 
+                AknLayoutScalable_Apps::main_cset_list_pane_copy1( 1 ) );
+            }
+        }
+    
+    // layout scrollbarpane (will not be visible if not needed)
+    TAknLayoutRect scrollbarLayoutRect;
+    if ( CamUtility::IsNhdDevice() ) 
+        {
+        scrollbarLayoutRect.LayoutRect( listboxRect, 
+            AknLayoutScalable_Apps::scroll_pane_cp028( 0 ) );
+        }
+    else
+        {
+        scrollbarLayoutRect.LayoutRect( listboxRect, 
+            AknLayoutScalable_Apps::scroll_pane_cp028_copy1( 0 ) );
+        }
+    
+    // calculate the layout for the listbox with changed height
+    const AknLayoutUtils::SAknLayoutControl listboxLayout =
+    {   ELayoutEmpty, listboxRect.iTl.iX, listboxRect.iTl.iY, 
+        ELayoutEmpty, ELayoutEmpty, 
+        listboxLayoutRect.Rect().Width(), listBoxHeight };
+    
+    AknLayoutUtils::LayoutControl( iListBox, 
+            layoutAreaRect, listboxLayout);
+    
+    iListBox->CreateScrollBarFrameL( ETrue );
+    iListBox->ScrollBarFrame()->SetScrollBarVisibilityL( 
+                                            CEikScrollBarFrame::EOff, 
+                                            visibility );
+    iListBox->MakeVisible( ETrue );
+    iListBox->SetFocus( EFalse, ENoDrawNow );
+    iListBox->UpdateScrollBarsL();
+    iListBox->ScrollBarFrame()->DrawScrollBarsNow();
+    iListBox->SetListBoxObserver(this);
+    SplitCurrentTextL();
+    
+    // Prevents the system filling invalidated areas with the background colour - 
+    // helps reduce flicker.
+    Window().SetBackgroundColor();
+
+    ConstructContainerTitleFromResourceL( R_CAM_PHOTO_LOCATION_SETTINGS_TITLE_NAME ); 
+    CCamAppUiBase* appUi = static_cast<CCamAppUiBase*>( iEikonEnv->AppUi() );
+    appUi->SetTitleL( iTextTitle->Des() );
+    }
+
+// -----------------------------------------------------------------------------
+// CCamLocationSettingContainer::CountComponentControls
+// return the number of component controls
+// -----------------------------------------------------------------------------
+//
+TInt CCamLocationSettingContainer::CountComponentControls() const
+    {
+    return 1; // the listbox
+    }
+
+// -----------------------------------------------------------------------------
+// CCamLocationSettingContainer::ComponentControl
+// return the control at a given index
+// -----------------------------------------------------------------------------
+//
+CCoeControl* CCamLocationSettingContainer::ComponentControl( TInt /*aIndex*/ ) const
+    {
+    return iListBox;
+    }
+
+// -----------------------------------------------------------------------------
+// CCamLocationSettingContainer::Draw
+// Draws the container
+// -----------------------------------------------------------------------------
+//
+void CCamLocationSettingContainer::Draw( const TRect& /*aRect*/ ) const
+    {
+    CWindowGc& gc = SystemGc();
+
+    // Draw skin background
+    MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+    MAknsControlContext* cc = AknsDrawUtils::ControlContext( this );
+    AknsDrawUtils::Background( skin, cc, gc, Rect() );
+ 
+     // Draw summary text                              
+    DrawSummaryText( gc );
+    }
+
+// -----------------------------------------------------------------------------
+// CCamLocationSettingContainer::SizeChanged
+// Handles a change in the size of the control
+// -----------------------------------------------------------------------------
+//
+void CCamLocationSettingContainer::SizeChanged()
+    {
+    // Do this only if the listbox has been created, ie. ConstructFromResourceL() has been called
+    if (iListBox)
+        {
+        TRect listboxRect;
+        TRAPD( ignore, ReadListboxLayoutL(listboxRect) );
+        if ( ignore )
+            { 
+            // Just return if the resource reader fails
+            return;
+            }   
+    
+        TRect mainPaneRect;
+        AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane,
+                mainPaneRect );
+        TRect statusPaneRect;
+        AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EStatusPane,
+                statusPaneRect );
+        
+        // layout area rectangle contains the area, where components need to be 
+        // drawn to. the container size is the whole screen, but the layouts are 
+        // for the client area. aRect is the container size that might include or
+        // might not include statuspane area. calculating area self will
+        // go around the problem
+        TRect layoutAreaRect;
+        layoutAreaRect = mainPaneRect;
+        layoutAreaRect.BoundingRect( statusPaneRect );
+    
+        // Determine the height of the listbox; Either the height based on the number of items,
+        // or the maximum allowed listbox height.
+        CEikScrollBarFrame::TScrollBarVisibility visibility = CEikScrollBarFrame::EOff;
+        TInt maxListBoxHeight = listboxRect.Height();
+        TInt listBoxHeight = iListBox->CalcHeightBasedOnNumOfItems( 
+                                            iListBox->Model()->NumberOfItems() );
+        if ( maxListBoxHeight < listBoxHeight )
+            {
+            // there are more items than would fit to the listbox rectangle
+            
+            // the maximum height is the total height of items 
+            // that can fit to the maxlistboxheight
+            TInt itemHeight = iListBox->ItemHeight();
+            TInt itemsVisible = maxListBoxHeight / itemHeight;
+            listBoxHeight = itemsVisible * itemHeight;
+            
+            // the scrollbar needs to be turned on
+            visibility = CEikScrollBarFrame::EOn;
+            }
+    
+        // get layout for the listbox rect
+        TAknLayoutRect listboxLayoutRect;
+        if ( visibility == CEikScrollBarFrame::EOn )
+            {
+            // if scrollbars are used, use scrollbar layout
+            if ( CamUtility::IsNhdDevice() ) 
+                {
+                listboxLayoutRect.LayoutRect( listboxRect, 
+                    AknLayoutScalable_Apps::main_cset_list_pane( 0 ) );
+                }
+            else
+                {
+                listboxLayoutRect.LayoutRect( listboxRect, 
+                    AknLayoutScalable_Apps::main_cset_list_pane_copy1( 0 ) );
+                }
+            }
+        else
+            {
+            if ( CamUtility::IsNhdDevice() ) 
+                {
+                listboxLayoutRect.LayoutRect( listboxRect, 
+                    AknLayoutScalable_Apps::main_cset_list_pane( 1 ) );
+                }
+            else
+                {
+                listboxLayoutRect.LayoutRect( listboxRect, 
+                    AknLayoutScalable_Apps::main_cset_list_pane_copy1( 1 ) );
+                }
+            }
+        
+        // layout scrollbarpane (will not be visible if not needed)
+        TAknLayoutRect scrollbarLayoutRect;
+        if ( CamUtility::IsNhdDevice() ) 
+            {
+            scrollbarLayoutRect.LayoutRect( listboxRect, 
+                AknLayoutScalable_Apps::scroll_pane_cp028( 0 ) );
+            }
+        else
+            {
+            scrollbarLayoutRect.LayoutRect( listboxRect, 
+                AknLayoutScalable_Apps::scroll_pane_cp028_copy1( 0 ) );
+            }
+        
+        // calculate the layout for the listbox with changed height
+        const AknLayoutUtils::SAknLayoutControl listboxLayout =
+        {   ELayoutEmpty, listboxRect.iTl.iX, listboxRect.iTl.iY, 
+            ELayoutEmpty, ELayoutEmpty, 
+            listboxLayoutRect.Rect().Width(), listBoxHeight };
+        
+        AknLayoutUtils::LayoutControl( iListBox, 
+                layoutAreaRect, listboxLayout);
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CCamLocationSettingContainer::OfferKeyEventL
+// Handles key events
+// -----------------------------------------------------------------------------
+//
+TKeyResponse CCamLocationSettingContainer::OfferKeyEventL( const TKeyEvent& aKeyEvent, 
+                                                          TEventCode aType ) 
+    {
+    TKeyResponse keyResponse = iListBox->OfferKeyEventL( aKeyEvent, aType );
+    if ( keyResponse == EKeyWasConsumed )
+        {
+        ReportEventL( MCoeControlObserver::EEventStateChanged );
+        }
+    return keyResponse;
+    }
+
+// -----------------------------------------------------------------------------
+// CCamLocationSettingContainer::HandleSettingValueUpdateL
+// Handles a change to the setting value
+// -----------------------------------------------------------------------------
+//
+void CCamLocationSettingContainer::HandleSettingValueUpdateL( TInt /*aNewValue*/ )
+    {
+    SplitCurrentTextL();
+    ActivateGc();
+    Window().Invalidate( iSummaryRect.Rect() );
+    DeactivateGc();
+    }
+
+// -----------------------------------------------------------------------------
+// CCamLocationSettingContainer::ReadListboxLayoutL
+// Reads the listbox layout
+// -----------------------------------------------------------------------------
+//
+void CCamLocationSettingContainer::ReadListboxLayoutL( TRect& aRect )
+    {
+    TRect mainPaneRect;
+    AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane,
+            mainPaneRect );
+    TRect statusPaneRect;
+    AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EStatusPane,
+            statusPaneRect );
+        
+    // layout area rectangle contains the area, where components need to be 
+    // drawn to. the container size is the whole screen, but the layouts are 
+    // for the client area. aRect is the container size that might include or
+    // might not include statuspane area. calculating area self will
+    // go around the problem
+    TRect layoutAreaRect;
+    layoutAreaRect = mainPaneRect;
+    layoutAreaRect.BoundingRect( statusPaneRect );
+    
+    // get the rect size for listbox in the layout
+    TAknLayoutRect listboxLayoutRect;
+    if ( CamUtility::IsNhdDevice() ) 
+        {
+        if ( Layout_Meta_Data::IsLandscapeOrientation() )
+            {
+            listboxLayoutRect.LayoutRect( layoutAreaRect, 
+                AknLayoutScalable_Apps::main_cset_listscroll_pane( 4 ) );
+            }
+        else
+            {
+            listboxLayoutRect.LayoutRect( layoutAreaRect, 
+                AknLayoutScalable_Apps::main_cset_listscroll_pane( 5 ) );
+            }
+        }
+    else
+        {
+        listboxLayoutRect.LayoutRect( layoutAreaRect, 
+            AknLayoutScalable_Apps::main_cset6_listscroll_pane( 4 ) );
+        }
+    aRect.SetRect(listboxLayoutRect.Rect().iTl, listboxLayoutRect.Rect().Size() );
+    }
+
+// -----------------------------------------------------------------
+// CCamLocationSettingContainer::ConstructSummaryDetailsFromResourceL
+// Sets up the layouts of the summary items
+// -----------------------------------------------------------------
+void CCamLocationSettingContainer::ConstructSummaryDetailsFromResourceL(TInt aResourceId)
+    {
+    TResourceReader reader;                                                                                     
+    iEikonEnv->CreateResourceReaderLC( reader, aResourceId ); 
+    const TInt count = reader.ReadInt16();
+
+    TInt i              = -1;
+    // bitmapID and SummarySceneId are needed since we are using
+    // a resource that requires fetching those values also.
+    // The reason why the resource itself is not changed is
+    // that we are using a CamCaptureSetupListBox that needs those.
+    // This requires much less work if not creating own listbox type that
+    // would otherwise have to be created. CamCaptureSetupListBox is now
+    // used here in such a way that the listbox icon are is set to zero width
+    // and no bitmap icon is showed.
+    TInt bitmapId = -1;
+    // To remove warning about setting variable but never using it
+    TInt summarySceneId = bitmapId;
+    // made to remove warning. (explained above comments)
+    bitmapId = summarySceneId;
+     
+    HBufC16* descr = NULL;
+    
+    // Read all of the summary entries from the resource file
+    for ( i = 0; i < count; i++ )
+        {
+        summarySceneId = reader.ReadInt16();
+        bitmapId       = reader.ReadInt32();
+        descr          = reader.ReadHBufC16L();
+
+	    // This hack because an empty resource string which comes as NULL from the resource reader.
+	    // This would create crash later on.
+	    if ( NULL == descr )
+	        {
+	        _LIT(KText,"");
+	        HBufC* buf;
+	        buf = HBufC::NewL(0);
+	        *buf = KText;
+	        User::LeaveIfError( iDescArray.Append( buf ) );
+	        }
+	    else 
+	        {
+	        User::LeaveIfError( iDescArray.Append( descr ) );
+	        }
+        }    
+    CleanupStack::PopAndDestroy(); // reader       
+    }
+
+
+// -----------------------------------------------------------------
+// CCamLocationModeContainer::DrawSummaryText
+// Draws summary title and description text
+// -----------------------------------------------------------------
+void CCamLocationSettingContainer::DrawSummaryText( CWindowGc& aGc ) const
+    {
+//    aGc.SetBrushColor( KRgbShadedWhite );
+//    aGc.Clear( iSummaryRect.Rect() );
+
+    TInt count = iCurrentDescLineArray->Count();
+    TInt layoutCount = iDescLayoutArray.Count();
+    TRgb color; 
+    MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+    AknsUtils::GetCachedColor( skin, color, KAknsIIDQsnTextColors, EAknsCIQsnTextColorsCG6 );
+
+    if ( layoutCount < count )
+        {
+        count = layoutCount;
+        }
+    TInt i;        
+    for ( i = 0; i < count; i++ )
+        {
+        iDescLayoutArray[i].DrawText( aGc, ( *iCurrentDescLineArray )[i], ETrue, color );
+        }
+    }
+    
+// -----------------------------------------------------------------
+// CCamLocationModeContainer::SplitCurrentTextL
+// Splits the summary title and description text into multiple lines that fit the status layouts
+// -----------------------------------------------------------------
+void CCamLocationSettingContainer::SplitCurrentTextL()
+    {
+    // Use the layout info from the first line for width and font
+    TAknLayoutText layout = iDescLayoutArray[0];
+   	AknTextUtils::WrapToArrayL( *iDescArray[iListBox->CurrentItemIndex()],
+                                layout.TextRect().Width(),
+                                *( layout.Font() ),
+                                *iCurrentDescLineArray );
+    }
+
+
+// --------------------------------------------------------------------------
+// CCamLocationSettingContainer::ConstructContainerTitleFromResourceL
+// --------------------------------------------------------------------------
+//
+void CCamLocationSettingContainer::ConstructContainerTitleFromResourceL( TInt aResourceId )
+    {
+    TResourceReader reader;
+    iEikonEnv->CreateResourceReaderLC( reader, aResourceId ); // cleanupstack
+    
+    iTextTitle = reader.ReadHBufC16L();    
+    
+    CleanupStack::PopAndDestroy(); // reader
+    }
+
+// --------------------------------------------------------------------------
+// CCamLocationSettingContainer::HandlePointerEventL
+// --------------------------------------------------------------------------
+//    
+void CCamLocationSettingContainer::HandlePointerEventL( const TPointerEvent& aPointerEvent ) 
+    {
+    RDebug::Print(_L("CCamLocationSettingContainer::HandlePointerEventL iType=%d iPosition=(%d, %d)"),
+            aPointerEvent.iType,
+            aPointerEvent.iPosition.iX,
+            aPointerEvent.iPosition.iY );
+    iListBox->HandlePointerEventL( aPointerEvent );
+    /*TInt oldListItemIndex = -1;
+    TInt newListItemIndex = -1;
+    TBool handleItemActivation = EFalse;
+   
+    if ( iListBox )
+        {
+        oldListItemIndex = iListBox->CurrentItemIndex();
+        }
+  
+    CCoeControl::HandlePointerEventL( aPointerEvent );       
+       
+    if ( iListBox )
+        {
+        newListItemIndex = iListBox->CurrentItemIndex();
+        }
+       
+    if ( oldListItemIndex != -1 && newListItemIndex != -1 )
+        {
+        
+        // figure out if item was activated by touch down + release combination on same item
+        if ( aPointerEvent.iType == TPointerEvent::EButton1Down )
+            {
+            if ( newListItemIndex != oldListItemIndex )
+                {
+                iActivateOnTouchRelease = EFalse;
+                }
+            else 
+                {
+                // set the current item to be activated on touch release
+                iActivateOnTouchRelease = ETrue;
+                }
+            }
+        else if ( aPointerEvent.iType == TPointerEvent::EButton1Up )
+            {
+            if ( iActivateOnTouchRelease && ( newListItemIndex == oldListItemIndex ) )
+                {
+                TInt pointedItemIndex;
+                TBool focusableItemPointed = iListBox->View()->XYPosToItemIndex(aPointerEvent.iPosition, pointedItemIndex );
+                // check that pointer is in focusable area
+                if ( focusableItemPointed )
+                    {
+                    // only if list item index has not changed during event and iActivateOnTouchRelease is true
+                    handleItemActivation = ETrue;
+                    iActivateOnTouchRelease = EFalse;                       
+                    }
+                else
+                    {
+                    iActivateOnTouchRelease = EFalse;                       
+                    }
+                }
+            }
+        else 
+            {
+            // aPointerEvent.iType == TPointerEvent::EDrag
+            
+            if ( newListItemIndex != oldListItemIndex )
+                {
+                // change only when drag event changes the listitem index
+                iActivateOnTouchRelease = EFalse;
+                }
+            }
+    
+        } // end if ( oldListItemIndex != -1 && newListItemIndex != -1 )
+    
+    if ( handleItemActivation )
+        {
+        TKeyEvent key;
+        key.iRepeats = 0;
+        key.iCode = EKeyOK;
+        key.iModifiers = 0;
+        iEikonEnv->SimulateKeyEventL( key, EEventKey );
+        }*/
+        
+    } // end of HandlePointerEventL
+// ---------------------------------------------------------------------------
+// CCamLocationSettingContainer::HandleListBoxEventL
+// Handles Listbox events
+// ---------------------------------------------------------------------------
+//
+void CCamLocationSettingContainer::HandleListBoxEventL( CEikListBox* aListBox, 
+                                                    TListBoxEvent aEventType )
+    {
+    
+    switch( aEventType )
+        {
+        
+        case EEventEnterKeyPressed:
+        case EEventItemDoubleClicked:
+        case EEventItemSingleClicked:
+              {
+               TKeyEvent key;
+               key.iRepeats = 0;
+               key.iCode = EKeyOK;
+               key.iModifiers = 0;
+               iEikonEnv->SimulateKeyEventL( key, EEventKey );
+              }
+              break;  
+        case EEventItemClicked:
+            {
+            HandleSettingValueUpdateL( iListBox->CurrentItemIndex() );          
+            }
+            break;
+        default:
+            break;
+        }
+    }
+//  End of File