diff -r 000000000000 -r 72b543305e3a email/mail/EditorSrc/cmsgmailnavipaneutils.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/email/mail/EditorSrc/cmsgmailnavipaneutils.cpp Thu Dec 17 08:44:11 2009 +0200 @@ -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 +#include +#include +#include +#include +#include +#include +#include // for CAknNavigationControlContainer +#include // for CAknNavigationDecorator +#include + +// 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( + statusPane->ControlL( TUid::Uid( EEikStatusPaneUidNavi ) ) ); + ASSERT( iNaviPane ); + // iNaviDecorator must be deleted in destructor. + iNaviDecorator = iNaviPane->CreateEditorIndicatorContainerL(); + ASSERT( iNaviDecorator ); + iNaviIndi = static_cast( + 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 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