profilesapplication/Profiles/ProfileApp/UIsrc/CProfileSettingsView.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: Settings view class.
*
*/


// INCLUDE FILES
#include    "CProfileSettingsView.h"

#include    <aknViewAppUi.h>
#include    <akntitle.h>
#include    <akntabgrp.h>
#include    <featmgr.h>
#include    <MProfileEngineExtended.h>
#include    <MProfilesNamesArray.h>
#include    <CProfileEngineHandler.h>
#include    <CProfileIndexHandler.h>
#include    <CProfileTabHandler.h>
#include    <profileapp.rsg>

#include    "ProfilePanics.h"
#include    "CProfileSettingsContainer.h"
#include    "ProfileApp.hrh"



/******************************************************************************
 * class CProfileTopControl
 ******************************************************************************/


// -----------------------------------------------------------------------------
// CProfileTopControl::NewL()
// 
// -----------------------------------------------------------------------------
//
CProfileTopControl* CProfileTopControl::NewL( CCoeControl* aFocusControl )
    {
    CProfileTopControl* self = new ( ELeave ) CProfileTopControl();
    self->iFocusControl = aFocusControl;
    return self;
    }


// -----------------------------------------------------------------------------
// CProfileTopControl::FocusChanged()
// 
// -----------------------------------------------------------------------------
//
void CProfileTopControl::FocusChanged( TDrawNow aDrawNow )
    {
    // Not calling super::FocusChanged is intentional
    if( iFocusControl )
        {
        iFocusControl->SetFocus( IsFocused(), aDrawNow );
        }
    }


/******************************************************************************
 * class CProfileDummyHandler
 ******************************************************************************/


// -----------------------------------------------------------------------------
// CProfileDummyHandler::CProfileDummyHandler()
// 
// -----------------------------------------------------------------------------
//
CProfileDummyHandler::CProfileDummyHandler()
    {
    }


// -----------------------------------------------------------------------------
// CProfileDummyHandler::~CProfileDummyHandler()
// 
// -----------------------------------------------------------------------------
//
CProfileDummyHandler::~CProfileDummyHandler()
    {
    }


// -----------------------------------------------------------------------------
// CProfileDummyHandler::CreateSettingItemL()
// 
// This should never be called in Profiles App.
// -----------------------------------------------------------------------------
//
CAknSettingItem* CProfileDummyHandler::CreateSettingItemL( TInt /* aIdentifier */ )
    {
    User::Panic( KProfilePanicText, EProfilePanicInvalidSettingItemId );
    return NULL; // to make compiler happy
    }


// -----------------------------------------------------------------------------
// CProfileDummyHandler::SetObserver()
// 
// -----------------------------------------------------------------------------
//
void CProfileDummyHandler::SetObserver(MProfileExternalSettingsObserver& /* aObserver */ )
   {
   }


// -----------------------------------------------------------------------------
// CProfileDummyHandler::AllowedToChange()
// 
// -----------------------------------------------------------------------------
//
TBool CProfileDummyHandler::AllowedToChange( TInt /* aSettingItemId */ ) const
    {
    return EFalse;
    }



/******************************************************************************
 * class CProfileSettingsView
 ******************************************************************************/


// -----------------------------------------------------------------------------
// CProfileSettingsView::CProfileSettingsView
// C++ constructor can NOT contain any code, that might leave.
// -----------------------------------------------------------------------------
//
CProfileSettingsView::CProfileSettingsView(
    CProfileEngineHandler& aEngineHandler,
    CProfileIndexHandler& aIndexHandler )
    :   iEngineHandler( aEngineHandler ),
        iIndexHandler( aIndexHandler )
    {
    }

// -----------------------------------------------------------------------------
// CProfileSettingsView::ConstructL
// Symbian 2nd phase constructor can leave.
// -----------------------------------------------------------------------------
void CProfileSettingsView::ConstructL()
    {
    BaseConstructL( R_PROFILE_SETTINGS_VIEW );
    }

// -----------------------------------------------------------------------------
// CProfileSettingsView::NewLC
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
CProfileSettingsView* CProfileSettingsView::NewLC(
    CProfileEngineHandler& aEngineHandler,
    CProfileIndexHandler& aIndexHandler )
    {
    CProfileSettingsView* self = new( ELeave ) CProfileSettingsView(
        aEngineHandler, aIndexHandler );
    CleanupStack::PushL( self );
    self->ConstructL();
    return self;
    }

// Destructor.
CProfileSettingsView::~CProfileSettingsView()
    {
    if( iTopControl )
        {
        AppUi()->RemoveFromStack( iTopControl );
        }
    if( iTabHandler )
        {
        AppUi()->RemoveFromStack( iTabHandler->TabGroup() );
        }
    if( iContainer )
        {
        AppUi()->RemoveFromViewStack( *this, iContainer );
        }
    delete iContainer;
    delete iTabHandler;
    delete iTopControl;
    delete iDummyHandler;
    }

// -----------------------------------------------------------------------------
// CProfileSettingsView::Id
// -----------------------------------------------------------------------------
//
TUid CProfileSettingsView::Id() const
    {
    return KProfileAppSettingViewId;
    }

