diff -r 6a20128ce557 -r ebfee66fde93 messagingapp/msgutils/unidatautils/unidatamodel/src/UniSmilSlide.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingapp/msgutils/unidatautils/unidatamodel/src/UniSmilSlide.cpp Fri Jun 04 10:25:39 2010 +0100 @@ -0,0 +1,319 @@ +/* +* 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 MMS SMIL Slide methods. +* +* +*/ + + +// ========== INCLUDE FILES ================================ + +#include +#include +#include +#include + +#include +#include + +#include "UniModelConst.h" +#include "UniObject.h" +#include "UniSmilSlide.h" + +// ========== LOCAL CONSTANTS AND MACROS =================== + +const TUint KMaxObjectPerSlide( 3 ); + +// ========== MEMBER FUNCTIONS ============================= + +CUniSmilSlide* CUniSmilSlide::NewLC( TUniLayout aLayout ) + { + CUniSmilSlide* self = new ( ELeave ) CUniSmilSlide( aLayout ); + + CleanupStack::PushL( self ); + self->ConstructL(); + + return self; + } + +// --------------------------------------------------------- +// CUniSmilSlide::NewL +// +// Factory method. +// --------------------------------------------------------- +// +CUniSmilSlide* CUniSmilSlide::NewL( TUniLayout aLayout ) + { + CUniSmilSlide* self = NewLC( aLayout ); + CleanupStack::Pop( self ); + return self; + } + + +// --------------------------------------------------------- +// CUniSmilSlide::CUniSmilSlide +// +// Constructor. +// --------------------------------------------------------- +// +CUniSmilSlide::CUniSmilSlide( TUniLayout aLayout ) : + iLayout( aLayout ) + { + } + +// --------------------------------------------------------- +// CUniSmilSlide::CUniSmilSlide +// +// Destructor. +// --------------------------------------------------------- +// + CUniSmilSlide::~CUniSmilSlide() + { + //Objects not owned by slide!! + //->ResetAndDestroy() not called. + delete iObjectArray; + } + + +// --------------------------------------------------------- +// CUniSmilSlide::AddObjectL +// +// Object should be valid for addition at this point ie +// should be checked that it can be added to slide. +// Takes ownership of the aObject. +// --------------------------------------------------------- +// +void CUniSmilSlide::AddObjectL( CUniObject* aObject ) + { + TUniRegion region = EUniRegionUnresolved; + switch ( aObject->MediaType() ) + { + case EMsgMediaText: + case EMsgMediaXhtml: + { + region = EUniRegionText; + } + break; + case EMsgMediaAudio: + { + region = EUniRegionAudio; + } + break; +#ifdef RD_SVGT_IN_MESSAGING + case EMsgMediaSvg: +#endif + case EMsgMediaImage: + case EMsgMediaVideo: + { + region = EUniRegionImage; + } + break; + default: + { + User::Leave( KErrNotSupported ); + } + } + AddObjectL( aObject, region ); + } + + +// --------------------------------------------------------- +// CUniSmilSlide::AddObjectL +// +// Object should be valid for addition at this point ie +// should be checked that it can be added to slide. +// Takes ownership of the aObject. +// --------------------------------------------------------- +// +void CUniSmilSlide::AddObjectL( CUniObject* aObject, TUniRegion aRegion ) + { + for ( TInt i = 0; i < iObjectArray->Count(); ++i) + { + if ( iObjectArray->At( i )->Region() == aRegion ) + { + User::Leave( KErrAlreadyExists ); + } + } + aObject->SetReferenceCount( aObject->ReferenceCount() + 1 ); + aObject->SetRegion( aRegion ); + if ( aRegion == EUniRegionAudio ) + { + //always put audio region last... + iObjectArray->AppendL( aObject ); + } + else + { + //...and other regions first... + iObjectArray->InsertL( 0, aObject ); + //...and update layout when needed + UpdateLayoutL(); // does not leave, really. + } + } + + +// --------------------------------------------------------- +// CUniSmilSlide::RemoveObject +// +// +// --------------------------------------------------------- +// +void CUniSmilSlide::RemoveObject( CUniObject* aObject ) + { + TInt index( -1 ); // Initialize to impossible index. + + for ( TInt i = 0; i < iObjectArray->Count(); ++i ) + { + if ( iObjectArray->At( i ) == aObject ) + { + index = i; + } + } + if ( index != -1 ) + { + // Found + iObjectArray->Delete( index ); + aObject->SetReferenceCount( aObject->ReferenceCount() - 1 ); + } + } + +// --------------------------------------------------------- +// CUniSmilSlide::GetObject +// +// Accessor. +// --------------------------------------------------------- +// +CUniObject* CUniSmilSlide::GetObject( TUniRegion aRegion ) const + { + TInt cnt = iObjectArray->Count(); + + for ( TInt i = 0; i < cnt; ++i ) + { + if ( iObjectArray->At( i )->Region() == aRegion ) + { + return iObjectArray->At( i ); + } + } + return NULL; + } + +// --------------------------------------------------------- +// CUniSmilSlide::GetObject +// +// Accessor. +// --------------------------------------------------------- +// +CUniObject* CUniSmilSlide::GetObjectByIndex( TInt aObjNum ) const + { + if ( aObjNum >= 0 && + aObjNum < iObjectArray->Count() ) + { + return iObjectArray->At( aObjNum ); + } + return NULL; + } + +// --------------------------------------------------------- +// CUniSmilSlide::IsObject +// +// +// --------------------------------------------------------- +// +TBool CUniSmilSlide::IsObject( CUniObject* aObject ) const + { + TInt cnt = iObjectArray->Count(); + + for ( TInt i = 0; i < cnt; ++i ) + { + if ( iObjectArray->At( i ) == aObject ) + { + return ETrue; + } + } + return EFalse; + } + +// --------------------------------------------------------- +// CUniSmilSlide::ObjectCount +// +// Accessor +// --------------------------------------------------------- +// +TInt CUniSmilSlide::ObjectCount() const + { + return iObjectArray->Count(); + } + + +// --------------------------------------------------------- +// CUniSmilSlide::UpdateLayoutL +// +// +// --------------------------------------------------------- +// +void CUniSmilSlide::UpdateLayoutL( TUniLayout aNewLayout ) + { + // Only need to do something if slide has text & image. + // If only other or neither -> do nothing. + iLayout = aNewLayout; + UpdateLayoutL(); + } + +// --------------------------------------------------------- +// CUniSmilSlide::UpdateLayoutL +// +// +// --------------------------------------------------------- +// +void CUniSmilSlide::UpdateLayoutL() + { + if ( iLayout == EUniImageFirst || + iLayout == EUniTextFirst ) + { + CUniObject* image = GetObject( EUniRegionImage ); + CUniObject* text = GetObject( EUniRegionText ); + if ( image && text ) + { + TInt imageRef = image->ReferenceCount(); + TInt textRef = text->ReferenceCount(); + RemoveObject( image ); + RemoveObject( text ); + if ( iLayout == EUniImageFirst ) + { + iObjectArray->InsertL( 0, text ); + iObjectArray->InsertL( 0, image ); + } + else + { + iObjectArray->InsertL( 0, image ); + iObjectArray->InsertL( 0, text ); + } + image->SetReferenceCount( imageRef ); + text->SetReferenceCount( textRef ); + } + } + } + +// --------------------------------------------------------- +// CUniSmilSlide::ConstructL +// +// 2nd phase Constructor. +// --------------------------------------------------------- +// +void CUniSmilSlide::ConstructL() + { + iObjectArray = new ( ELeave ) CSmilObjectArray( KMaxObjectPerSlide ); + } + +// End of file