systemsettings/GSAccessoryPlugin/src/gsaccbaseview.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 02 Feb 2010 10:12:00 +0200
changeset 0 2e3d3ce01487
permissions -rw-r--r--
Revision: 201002 Kit: 201005

/*
* Copyright (c) 2002-2008 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:  Declaration of CGSAccBaseView class
*
*/


#include <aknradiobuttonsettingpage.h>
#include <aknViewAppUi.h>
#include <featmgr.h>
#include <gsaccessoryplugin.rsg>
#include <gscommon.hrh>
#include <hlplch.h> // For HlpLauncher

#include "gsaccbasecontainer.h"
#include "gsaccbaseview.h"
#include "gsaccessorypluginconst.hrh"
#include "gsaccessorypluginmodel.h"
#include "gsaccprofilelist.h"
#include "trace.h"

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

// ---------------------------------------------------------------------------
// CGSAccBaseView::~CGSAccBaseView
// ---------------------------------------------------------------------------
//
CGSAccBaseView::~CGSAccBaseView()
    {
    FUNC_LOG;

    delete iContainer;
    }


// ---------------------------------------------------------------------------
// CGSAccBaseView::HandleCommandL()
// ---------------------------------------------------------------------------
//
void CGSAccBaseView::HandleCommandL( TInt aCommand )
    {
    FUNC_LOG;

    switch ( aCommand )
        {
        case EGSMSKCmdAppChange:
            // Forward command to sub-class.
            HandleListBoxSelectionL( iContainer->CurrentFeatureId() );
            break;
        case EAknSoftkeyBack:
            // Go back to accessories main view.
            AppUi()->ActivateLocalViewL( TUid::Uid( KGSAccessoryPluginUid ) );
            break;
        case EAknCmdHelp:
            {
            // Launch help if it is supported.
            if ( FeatureManager::FeatureSupported( KFeatureIdHelp ) )
                {
                HlpLauncher::LaunchHelpApplicationL(
                    iEikonEnv->WsSession(), AppUi()->AppHelpContextL() );
                }
            break;
            }
        default:
            // Let framework handle other commands.
            AppUi()->HandleCommandL( aCommand );
            break;
        }
    }


// ---------------------------------------------------------------------------
// CGSAccBaseView::DoActivateL
// ---------------------------------------------------------------------------
//
void CGSAccBaseView::DoActivateL(
    const TVwsViewId& /*aPrevViewId*/,
    TUid /*aCustomMessageId*/,
    const TDesC8& /*aCustomMessage*/ )
    {
    FUNC_LOG;

    DestroyContainer();
    CreateContainerL();

    AppUi()->AddToViewStackL( *this, iContainer );
    iContainer->iListBox->SetListBoxObserver( this );
    }


// ---------------------------------------------------------------------------
// CGSAccBaseView::DoDeactivate()
// ---------------------------------------------------------------------------
//
void CGSAccBaseView::DoDeactivate()
    {
    FUNC_LOG;

    DestroyContainer();
    }


// ----------------------------------------------------------------------------
// CGSAccBaseView::DynInitMenuPaneL()
// ----------------------------------------------------------------------------
//
void CGSAccBaseView::DynInitMenuPaneL(
    TInt aResourceId,
    CEikMenuPane* aMenuPane )
    {
    FUNC_LOG;

    if ( aResourceId == R_GS_MENU_ITEM_HELP )
        {
        User::LeaveIfNull( aMenuPane );
        // Dim help item unless help feature is supported.
        aMenuPane->SetItemDimmed(
            EAknCmdHelp,
            !FeatureManager::FeatureSupported( KFeatureIdHelp ) );
        }
    }


// ---------------------------------------------------------------------------
// CGSAccBaseView::HandleListBoxEventL
// ---------------------------------------------------------------------------
//
void CGSAccBaseView::HandleListBoxEventL(
    CEikListBox* /*aListBox*/,
    TListBoxEvent aEventType )
    {
    FUNC_LOG;

    switch ( aEventType )
        {
        case EEventEnterKeyPressed:
        case EEventItemSingleClicked:
            HandleListBoxSelectionL( iContainer->CurrentFeatureId() );
            break;
        default:
           break;
        }
    }


// ---------------------------------------------------------------------------
// CGSAccBaseView::CGSAccBaseView
// ---------------------------------------------------------------------------
//
CGSAccBaseView::CGSAccBaseView( CGSAccessoryPluginModel& aModel )
  : iModel( aModel )
    {
    FUNC_LOG;
    }


// ---------------------------------------------------------------------------
// CGSAccBaseView::UpdateListBoxL
// ---------------------------------------------------------------------------
//
void CGSAccBaseView::UpdateListBoxL( TInt aItemId )
    {
    FUNC_LOG;
    ASSERT_TRACE( iContainer );

    iContainer->UpdateListBoxL( aItemId );
    }


// ---------------------------------------------------------------------------
// CGSAccBaseView::ShowRadioButtonSettingsPageL()
// ---------------------------------------------------------------------------
//
TBool CGSAccBaseView::ShowRadioButtonSettingsPageL(
    TInt aDlgResourceID,
    TInt aItemsResourceID,
    TInt& aCurrentSelectionIndex ) const
    {
    FUNC_LOG;

    CDesCArrayFlat* items =
        iCoeEnv->ReadDesC16ArrayResourceL( aItemsResourceID );
    CleanupStack::PushL( items );

    TBool ret = ShowRadioButtonSettingsPageL(
        aDlgResourceID, *items, aCurrentSelectionIndex );

    CleanupStack::PopAndDestroy( items );
    return ret;
    }


