--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/src/ScreenSaverAnimPluginContainer.cpp Wed Sep 01 12:30:40 2010 +0100
@@ -0,0 +1,614 @@
+/*
+* 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:
+* Provides ScreenSaverAnimPlugin edit list view container methods.
+*
+*
+*/
+
+
+
+// INCLUDE FILES
+
+#include <aknlists.h>
+#include <akntitle.h>
+#include <aknslider.h>
+#include <aknsettingpage.h>
+#include <aknslidersettingpage.h>
+#include <CFLDFileListContainer.h>
+#include <MGFetch.h>
+#include <DRMHelper.h>
+#include <screensaveranimplugin.rsg>
+#include <barsread.h>
+#include <centralrepository.h>
+
+#include "ScreenSaverAnimPlugin.h"
+#include "ScreenSaverAnimPluginConst.h"
+#include "ScreenSaverAnimPluginHelper.h"
+#include "ScreenSaverAnimPluginContainer.h"
+#include "ScreenSaverAnimPlugin.hrh"
+
+// ========================= MEMBER FUNCTIONS ================================
+ CScreenSaverAnimPluginContainer* CScreenSaverAnimPluginContainer::NewLC(
+ CScreenSaverAnimPlugin* aCaller,
+ const CCoeControl* aParent,
+ CScreenSaverAnimSettingObject* aSettingObject )
+ {
+ CScreenSaverAnimPluginContainer* self =
+ new ( ELeave ) CScreenSaverAnimPluginContainer( aCaller,
+ aSettingObject );
+ CleanupStack::PushL( self );
+ TRect rect;
+ self->GetNormalScreenLayoutRect( rect );
+ self->ConstructL(aParent, rect );
+ return self;
+
+ }
+
+// ---------------------------------------------------------------------------
+// CScreenSaverAnimPluginContainer::NewL
+// ---------------------------------------------------------------------------
+//
+
+CScreenSaverAnimPluginContainer* CScreenSaverAnimPluginContainer::NewL(
+ CScreenSaverAnimPlugin* aCaller,
+ const CCoeControl* aParent,
+ CScreenSaverAnimSettingObject* aSettingObject )
+ {
+ CScreenSaverAnimPluginContainer* self =
+ CScreenSaverAnimPluginContainer::NewLC( aCaller,
+ aParent,
+ aSettingObject );
+ CleanupStack::Pop( self );
+ return self;
+
+ }
+
+// ---------------------------------------------------------------------------
+// Constructor
+//
+// ---------------------------------------------------------------------------
+//
+CScreenSaverAnimPluginContainer::CScreenSaverAnimPluginContainer(
+ CScreenSaverAnimPlugin* aCaller,
+ CScreenSaverAnimSettingObject* aSettingObject )
+ :
+ iSettingObject( aSettingObject ),
+ iCaller( aCaller )
+ {
+ }
+
+
+// ---------------------------------------------------------------------------
+// CScreenSaverAnimPluginContainer::ConstructL(const TRect& aRect)
+// EPOC two phased constructor
+//
+// ---------------------------------------------------------------------------
+//
+void CScreenSaverAnimPluginContainer::ConstructL( const CCoeControl* aParent,
+ const TRect& aRect )
+ {
+#ifdef SCREENSAVER_LOG_ENABLED
+ _LIT( msg, "In ConstructL of container" );
+ PrintDebugMsg( msg );
+#endif
+
+ CreateWindowL( aParent );
+
+#ifdef SCREENSAVER_LOG_ENABLED
+ _LIT( msg1, "Window Created" );
+ PrintDebugMsg( msg1 );
+#endif
+
+ BaseConstructL( aRect, NULL, R_SANIM_SETTING_LBX_ITEMS );
+
+#ifdef SCREENSAVER_LOG_ENABLED
+ _LIT( msg2, "Base ConstructL called" );
+ PrintDebugMsg( msg2 );
+#endif
+
+ }
+
+// ---------------------------------------------------------------------------
+// CScreenSaverAnimPluginContainer::BaseConstructL
+
+// ---------------------------------------------------------------------------
+//
+void CScreenSaverAnimPluginContainer::BaseConstructL(
+ const TRect& aRect, TInt /* aTitleId */, TInt aResLbxId )
+ {
+ // Feature support should only be read once. It should not change run-time.
+ GetFeatureSupportL( iFeaturesSupport );
+ CEikStatusPane* sp = static_cast< CAknAppUi* >(
+ CEikonEnv::Static()->EikAppUi() )->StatusPane();
+ CAknTitlePane* title = static_cast<CAknTitlePane*>(
+ sp->ControlL( TUid::Uid( EEikStatusPaneUidTitle) ) );
+
+ iListBox = new( ELeave ) CAknSettingStyleListBox;
+
+ ConstructListBoxL( aResLbxId );
+ iListBox->SetContainerWindowL( *this );
+ iListBox->SetRect( aRect );
+
+ iListBox->CreateScrollBarFrameL( ETrue );
+ iListBox->ScrollBarFrame()->SetScrollBarVisibilityL(
+ CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto );
+
+ SetRect( aRect );
+ ActivateL();
+
+ }
+
+// ---------------------------------------------------------------------------
+// CScreenSaverAnimPluginContainer::~CScreenSaverAnimPluginContainer()
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CScreenSaverAnimPluginContainer::~CScreenSaverAnimPluginContainer()
+ {
+ delete iItems;
+ delete iListBox;
+ // delete iItemArray;
+ }
+
+// ---------------------------------------------------------------------------
+// Sets feature support - see screensaveranimpluginconst.h for feature list.
+// ---------------------------------------------------------------------------
+//
+void CScreenSaverAnimPluginContainer::GetFeatureSupportL(
+ TBitFlags& aFeatureBitFlags ) const
+ {
+ CRepository* featureRep = CRepository::NewLC( KCRUidThemesVariation );
+ TInt value = KErrNone;
+ featureRep->Get( KThemesLocalVariation, value );
+
+ aFeatureBitFlags.ClearAll();
+
+ //map value to feature flags
+ if ( value & KScreenSaverRemoveAnimPluginTimeout )
+ {
+ aFeatureBitFlags.Set( EAnimPluginBacklightRemoved );
+ }
+
+ CleanupStack::PopAndDestroy( featureRep );
+ }
+
+// ---------------------------------------------------------------------------
+// Checks if feature is supported.
+// ---------------------------------------------------------------------------
+//
+TBool CScreenSaverAnimPluginContainer::IsFeatureSupported( TInt aFeatureID )
+ {
+ if ( ( aFeatureID >= 0 ) && ( aFeatureID < KAnimPluginMaxFeatureID ) )
+ {
+ return iFeaturesSupport.IsSet( aFeatureID );
+ }
+ else
+ {
+ // invalid feature value.
+ return EFalse;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CScreenSaverAnimPluginContainer::HandleListBoxEventL
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CScreenSaverAnimPluginContainer::HandleListBoxEventL(
+ CEikListBox* /*aListBox*/, TListBoxEvent aEventType )
+ {
+ switch ( aEventType )
+ {
+ case EEventEnterKeyPressed:
+ case EEventItemDoubleClicked:
+ case EEventItemSingleClicked:
+ HandleListBoxSelectionL();
+ break;
+ default:
+ break;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CScreenSaverAnimPluginContainer::HandleListBoxSelectionL()
+// ---------------------------------------------------------------------------
+//
+void CScreenSaverAnimPluginContainer::HandleListBoxSelectionL()
+ {
+ TInt index = iListBox->CurrentItemIndex();
+
+ switch ( index )
+ {
+ case ESanimAnimFileNameId:
+ if ( !iInShowFileItem )
+ {
+ iInShowFileItem = ETrue;
+ TRAPD( err,ShowFileNameItemL() );
+ iInShowFileItem = EFalse;
+ User::LeaveIfError( err );
+ }
+ break;
+ case ESanimAnimTimeoutId:
+ ShowAnimTimeOutItemL();
+ break;
+ case ESanimLightsTimeoutId:
+ ShowLightsTimeOutItemL();
+ break;
+ default:
+ break;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CScreenSaverAnimPluginContainer::ConstructListBoxL( TInt aResLbxId )
+// ---------------------------------------------------------------------------
+//
+void CScreenSaverAnimPluginContainer::ConstructListBoxL( TInt aResLbxId )
+ {
+#ifdef SCREENSAVER_LOG_ENABLED
+ _LIT( msg, "In Construct ListBoxL" );
+ PrintDebugMsg( msg );
+#endif
+
+ iListBox->ConstructL( this, EAknListBoxSelectionList );
+ iItems = iCoeEnv->ReadDesC16ArrayResourceL( aResLbxId );
+ iItemArray = static_cast< CDesCArray* >( iListBox->Model()->ItemTextArray() );
+ iListBox->SetListBoxObserver( this );
+ CreateListBoxItemsL();
+ }
+
+// ---------------------------------------------------------------------------
+// CScreenSaverAnimPluginContainer::CreateListBoxItemsL()
+//
+//
+// ---------------------------------------------------------------------------
+//
+void CScreenSaverAnimPluginContainer::CreateListBoxItemsL()
+ {
+#ifdef SCREENSAVER_LOG_ENABLED
+ _LIT( msg, "Make FileName" );
+ PrintDebugMsg( msg );
+#endif
+
+ MakeFileNameItem();
+ iItemArray->InsertL( ESanimAnimFileNameId, iItem );
+
+#ifdef SCREENSAVER_LOG_ENABLED
+ _LIT( msg1, "Make Duration" );
+ PrintDebugMsg( msg1 );
+#endif
+
+ MakeAnimTimeOutItemL();
+ iItemArray->InsertL( ESanimAnimTimeoutId, iItem );
+
+ if ( !IsFeatureSupported( EAnimPluginBacklightRemoved ) )
+ {
+ #ifdef SCREENSAVER_LOG_ENABLED
+ _LIT( msg2, "Make Backlight" );
+ PrintDebugMsg( msg2 );
+ #endif
+
+ MakeLightsTimeOutItemL();
+ iItemArray->InsertL( ESanimLightsTimeoutId, iItem );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CScreenSaverAnimPluginContainer::UpdateListBoxL( TInt aItemId )
+// ---------------------------------------------------------------------------
+//
+void CScreenSaverAnimPluginContainer::UpdateListBoxL( TInt aItemId )
+ {
+ switch ( aItemId )
+ {
+ case ESanimAnimFileNameId:
+ MakeFileNameItem();
+ break;
+ case ESanimAnimTimeoutId:
+ MakeAnimTimeOutItemL();
+ break;
+ case ESanimLightsTimeoutId:
+ MakeLightsTimeOutItemL();
+ break;
+ default:
+ break;
+ }
+
+ iItemArray->Delete( aItemId );
+ iItemArray->InsertL( aItemId, iItem );
+ iListBox->HandleItemAdditionL();
+ }
+
+// ---------------------------------------------------------------------------
+// CScreenSaverAnimPluginContainer::HandleResourceChange( TInt aType )
+// ---------------------------------------------------------------------------
+//
+void CScreenSaverAnimPluginContainer::HandleResourceChange( TInt aType )
+ {
+ CCoeControl::HandleResourceChange( aType );
+ if( aType == KEikDynamicLayoutVariantSwitch )
+ {
+ TRect mainPaneRect;
+ GetNormalScreenLayoutRect( mainPaneRect );
+ SetRect(mainPaneRect);
+
+ DrawNow();
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CScreenSaverAnimPluginContainer::MakeFileNameItem()
+//
+// ---------------------------------------------------------------------------
+//
+void CScreenSaverAnimPluginContainer::MakeFileNameItem()
+ {
+ iItem = ( *iItems )[ESanimAnimFileNameId];
+ TParsePtrC fileParser( iSettingObject->iFileName );
+ TPtrC ptr( fileParser.NameAndExt() );
+
+ // Filename may be quite long - copy only the amount there's space left
+ iItem += ptr.Left( iItem.MaxLength() - iItem.Length() - 1 );
+ }
+
+// ---------------------------------------------------------------------------
+// CScreenSaverAnimPluginContainer::MakeAnimTimeOutItemL()
+//
+// ---------------------------------------------------------------------------
+//
+void CScreenSaverAnimPluginContainer::MakeAnimTimeOutItemL()
+ {
+ iItem = ( *iItems )[ESanimAnimTimeoutId];
+
+ HBufC* animText = CAknSlider::CreateValueTextInHBufCL(
+ iSettingObject->iAnimationTimeout,
+ R_ANIM_TIMEOUT_SLIDER );
+
+ // for A&H number conversion
+ TPtr bufPtr = animText->Des();
+ if( AknTextUtils::DigitModeQuery( AknTextUtils::EDigitModeShownToUser ) )
+ {
+ AknTextUtils::LanguageSpecificNumberConversion( bufPtr );
+ }
+ iItem += bufPtr;
+ delete animText;
+
+ }
+
+// ---------------------------------------------------------------------------
+// CScreenSaverAnimPluginContainer::MakeLightTimeOutItemL()
+//
+// ---------------------------------------------------------------------------
+//
+void CScreenSaverAnimPluginContainer::MakeLightsTimeOutItemL()
+ {
+ iItem = ( *iItems )[ESanimLightsTimeoutId];
+
+ HBufC* animText = NULL;
+
+ if ( iSettingObject->iLightsTimeout == 0 )
+ {
+ animText = iCoeEnv->AllocReadResourceL( R_SANIM_SLIDER_OFF );
+ }
+ else
+ {
+ animText = CAknSlider::CreateValueTextInHBufCL(
+ iSettingObject->iLightsTimeout,
+ R_LIGHT_TIMEOUT_SLIDER );
+ }
+
+ // for A&H number conversion
+ TPtr bufPtr = animText->Des();
+ if( AknTextUtils::DigitModeQuery( AknTextUtils::EDigitModeShownToUser ) )
+ {
+ AknTextUtils::LanguageSpecificNumberConversion( bufPtr );
+ }
+ iItem += bufPtr;
+ delete animText;
+
+ }
+
+// ---------------------------------------------------------------------------
+// CScreenSaverAnimPluginContainer::ShowFileNameItemL()
+//
+// ---------------------------------------------------------------------------
+//
+void CScreenSaverAnimPluginContainer::ShowFileNameItemL()
+ {
+
+ CDesCArrayFlat* selectedFile = new( ELeave )CDesCArrayFlat( 1 );
+ CleanupStack::PushL( selectedFile );
+
+ TResourceReader reader;
+ iCoeEnv->CreateResourceReaderLC( reader,
+ R_MIMETYPE_SPECIFIC_PLUGIN_ARRAY );
+ TInt countResource = reader.ReadInt16();
+
+ CDesCArrayFlat* mimetypesList = new( ELeave )
+ CDesCArrayFlat( countResource );
+
+ CleanupStack::PushL( mimetypesList );
+
+ for ( TInt i = 0; i < countResource; i++ )
+ {
+ HBufC* mimeType = reader.ReadHBufCL();
+
+ // Check plugin availability before appending mimetype
+ TUid uid = iCaller->FindAnimPluginL( *mimeType );
+ if ( uid != KNullUid )
+ {
+ mimetypesList->AppendL( *mimeType );
+ }
+ delete mimeType;
+ reader.ReadInt32();
+ }
+
+ CScreenSaverAnimPluginVerifier* verifier =
+ CScreenSaverAnimPluginVerifier::NewL( iCaller );
+ CleanupStack::PushL( verifier );
+ TBool fileSelected = MGFetch::RunL( *selectedFile,
+ EAnyMediaFile,
+ EFalse,
+ KNullDesC,
+ KNullDesC,
+ mimetypesList,
+ verifier );
+
+ CleanupStack::PopAndDestroy( verifier );
+ CleanupStack::PopAndDestroy( mimetypesList );
+ CleanupStack::PopAndDestroy(); // reader
+
+ if ( fileSelected )
+ {
+ TPtrC fileNamePtr = selectedFile->MdcaPoint( 0 );
+ TFileName tempFileName;
+ tempFileName.Copy( fileNamePtr );
+ iSettingObject->iFileName.Copy( tempFileName );
+ // Write the new setting into the central repository
+ iCaller->SetAnimSettings();
+ UpdateListBoxL( ESanimAnimFileNameId );
+ }
+
+ CleanupStack::PopAndDestroy( selectedFile );
+
+ }
+
+// ----------------------------------------------------
+// CScreenSaverAnimPluginContainer::ShowAnimTimeOutItemL()
+// Display the animation time-out setting page.
+// ----------------------------------------------------
+//
+void CScreenSaverAnimPluginContainer::ShowAnimTimeOutItemL()
+ {
+
+ CAknSettingPage* dlg = new( ELeave ) CAknSliderSettingPage(
+ R_ANIM_TIMEOUT_SETTING_PAGE,
+ iSettingObject->iAnimationTimeout );
+ if ( dlg->ExecuteLD( CAknSettingPage::EUpdateWhenChanged ) )
+ {
+ // Write the new setting into the central repository
+ iCaller->SetAnimSettings();
+ UpdateListBoxL( ESanimAnimTimeoutId );
+ }
+ }
+
+// ----------------------------------------------------
+// CScreenSaverAnimPluginContainer::ShowLightsTimeOutItemL()
+// Display the animation time-out setting page.
+// ----------------------------------------------------
+//
+void CScreenSaverAnimPluginContainer::ShowLightsTimeOutItemL()
+ {
+ CAknSettingPage* dlg =
+ new( ELeave ) CAknSliderSettingPage( R_LIGHT_TIMEOUT_SETTING_PAGE,
+ iSettingObject->iLightsTimeout );
+ if ( dlg->ExecuteLD( CAknSettingPage::EUpdateWhenChanged ) )
+ {
+ // Write the new setting into the central repository
+ iCaller->SetAnimSettings();
+ UpdateListBoxL( ESanimLightsTimeoutId );
+ }
+ }
+
+void CScreenSaverAnimPluginContainer::SizeChanged()
+ {
+ if (iListBox)
+ {
+ // Get size from main pane, place from this rect
+ TRect mainPaneRect;
+ AknLayoutUtils::LayoutMetricsRect(
+ AknLayoutUtils::EMainPane,
+ mainPaneRect );
+
+ iListBox->SetExtent( Rect().iTl, mainPaneRect.Size() );
+ }
+ }
+
+TInt CScreenSaverAnimPluginContainer::CountComponentControls() const
+ {
+ if ( iListBox )
+ {
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+ }
+
+CCoeControl* CScreenSaverAnimPluginContainer::
+ ComponentControl( TInt /*aIndex*/ ) const
+ {
+ if ( iListBox )
+ {
+ return iListBox;
+ }
+ else
+ {
+ return NULL;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CScreenSaverAnimPluginContainer::OfferKeyEventL
+// Called when a key is pressed.
+//
+// ---------------------------------------------------------------------------
+TKeyResponse CScreenSaverAnimPluginContainer::OfferKeyEventL(
+ const TKeyEvent& aKeyEvent, TEventCode aType )
+ {
+ switch (aKeyEvent.iCode)
+ {
+ case EKeyLeftArrow:
+ case EKeyRightArrow:
+ // Listbox takes all event even if it doesn't use them
+ return EKeyWasNotConsumed;
+ default:
+ break;
+ }
+ return iListBox->OfferKeyEventL( aKeyEvent, aType );
+ }
+
+void CScreenSaverAnimPluginContainer::SetContainerWindowL( const CCoeControl&
+ /* aContainer*/ )
+ {
+ }
+
+// ---------------------------------------------------------------------------
+// CScreenSaverAnimPluginContainer::FocusChanged
+// ---------------------------------------------------------------------------
+void CScreenSaverAnimPluginContainer::FocusChanged( TDrawNow aDrawNow )
+ {
+ // Pass focus changed event to listbox.
+ if ( iListBox )
+ {
+ iListBox->SetFocus( IsFocused(), aDrawNow );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSvgRenderFrameControl::GetNormalScreenLayoutRect
+// Gets the normal screen layout rectangle for control from LAF.
+// -----------------------------------------------------------------------------
+//
+void CScreenSaverAnimPluginContainer::GetNormalScreenLayoutRect(
+ TRect& aRect ) const // Rectangle specifying extent of control
+ {
+ AknLayoutUtils::LayoutMetricsRect(
+ AknLayoutUtils::EMainPane,
+ aRect );
+ }
+
+// End of File