diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/src/ScreenSaverAnimPluginContainer.cpp --- /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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#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( + 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