diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/src/ScreenSaverAnimSettingDialog.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/src/ScreenSaverAnimSettingDialog.cpp Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,470 @@ +/* +* Copyright (c) 2005 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: This file implements the Setting Dialog which +* is used to display Settings container +* +*/ + + + + + +#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef __SERIES60_HELP +#include +#endif // __SERIES60_HELP + +#ifdef __SERIES60_HELP +// Help Context UID = DLL UID3 +const TUid KScreenSaverAnimPluginHelpContextUid = { 0x10207447 }; +#endif // __SERIES60_HELP + +#include +#include +#include +#include +#include +#include +#include +//----------- +// USER INCLUDES +#include "ScreenSaverAnimPlugin.h" +#include "ScreenSaverAnimPlugin.hrh" +#include "ScreenSaverAnimSettingDialog.h" +#include "ScreenSaverAnimPluginContainer.h" +#include "screensaver.hlp.hrh" + +// Middle softkey control ID +const TInt KSanimMSKControlID = 3; + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimSettingDialog::CScreenSaverAnimSettingDialog +// Default Constructor. Initialises Dialog State Variables. +// ----------------------------------------------------------------------------- +// +CScreenSaverAnimSettingDialog::CScreenSaverAnimSettingDialog( + CScreenSaverAnimPlugin* aCaller, + CScreenSaverAnimSettingObject* aSettingObject ) + :iSettingObject( aSettingObject ), + iCaller( aCaller ) + { + iCustControl = NULL; + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimSettingDialog::ConstructL +// Second Phase Constructor for CScreenSaverAnimSettingDialog. Opens resource file, reads the +// dialog menu resource and calls CAknDialog::ConstructL with the resource as +// param. +// ----------------------------------------------------------------------------- +// +void CScreenSaverAnimSettingDialog::ConstructL() + { + CAknDialog::ConstructL( R_SANIM_DIALOG_MENUBAR ); + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimSettingDialog::NewL +// Factory function for creating CScreenSaverAnimSettingDialog objects. +// Returns: CScreenSaverAnimSettingDialog* ; Pointer to the created object. +// Leaves if error occurs during creation. +// ----------------------------------------------------------------------------- +// +CScreenSaverAnimSettingDialog* CScreenSaverAnimSettingDialog::NewL( + CScreenSaverAnimPlugin* aCaller, + CScreenSaverAnimSettingObject* aSettingObject ) + { + CScreenSaverAnimSettingDialog* self = CScreenSaverAnimSettingDialog::NewLC( + aCaller, + aSettingObject ); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimSettingDialog::NewLC +// Factory function for creating CScreenSaverAnimSettingDialog objects. +// It also pushes the created dialog object onto the cleanup stack. +// Returns: CScreenSaverAnimSettingDialog* ; Pointer to the created object. +// Leaves if error occurs during creation. +// ----------------------------------------------------------------------------- +// +CScreenSaverAnimSettingDialog* CScreenSaverAnimSettingDialog::NewLC( + CScreenSaverAnimPlugin* aCaller, + CScreenSaverAnimSettingObject* aSettingObject ) + { + CScreenSaverAnimSettingDialog* self = new ( ELeave ) + CScreenSaverAnimSettingDialog( aCaller, aSettingObject ); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// Destructor +CScreenSaverAnimSettingDialog::~CScreenSaverAnimSettingDialog() + { + if (this->IsFocused()) + { + CEikDialog::ButtonGroupContainer().RemoveCommandObserver( + KSanimMSKControlID ); + } + + // Custom Control will be automatically destroyed by dialog framework + iCustControl = NULL; + + // Set the text in status pane to the stored one + if (iAppTitleText) + { + // Get the Status Pane Control + CEikStatusPane* sp = iEikonEnv->AppUiFactory()->StatusPane(); + // Get the title pane + CAknTitlePane* tp = NULL; + TRAPD( errGetControl, + tp = static_cast< CAknTitlePane* >( sp->ControlL( + TUid::Uid( EEikStatusPaneUidTitle ) ) ) ); + if ( errGetControl == KErrNone && tp ) + { + //set application name in the title pane + TRAPD( errSetText, + tp->SetTextL( *iAppTitleText ) ); + if ( errSetText != KErrNone ) + { + // No error handling here + } + } + + delete iAppTitleText; + iAppTitleText = NULL; + } + + delete iTitlePaneString; + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimSettingDialog::ExecuteLD +// Reimplements CAknDialog::ExecuteLD. It initialises the member variables of +// the class and calls CAknDialog::ExecuteLD() with the dialog resource. +// ----------------------------------------------------------------------------- +// +TInt CScreenSaverAnimSettingDialog::ExecuteLD() + { +#ifdef SCREENSAVER_LOG_ENABLED + _LIT( msg, "In Executeld dlg" ); + PrintDebugMsg( msg ); +#endif + + // Save this pointer since there are leaving functions in the flow + CleanupStack::PushL( this ); + + // Get the Status Pane Control + CEikStatusPane* sp = iEikonEnv->AppUiFactory()->StatusPane(); + + // Get the Title Pane Control + CAknTitlePane* tp = static_cast< CAknTitlePane* >( sp->ControlL( + TUid::Uid( EEikStatusPaneUidTitle ) ) ); + + // Store the Application's title text + iAppTitleText = HBufC::NewL( tp->Text()->Length() ); + *iAppTitleText = *tp->Text(); + + // Display Settings in the title pane of application + iTitlePaneString = NULL; + iTitlePaneString = StringLoader::LoadL( R_SANIM_TITLE_SETTINGS, + iEikonEnv ); + // SetTextL also ensures that if the length exceeds the layout space + // available the text is truncated from the end. + tp->SetTextL( iTitlePaneString->Des() ); + + // ExecuteLD will delete this, so we have to Pop it... + CleanupStack::Pop( this ); // this + + return CAknDialog::ExecuteLD( R_SANIM_SETTING_DIALOG ); + + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimSettingDialog::DynInitMenuPaneL +// Reimplements CAknDialog::DynInitMenuPaneL inorder to support dynamic hiding +// of menu items based on current state of the viewer. +// ----------------------------------------------------------------------------- +// +void CScreenSaverAnimSettingDialog::DynInitMenuPaneL( + TInt aResourceId, // Resource Id for which this func is called + CEikMenuPane* aMenuPane ) // Menupane object pointer for manipulation + { + if ( ( aResourceId == R_SANIM_DIALOG_MENU ) && ( aMenuPane ) ) + { + } + } + + +// ----------------------------------------------------------------------------- +// Layouts dialog before showing it. +// ----------------------------------------------------------------------------- +// +void CScreenSaverAnimSettingDialog::PreLayoutDynInitL() + { + // Set middle softkey as Change. + SetMiddleSoftKeyLabelL( R_SANIM_MSK_CHANGE, ESanimDlgChangeCommand ); + + CAknDialog::PreLayoutDynInitL(); + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimSettingDialog::OkToExitL +// Reimplements CAknDialog::OkToExitL inorder to display custom menu and +// trap the back softkey to provide restore view functionality/exit. +// ----------------------------------------------------------------------------- +// +TBool CScreenSaverAnimSettingDialog::OkToExitL( TInt aButtonId ) // ButtonId of button pressed + { + if ( aButtonId == EAknSoftkeyOptions ) + { + DisplayMenuL(); + return EFalse; + } + else + { + if ( aButtonId == EAknSoftkeyBack ) + { + } + else + { + // Especially handle Select Key + if ( ( aButtonId == EAknSoftkeySelect ) || + ( aButtonId == EEikBidOk ) || + ( aButtonId == ESanimDlgChangeCommand ) ) + { + // Select button pressed, handle, do not leave dialog + ProcessCommandL( ESanimDlgChangeCommand ); + return EFalse; + } + if ( aButtonId == EEikCmdExit ) + { + } + } + } + + return ETrue; + } + + +// --------------------------------------------------------------------------- +// CScreenSaverAnimSettingDialog::HandleApplicationForegroundEvent +// This API is used by the application to give background/foreground events +// to the Dialog. The dialog inturn passes the events to custom control. +// --------------------------------------------------------------------------- +// +void CScreenSaverAnimSettingDialog::HandleApplicationForegroundEvent( TBool + /*aForeground*/ ) + { + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimSettingDialog::ProcessCommandL +// Reimplements CAknDialog::ProcessCommandL inorder to handle dialog menu +// commands. +// ----------------------------------------------------------------------------- +// +void CScreenSaverAnimSettingDialog::ProcessCommandL( TInt aCommandId ) // Command Id + { + // The Commands are handled by the custom CCoe Control and + // a boolean varialble is used inorder to keep track whether + // the control command processing needs to be invoked or not. + CAknDialog::ProcessCommandL( aCommandId ); + switch ( aCommandId ) + { + case ESanimDlgChangeCommand: + if ( iCustControl ) + { + iCustControl->HandleListBoxSelectionL(); + } + break; + case ESanimDlgHelpCommand: + { +#ifdef __SERIES60_HELP + HlpLauncher::LaunchHelpApplicationL( iEikonEnv->WsSession(), + iEikonEnv->EikAppUi()->AppHelpContextL() ); +#endif + } + break; + case EAknSoftkeyBack: // Fall Through + case EEikCmdExit: + case EAknCmdExit: + // Close this dialog + TryExitL( aCommandId ); + iAvkonAppUi->ProcessCommandL( aCommandId ); + break; + default: + break; + } + } + +#ifdef __SERIES60_HELP +// ----------------------------------------------------------------------------- +// CScreenSaverAnimSettingDialog::OfferKeyEventL +// Handles Key events by reimplementing CCoeControl::OfferKeyEventL. +// Returns: +// EKeyWasConsumed: If this control uses this key. +// EKeyWasNotConsumed: Otherwise. +// ----------------------------------------------------------------------------- +// +void CScreenSaverAnimSettingDialog::GetHelpContext( TCoeHelpContext& + aContext ) const + { + aContext.iMajor = KScreenSaverAnimPluginHelpContextUid; + aContext.iContext = KSCREENSAVER_HLP_ANIM_SETTINGS; + } +#endif // __SERIES60_HELP + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimSettingDialog::CreateCustomControlL +// Reimplements CAknDialog::CreateCustomControlL inorder to add the +// custom control as part of the dialog in the UI framework. +// Returns: SEikControlInfo which contains the Cust Control, if +// aControlType == ESanimCustControl +// else, +// the structure does not contain any control. +// ----------------------------------------------------------------------------- +// +SEikControlInfo CScreenSaverAnimSettingDialog::CreateCustomControlL( + TInt aControlType ) // Control Type + { +#ifdef SCREENSAVER_LOG_ENABLED + _LIT( msg, "In Create Custom Control" ); + PrintDebugMsg( msg ); +#endif + + SEikControlInfo controlInfo; + controlInfo.iControl = NULL; + controlInfo.iTrailerTextId = 0; + controlInfo.iFlags = EEikControlIsNonFocusing; + + switch ( aControlType ) + { + case ESanimCustControl: + iCustControl = CScreenSaverAnimPluginContainer::NewL( + iCaller, + this, + iSettingObject ); + controlInfo.iControl = iCustControl; + break; + default: + break; + } + return controlInfo; + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimSettingDialog::SizeChanged +// Reimplements CAknDialog::SizeChanged inorder to support the resize of the +// dialog when functions such as SetRect, SetExtent are called on the dialog. +// ----------------------------------------------------------------------------- +// +void CScreenSaverAnimSettingDialog::SizeChanged() + { + CAknDialog::SizeChanged(); + iCustControl->SetExtent( Rect().iTl, Rect().Size() ); + DrawNow(); + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimSettingDialog::OfferKeyEventL +// Handles Key events by reimplementing CCoeControl::OfferKeyEventL. +// Returns: +// EKeyWasConsumed: If this control uses this key. +// EKeyWasNotConsumed: Otherwise. +// ----------------------------------------------------------------------------- +// +TKeyResponse CScreenSaverAnimSettingDialog::OfferKeyEventL( + const TKeyEvent& aKeyEvent, // Key Event + TEventCode aType ) // Event Code + { + if ( iCustControl ) + { + TKeyResponse lCcRetVal = iCustControl->OfferKeyEventL( aKeyEvent, aType ); + if ( lCcRetVal == EKeyWasConsumed ) + { + // Key was consumed, UNLESS it was the End key, which should be + // passed to base class. For some reason listboxes like to eat + // end keys + if ( aKeyEvent.iCode != EKeyEscape ) + { + return EKeyWasConsumed; + } + } + } + return CAknDialog::OfferKeyEventL( aKeyEvent, aType ); + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimSettingDialog::HandleResourceChange +// Handles change of skin/Layout +// ----------------------------------------------------------------------------- +// +void CScreenSaverAnimSettingDialog::HandleResourceChange( TInt aType ) + { + if ( iCustControl ) + { + iCustControl->HandleResourceChange( aType ); + } + CAknDialog::HandleResourceChange( aType ); + } + +// --------------------------------------------------------------------------- +// CScreenSaverAnimSettingDialog::FocusChanged +// --------------------------------------------------------------------------- +// +void CScreenSaverAnimSettingDialog::FocusChanged( TDrawNow aDrawNow ) + { + // Pass focus changed event to listbox. + if ( iCustControl ) + { + iCustControl->SetFocus( IsFocused(), aDrawNow ); + } + } + +// --------------------------------------------------------------------------- +// Sets middle softkey label. +// --------------------------------------------------------------------------- +// +void CScreenSaverAnimSettingDialog::SetMiddleSoftKeyLabelL( + const TInt aResourceId, const TInt aCommandId ) + { + HBufC* middleSKText = StringLoader::LoadLC( aResourceId ); + TPtr mskPtr = middleSKText->Des(); + CEikDialog::ButtonGroupContainer().AddCommandToStackL( + KSanimMSKControlID, + aCommandId, + mskPtr ); + CEikDialog::ButtonGroupContainer().UpdateCommandObserverL( + KSanimMSKControlID, + *this ); + CleanupStack::PopAndDestroy( middleSKText ); + } + +// End of File