messagingappbase/mce/src/MceNaviPaneFolderIndicator.cpp
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingappbase/mce/src/MceNaviPaneFolderIndicator.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,443 @@
+/*
+* 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:   Folder navigation decorator for navipane
+*
+*/
+
+
+
+// INCLUDES
+#include "MceNaviPaneFolderIndicator.h"
+#include <StringLoader.h>
+#include <muiu.mbg>
+#include <mce.rsg>
+#include <AknIconArray.h>   // CAknIconArray
+
+// security data caging
+#include <data_caging_path_literals.hrh>
+#include <bldvariant.hrh>
+#include <aknlayoutscalable_avkon.cdl.h>
+#include <AknDef.h>
+#include "MceSessionHolder.h"
+
+
+// CONSTANTS
+
+const TUint KMceRoot = 0;
+const TUint KMceFirstLevel = 1;
+_LIT( KMceDirAndFile,"muiu.mbm" );
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CMceNaviPaneFolderIndicator::CMceNaviPaneFolderIndicator
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CMceNaviPaneFolderIndicator::CMceNaviPaneFolderIndicator( 
+    TBool aPhoneMemory,
+    const TInt aDepth )
+    :                                                         
+    iMaxDepth( KMceNaviPaneMaxDepth - 1 ),
+    iPhoneMemory( aPhoneMemory )
+    {
+    // ensure that iDepth will be positive
+    aDepth < 0 ? iDepth = 0 : iDepth = aDepth;
+    }
+
+// -----------------------------------------------------------------------------
+// CMceNaviPaneFolderIndicator::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CMceNaviPaneFolderIndicator::ConstructL()
+    {
+    // security data caging
+    TParse fp;
+    fp.Set( KMceDirAndFile, &KDC_APP_BITMAP_DIR , NULL );
+    iFilename = fp.FullName();
+
+    iSeparator = StringLoader::LoadL( R_MEMC_MAIN_SEPARATOR, iEikonEnv );
+    iEndChar = StringLoader::LoadL( R_MEMC_MAIN_END, iEikonEnv );     
+   
+    LoadFolderBitmapL();
+    // Set the default root bitmap
+    ChangeRootL( iPhoneMemory );
+    }
+
+// -----------------------------------------------------------------------------
+// CMceNaviPaneFolderIndicator::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CMceNaviPaneFolderIndicator* CMceNaviPaneFolderIndicator::NewL(
+    TBool aPhoneMemory,
+    const TInt aDepth )
+    {
+    CMceNaviPaneFolderIndicator* self = CMceNaviPaneFolderIndicator::NewLC( 
+        aPhoneMemory, aDepth );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CMceNaviPaneFolderIndicator::NewLC
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CMceNaviPaneFolderIndicator* CMceNaviPaneFolderIndicator::NewLC( 
+    TBool aPhoneMemory,
+    const TInt aDepth )
+    {
+    CMceNaviPaneFolderIndicator* self=new(ELeave) CMceNaviPaneFolderIndicator( 
+        aPhoneMemory, aDepth );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;
+    }
+
+// Destructor
+CMceNaviPaneFolderIndicator::~CMceNaviPaneFolderIndicator()
+    {
+    delete iFolderBitmap;
+    delete iFolderMask;
+
+    delete iRootBitmap;
+    delete iRootMask;
+
+    delete iSeparator;
+    delete iEndChar;
+    }
+// -----------------------------------------------------------------------------
+// CMceNaviPaneFolderIndicator::SetFolderDepth
+// Sets the current folder navigation depth
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CMceNaviPaneFolderIndicator::SetFolderDepth( const TInt aDepth )
+    {
+    aDepth < 0 ? iDepth = 0 : iDepth = aDepth;
+
+    // ReportChange() is used to notify CoeControl to redraw pane.
+    ReportChange();
+    }
+
+// -----------------------------------------------------------------------------
+// CMceNaviPaneFolderIndicator::SizeChanged
+// Handles size changes
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CMceNaviPaneFolderIndicator::SizeChanged()
+    {
+    TSize size(  TSize::EUninitialized );
+    AknLayoutUtils::LayoutMetricsSize( AknLayoutUtils::ENaviPane, size );
+    TRect parentRect( size );
+
+    // Get pane icon and text layouts
+    TAknWindowLineLayout paneIconLayout(
+        AknLayoutScalable_Avkon::navi_icon_text_pane_g1().LayoutLine() );
+    TAknTextLineLayout paneTextLayout(
+        AknLayoutScalable_Avkon::navi_icon_text_pane_t1().LayoutLine() );
+    TAknLayoutRect layoutRect;
+    TAknLayoutText layoutText;
+    layoutRect.LayoutRect( parentRect, paneIconLayout );
+    layoutText.LayoutText( parentRect, paneTextLayout );
+    // Setup pane items
+    TRect itemsRect( layoutRect.Rect() );
+    const CFont* font( layoutText.Font() ); // Not owned
+    TInt bsWidth( font->MeasureText( *iSeparator ) );
+    TInt dotsWidth( font->MeasureText( *iEndChar ) );
+    TInt textWidth( KMceNaviPaneMaxDepth * bsWidth + dotsWidth );
+    TInt iconWidth( ( itemsRect.Width() - textWidth )
+        / KMceNaviPaneMaxDepth );
+    TInt i( 0 );
+
+    if ( AknLayoutUtils::LayoutMirrored() )
+        {
+        TInt offs( itemsRect.Width() );
+        for ( i = 0 ; i < KMceNaviPaneMaxDepth; i++ )
+            {
+        // Root and Folder Icons
+            offs -= iconWidth;
+            iBitmapLayout[ i ].LayoutRect(
+                parentRect,
+                paneIconLayout.iC,
+                paneIconLayout.il + offs,
+                paneIconLayout.it,
+                paneIconLayout.ir,
+                paneIconLayout.ib,
+                iconWidth,
+                paneIconLayout.iH
+                );
+        // Backslashes
+            offs -= bsWidth;
+            iTextLayout[ i ].LayoutText(
+                parentRect,
+                paneTextLayout.iFont,
+                paneTextLayout.iC,
+                paneTextLayout.il + offs,
+                paneTextLayout.ir,
+                paneTextLayout.iB,
+                paneTextLayout.iW,
+                paneTextLayout.iJ
+                );
+            }
+        // Dots
+        offs -= dotsWidth;
+        iTextLayout[ i ].LayoutText(
+            parentRect,
+            paneTextLayout.iFont,
+            paneTextLayout.iC,
+            paneTextLayout.il + offs,
+            paneTextLayout.ir,
+            paneTextLayout.iB,
+            paneTextLayout.iW,
+            paneTextLayout.iJ
+            );
+        }
+    else
+        {
+        TInt offs( 0 );
+        for ( i = 0 ; i < KMceNaviPaneMaxDepth; i++ )
+            {
+        // Root and Folder Icons
+            iBitmapLayout[ i ].LayoutRect(
+                parentRect,
+                paneIconLayout.iC,
+                paneIconLayout.il + offs,
+                paneIconLayout.it,
+                paneIconLayout.ir,
+                paneIconLayout.ib,
+                iconWidth,
+                paneIconLayout.iH
+                );
+            offs += iconWidth;
+        // Backslashes
+            iTextLayout[ i ].LayoutText(
+                parentRect,
+                paneTextLayout.iFont,
+                paneTextLayout.iC,
+                paneTextLayout.il + offs,
+                paneTextLayout.ir,
+                paneTextLayout.iB,
+                paneTextLayout.iW,
+                paneTextLayout.iJ
+                );
+            offs += bsWidth;
+            }
+        // Dots
+        iTextLayout[ i ].LayoutText(
+            parentRect,
+            paneTextLayout.iFont,
+            paneTextLayout.iC,
+            paneTextLayout.il + offs,
+            paneTextLayout.ir,
+            paneTextLayout.iB,
+            paneTextLayout.iW,
+            paneTextLayout.iJ
+            );
+        }
+    }
+// -----------------------------------------------------------------------------
+// CMceNaviPaneFolderIndicator::Draw
+// Handles drawing of the decorator
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CMceNaviPaneFolderIndicator::Draw( const TRect& /*aRect*/ ) const
+    {
+    CWindowGc& gc = SystemGc();    
+    
+    MAknsSkinInstance* skin = AknsUtils::SkinInstance();    
+    
+    CFbsBitmap* bmp = NULL;
+    TRgb color( KRgbWhite ); // Default never used
+    bmp = AknsUtils::GetCachedBitmap( skin, KAknsIIDQsnIconColors );
+    if (!IsLandscapeScreenOrientation()) 
+		{
+		AknsUtils::GetCachedColor( skin, color, 
+			KAknsIIDQsnIconColors, EAknsCIQsnIconColorsCG7 );
+		}
+	else
+		{
+    AknsUtils::GetCachedColor( skin, color, 
+			KAknsIIDQsnIconColors, EAknsCIQsnIconColorsCG25 );
+		}
+   
+    AknIconUtils::SetSize( iRootMask, iBitmapLayout[ KMceRoot ].Rect().Size() );
+    if( bmp )
+        {
+        iBitmapLayout[ KMceRoot ].DrawImage( gc, bmp, iRootMask );
+        }
+    else
+        {
+        AknIconUtils::SetSize( iRootBitmap, iBitmapLayout[ KMceRoot ].Rect().Size() );
+        iBitmapLayout[ KMceRoot ].DrawImage( gc, iRootBitmap, iRootMask );
+        }
+
+    if( !bmp )
+        {
+        AknIconUtils::SetSize( iFolderBitmap, iBitmapLayout[ KMceFirstLevel ].Rect().Size() );
+        bmp = iFolderBitmap;
+        }
+
+
+    // draw folder bitmaps depending on current folderdepth
+    TInt count( iDepth > iMaxDepth ? iMaxDepth : iDepth );
+    AknIconUtils::SetSize( iFolderMask, iBitmapLayout[ KMceFirstLevel ].Rect().Size() );
+    for( TInt i( KMceFirstLevel ); i <= count; i++ )
+        {
+        iBitmapLayout[ i ].DrawImage( gc, bmp, iFolderMask );
+        }
+
+    // draw backslashes between folderbitmaps depending on current folderdepth
+    TInt tc( iDepth > ( iMaxDepth + 1 ) ? ( iMaxDepth + 1 ) : iDepth );
+    for( TInt j( 0 ); j < tc; j++ )
+        {
+        const CFont* font = iTextLayout[j].Font(); // Not owned
+        gc.UseFont( font );
+        gc.SetPenColor( color );
+        gc.DrawText( *iSeparator, iTextLayout[j].TextRect(),
+                     font->AscentInPixels(), CGraphicsContext::ELeft, 0 );
+        }
+
+    // draw "..." at the end if necessary
+    if ( iDepth > iMaxDepth )
+        {
+        const CFont* font = iTextLayout[iMaxDepth+1].Font(); // Not owned
+        gc.UseFont( font );
+        gc.SetPenColor( color );
+        gc.DrawText( *iEndChar, iTextLayout[iMaxDepth+1].TextRect(),
+                     font->AscentInPixels(), CGraphicsContext::ELeft, 0 );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMceNaviPaneFolderIndicator::HandleResourceChange
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CMceNaviPaneFolderIndicator::HandleResourceChange( TInt aType )
+    {
+    CCoeControl::HandleResourceChange( aType );
+    if( aType == KEikDynamicLayoutVariantSwitch )
+        {
+        SizeChanged();
+        }
+    else if( aType == KAknsMessageSkinChange )
+            {
+            TRAP_IGNORE( LoadFolderBitmapL() );
+            // Set the default root bitmap
+            TRAP_IGNORE( ChangeRootL( iPhoneMemory ) );
+            }
+    }
+
+// -----------------------------------------------------------------------------
+// CMceNaviPaneFolderIndicator::ReportChange
+// Reports changes
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CMceNaviPaneFolderIndicator::ReportChange()
+    {
+    // Leave is trapped because it's not critical to functionality.
+    // If leave occurs, navipane just may not be redrawn at that very moment.
+    TRAP_IGNORE( ReportEventL( MCoeControlObserver::EEventStateChanged ) );
+    }
+
+// -----------------------------------------------------------------------------
+// CMceNaviPaneFolderIndicator::ChangeRootL
+// Changes the root bitmap
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CMceNaviPaneFolderIndicator::ChangeRootL( TBool aPhoneMemory )
+        {
+    iPhoneMemory = aPhoneMemory;
+        delete iRootBitmap;
+        iRootBitmap = NULL;
+        delete iRootMask;
+        iRootMask = NULL;
+
+    if ( iPhoneMemory )
+        {
+        AknsUtils::CreateColorIconL( AknsUtils::SkinInstance(),
+            KAknsIIDQgnPropMemcPhoneTab,
+            KAknsIIDQsnIconColors,
+            EAknsCIQsnIconColorsCG7,
+            iRootBitmap, 
+            iRootMask,
+            iFilename,
+            EMbmMuiuQgn_prop_memc_phone_tab, 
+            EMbmMuiuQgn_prop_memc_phone_tab+1,
+            KRgbBlack );
+        }
+    else
+        {
+        AknsUtils::CreateColorIconL( AknsUtils::SkinInstance(),
+            KAknsIIDQgnPropMemcMmcTab,
+            KAknsIIDQsnIconColors,
+            EAknsCIQsnIconColorsCG7,
+            iRootBitmap, 
+            iRootMask,
+            iFilename,
+            EMbmMuiuQgn_prop_memc_mmc_tab, 
+            EMbmMuiuQgn_prop_memc_mmc_tab+1,
+            KRgbBlack );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMceNaviPaneFolderIndicator::LoadFolderBitmapL
+// Loads Folder Bitmaps
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CMceNaviPaneFolderIndicator::LoadFolderBitmapL()
+    {
+
+    delete iFolderBitmap;
+    iFolderBitmap = NULL;
+    delete iFolderMask;
+    iFolderMask = NULL;
+               
+    AknsUtils::CreateColorIconL( AknsUtils::SkinInstance(),
+        KAknsIIDQgnPropFolderTab,
+        KAknsIIDQsnIconColors,
+        EAknsCIQsnIconColorsCG7,
+        iFolderBitmap, 
+        iFolderMask,
+        iFilename,
+        EMbmMuiuQgn_prop_folder_tab, 
+        EMbmMuiuQgn_prop_folder_tab+1,
+        KRgbBlack );
+        }
+  
+// -----------------------------------------------------------------------------
+// CMceNaviPaneFolderIndicator::IsLandscapeScreenOrientation
+// Checks phone screen mode Landscape or Portrait
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool CMceNaviPaneFolderIndicator::IsLandscapeScreenOrientation() const	
+	{
+	TRect rect;
+	AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EScreen, rect);
+	return rect.Width() > rect.Height();
+	}  
+  
+// End of File