diff -r 000000000000 -r 2e3d3ce01487 systemsettings/gssensorplugin/src/gssenbasecontainer.cpp --- /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 +#include +#include +#include +#include +#include +#include +#include +#include + +// ========================= 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( 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* selections = const_cast*> ( 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" ); + }