diff -r 000000000000 -r 15bf7259bb7c uiacceltk/hitchcock/plugins/alftranseffect/alftranseffectplugin/src/alfsystemeffects.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uiacceltk/hitchcock/plugins/alftranseffect/alftranseffectplugin/src/alfsystemeffects.cpp Tue Feb 02 07:56:43 2010 +0200 @@ -0,0 +1,326 @@ +/* +* Copyright (c) 2006 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: Alf system effects +* +*/ + + + + +// INCLUDE FILES +#include +#include +#include + +#include "alftfxplugincommon.hrh" +#include "alfsystemeffects.h" +#include "alf/alfsrveffectenv.h" +#include + +#include "uiacceltk/HuiDisplay.h" +#include "uiacceltk/HuiLayout.h" +#include "uiacceltk/HuiControlGroup.h" +#include "uiacceltk/HuiControl.h" +#include "uiacceltk/HuiRoster.h" +#include "uiacceltk/HuiCommand.h" +#include "uiacceltk/HuiEnv.h" +#include "uiacceltk/HuiTransformation.h" + +// Constants +const TInt KAlfDefaultFocusGainedEffectDuration = 500; +const TInt KAlfDefaultFocusLostEffectDuration = 500; + +// ============================ MEMBER FUNCTIONS =============================== + + +// ----------------------------------------------------------------------------- +// CAlfSystemEffects::CAlfSystemEffects +// C++ constuctor. +// ----------------------------------------------------------------------------- +// +CAlfSystemEffects::CAlfSystemEffects( ) + + { + //LOGTEXT(_L("CAlfSystemEffects::CAlfSystemEffects()")); + } + + +// ----------------------------------------------------------------------------- +// CAlfSystemEffects::NewExtensionL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +MAlfTransEffectPlugin* CAlfSystemEffects::NewExtensionL() + { + __ALFFXLOGSTRING("CAlfSystemEffects::NewExtensionL >>"); + //LOGTEXT(_L("CAlfSystemEffects::NewExtensionL()")); + CAlfSystemEffects* self = new(ELeave) CAlfSystemEffects(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + __ALFFXLOGSTRING("CAlfSystemEffects::NewExtensionL <<"); + return ( self ); + } + + +// ----------------------------------------------------------------------------- +// CAlfSystemEffects::ConstructL +// Symbian 2nd phase constructor. +// ----------------------------------------------------------------------------- +// +void CAlfSystemEffects::ConstructL() + { + //LOGTEXT(_L("CAlfSystemEffects::ConstructL()")); + } + + +// ----------------------------------------------------------------------------- +// CAlfSystemEffects::~CAlfSystemEffects +// C++ destructor. +// ----------------------------------------------------------------------------- +// +CAlfSystemEffects::~CAlfSystemEffects() + { + __ALFFXLOGSTRING("CAlfSystemEffects::~CAlfSystemEffects"); + //LOGTEXT(_L("CAlfSystemEffects::~CAlfSystemEffects()")); + } + + +// ----------------------------------------------------------------------------- +// CAlfSystemEffects::GetSupportedEffects +// ----------------------------------------------------------------------------- +// +TInt CAlfSystemEffects::GetSupportedEffects( RArray& aSupportedEffectIds ) + { + __ALFFXLOGSTRING("CAlfSystemEffects::GetSupportedEffects >>"); + // Add effect ids which are supported by this plugin + aSupportedEffectIds.Append( MAlfTransEffectPlugin::EContextFocusGained ); + aSupportedEffectIds.Append( MAlfTransEffectPlugin::EContextFocusLost ); + aSupportedEffectIds.Append( MAlfTransEffectPlugin::EContextEmbeddedStart ); + aSupportedEffectIds.Append( MAlfTransEffectPlugin::EContextEmbeddedExit ); + __ALFFXLOGSTRING("CAlfSystemEffects::GetSupportedEffects - return KErrnone<<"); + return KErrNone; + }; + + +// ----------------------------------------------------------------------------- +// CAlfSystemEffects::StartPhase +// ----------------------------------------------------------------------------- +// +TInt CAlfSystemEffects::StartPhase( TInt aPhaseId, TInt aEffectId, + CAlfSrvEffectEnv& aEffectEnv, const TDesC8* aParams ) + { + __ALFFXLOGSTRING("CAlfSystemEffects::StartPhase >>"); + TRAP_IGNORE( DoStartPhaseL( aPhaseId, aEffectId, aEffectEnv, aParams )); + __ALFFXLOGSTRING("CAlfSystemEffects::StartPhase - return KErrNone <<"); + return KErrNone; + } + + +// ----------------------------------------------------------------------------- +// CAlfSystemEffects::DoStartPhaseL +// ----------------------------------------------------------------------------- +// +TInt CAlfSystemEffects::DoStartPhaseL( TInt /*aPhaseId*/, TInt aEffectId, + CAlfSrvEffectEnv& aEffectEnv, const TDesC8* /*aParams*/ ) + { + __ALFFXLOGSTRING1("CAlfSystemEffects::DoStartPhaseL - aEffectId: %d ", aEffectId ); + + // Start effect here! + switch (aEffectId) + { + case MAlfTransEffectPlugin::EContextFocusGained: + { + ShowVisibleGroupsAndMakeNonTransparentL( aEffectEnv ); + break; + } + + case MAlfTransEffectPlugin::EContextFocusLost: + { + HideGroupsAndMakeTransparentL( aEffectEnv ); + break; + } + + case MAlfTransEffectPlugin::EContextEmbeddedStart: + { + // do a normal show + ShowVisibleGroupsAndMakeNonTransparentL( aEffectEnv ); + + // in addition, do a expand effect for the visible groups + TInt controlGroupCount = aEffectEnv.VisibleControlGroupCountL(); + for ( TInt g = 0 ; g < controlGroupCount ; g++ ) + { + CHuiControlGroup* group = aEffectEnv.VisibleControlGroupL(g); + if (group) + { + // Perhaps we should show controlgroup in other displays too...? + CHuiDisplay* defaultDisplay = aEffectEnv.DisplayL(0); + if (defaultDisplay) + { + CHuiLayout* hostContainer = group->Control(0).ContainerLayout( NULL ); + + // Cancel the previous 'disable transformation' commands. + aEffectEnv.SharedEnv()->CancelCommands( hostContainer, EHuiOpDisableTransformation ); + + hostContainer->EnableTransformationL(); + CHuiTransformation& xf = hostContainer->Transformation(); + + THuiTimedValue scale(0); + scale.Set(1, KAlfDefaultFocusGainedEffectDuration); + + // Clear previously created transformation steps. + xf.LoadIdentity(); + + xf.Scale(scale,scale); + + // Disable transformations after effect + THuiVisualCommand disableTransformationCommand( *hostContainer, EHuiOpDisableTransformation ); + aEffectEnv.SharedEnv()->Send( disableTransformationCommand, KAlfDefaultFocusGainedEffectDuration ); + } + } + } + break; + } + case MAlfTransEffectPlugin::EContextEmbeddedExit: + { + // do normal hide + HideGroupsAndMakeTransparentL( aEffectEnv ); + + // in addition, do a shrink effect for the visible groups + TInt controlGroupCount = aEffectEnv.VisibleControlGroupCountL(); + for ( TInt g = 0 ; g < controlGroupCount ; g++ ) + { + CHuiControlGroup* group = aEffectEnv.VisibleControlGroupL(g); + if (group) + { + // Perhaps we should show controlgroup in other displays too...? + CHuiDisplay* defaultDisplay = aEffectEnv.DisplayL(0); + if (defaultDisplay) + { + // Do a little pop out effect + CHuiLayout* hostContainer = group->Control(0).ContainerLayout( NULL ); + + // Cancel the previous 'disable transformation' commands. + aEffectEnv.SharedEnv()->CancelCommands( hostContainer, EHuiOpDisableTransformation ); + + hostContainer->EnableTransformationL(); + CHuiTransformation& xf = hostContainer->Transformation(); + + THuiTimedValue scale(1); + scale.Set(0, KAlfDefaultFocusLostEffectDuration); + + // Clear previously created transformation steps. + xf.LoadIdentity(); + + xf.Scale(scale,scale); + + // Disable transformations after effect + THuiVisualCommand disableTransformationCommand( *hostContainer, EHuiOpDisableTransformation ); + aEffectEnv.SharedEnv()->Send( disableTransformationCommand, KAlfDefaultFocusLostEffectDuration ); + } + } + } + break; + } + default: + { + + break; + } + } + __ALFFXLOGSTRING("CAlfSystemEffects::DoStartPhaseL - return KErrNone <<"); + return KErrNone; + }; + +void CAlfSystemEffects::ShowVisibleGroupsAndMakeNonTransparentL(CAlfSrvEffectEnv& aEffectEnv) + { + __ALFFXLOGSTRING("CAlfSystemEffects::ShowVisibleGroupsAndMakeNonTransparentL >>"); + // Set opacity of every control group to 1, even if it is not shown because + // application may want to show it later and it cannot control the + // opacity. + TInt controlGroupCount = aEffectEnv.ControlGroupCountL(); + for ( TInt g = 0 ; g < controlGroupCount ; g++ ) + { + CHuiControlGroup* group = aEffectEnv.ControlGroupL(g); + if (group) + { + // Perhaps we should show controlgroup in other displays too...? + CHuiDisplay* defaultDisplay = aEffectEnv.DisplayL(0); + if (defaultDisplay) + { + // Set the root visual opacity to 1 which affects all the visuals in the group + CHuiLayout* hostContainer = group->Control(0).ContainerLayout( NULL ); + hostContainer->iOpacity.Set(1.f, KAlfDefaultFocusGainedEffectDuration); + + // Disable also previous transformations. + hostContainer->EnableTransformationL(EFalse); + } + } + } + + // Check how many control groups are shown (set visible by the application) + + // todo: the visible control group should be shown in the same order as they were + // set into the roster originally. + TInt visibleControlGroupCount = aEffectEnv.VisibleControlGroupCountL(); + for ( TInt g = 0 ; g < visibleControlGroupCount ; g++ ) + { + CHuiControlGroup* group = aEffectEnv.VisibleControlGroupL(g); + if (group) + { + CHuiDisplay* defaultDisplay = aEffectEnv.DisplayL(0); + if (defaultDisplay) + { + // Cancel the previous hide commands. + aEffectEnv.SharedEnv()->CancelCommands( group, EHuiOpHide ); + + // Show control group ! + defaultDisplay->Roster().ShowL(*group); + group->SetAcceptInput(EFalse); + } + } + } + __ALFFXLOGSTRING("CAlfSystemEffects::ShowVisibleGroupsAndMakeNonTransparentL <<"); + } + +void CAlfSystemEffects::HideGroupsAndMakeTransparentL(CAlfSrvEffectEnv& aEffectEnv) + { + __ALFFXLOGSTRING("CAlfSystemEffects::HideGroupsAndMakeTransparentL >>"); + TInt controlGroupCount = aEffectEnv.ControlGroupCountL(); + for ( TInt g = 0 ; g < controlGroupCount ; g++ ) + { + CHuiControlGroup* group = aEffectEnv.ControlGroupL(g); + if (group) + { + // Perhaps we should show controlgroup in other displays too...? + CHuiDisplay* defaultDisplay = aEffectEnv.DisplayL(0); + if (defaultDisplay) + { + // Set the root visual opacity to 0 which affects all the visuals in the group + CHuiLayout* hostContainer = group->Control(0).ContainerLayout( NULL ); + hostContainer->iOpacity.Set(0.f, KAlfDefaultFocusGainedEffectDuration); + + if (defaultDisplay->DisplayType() != CHuiDisplay::EDisplayOffScreenBuffer) + { + // Hide the group so that it does not use resources when we dont have focus + THuiGroupCommand command( *group, EHuiOpHide, defaultDisplay ); + aEffectEnv.SharedEnv()->Send(command, KAlfDefaultFocusLostEffectDuration); + } + } + } + } + __ALFFXLOGSTRING("CAlfSystemEffects::HideGroupsAndMakeTransparentL <<"); + } + +// End of File