--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingapp/msgutils/unidatautils/unidatamodel/src/UniSmilSlide.cpp Mon May 03 12:29:07 2010 +0300
@@ -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 <e32def.h>
+#include <eikenv.h>
+#include <msvids.h>
+#include <msvstd.h>
+
+#include <MsgMedia.hrh>
+#include <MsgMediaInfo.h>
+
+#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