diff -r 000000000000 -r f72a12da539e idlehomescreen/xmluirendering/renderingplugins/xnvolumecontrolfactory/src/xnvolumecontroladapter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/idlehomescreen/xmluirendering/renderingplugins/xnvolumecontrolfactory/src/xnvolumecontroladapter.cpp Thu Dec 17 08:40:49 2009 +0200 @@ -0,0 +1,533 @@ +/* +* 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: Implementation for wrapper for a volume control component +* +*/ + + +#include +#include +#include +#include +#include + +#include "xnnodepluginif.h" +#include "xndompropertyvalue.h" +#include "xndomproperty.h" +#include "xndomlist.h" +#include "xnproperty.h" +#include "xncomponent.h" +#include "xnuienginepluginif.h" +#include "xncomponentnodeimpl.h" +#include "xncontroladapter.h" +#include "xntype.h" + +#include "xnvolumecontroladapter.h" +#include "xnvolumecontrolobserver.h" +#include "xnvolumecontrol.rsg" + +_LIT( KResourceFileName, "z:\\resource\\plugins\\xn3volumecontrol.rsc" ); + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CXnVolumeControlAdapter::NewL +// Symbian static 1st phase constructor +// ----------------------------------------------------------------------------- +// +CXnVolumeControlAdapter* CXnVolumeControlAdapter::NewL(CXnControlAdapter* aParent, + CXnNodePluginIf& aNode) + { + CXnVolumeControlAdapter* self = new( ELeave ) CXnVolumeControlAdapter(aParent, aNode); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +// ----------------------------------------------------------------------------- +// CXnVolumeControlAdapter::CXnVolumeControlAdapter +// C++ default constructor +// ----------------------------------------------------------------------------- +// +CXnVolumeControlAdapter::CXnVolumeControlAdapter(CXnControlAdapter* aParent, + CXnNodePluginIf& aNode) + : iParent( aParent ), iNode( aNode ) + { + } + +// ----------------------------------------------------------------------------- +// CXnVolumeControlAdapter::~CXnVolumeControlAdapter +// C++ destructor +// ----------------------------------------------------------------------------- +// +CXnVolumeControlAdapter::~CXnVolumeControlAdapter() + { + delete iVolumeControl; + } + +// ----------------------------------------------------------------------------- +// CXnVolumeControlAdapter::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CXnVolumeControlAdapter::ConstructL() + { + ConstructVolumeControlL(); + + iVolumeControl->SetValue( ValueL() ); + + CXnControlAdapter::ConstructL( iNode ); + } + +// ----------------------------------------------------------------------------- +// CXnVolumeControlAdapter::ConstructVolumeControL +// ----------------------------------------------------------------------------- +// +void CXnVolumeControlAdapter::ConstructVolumeControlL() + { + delete iVolumeControl; + iVolumeControl = NULL; + + iVolumeControl = new ( ELeave ) CAknVolumeControl; + iVolumeControl->SetContainerWindowL( *iParent ); + iVolumeControl->SetBackground( this ); + + RFs fsSession; + + TInt err( fsSession.Connect() ); + + if( err ) + { + User::Leave( err ); + } + + CleanupClosePushL( fsSession ); + + RResourceFile resourceFile; + resourceFile.OpenL( fsSession, KResourceFileName ); + CleanupClosePushL( resourceFile ); + + HBufC8* resource = resourceFile.AllocReadLC( R_XNVOLUMECONTROLDYNAMIC ); + + TResourceReader reader; + reader.SetBuffer( resource ); + + iVolumeControl->ConstructFromResourceL( reader ); + iVolumeControl->SetRect( iNode.Rect() ); + + CleanupStack::PopAndDestroy( 3, &fsSession ); // resource, resourceFile, fsSession + + SetVolumeControlPropertiesL(); + } + +// ----------------------------------------------------------------------------- +// CXnVolumeControlAdapter::SetObserver +// ----------------------------------------------------------------------------- +// +void CXnVolumeControlAdapter::SetObserver( MXnVolumeControlObserver* aObserver ) + { + iObserver = aObserver; + } + +// ----------------------------------------------------------------------------- +// CXnVolumeControlAdapter::SetValue +// ----------------------------------------------------------------------------- +// +void CXnVolumeControlAdapter::SetValueL( TInt aValue ) + { + TInt minRange; + TInt maxRange; + + GetRangeL( minRange, maxRange ); + + if( aValue >= minRange && aValue <= maxRange ) + { + CXnDomStringPool& sp = iNode.UiEngineL()->StringPool(); + CXnDomPropertyValue* value = CXnDomPropertyValue::NewL( sp ); + CleanupStack::PushL( value ); + value->SetFloatValueL( CXnDomPropertyValue::ENumber, aValue ); + CXnProperty* valueProperty = CXnProperty::NewL( XnPropertyNames::action::KValue, value, sp ); + CleanupStack::Pop( value ); + CleanupStack::PushL( valueProperty ); + iNode.SetPropertyL( valueProperty ); + CleanupStack::Pop( valueProperty ); + } + } + +// ----------------------------------------------------------------------------- +// CXnVolumeControlAdapter::Value +// ----------------------------------------------------------------------------- +// +TInt CXnVolumeControlAdapter::ValueL() + { + return GetCurrentValueL(); + } + +// ----------------------------------------------------------------------------- +// CXnVolumeControlAdapter::SetRange +// ----------------------------------------------------------------------------- +// +void CXnVolumeControlAdapter::SetRangeL( TInt aMinimumValue, TInt aMaximumValue ) + { + CXnDomStringPool& sp = iNode.UiEngineL()->StringPool(); + + // Set min value property + CXnDomPropertyValue* minValue = CXnDomPropertyValue::NewL( sp ); + CleanupStack::PushL( minValue ); + minValue->SetFloatValueL( CXnDomPropertyValue::ENumber, aMinimumValue ); + CXnProperty* minValueProperty = CXnProperty::NewL( XnPropertyNames::volumecontrol::KMinRange, minValue, sp ); + CleanupStack::Pop( minValue ); + CleanupStack::PushL( minValueProperty ); + iNode.SetPropertyL( minValueProperty ); + CleanupStack::Pop( minValueProperty ); + + // Set max value property + CXnDomPropertyValue* maxValue = CXnDomPropertyValue::NewL( sp ); + CleanupStack::PushL( maxValue ); + maxValue->SetFloatValueL( CXnDomPropertyValue::ENumber, aMaximumValue ); + CXnProperty* maxValueProperty = CXnProperty::NewL( XnPropertyNames::volumecontrol::KMaxRange, maxValue, sp ); + CleanupStack::Pop( maxValue ); + CleanupStack::PushL( maxValueProperty ); + iNode.SetPropertyL( maxValueProperty ); + CleanupStack::Pop( maxValueProperty ); + + iVolumeControl->SetRange( aMinimumValue, aMaximumValue ); + iSteps = aMaximumValue - aMinimumValue; + } + +// ----------------------------------------------------------------------------- +// CXnVolumeControlAdapter::GetRange +// ----------------------------------------------------------------------------- +// +void CXnVolumeControlAdapter::GetRangeL( TInt& aMinimumValue, TInt& aMaximumValue ) + { + CXnProperty* minRange = iNode.GetPropertyL( XnPropertyNames::volumecontrol::KMinRange ); + aMinimumValue = static_cast( minRange->FloatValueL() ); + + CXnProperty* maxRange = iNode.GetPropertyL( XnPropertyNames::volumecontrol::KMaxRange ); + aMaximumValue = static_cast( maxRange->FloatValueL() ); + } + +// ----------------------------------------------------------------------------- +// CXnVolumeControlAdapter::DoHandlePropertyChangeL +// ----------------------------------------------------------------------------- +// +void CXnVolumeControlAdapter::DoHandlePropertyChangeL( CXnProperty* aProperty ) + { + if (aProperty) + { + TInt minValue; + TInt maxValue; + GetRangeL( minValue, maxValue ); + + if( aProperty->Property()->Name() == XnPropertyNames::volumecontrol::KVolumeLevelAdjustment ) + { + CXnDomStringPool& sp = iNode.UiEngineL()->StringPool(); + CXnDomPropertyValue* value = CXnDomPropertyValue::NewL( sp ); + CleanupStack::PushL( value ); + + const TDesC8& strValue = aProperty->StringValue(); + // Increase volume + if( strValue == XnPropertyNames::volumecontrol::KIncrease ) + { + TInt newValue = ValueL() + 1; + if( newValue >= minValue && newValue <= maxValue ) + { + value->SetFloatValueL( CXnDomPropertyValue::ENumber, ValueL() + 1 ); + } + else + { + CleanupStack::PopAndDestroy( value ); + return; + } + } + // Decrease volume + else if( strValue == XnPropertyNames::volumecontrol::KDecrease ) + { + TInt newValue = ValueL() - 1; + if( newValue >= minValue && newValue <= maxValue ) + { + value->SetFloatValueL( CXnDomPropertyValue::ENumber, ValueL() - 1 ); + } + else + { + CleanupStack::PopAndDestroy( value ); + return; + } + } + // Mute + else if( strValue == XnPropertyNames::volumecontrol::KMute ) + { + if( iMuted ) + { + value->SetFloatValueL( CXnDomPropertyValue::ENumber, iMutedValue ); + iMuted = EFalse; + } + else + { + value->SetFloatValueL( CXnDomPropertyValue::ENumber, minValue ); + iMutedValue = GetCurrentValueL(); + iMuted = ETrue; + } + } + CXnProperty* valueProperty = CXnProperty::NewL( XnPropertyNames::action::KValue, value, sp ); + CleanupStack::Pop( value ); + CleanupStack::PushL( valueProperty ); + iNode.SetPropertyL( valueProperty ); + CleanupStack::Pop( valueProperty ); + } + else if( aProperty->Property()->Name() == XnPropertyNames::action::KValue ) + { + TInt newValue = static_cast( aProperty->FloatValueL() ); + if( newValue >= minValue && newValue <= maxValue ) + { + iVolumeControl->SetValue( newValue ); + NotifyObserverL(); + } + } + } + else + { + return; + } + } + +// ----------------------------------------------------------------------------- +// CXnVolumeControlAdapter::HandleScreenDeviceChangedL +// ----------------------------------------------------------------------------- +// +void CXnVolumeControlAdapter::HandleScreenDeviceChangedL() + { + + ConstructVolumeControlL(); + + CXnControlAdapter::HandleScreenDeviceChangedL(); + } + +// --------------------------------------------------------- +// CXnVolumeControlAdapter::SizeChanged() +// Called by framework when the view size is changed +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CXnVolumeControlAdapter::SizeChanged() + { + CXnControlAdapter::SizeChanged(); + if( iVolumeControl ) + { + iVolumeControl->SetRect( iNode.Rect() ); + } + } + +// ----------------------------------------------------------------------------- +// CXnVolumeControlAdapter::CountComponentControls +// Returns the number of component controls. +// ----------------------------------------------------------------------------- +// +TInt CXnVolumeControlAdapter::CountComponentControls() const + { + return 1; + } + +// ----------------------------------------------------------------------------- +// CXnVolumeControlAdapter::ComponentControl +// Returns the component control of the given index +// ----------------------------------------------------------------------------- +// +CCoeControl* CXnVolumeControlAdapter::ComponentControl( TInt aIndex ) const + { + if( aIndex == 0 ) + { + return iVolumeControl; + } + + return NULL; + } + +// ----------------------------------------------------------------------------- +// CXnNewstickerAdapter::Draw +// ----------------------------------------------------------------------------- +// +void CXnVolumeControlAdapter::Draw(CWindowGc& aGc, const CCoeControl& /*aControl*/, + const TRect& aRect) const + { + CXnControlAdapter::Draw( aRect, aGc ); + } + +// ----------------------------------------------------------------------------- +// CXnVolumeControlAdapter::Draw +// Draws the text component +// ----------------------------------------------------------------------------- +// +void CXnVolumeControlAdapter::Draw(const TRect& aRect) const + { + CXnControlAdapter::Draw( aRect ); + } + +// ---------------------------------------------------------------------------- +// CXnVolumeControlAdapter::HandlePointerEventL +// Handles the pointer events. +// ---------------------------------------------------------------------------- +// +void CXnVolumeControlAdapter::HandlePointerEventL( const TPointerEvent& aPointerEvent ) + { + TRect rect( iVolumeControl->Rect() ); + + TReal incrementWidth( TReal( rect.Width() ) / iSteps ); + + TInt leftX( rect.iTl.iX ); + + if( aPointerEvent.iType == TPointerEvent::EButton1Down || + aPointerEvent.iType == TPointerEvent::EMove && iButton1Down ) + { + // By default change the value + TBool valueSet( EFalse ); + + for( TInt i = 1; i <= iSteps && !valueSet; i++ ) + { + // Calculate pixel range + TReal minX( leftX + ( ( i - 1 ) * incrementWidth ) ); + TReal maxX( minX + incrementWidth ); + + if( aPointerEvent.iPosition.iX >= minX && aPointerEvent.iPosition.iX <= maxX ) + { + TBool changeValue( ETrue ); + + if( iHitRect == TRect::EUninitialized ) + { + // Initialize + iHitRect = TRect( minX, rect.iTl.iY, maxX, rect.iBr.iY ); + } + else if( !( iHitRect.Contains( aPointerEvent.iPosition ) ) ) + { + // Reset, as position is changed + iHitRect = TRect( TRect::EUninitialized ); + changeValue = EFalse; + } + else + { + // Still in same slot, do not change value + changeValue = EFalse; + } + + if( changeValue ) + { + TInt value = ValueL(); + + if( value == i ) + { + value = value - 1; + } + else + { + value = i; + } + + //SetValueL will notify also the observer + SetValueL( value ); + DrawDeferred(); + valueSet = ETrue; + } + } + } + } + + if( aPointerEvent.iType == TPointerEvent::EButton1Down ) + { + iButton1Down = ETrue; + } + + else if( aPointerEvent.iType == TPointerEvent::EButton1Up ) + { + // Reset + iButton1Down = EFalse; + iHitRect = TRect( TRect::EUninitialized ); + } + } + +// ---------------------------------------------------------------------------- +// CXnVolumeControlAdapter::SetVolumeControlProperties +// Sets CSS properties for the volume control +// ---------------------------------------------------------------------------- +// +void CXnVolumeControlAdapter::SetVolumeControlPropertiesL() + { + // Read minrange property + CXnProperty* minRange = iNode.GetPropertyL( XnPropertyNames::volumecontrol::KMinRange ); + TInt minValue = 0; + + if( minRange ) + { + minValue = static_cast( minRange->FloatValueL() ); + } + + // Read maxrange property + CXnProperty* maxRange = iNode.GetPropertyL( XnPropertyNames::volumecontrol::KMaxRange ); + TInt maxValue = 20; + + if( maxRange ) + { + maxValue = static_cast( maxRange->FloatValueL() ); + } + + SetRangeL( minValue, maxValue ); + + TInt midRange( iSteps / 2 ); + TInt volValue( 0 ); + + if( iVolumeControl->Value() < minValue || + iVolumeControl->Value() > maxValue ) + { + // Set around to mid + volValue = midRange; + } + + // Read value property + CXnProperty* value = iNode.GetPropertyL( XnPropertyNames::action::KValue ); + + if( value ) + { + TInt valueProp = static_cast< TInt >( value->FloatValueL() ); + + if( valueProp >= minValue && valueProp <= maxValue ) + { + volValue = valueProp; + } + } + + SetValueL( volValue ); + } + +// ---------------------------------------------------------------------------- +// CXnVolumeControlAdapter::GetCurrentValue +// ---------------------------------------------------------------------------- +// +TInt CXnVolumeControlAdapter::GetCurrentValueL() + { + CXnProperty* valueProperty = iNode.GetPropertyL( XnPropertyNames::action::KValue ); + return static_cast( valueProperty->FloatValueL() ); + } + +// ---------------------------------------------------------------------------- +// CXnVolumeControlAdapter::NotifyObserver +// ---------------------------------------------------------------------------- +// +void CXnVolumeControlAdapter::NotifyObserverL() + { + if( iObserver ) + { + iObserver->VolumeChanged( GetCurrentValueL() ); + } + }