phoneuis/BubbleManager/Src/BMMainPaneControl.cpp
branchRCL_3
changeset 62 5266b1f337bd
child 81 c26cc2a7c548
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phoneuis/BubbleManager/Src/BMMainPaneControl.cpp	Wed Sep 01 12:30:10 2010 +0100
@@ -0,0 +1,445 @@
+/*
+* 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:  Call status indicator
+*
+*/
+
+
+#include "BMBubbleManager.h"
+#include "BMMainPaneControl.h"
+#include "BMCustomManager.h"
+#include "BMBubbleHeader.h"
+#include "BMUtils.h"
+#include "BMCallObjectManager.h"
+#include "BMBubbleImageManager.h"
+
+#include <telbubblecallimage.h>
+#include <AknIconUtils.h>
+#include <layoutmetadata.cdl.h>
+
+#define SCALE_FACTOR 1.5
+
+// ---------------------------------------------------------------------------
+// C++ constructor
+// ---------------------------------------------------------------------------
+//
+CBubbleMainPaneControl::CBubbleMainPaneControl( 
+    CBubbleManager& aBubbleManager,  
+    CBubbleCallObjectManager& aCallObjectManager ) : 
+    iBubbleManager( aBubbleManager ), 
+    iCallObjectManager ( aCallObjectManager ),
+    iScaler( NULL ),
+    iScaledImage( NULL )
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// ConstructL
+// ---------------------------------------------------------------------------
+//
+void CBubbleMainPaneControl::ConstructL()
+    {
+    iScaler = CTelBubbleImageScaler::NewL( *this );
+    }
+
+// ---------------------------------------------------------------------------
+// NewL
+// ---------------------------------------------------------------------------
+//
+CBubbleMainPaneControl* CBubbleMainPaneControl::NewL(
+    CBubbleManager& aBubbleManager,
+    CBubbleCallObjectManager& aCallObjectManager )
+    {
+    CBubbleMainPaneControl* self = 
+        new( ELeave ) CBubbleMainPaneControl( aBubbleManager, 
+                                               aCallObjectManager );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CBubbleMainPaneControl::~CBubbleMainPaneControl()
+    {
+    delete iScaler;
+    iScaler = NULL;
+    
+    delete iScaledImage;
+    iScaledImage = NULL;	
+    }
+
+// ---------------------------------------------------------------------------
+// ReadBubbleHeader
+// ---------------------------------------------------------------------------
+//
+void CBubbleMainPaneControl::ReadBubbleHeader( 
+    const CBubbleHeader& aHeader )
+    {
+    iBubble = aHeader.BubbleId();
+    TBool thumbnail( EFalse );
+    TBool noScaling( EFalse );
+    
+    if ( aHeader.CallObjectImage() )
+        {
+        iBitmap = aHeader.CallObjectImage();
+        iMask = aHeader.CallObjectImageMask();
+        }
+    else if ( aHeader.TnBitmap() )
+        {
+        iBitmap = aHeader.TnBitmap();
+        iMask = aHeader.TnBitmapMask();
+        thumbnail = ETrue;
+        }
+    else
+        {
+        iBitmap = NULL;
+        }
+    
+    iThreeLinedBubble = ( aHeader.CNAP().Length() > 0 );
+    
+    // PrepareBitmapsL() needs to know if a brand new thumbnail is about to get prepared.
+    if ( thumbnail && (iOldBitmap != NULL) && (iOldBitmap == iBitmap) && (iScaler->GetState() != CTelBubbleImageScaler::EScalingStarted) )
+        {
+        noScaling = ETrue;
+        }
+    
+    if ( iBitmap )
+        {
+        iOldBitmap = iBitmap;
+        
+        CFbsBitmap* bitmap( NULL );
+        CFbsBitmap* mask( NULL );
+        TBool bitmapOwnership( EFalse );
+        TBool maskOwnership( EFalse );
+        
+        TRAPD(err, PrepareBitmapsL( bitmap, 
+                                    bitmapOwnership, 
+                                    mask, 
+                                    maskOwnership,
+                                    aHeader.CallObjectImageType() == 
+                                    CBubbleHeader::EThemeImage,
+                                    noScaling ));
+        
+        if ( err )
+            {
+            return;
+            }
+
+        iCallImage = iBubbleManager.CustomManager().ReserveCustomElement(
+                aHeader, CTelBubbleCustomElement::ECallImage );
+        SizeChanged();
+        
+        if ( iCallImage->ControlType() == 
+             CTelBubbleCustomElement::EBubbleCallImage )
+            {
+            CTelBubbleCallImage* image = 
+                static_cast<CTelBubbleCallImage*> ( iCallImage->Control() );
+            image->SetImage( bitmap, EFalse, mask, maskOwnership );
+            } 
+        
+        iIsUsed = ETrue;
+        MakeVisible( ETrue );
+        
+        // upscale thumbnails if loading it for the first time.
+        if ( thumbnail && !noScaling && ( iScaler->GetState() != CTelBubbleImageScaler::EScalingStarted ) )
+            {
+            StartScaling( iBitmap );
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// PrepareBitmapsL
+// ---------------------------------------------------------------------------
+//
+void CBubbleMainPaneControl::PrepareBitmapsL( 
+    CFbsBitmap*& aBitmap,
+    TBool& aBitmapOwnership, 
+    CFbsBitmap*& aMask,
+    TBool& aMaskOwnership,
+    TBool aIsScalable,
+    TBool aThumbnail )
+    {
+    if ( aThumbnail )
+        {
+        aBitmap = iScaledImage;
+        }
+    else
+        {
+        aBitmap = iBitmap;
+        }
+
+    aMask = iMask;
+    aBitmapOwnership = EFalse;
+    aMaskOwnership = EFalse;
+    
+    if ( aIsScalable )
+        {
+        // Switch to preloaded image when available
+        if ( iCallObjectManager.CallThemeImageIcon() )
+            {
+            aBitmap = iCallObjectManager.CallThemeImageIcon()->Bitmap();
+            aMask = iCallObjectManager.CallThemeImageIcon()->Mask();
+            }
+    
+        // Secure that SVG image is initialized
+        User::LeaveIfError( AknIconUtils::SetSize( aBitmap,
+             iBubbleManager.MainPaneImageRect().Size(),
+             EAspectRatioPreservedSlice ) != KErrNone );
+        }
+    
+    TSize imageSize = aBitmap->SizeInPixels();
+    TSize tinyImageSize( iBubbleManager.MainPaneImageRect( ETrue ).Size() );
+    TBool fullScreen = !( ( imageSize.iWidth <= tinyImageSize.iWidth ) &&
+                          ( imageSize.iHeight <= tinyImageSize.iHeight ) );  
+    
+    if ( iBubbleManager.IsTouchCallHandling() &&
+         fullScreen )
+        {
+        // Attach display mask to image.
+        CEikImage* displayMask = new( ELeave ) CEikImage;
+        CleanupStack::PushL( displayMask ); 
+    
+        TBMIcons maskId = 
+            Layout_Meta_Data::IsLandscapeOrientation() ?
+            EQgn_indi_call4_image_mask_lsc :
+            EQgn_indi_call4_image_mask_prt;
+    
+        iBubbleManager.ImageManager().SetBitmapToImage( 
+            displayMask,
+            maskId );
+    
+        User::LeaveIfError( AknIconUtils::SetSize( 
+            const_cast<CFbsBitmap*> (displayMask->Bitmap()),
+            imageSize,
+            EAspectRatioNotPreserved ) );
+            
+        if ( aMask )
+            {
+            // Combine display mask and image mask.
+            CFbsBitmap* combinedMask = 
+                BubbleUtils::CreateCombinedMaskL(
+                    displayMask->Bitmap(),
+                    aMask );        
+            aMask = combinedMask;
+            }
+        else
+            {
+            aMask = 
+                const_cast<CFbsBitmap*> ( displayMask->Bitmap());
+            displayMask->SetPictureOwnedExternally( ETrue );
+            }                        
+            
+        aMaskOwnership = ETrue;    
+        CleanupStack::PopAndDestroy( displayMask );
+        }    
+    }
+
+// ---------------------------------------------------------------------------
+// Reset
+// ---------------------------------------------------------------------------
+//
+void CBubbleMainPaneControl::Reset()
+    {
+    if ( iIsUsed )
+        {
+        iIsUsed = EFalse;
+        MakeVisible( EFalse );
+        iBubble = KErrNotFound;
+        
+        if ( iCallImage && 
+             iCallImage->ControlType() == 
+             CTelBubbleCustomElement::EBubbleCallImage )
+            {
+            CTelBubbleCallImage* image = 
+                static_cast<CTelBubbleCallImage*> ( iCallImage->Control() );
+            image->SetImage( NULL, EFalse, NULL, EFalse );
+            }
+        
+        iBubbleManager.CustomManager().ReleaseCustomElement( iCallImage );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// DrawBitmaps
+// ---------------------------------------------------------------------------
+//
+void CBubbleMainPaneControl::DrawBitmaps( const TRect& aRect ) const
+    {
+    if ( iCallImage )
+        {
+        // ToDo: propagate to components
+        iCallImage->Control()->DrawForeground( aRect );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// BubbleId
+// ---------------------------------------------------------------------------
+//
+CBubbleManager::TBubbleId CBubbleMainPaneControl::BubbleId() const
+    {
+    return iBubble;
+    }
+
+// ---------------------------------------------------------------------------
+// IsUsed
+// ---------------------------------------------------------------------------
+//
+TBool CBubbleMainPaneControl::IsUsed() const
+    {
+    return iIsUsed;
+    }
+
+// ---------------------------------------------------------------------------
+// SizeChanged
+// ---------------------------------------------------------------------------
+//
+void CBubbleMainPaneControl::SizeChanged()
+    {
+    if ( iCallImage )
+        {
+        iCallImage->Control()->SetRect( Rect() );
+        if ( iCallImage->ControlType() == 
+             CTelBubbleCustomElement::EBubbleCallImage )
+            {
+            CTelBubbleCallImage* image = 
+                static_cast<CTelBubbleCallImage*> ( iCallImage->Control() );
+            TRect imageArea( iBubbleManager.MainPaneImageRect( 
+                                 ETrue, iThreeLinedBubble ) );
+            
+            image->SetImagePlacingArea( imageArea );
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CTelBubbleCallImage::ImageScalingComplete
+//
+// ---------------------------------------------------------------------------
+//
+void CBubbleMainPaneControl::ImageScalingComplete( TInt aError,
+        CFbsBitmap* aBitmap )
+    {
+    if ( aError == KErrNone )
+        {
+        // Draw the scaled image
+        iScaledImage = aBitmap;
+        iScaler->SetState( CTelBubbleImageScaler::EScalingDone );
+        
+        CFbsBitmap* bitmap( NULL );
+        CFbsBitmap* mask( NULL );
+        TBool bitmapOwnership( EFalse );
+        TBool maskOwnership( EFalse );
+      
+        TRAPD(err, PrepareBitmapsL( bitmap, 
+                                    bitmapOwnership, 
+                                    mask, 
+                                    maskOwnership,
+                                    EFalse,
+                                    ETrue ) );
+        
+        if ( err )
+            {
+            return;
+            }
+                
+        if ( iCallImage->ControlType() == 
+             CTelBubbleCustomElement::EBubbleCallImage )
+            {
+            CTelBubbleCallImage* image = 
+                static_cast<CTelBubbleCallImage*> ( iCallImage->Control() );
+            image->SetImage( bitmap, EFalse, mask, maskOwnership );
+            } 
+
+        SizeChanged();
+        
+        iIsUsed = ETrue;
+        MakeVisible( ETrue );
+        
+        Parent()->DrawNow(); // refreshing view with scaled image
+        }
+    else if ( aError == KErrCancel )
+        {
+        // error is ignored
+        // This error is returned when a previous scaling is cancelled
+        // while new scaling request is given to active object
+        }
+    else
+        {
+        // draw the unscaled image in error cases
+    
+        delete iScaledImage;
+        iScaledImage = NULL;
+        }
+    
+    iScaler->SetState( CTelBubbleImageScaler::EScalingDone );
+    }
+
+// ---------------------------------------------------------------------------
+// CTelBubbleCallImage::StartScaling
+//
+// ---------------------------------------------------------------------------
+//
+void CBubbleMainPaneControl::StartScaling( CFbsBitmap *aSourceBitmap )
+    {
+    if ( !iScaler )
+        {
+        return;
+        }
+    
+    iScaler->Cancel(); // cancels any outstanding scaling requests
+    
+    delete iScaledImage;
+    iScaledImage = NULL;
+
+    // create a bitmap for scaled size
+    TRAPD( err, iScaledImage = new (ELeave) CFbsBitmap );
+    if ( err != KErrNone )
+        {
+        // no scaling in error cases
+        iScaler->SetState( CTelBubbleImageScaler::EScalingIdle );
+        return;
+        }
+
+    TSize size = aSourceBitmap->SizeInPixels();
+    TRect scaledRect( 0, 0, size.iWidth * SCALE_FACTOR, size.iHeight * SCALE_FACTOR );
+    
+    TRAP( err, iScaledImage->Create( scaledRect.Size(), aSourceBitmap->DisplayMode() ) );
+    if ( err != KErrNone )
+        {
+        delete iScaledImage;
+        iScaledImage = NULL;
+        iScaler->SetState( CTelBubbleImageScaler::EScalingIdle );
+        }
+    else
+        {
+        //start scaling
+        TRAPD( err, iScaler->StartScaleL( aSourceBitmap, iScaledImage ) );
+        if (err != KErrNone)
+            {
+            iScaler->SetState( CTelBubbleImageScaler::EScalingIdle );
+            delete iScaledImage;
+            iScaledImage = NULL;
+            }
+        }
+    }
+	
+// END OF FILE
+