// -----------------------------------------------------------------------------
// CProfileSettingsView::HandleCommandL
// -----------------------------------------------------------------------------
//
void CProfileSettingsView::HandleCommandL( TInt aCommand )
    {
    switch ( aCommand )
        {
        case EAknSoftkeyBack:
            {
            if( iContainer && iContainer->ItemEdited() )
                {
                break;
                }
            AppUi()->HandleCommandL( aCommand );
            break;
            }
        case EAknSoftkeyChange: // From context specific options menu
        case EProfileCmdChange:
            {
            if( !iContainer )
                {
                break;
                }
            iContainer->EditItemL(
                iContainer->SettingItemArray()->ItemIndexFromVisibleIndex(
                    iContainer->ListBox()->CurrentItemIndex() ),
                    ( aCommand == EProfileCmdChange ) );
            break;
            }
        default:
            {
            AppUi()->HandleCommandL( aCommand );
            break;
            }
        }
    }

// -----------------------------------------------------------------------------
// CProfileSettingsView::DoActivateL
// -----------------------------------------------------------------------------
//
void CProfileSettingsView::DoActivateL(
    const TVwsViewId& /* aPrevViewId */,
    TUid aCustomMessageId,
    const TDesC8& aCustomMessage )
    {
    if ( !iContainer )
        {
        // If aCustomMessageId is the same as CProfileSettingsView id,
        // the caller is external. Check if profile id is given and open it.
        if( aCustomMessageId == KProfileAppSettingViewId )
		    {
		    TLex8 lex( aCustomMessage );
		    TInt value = 0;
		    lex.Val( value );
		    TInt err = KErrNone;
		    MProfilesNamesArray* profileNamesArray = iEngineHandler.Engine()->ProfilesNamesArrayLC();
		    TInt index = profileNamesArray->FindById(value);
		    CleanupStack::PopAndDestroy();
		    TRAP( err, iIndexHandler.SetCurrentProfileIndex( index ) );	

		    CEikButtonGroupContainer* cba = CEikButtonGroupContainer::Current();
		    CleanupStack::PushL( cba );
		    cba->SetCommandSetL( R_PROFILE_SETTINGS_VIEW_CBA_IDLE );
		    CleanupStack::Pop( cba );
		    cba->DrawDeferred();	
		    }

        // Get pointer to navi pane
        CAknNavigationControlContainer* naviPane =
            static_cast<CAknNavigationControlContainer*>(
		    StatusPane()->ControlL( TUid::Uid( EEikStatusPaneUidNavi ) ) );
        // Get pointer to title pane
       	CAknTitlePane* titlePane = static_cast< CAknTitlePane* >(
		    StatusPane()->ControlL( TUid::Uid( EEikStatusPaneUidTitle ) ) );

        //iTabHandler = CProfileTabHandler::NewL(
        //    iEngineHandler, iIndexHandler, *naviPane );

        iDummyHandler = new ( ELeave ) CProfileDummyHandler();
        iContainer = CProfileSettingsContainer::NewL(
            *this, iEngineHandler, *iDummyHandler, &iIndexHandler,
            iTabHandler, titlePane );

        iTopControl = CProfileTopControl::NewL( iContainer );
  
  		AppUi()->AddToViewStackL( *this, iContainer );
   		// Tab group must be added to stack last.
   		//AppUi()->AddToStackL( *this, iTabHandler->TabGroup() );
   		// Top control is always on top as it listens to focus changes (which
   		// will be routed to container to adapt highlight animation to focus)
   		AppUi()->AddToStackL( *this, iTopControl );

   		iContainer->MakeVisible( ETrue );
        }
   }

// -----------------------------------------------------------------------------
// CProfileSettingsView::DoDeactivate
// -----------------------------------------------------------------------------
//
void CProfileSettingsView::DoDeactivate()
    {
    if( iTopControl )
        {
        AppUi()->RemoveFromStack( iTopControl );
        delete iTopControl;
        iTopControl = NULL;
        }
    if( iTabHandler )
        {
        AppUi()->RemoveFromStack( iTabHandler->TabGroup() );
        delete iTabHandler;
        iTabHandler = NULL;
        }
    if ( iContainer )
        {
        AppUi()->RemoveFromViewStack( *this, iContainer );
        delete iContainer;
        iContainer = NULL;
        }
    delete iDummyHandler;
    iDummyHandler = NULL;
    }

// -----------------------------------------------------------------------------
// CProfileSettingsView::DynInitMenuPaneL
// -----------------------------------------------------------------------------
//
void CProfileSettingsView::DynInitMenuPaneL(
    TInt aResourceId, CEikMenuPane* aMenuPane )
    {
    if( ( iContainer ) && 
        ( aResourceId == R_PROFILE_SETTINGS_VIEW_OPTIONS_MENUPANE ) )
        {
        // Check if the setting item is allowed to be changed
        // If not, hide "Change" from Options menu
        CAknSettingItemArray* array = iContainer->SettingItemArray();
        if( !iContainer->AllowedToChange(
            array->At( array->ItemIndexFromVisibleIndex(
            iContainer->ListBox()->CurrentItemIndex() ) )->Identifier() ) )
            {
            aMenuPane->SetItemDimmed( EProfileCmdChange, ETrue );
            }
        if( !FeatureManager::FeatureSupported( KFeatureIdHelp ) ) // Help
            {
            aMenuPane->SetItemDimmed( EAknCmdHelp, ETrue );
            }
        }
    }

// -----------------------------------------------------------------------------
// CProfileSettingsView::UpdateClientRect
// -----------------------------------------------------------------------------
//
void CProfileSettingsView::UpdateClientRect()
	{
    iContainer->SetRect( ClientRect() );
	}

// -----------------------------------------------------------------------------
// CProfileSettingsView::View
// -----------------------------------------------------------------------------
//
CAknView& CProfileSettingsView::View()
    {
    return *this;
    }

// End of File