diff -r 41a7f70b3818 -r 5266b1f337bd phoneuis/BubbleManager/Src/BMDefaultManager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phoneuis/BubbleManager/Src/BMDefaultManager.cpp Wed Sep 01 12:30:10 2010 +0100 @@ -0,0 +1,415 @@ +/* +* 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 "BMDefaultManager.h" +#include "BMBubbleImageManager.h" +#include "BMBubbleHeader.h" +#include "BMCallStatusIndiBig.h" +#include "BMCallStatusIndiSmall.h" +#include "BMCallStatusAnimBig.h" +#include "BMCallStatusAnimSmall.h" +#include "BMNumberTypeIcon.h" +#include "BMPanic.h" +#include + +// max amounts per type +const TInt KBubbleMaxCallStatusIndiBig = 2; +const TInt KBubbleMaxCallStatusIndiSmall = 7; +const TInt KBubbleMaxCallStatusAnimBig = 2; +const TInt KBubbleMaxCallStatusAnimSmall = 1; +const TInt KBubbleMaxNumberTypeIcon = 2; +const TInt KBubbleMaxCallerImageDrawer = 1; + +// --------------------------------------------------------------------------- +// C++ constructor +// --------------------------------------------------------------------------- +// +CBubbleDefaultManager::CBubbleDefaultManager( CBubbleManager& aBubbleManager ) + : iBubbleManager( aBubbleManager ) + { + } + + +// --------------------------------------------------------------------------- +// ConstructL +// --------------------------------------------------------------------------- +// +void CBubbleDefaultManager::ConstructL() + { + iMaxAmounts.Append( KBubbleMaxCallStatusIndiBig ); + iMaxAmounts.Append( KBubbleMaxCallStatusIndiSmall ); + iMaxAmounts.Append( KBubbleMaxCallStatusAnimBig ); + iMaxAmounts.Append( KBubbleMaxCallStatusAnimSmall ); + iMaxAmounts.Append( KBubbleMaxNumberTypeIcon ); + iMaxAmounts.Append( KBubbleMaxCallerImageDrawer ); + + const TInt kDifferentElements = iMaxAmounts.Count(); + + for ( TInt i = 0 ; i < kDifferentElements ; i++ ) + { + iAvailabilities.Append( 0 ); + } + + // Create main array + iElements = new( ELeave ) + CArrayPtrFlat( kDifferentElements ); + iElements->SetReserveL( kDifferentElements ); + + // Create arrays inside the main array and add them to the main array + TInt resource = 0; + for ( resource = 0 ; resource < kDifferentElements ; resource++ ) + { + CSingleElement* single = new( ELeave ) + CSingleElement( iMaxAmounts[resource] ); + CleanupStack::PushL( single ); + single->SetReserveL( iMaxAmounts[resource] ); + iElements->AppendL( single ); + CleanupStack::Pop( single ); + } + + // Create implementations to individual arrays: + for ( resource = 0 ; resource < kDifferentElements ; resource++ ) + { + TInt maxCellAmount = iMaxAmounts[resource]; + CSingleElement* single = iElements->At( resource ); + switch( resource ) + { + case EBMDefaultCallStatusIndiBig: + { + for ( TInt i = 0 ; i < maxCellAmount ; i++ ) + { + CBubbleCallStatusIndiBig* indiControl = + CBubbleCallStatusIndiBig::NewL( + iBubbleManager.ImageManager() ); + CleanupStack::PushL( indiControl ); + indiControl->SetContainerWindowL( iBubbleManager ); + indiControl->SetParent( &iBubbleManager ); + CTelBubbleCustomElement* indiElem = + CTelBubbleCustomElement::NewL( indiControl, + CTelBubbleCustomElement::EBigCallIndicator ); + CleanupStack::PushL( indiElem ); + single->AppendL( indiElem ); + CleanupStack::Pop(2,indiControl); + } + break; + } + + case EBMDefaultCallStatusIndiSmall: + { + for ( TInt i = 0 ; i < maxCellAmount ; i++ ) + { + CBubbleCallStatusIndiSmall* indiControl = + CBubbleCallStatusIndiSmall::NewL( + iBubbleManager.ImageManager() ); + CleanupStack::PushL( indiControl ); + indiControl->SetContainerWindowL( iBubbleManager ); + indiControl->SetParent( &iBubbleManager ); + CTelBubbleCustomElement* indiElem = + CTelBubbleCustomElement::NewL( indiControl, + CTelBubbleCustomElement::ESmallCallIndicator ); + CleanupStack::PushL( indiElem ); + single->AppendL( indiElem ); + CleanupStack::Pop(2,indiControl); + } + break; + } + + case EBMDefaultCallStatusAnimBig: + { + for ( TInt i = 0 ; i < maxCellAmount ; i++ ) + { + CBubbleCallStatusAnimBig* animControl = + CBubbleCallStatusAnimBig::NewL( + iBubbleManager.ImageManager() ); + CleanupStack::PushL( animControl ); + animControl->SetContainerWindowL( iBubbleManager ); + animControl->SetParent( &iBubbleManager ); + CTelBubbleCustomElement* animElem = + CTelBubbleCustomElement::NewL( animControl, + CTelBubbleCustomElement::EBigCallIndicator ); + CleanupStack::PushL( animElem ); + single->AppendL( animElem ); + CleanupStack::Pop(2,animControl); + } + break; + } + + case EBMDefaultCallStatusAnimSmall: + { + for ( TInt i = 0 ; i < maxCellAmount ; i++ ) + { + CBubbleCallStatusAnimSmall* animControl = + CBubbleCallStatusAnimSmall::NewL( + iBubbleManager.ImageManager() ); + CleanupStack::PushL( animControl ); + animControl->SetContainerWindowL( iBubbleManager ); + animControl->SetParent( &iBubbleManager ); + CTelBubbleCustomElement* animElem = + CTelBubbleCustomElement::NewL( animControl, + CTelBubbleCustomElement::ESmallCallIndicator ); + CleanupStack::PushL( animElem ); + single->AppendL( animElem ); + CleanupStack::Pop(2,animControl); + } + break; + } + + case EBMDefaultNumberTypeIcon: + { + for ( TInt i = 0 ; i < maxCellAmount ; i++ ) + { + CBubbleNumberTypeIcon* numberTypeIcon = + CBubbleNumberTypeIcon::NewL( + iBubbleManager.ImageManager() ); + CleanupStack::PushL( numberTypeIcon ); + numberTypeIcon->SetContainerWindowL( iBubbleManager ); + numberTypeIcon->SetParent( &iBubbleManager ); + CTelBubbleCustomElement* numberTypeIconElem = + CTelBubbleCustomElement::NewL( numberTypeIcon, + CTelBubbleCustomElement::EBigCallIndicator ); + CleanupStack::PushL( numberTypeIconElem ); + single->AppendL( numberTypeIconElem ); + CleanupStack::Pop( 2, numberTypeIcon ); + } + break; + } + + case EBMDefaultCallImageControl: + { + for ( TInt i = 0 ; i < maxCellAmount ; i++ ) + { + CTelBubbleCallImage* image = + CTelBubbleCallImage::NewL(); + CleanupStack::PushL( image ); + image->SetContainerWindowL( iBubbleManager ); + image->SetParent( &iBubbleManager ); + CTelBubbleCustomElement* imageElem = + CTelBubbleCustomElement::NewL( image, + CTelBubbleCustomElement::ECallImage ); + CleanupStack::PushL( imageElem ); + single->AppendL( imageElem ); + CleanupStack::Pop(2,image); + } + break; + } + + default: + Panic( EBMPanicUnhandledSwitchCase ); + } + } + } + +// --------------------------------------------------------------------------- +// NewL +// --------------------------------------------------------------------------- +// +CBubbleDefaultManager* CBubbleDefaultManager::NewL( + CBubbleManager& aBubbleManager ) + { + CBubbleDefaultManager* self = + new( ELeave ) CBubbleDefaultManager( aBubbleManager ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CBubbleDefaultManager::~CBubbleDefaultManager() + { + if ( iElements ) + { + for ( TInt i = 0 ; i < iElements->Count() ; i++ ) + { + if ( iElements->At( i ) ) + { + iElements->At( i )->ResetAndDestroy(); + } + } + iElements->ResetAndDestroy(); + delete iElements; + } + + iAvailabilities.Close(); + iMaxAmounts.Close(); + } + +// --------------------------------------------------------------------------- +// ReserveCallIndicatorElement +// --------------------------------------------------------------------------- +// +CTelBubbleCustomElement* CBubbleDefaultManager::ReserveBigCallIndicatorElement( + const CBubbleHeader& aHeader ) + { + CTelBubbleCustomElement* element; + CBubbleManager::TPhoneCallState state = aHeader.CallState(); + + if ( state == CBubbleManager::EOutgoing || + state == CBubbleManager::EAlertToDisconnected ) + { + // Image + element = ReserveElement( EBMDefaultCallStatusIndiBig ); + CBubbleCallStatusIndi* indi = + static_cast ( element->Control() ); + indi->ReadBubbleHeader( aHeader ); + } + else + { + // Animation + element = ReserveElement( EBMDefaultCallStatusAnimBig ); + CBubbleCallStatusAnim* anim = + static_cast ( element->Control() ); + anim->ReadBubbleHeader( aHeader ); + } + + return element; + } + +// --------------------------------------------------------------------------- +// ReserveSmallCallIndicatorElement +// --------------------------------------------------------------------------- +// +CTelBubbleCustomElement* CBubbleDefaultManager::ReserveSmallCallIndicatorElement( + const CBubbleHeader& aHeader ) + { + CTelBubbleCustomElement* element; + CBubbleManager::TPhoneCallState state = aHeader.CallState(); + + if( state == CBubbleManager::EOutgoing || + state == CBubbleManager::EWaiting || + state == CBubbleManager::EAlerting ) + { + // Show animation + element = ReserveElement( EBMDefaultCallStatusAnimSmall ); + CBubbleCallStatusAnim* anim = + static_cast ( element->Control() ); + anim->ReadBubbleHeader( aHeader ); + } + else + { + // Show image + element = ReserveElement( EBMDefaultCallStatusIndiSmall ); + CBubbleCallStatusIndi* indi = + static_cast ( element->Control() ); + indi->ReadBubbleHeader( aHeader ); + } + + return element; + } + +// --------------------------------------------------------------------------- +// ReserveNumberTypeIconElement +// --------------------------------------------------------------------------- +// +CTelBubbleCustomElement* CBubbleDefaultManager::ReserveNumberTypeIconElement( + const CBubbleHeader& aHeader ) + { + CTelBubbleCustomElement* element = + ReserveElement( EBMDefaultNumberTypeIcon ); + + CBubbleNumberTypeIcon* icon = + static_cast ( element->Control() ); + + icon->ReadBubbleHeader( aHeader ); + + return element; + } + +// --------------------------------------------------------------------------- +// ReserveCallerImageElement +// --------------------------------------------------------------------------- +// +CTelBubbleCustomElement* CBubbleDefaultManager::ReserveCallImageElement( + const CBubbleHeader& /*aHeader*/ ) + { + return ReserveElement( EBMDefaultCallImageControl ); + } + +// --------------------------------------------------------------------------- +// ReserveElement +// --------------------------------------------------------------------------- +// +CTelBubbleCustomElement* CBubbleDefaultManager::ReserveElement( + TBubbleDefaultElements aType ) + { + CTelBubbleCustomElement* element = NULL; + TUint amount = iElements->At( aType )->Count(); + // 1 mean is reserved and 0 free slot + TUint& available = iAvailabilities[aType]; + TUint bit = 1; // start from first bit + for ( TUint slot = 0 ; slot < amount ; slot++ ) + { + // if flag is one the seat is taken... + if ( available&bit ) + { + bit = bit<<1; //move to next bit of for next round + continue; + } + + // so we found a free slot + element = iElements->At( aType )->At( slot ); + if ( element != NULL ) + { + available |= bit; // set the corrensponding bit + // for reserved indicator + } + break; + } + __ASSERT_DEBUG( element != NULL , + Panic( EBMPanicCustomization ) ); + return element; + } + +// --------------------------------------------------------------------------- +// ReleaseElement +// --------------------------------------------------------------------------- +// +void CBubbleDefaultManager::ReleaseElement( + CTelBubbleCustomElement*& aElement ) + { + if ( aElement == NULL ) + { + return; + } + + for ( TInt i = 0 ; i < iElements->Count() ; i++ ) + { + CSingleElement* single = iElements->At( i ); + TUint amount = single->Count(); + TUint& available = iAvailabilities[i]; // 1 mean is reserved + // and 0 free slot + TUint bit = 1; // start from first bit + for ( TUint slot = 0 ; slot < amount ; slot++ ) + { + if ( single->At( slot ) == aElement ) + { + __ASSERT_DEBUG( available&bit, + Panic( EBMPanicCustomization ) ); + available &= ~bit; // zero the corrensponding bit + // for freed indicator + aElement = NULL; + break; + } + bit = bit<<1; //move to next bit of for next round + } + } + } +