profilesapplication/Profiles/ProfileApp/UIsrc/CProfileMainContainer.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:30:29 +0100
branchRCL_3
changeset 19 cd54903d48da
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
* Copyright (c) 2002 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 of main view.
*
*/


// INCLUDE FILES

#include "CProfileMainContainer.h"

#include <AknDef.h>
#include <aknlists.h>
#include <AknUtils.h> // AknTextUtils
#include <featmgr.h>
#include <CProfileEngineHandler.h>
#include <CProfileIndexHandler.h>
#include <MProfileEngineExtended.h>
#include <MProfilesNamesArray.h>
#include <csxhelp/mode.hlp.hrh>
#include <ProfileEng.hrh>

#include "CProfileMainView.h"
#include "CProfileDocument.h"
#include "CProfileApplication.h"
#include "ProfileApp.hrh"
#include "ProfileEngineConstants.h"

// CONSTANTS
_LIT( KTabChar, "\t" );
const TInt KProfileNameArrayGranularity( 5 );

// ============================ MEMBER FUNCTIONS ===============================

// -----------------------------------------------------------------------------
// CProfileMainContainer::CProfileMainContainer
// C++ constructor can NOT contain any code, that might leave.
// -----------------------------------------------------------------------------
//
CProfileMainContainer::CProfileMainContainer(
    CProfileEngineHandler& aEngineHandler,
    CProfileIndexHandler& aIndexHandler,
    CAknView& aView )
    :   iEngineHandler( aEngineHandler ),
        iIndexHandler( aIndexHandler ),
        iView( aView )
    {
    SetMopParent( &aView );
    }

// -----------------------------------------------------------------------------
// CProfileMainContainer::ConstructL
// Symbian 2nd phase constructor can leave.
// -----------------------------------------------------------------------------
//
void CProfileMainContainer::ConstructL( const TRect& aRect )
    {
    CreateWindowL();

    iListBox = new( ELeave ) CAknSingleStyleListBox();
    iListBox->ConstructL( this );
    iListBox->SetListBoxObserver( this );
    iListBox->CreateScrollBarFrameL( ETrue );
    iListBox->ScrollBarFrame()->SetScrollBarVisibilityL(
        CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto );

    SetRect( aRect );
    ActivateL();
    }

// -----------------------------------------------------------------------------
// CProfileMainContainer::NewL
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
CProfileMainContainer* CProfileMainContainer::NewL(
    CProfileEngineHandler& aEngineHandler,
    CProfileIndexHandler& aIndexHandler,
    CAknView& aView )
    {
    CProfileMainContainer* self = new( ELeave ) CProfileMainContainer(
        aEngineHandler, aIndexHandler, aView );
    CleanupStack::PushL( self );
    self->ConstructL( aView.ClientRect() );
    CleanupStack::Pop( self );
    return self;
    }

// Destructor
CProfileMainContainer::~CProfileMainContainer()
    {
    delete iListBox;
    }

// -----------------------------------------------------------------------------
// CProfileMainContainer::PopulateListBoxL
// -----------------------------------------------------------------------------
//
void CProfileMainContainer::PopulateListBoxL( TInt aTopItemIndex )
    {
    // Transfer decorated array ownership for listbox model
    CDesCArrayFlat* decoratedArray =
        new( ELeave ) CDesCArrayFlat( KProfileNameArrayGranularity );
    CTextListBoxModel* model = iListBox->Model();
    model->SetOwnershipType( ELbmOwnsItemArray );
    model->SetItemTextArray( decoratedArray );

    MProfilesNamesArray* array = iEngineHandler.IdArray();

    // Populate the decorated array for listbox
    TInt count( array->MdcaCount() );
    TBuf<PROFILES_MAX_NAME_LENGTH + 1> name; // + 1 for tab character
    for( TInt index( 0 ); index < count; index++ )
        {
        name.Copy( KTabChar );
        TBuf< KProfileMaxNameLength > tmpName( array->MdcaPoint( index ) );
        AknTextUtils::DisplayTextLanguageSpecificNumberConversion( tmpName );
        AknTextUtils::ReplaceCharacters( tmpName, KAknReplaceListControlChars,
                                         TChar( ' ' ) );
        name.Append( tmpName );
        decoratedArray->AppendL( name );
        }

    // Update listbox
    iListBox->HandleItemAdditionL();

    // Update view
    if( aTopItemIndex >= 0 )
        {
        iListBox->SetTopItemIndex( aTopItemIndex );
        }
    iListBox->SetCurrentItemIndex( iIndexHandler.CurrentProfileIndex() );
    iListBox->DrawNow();
    }

