--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/psln/Src/PslnScreenSaverView.cpp Wed Sep 01 12:16:19 2010 +0100
@@ -0,0 +1,864 @@
+/*
+* Copyright (c) 2005-2007 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: Screen saver view.
+*
+*/
+
+
+// INCLUDE FILES
+
+// RProperty keys.
+#include <e32cmn.h>
+#include <e32def.h>
+#include <ScreensaverInternalPSKeys.h>
+#include <ScreensaverInternalCRKeys.h>
+
+// Central repository.
+#include <centralrepository.h>
+#include <cenrepnotifyhandler.h>
+
+// AVKON services.
+#include <AknWaitDialog.h>
+#include <aknnotewrappers.h>
+#include <avkon.hrh>
+#include <StringLoader.h>
+#include <eikmenup.h>
+
+// Power save mode setting
+#include <psmsettings.h>
+
+// Psln specific.
+#include <psln.rsg>
+#include "PslnModel.h"
+#include "PslnScreenSaverView.h"
+#include "PslnScreenSaverContainer.h"
+#include "PslnConst.h"
+#include "PslnUi.h"
+
+// CONSTANTS
+// Number of default system screensavers.
+const TInt KPslnSystemScreenSavers = 1;
+// Value in PubSub when screensaver preview is off.
+const TInt KPslnScreenSaverPreviewOff = 0;
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CPslnScreenSaverView::CPslnScreenSaverView()
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CPslnScreenSaverView::ConstructL()
+ {
+ BaseConstructL( R_PSLN_SCREENSAVER_VIEW );
+
+ iNaviPaneContext = iPslnUi->PslnTabGroup();
+
+ iScreenSaverRepository = CRepository::NewL( KCRUidScreenSaver );
+ iScreenSaverNotifier = CCenRepNotifyHandler::NewL(
+ *this,
+ *iScreenSaverRepository,
+ CCenRepNotifyHandler::EIntKey,
+ KScreenSaverObject );
+
+ // Load screensavers.
+ iModel->LoadScreensaverArrayL();
+ }
+
+// -----------------------------------------------------------------------------
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CPslnScreenSaverView* CPslnScreenSaverView::NewLC()
+ {
+ CPslnScreenSaverView* self = new (ELeave) CPslnScreenSaverView();
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ return self;
+ }
+
+// Destructor
+CPslnScreenSaverView::~CPslnScreenSaverView()
+ {
+ if ( iPreviewModeSubscriber )
+ {
+ iPreviewModeSubscriber->Cancel();
+ }
+ iPreviewModeProperty.Close();
+ delete iPreviewModeSubscriber;
+ if ( iPreviewStateSubscriber )
+ {
+ iPreviewStateSubscriber->Cancel();
+ }
+ iPreviewStateProperty.Close();
+ delete iPreviewStateSubscriber;
+
+ if(iPsmClient)
+ {
+ iPsmClient->CancelPowerSaveModeNotificationRequest();
+ delete iPsmClient;
+ }
+
+ if ( iWaitDlg )
+ {
+ delete iWaitDlg;
+ }
+
+ if ( iScreenSaverNotifier->IsActive() )
+ {
+ iScreenSaverNotifier->StopListening();
+ }
+ delete iScreenSaverNotifier;
+ delete iScreenSaverRepository;
+ }
+
+// -----------------------------------------------------------------------------
+// CPslnScreenSaverView::Id
+// -----------------------------------------------------------------------------
+//
+TUid CPslnScreenSaverView::Id() const
+ {
+ return KPslnScreenSaverView;
+ }
+
+// -----------------------------------------------------------------------------
+// CPslnScreenSaverView::HandleCommandL
+// -----------------------------------------------------------------------------
+//
+void CPslnScreenSaverView::HandleCommandL( TInt aCommand )
+ {
+ TInt currentItem = 0;
+ if ( iContainer )
+ {
+ currentItem = iContainer->CurrentItemIndex();
+ }
+ switch ( aCommand )
+ {
+ case EPslnCmdAppChangeScreenSaver:
+ if ( iModel->ScreensaverHasCapability( currentItem, EScpCapsConfigure ) )
+ {
+ HandleScreenSaverSettingsL( currentItem );
+ }
+ else
+ {
+ HandleScreenSaverActivationL( currentItem );
+ }
+ break;
+ case EPslnCmdAppSetScreenSaver:
+#ifdef __WINS__
+ // Trap in wins => unhandled leave propagated to UI level.
+ TRAP_IGNORE( HandleScreenSaverActivationL( currentItem ) );
+#else
+ HandleScreenSaverActivationL( currentItem );
+#endif //__WINS__
+ break;
+
+ case EPslnCmdPreviewScreenSaver:
+ HandleScreenSaverPreviewL( currentItem );
+ break;
+
+ case EPslnCmdAppSettings:
+ HandleScreenSaverSettingsL( currentItem );
+ break;
+
+ case EAknSoftkeyExit:
+ aCommand = EAknCmdExit;
+ //lint -fallthrough
+ default:
+ iPslnUi->HandleCommandL( aCommand );
+ break;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// When screensaver list is updated due to install/uninstall of screensaver,
+// this method is called.
+// -----------------------------------------------------------------------------
+//
+void CPslnScreenSaverView::HandlePluginListChangeL()
+ {
+ // Set highlight to selected item.
+ if ( iContainer )
+ {
+ static_cast<CPslnScreenSaverContainer*> (iContainer)->UpdateListBoxL();
+
+ TInt newDefault = iModel->CurrentPropertyIndexL( KPslnScreenSettingId );
+ if ( newDefault == KErrNotFound )
+ {
+ // If no default found, assume that None is default.
+ newDefault = 0;
+ iModel->SetCurrentPropertyTypeL(
+ KPslnScreenSettingId,
+ newDefault );
+ }
+ iContainer->SetCurrentItemIndexAndDraw( newDefault );
+ CheckMiddleSoftkeyLabelL();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// When this method is called, view checks based on highlight focus, if the MSK
+// label is correct.
+// -----------------------------------------------------------------------------
+//
+void CPslnScreenSaverView::CheckMiddleSoftkeyLabelL()
+ {
+ // First remove any prevous commands.
+ RemoveCommandFromMSK();
+
+ if ( IsChangeCommandVisibleL() )
+ {
+ // Set middle softkey as Change.
+ CPslnBaseView::SetMiddleSoftKeyLabelL(
+ R_PSLN_MSK_CHANGE,
+ EPslnCmdAppChangeScreenSaver );
+ }
+ else if(IsApplyCommandVisibleL())
+ {
+ // For "Date" and for inactive screensavers MSK Label is Apply.
+ // Apply is also used for simple installed screensavers that do not have settings.
+ CPslnBaseView::SetMiddleSoftKeyLabelL(
+ R_PSLN_MSK_ACTIVATE,
+ EPslnCmdAppSetScreenSaver );
+
+ }
+ else
+ {
+ // when current focus and ticked item is Date.
+ // Do not show MSK.
+ CPslnBaseView::SetMiddleSoftKeyLabelL(
+ R_PSLN_MSK_DUMMY,
+ EPslnCmdAppSetScreenSaver );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// This is callback method for iPreviewModeSubscriber.
+// This method is not allowed to leave - if it leaves, subscription is not
+// activated.
+// ---------------------------------------------------------------------------
+//
+TInt CPslnScreenSaverView::HandlePreviewModeChanged( TAny *aPtr )
+ {
+ CPslnScreenSaverView* self =
+ static_cast<CPslnScreenSaverView*>(aPtr);
+ TInt value = KErrNone;
+ if ( self->iPreviewModeSubscriber )
+ {
+ self->iPreviewModeProperty.Get( value );
+ }
+
+ if ( value == KPslnScreenSaverPreviewOff )
+ {
+
+ // Stop listening for preview mode changes.
+ if ( self->iPreviewModeSubscriber )
+ {
+ self->iPreviewModeSubscriber->Cancel();
+ }
+
+ // Restore the original screen saver
+ self->iModel->ActivateScreenSaver(
+ KErrNotFound,
+ EPslnScreenSaverPreviewDeactivation );
+
+ if ( self->iContainer )
+ {
+ // Update container.
+ TRAP_IGNORE(
+ static_cast<CPslnScreenSaverContainer*>
+ (self->iContainer)->UpdateListBoxL() );
+ }
+ }
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// This is callback method for iPreviewStateSubscriber.
+// This method is not allowed to leave - if it leaves, subscription is not
+// activated.
+// ---------------------------------------------------------------------------
+//
+TInt CPslnScreenSaverView::HandlePreviewStateChanged( TAny* aPtr )
+ {
+ CPslnScreenSaverView* self =
+ static_cast<CPslnScreenSaverView*>(aPtr);
+ TInt value = KErrNone;
+ if ( self->iPreviewStateSubscriber )
+ {
+ self->iPreviewStateProperty.Get( value );
+ }
+
+ if ( value == EScreenSaverPreviewNone ||
+ value == EScreenSaverPreviewEnd ||
+ value == EScreenSaverPreviewCancel ||
+ value == EScreenSaverPreviewError ||
+ value == EScreenSaverPreviewInvalid )
+ {
+
+ // Stop listening for preview mode changes.
+ if ( self->iPreviewStateSubscriber )
+ {
+ self->iPreviewStateSubscriber->Cancel();
+ }
+ }
+ else
+ {
+ switch ( value )
+ {
+ case EScreenSaverPreviewLoading:
+ self->LaunchNote();
+ break;
+ case EScreenSaverPreviewLoaded:
+ case EScreenSaverPreviewStart:
+ self->RemoveNote();
+ break;
+ default:
+ break;
+ }
+ }
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// Screensaver array needs to be loaded before activating the view.
+// It is done from UI class.
+// -----------------------------------------------------------------------------
+//
+void CPslnScreenSaverView::DoActivateL(
+ const TVwsViewId& aPrevViewId,
+ TUid aCustomMessageId,
+ const TDesC8& aCustomMessage )
+ {
+ CPslnBaseView::DoActivateL(
+ aPrevViewId,
+ aCustomMessageId,
+ aCustomMessage );
+
+ // If view is directly activated (not through main view), update
+ // tab group (and main view's active folder). The static views
+ // have same UID as their tab index.
+ if ( aPrevViewId.iAppUid != KUidPsln )
+ {
+ iPslnUi->UpdateTabIndex(
+ KPslnScreenSaverView.iUid,
+ KPslnScreenSaverView.iUid );
+ }
+
+ // Notify model that we are ready to receive changes in screensavers.
+ iModel->EnableScreenSaverNotifications( ETrue, *this );
+
+ if ( !iScreenSaverNotifier->IsActive() )
+ {
+ iScreenSaverNotifier->StartListeningL();
+ }
+
+ iPsmClient = CPsmClient::NewL(*this);
+ iPsmClient->RequestPowerSaveModeNotification();
+
+ // Set highlight to selected item.
+ if ( iContainer )
+ {
+ iContainer->SetCurrentItemIndexAndDraw(
+ iModel->CurrentPropertyIndexL( KPslnScreenSettingId ) );
+ }
+ CheckMiddleSoftkeyLabelL();
+ }
+
+// -----------------------------------------------------------------------------
+// This is called when view is deactivated (when another view has been activated),
+// -----------------------------------------------------------------------------
+//
+void CPslnScreenSaverView::DoDeactivate()
+ {
+ CPslnBaseView::DoDeactivate();
+
+ // Notify model that we are no longer active.
+ // Get the pointer to model from UI class (even though base view also has it)
+ // because, the model might have been deleted at this point and base class is
+ // not aware of the deletion.
+ if ( iPslnUi->Model() )
+ {
+ iPslnUi->Model()->EnableScreenSaverNotifications( EFalse, *this );
+ }
+
+ if(iPsmClient)
+ {
+ iPsmClient->CancelPowerSaveModeNotificationRequest();
+ delete iPsmClient;
+ iPsmClient = NULL;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CPslnScreenSaverView::DynInitMenuPaneL
+// -----------------------------------------------------------------------------
+//
+void CPslnScreenSaverView::DynInitMenuPaneL(
+ TInt aResourceId, CEikMenuPane* aMenuPane )
+ {
+ if ( aResourceId == R_PSLN_SS_VIEW_MENUPANE )
+ {
+ if ( iContainer )
+ {
+ iCurrentItem = iContainer->CurrentItemIndex();
+ }
+
+ if ( IsChangeCommandVisibleL() )
+ {
+ // Remove Set screensaver, if current selection is already active.
+ aMenuPane->SetItemDimmed( EPslnCmdAppSetScreenSaver, ETrue );
+ // Remove Settings which works exactly the same as Change
+ aMenuPane->SetItemDimmed( EPslnCmdAppSettings, ETrue );
+ }
+ else if ( IsApplyCommandVisibleL() )
+ {
+ // Remove Change screensaver if
+ // a) not active screensaver
+ // b) not of Date type
+ // c) installed screensaver is such that it does not have settings.
+ aMenuPane->SetItemDimmed( EPslnCmdAppChangeScreenSaver, ETrue );
+ }
+ else
+ {
+ // when current focus and ticked item is Date.
+ // a) do not show apply
+ // b) do not show change
+ aMenuPane->SetItemDimmed( EPslnCmdAppSetScreenSaver, ETrue );
+ aMenuPane->SetItemDimmed( EPslnCmdAppChangeScreenSaver, ETrue );
+ }
+
+ // If it is System screen saver, or the plug-in doesn't allow editing
+ // of settings, remove 'Settings' item.
+ if ( ( iCurrentItem < KPslnSystemScreenSavers ) ||
+ ( !iModel->ScreensaverHasCapability(
+ iCurrentItem, EScpCapsConfigure ) ) )
+ {
+ // Set Settings off.
+ aMenuPane->SetItemDimmed( EPslnCmdAppSettings, ETrue );
+ }
+ }
+ CPslnBaseView::DynInitMenuPaneL( aResourceId, aMenuPane );
+ }
+
+// -----------------------------------------------------------------------------
+// CPslnScreenSaverView::HandleListBoxSelectionL
+// -----------------------------------------------------------------------------
+//
+void CPslnScreenSaverView::HandleListBoxSelectionL()
+ {
+ if ( iContainer )
+ {
+ iCurrentItem = iContainer->CurrentItemIndex();
+ }
+ if ( IsChangeCommandVisibleL() )
+ {
+ HandleCommandL( EPslnCmdAppChangeScreenSaver );
+ }
+ else
+ {
+ HandleCommandL( EPslnCmdAppSetScreenSaver );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CPslnScreenSaverView::NewContainerL
+// -----------------------------------------------------------------------------
+//
+void CPslnScreenSaverView::NewContainerL()
+ {
+ iContainer = new (ELeave) CPslnScreenSaverContainer();
+ iContainer->SetMiddleSoftkeyObserver( this );
+ }
+
+// -----------------------------------------------------------------------------
+// CPslnScreenSaverView::SetTitlePaneL
+// -----------------------------------------------------------------------------
+//
+void CPslnScreenSaverView::SetTitlePaneL( TInt& aResourceId )
+ {
+#ifdef RD_CONTROL_PANEL
+ aResourceId = R_PSLN_TITLE_PANE_SCREENSAVER;
+#endif //RD_CONTROL_PANEL
+ }
+
+// -----------------------------------------------------------------------------
+// If wallpaper image has changed, update container.
+// -----------------------------------------------------------------------------
+//
+void CPslnScreenSaverView::HandleNotifyInt( TUint32 aId, TInt /*aNewValue*/ )
+ {
+ if ( aId != KScreenSaverObject )
+ {
+ return;
+ }
+
+ TInt value = KErrNone;
+ if ( iPreviewModeSubscriber )
+ {
+ iPreviewModeProperty.Get( value );
+ }
+
+ if( iContainer && ( value == KPslnScreenSaverPreviewOff ) )
+ {
+ // Update container.
+ TRAP_IGNORE(
+ static_cast<CPslnScreenSaverContainer*>
+ (iContainer)->UpdateListBoxL() );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// If the whole repository changes, update container.
+// -----------------------------------------------------------------------------
+//
+void CPslnScreenSaverView::HandleNotifyGeneric( TUint32 aId )
+ {
+ if ( ( aId == NCentralRepositoryConstants::KInvalidNotificationId ||
+ aId == KScreenSaverObject ) && iContainer )
+ {
+ // Update container.
+ TRAP_IGNORE(
+ static_cast<CPslnScreenSaverContainer*>
+ (iContainer)->UpdateListBoxL() );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// In case of error, try to re-start listening.
+// -----------------------------------------------------------------------------
+//
+void CPslnScreenSaverView::HandleNotifyError(
+ TUint32 /*aId*/,
+ TInt aError,
+ CCenRepNotifyHandler* aHandler )
+ {
+ if ( ( aError != KErrNone ) && aHandler )
+ {
+ TRAP_IGNORE( aHandler->StartListeningL() );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CPslnScreenSaverView::HandleScreenSaverActivationL
+// -----------------------------------------------------------------------------
+//
+void CPslnScreenSaverView::HandleScreenSaverActivationL( TInt aCurrentItem )
+ {
+ TInt PsmMode = 0;
+ iPsmClient->PsmSettings().GetCurrentMode( PsmMode );
+ if ( PsmMode == EPsmsrvModePowerSave ) // PSM on, setting is protected
+ {
+ HBufC* buf = StringLoader::LoadLC( R_PSLN_QTN_PSM_INFONOTE );
+ CAknInformationNote* note = new (ELeave) CAknInformationNote( ETrue );
+ note->ExecuteLD( *buf );
+ CleanupStack::PopAndDestroy( buf );
+ return;
+ }
+
+ TRAPD( err, DoInvokeScreenSaverFunctionL(
+ aCurrentItem,
+ EScpCapsSelectionNotification ) );
+
+ if ( err == KErrNone )
+ {
+ TRAPD( seterr,iModel->SetCurrentPropertyTypeL(
+ KPslnScreenSettingId,
+ aCurrentItem ) );
+ if( seterr == KErrCancel )
+ {
+ return;
+ }
+ else
+ {
+ User::LeaveIfError( seterr );
+ }
+
+ if ( iContainer )
+ {
+ // Update container.
+ static_cast<CPslnScreenSaverContainer*>
+ (iContainer)->UpdateListBoxL();
+ }
+ CheckMiddleSoftkeyLabelL();
+ }
+
+ return;
+ }
+
+// -----------------------------------------------------------------------------
+// CPslnScreenSaverView::HandleScreenSaverPreviewL
+// -----------------------------------------------------------------------------
+//
+void CPslnScreenSaverView::HandleScreenSaverPreviewL( TInt aCurrentItem )
+ {
+ TRAPD( err, DoInvokeScreenSaverFunctionL(
+ aCurrentItem,
+ EScpCapsPreviewNotification ) );
+
+ if ( err == KErrNone )
+ {
+ // Start listening for screensaver preview mode key changes.
+ CreatePreviewModeSubscriberL();
+ CreatePreviewStateSubscriberL();
+
+ User::LeaveIfError(
+ iModel->ActivateScreenSaver(
+ aCurrentItem,
+ EPslnScreenSaverPreviewActivation ) );
+ }
+
+ return;
+ }
+
+// -----------------------------------------------------------------------------
+// CPslnScreenSaverView::HandleScreenSaverSettingsL
+// -----------------------------------------------------------------------------
+//
+void CPslnScreenSaverView::HandleScreenSaverSettingsL( TInt aCurrentItem )
+ {
+ // Indicate to the plugin that active screensaver is possibly modified.
+ TInt selectedItem = iModel->CurrentPropertyIndexL( KPslnScreenSettingId );
+ if ( selectedItem == aCurrentItem )
+ {
+ User::LeaveIfError(
+ RProperty::Set(
+ KPSUidScreenSaver,
+ KScreenSaverPluginSettingsChanged,
+ EScreenSaverPluginSettingsChanging ) );
+ }
+ // Configure plugin.
+ TRAP_IGNORE( DoInvokeScreenSaverFunctionL(
+ aCurrentItem,
+ EScpCapsConfigure ) );
+ }
+
+// -----------------------------------------------------------------------------
+// Non-Leaving version of wait note launching.
+// -----------------------------------------------------------------------------
+//
+void CPslnScreenSaverView::LaunchNote()
+ {
+ TRAP_IGNORE( LaunchNoteL() );
+ }
+
+// -----------------------------------------------------------------------------
+// Launches wait note.
+// -----------------------------------------------------------------------------
+//
+void CPslnScreenSaverView::LaunchNoteL()
+ {
+ HBufC* noteText = StringLoader::LoadLC( R_PSLN_QTN_GEN_NOTE_OPENING );
+
+ if ( !iWaitDlg )
+ {
+ // Create note and launch it.
+ CAknWaitDialog* requestingNote = new(ELeave) CAknWaitDialog(
+ (REINTERPRET_CAST( CEikDialog**, &iWaitDlg ) ), ETrue );
+ iWaitDlg = requestingNote;
+ requestingNote->PrepareLC( R_PSLN_GENERAL_WAIT_NOTE );
+ if ( noteText )
+ {
+ requestingNote->SetTextL( noteText->Des() );
+ }
+ requestingNote->RunLD();
+ }
+
+ CleanupStack::PopAndDestroy( noteText );
+ }
+
+// -----------------------------------------------------------------------------
+// Non-Leaving version of wait note removal.
+// -----------------------------------------------------------------------------
+//
+void CPslnScreenSaverView::RemoveNote()
+ {
+ TRAP_IGNORE( RemoveNoteL() );
+ }
+
+// -----------------------------------------------------------------------------
+// Removes opening note and stops listening for preview state changes.
+// -----------------------------------------------------------------------------
+//
+void CPslnScreenSaverView::RemoveNoteL()
+ {
+ // Stop listening for preview mode changes.
+ if ( iPreviewStateSubscriber )
+ {
+ iPreviewStateSubscriber->Cancel();
+ }
+ // Remove wait note.
+ if ( iWaitDlg )
+ {
+ iWaitDlg->ProcessFinishedL();
+ iWaitDlg = NULL;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// Invokes screensaver function.
+// -----------------------------------------------------------------------------
+//
+void CPslnScreenSaverView::DoInvokeScreenSaverFunctionL(
+ const TInt aCurrentItem, const TScPluginCaps aType )
+ {
+ // Offer selection notification, if requested by the saver
+ if( iModel && iModel->ScreensaverHasCapability(
+ aCurrentItem,
+ aType ) )
+ {
+ iModel->InvokeSSPluginFunctionL(
+ aCurrentItem,
+ aType );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// Creates subscriber and starts to listen.
+// -----------------------------------------------------------------------------
+//
+void CPslnScreenSaverView::CreatePreviewModeSubscriberL()
+ {
+ if ( !iPreviewModeSubscriber )
+ {
+ User::LeaveIfError(
+ iPreviewModeProperty.Attach(
+ KPSUidScreenSaver,
+ KScreenSaverPreviewMode ) );
+ iPreviewModeSubscriber =
+ new (ELeave) CPslnPropertySubscriber(
+ TCallBack( HandlePreviewModeChanged, this ),
+ iPreviewModeProperty );
+ }
+ iPreviewModeSubscriber->Subscribe();
+ }
+
+void CPslnScreenSaverView::CreatePreviewStateSubscriberL()
+ {
+ if ( !iPreviewStateSubscriber )
+ {
+ User::LeaveIfError(
+ iPreviewStateProperty.Attach(
+ KPSUidScreenSaver,
+ KScreenSaverPreviewState ) );
+ iPreviewStateSubscriber =
+ new (ELeave) CPslnPropertySubscriber(
+ TCallBack( HandlePreviewStateChanged, this ),
+ iPreviewStateProperty );
+ }
+ iPreviewStateSubscriber->Subscribe();
+ }
+
+// -----------------------------------------------------------------------------
+// Remove unnecessary commands from Middle softkey.
+// -----------------------------------------------------------------------------
+//
+void CPslnScreenSaverView::RemoveCommandFromMSK()
+ {
+ CEikButtonGroupContainer* cbaGroup = Cba();
+ if ( cbaGroup )
+ {
+ cbaGroup->RemoveCommandFromStack( KPslnMSKControlID, EPslnCmdAppSetScreenSaver );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// Is 'Change' command visible or not.
+// -----------------------------------------------------------------------------
+//
+TBool CPslnScreenSaverView::IsChangeCommandVisibleL() const
+ {
+ if ( !iContainer )
+ {
+ return EFalse;
+ }
+
+ TInt currentItem = KErrNotFound;
+ currentItem = iContainer->CurrentItemIndex();
+
+ // Remove Change screensaver if
+ // a) not active screensaver
+ // b) not of Date type
+ // c) installed screensaver is such that it does not have settings.
+ if ( currentItem == iModel->CurrentPropertyIndexL( KPslnScreenSettingId ) &&
+ iModel->ScreensaverHasCapability( currentItem, EScpCapsConfigure ) )
+ {
+ return ETrue;
+ }
+
+ return EFalse;
+ }
+
+
+// -----------------------------------------------------------------------------
+// Is the focus item the same as the setting
+// -----------------------------------------------------------------------------
+//
+TBool CPslnScreenSaverView::IsApplyCommandVisibleL() const
+ {
+ if ( !iContainer )
+ {
+ return EFalse;
+ }
+
+ TInt currentItem = KErrNotFound;
+ currentItem = iContainer->CurrentItemIndex();
+
+ // Remove Apply screensaver if
+ // a) the focused item is the same as ticked
+ // c)
+
+ TBool retVal = ETrue;
+ if ( currentItem == iModel->CurrentPropertyIndexL( KPslnScreenSettingId ))
+ {
+ retVal = EFalse;
+ }
+ return retVal;
+ }
+
+
+// -----------------------------------------------------------------------------
+// Called when the power save mode is changed.
+// -----------------------------------------------------------------------------
+//
+void CPslnScreenSaverView::PowerSaveModeChanged( const TPsmsrvMode /*aMode*/ )
+ {
+ TRAP_IGNORE( iContainer->SetCurrentItemIndexAndDraw(
+ iModel->CurrentPropertyIndexL( KPslnScreenSettingId ) ) );
+ TRAP_IGNORE( CheckMiddleSoftkeyLabelL() );
+
+ if ( iPsmClient )
+ {
+ iPsmClient->RequestPowerSaveModeNotification();
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// Called when some wrong with the power save mode change.
+// -----------------------------------------------------------------------------
+//
+void CPslnScreenSaverView::PowerSaveModeChangeError( const TInt /*aError*/ )
+ {
+ }
+
+
+// End of File