messagingapp/msgutils/unidatautils/unidatamodel/src/UniSmilSlide.cpp
changeset 25 84d9eb65b26f
--- /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