systemsettings/gssensorplugin/src/gssenbasecontainer.cpp
author William Roberts <williamr@symbian.org>
Fri, 23 Apr 2010 14:37:17 +0100
branchRCL_3
changeset 22 c82a39b81a38
parent 0 2e3d3ce01487
child 40 951aeeb3da43
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) 2006-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:  Base container for multiselection containers
*
*/


// INCLUDE FILES
#include "gssenbasecontainer.h" 
#include "gssensorpluginmodel.h"
#include "gssensorplugin.hrh"
#include "gssensorplugin_debug.h"
#include "gssensormskobserver.h"

#include <aknlists.h>
#include <gslistbox.h>
#include <gssensorpluginrsc.rsg>
#include <akncheckboxsettingpage.h>
#include <AknIconArray.h>
#include <aknconsts.h>
#include <avkon.mbg>
#include <gulicon.h>
#include <eiklbv.h>

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

// ---------------------------------------------------------------------------
// CGSSenBaseContainer::CGSSenBaseContainer
// Default constructor
// ---------------------------------------------------------------------------
//
CGSSenBaseContainer::CGSSenBaseContainer( MGSSensorMskObserver& aMskObserver ) : 
    iMskObserver( aMskObserver )
    {
    TRACE_( "[GSSensorPlugin] CGSSenBaseContainer::CGSSenBaseContainer()" );
    }

// ---------------------------------------------------------------------------
// CGSSenBaseContainer::~CGSSenBaseContainer
// Destructor
// ---------------------------------------------------------------------------
//
CGSSenBaseContainer::~CGSSenBaseContainer()
    {
    TRACE_( "[GSSensorPlugin] CGSSenBaseContainer::~CGSSenBaseContainer()" );
    if ( iSelectionItems )
        {
        delete iSelectionItems;
        }
    if ( iListboxItemArray )
        {
        delete iListboxItemArray;
        }

    iModel = NULL;
    TRACE_( "[GSSensorPlugin] CGSSenBaseContainer::~CGSSenBaseContainer() - return" );
    }

// ---------------------------------------------------------------------------
// CGSSenBaseContainer::ConstructListBoxL
// ---------------------------------------------------------------------------
//
void CGSSenBaseContainer::ConstructListBoxL( TInt aResLbxId, TInt aResMsId )
    {
    TRACE_( "[GSSensorPlugin] CGSSenBaseContainer::ConstructListBoxL()" );
    iListBox->ConstructL( this, EAknListBoxMultiselectionList );
    iListboxItemArray = CGSListBoxItemTextArray::NewL( 
        aResLbxId, *iListBox, *iCoeEnv );
    iListBox->Model()->SetItemTextArray( iListboxItemArray );
    iListBox->Model()->SetOwnershipType( ELbmDoesNotOwnItemArray );

    iSelectionItems = iCoeEnv->ReadDesC16ArrayResourceL(
                            aResMsId );


    const TInt interactionId = InteractionId();

    // Get current selections from CenRep
    iSelections = iModel->SelectionListL( interactionId );
    const TUint32 variation = iModel->VariationListL( interactionId );

    TUint bitmaskpos = 0;

    // Loop selections and delete disabled items
    for ( TInt i = 0; i < iSelectionItems->Count(); i++ )
        {
        TUint status( 0 );
        TUint mask( 0x01 << bitmaskpos++ );
    
        // Get value from member variable bitmask. It is updated when this view is launched
        // and will be stored when view is closed
        status = variation & mask;
        
        if (!status)
            {
            // Remove disabled item from iSelectionItems
            iSelectionItems->Delete( i );
            i--; // Decrease index
            }
        }

    // Add items to list box
    iListBox->Model()->SetItemTextArray( iSelectionItems );
    iListBox->HandleItemAdditionL();

    // Create checkbox icons
    AddCheckboxIconsL();

    // Update checkbox icons according to previous settings
    UpdateCheckboxIconsL();
    TRACE_( "[GSSensorPlugin] CGSSenBaseContainer::ConstructListBoxL() - return" );
    }

