diff -r 000000000000 -r 2e3d3ce01487 systemsettings/gssensorplugin/src/gssensorplugincontainer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/systemsettings/gssensorplugin/src/gssensorplugincontainer.cpp Tue Feb 02 10:12:00 2010 +0200 @@ -0,0 +1,486 @@ +/* +* Copyright (c) 2006 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: Container for the sensor settings +* +*/ + + + +// INCLUDE FILES +#include "gssensorplugincontainer.h" +#include "gssensormskobserver.h" +#include "gssensorpluginmodel.h" +#include "gssensorplugin.hrh" +#include "gssensorplugin_debug.h" + +#include +#include +#include // for KUidGS +#include +#include +#include + +// ========================== MEMBER FUNCTIONS ================================ + +// --------------------------------------------------------------------------- +// CGSSensorPluginContainer::ConstructL +// This constructL is not used +// --------------------------------------------------------------------------- +// +void CGSSensorPluginContainer::ConstructL( const TRect& /*aRect*/ ) + { + TRACE_( "[GSSensorPlugin] CGSSensorPluginContainer::ConstructL() - deprecated" ); + User::Leave( KErrArgument ); + } + +// --------------------------------------------------------------------------- +// CGSSensorPluginContainer::ConstructL +// --------------------------------------------------------------------------- +// +void CGSSensorPluginContainer::ConstructL( + const TRect& aRect, + CAknViewAppUi* aAppUi, + CArrayPtrFlat* aPluginArray ) + { + TRACE_( "[GSSensorPlugin] CGSSensorPluginContainer::ConstructL()" ); + + iAppUi = aAppUi; + iPluginArray = aPluginArray; + + // Create list box and parent container + iListBox = new ( ELeave ) CAknSettingStyleListBox; + BaseConstructL( aRect, R_GS_SEN_VIEW_TITLE, R_GS_SEN_DOUBLE_LBX ); + + TRACE_( "[GSSensorPlugin] CGSSensorPluginContainer::ConstructL() - return" ); + } + +// --------------------------------------------------------------------------- +// CGSSensorPluginContainer::~CGSSensorPluginContainer +// --------------------------------------------------------------------------- +// +CGSSensorPluginContainer::~CGSSensorPluginContainer() + { + TRACE_( "[GSSensorPlugin] CGSSensorPluginContainer::~CGSSensorPluginContainer()" ); + + if ( iListboxItemArray ) + { + delete iListboxItemArray; + } + + if ( iListBoxTextArray ) + { + iListBoxTextArray->Reset(); + delete iListBoxTextArray; + } + + if ( iSensorStatusText ) + { + iSensorStatusText->Reset(); + delete iSensorStatusText; + } + + if ( iListItems ) + { + iListItems->Reset(); + delete iListItems; + } + + iModel = NULL; + iAppUi = NULL; + iPluginArray = NULL; + + TRACE_( "[GSSensorPlugin] CGSSensorPluginContainer::~CGSSensorPluginContainer() - return" ); + } + +// --------------------------------------------------------------------------- +// CGSSensorPluginContainer::CGSSensorPluginContainer +// --------------------------------------------------------------------------- +// +CGSSensorPluginContainer::CGSSensorPluginContainer( + CGSSensorPluginModel* aModel, + MGSSensorMskObserver& aMskObserver ) + : iModel ( aModel ), + iMskObserver( aMskObserver ) + { + TRACE_( "[GSSensorPlugin] CGSSensorPluginContainer::CGSSensorPluginContainer()" ); + } + +// --------------------------------------------------------------------------- +// CGSSensorPluginContainer::ConstructListBoxL +// --------------------------------------------------------------------------- +// +void CGSSensorPluginContainer::ConstructListBoxL( TInt aResLbxId ) + { + TRACE_( "[GSSensorPlugin] CGSSensorPluginContainer::ConstructListBoxL()" ); + iListBox->ConstructL( this, EAknListBoxSelectionList ); + iListboxItemArray = CGSListBoxItemTextArray::NewL( aResLbxId, *iListBox, *iCoeEnv ); + iListBoxTextArray = static_cast( iListBox->Model()->ItemTextArray() ); + iListBox->Model()->SetOwnershipType( ELbmDoesNotOwnItemArray ); + + // Get sensors activation status and set text 'On' or 'Off' to list view below + // Sensors list item + iSensorStatusText = iCoeEnv->ReadDesC16ArrayResourceL( R_GS_SENSOR_ACTIVE_STATUS ); + iListItems = iCoeEnv->ReadDesC16ArrayResourceL( R_GS_SEN_DOUBLE_LBX_TEXT ); + // Create and make visible list box items + CreateListBoxItemsL(); + + iListBox->HandleItemAdditionL(); + TRACE_( "[GSSensorPlugin] CGSSensorPluginContainer::ConstructListBoxL() - return" ); + } + +// --------------------------------------------------------------------------- +// CGSSensorPluginContainer::CreateListBoxItemsL +// --------------------------------------------------------------------------- +// +void CGSSensorPluginContainer::CreateListBoxItemsL() + { + TRACE_( "[GSSensorPlugin] CGSSensorPluginContainer::CreateListBoxItemsL()" ); + + iGeneralItemCount = 0; + + const TUint32 tapVariation = iModel->VariationListL( EGSSenTapping ); + const TUint32 turnVariation = iModel->VariationListL( EGSSenTurning ); + + if ( tapVariation ||turnVariation ) + { + // Make Sensors active status visible if there is at least one enabled use case + MakeSensorsItemL(); + iGeneralItemCount++; + + if ( !tapVariation ) + { + iListboxItemArray->SetItemVisibilityL( EGSTapCtrlListItemId, + CGSListBoxItemTextArray::EInvisible ); + } + else + { + MakeTapCtrlItemL(); + iGeneralItemCount++; + } + + if ( !turnVariation ) + { + iListboxItemArray->SetItemVisibilityL( EGSTurnCtrlListItemId, + CGSListBoxItemTextArray::EInvisible ); + } + else + { + MakeTurnCtrlItemL(); + iGeneralItemCount++; + } + } + + if ( iPluginArray ) + { + MakeExtendedPluginsItemL(); + } + + + TRACE_( "[GSSensorPlugin] CGSSensorPluginContainer::CreateListBoxItemsL() - return" ); + } + +// --------------------------------------------------------------------------- +// CGSSensorPluginContainer::UpdateListBoxL +// --------------------------------------------------------------------------- +// +void CGSSensorPluginContainer::UpdateListBoxL( TInt aFeatureId ) + { + TRACE_1( "[GSSensorPlugin] CGSSensorPluginContainer::UpdateListBoxL() - feature: %i", + aFeatureId ); + switch ( aFeatureId ) + { + case EGSSensorsListItemId: + { + // Delete current text and then create new + iListBoxTextArray->Delete( EGSSensorsListItemId ); + MakeSensorsItemL(); + break; + } + case EGSExtPluginsListItemId: + MakeExtendedPluginsItemL(); + break; + case EGSTapCtrlListItemId: + case EGSTurnCtrlListItemId: + case EGSOrientationListItemId: + default: + break; + } + + // Draw listbox again + iListBox->HandleItemAdditionL(); + TRACE_( "[GSSensorPlugin] CGSSensorPluginContainer::UpdateListBoxL() - return" ); + } + +// --------------------------------------------------------------------------- +// CGSSensorPluginContainer::MakeSensorsItemL +// --------------------------------------------------------------------------- +// +void CGSSensorPluginContainer::MakeSensorsItemL() + { + TRACE_( "[GSSensorPlugin] CGSSensorPluginContainer::MakeSensorsItemL()" ); + const TInt sensorsStatus = iModel->SensorActiveStatusL(); + SetSensorStatusTextL( sensorsStatus ); + TRACE_( "[GSSensorPlugin] CGSSensorPluginContainer::MakeSensorsItemL() - return" ); + } + +// --------------------------------------------------------------------------- +// CGSSensorPluginContainer::MakeTapCtrlItemL +// --------------------------------------------------------------------------- +// +void CGSSensorPluginContainer::MakeTapCtrlItemL() + { + TRACE_( "[GSSensorPlugin] CGSSensorPluginContainer::MakeTapCtrlItemL()" ); + AppendListItemL( EGSTapCtrlListItemId, + iListItems->operator[]( EGSTapCtrlListItemId ), + KNullDesC16 ); + TRACE_( "[GSSensorPlugin] CGSSensorPluginContainer::MakeTapCtrlItemL() - return" ); + } + +// --------------------------------------------------------------------------- +// CGSSensorPluginContainer::MakeTurnCntrItemL +// --------------------------------------------------------------------------- +// +void CGSSensorPluginContainer::MakeTurnCtrlItemL() + { + TRACE_( "[GSSensorPlugin] CGSSensorPluginContainer::MakeTurnCtrlItemL()" ); + AppendListItemL( EGSTurnCtrlListItemId, + iListItems->operator[]( EGSTurnCtrlListItemId ), + KNullDesC16 ); + TRACE_( "[GSSensorPlugin] CGSSensorPluginContainer::MakeTurnCtrlItemL() - return" ); + } + +// --------------------------------------------------------------------------- +// CGSSensorPluginContainer::MakeOrientationItemL +// --------------------------------------------------------------------------- +// +void CGSSensorPluginContainer::MakeOrientationItemL() + { + TRACE_( "[GSSensorPlugin] CGSSensorPluginContainer::MakeOrientationItemL()" ); + User::Leave( KErrNotSupported ); + TRACE_( "[GSSensorPlugin] CGSSensorPluginContainer::MakeOrientationItemL() - return" ); + } + +// --------------------------------------------------------------------------- +// CGSSensorPluginContainer::MakeExtendedPluginsItemL +// --------------------------------------------------------------------------- +// +void CGSSensorPluginContainer::MakeExtendedPluginsItemL() + { + TRACE_( "[GSSensorPlugin] CGSSensorPluginContainer::MakeExtendedPluginsItemL()" ); + // Create list item for all child plug-ins + const TInt pluginCount( iPluginArray->Count() ); + CGSPluginInterface* plugin = NULL; + + const TUint32 tapVariation = iModel->VariationListL( EGSSenTapping ); + const TUint32 turnVariation = iModel->VariationListL( EGSSenTurning ); + + if ( ( pluginCount == 1 ) && ( !tapVariation && !turnVariation ) ) + { + ActivateExtendedPluginL(); + } + else + { + // 1) Read item descriptor from plugin: + TBuf caption; + + for ( TInt i = 0; i < pluginCount; i++ ) + { + plugin = iPluginArray->operator[]( i ); + plugin->GetCaptionL( caption ); + // Append text to list + AppendListItemL( KErrNotFound, caption, KNullDesC16 ); + } + } + TRACE_( "[GSSensorPlugin] CGSSensorPluginContainer::MakeExtendedPluginsItemL() - return" ); + } + +// --------------------------------------------------------------------------- +// CGSSensorPluginContainer::ActivateExtendedPluginL +// --------------------------------------------------------------------------- +// +void CGSSensorPluginContainer::ActivateExtendedPluginL() + { + TRACE_( "[GSSensorPlugin] CGSSensorPluginContainer::ActivateExtendedPluginL()" ); + // Not local view, try plugins + if ( iPluginArray->Count() == 1) + { + CGSPluginInterface* selectedPlugin = iPluginArray->operator[]( 0 ); + + switch( selectedPlugin->ItemType() ) + { + // In these cases the plugin is a view: + case EGSItemTypeSingleLarge: + case EGSItemTypeSetting: + case EGSItemTypeSettingIcon: + { + CleanupStack::PushL( selectedPlugin ); + iAppUi->ActivateLocalViewL( selectedPlugin->Id() ); + CleanupStack::Pop( selectedPlugin ); + break; + } + + // In these cases the plugin is a dialog: + case EGSItemTypeSettingDialog: + case EGSItemTypeSingleLargeDialog: + selectedPlugin->HandleSelection( EGSSelectionByMenu ); + break; + default: + break; + } + } + TRACE_( "[GSSensorPlugin] CGSSensorPluginContainer::ActivateExtendedPluginL() - return" ); + } + + +// --------------------------------------------------------------------------- +// CGSSensorPluginContainer::AppendListItem +// --------------------------------------------------------------------------- +// +void CGSSensorPluginContainer::AppendListItemL( + const TInt aPos, + const TDesC16& aFirstLabel, + const TDesC16& aSecondLabel ) + { + TBuf itemText; + _LIT( KSpaceAndTab, " \t" ); + _LIT( KTab, "\t" ); + + // The format is: " \tFirstLabel\tSecondLabel\t0\t0" + // First, append space and tab + itemText.Append( KSpaceAndTab ); + itemText.Append( aFirstLabel ); + itemText.Append( KTab ); + itemText.Append( KTab ); + // Currently this is used only to show sensors active status (on/off) + itemText.Append( aSecondLabel ); + + // No need to add last tabs + if ( ( KErrNotFound != aPos ) && ( aPos <= iListBoxTextArray->Count() ) ) + { + iListBoxTextArray->InsertL( aPos, itemText ); + } + else + { + iListBoxTextArray->AppendL( itemText ); + } + } + +// ----------------------------------------------------------------------------- +// CGSSensorPluginContainer::SelectedPlugin +// Returns pointer to selected plugin +// ----------------------------------------------------------------------------- +// +CGSPluginInterface* CGSSensorPluginContainer::SelectedPluginL() + { + TRACE_( "[GSSensorPlugin] CGSSensorPluginContainer::SelectedPlugin()" ); + CGSPluginInterface* plugin = NULL; + + // 1) Decrease index with the count + TInt index = iListBox->CurrentItemIndex() - iGeneralItemCount; + + // 2) Check that new index is in range of plugins + if ( index >= 0 && index < iPluginArray->Count() ) + { + // 3) Get correct plugin + plugin = iPluginArray->operator[]( index ); + } + + // Leave if not found + if ( !plugin ) + { + User::Leave( KErrNotFound ); + } + + TRACE_1( "[GSSensorPlugin] CGSSensorPluginContainer::SelectedPlugin() - return: 0x%x", plugin ); + return plugin; + } + +// --------------------------------------------------------------------------- +// CGSSensorPluginContainer::CurrentFeatureId +// --------------------------------------------------------------------------- +// +TInt CGSSensorPluginContainer::CurrentFeatureId() const + { + TRACE_( "[GSSensorPlugin] CGSSensorPluginContainer::CurrentFeatureId()" ); + return iListboxItemArray->CurrentFeature(); + } + +// --------------------------------------------------------------------------- +// CGSSensorPluginContainer::OfferKeyEventL +// --------------------------------------------------------------------------- +// +TKeyResponse CGSSensorPluginContainer::OfferKeyEventL( + const TKeyEvent& aKeyEvent, TEventCode aType ) + { + TRACE_( "[GSSensorPlugin] CGSSensorPluginContainer::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] CGSSensorPluginContainer::OfferKeyEventL() - return" ); + return returnValue; + } + +// --------------------------------------------------------------------------- +// CGSSensorPluginContainer::GetHelpContext +// --------------------------------------------------------------------------- +// +void CGSSensorPluginContainer::GetHelpContext( TCoeHelpContext& aContext ) const + { + TRACE_( "[GSSensorPlugin] CGSSensorPluginContainer::GetHelpContext()" ); + aContext.iMajor = KUidGS; + aContext.iContext = KSSET_HLP_MAIN_VIEW; + TRACE_( "[GSSensorPlugin] CGSSensorPluginContainer::GetHelpContext() - return" ); + } + +// --------------------------------------------------------------------------- +// CGSSensorPluginContainer::SetSensorStatusTextL +// Setting Sensors status Text based on the value sent, +// '0' meams "Off" & '1' Means 'On' +// --------------------------------------------------------------------------- +// +void CGSSensorPluginContainer::SetSensorStatusTextL( TInt aValue ) + { + TRACE_( "[GSSensorPlugin] CGSSensorPluginContainer::SetSensorStatusTextL()" ); + AppendListItemL( + EGSSensorsListItemId, + iListItems->operator[]( EGSSensorsListItemId ), + ( *iSensorStatusText )[aValue] ); + TRACE_( "[GSSensorPlugin] CGSSensorPluginContainer::SetSensorStatusTextL() - return" ); + }