diff -r 6385c4c93049 -r 8e6fa1719340 pushmtm/MtmUiSrc/PushSettingsDialog.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pushmtm/MtmUiSrc/PushSettingsDialog.cpp Wed Sep 01 12:31:04 2010 +0100 @@ -0,0 +1,726 @@ +/* +* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Member definitions of CPushSettingsDialog. +* +*/ + + + +// INCLUDES +#include "browser_platform_variant.hrh" +#include "PushSettingsDialog.h" +#include "PushMtmUiDef.h" +#include "PushMtmUiPanic.h" +#include +#include "PushMtmUi.hrh" +#include "PushMtmDef.hrh" +#include +#include +#include +#include +#include +#include +#ifdef __SERIES60_HELP +// Context-Sensitve Help File +#include +#include +#endif // __SERIES60_HELP +#include +#include +#include +#include "PushMtmPrivateCRKeys.h" +#include +// ================= MEMBER FUNCTIONS ======================= + +// --------------------------------------------------------- +// CPushSettingsDialog::CPushSettingsDialog +// --------------------------------------------------------- +// +CPushSettingsDialog::CPushSettingsDialog( CMsvSession& aMsvSession ) +: CAknDialog(), + iMsvSession( aMsvSession ), + iResourceLoader( *iCoeEnv ), + iNewTitleTextUsed( EFalse ), + iRestoreSP( ETrue ) + { + } + +// --------------------------------------------------------- +// CPushSettingsDialog::ExecuteLD +// --------------------------------------------------------- +// +void CPushSettingsDialog::ExecuteLD() + { + CleanupStack::PushL( this ); + ConstructL(); + CAknDialog::ConstructL( R_PUSHSD_MENU ); + CleanupStack::Pop( this ); + CAknDialog::ExecuteLD( R_PUSHSD_DIALOG ); + } + +// --------------------------------------------------------- +// CPushSettingsDialog::ConstructL +// --------------------------------------------------------- +// +void CPushSettingsDialog::ConstructL() + { + // Add resource file. + CRepository* PushSL = CRepository::NewL( KCRUidPushMtm ); + CleanupStack::PushL( PushSL ); + User::LeaveIfError( PushSL->Get( KPushMtmServiceEnabled , iPushSLEnabled ) ); + CleanupStack::PopAndDestroy( PushSL ); + + TParse* fileParser = new (ELeave) TParse; + // Unnecessary to call CleanupStack::PushL( fileParser ); + fileParser->Set( KPushMtmUiResourceFileAndDrive, &KDC_MTM_RESOURCE_DIR, NULL ); + iResourceFile = fileParser->FullName(); + delete fileParser; + fileParser = NULL; + iResourceLoader.OpenL( iResourceFile ); + + // Construct model. + ConstructModelL(); + + // Now model is ready for view. + const TInt KGranularity( 8 ); + iSettingType = new (ELeave) CArrayFixFlat( KGranularity ); + + // Set up Title Pane and Context Pane. + SetUpStatusPaneL(); + } + +// --------------------------------------------------------- +// CPushSettingsDialog::~CPushSettingsDialog +// --------------------------------------------------------- +// +CPushSettingsDialog::~CPushSettingsDialog() + { + if ( iRestoreSP ) + { + TRAP_IGNORE( RestoreStatusPaneL() ); + } + iResourceLoader.Close(); + delete iPreviousTitleText; + delete iModel; + delete iSettingType; + iSettingListBox = NULL; + iSettingListBoxItemTextArray = NULL; + } + +// --------------------------------------------------------- +// CPushSettingsDialog::SetUpStatusPaneL +// --------------------------------------------------------- +// +void CPushSettingsDialog::SetUpStatusPaneL() + { + if ( !iNewTitleTextUsed ) + { + __ASSERT_DEBUG( !iPreviousTitleText, + UiPanic( EPushMtmUiPanAlreadyExistingTitle ) ); + // Set up Title Pane. + CEikStatusPane* statusPane = iEikonEnv->AppUiFactory()->StatusPane(); + CAknTitlePane* titlePane = + STATIC_CAST( CAknTitlePane*, + statusPane->ControlL( TUid::Uid( EEikStatusPaneUidTitle ) ) ); + // Save content. + iPreviousTitleText = titlePane->Text()->AllocL(); + // Set new content. + TResourceReader reader; + iCoeEnv->CreateResourceReaderLC( reader, R_PUSHSD_TITLE_PANE ); + titlePane->SetFromResourceL( reader ); + CleanupStack::PopAndDestroy(); // reader + iNewTitleTextUsed = ETrue; + } + } + +// --------------------------------------------------------- +// CPushSettingsDialog::RestoreStatusPaneL +// --------------------------------------------------------- +// +void CPushSettingsDialog::RestoreStatusPaneL() + { + if ( iNewTitleTextUsed ) + { + __ASSERT_DEBUG( iPreviousTitleText, + UiPanic( EPushMtmUiPanMissingTitle ) ); + // Restore Title Pane. + CEikStatusPane* statusPane = iEikonEnv->AppUiFactory()->StatusPane(); + CAknTitlePane* titlePane = + STATIC_CAST( CAknTitlePane*, + statusPane->ControlL( TUid::Uid( EEikStatusPaneUidTitle ) ) ); + titlePane->SetTextL( *iPreviousTitleText ); + delete iPreviousTitleText; + iPreviousTitleText = NULL; + iNewTitleTextUsed = EFalse; + } + } + +// --------------------------------------------------------- +// CPushSettingsDialog::ConstructModelL +// --------------------------------------------------------- +// +void CPushSettingsDialog::ConstructModelL() + { + __ASSERT_DEBUG( !iModel, UiPanic( EPushMtmUiPanAlreadyExistingModel ) ); + + // This will be the model. + iModel = CPushMtmSettings::NewL(); + } + +// --------------------------------------------------------- +// CPushSettingsDialog::UpdateSettingListBoxModelL +// --------------------------------------------------------- +// +void CPushSettingsDialog::UpdateSettingListBoxModelL() + { + __ASSERT_DEBUG( iModel && + iSettingListBox && + iSettingListBoxItemTextArray && + iSettingType, UiPanic( EPushMtmUiPanNotInitialized ) ); + + // Reset the list box' item text array and the setting type array. + iSettingListBoxItemTextArray->Reset(); + iSettingType->Reset(); + + // Service reception. + ConstructAndAppendItemTextL + ( EServiceReception, R_PUSHSD_RECEPT, + iModel->ServiceReception() ? R_PUSHSD_RECEP_ON : R_PUSHSD_RECEP_OFF ); + + +if(iPushSLEnabled) + { + // Service loading (SL specific). + ConstructAndAppendItemTextL + ( EServiceLoadingType, R_PUSHSD_LOADING, + ( iModel->ServiceLoadingType() == CPushMtmSettings::EAutomatic ) ? + R_PUSHSD_LOAD_AUTOM : R_PUSHSD_LOAD_MAN ); + } + } + +// --------------------------------------------------------- +// CPushSettingsDialog::UpdateSettingListBoxViewL +// --------------------------------------------------------- +// +void CPushSettingsDialog::UpdateSettingListBoxViewL() const + { + __ASSERT_DEBUG( iSettingListBox, UiPanic( EPushMtmUiPanMissingListBox ) ); + //iSettingListBox->DrawItem( iSettingListBox->CurrentItemIndex() ); + TInt currentItemIndex( iSettingListBox->CurrentItemIndex() ); + iSettingListBox->DrawNow(); + iSettingListBox->SetCurrentItemIndex( currentItemIndex ); + } + +// --------------------------------------------------------- +// CPushSettingsDialog::ApplyModelChangesL +// --------------------------------------------------------- +// +void CPushSettingsDialog::ApplyModelChangesL() + { + UpdateSettingListBoxModelL(); + UpdateSettingListBoxViewL(); + } + +// --------------------------------------------------------- +// CPushSettingsDialog::ShowRadioButtonSettingPageL +// --------------------------------------------------------- +// +void CPushSettingsDialog::ShowRadioButtonSettingPageL + ( const TSettingType aSettingType ) + { + __ASSERT_DEBUG( iModel, UiPanic( EPushMtmUiPanMissingModel ) ); + + TInt index; + HBufC* settingTitle = ConstructSettingTitleL( aSettingType ); + CleanupStack::PushL( settingTitle ); + CDesCArrayFlat* itemArray = + ConstructSettingValueArrayL( aSettingType, index ); + CleanupStack::PushL( itemArray ); + CAknRadioButtonSettingPage* settingPage = + new (ELeave) CAknRadioButtonSettingPage + ( R_PUSHSD_SP_RADIOBUTTON, index, itemArray ); + CleanupStack::PushL( settingPage ); + settingPage->SetSettingTextL( *settingTitle ); + + const TInt previousIndex = index; + CleanupStack::Pop(); // settingPage + if ( settingPage->ExecuteLD( CAknSettingPage::EUpdateWhenChanged ) ) + { + if ( previousIndex != index ) + { + // Set the changes in the model. + UpdateSettingL( aSettingType, index ); + } + } + + CleanupStack::PopAndDestroy( 2 ); // itemArray, settingTitle + } + +// --------------------------------------------------------- +// CPushSettingsDialog::ShowServiceLoadingTypeConfirmationL +// --------------------------------------------------------- +// +TBool CPushSettingsDialog::ShowServiceLoadingTypeConfirmationL() const + { + CAknQueryDialog* dlg = CAknQueryDialog::NewL(); + return dlg->ExecuteLD( R_PUSHSD_AUTOLOAD_SETT_CONFIRM ) == EAknSoftkeyYes; + } + +// --------------------------------------------------------- +// CPushSettingsDialog::ChangeCurrentSettingWithoutSettingPageL +// --------------------------------------------------------- +// +void CPushSettingsDialog::ChangeCurrentSettingWithoutSettingPageL() + { + __ASSERT_DEBUG( iModel && iSettingListBox, + UiPanic( EPushMtmUiPanNotInitialized ) ); + + switch ( iSettingType->At( iSettingListBox->CurrentItemIndex() ) ) + { + case EServiceReception: + { + iModel->SetServiceReception( !iModel->ServiceReception() ); + break; + } + + case EServiceLoadingType: + { + if(iPushSLEnabled){ + if ( iModel->ServiceLoadingType() == CPushMtmSettings::EManual ) + { + // Display a confirmation dialog first. + if ( ShowServiceLoadingTypeConfirmationL() ) + { + iModel->SetServiceLoadingType + ( CPushMtmSettings::EAutomatic ); + } + } + else + { + // Do not show confirmation dialog. + iModel->SetServiceLoadingType( CPushMtmSettings::EManual ); + } + }//End iPushSLEnabled + break; + } + + + default: + { + __ASSERT_DEBUG( EFalse, + UiPanic( EPushMtmUiPanCommandNotSupported ) ); + break; + } + } + + // Apply changes. + iModel->SaveL(); + ApplyModelChangesL(); + } + +// --------------------------------------------------------- +// CPushSettingsDialog::ChangeCurrentSettingL +// --------------------------------------------------------- +// +void CPushSettingsDialog::ChangeCurrentSettingL() + { + __ASSERT_DEBUG( iModel && iSettingListBox, + UiPanic( EPushMtmUiPanNotInitialized ) ); + ShowRadioButtonSettingPageL + ( iSettingType->At( iSettingListBox->CurrentItemIndex() ) ); + // Apply changes. + iModel->SaveL(); + ApplyModelChangesL(); + } + +// --------------------------------------------------------- +// CPushSettingsDialog::ConstructAndAppendItemTextL +// --------------------------------------------------------- +// +void CPushSettingsDialog::ConstructAndAppendItemTextL +( const TSettingType aSettingType, + const TInt aTitleResId, const TInt aValueResId, + const TDesC& aTitleText, const TDesC& aValueText ) + { + __ASSERT_DEBUG( iSettingListBoxItemTextArray && iSettingType, + UiPanic( EPushMtmUiPanNotInitialized ) ); + + // Define separator text. + _LIT( KHeadOfItemText, " \t" ); + // Define separator text. + _LIT( KSeparatorOfItemText, "\t\t" ); + + HBufC* titleText = ( aTitleResId != KErrNotFound ) ? + iEikonEnv->AllocReadResourceLC( aTitleResId ) : aTitleText.AllocLC(); + HBufC* valueText = ( aValueResId != KErrNotFound ) ? + iEikonEnv->AllocReadResourceLC( aValueResId ) : aValueText.AllocLC(); + + // Define a heap descriptor to hold all the item text. + HBufC* itemText = HBufC::NewMaxLC( + KHeadOfItemText().Length() + titleText->Length() + + KSeparatorOfItemText().Length() + valueText->Length() ); + TPtr itemTextPtr = itemText->Des(); + itemTextPtr = KHeadOfItemText; + itemTextPtr += *titleText; + itemTextPtr += KSeparatorOfItemText; + itemTextPtr += *valueText; + iSettingListBoxItemTextArray->AppendL( itemTextPtr ); + iSettingType->AppendL( aSettingType ); + + CleanupStack::PopAndDestroy( 3 ); // itemText, valueText, titleText + } + +// --------------------------------------------------------- +// CPushSettingsDialog::ConstructSettingTitleL +// --------------------------------------------------------- +// +HBufC* CPushSettingsDialog::ConstructSettingTitleL +( const TSettingType aSettingType ) const + { + TInt titleResId = 0; + + if(aSettingType == EServiceReception ) + titleResId = R_PUSHSD_RECEPT; + + else if (aSettingType == EServiceLoadingType) + { + if(iPushSLEnabled ) + titleResId = R_PUSHSD_LOADING; + } + + else + titleResId = KErrNotFound; + + + __ASSERT_DEBUG( titleResId != KErrNotFound, + UiPanic( EPushMtmUiPanNotInitialized ) ); + + return iEikonEnv->AllocReadResourceL( titleResId ); + } + +// --------------------------------------------------------- +// CPushSettingsDialog::ConstructSettingValueArray +// --------------------------------------------------------- +// +void CPushSettingsDialog::ConstructSettingValueArray + ( + const TSettingType aSettingType, + TInt& aVal1ResId, + TInt& aVal2ResId + ) const + { + if( aSettingType == EServiceReception) + aVal1ResId = R_PUSHSD_RECEP_ON; + + else if((aSettingType == EServiceLoadingType) && iPushSLEnabled ) + { + aVal1ResId = R_PUSHSD_LOAD_AUTOM; + } + else + aVal1ResId = KErrNotFound; + + + if( aSettingType == EServiceReception ) + aVal2ResId = R_PUSHSD_RECEP_OFF; + else if( aSettingType == EServiceLoadingType && iPushSLEnabled) + aVal2ResId = R_PUSHSD_LOAD_MAN; + else + aVal2ResId = KErrNotFound; + + + __ASSERT_DEBUG( aVal1ResId != KErrNotFound && + aVal2ResId != KErrNotFound, + UiPanic( EPushMtmUiPanNotInitialized ) ); + } + +// --------------------------------------------------------- +// CPushSettingsDialog::CurrentlySelectedSettingValueResId +// --------------------------------------------------------- +// +TInt CPushSettingsDialog::CurrentlySelectedSettingValueResId +( const TSettingType aSettingType, TInt& aIndex ) const + { + TInt val1ResId( KErrNotFound ); + TInt val2ResId( KErrNotFound ); + ConstructSettingValueArray( aSettingType, val1ResId, val2ResId ); + + TBool firstSelected; + + if(aSettingType == EServiceReception ) + firstSelected = iModel->ServiceReception(); + + else if( aSettingType == EServiceLoadingType && iPushSLEnabled ) + { + firstSelected = (iModel->ServiceLoadingType() == CPushMtmSettings::EAutomatic); + } + else + firstSelected = EFalse; + + + + aIndex = firstSelected ? 0 : 1; + return firstSelected ? val1ResId : val2ResId; + } + +// --------------------------------------------------------- +// CPushSettingsDialog::ConstructSettingValueArrayL +// --------------------------------------------------------- +// +CDesCArrayFlat* CPushSettingsDialog::ConstructSettingValueArrayL +( const TSettingType aSettingType, TInt& aIndex ) const + { + CDesCArrayFlat* valueArray = new (ELeave) CDesCArrayFlat( 2 ); + CleanupStack::PushL( valueArray ); + + TInt val1ResId( KErrNotFound ); + TInt val2ResId( KErrNotFound ); + ConstructSettingValueArray( aSettingType, val1ResId, val2ResId ); + HBufC* value1Text = iEikonEnv->AllocReadResourceLC( val1ResId ); + HBufC* value2Text = iEikonEnv->AllocReadResourceLC( val2ResId ); + valueArray->AppendL( *value1Text ); + valueArray->AppendL( *value2Text ); + CleanupStack::PopAndDestroy( 2 ); // value2Text, value1Text + + // Returned val. is ignored. + CurrentlySelectedSettingValueResId( aSettingType, aIndex ); + + CleanupStack::Pop(); // valueArray + return valueArray; + } + +// --------------------------------------------------------- +// CPushSettingsDialog::UpdateSettingL +// --------------------------------------------------------- +// +void CPushSettingsDialog::UpdateSettingL +( const TSettingType aSettingType, const TInt aIndex ) const + { + switch ( aSettingType ) + { + case EServiceReception: + { + iModel->SetServiceReception( aIndex == 0 ? ETrue : EFalse ); + break; + } + + case EServiceLoadingType: + { + if(iPushSLEnabled) + { + if ( aIndex == 0 ) + // iModel->ServiceLoadingType() == CPushMtmSettings::EManual + { + // Display a confirmation dialog first. + if ( ShowServiceLoadingTypeConfirmationL() ) + { + iModel->SetServiceLoadingType + ( CPushMtmSettings::EAutomatic ); + } + } + else + { + // Do not show confirmation dialog. + iModel->SetServiceLoadingType( CPushMtmSettings::EManual ); + } + } + break; + } + + default: + { + __ASSERT_DEBUG( EFalse, + UiPanic( EPushMtmUiPanCommandNotSupported ) ); + break; + } + } + } + +// --------------------------------------------------------- +// CPushSettingsDialog::OfferKeyEventL +// --------------------------------------------------------- +// +TKeyResponse CPushSettingsDialog::OfferKeyEventL +( const TKeyEvent& aKeyEvent, TEventCode aType ) + { + if ( aType == EEventKey && aKeyEvent.iCode == EKeyEscape ) + { + // Shutting down. Do not restore SP. + iRestoreSP = EFalse; + } + return CAknDialog::OfferKeyEventL( aKeyEvent, aType ); + } + +// --------------------------------------------------------- +// CPushSettingsDialog::DynInitMenuPaneL +// --------------------------------------------------------- +// +void CPushSettingsDialog::DynInitMenuPaneL + ( TInt /*aResourceId*/, CEikMenuPane* /*aMenuPane*/ ) + { + } + +// --------------------------------------------------------- +// CPushSettingsDialog::PreLayoutDynInitL +// --------------------------------------------------------- +// +void CPushSettingsDialog::PreLayoutDynInitL() + { + __ASSERT_DEBUG( !iSettingListBox && + !iSettingListBoxItemTextArray, + UiPanic( EPushMtmUiPanAlreadyInitialized ) ); + + iSettingListBox = STATIC_CAST( CAknSettingStyleListBox*, + Control( EPushSettingsDialogCntrlListBox ) ); + iSettingListBoxItemTextArray = STATIC_CAST( CDesCArrayFlat*, + iSettingListBox->Model()->ItemTextArray() ); + iSettingListBox->SetListBoxObserver( this ); + TRect rect = Rect(); + iSettingListBox->SetRect( rect ); + // Set up scroll bar. + iSettingListBox->CreateScrollBarFrameL( ETrue ); + iSettingListBox->ScrollBarFrame()->SetScrollBarVisibilityL + ( CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto ); + + // Update setting list box model. + UpdateSettingListBoxModelL(); + } + +// --------------------------------------------------------- +// CPushSettingsDialog::ProcessCommandL +// --------------------------------------------------------- +// +void CPushSettingsDialog::ProcessCommandL( TInt aCommand ) + { + HideMenu(); + + switch ( aCommand ) + { + case EPushSettingsDialogCmdChangeWithoutSettingPage: + { + ChangeCurrentSettingWithoutSettingPageL(); + break; + } + + case EPushSettingsDialogCmdChange: + { + ChangeCurrentSettingL(); + break; + } + +#ifdef __SERIES60_HELP + + case EPushSettingsDialogCmdHelp: + { + HlpLauncher::LaunchHelpApplicationL + ( iEikonEnv->WsSession(), + iEikonEnv->EikAppUi()->AppHelpContextL() ); + break; + } + +#endif //__SERIES60_HELP + + case EPushSettingsDialogCmdBack: + case EPushSettingsDialogCmdExit: + { + TryExitL( EPushSettingsDialogCmdAknExit ); + break; + } + + case EPushSettingsDialogCmdAknExit: + { + STATIC_CAST( MEikCommandObserver*, iEikonEnv->EikAppUi() )-> + ProcessCommandL( EPushSettingsDialogCmdAknExit ); + break; + } + + default: + { + break; + } + } + } + +// --------------------------------------------------------- +// CPushSettingsDialog::OkToExitL +// --------------------------------------------------------- +// +TBool CPushSettingsDialog::OkToExitL( TInt aButtonId ) + { + TBool ret( EFalse ); + + switch ( aButtonId ) + { + case EPushSettingsDialogCmdOptions: + { + if ( !MenuShowing() ) + { + DisplayMenuL(); + } + break; + } + case EPushSettingsDialogCmdChangeWithoutSettingPage: + { + ChangeCurrentSettingWithoutSettingPageL(); + break; + } + case EPushSettingsDialogCmdBack: + case EPushSettingsDialogCmdExit: + case EPushSettingsDialogCmdAknExit: + { + RestoreStatusPaneL(); + ret = ETrue; + break; + } + default: + { + break; + } + } + + return ret; + } + +// --------------------------------------------------------- +// CPushSettingsDialog::HandleListBoxEventL +// --------------------------------------------------------- +// +void CPushSettingsDialog::HandleListBoxEventL +( CEikListBox* /*aListBox*/, TListBoxEvent aEventType ) + { + // Generate change command only if double tapped/center key is pressed. + //Removed single tap check from here + if ( aEventType == EEventEnterKeyPressed || + aEventType == EEventItemDoubleClicked +#ifdef BRDO_SINGLE_CLICK_ENABLED_FF + || aEventType == EEventItemSingleClicked +#endif + ) + { + ProcessCommandL( EPushSettingsDialogCmdChangeWithoutSettingPage ); + } + } + +#ifdef __SERIES60_HELP +// --------------------------------------------------------- +// CPushSettingsDialog::GetHelpContext +// --------------------------------------------------------- +// +void CPushSettingsDialog::GetHelpContext( TCoeHelpContext& aContext ) const + { + aContext.iMajor = TUid::Uid( EUidPushViewerApp ); + aContext.iContext = KWPUSH_HLP_SETTINGS; + } +#endif //__SERIES60_HELP + +// End of file.