// ---------------------------------------------------------------------------
// CGSSenBaseContainer::AddCheckboxIconsL
// ---------------------------------------------------------------------------
//
void CGSSenBaseContainer::AddCheckboxIconsL()
    {
    TRACE_( "[GSSensorPlugin] CGSSenBaseContainer::AddCheckboxIconsL()" );
    CAknIconArray* iconArray = new( ELeave ) CAknIconArray( 1 );
    CleanupStack::PushL( iconArray );
    CFbsBitmap* checkboxOnBitmap = NULL;
    CFbsBitmap* checkboxOnBitmapMask = NULL;
    CFbsBitmap* checkboxOffBitmap = NULL;
    CFbsBitmap* checkboxOffBitmapMask = NULL;

    //CListItemDrawer is using this logical color as default for its marked icons
    TRgb defaultColor;
    defaultColor = ( ( CEikonEnv* )iCoeEnv )->Color( EColorControlText );

    // Create 'ON' checkbox icon
    AknsUtils::CreateColorIconLC( AknsUtils::SkinInstance(),
    			KAknsIIDQgnIndiCheckboxOn,
    			KAknsIIDQsnIconColors,
    			EAknsCIQsnIconColorsCG13,
    			checkboxOnBitmap,
    			checkboxOnBitmapMask,
    			KAvkonBitmapFile,
    			EMbmAvkonQgn_indi_checkbox_on,
    			EMbmAvkonQgn_indi_checkbox_on_mask,
    			defaultColor
    			);

    CGulIcon* checkboxOnIcon = CGulIcon::NewL( checkboxOnBitmap, checkboxOnBitmapMask );
    // cleanup checkboxOnBitmap, checkboxOnBitmapMask
    CleanupStack::Pop( checkboxOnBitmapMask );
    CleanupStack::Pop( checkboxOnBitmap ); 

    CleanupStack::PushL( checkboxOnIcon );
    iconArray->AppendL( checkboxOnIcon );

    // Create 'OFF' checkbox icon
    AknsUtils::CreateColorIconLC( AknsUtils::SkinInstance(),
    			KAknsIIDQgnIndiCheckboxOff,
    			KAknsIIDQsnIconColors,
    			EAknsCIQsnIconColorsCG13,
    			checkboxOffBitmap,
    			checkboxOffBitmapMask,
    			KAvkonBitmapFile,
    			EMbmAvkonQgn_indi_checkbox_off,
    			EMbmAvkonQgn_indi_checkbox_off_mask,
    			defaultColor
    			);

    CGulIcon* checkboxOffIcon = CGulIcon::NewL( checkboxOffBitmap, checkboxOffBitmapMask );
    // cleanup checkboxOffBitmap, checkboxOffBitmapMask
    CleanupStack::Pop( checkboxOffBitmapMask );
    CleanupStack::Pop( checkboxOffBitmap ); 
    

    CleanupStack::PushL( checkboxOffIcon );
    iconArray->AppendL( checkboxOffIcon );

    CAknColumnListBox* castedListbox = static_cast<CAknColumnListBox*>( iListBox );
    castedListbox->ItemDrawer()->ColumnData()->SetIconArray( iconArray );

    // cleanup checkboxOnIcon, checkboxOffIcon, iconArray
    CleanupStack::Pop( checkboxOffIcon );
    CleanupStack::Pop( checkboxOnIcon );
    CleanupStack::Pop( iconArray );

    TRACE_( "[GSSensorPlugin] CGSSenBaseContainer::AddCheckboxIconsL() - return" );
    }

// ---------------------------------------------------------------------------
// CGSSenBaseContainer::OfferKeyEventL
// ---------------------------------------------------------------------------
//
TKeyResponse CGSSenBaseContainer::OfferKeyEventL( 
    const TKeyEvent& aKeyEvent, TEventCode aType )
    {
    TRACE_( "[GSSensorPlugin] CGSSenBaseContainer::OfferKeyEventL()" );

    TKeyResponse returnValue( EKeyWasNotConsumed );

    switch ( aKeyEvent.iCode )
        {
        case EKeyUpArrow:
        case EKeyDownArrow:
            {
            // Send key event to Listbox
            returnValue = iListBox->OfferKeyEventL( aKeyEvent, aType );
            // Change MSK label if needs to changed
            iMskObserver.CheckMiddleSoftkeyLabelL();
            break;
            }
        case EKeyLeftArrow:
        case EKeyRightArrow:
            {
            // Listbox takes all events even if it doesn't use them.
            // Stick with the default return value
            break;
            }
        default:
            {
            // Forward key event to listbox
            returnValue = iListBox->OfferKeyEventL( aKeyEvent, aType );
            break;
            }
        }

    TRACE_( "[GSSensorPlugin] CGSSenBaseContainer::OfferKeyEventL() - return" );
    return returnValue;
    }

// ---------------------------------------------------------------------------
// CGSSenBaseContainer::UpdateCheckboxIconL
// ---------------------------------------------------------------------------
//
void CGSSenBaseContainer::UpdateCheckboxIconL( TInt aSelectedItem )
    {
    TRACE_1( "[GSSensorPlugin] CGSSenBaseContainer::UpdateCheckboxIconL() - Item: %i", aSelectedItem );
    // Range of selected item is already checked by caller of this function
    if ( SelectionStatus( aSelectedItem ) )
        {
        iListBox->View()->SelectItemL( aSelectedItem );
        }
    else
        {
        iListBox->View()->DeselectItem( aSelectedItem );
        }
    TRACE_( "[GSSensorPlugin] CGSSenBaseContainer::UpdateCheckboxIconL() - return" );
    }

