diff -r 41a7f70b3818 -r 5266b1f337bd phoneuis/BubbleManager/Src/BMCustomManager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phoneuis/BubbleManager/Src/BMCustomManager.cpp Wed Sep 01 12:30:10 2010 +0100 @@ -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::Compare) ); + } + } + +// --------------------------------------------------------------------------- +// RemoveCustomElement +// --------------------------------------------------------------------------- +// +void CBubbleCustomManager::RemoveCustomElement( + const CBubbleManager::TBubbleId& aBubbleId, + CTelBubbleCustomElement* aElement ) + { + RArray& 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; + } +