vtuis/videotelui/src/features/prefs/cvtuiprefsettinglistbase.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Fri, 19 Feb 2010 22:53:04 +0200
branchRCL_3
changeset 8 07d1685f0cd4
parent 0 ed9695c8bcbe
child 10 f84a661cfc1d
permissions -rw-r--r--
Revision: 201002 Kit: 201007

/*
* 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:  Softkey UI feature implementation.
*
*/


#include    <cvtengmodel.h>
#include    <mvtengcamerapreferences.h>
#include    <eikenv.h>
#include    <cvtlogger.h>
#include    <avkon.hrh>

#include    "cvtuiprefsettinglistbase.h"
#include    "CVtUiAppUi.h"
#include    "cvtuitransparentsettingpage.h"
#include    "CVtUiMainControl.h"
#include    "CVtUiContextControl.h"
#include    "CVtUiRemoteVideoControl.h"
#include    "cvtuifeaturemanager.h"
#include    "VtUiLayout.h"

#include    <layoutmetadata.cdl.h>

// constants
static const TInt KMaxNumberOfArrayItems = 5;
static const TInt KMaxNumberOfActiveItems = 5;

// ---------------------------------------------------------------------------
// CVtUiPrefSettingListBase::~CVtUiPrefSettingListBase
// ---------------------------------------------------------------------------
// 
CVtUiPrefSettingListBase::~CVtUiPrefSettingListBase()
    {
    __VTPRINTENTER( "CVtUiPrefSettingListBase.~CVtUiPrefSettingListBase" )
    delete iViewfinderBitmap;
    delete iSettingPage;
    iActiveItems.Close();
    __VTPRINTEXIT( "CVtUiPrefSettingListBase.~CVtUiPrefSettingListBase" )
    }

// ---------------------------------------------------------------------------
// CVtUiPrefSettingListBase::InitFeatureL
// ---------------------------------------------------------------------------
// 
void CVtUiPrefSettingListBase::InitFeatureL()
    {
    __VTPRINTENTER( "CVtUiPrefSettingListBase.InitFeatureL" )
    ResizeBackroundBitmapRect();
    __VTPRINTEXIT( "CVtUiPrefSettingListBase.InitFeatureL" )
    }

// ---------------------------------------------------------------------------
// CVtUiPrefSettingListBase::IsPendingCmd
// ---------------------------------------------------------------------------
//
TBool CVtUiPrefSettingListBase::IsPendingCmd()
    {
    return iPendingSettingChangeCmd;
    }

// ---------------------------------------------------------------------------
// CVtUiPrefSettingListBase::HandlePendingCmd
// ---------------------------------------------------------------------------
//
void CVtUiPrefSettingListBase::HandlePendingCmdL()
    {
    SettingPageItemChangedL( iOriginalSelection );
    }

// ---------------------------------------------------------------------------
// CVtUiPrefSettingListBase::HandleSettingPageEventL
// ---------------------------------------------------------------------------
//
void CVtUiPrefSettingListBase::HandleSettingPageEventL(
    CAknSettingPage* /*aSettingPage*/, TAknSettingPageEvent aEventType )
    {
    __VTPRINTENTER( "CVtUiPrefSettingListBase.HandleSettingPageEventL" )
    const TInt currentItem = iSettingPage->ListBoxControl()->CurrentItemIndex();      
    switch ( aEventType )
        {
        case EEventSettingCancelled:
             {
             if ( iOriginalSelection != currentItem )
                {
                // Set back to orginal selection
                SettingPageItemChangedL( iOriginalSelection );
                iCurrentSelection = iOriginalSelection;
                }
             Stop();
             break;   
             }     
         case EEventSettingChanged:
             {
             SettingPageItemChangedL( currentItem );
             iOriginalSelection = currentItem;
             Stop();
             break;
             }
         case EEventSettingOked:
             {
             // Check if the current selection has changed
             if ( iOriginalSelection != currentItem )
                 {       
                 SettingPageItemChangedL( currentItem );
                 iOriginalSelection = currentItem;
                 iCurrentSelection = currentItem;
                 }                 
             Stop();                 
             break;
             }
         default:
             break;
        }
    __VTPRINTEXIT( "CVtUiPrefSettingListBase.HandleSettingPageEventL" )        
    }

// ---------------------------------------------------------------------------
// CVtUiPrefSettingListBase::ListStateChangedL
// ---------------------------------------------------------------------------
//
void CVtUiPrefSettingListBase::ListStateChangedL()
    {
    __VTPRINTENTER( "CVtUiPrefSettingListBase.ListStateChangedL" )
    // Check if new item is focused in the selection list
    
    const TInt currentItem = iSettingPage->ListBoxControl()->CurrentItemIndex();
    if ( iCurrentSelection != currentItem )
        {
        // Update current selection
        iCurrentSelection = currentItem;
        // Adjust frame
        SettingPageItemChangedL( currentItem );    
        }    
    __VTPRINTEXIT( "CVtUiPrefSettingListBase.ListStateChangedL" )
    }