// ---------------------------------------------------------------------------
// CGSSenBaseContainer::StoreSelectionsL
// Store current selection list to CenRep
// ---------------------------------------------------------------------------
//
void CGSSenBaseContainer::StoreSelectionsL()
    {
    TRACE_( "[GSSensorPlugin] CGSSenBaseContainer::StoreSelectionsL()" );
    // Send current selection list to be stored by model
    iModel->SetSelectionListL( InteractionId(), iSelections );
    TRACE_( "[GSSensorPlugin] CGSSenBaseContainer::StoreSelectionsL() - return" );
    }

// ---------------------------------------------------------------------------
// CGSSenBaseContainer::CurrentFeatureId
// ---------------------------------------------------------------------------
//
TInt CGSSenBaseContainer::CurrentFeatureId( ) const
    {
    TRACE_1( "[GSSensorPlugin] CGSSenBaseContainer::CurrentFeatureId() - %i", 
        iListboxItemArray->CurrentFeature() );
    return iListboxItemArray->CurrentFeature();
    }

// ----------------------------------------------------------------------------
// CGSSenBaseContainer::SelectionStatus
// ----------------------------------------------------------------------------
//
TInt CGSSenBaseContainer::SelectionStatus( TInt aPosition )
    {
    TRACE_1( "[GSSensorPlugin] CGSSenBaseContainer::SelectionStatus() - Position: %i", aPosition );
    TUint status( 0 );
    TUint mask( 0x01 << aPosition );
    
    // Get value from member variable bitmask. It is updated when this view is launched
    // and will be stored when view is closed
    status = iSelections & mask;
    TRACE_1( "[GSSensorPlugin] CGSSenBaseContainer::SelectionStatus() - return: %i", status );
    return status;
    }

// ----------------------------------------------------------------------------
// CGSSenBaseContainer::ChangeSelectionStatus
// ----------------------------------------------------------------------------
//
void CGSSenBaseContainer::ChangeSelectionStatus( TInt aPosition)
    {
    TRACE_1( "[GSSensorPlugin] CGSSenBaseContainer::ChangeSelectionStatus() - Position: %i", 
        aPosition );
    // Set position bit to 1
    TUint bit( 0x01 << aPosition );
    // Get current status
    const TBool status( SelectionStatus( aPosition ) );

    // Set value only to member variable bitmask. Bitmask is updated to CenRep when all
    // selections are approved by user

    if ( !status )
        {
        // Set selected bit on
        iSelections = iSelections | bit;    
        }
    else
        {
        // Set selected bit off. In example, second and fourth are selected. Second needs to set off
        // First take bitwice from selections, for example         0000 1010 -> 1111 0101
        // Make OR operand to bitwise with selected bit (second)   1111 0101 -> 1111 0111
        // Make bitwise again to set selections to original form   1111 0111 -> 0000 1000
        TUint bitwise( ~iSelections );
        iSelections = ~( bitwise | bit );
        }
    TRACE_( "[GSSensorPlugin] CGSSenBaseContainer::ChangeSelectionStatus() - return" );
    }

// ----------------------------------------------------------------------------
// CGSSenBaseContainer::CheckSelections
// ----------------------------------------------------------------------------
//
void CGSSenBaseContainer::CheckSelections()
    {
    TRACE_( "[GSSensorPlugin] CGSSenBaseContainer::CheckSelections()");

    // This function is needed purely for this component to work in S60 3.1 as it does not support MSK 
    // as well as S60 3.2 and onwards. The reason for this function is that in S60 3.1 MSK presses does 
    // not end up for this component, but the checking / unchecking is done in AVKON side and hence 
    // this component does not know the changes other way than with this function

    TUint status( 0 );
    CArrayFix<TInt>* selections = const_cast<CArrayFix<TInt>*> ( iListBox->View()->SelectionIndexes() );
    
    if ( selections )
        {
        for ( TInt i = 0; i < selections->Count(); i++ )
            {
            // Set selected bit to 1
            TUint bit( 0x01 << selections->At( i ) );
            // Set selected bit on
            status = status | bit;
            }
        }
#ifdef _DEBUG
    TRACE_2( "[GSSensorPlugin] CGSSenBaseContainer::CheckSelections() - iSelections: %i listbox selections: %i", 
             iSelections, status );
#endif
    iSelections = status;
    TRACE_( "[GSSensorPlugin] CGSSenBaseContainer::CheckSelections() - return" );
    }