--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/systemsettings/gssensorplugin/src/gssenbasecontainer.cpp Tue Feb 02 10:12:00 2010 +0200
@@ -0,0 +1,363 @@
+/*
+* 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" );
+ }