// ---------------------------------------------------------------------------
// CVtUiPrefSettingListBase::StartSettingPageL
// ---------------------------------------------------------------------------
//
void CVtUiPrefSettingListBase::StartSettingPageL()
    {
    __VTPRINTENTER( "CVtUiPrefSettingListBase.StartSettingPageL" )
    // Swap image places if needed
    iAppUi.SwitchViewFinderToMainPaneL();
	    
    // Get context control's window priority and position
    iContextControlWindowPriority = iAppUi.ContextControl().DrawableWindow()
        ->OrdinalPriority();
    iContextControlWindowPosition = iAppUi.ContextControl().DrawableWindow()
        ->OrdinalPosition();
    
    // Get remote video control's window priority and position
    iRemoteVideoControlWindowPriority = 
            iAppUi.RemoteVideoControl().DrawableWindow()->OrdinalPriority();
    iRemoteVideoControlWindowPosition = 
            iAppUi.RemoteVideoControl().DrawableWindow()->OrdinalPosition();
    
    // Rise context control's window priority othwerwise setting page will be
    // drawn partially over the context control window.
    iAppUi.ContextControl().DrawableWindow()->SetOrdinalPosition( 
        iContextControlWindowPosition, iContextControlWindowPriority + 1 );
    
    // Rise remote video control's window priority othwerwise setting page 
    // will be drawn partially over the context control window.
    iAppUi.RemoteVideoControl().DrawableWindow()->SetOrdinalPosition(
        iRemoteVideoControlWindowPosition, 
        iRemoteVideoControlWindowPriority + 2 );

    // Creates setting page
    CreateSettingPageL();
    // Launch setting page.
    iSettingPage->ExecuteLD( CAknSettingPage::EUpdateWhenAccepted, EFalse );
    iSettingPage = NULL;
    __VTPRINTEXIT( "CVtUiPrefSettingListBase.StartSettingPageL" )
    }

// ---------------------------------------------------------------------------
// CVtUiPrefSettingListBase::StopSettingPageL
//    
//
void CVtUiPrefSettingListBase::StopSettingPageL()
    {
    __VTPRINTENTER( "CVtUiPrefSettingListBase.StopSettingPageL" )
    // Swap image places if needed  
    iAppUi.RestoreViewFinderL();
    
    if ( iSettingPage)
        {
        // Cancell the setting page
        TKeyEvent keyEvent;
        keyEvent.iCode =  EKeyEscape;
        iSettingPage->OfferKeyEventL( keyEvent, EEventKey );
        }
        
    // Set remote video control's window priority and position back to 
    // orginal value.
    iAppUi.RemoteVideoControl().DrawableWindow()->SetOrdinalPosition(
            iRemoteVideoControlWindowPosition, 
            iRemoteVideoControlWindowPriority );
    
    // Set contex control's window priority and position back to 
    // orginal value.
    iAppUi.ContextControl().DrawableWindow()->SetOrdinalPosition( 
        iContextControlWindowPosition, iContextControlWindowPriority );
    
    __VTPRINTEXIT( "CVtUiPrefSettingListBase.StopSettingPageL" )
    }

// ---------------------------------------------------------------------------
// CVtUiPrefSettingListBase::SizeChanged
// ---------------------------------------------------------------------------
//
void CVtUiPrefSettingListBase::SizeChanged()
    {
    __VTPRINTENTER( "CVtUiPrefSettingListBase.SizeChanged" )
    ResizeBackroundBitmapRect();
    // Set new coordinates and size
    iSettingPage->SetBitmapPositionAndClipRect( iBitmapTopLeftCorner,
        iBitmapClippingRect );
    iSettingPage->HandleLayoutChangeL();
    __VTPRINTEXIT( "CVtUiPrefSettingListBase.SizeChanged" )
    }

// ---------------------------------------------------------------------------
// CVtUiPrefSettingListBase::UpdateBackground
// ---------------------------------------------------------------------------
//
void CVtUiPrefSettingListBase::UpdateBackground( CFbsBitmap* aFrame )
    {
    __VTPRINTENTER( "CVtUiPrefSettingListBase.UpdateBackground" )
    if ( aFrame )
        {
        // aFrame is valid only in this callback, the bitmap
        // must be copied for use as the setting page background
        iViewfinderBitmap->Duplicate( aFrame->Handle() );
        if ( iSettingPage )
            {
            // Update background
            iSettingPage->ChangeBackground( iViewfinderBitmap );
            }
        }
    __VTPRINTEXIT( "CVtUiPrefSettingListBase.UpdateBackground" )        
    }
    
// ---------------------------------------------------------------------------
// CVtUiPrefSettingListBase::UpdateSettingL
// ---------------------------------------------------------------------------
// 
void CVtUiPrefSettingListBase::UpdateSettingL()
    {
    // if no active items do nothing
    if ( iActiveItems.Count() > 0 )
        {
        // user change the focuse in the list but not
        // select it indeed
        if( iOriginalSelection != iCurrentSelection )  
            SettingPageItemChangedL( iCurrentSelection );
        else
        // yes,user has tapped down the OK button to choose a item
            SettingPageItemChangedL( iOriginalSelection );        
        }
    }
        
