diff -r 000000000000 -r 15bf7259bb7c uiacceltk/hitchcock/Client/src/alfcontrolgroup.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uiacceltk/hitchcock/Client/src/alfcontrolgroup.cpp Tue Feb 02 07:56:43 2010 +0200 @@ -0,0 +1,335 @@ +/* +* 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: Control group +* +*/ + + + +#include "alf/alfcontrolgroup.h" +#include "alfcontrolgroupsubsession.h" +#include "alf/alfcontrol.h" +#include "alf/alfenv.h" +#include "alfclient.h" +#include "alf/alftransformation.h" + +#include + +// used flags +enum TAlfControlGroupFlags + { + EAlfControlGroupAllowInput = 0x01 + }; + +// private data +struct CAlfControlGroup::TPrivateData + { + RAlfControlGroupSubSession iControlGroupSubSession; // Owned + TUint iFlags; // Owned. + TInt iResourceId; // Owned. + CAlfEnv* iEnv; // Not owned. + RPointerArray iControls; // Owned. + CAlfTransformation* iTransform; // Owned. + CAlfDisplay* iBoundDisplay; // Not owned. + }; + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// Constructor +// --------------------------------------------------------------------------- +// +CAlfControlGroup::CAlfControlGroup() + { + } + + +// --------------------------------------------------------------------------- +// ConstructL +// --------------------------------------------------------------------------- +// +void CAlfControlGroup::ConstructL(TInt aResourceId, CAlfEnv& aEnv) + { + iData = new (ELeave) TPrivateData; + + User::LeaveIfError( + iData->iControlGroupSubSession.Open(aEnv.Client(), aResourceId) ); + + iData->iFlags = EAlfControlGroupAllowInput; + iData->iEnv = &aEnv; + //iData->iOpacity.Set(1.0); + iData->iResourceId = aResourceId; + iData->iTransform = NULL; + iData->iBoundDisplay = NULL; + } + + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CAlfControlGroup::~CAlfControlGroup() + { + if ( iData ) + { + iData->iControls.ResetAndDestroy(); + + delete iData->iTransform; + iData->iTransform = NULL; + + iData->iControlGroupSubSession.Close(); + } + + delete iData; + iData = NULL; + } + +// --------------------------------------------------------------------------- +// Returns server side handle +// --------------------------------------------------------------------------- +// +TInt CAlfControlGroup::Identifier() const + { + return iData->iControlGroupSubSession.SubSessionHandle(); + } + +// --------------------------------------------------------------------------- +// Binds this control group to the given display. +// --------------------------------------------------------------------------- +// +void CAlfControlGroup::BindDisplay(CAlfDisplay* aDisplay) + { + iData->iBoundDisplay = aDisplay; + } + +// --------------------------------------------------------------------------- +// Returns ID. +// --------------------------------------------------------------------------- +// +EXPORT_C TInt CAlfControlGroup::ResourceId() const + { + return iData->iResourceId; + } + +// --------------------------------------------------------------------------- +// Appends a control +// --------------------------------------------------------------------------- +// +EXPORT_C void CAlfControlGroup::AppendL(CAlfControl* aControl) + { + TInt err = KErrNone; + + User::LeaveIfError( iData->iControls.Append(aControl) ); + + // Update server side: + err = iData->iControlGroupSubSession.Append( aControl->Identifier() ); + if ( err != KErrNone ) + { + iData->iControls.Remove( iData->iControls.Count()-1 ); + User::LeaveIfError( err ); + } + + // Show the appended control if the control group was shown. + if ( iData->iBoundDisplay ) + { + TRAP( err, aControl->ShowL( *iData->iBoundDisplay )); + } + + // If a leave occurred remove the control from client and server side control group. + if ( err != KErrNone ) + { + iData->iControlGroupSubSession.Remove( aControl->Identifier() ); + iData->iControls.Remove( iData->iControls.Count()-1 ); + User::LeaveIfError( err ); + } + + // Everything OK. + aControl->SetControlGroup(*this); + } + +// --------------------------------------------------------------------------- +// Removes a control +// --------------------------------------------------------------------------- +// +EXPORT_C TInt CAlfControlGroup::Remove(CAlfControl* aControl) + { + // Update server side: + TInt err = iData->iControlGroupSubSession.Remove( aControl->Identifier() ); + + // Update own array if server side is OK. + if ( err == KErrNone ) + { + // If found on the server side, we must find it also from the client side. + TInt index = iData->iControls.Find(aControl); + __ASSERT_DEBUG( index != KErrNotFound, USER_INVARIANT() ); + if(index != KErrNotFound) + { + iData->iControls.Remove(index); + } + else + { + err = KErrNotFound; + } + } + else + { + // If we cannot find it from the server side, we must not find it on the client side. + __ASSERT_DEBUG( iData->iControls.Find(aControl) == KErrNotFound , USER_INVARIANT() ); + } + + if ( err == KErrNone ) + { + CAlfControlGroup* dummy = NULL; + aControl->SetControlGroup(*dummy); + + // Hide the control, if this control group has been visible + if( iData->iBoundDisplay ) + { + aControl->Hide( *iData->iBoundDisplay ); + } + } + + return err; + } + +// --------------------------------------------------------------------------- +// Accepts input? +// --------------------------------------------------------------------------- +// +EXPORT_C TBool CAlfControlGroup::AcceptInput() const + { + return iData->iFlags&EAlfControlGroupAllowInput; + } + +// --------------------------------------------------------------------------- +// Set accepts input +// --------------------------------------------------------------------------- +// +EXPORT_C void CAlfControlGroup::SetAcceptInput(TBool aAcceptInput) + { + if ( aAcceptInput ) + { + iData->iFlags|=EAlfControlGroupAllowInput; + } + else + { + iData->iFlags&=~EAlfControlGroupAllowInput; + } + } + +// --------------------------------------------------------------------------- +// Finds control by ID +// --------------------------------------------------------------------------- +// +EXPORT_C CAlfControl* CAlfControlGroup::FindControl(TInt aId, TBool aUserId) const + { + for(TInt i = 0; i < iData->iControls.Count(); ++i) + { + if( (aUserId? + iData->iControls[i]->Id(): + iData->iControls[i]->Identifier()) + == aId) + { + return iData->iControls[i]; + } + } + return NULL; + } + +// --------------------------------------------------------------------------- +// Returns control count. +// --------------------------------------------------------------------------- +// +EXPORT_C TInt CAlfControlGroup::Count() const + { + return iData->iControls.Count(); + } + +// --------------------------------------------------------------------------- +// Returns indexed control +// --------------------------------------------------------------------------- +// +EXPORT_C CAlfControl& CAlfControlGroup::Control(TInt aIndex) const + { + return *iData->iControls[aIndex]; + } + +// --------------------------------------------------------------------------- +// Enables transformation. +// --------------------------------------------------------------------------- +// +EXPORT_C void CAlfControlGroup::EnableTransformationL(TBool aIsTransformed) + { + if ( aIsTransformed && iData->iTransform ) + { + // Already enabled + return; + } + + if ( !aIsTransformed && !iData->iTransform ) + { + // Already disabled + return; + } + + if ( aIsTransformed ) + { + iData->iTransform = CAlfTransformation::NewL(*iData->iEnv); + } + + // use the server handle from the transformation object if present + TInt transformationHandle = + iData->iTransform ? + iData->iTransform->ServerHandle() : + 0 ; + + // send the message to the server + TInt err = iData->iControlGroupSubSession.EnableTransformation( + transformationHandle, + aIsTransformed ); + + if ( err == KErrNone && !aIsTransformed ) + { + delete iData->iTransform; + iData->iTransform = NULL; + } + + if ( err != KErrNone ) + { + delete iData->iTransform; + iData->iTransform = NULL; + User::Leave( err ); + } + } + + +// --------------------------------------------------------------------------- +// Returns is transformation enabled +// --------------------------------------------------------------------------- +// +EXPORT_C TBool CAlfControlGroup::IsTransformed() const + { + return iData->iTransform != 0; + } + +// --------------------------------------------------------------------------- +// Returns transformation +// --------------------------------------------------------------------------- +// +EXPORT_C CAlfTransformation& CAlfControlGroup::Transformation() + { + __ASSERT_ALWAYS( iData->iTransform, USER_INVARIANT() ); + return *iData->iTransform; + } +