--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/email/mail/EditorSrc/cmsgmailnavipaneutils.cpp Wed Sep 01 12:31:54 2010 +0100
@@ -0,0 +1,309 @@
+/*
+* 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: Navi pane handling utilities
+*
+*/
+
+
+// Mail includes
+#include "cmsgmailnavipaneutils.h"
+#include <avkon.hrh>
+#include <aknenv.h>
+#include <AknsUtils.h>
+#include <AknIndicatorContainer.h>
+#include <MsgAttachmentUtils.h>
+#include <AknIconUtils.h>
+#include <aknEditStateIndicator.h>
+#include <aknnavi.h> // for CAknNavigationControlContainer
+#include <aknnavide.h> // for CAknNavigationDecorator
+#include <avkon.mbg>
+
+// LOCAL CONSTANTS
+
+const TInt KMaxNaviMailSize(9999*1024); // largest size shown in navi pane
+const TInt KMaxNaviMailDigits(20); // some language variants require this
+ // to be longer than 10, since they
+ // write kB with more characters
+ // this will cause overlapping in
+ // navi pane with priority
+
+// ================= MEMBER FUNCTIONS =======================
+
+// -----------------------------------------------------------------------------
+// CMsgMailNaviPaneUtils::NewL()
+// Symbian two-phased constructor
+// -----------------------------------------------------------------------------
+//
+CMsgMailNaviPaneUtils* CMsgMailNaviPaneUtils::NewL()
+ {
+ CMsgMailNaviPaneUtils* self = new( ELeave ) CMsgMailNaviPaneUtils();
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop(self); // self
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CMsgMailNaviPaneUtils::CMsgMailNaviPaneUtils()
+// A default constructor
+// -----------------------------------------------------------------------------
+//
+CMsgMailNaviPaneUtils::CMsgMailNaviPaneUtils()
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CMsgMailNaviPaneUtils::ConstructL()
+// -----------------------------------------------------------------------------
+//
+void CMsgMailNaviPaneUtils::ConstructL()
+ {
+ CEikStatusPane* statusPane =
+ CEikonEnv::Static()->AppUiFactory()->StatusPane(); // CSI: 27 # Must be used because of iEikEnv
+ // is not accessible.
+ ASSERT( statusPane );
+ // We don't own iNaviPane.
+ iNaviPane = static_cast<CAknNavigationControlContainer*>(
+ statusPane->ControlL( TUid::Uid( EEikStatusPaneUidNavi ) ) );
+ ASSERT( iNaviPane );
+ // iNaviDecorator must be deleted in destructor.
+ iNaviDecorator = iNaviPane->CreateEditorIndicatorContainerL();
+ ASSERT( iNaviDecorator );
+ iNaviIndi = static_cast<CAknIndicatorContainer*>(
+ iNaviDecorator->DecoratedControl() );
+ ASSERT( iNaviIndi );
+
+ // Address fields contain by default t9 and abc icons, and to avoid
+ // other indicators changing position when our own navi pane is enabled or
+ // disabled we will create invisible indicators.
+ CreateInvisibleIndicatorL( EAknNaviPaneEditorIndicatorLowerCase );
+ CreateInvisibleIndicatorL( EAknNaviPaneEditorIndicatorT9 );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CMsgMailNaviPaneUtils::~CMsgMailNaviPaneUtils()
+// -----------------------------------------------------------------------------
+//
+CMsgMailNaviPaneUtils::~CMsgMailNaviPaneUtils()
+ {
+ delete iNaviDecorator;
+ }
+
+
+// ----------------------------------------------------------------------------
+// CMsgMailNaviPaneUtils::SetPriorityIndicator()
+// if priority is EMsvMediumPriority then no indicator is shown
+// ----------------------------------------------------------------------------
+void CMsgMailNaviPaneUtils::SetPriorityIndicator( TMsvPriority aPriority )
+ {
+ SetIndicatorState( EAknNaviPaneEditorIndicatorMcePriorityHigh,
+ ( aPriority == EMsvHighPriority ) ? ETrue : EFalse );
+
+ SetIndicatorState( EAknNaviPaneEditorIndicatorMcePriorityLow,
+ ( aPriority == EMsvLowPriority ) ? ETrue : EFalse );
+ }
+
+// -----------------------------------------------------------------------------
+// void CMsgMailNaviPaneUtils::SetMessageSizeIndicatorL()
+// -----------------------------------------------------------------------------
+//
+void CMsgMailNaviPaneUtils::SetMessageSizeIndicatorL( TInt aSize )
+ {
+ TBuf<KMaxNaviMailDigits> sizeString;
+ if ( aSize > KMaxNaviMailSize )
+ {
+ aSize = KMaxNaviMailSize;
+ }
+
+ MsgAttachmentUtils::FileSizeToStringL( sizeString, aSize, ETrue );
+
+ SetIndicatorState( EAknNaviPaneEditorIndicatorMessageLength, ETrue );
+ SetIndicatorValueL( EAknNaviPaneEditorIndicatorMessageLength, sizeString );
+ }
+
+// -----------------------------------------------------------------------------
+// void CMsgMailNaviPaneUtils::SetAttachmentIndicator()
+// -----------------------------------------------------------------------------
+//
+void CMsgMailNaviPaneUtils::SetAttachmentIndicator( TBool aHasAttachments )
+ {
+ SetIndicatorState( EAknNaviPaneEditorIndicatorAttachment, aHasAttachments );
+ }
+
+// ---------------------------------------------------------------------------
+// CMsgMailNaviPaneUtils::EnableOwnNaviPaneL
+// Enable or disable our own navi pane.
+// ---------------------------------------------------------------------------
+//
+void CMsgMailNaviPaneUtils::EnableOwnNaviPaneL( TBool aDoEnable )
+ {
+ if( aDoEnable )
+ {
+ // If iNaviDecorator already exists in window stack,
+ // it is put foremost.
+ iNaviPane->PushL( *iNaviDecorator );
+ iNaviDecorator->MakeVisible( ETrue );
+ }
+ else
+ {
+ iNaviDecorator->MakeVisible( EFalse );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMsgMailNaviPaneUtils::SetIndicatorState
+// Sets indicator state on/off in both default and our own navi pane
+// ---------------------------------------------------------------------------
+//
+void CMsgMailNaviPaneUtils::SetIndicatorState(
+ TInt aIndicatorId,
+ TBool aDoEnable )
+ {
+ TInt state( aDoEnable ? EAknIndicatorStateOn : EAknIndicatorStateOff );
+ TUid indicator( TUid::Uid( aIndicatorId ) );
+
+ // default navi pane
+ MAknEditingStateIndicator* ind = AVKONENV->EditingStateIndicator();
+ if ( ind )
+ {
+ CAknIndicatorContainer* defaultNaviIndi = ind->IndicatorContainer();
+ ASSERT( defaultNaviIndi );
+ defaultNaviIndi->SetIndicatorState( indicator, state );
+ }
+
+ // our own navi pane
+ iNaviIndi->SetIndicatorState( indicator, state );
+ }
+
+// ---------------------------------------------------------------------------
+// CMsgMailNaviPaneUtils::SetIndicatorValueL
+// Sets indicator value in both default and our own navi pane
+// ---------------------------------------------------------------------------
+//
+void CMsgMailNaviPaneUtils::SetIndicatorValueL(
+ TInt aIndicatorId,
+ const TDesC& aString )
+ {
+ TUid indicator( TUid::Uid( aIndicatorId ) );
+
+ // default navi pane
+ MAknEditingStateIndicator* ind = AVKONENV->EditingStateIndicator();
+ if ( ind )
+ {
+ CAknIndicatorContainer* defaultNaviIndi = ind->IndicatorContainer();
+ ASSERT( defaultNaviIndi );
+ defaultNaviIndi->SetIndicatorValueL( indicator, aString );
+ }
+
+ // our own navi pane
+ iNaviIndi->SetIndicatorValueL( indicator, aString );
+ }
+
+// ---------------------------------------------------------------------------
+// CMsgMailNaviPaneUtils::CreateInvisibleIndicatorL
+// We add invisible "abc" and t9 icons to our navi pane so that email priority
+// icon won't change it's place horizontally when focus is moved to/from
+// attachment field. This is quite ugly, but avkon doesn't provide support for
+// keeping indicator in fixed location.
+// ---------------------------------------------------------------------------
+//
+void CMsgMailNaviPaneUtils::CreateInvisibleIndicatorL( TInt aIndicatorId )
+ {
+ // 1. Turn indicator on
+
+ SetIndicatorState( aIndicatorId, ETrue );
+
+ // 2. Make icon invisible
+
+ CFbsBitmap* bitmap( NULL );
+ // Get bitmap for "abc" icon
+ CreateIconLC( aIndicatorId, bitmap );
+
+ // We cannot use CFbsBitmap::SizeInPixels() since it is zero due
+ // to icon scalability. To get a size for our empty mask we query
+ // content dimensions. All scaling and sizing of actual indicators
+ // will be taken care by CAknIndicatorContainer
+ TSize size;
+ User::LeaveIfError( AknIconUtils::GetContentDimensions( bitmap,
+ size ) );
+ CFbsBitmap* emptyMask = new (ELeave) CFbsBitmap();
+ CleanupStack::PushL( emptyMask );
+ User::LeaveIfError( emptyMask->Create( size, EGray2 ) );
+
+ // Ownership of bitmap and newMask is transferred to iNaviIndi.
+ iNaviIndi->ReplaceIndicatorIconL( TUid::Uid( aIndicatorId ),
+ EAknIndicatorStateOn,
+ CAknIndicatorContainer::ELayoutModeWide,
+ bitmap,
+ emptyMask );
+ CleanupStack::Pop( 2, bitmap ); // CSI: 47,12 # emptyMask, bitmap
+ }
+
+// ---------------------------------------------------------------------------
+// CMsgMailNaviPaneUtils::CreateIconLC
+//
+// ---------------------------------------------------------------------------
+//
+void CMsgMailNaviPaneUtils::CreateIconLC(
+ TInt aIndicatorId,
+ CFbsBitmap*& aBitmap ) const
+ {
+ TAknsItemID skinId;
+ TInt bitmapId;
+ TInt maskId; // dummy
+ GetIconIds( aIndicatorId, skinId, bitmapId, maskId );
+ MAknsSkinInstance *skin = AknsUtils::SkinInstance();
+ AknsUtils::CreateIconLC( skin,
+ skinId,
+ aBitmap,
+ AknIconUtils::AvkonIconFileName(),
+ bitmapId );
+ }
+
+// ---------------------------------------------------------------------------
+// CMsgMailNaviPaneUtils::GetIconIds
+//
+// ---------------------------------------------------------------------------
+//
+void CMsgMailNaviPaneUtils::GetIconIds(
+ TInt aIndicatorId,
+ TAknsItemID& aSkinId,
+ TInt& aFileBitmapId,
+ TInt& aFileMaskId ) const
+ {
+ switch ( aIndicatorId )
+ {
+ case EAknNaviPaneEditorIndicatorLowerCase:
+ {
+ aSkinId = KAknsIIDQgnStatCaseSmall;
+ aFileBitmapId = EMbmAvkonQgn_stat_case_small;
+ aFileMaskId = EMbmAvkonQgn_stat_case_small_mask;
+ break;
+ }
+ case EAknNaviPaneEditorIndicatorT9:
+ {
+ aSkinId = KAknsIIDQgnStatT9;
+ aFileBitmapId = EMbmAvkonQgn_stat_t9;
+ aFileMaskId = EMbmAvkonQgn_stat_t9_mask;
+ break;
+ }
+ default:
+ {
+ // do nothing
+ }
+ }
+ }
+
+// End of File