--- /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