// ---------------------------------------------------------------------------
// CGSAccBaseView::ShowRadioButtonSettingsPageL()
// ---------------------------------------------------------------------------
//
TBool CGSAccBaseView::ShowRadioButtonSettingsPageL(
    TInt aDlgResourceID,
    const MDesCArray& aItemArray,
    TInt& aCurrentSelectionIndex ) const
    {
    FUNC_LOG;

    CAknRadioButtonSettingPage* dlg =
        new ( ELeave ) CAknRadioButtonSettingPage(
            aDlgResourceID,
            aCurrentSelectionIndex,
            &aItemArray );

    TBool ret = dlg->ExecuteLD( CAknSettingPage::EUpdateWhenChanged );

    INFO_1( "CAknRadioButtonSettingPage::ExecuteLD returned %d", ret );
    return ret;
    }


// ---------------------------------------------------------------------------
// CGSAccBaseView::ChangeDefaultProfileL()
// ---------------------------------------------------------------------------
//
void CGSAccBaseView::ChangeDefaultProfileL(
    TInt aProfileKey,
    TInt aListBoxId )
    {
    FUNC_LOG;

    // Read current value
    TInt current = iModel.ProfileList().IndexByIdL(
        iModel.DefaultProfileByKey( aProfileKey ), iCoeEnv );

    // Query new value from user
    TBool update = ShowRadioButtonSettingsPageL(
        R_ACC_DEFAULT_PROFILE_SETTING_PAGE,
        iModel.ProfileList().NameListL( iCoeEnv ),
        current );

    if ( update )
        {
        // Store new value
        iModel.SetDefaultProfileByKeyL(
            aProfileKey,
            iModel.ProfileList().IdByIndexL( current, iCoeEnv ) );
        UpdateListBoxL( aListBoxId );
        }
    }


// ---------------------------------------------------------------------------
// CGSAccBaseView::ChangeAutoAnswerModeSettingL()
// ---------------------------------------------------------------------------
//
void CGSAccBaseView::ChangeAutoAnswerModeSettingL(
    TInt aAutoAnswerKey,
    TInt aListBoxId,
    TBool aUseSettingPage )
    {
    FUNC_LOG;

    TInt currentValue = iModel.AutoAnswerModeByKey( aAutoAnswerKey );
    TBool updateValue( EFalse );

    // Value is updated either by setting page or simply switching to other
    // value (On<->Off).
    if ( aUseSettingPage )
        {
        updateValue = ShowRadioButtonSettingsPageL(
            R_ACC_AUTO_ANSWER_SETTING_PAGE,
            R_ACC_AUTO_ANSWER_SETTING_PAGE_LBX,
            currentValue );
        }
    else
        {
        // User pressed selection key instead of opening setting page.
        // Do not ask user input from dialog - just flip the value:
        // 0 -> 1, 1 -> 0.
        iModel.FlipValue( currentValue );
        updateValue = ETrue;
        }

    if ( updateValue ) // If value was changed, store it.
        {
        iModel.SetAutoAnswerModeByKeyL( aAutoAnswerKey, currentValue );
        UpdateListBoxL( aListBoxId );
        }
    }


// ---------------------------------------------------------------------------
// CGSAccBaseView::ChangeLightModeSettingL()
// ---------------------------------------------------------------------------
//
void CGSAccBaseView::ChangeLightModeSettingL(
    TAccMode aAccMode,
    TInt aAccSetting,
    TInt aListBoxId,
    TBool aSettingPage )
    {
    FUNC_LOG;

    TInt currentValue = iModel.LightMode( aAccMode, aAccSetting );
    TBool updateValue( EFalse );

    // Value is updated either by setting page or simply switching to other
    // value (On<->Off).
    if ( aSettingPage )
        {
        updateValue = ShowRadioButtonSettingsPageL(
            R_ACC_LIGHTS_SETTING_PAGE,
            R_ACC_LIGHTS_SETTING_PAGE_LBX,
            currentValue );
        }
    else
        {
        // User pressed selection key instead of opening setting page.
        // Do not ask user input from dialog - just flip the value:
        // 0 -> 1, 1 -> 0.
        iModel.FlipValue( currentValue );
        updateValue = ETrue;
        }

    if ( updateValue )
        {
        iModel.SetLightModeL( aAccMode, aAccSetting, currentValue );
        UpdateListBoxL( aListBoxId );
        }
    }


// ---------------------------------------------------------------------------
// CGSAccBaseView::CreateContainerL()
// ---------------------------------------------------------------------------
//
void CGSAccBaseView::CreateContainerL()
    {
    FUNC_LOG;

    NewContainerL(); // Derived class should assign object to iContainer.
    ASSERT_TRACE( iContainer );

    iContainer->SetMopParent( this );
    TRAPD( error, iContainer->ConstructL( ClientRect() ) );
    ERROR( error, "Failed to create container" );

    if ( error )
        {
        delete iContainer;
        iContainer = NULL;
        User::Leave( error );
        }
    }


// ---------------------------------------------------------------------------
// CGSAccBaseView::DestroyContainer()
// ---------------------------------------------------------------------------
//
void CGSAccBaseView::DestroyContainer()
    {
    FUNC_LOG;

    if ( iContainer )
        {
        AppUi()->RemoveFromViewStack( *this, iContainer );
        delete iContainer;
        iContainer = NULL;
        }
    }