phoneuis/BubbleManager/Src/BMCustomManager.cpp
changeset 0 5f000ab63145
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phoneuis/BubbleManager/Src/BMCustomManager.cpp	Mon Jan 18 20:18:27 2010 +0200
@@ -0,0 +1,279 @@
+/*
+* Copyright (c) 2008 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:  Customization manager
+*
+*/
+
+#include "BMCustomManager.h"
+#include "BMDefaultManager.h"
+#include "BMBubbleHeader.h"
+#include "BMPanic.h"
+
+
+// ---------------------------------------------------------------------------
+// TArrayItem class
+// ---------------------------------------------------------------------------
+//
+class TArrayItem
+    {
+public:
+    TArrayItem( 
+        CTelBubbleCustomElement* aElement,
+        TInt aPriority ): 
+            iElement( *aElement ),
+            iPriority( aPriority ) {};
+        
+    static TInt Compare( const TArrayItem& aFirst, const TArrayItem& aSecond )
+        {
+        if( aFirst.iPriority > aSecond.iPriority )
+            {
+            return 1;
+            }
+        else if( aFirst.iPriority < aSecond.iPriority )
+            {
+            return -1;
+            }
+        else
+            {
+            return 0;
+            }
+        }
+
+    CTelBubbleCustomElement* Item() { return &iElement; }
+private:
+    CTelBubbleCustomElement& iElement;
+    TInt iPriority;
+    };
+
+// ---------------------------------------------------------------------------
+// C++ constructor
+// ---------------------------------------------------------------------------
+//
+CBubbleCustomManager::CBubbleCustomManager( CBubbleManager& aBubbleManager ) :
+    iBubbleManager( aBubbleManager )
+    {
+    }
+
+
+// ---------------------------------------------------------------------------
+// ConstructL
+// ---------------------------------------------------------------------------
+//
+void CBubbleCustomManager::ConstructL()
+    {
+    // create default implementations
+    iDefaultManager = CBubbleDefaultManager::NewL( iBubbleManager );
+    }
+
+// ---------------------------------------------------------------------------
+// NewL
+// ---------------------------------------------------------------------------
+//
+CBubbleCustomManager* CBubbleCustomManager::NewL(
+    CBubbleManager& aBubbleManager )
+    {
+    CBubbleCustomManager* self = 
+        new( ELeave ) CBubbleCustomManager( aBubbleManager );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CBubbleCustomManager::~CBubbleCustomManager()
+    {
+    for( TInt i = 0; i < iCustomizations.Count(); i++)
+        {
+        for( TInt j = 0; j < iCustomizations[j].Count(); j++ )
+            {
+            iCustomizations[i][j].Reset();
+            iCustomizations[i][j].Close();
+            }
+        }
+    
+    delete iDefaultManager;
+    }
+
+// ---------------------------------------------------------------------------
+// AddCustomElement
+// ---------------------------------------------------------------------------
+//
+void CBubbleCustomManager::AddCustomElement( 
+    const CBubbleManager::TBubbleId& aBubbleId,
+    CTelBubbleCustomElement* aElement,
+    TInt aPriority )
+    {
+    __ASSERT_DEBUG( aElement->Control(), Panic( EBMPanicCustomization ) ) ;
+    TRAPD( err, aElement->Control()->SetContainerWindowL( iBubbleManager ) );
+    
+    if ( !err )
+        {
+        TArrayItem item( aElement, aPriority );
+        iCustomizations[aBubbleId]
+                       [aElement->ElementType()].InsertInOrderAllowRepeats(
+            item, TLinearOrder<TArrayItem>(TArrayItem::Compare) );    
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// RemoveCustomElement
+// ---------------------------------------------------------------------------
+//
+void CBubbleCustomManager::RemoveCustomElement(
+    const CBubbleManager::TBubbleId& aBubbleId,
+    CTelBubbleCustomElement* aElement )
+    {
+    RArray<TArrayItem>& array = 
+        iCustomizations[aBubbleId][aElement->ElementType()];
+    
+    for( TInt j = 0; j < array.Count(); j++ )
+        {
+        if( array[j].Item() == aElement )
+            {
+            array.Remove(j);
+            return;
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// RemoveCustomElements
+// ---------------------------------------------------------------------------
+//
+void CBubbleCustomManager::RemoveCustomElements( 
+    const CBubbleManager::TBubbleId& aBubbleId )
+    {
+    for( TInt i = 0; i < iCustomizations[aBubbleId].Count(); i++ )
+        {
+        iCustomizations[aBubbleId][i].Reset();
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// ReserveCustomElement
+// ---------------------------------------------------------------------------
+//
+CTelBubbleCustomElement* CBubbleCustomManager::ReserveCustomElement( 
+    const CBubbleHeader& aBubbleHeader,
+    CTelBubbleCustomElement::TElementType aElement )
+    {
+    TBool isDefault;
+    return ReserveCustomElement( aBubbleHeader, aElement, isDefault );
+    }
+
+// ---------------------------------------------------------------------------
+// ReserveCustomElement
+// ---------------------------------------------------------------------------
+//
+CTelBubbleCustomElement* CBubbleCustomManager::ReserveCustomElement( 
+    const CBubbleHeader& aBubbleHeader,
+    CTelBubbleCustomElement::TElementType aElement,
+    TBool& aIsDefault )
+    {
+    const CBubbleManager::TBubbleId bubbleId = aBubbleHeader.BubbleId();
+    CTelBubbleCustomElement* customElement = NULL;
+    aIsDefault = EFalse;
+    
+    if( bubbleId != KBubbleConferenceId &&
+        iCustomizations[bubbleId][aElement].Count() )
+        {
+        // Get custom implmentation.
+        customElement = 
+            iCustomizations[aBubbleHeader.BubbleId()][aElement][0].Item();
+        customElement->Control()->MakeVisible( ETrue );
+        }
+    
+    if ( !customElement )
+        {
+        // Get default implementation, if exists.
+        customElement = DefaultElement( aBubbleHeader, aElement );
+        if ( customElement )
+            {
+            aIsDefault = ETrue;
+            }
+        }
+    
+    return customElement;
+    }
+
+// ---------------------------------------------------------------------------
+// ReleaseCustomElement
+// ---------------------------------------------------------------------------
+//
+void CBubbleCustomManager::ReleaseCustomElement( 
+    CTelBubbleCustomElement*& aCustomElement )
+    {
+    if ( aCustomElement )
+        {
+        aCustomElement->Control()->MakeVisible( EFalse );
+        iDefaultManager->ReleaseElement( aCustomElement );
+        aCustomElement = NULL;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// DefaultElement
+// ---------------------------------------------------------------------------
+//
+CTelBubbleCustomElement* CBubbleCustomManager::DefaultElement( 
+    const CBubbleHeader& aBubbleHeader,
+    CTelBubbleCustomElement::TElementType aElement )
+    {
+    CTelBubbleCustomElement* element = NULL;
+    
+    switch( aElement )
+        {
+        case CTelBubbleCustomElement::EBigCallIndicator:
+            {
+            element = iDefaultManager->ReserveBigCallIndicatorElement(
+                aBubbleHeader );
+            }
+            break;
+        case CTelBubbleCustomElement::ENumberTypeIcon:
+            {
+            element = iDefaultManager->ReserveNumberTypeIconElement(
+                aBubbleHeader );
+            }
+            break;
+        case CTelBubbleCustomElement::ESmallCallIndicator:
+            {
+            element = iDefaultManager->ReserveSmallCallIndicatorElement(
+                aBubbleHeader );
+            }
+            break;
+        case CTelBubbleCustomElement::ECallImage:
+            {
+            element = iDefaultManager->ReserveCallImageElement(
+                aBubbleHeader );
+            }
+            break;
+        default:
+            // NULL
+            break;
+        }
+    
+    if ( element )
+        {
+        // Make found element visible
+        element->Control()->MakeVisible( ETrue );
+        }
+    
+    return element;
+    }
+