scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/src/ScreenSaverAnimSettingDialog.cpp
branchRCL_3
changeset 26 e8d784ac1a4b
parent 0 040fcad49f44
--- /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 <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