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" );
}