phoneuis/BubbleManager/Src/BMResourceManager.cpp
changeset 0 5f000ab63145
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phoneuis/BubbleManager/Src/BMResourceManager.cpp	Mon Jan 18 20:18:27 2010 +0200
@@ -0,0 +1,315 @@
+/*
+* Copyright (c) 2002 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:  Resource Manager
+*
+*/
+
+
+// INCLUDE FILES
+#include    "BMResourceManager.h"
+#include    "BMBubbleManager.h"
+#include    "BMUtils.h"
+#include    "BMPanic.h"
+#include    "BMBubbleImage.h"
+#include    <eikimage.h>            //CEikImage
+#include    <eiklabel.h>            //CEikLabel
+#include    <AknsUtils.h>
+
+// CONSTANTS
+const TInt KBubbleMaxEikImages = 17;
+const TInt KBubbleMaxEikLabels = 6;
+
+// ================= MEMBER FUNCTIONS * ======================================
+
+// C++ default constructor can NOT contain any code, that
+// might leave.
+//
+CBubbleResourceManager::CBubbleResourceManager( CBubbleManager& aParentWindow )
+: iParentWindow( aParentWindow )
+    {
+    }
+
+// Symbian OS default constructor can leave.
+void CBubbleResourceManager::ConstructL()
+    {
+    // Set max values to each resource
+    iMaxAmounts.Append( KBubbleMaxEikImages );
+    iMaxAmounts.Append( KBubbleMaxEikLabels );
+
+    const TInt kDifferentResources = iMaxAmounts.Count();
+
+    // Zero all availabilities
+    for ( TInt i = 0 ; i < kDifferentResources ; i++ )
+        {
+        iAvailabilities.Append( 0 );
+        }
+    
+
+    // Create main array
+    iResources = new( ELeave ) 
+                    CArrayPtrFlat<CSingleResource>( kDifferentResources );
+    iResources->SetReserveL( kDifferentResources );
+
+    // Create arrays inside the main array and add them to the main array
+    TInt resource = 0;
+    for ( resource = 0 ; resource < kDifferentResources ; resource++ )
+        {
+        CSingleResource* single = new( ELeave ) 
+                                    CSingleResource( iMaxAmounts[resource] );
+        CleanupStack::PushL( single );
+        single->SetReserveL( iMaxAmounts[resource] );
+        iResources->AppendL( single );
+        CleanupStack::Pop(); // single
+        }
+
+    //Create components to individual arrays:
+    for ( resource = 0 ; resource < kDifferentResources ; resource++ )
+        {
+        TInt maxCellAmount = iMaxAmounts[resource];
+        CSingleResource* single = iResources->At( resource );
+        switch( resource )
+            {
+            case EBMEikImage:
+                {
+                for ( TInt i = 0 ; i < maxCellAmount ; i++ )
+                    {
+                    CBubbleImage* newImage = new( ELeave ) CBubbleImage;
+                    CleanupStack::PushL( newImage );
+                    newImage->SetContainerWindowL( iParentWindow );
+                    newImage->SetParent( &iParentWindow );
+                    newImage->SetPictureOwnedExternally( ETrue );
+                    newImage->SetPicture( NULL );
+                    newImage->MakeVisible( EFalse );
+                    single->AppendL( newImage );
+                    CleanupStack::Pop(); //newImage
+                    }
+                break;
+                }
+            case EBMEikLabel:
+                {
+                for ( TInt i = 0 ; i < maxCellAmount ; i++ )
+                    {
+                    CEikLabel* newText = new( ELeave ) CEikLabel;
+                    CleanupStack::PushL( newText );
+                    newText->SetContainerWindowL( iParentWindow );
+                    newText->SetParent( &iParentWindow );
+                    newText->SetBufferReserveLengthL( KBubbleLabelMaxLength );
+                    newText->SetTextL( KNullDesC );
+                    single->AppendL( newText );
+                    CleanupStack::Pop(); //newText
+                    }
+                break;
+                }
+            default:
+                Panic( EBMPanicUnhandledSwitchCase );
+            }
+        }
+    }
+
+// Two-phased constructor.
+CBubbleResourceManager* CBubbleResourceManager::NewL( 
+    CBubbleManager& aParentWindow )
+    {
+    CBubbleResourceManager* self = 
+                        new (ELeave) CBubbleResourceManager( aParentWindow );
+    
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+
+    return self;
+    }
+
+    
+// Destructor
+CBubbleResourceManager::~CBubbleResourceManager()
+    {
+    if ( iResources )
+        {
+        // Destroy the inner arrays
+        for ( TInt i = 0 ; i < iResources->Count() ; i++ )
+            {
+            if ( iResources->At( i ) )
+                {
+                iResources->At( i )->ResetAndDestroy();
+                }
+            }
+        iResources->ResetAndDestroy();
+        delete iResources;
+        }
+
+    iAvailabilities.Close();
+    iMaxAmounts.Close();
+    }
+
+
+
+// ---------------------------------------------------------------------------
+// CBubbleResourceManager::ActivateL
+// Activates all the controls.
+// 
+// ---------------------------------------------------------------------------
+//
+void CBubbleResourceManager::ActivateL()
+    {
+    TInt resourcesTotal = iResources->Count();
+    for ( TInt oneResource = 0 ; oneResource < resourcesTotal ; oneResource++ )
+        {
+        CSingleResource* singleResource = iResources->At( oneResource );
+        TInt elementsTotal = singleResource->Count();
+        for ( TInt element = 0 ; element < elementsTotal ; element++)
+            {
+            singleResource->At( element )->ActivateL();
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CBubbleResourceManager::ReserveEikLabel
+// Gets free label and returns pointer to it.
+// 
+// ---------------------------------------------------------------------------
+//
+CEikLabel* CBubbleResourceManager::ReserveEikLabel()
+    {
+    CEikLabel* label = NULL;
+    ReserveResource( (CCoeControl*&)label , EBMEikLabel );
+    return label;
+    }
+
+// ---------------------------------------------------------------------------
+// CBubbleResourceManager::ReleaseEikLabel
+// Zeros the label and releases it.
+// 
+// ---------------------------------------------------------------------------
+//
+void CBubbleResourceManager::ReleaseEikLabel( CEikLabel*& aLabel )
+    {
+    if ( aLabel )
+        {
+        BubbleUtils::AddTextToEikLabel( aLabel , KNullDesC );
+        }
+    ReleaseResource( (CCoeControl*&)aLabel , EBMEikLabel );
+    }
+
+// ---------------------------------------------------------------------------
+// CBubbleResourceManager::ReserveEikImage
+// Gets new image object and sets it visible.
+// 
+// ---------------------------------------------------------------------------
+//
+CEikImage* CBubbleResourceManager::ReserveEikImage( 
+    TBool aIsBackgroundImage )
+    {
+    CBubbleImage* image = NULL;
+    ReserveResource( ( CCoeControl*& )image , EBMEikImage );
+    if ( image )
+        {
+        if( aIsBackgroundImage )
+            {
+            image->SetAsBackgroundImage( ETrue );
+            }
+        image->MakeVisible( ETrue );
+        }
+    return image;
+    }
+
+// ---------------------------------------------------------------------------
+// CBubbleResourceManager::ReleaseEikImage
+// NULLs the bitmaps, makes invisible and releases the image.
+// 
+// ---------------------------------------------------------------------------
+//
+void CBubbleResourceManager::ReleaseEikImage( CEikImage*& aImage )
+    {
+    if ( aImage )
+        {
+        aImage->SetPicture( NULL , NULL );
+        aImage->SetPictureOwnedExternally( ETrue );
+        aImage->MakeVisible( EFalse );
+        static_cast<CBubbleImage*>( aImage )->SetAsBackgroundImage( EFalse );
+        }
+    ReleaseResource( (CCoeControl*&)aImage , EBMEikImage );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CBubbleResourceManager::ReserveResource
+// Reserves some CCoeControl. Uses the second parameter for indexing
+// the main arrays.
+// ---------------------------------------------------------------------------
+//
+void CBubbleResourceManager::ReserveResource( CCoeControl*& aResource , 
+                                              TBubbleResource aType )
+    {
+    TUint amount = iResources->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
+        aResource = iResources->At( aType )->At( slot );
+        if ( aResource != NULL )
+            {
+            available |= bit; // set the corrensponding bit 
+                              // for reserved indicator
+            }
+        break;
+        }
+    __ASSERT_DEBUG( aResource != NULL , Panic( EBMPanicImages ) );
+    }
+
+// ---------------------------------------------------------------------------
+// CBubbleResourceManager::ReleaseResource
+// Releases CCoeControl object.
+// 
+// ---------------------------------------------------------------------------
+//
+void CBubbleResourceManager::ReleaseResource( CCoeControl*& aResource , 
+                                              TBubbleResource aType )
+    {
+    if ( aResource == NULL )
+        {
+        return;
+        }
+
+    CSingleResource* single = iResources->At( aType );
+    TUint amount = single->Count();
+    TUint& available = iAvailabilities[aType]; // 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 ) == aResource )
+            {
+            __ASSERT_DEBUG( available&bit , Panic( EBMPanicImages ) );
+            available &= ~bit; // zero the corrensponding bit 
+                               // for freed indicator
+            aResource = NULL;
+            break;
+            }
+        bit = bit<<1; //move to next bit of for next round
+        }
+    __ASSERT_DEBUG( aResource == NULL , Panic( EBMPanicImages ) );
+    }
+
+//  End of File