diff -r ebe688cedc25 -r 7fdbb852d323 messagingappbase/msgavkon/muiu_domain/messageinfo/src/MuiuMsgInfoCDMA.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingappbase/msgavkon/muiu_domain/messageinfo/src/MuiuMsgInfoCDMA.cpp Wed Sep 01 12:31:54 2010 +0100 @@ -0,0 +1,820 @@ +/* +* 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: +* Encapsulates the data which populates the fields in the message +* info dialogs (email, sms, bios, mms), also holds the text for the +* labels and fields in the message info dialog and displays a message +* info dialog for particular message types +* +*/ + + + +// INCLUDE FILES +#include "muiumsginfo.h" +#include "muiumsginfo.hrh" +#include +#include +#include // AknLayoutUtils::FontFromId +#include // AKN_LAYOUT_TEXT_List_pane_texts__menu_single_heading__Line_2(0) +#include // TAknTextLineLayout +#include // ConvertToVisualAndWrapToArrayL +#include // CAknPhoneNumberGrouping +#include // KDC_RESOURCE_FILES_DIR +#include // iAvkonAppUi + +// CONSTANTS +const TInt KWhitespaceBuffer = 1; +const TInt KLoopStartingIndex = 0; +const TInt KMaxCharsInLine = 50; // needs to be longer than the max possible chars that could be in a line in the dialog +const TInt KMuiuArrayGranularity = 4; +const TInt KInfoArrayGranularity = 8; +const TInt KNumOfReplaceChars = 3; // for subject field whitebox removal +const TInt KMessageTypeLines = 4; // specified max lines for message type field +const TInt KLineFeed = 0x0000000a; // unicode representation for linefeed. +const TInt KExtraPixels = 2; // Extra pixels for label field (Value from AVKON LAF document) +const TInt KItemCount = 0; // Magic +const TInt KTitleVisible = 1; // Known value ( we always have title in message info) +const TInt KDateSize = 30; // Size of Date and Time strings in Message info + +_LIT( KDirAndMuiuResFileName,"muiu.rsc" ); +_LIT(KWhitespace, " "); //must be just one char +_LIT(KNullString, ""); + + +// ============================ MEMBER FUNCTIONS =============================== + + +// --------------------------------------------------------- +// CMsgInfoLabelAndTextArray::~CMsgInfoLabelAndTextArray +// --------------------------------------------------------- +// +CMsgInfoLabelAndTextArray::~CMsgInfoLabelAndTextArray() + { + delete iLabels; + delete iTextFields; + delete iLine; + iFont = NULL; + iLabelFont = NULL; + } + + +// --------------------------------------------------------- +// CMsgInfoLabelAndTextArray::NewL +// --------------------------------------------------------- +// +CMsgInfoLabelAndTextArray* CMsgInfoLabelAndTextArray::NewL() + { + CMsgInfoLabelAndTextArray* self = new( ELeave ) CMsgInfoLabelAndTextArray; + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); //self + return self; + } + + +// --------------------------------------------------------- +// CMsgInfoLabelAndTextArray::CMsgInfoLabelAndTextArray +// --------------------------------------------------------- +// +CMsgInfoLabelAndTextArray::CMsgInfoLabelAndTextArray() : iEnv( *CEikonEnv::Static() ) + { + TAknTextLineLayout layout( AKN_LAYOUT_TEXT_List_pane_texts__menu_single_heading__Line_2(0) ); + iFont = AknLayoutUtils::FontFromId( layout.FontId() ); + TAknTextLineLayout labelLayout( AKN_LAYOUT_TEXT_List_pane_texts__menu_single_heading__Line_1 ); + iLabelFont = AknLayoutUtils::FontFromId( labelLayout.FontId() ); + } + + +// --------------------------------------------------------- +// CMsgInfoLabelAndTextArray::ConstructL +// --------------------------------------------------------- +// +void CMsgInfoLabelAndTextArray::ConstructL() + { + iLabels = new(ELeave)CDesCArrayFlat( KInfoArrayGranularity ); + iTextFields = new(ELeave)CDesCArrayFlat( KInfoArrayGranularity ); + iLine = HBufC::NewL( KMaxCharsInLine) ; + } + + +// --------------------------------------------------------- +// CMsgInfoLabelAndTextArray::AddLabelAndTextL +// Add label text (identified by resource id) and the corresponding +// field text to the array structure - may need to add multiple lines +// if the label text is long and aWrap is set to ETrue - this is done +// by making AddWrapLineToArrayL recursive +// --------------------------------------------------------- +// +void CMsgInfoLabelAndTextArray::AddLabelAndTextL(TInt aLabelResourceId, const TPtrC& aFieldText, TBool aWrap) + { + HBufC* labelText = iEnv.AllocReadResourceLC( aLabelResourceId ); + HBufC* visualConvertedLabelStr = NULL; + visualConvertedLabelStr = ConstructVisualConvertedStringLC( labelText->Des() ); + + if( aLabelResourceId == R_MESSAGE_INFO_TYPE_LABEL ) + { + AddFixedLinesWrapMessageTypeToArrayL( aFieldText, *visualConvertedLabelStr, KMessageTypeLines ); + } + else if ( aWrap ) + { + AddWrapMessageTypeToArrayL( aFieldText, *visualConvertedLabelStr ); + } + else + { + iLabels->AppendL( *visualConvertedLabelStr ); + HBufC* visualConvertedFieldTextStr = NULL; + visualConvertedFieldTextStr = ConstructVisualConvertedFieldTextStringLC( aFieldText ); + iTextFields->AppendL( *visualConvertedFieldTextStr ); + CleanupStack::PopAndDestroy( ); + } + CleanupStack::PopAndDestroy( 2 ); //labelText, visualConvertedLabelStr + } + + +// --------------------------------------------------------- +// CMsgInfoLabelAndTextArray::MdcaCount +// +// Return the total number of message info lines +// +// --------------------------------------------------------- +// +TInt CMsgInfoLabelAndTextArray::MdcaCount() const + { + return ( iLabels->Count() ); + } + + +// --------------------------------------------------------- +// CMsgInfoLabelAndTextArray::MdcaPoint +// +// Return the message info line (label and text separated by a delimiter) +// according to the index +// --------------------------------------------------------- +// +TPtrC CMsgInfoLabelAndTextArray::MdcaPoint( TInt aIndex ) const + { + TPtr ptr = iLine->Des(); + + ptr.Zero(); + ptr.Append( ( *iLabels )[aIndex] ); + ptr.Append( KColumnListSeparator ); + ptr.Append( ( *iTextFields )[aIndex] ); + return ptr; + } + + +// --------------------------------------------------------- +// CMsgInfoLabelAndTextArray::AddFixedLinesWrapMessageTypeToArrayL +// Add label text and field text into info message array structure. +// Field text has max number of lines which is passed in parameter aMaxLines. +// If field text doesn't fit to these lines so text is truncated and added '...' to end. +// --------------------------------------------------------- +// +void CMsgInfoLabelAndTextArray::AddFixedLinesWrapMessageTypeToArrayL( const TDesC& aField, + const TDesC& aLabel, + TInt aMaxLines ) + { + const TInt KPixelLineWidth( LineMaxWidthInPixels( ETrue ) ); + HBufC* string = 0; + + if( aField.Length() ) + { + string = aField.AllocLC(); + } + else + { + string = HBufC::NewLC( KWhitespaceBuffer ); + string->Des().Append( KWhitespace ); + } + + CArrayFix* widthArray = new ( ELeave ) CArrayFixFlat( KMuiuArrayGranularity ); + CleanupStack::PushL( widthArray ); + widthArray->AppendL( KPixelLineWidth, aMaxLines ); + CArrayFix* wrappedArray = new ( ELeave ) CArrayFixFlat( KMuiuArrayGranularity ); + CleanupStack::PushL( wrappedArray ); + + HBufC* convertBuff; + if( ( string->Des().MaxLength() - string->Des().Length() ) < + ( widthArray->Count() * KAknBidiExtraSpacePerLine ) ) + { + convertBuff = HBufC::NewLC( widthArray->Count() * KAknBidiExtraSpacePerLine + string->Des().Length() ); + } + else + { + convertBuff = HBufC::NewLC( string->Des().MaxLength()); + } + + TPtr strPtr = convertBuff->Des(); + strPtr.Copy( *string ); + AknBidiTextUtils::ConvertToVisualAndWrapToArrayL( strPtr, *widthArray, *iFont, *wrappedArray, ETrue ); + + const TInt lines = wrappedArray->Count(); + for ( TInt loop = KLoopStartingIndex; loop < lines; loop++ ) + { + if ( loop == KLoopStartingIndex ) + { + iLabels->AppendL( aLabel ); + } + else + { + iLabels->AppendL( KWhitespace ); + } + iTextFields->AppendL( ( *wrappedArray )[loop]); + } + + CleanupStack::PopAndDestroy( 4 ); //convertBuff, wrappedArray, widthArray, string + } + + +// --------------------------------------------------------- +// CMsgInfoLabelAndTextArray::AddWrapMessageTypeToArrayL +// Add label text and field text into info message array structure. +// If field text doesn't fit to one line then wraps text to lines so that all +// text is shown. +// --------------------------------------------------------- +// +void CMsgInfoLabelAndTextArray::AddWrapMessageTypeToArrayL( const TDesC& aField, const TDesC& aLabel ) + { + const TInt KPixelLineWidth( LineMaxWidthInPixels( ETrue ) ); + HBufC* string = 0; + + if( aField.Length() ) + { + string = aField.AllocLC(); + } + else + { + string = HBufC::NewLC( KWhitespaceBuffer ); + string->Des().Append( KWhitespace ); + } + + CArrayFix* wrappedArray = new ( ELeave ) CArrayFixFlat( KMuiuArrayGranularity ); + CleanupStack::PushL( wrappedArray ); + HBufC* visual = AknBidiTextUtils::ConvertToVisualAndWrapToArrayL(*string, KPixelLineWidth, *iFont, *wrappedArray); + CleanupStack::PushL( visual ); + const TInt lines = wrappedArray->Count(); + for ( TInt loop = KLoopStartingIndex; loop < lines; loop++ ) + { + if ( loop == KLoopStartingIndex ) + { + iLabels->AppendL(aLabel); + } + else + { + iLabels->AppendL( KWhitespace ); + } + iTextFields->AppendL( ( *wrappedArray )[loop]); + } + + CleanupStack::PopAndDestroy( 3 ); //visual, wrappedArray, string + } + + +// --------------------------------------------------------- +// CMsgInfoLabelAndTextArray::ConstructVisualConvertedStringLC +// +// Convert string in parameter "aLabelString" to visual order +// and clips it if necessary and return this visual +// converted string. +// +// --------------------------------------------------------- +// +HBufC* CMsgInfoLabelAndTextArray::ConstructVisualConvertedStringLC( const TDesC& aLabelString ) const + { + HBufC* convertedLabelStr = NULL; + + if( aLabelString.Length() ) + { + convertedLabelStr = HBufC::NewLC( aLabelString.Length() + KAknBidiExtraSpacePerLine ); + convertedLabelStr->Des().Copy( aLabelString ); + } + else + { + convertedLabelStr = HBufC::NewLC( KWhitespaceBuffer + KAknBidiExtraSpacePerLine ); + convertedLabelStr->Des().Copy( KWhitespace ); + } + const TInt KMaxWidthInPixels( LineMaxWidthInPixels( EFalse ) ); + const TInt KMaxClippedWidthInPixels = KMaxWidthInPixels + KExtraPixels; + + TPtr convLabelStrPtr = convertedLabelStr->Des(); + AknBidiTextUtils::ConvertToVisualAndClipL( convLabelStrPtr, *iLabelFont , KMaxWidthInPixels, KMaxClippedWidthInPixels ); + return convertedLabelStr; + } + + + +// --------------------------------------------------------- +// CMsgInfoLabelAndTextArray::ConstructVisualConvertedFieldTextStringLC +// +// Convert string in parameter "aFieldTextString" to visual order +// and clips it if necessary and return this visual +// converted string. +// +// --------------------------------------------------------- +// +HBufC* CMsgInfoLabelAndTextArray::ConstructVisualConvertedFieldTextStringLC( const TDesC& aFieldTextString ) const + { + HBufC* convertedFieldTextStr = NULL; + + if( aFieldTextString.Length() ) + { + convertedFieldTextStr = HBufC::NewLC( aFieldTextString.Length() + KAknBidiExtraSpacePerLine ); + convertedFieldTextStr->Des().Copy( aFieldTextString ); + } + else + { + convertedFieldTextStr = HBufC::NewLC( KWhitespaceBuffer + KAknBidiExtraSpacePerLine ); + convertedFieldTextStr->Des().Copy( KWhitespace ); + } + const TInt KMaxWidthInPixels( LineMaxWidthInPixels( ETrue ) ); + TPtr convFieldTextStrPtr = convertedFieldTextStr->Des(); + AknBidiTextUtils::ConvertToVisualAndClipL( convFieldTextStrPtr, *iFont, KMaxWidthInPixels, KMaxWidthInPixels ); + return convertedFieldTextStr; + } + + +// --------------------------------------------------------- +// MsgInfoLabelAndTextArray::LineMaxWidthInPixels +// +// Return line max width in pixels in LAF situations: +// AKN_LAYOUT_TEXT_List_pane_texts__menu_single_heading__Line_2(0) and +// AKN_LAYOUT_TEXT_List_pane_texts__menu_single_heading__Line_1. +// If parameter aLine2Pixels is true then return line max width in pixels +// in LAF situation: AKN_LAYOUT_TEXT_List_pane_texts__menu_single_heading__Line_2(0) +// If parameter aLine2Pixels is false then return line max width in pixels +// in LAF situation: AKN_LAYOUT_TEXT_List_pane_texts__menu_single_heading__Line_1 +// Because screen size can vary then also max line width in pixels can vary and +// this function is used in this situation. +// --------------------------------------------------------- +// +TInt CMsgInfoLabelAndTextArray::LineMaxWidthInPixels( TBool aLine2Pixels ) const + { + TRect main_pane = iAvkonAppUi->ClientRect(); + + TAknLayoutRect popup_menu_graphic_window; + popup_menu_graphic_window.LayoutRect( main_pane, AknLayout::popup_menu_graphic_window( KItemCount ) ); + + TAknLayoutRect menu_heading_pane; + menu_heading_pane.LayoutRect( popup_menu_graphic_window.Rect() , AknLayout::list_menu_heading_pane( KTitleVisible, KItemCount ) ); + + TAknLayoutRect list_item; + list_item.LayoutRect( menu_heading_pane.Rect() , AknLayout::list_single_heading_popup_menu_pane( KItemCount ) ); + + TAknLayoutText text; + if( aLine2Pixels ) + { + text.LayoutText( list_item.Rect(), AKN_LAYOUT_TEXT_List_pane_texts__menu_single_heading__Line_2( 0 ) ); + } + else + { + text.LayoutText( list_item.Rect(), AKN_LAYOUT_TEXT_List_pane_texts__menu_single_heading__Line_1 ); + } + return text.TextRect().Width(); + } + + + + +//////////////////////////////////////////////////////////////////////////////////// + + +// --------------------------------------------------------- +// CMsgInfoMessageInfoDialog::~CMsgInfoMessageInfoDialog +// --------------------------------------------------------- +// +CMsgInfoMessageInfoDialog::~CMsgInfoMessageInfoDialog() + { + iResources.Close(); + delete iListBox; + } + + +// --------------------------------------------------------- +// CMsgInfoMessageInfoDialog::CMsgInfoMessageInfoDialog +// --------------------------------------------------------- +// +CMsgInfoMessageInfoDialog::CMsgInfoMessageInfoDialog() : iResources( *CEikonEnv::Static() ) + {} + + +// --------------------------------------------------------- +// CMsgInfoMessageInfoDialog::ConstructL +// --------------------------------------------------------- +// +void CMsgInfoMessageInfoDialog::ConstructL() + { + TParse parse; + parse.Set( KDirAndMuiuResFileName, &KDC_RESOURCE_FILES_DIR, NULL ); + TFileName fileName( parse.FullName() ); + iResources.OpenL( fileName ); + iListBox = new( ELeave )CAknSingleHeadingPopupMenuStyleListBox; + } + + +// --------------------------------------------------------- +// CMsgInfoMessageInfoDialog::NewL +// --------------------------------------------------------- +// +EXPORT_C CMsgInfoMessageInfoDialog* CMsgInfoMessageInfoDialog::NewL() + { + CMsgInfoMessageInfoDialog* self = new( ELeave ) CMsgInfoMessageInfoDialog; + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); //self + return self; + } + + +// --------------------------------------------------------- +// CMsgInfoMessageInfoDialog::ExecuteLD +// Show the message info dialog. +// --------------------------------------------------------- +// +EXPORT_C void CMsgInfoMessageInfoDialog::ExecuteLD( TMsgInfoMessageInfoData& aFieldData, TMessageInfoType aMessageType) + { + TMsgInfoMessageInfoData convertedFieldData; + + CleanupStack::PushL( this ); + + iMessageType = aMessageType; + + + // Note: Lanquage specific number conversion done here. + // This way dialog seem to open faster. (Number conversion and memory allocation take time) + + //From ---------------------------------------------------------------------- + HBufC* tmpFromString = CAknPhoneNumberGrouping::CreateGroupedPhoneNumberL( aFieldData.iFrom ); + CleanupStack::PushL( tmpFromString ); + DoNumberConversionL( tmpFromString, convertedFieldData.iFrom ); + + //Subject ---------------------------------------------------------------------- + HBufC* tmpSubjectString = aFieldData.iSubject.AllocLC(); + TPtr tmpSubjecPtr = tmpSubjectString->Des(); + TBuf replaceChars; + replaceChars.Zero(); + replaceChars.Append( CEditableText::EParagraphDelimiter ); + replaceChars.Append( CEditableText::ETabCharacter ); + replaceChars.Append( KLineFeed ); + AknTextUtils::ReplaceCharacters( + tmpSubjecPtr, + replaceChars, + CEditableText::ESpace ); + if ( tmpSubjecPtr.Length() > 0 ) + { + AknTextUtils::DisplayTextLanguageSpecificNumberConversion( tmpSubjecPtr ); + } + convertedFieldData.iSubject.Set( tmpSubjecPtr ); + + //Callback ---------------------------------------------------------------------- + HBufC* tmpCallbackString = CAknPhoneNumberGrouping::CreateGroupedPhoneNumberL( aFieldData.iCallback ); + CleanupStack::PushL( tmpCallbackString ); + DoNumberConversionL( tmpCallbackString, convertedFieldData.iCallback ); + + //Status ---------------------------------------------------------------------- + HBufC* tmpStatusString = aFieldData.iStatus.AllocLC(); + TPtr tmpStatusPtr = tmpStatusString->Des(); + convertedFieldData.iStatus.Set( tmpStatusPtr ); + + // Priority ------------------------------------------------------------------ + HBufC* tmpPriorityString = aFieldData.iPriority.AllocLC(); + TPtr tmpPriorityPtr = tmpPriorityString->Des(); + convertedFieldData.iPriority.Set( tmpPriorityPtr ); + + //Type ---------------------------------------------------------------------- + HBufC* tmpTypeString = aFieldData.iType.AllocLC(); + DoNumberConversionL( tmpTypeString, convertedFieldData.iType ); + + //Size ---------------------------------------------------------------------- + HBufC* tmpSizeString = aFieldData.iSize.AllocLC(); + DoNumberConversionL( tmpSizeString, convertedFieldData.iSize ); + + //To---------------------------------------------------------------------- + HBufC* tmpToString = CAknPhoneNumberGrouping::CreateGroupedPhoneNumberL( aFieldData.iTo ); + CleanupStack::PushL( tmpToString ); + DoNumberConversionL( tmpToString, convertedFieldData.iTo ); + + //CC---------------------------------------------------------------------- + HBufC* tmpCCString = CAknPhoneNumberGrouping::CreateGroupedPhoneNumberL( aFieldData.iCC ); + CleanupStack::PushL( tmpCCString ); + DoNumberConversionL( tmpCCString, convertedFieldData.iCC ); + + //BCC---------------------------------------------------------------------- + HBufC* tmpBCCString = CAknPhoneNumberGrouping::CreateGroupedPhoneNumberL( aFieldData.iBCC ); + CleanupStack::PushL( tmpBCCString ); + DoNumberConversionL( tmpBCCString, convertedFieldData.iBCC ); + + CAknPopupList* popupList = CAknPopupList::NewL( iListBox, R_AVKON_SOFTKEYS_OK_EMPTY, AknPopupLayouts::EMenuGraphicHeadingWindow ); + CleanupStack::PushL( popupList ); + + TInt flags = EAknListBoxViewerFlags; + iListBox->ConstructL( popupList, flags ); + iListBox->CreateScrollBarFrameL( ETrue ); + iListBox->ScrollBarFrame()->SetScrollBarVisibilityL( CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto ); + + convertedFieldData.iDateTime = aFieldData.iDateTime; + SetInfoArrayL( convertedFieldData ); + SetTitleL( popupList ); + + CleanupStack::Pop(); //popupList + popupList->ExecuteLD(); + CleanupStack::PopAndDestroy( 10 ); //tmpFromString, tmpSubjectString, tmpBCCString, + // tmpTypeString, tmpSizeString, tmpToString, tmpCCString, tmpCallbackString, tmpPriorityString + // tmpStatusString + CleanupStack::Pop(); //this + delete this; + } + + +// --------------------------------------------------------- +// CMsgInfoMessageInfoDialog::SetInfoArrayL +// Construct the array of labels and text fields and add it to the listbox model +// --------------------------------------------------------- +// +void CMsgInfoMessageInfoDialog::SetInfoArrayL( TMsgInfoMessageInfoData& aFieldData ) + { + TBuf dateString; + TBuf timeString; + TPtrC dateStr; + TPtrC timeStr; + + CMsgInfoLabelAndTextArray* infoArray = CMsgInfoLabelAndTextArray::NewL(); + CleanupStack::PushL( infoArray ); + + //From ----------------------------------------------------------- + switch( iMessageType ) + { + case EEmailViewer: + case ESmsViewer: + case EBiosViewer: + case EMmsViewer: + //deliberate fall through + if( aFieldData.iFrom.Length() ) + { + infoArray->AddLabelAndTextL( R_MESSAGE_INFO_FROM_LABEL, aFieldData.iFrom ); + } + break; + default: + break; + }; + + + //Subject -------------------------------------------------- + switch(iMessageType) + { + case ESmsEditor: + case ESmsViewer: + case EBiosEditor: + case EBiosViewer: + //deliberate fall through - no wrap for sms subject + if( aFieldData.iSubject.Length() ) + { + infoArray->AddLabelAndTextL( R_MESSAGE_INFO_SUBJECT_LABEL, aFieldData.iSubject, EFalse ); + } + break; + default: + if( aFieldData.iSubject.Length() ) + { + infoArray->AddLabelAndTextL( R_MESSAGE_INFO_SUBJECT_LABEL, aFieldData.iSubject ); + } + break; + }; + + //Callback ------------------------------------------------------------------ + // CDMA only + switch( iMessageType ) + { + case ESmsEditor: + case ESmsViewer: + infoArray->AddLabelAndTextL(R_MESSAGE_INFO_CALLBACK_LABEL,aFieldData.iCallback); + break; + default: + break; + }; + + //Status ---------------------------------------------------------------------- + //Only for CDMA MO messages + // + switch( iMessageType ) + { + case ESmsEditor: + //deliberate fall through - no wrap for sms subject + infoArray->AddLabelAndTextL(R_MESSAGE_INFO_STATUS_LABEL,aFieldData.iStatus,EFalse); + break; + default: + break; + }; + + //Priority ---------------------------------------------------------------------- + switch( iMessageType ) + { + case ESmsEditor: + case ESmsViewer: + infoArray->AddLabelAndTextL(R_MESSAGE_INFO_PRIORITY_LABEL,aFieldData.iPriority,EFalse); + break; + default: + break; + }; + + //Date and Time ------------------------------------------------------------- + + GetFormattedTimeAndDateStringsL( aFieldData.iDateTime, dateString, timeString ); + HBufC* tmpDateString = dateString.AllocLC(); + DoNumberConversionL( tmpDateString, dateStr ); + HBufC* tmpTimeString = timeString.AllocLC(); + DoNumberConversionL( tmpTimeString, timeStr ); + + //Date ------------------------------------------------------------------ + if( dateStr.Length() ) + { + infoArray->AddLabelAndTextL( R_MESSAGE_INFO_DATE_LABEL, dateStr ); + } + + //Time ------------------------------------------------------------------ + if( timeStr.Length() ) + { + infoArray->AddLabelAndTextL( R_MESSAGE_INFO_TIME_LABEL, timeStr ); + } + + CleanupStack::PopAndDestroy( 2 ); //tmpDateString, tmpTimeString + + + //Type ---------------------------------------------------------------------- + if( aFieldData.iType.Length() ) + { + infoArray->AddLabelAndTextL( R_MESSAGE_INFO_TYPE_LABEL, aFieldData.iType ); + } + + + //Size ---------------------------------------------------------------------- + switch( iMessageType ) + { + case EEmailViewer: + case EEmailEditor: + case EMmsViewer: + case EMmsEditor: + //deliberate fall through + if( aFieldData.iSize.Length() ) + { + infoArray->AddLabelAndTextL( R_MESSAGE_INFO_SIZE_LABEL, aFieldData.iSize ); + } + break; + default: + break; + }; + + + //To ---------------------------------------------------------------------- + switch( iMessageType ) + { + case ESmsViewer: + case EBiosViewer: + //deliberate fall through + break; + case EEmailEditor: + case ESmsEditor: + case EBiosEditor: + case EMmsViewer: + case EMmsEditor: + //deliberate fall through + //All editors and mms viewer show always "To" label is "aFieldData.iTo" empty or not + infoArray->AddLabelAndTextL( R_MESSAGE_INFO_TO_LABEL, aFieldData.iTo ); + break; + default: + if( aFieldData.iTo.Length() ) + { + infoArray->AddLabelAndTextL( R_MESSAGE_INFO_TO_LABEL, aFieldData.iTo ); + } + break; + }; + + //Cc ---------------------------------------------------------------------- + switch( iMessageType ) + { + case EEmailViewer: + case EEmailEditor: + case EMmsViewer: + case EMmsEditor: + //deliberate fall through + if( aFieldData.iCC.Length() ) + { + infoArray->AddLabelAndTextL( R_MESSAGE_INFO_CC_LABEL, aFieldData.iCC ); + } + break; + default: + break; + }; + + //Bcc ---------------------------------------------------------------------- + switch( iMessageType ) + { + case EEmailViewer: + case EEmailEditor: + case EMmsEditor: + //deliberate fall through + if( aFieldData.iBCC.Length() ) + { + infoArray->AddLabelAndTextL( R_MESSAGE_INFO_BCC_LABEL, aFieldData.iBCC ); + } + break; + default: + break; + }; + + + // ------------------------------------------------------------------------- + + CleanupStack::Pop(); //infoArray + iListBox->UseLogicalToVisualConversion(EFalse); + iListBox->Model()->SetItemTextArray( infoArray ); //owns the array + } + + +// --------------------------------------------------------- +// CMsgInfoMessageInfoDialog::SetTitleL +// Set up the title. +// --------------------------------------------------------- +// +void CMsgInfoMessageInfoDialog::SetTitleL( CAknPopupList* aPopupList ) const + { + if( aPopupList != NULL) + { + HBufC* title = CEikonEnv::Static()->AllocReadResourceLC( R_MESSAGE_INFO_TITLE ); + aPopupList->SetTitleL( *title ); + CleanupStack::PopAndDestroy(); //title + } + } + + +// --------------------------------------------------------- +// Convert between arabic-indic digits and european digits based on existing language setting. +// So it'll convert any digit from the string +// to use either european digits or arabic-indic digits based on current settings. +// @param aFieldString: Data buffer used in conversion. +// @param aFieldData: Return converted data in this parameter. +// --------------------------------------------------------- +// +void CMsgInfoMessageInfoDialog::DoNumberConversionL( HBufC* aFieldString, TPtrC& aFieldData ) const + { + if( aFieldString != NULL) + { + TPtr tmpPtr = aFieldString->Des(); + if ( tmpPtr.Length() > 0 ) + { + AknTextUtils::DisplayTextLanguageSpecificNumberConversion( tmpPtr ); + } + aFieldData.Set( tmpPtr ); + } + else + { + aFieldData.Set(KNullString); + } + } + + +// --------------------------------------------------------- +// Creates formatted date and time strings and return these strings in parameters +// aDateBuf and aTimeBuf. Function get UTC time in parameter aUTCtime and +// constructs date and time strings with this UTC time value. +// @param aUTCtime: UTC time used in time conversion. +// @param aDateBuf: Return date string after time conversion. +// @param aTimeBuf: Return time string after time conversion. +// +// --------------------------------------------------------- +// +void CMsgInfoMessageInfoDialog::GetFormattedTimeAndDateStringsL( TTime& aUTCtime, + TDes& aDateBuf, + TDes& aTimeBuf ) + { + TLocale locale; + + // If home daylight saving in effect, add one hour offset. + if ( locale.QueryHomeHasDaylightSavingOn() ) + { + TTimeIntervalHours daylightSaving( 1 ); + aUTCtime+=daylightSaving; + } + + //Set date and time + HBufC* dateFormat = CEikonEnv::Static()->AllocReadResourceLC( R_QTN_DATE_USUAL_WITH_ZERO );//from avkon resources + aUTCtime.FormatL( aDateBuf, *dateFormat ); + CleanupStack::PopAndDestroy();//dateFormat + + HBufC* timeFormat = CEikonEnv::Static()->AllocReadResourceLC( R_QTN_TIME_USUAL_WITH_ZERO );//from avkon resources + aUTCtime.FormatL( aTimeBuf, *timeFormat ); + CleanupStack::PopAndDestroy();//timeFormat + } + + +// End of file