// ---------------------------------------------------------------------------
// CVtUiPrefSettingListBase::CVtUiPrefSettingListBase
// ---------------------------------------------------------------------------
//
CVtUiPrefSettingListBase::CVtUiPrefSettingListBase( CVtUiFeatureManager&
    aFeatureManager,  TVtUiFeatureId aFeatureId ) : CVtUiFeatureBase(
    aFeatureId, aFeatureManager ), iActiveItems( KMaxNumberOfActiveItems ), 
    iBitmapTopLeftCorner( 0, 0 ), iAppUi( aFeatureManager.AppUi() ),iPendingSettingChangeCmd( EFalse )
    {
    __VTPRINTENTER( "CVtUiPrefSettingListBase.CVtUiPrefSettingListBase" )   
    __VTPRINTEXIT( "CVtUiPrefSettingListBase.CVtUiPrefSettingListBase" )
    }


// ---------------------------------------------------------------------------
// CVtUiPrefSettingListBase::ConstructL
// ---------------------------------------------------------------------------
//
void CVtUiPrefSettingListBase::ConstructL()
    {
    __VTPRINTENTER( "CVtUiPrefSettingListBase.ConstructL" )
    BaseConstructL();
    // Get camera preferences extension.
    iCameraPref = static_cast<MVtEngCameraPreferences*> (iFeatureManager.
        AppUi().Model().Extension( KVtEngExtensionCameraPreferences ) );
    // Create backgound bitmap
    iViewfinderBitmap = new ( ELeave ) CFbsBitmap();
    __VTPRINTEXIT( "CVtUiPrefSettingListBase.ConstructL" )
    }
     
// ---------------------------------------------------------------------------
// CVtUiPrefSettingListBase::ReadAndAppendItemL
// ---------------------------------------------------------------------------
//
void CVtUiPrefSettingListBase::ReadAndAppendItemL( CDesCArray& aItems,
    TInt aResId )
    {
    __VTPRINTENTER( "CVtUiPrefSettingListBase.ReadAndAppendItemL" )
    HBufC* text = iAppUi.GetEikonEnv()->AllocReadResourceLC( aResId );
    aItems.AppendL( *text );
    CleanupStack::PopAndDestroy(); // text
    __VTPRINTEXIT( "CVtUiPrefSettingListBase.ReadAndAppendItemL" )
    }    
    
// ---------------------------------------------------------------------------
// CVtUiPrefSettingListBase::CreateSettingPageL
// ---------------------------------------------------------------------------
//
void CVtUiPrefSettingListBase::CreateSettingPageL()
    {
    __VTPRINTENTER( "CVtUiPrefSettingListBase.CreateSettingPageL" )
    CDesCArray* selectionArray = new ( ELeave ) 
        CDesCArraySeg( KMaxNumberOfArrayItems );
    CleanupStack::PushL( selectionArray );
    // Set items must be called before CurrentSelection function
    // Otherwise iActiveItems array is not populated
    iActiveItems.Reset();
    SetItemsL( *selectionArray );
    TInt resourceId = SettingPageResId();
    
    // Current selection is needed when a new item is focused in the list
    iCurrentSelection = iOriginalSelection;
    TInt current( CurrentSelection() );
    if ( !iSettingPage )
        {
        iSettingPage = new ( ELeave ) CVtUiTransparentSettingPage( resourceId,
            iCurrentSelection, selectionArray );
        iSettingPage->ConstructL();
        iSettingPage->SetSettingPageObserver( this );
        iSettingPage->SetSettingPageEventStateObserver( this );
        }
     CleanupStack::PopAndDestroy(); // selectionArray        
     ResizeBackroundBitmapRect();
     iSettingPage->SetBitmapPositionAndClipRect( iBitmapTopLeftCorner, 
        iBitmapClippingRect );            
    __VTPRINTEXIT( "CVtUiPrefSettingListBase.CreateSettingPageL" )
    }

// ---------------------------------------------------------------------------
// CVtUiPrefSettingListBase::ShrinkBackroundBitmapRect
// ---------------------------------------------------------------------------
//    
void CVtUiPrefSettingListBase::ResizeBackroundBitmapRect()
    {
    __VTPRINTENTER( "CVtUiPrefSettingListBase.ResizeBackroundBitmapRect" )
    TRect parent( iAppUi.MainControl().Size() );
    TAknWindowLineLayout rect;
    TAknLayoutRect iStreamLayout;
    VtUiLayout::GetSecondWindowStreamLayout( rect, ETrue );
    iStreamLayout.LayoutRect( parent, rect );
    
    // In landscape rect from layout doesn't work 
    // for some reason
    if ( Layout_Meta_Data::IsLandscapeOrientation() )
        {
        iBitmapClippingRect = parent;
        }
    else
        {
        iBitmapClippingRect = iStreamLayout.Rect();
        }
    
    iBitmapTopLeftCorner = iStreamLayout.Rect().iTl;
    __VTPRINTEXIT( "CVtUiPrefSettingListBase.ResizeBackroundBitmapRect" )
    }