systemsettings/GSAccessoryPlugin/src/gsaccbaseview.cpp
author William Roberts <williamr@symbian.org>
Fri, 23 Apr 2010 14:37:17 +0100
branchRCL_3
changeset 22 c82a39b81a38
parent 0 2e3d3ce01487
permissions -rw-r--r--
Rework addition of Symbian splash screen to reduce the source impact (uses SVG from Bug 2414) Notes: by using the OPTION SOURCEDIR parameter in the mifconv extension instructions, I can arrange to use the same source file name in sfimage, without having to export over the original Nokia file. This means that the name inside splashscreen.mbg is the same, which removes the need for the conditional compilation in SplashScreen.cpp, and gets rid of sf_splashscreen.mmp.

/*
* 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;
        }
    }