// -----------------------------------------------------------------------------
// CProfileMainContainer::TopItemIndex
// -----------------------------------------------------------------------------
//
TInt CProfileMainContainer::TopItemIndex() const
    {
    return iListBox->TopItemIndex();
    }

// -----------------------------------------------------------------------------
// CProfileMainContainer::CountComponentControls
// -----------------------------------------------------------------------------
//
TInt CProfileMainContainer::CountComponentControls() const
    {
    return KMainContainerSubControlCount;
    }

// -----------------------------------------------------------------------------
// CProfileMainContainer::ComponentControl
// -----------------------------------------------------------------------------
//
CCoeControl* CProfileMainContainer::ComponentControl( TInt aIndex ) const
    {
    switch( aIndex )
        {
        case 0:
            {
            return iListBox;
            }
        default:
            {
            return NULL;
            }
        }
    }

// -----------------------------------------------------------------------------
// CProfileMainContainer::SizeChanged
// -----------------------------------------------------------------------------
//
void CProfileMainContainer::SizeChanged()
    {
    if( iListBox )
        {
        iListBox->SetRect( Rect() );    // Set container's rect to listbox
        // Force refreshing of iListBox:
        TRAP_IGNORE( iListBox->HandleItemAdditionL() );
        }
    }

// -----------------------------------------------------------------------------
// CProfileMainContainer::OfferKeyEventL
// -----------------------------------------------------------------------------
//
TKeyResponse CProfileMainContainer::OfferKeyEventL(
    const TKeyEvent& aKeyEvent, TEventCode aType )
    {
    if( aType != EEventKey )
        {
        return EKeyWasNotConsumed;
        }

    switch( aKeyEvent.iCode )
        {
        case EKeyUpArrow: // flow through, both change focus
        case EKeyDownArrow:
            {
            TKeyResponse response( iListBox->OfferKeyEventL( aKeyEvent, aType ) );
            iIndexHandler.SetCurrentProfileIndex( iListBox->CurrentItemIndex() );
            return response;
            }
        case EKeyBackspace: // Clear key
            {
            if( ( FeatureManager::FeatureSupported( KFeatureIdDynamicProfiles ) ) &&
                ( !iEngineHandler.Engine()->IsDefaultProfile(
                    iEngineHandler.IdForIndex( iIndexHandler.CurrentProfileIndex() ) ) ) )
                {
                // If dynamic profiles feature is supported and none of
                // the default profiles is focused, try to delete a profile.
                iView.HandleCommandL( EProfileCmdDelete );
                return EKeyWasConsumed;
                }
            break;
            }
        default:
            {
            break;
            }
        }
    return iListBox->OfferKeyEventL( aKeyEvent, aType );
    }

// -----------------------------------------------------------------------------
// CProfileMainContainer::HandleListBoxEventL
// -----------------------------------------------------------------------------
//
void CProfileMainContainer::HandleListBoxEventL(
    CEikListBox* /* aListBox */, TListBoxEvent aEventType )
    {
    if( ( aEventType == EEventEnterKeyPressed ) ||
        
        ( aEventType == EEventItemSingleClicked ) )
    	{
    	iIndexHandler.SetCurrentProfileIndex( iListBox->CurrentItemIndex() );
        iView.HandleCommandL( EProfileCmdContextSpecificOptionsMenu );
    	}
    }

// -----------------------------------------------------------------------------
// CProfileMainContainer::GetHelpContext
// -----------------------------------------------------------------------------
//
void CProfileMainContainer::GetHelpContext( TCoeHelpContext& aContext ) const
    {
    aContext.iMajor = KUidProfileApp;
    aContext.iContext = KMODE_HLP_PROFILES_LIST;
    }

// -----------------------------------------------------------------------------
// CProfileMainContainer::HandleResourceChange
// -----------------------------------------------------------------------------
//
void CProfileMainContainer::HandleResourceChange( TInt aType )
    {
    if ( aType == KEikDynamicLayoutVariantSwitch ||
         aType == KAknsMessageSkinChange )
        {
        (static_cast <CProfileMainView *> (&iView))->UpdateClientRect();
        }
        
    CCoeControl::HandleResourceChange( aType );   
    }

// -----------------------------------------------------------------------------
// CProfileMainContainer::FocusChanged
// -----------------------------------------------------------------------------
//
void CProfileMainContainer::FocusChanged( TDrawNow aDrawNow )
    {
    if( iListBox )
        {
        iListBox->SetFocus( IsFocused(), aDrawNow );
        }
    }

// End of File