messagingappbase/msgeditor/mediacontrolsrc/MsgSvgControl.cpp
changeset 0 72b543305e3a
child 18 a9c7e5670d17
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingappbase/msgeditor/mediacontrolsrc/MsgSvgControl.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,442 @@
+/*
+* Copyright (c) 2005-2006 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:  
+*       MsgEditor svgt UI control - a Message Editor Base control.
+*
+*/
+
+ 
+
+// INCLUDE FILES
+#include "MsgSvgControl.h"
+
+#include <AknDialog.h>
+#include <aknlayoutscalable_apps.cdl.h>
+
+#include <AknUtils.h>
+#include <msgsvgutils.h>
+#include <AknsDrawUtils.h>
+
+#include <gulicon.h>
+#include <MsgEditorCommon.h>
+
+#include "MsgFrameControl.h"
+#include "MsgIconControl.h"
+
+#include "MsgMediaControlLogging.h"
+
+// ==========================================================
+
+// EXTERNAL DATA STRUCTURES
+
+// EXTERNAL FUNCTION PROTOTYPES
+
+// CONSTANTS
+
+// MACROS
+
+// LOCAL CONSTANTS AND MACROS
+
+// MODULE DATA STRUCTURES
+
+// LOCAL FUNCTION PROTOTYPES
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ---------------------------------------------------------
+// CMsgSvgControl::CMsgSvgControl
+//
+// Constructor.
+// ---------------------------------------------------------
+//
+CMsgSvgControl::CMsgSvgControl( MMsgBaseControlObserver& aBaseControlObserver ) : 
+    CMsgMediaControl( aBaseControlObserver, EMsgComponentIdSvg, EMsgSvgControl )
+    {
+    }
+
+// ---------------------------------------------------------
+// CMsgSvgControl::ConstructL
+//
+// ---------------------------------------------------------
+//
+void CMsgSvgControl::ConstructL( CMsgEditorView& aParent, MMsgAsyncControlObserver* aObserver )
+    {
+    BaseConstructL( aParent, aObserver );    
+	
+	SetSize( CalculateControlSize( MsgEditorCommons::MsgDataPane().Size() ) );
+	
+	iSvgUtils = new( ELeave ) CMsgSvgUtils;
+    }
+
+// ---------------------------------------------------------
+// CMsgSvgControl::NewL
+//
+// Two-phased constructor.
+// ---------------------------------------------------------
+//
+#ifdef RD_SVGT_IN_MESSAGING
+EXPORT_C CMsgSvgControl* CMsgSvgControl::NewL( CMsgEditorView& aParent,
+                                                   MMsgAsyncControlObserver* aObserver )
+    {
+
+    CMsgSvgControl* self = new( ELeave ) CMsgSvgControl( aParent );
+    
+    CleanupStack::PushL( self );
+    self->ConstructL( aParent, aObserver );
+    CleanupStack::Pop( self );
+    
+    return self;
+    }
+#else
+EXPORT_C CMsgSvgControl* CMsgSvgControl::NewL( CMsgEditorView& /*aParent*/,
+                                               MMsgAsyncControlObserver* /*aObserver*/ )
+    {
+    User::Leave( KErrNotSupported );
+    return NULL; //getting rid of warning
+    }
+#endif        
+
+// ---------------------------------------------------------
+// CMsgSvgControl::~CMsgSvgControl
+//
+// Destructor
+// ---------------------------------------------------------
+//
+CMsgSvgControl::~CMsgSvgControl()
+    {
+    delete iSvgIndicator;
+    delete iSvgUtils;
+    
+    iFileHandle.Close();
+    }
+
+
+// ---------------------------------------------------------
+// CMsgSvgControl::LoadL
+//
+// ---------------------------------------------------------
+//
+void CMsgSvgControl::LoadL( RFile& aFileHandle )
+    {
+    iFileHandle.Close();
+    User::LeaveIfError( iFileHandle.Duplicate( aFileHandle ) );
+    
+    DoLoadL();    
+    }
+
+// ---------------------------------------------------------
+// CMsgSvgControl::DoLoadL
+//
+// ---------------------------------------------------------
+//
+void CMsgSvgControl::DoLoadL()
+    {        
+    TSize thumbnailSize( Size() );
+    thumbnailSize = TSize( Max( 0, thumbnailSize.iWidth - iFrame->FrameBorderSize().iWidth ),
+		                   Max( 0, thumbnailSize.iHeight - iFrame->FrameBorderSize().iHeight ) );
+		                   
+    // Use svgt thumbnail creation directly 
+    CFbsBitmap* thumbnailBitmap = new ( ELeave ) CFbsBitmap;
+    CleanupStack::PushL( thumbnailBitmap );
+    
+    User::LeaveIfError( thumbnailBitmap->Create( thumbnailSize,
+                                                 iCoeEnv->ScreenDevice()->DisplayMode() ) );
+                                                  
+    CFbsBitmap* thumbnailMask = new ( ELeave ) CFbsBitmap;
+    CleanupStack::PushL( thumbnailMask );
+    
+    User::LeaveIfError( thumbnailMask->Create( thumbnailSize,
+                                               EGray256 ) );
+	                                            
+    CGulIcon* thumbnailIcon = CGulIcon::NewL( thumbnailBitmap, thumbnailMask );
+    CleanupStack::Pop( 2, thumbnailBitmap );
+    
+    iIconControl->SetIcon( thumbnailIcon );
+    
+    // Incase this is not fulfilling the requirements, it might be an
+    // option to go and check for GenerateThumbnailL() in the msgcommonutils
+
+    iSvgUtils->GenerateThumbnailL( iFileHandle,
+                                   thumbnailIcon->Bitmap(),
+                                   thumbnailIcon->Mask(),
+                                   EFalse,
+                                   thumbnailSize );
+
+    // Resize bitmaps to actual content size.
+    thumbnailBitmap->Resize( thumbnailSize );
+    thumbnailMask->Resize( thumbnailSize );
+        
+    iIconControl->SetSize( thumbnailSize );
+    iIconControl->MakeVisible( ETrue );
+    
+    iFrame->SetImageSize( thumbnailSize );
+    
+    if ( iSvgIndicator )
+        {
+        iSvgIndicator->MakeVisible( ETrue );
+        }    
+    
+    SetState( EMsgAsyncControlStateReady );
+    }
+
+// ---------------------------------------------------------
+// CMsgSvgControl::Cancel
+// ---------------------------------------------------------
+//
+void CMsgSvgControl::Cancel()
+    {
+    }
+
+// ---------------------------------------------------------
+// CMsgSvgControl::LoadIndicatorIconL
+// ---------------------------------------------------------
+//
+EXPORT_C void CMsgSvgControl::LoadIndicatorIconL( const TAknsItemID& aId,
+                                                  const TDesC& aFileName,
+                                                  const TInt aFileBitmapId,
+                                                  const TInt aFileMaskId )
+    {
+    delete iSvgIndicator;
+    iSvgIndicator = NULL;
+    
+    iSvgIndicator = CMsgIconControl::NewL( *this );
+    iSvgIndicator->LoadIconL( aId,
+                              aFileName,
+                              aFileBitmapId,
+                              aFileMaskId );    
+
+    TAknLayoutRect indicatorRect;
+    indicatorRect.LayoutRect( MsgEditorCommons::MsgDataPane(), 
+                              AknLayoutScalable_Apps::msg_data_pane_g7().LayoutLine() );
+    
+    iSvgIndicator->SetBitmapSizeL( indicatorRect.Rect().Size() );
+    
+    if ( iIconControl &&
+         iIconControl->IsVisible() )
+        {
+        iSvgIndicator->MakeVisible( ETrue );
+        }
+    }
+
+// ---------------------------------------------------------
+// CMsgSvgControl::SetIconExtent
+//
+// Updates the icon position & size. Icon control is centered
+// to the control area.
+// ---------------------------------------------------------
+//
+void CMsgSvgControl::SetIconExtent()
+    {
+    if ( iSvgIndicator )
+        {
+        TSize size = iSvgIndicator->BitmapSize();
+        
+        TPoint position( iIconControl->Position() );
+        position.iY += iIconControl->Size().iHeight;
+        position.iY -= size.iHeight;
+    
+        iSvgIndicator->SetExtent( position, size );
+        }
+    }
+
+// ---------------------------------------------------------
+// CMsgSvgControl::SizeChanged
+// ---------------------------------------------------------
+//
+void CMsgSvgControl::SizeChanged()
+    {  
+    CMsgMediaControl::SizeChanged();
+    
+    SetIconExtent();       
+    }
+        
+// ---------------------------------------------------------
+// CMsgSvgControl::ComponentControl
+// ---------------------------------------------------------
+//
+CCoeControl* CMsgSvgControl::ComponentControl( TInt aIndex ) const
+    {
+    CCoeControl* result = NULL;
+    
+    switch ( aIndex )
+        {
+        case 0:
+            {
+            result = iFrame;
+            break;
+            }
+        case 1:
+            {
+            result = iIconControl;
+            break;
+            }   
+        case 2:
+            {
+            result = iSvgIndicator;
+            break;
+            }
+        default:
+            {
+            break;
+            }
+        }
+        
+    return result;            
+    }
+
+// ---------------------------------------------------------
+// CMsgSvgControl::CountComponentControls
+//
+// ---------------------------------------------------------
+//
+TInt CMsgSvgControl::CountComponentControls() const
+    {
+    TInt result( 2 );
+    if ( iSvgIndicator )
+        {
+        result++;
+        }
+        
+    return result;
+    }
+
+
+// ---------------------------------------------------------
+// CMsgSvgControl::Draw
+//
+// ---------------------------------------------------------
+//
+void CMsgSvgControl::Draw( const TRect& aRect ) const
+    {
+    if ( iSvgIndicator )
+        {
+        CWindowGc& gc = SystemGc();
+        
+        if ( !AknsDrawUtils::BackgroundBetweenRects( AknsUtils::SkinInstance(), 
+                                                     AknsDrawUtils::ControlContext( this ), 
+                                                     this, 
+                                                     gc, 
+                                                     aRect,
+                                                     iIconControl->Rect() ) )
+            {
+            gc.SetBrushColor( AKN_LAF_COLOR( 0 ) );
+            gc.SetBrushStyle( CGraphicsContext::ESolidBrush );
+            gc.SetPenStyle( CGraphicsContext::ENullPen );
+            gc.DrawRect( aRect );
+            }
+        
+        gc.SetBrushColor( KRgbWhite.Value() );
+        gc.SetPenStyle( CGraphicsContext::ENullPen );
+	    gc.SetBrushStyle( CGraphicsContext::ESolidBrush );
+	    gc.DrawRect( iIconControl->Rect() );
+        }
+    else
+        {
+        CMsgMediaControl::Draw( aRect );
+        }
+    }
+
+// ---------------------------------------------------------
+// CMsgSvgControl::Close
+// ---------------------------------------------------------
+//
+void CMsgSvgControl::Close()
+    {
+    SetState( EMsgAsyncControlStateIdle );
+    }
+
+// ---------------------------------------------------------
+// CMsgSvgControl::SetAndGetSizeL
+//
+// Calculates and sets the size of the control and returns new size as
+// reference aSize.
+// ---------------------------------------------------------
+//
+void CMsgSvgControl::SetAndGetSizeL( TSize& aSize )
+    {
+    aSize = CalculateControlSize( aSize );
+    SetSize( aSize );
+    }
+
+// ---------------------------------------------------------
+// CMsgSvgControl::HandleResourceChange
+// ---------------------------------------------------------
+//
+void CMsgSvgControl::HandleResourceChange( TInt aType )
+    {
+    CMsgMediaControl::HandleResourceChange( aType ); 
+    
+    if ( aType == KEikDynamicLayoutVariantSwitch )
+        {
+        SetSize( CalculateControlSize( MsgEditorCommons::MsgDataPane().Size() ) );
+        
+        TRAP_IGNORE( DoLoadL() );
+        }
+    }
+
+
+// ---------------------------------------------------------
+// CMsgSvgControl::PlayL
+// ---------------------------------------------------------
+//    
+void CMsgSvgControl::PlayL()
+    {   
+    }
+  
+// ---------------------------------------------------------
+// CMsgSvgControl::Stop
+// ---------------------------------------------------------
+//    
+void CMsgSvgControl::Stop()
+    {
+    }
+    
+// ---------------------------------------------------------
+// CMsgSvgControl::PauseL
+// ---------------------------------------------------------
+//    
+void CMsgSvgControl::PauseL()
+    {
+    }
+
+// ---------------------------------------------------------
+// CMsgSvgControl::CalculateControlSize
+// ---------------------------------------------------------
+//    
+TSize CMsgSvgControl::CalculateControlSize( TSize aProposedSize ) const
+    {
+    TAknLayoutRect controLayout;
+    controLayout.LayoutRect( MsgEditorCommons::MsgDataPane(),
+                             AknLayoutScalable_Apps::msg_data_pane_g1().LayoutLine() );
+    
+    TSize controlSize = controLayout.Rect().Size();
+    
+    // Make sure controlSize is multiple of iBaseLine
+    controlSize.iHeight = iBaseLine * ( controlSize.iHeight / iBaseLine );
+		                 
+    if ( controlSize.iHeight > aProposedSize.iHeight )
+        {
+        controlSize.iHeight = aProposedSize.iHeight;
+        }
+    
+    if ( controlSize.iWidth > aProposedSize.iWidth )
+        {
+        controlSize.iWidth = aProposedSize.iWidth;
+        }
+    
+    return controlSize;
+    }
+
+//  End of File
+