scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/src/ScreenSaverAnimSettingDialog.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/src/ScreenSaverAnimSettingDialog.cpp Thu Dec 17 08:46:04 2009 +0200
@@ -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 <uikon/eikctrlstatus.h>
+#endif
+#include <e32std.h>
+#include <AknDialog.h>
+#include <coeaui.h>
+#include <eikenv.h>
+#include <bautils.h>
+#include <eikdialg.h>
+#include <eikmenup.h>
+#include <eikspane.h>
+
+#ifdef __SERIES60_HELP
+#include <hlplch.h>
+#endif // __SERIES60_HELP
+
+#ifdef __SERIES60_HELP
+// Help Context UID = DLL UID3
+const TUid KScreenSaverAnimPluginHelpContextUid = { 0x10207447 };
+#endif // __SERIES60_HELP
+
+#include <coeaui.h>
+#include <AknWaitNoteWrapper.h>
+#include <aknnotewrappers.h>
+#include <akntitle.h>
+#include <data_caging_path_literals.hrh>
+#include <StringLoader.h>
+#include <screensaveranimplugin.rsg>
+//-----------
+// 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