--- a/emailuis/emailui/src/FreestyleEmailUiMailViewerRichText.cpp Mon Mar 15 12:39:10 2010 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,2267 +0,0 @@
-/*
-* Copyright (c) 2007 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: FreestyleEmailUi mail viewer rich text implementation
-* Version : %version: e003sa37#49 %
-*
-*/
-
-
-// SYSTEM INCLUDES
-#include "emailtrace.h"
-#include <AknUtils.h>
-#include <freestyleemailui.mbg>
-#include <FreestyleEmailUi.rsg>
-#include <StringLoader.h>
-#include <AknBidiTextUtils.h>
-//<cmail>
-#include "fstextviewer.h"
-#include "fsrichtext.h"
-#include "cfsmailmessagepart.h"
-#include "cfsmailclient.h"
-#include "cfsmailcommon.h"
-//</cmail>
-#include <txtfrmat.h>
-// <cmail> SF
-#include <alf/alftextvisual.h>
-// </cmail>
-//<cmail> Platform layout changes
-#include <aknlayoutscalable_apps.cdl.h>
-#include <layoutmetadata.cdl.h>
-//</cmail> Platform layout changes
-
-// for fonts
-#include <AknFontAccess.h>
-#include <AknLayoutFont.h>
-
-// <cmail> separator line
-#include <w32std.h>
-#include <coecntrl.h>
-// </cmail> separator line
-
-// INTERNAL INCLUDES
-#include "FreestyleEmailUiMailViewerRichText.h"
-#include "FreestyleEmailUiAppui.h"
-#include "FreestyleEmailUiConstants.h"
-#include "FreestyleEmailUiLiterals.h"
-#include "FreestyleEmailUiFileSystemInfo.h"
-#include "FreestyleEmailUi.hrh"
-#include "FreestyleEmailUiTextureManager.h"
-#include "FreestyleEmailUiUtilities.h"
-#include "FreestyleEmailUiLayoutHandler.h"
-#include "FreestyleEmailUiMailViewerConstants.h"
-#include "ncsconstants.h" // for KSentLineDateAndTimeSeparatorText
-
-
-// CONST VALUES
-static const TInt KHotspotHighlightOn = 1;
-// Max hotspot count is a maximum number of hotspots allowed to be placed into
-// fs_generic text viewer component.
-static const TInt KMaxHotspotCount = 300;
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::NewL
-// -----------------------------------------------------------------------------
-CFSEmailUiMailViewerRichText* CFSEmailUiMailViewerRichText::NewL(
- CFreestyleEmailUiAppUi& aAppUi )
- {
- FUNC_LOG;
- CFSEmailUiMailViewerRichText* self =
- CFSEmailUiMailViewerRichText::NewLC( aAppUi );
- CleanupStack::Pop( self );
- return self;
- }
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::NewLC
-// -----------------------------------------------------------------------------
-CFSEmailUiMailViewerRichText* CFSEmailUiMailViewerRichText::NewLC(
- CFreestyleEmailUiAppUi& aAppUi )
- {
- FUNC_LOG;
- CFSEmailUiMailViewerRichText* self =
- new (ELeave) CFSEmailUiMailViewerRichText( aAppUi );
- CleanupStack::PushL( self );
- self->ConstructL();
- return self;
- }
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::ConstructL
-// -----------------------------------------------------------------------------
-void CFSEmailUiMailViewerRichText::ConstructL()
- {
- FUNC_LOG;
-
- CEikonEnv* env = CEikonEnv::Static();
- iViewerRichText = CFsRichText::NewL( env->SystemParaFormatLayerL(),
- env->SystemCharFormatLayerL() );
-
- }
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::CFSEmailUiMailViewerRichText
-// -----------------------------------------------------------------------------
-CFSEmailUiMailViewerRichText::CFSEmailUiMailViewerRichText(
- CFreestyleEmailUiAppUi& aAppUi )
- : iAppUi( aAppUi )
- {
- FUNC_LOG;
- }
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::~CFSEmailUiMailViewerRichText
-// -----------------------------------------------------------------------------
-CFSEmailUiMailViewerRichText::~CFSEmailUiMailViewerRichText()
- {
- FUNC_LOG;
- delete iViewerRichText;
-
- iFontsArray.ResetAndDestroy();
-
- iViewerHeadingHotSpotData.Reset();
- iBodyTextHotSpotData.Reset();
- }
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::SetHotspotByIndexL
-// -----------------------------------------------------------------------------
-// <cmail>
-void CFSEmailUiMailViewerRichText::SetHotspotByIndexL( TInt aIndex )
- {
- FUNC_LOG;
- /*TInt headingHotspotCount = iViewerHeadingHotSpotData.Count();
- TInt bodyHotspotCount = iBodyTextHotSpotData.Count();
-
- if ( iTextViewer )
- {
- if ( aIndex < headingHotspotCount )
- {
- iTextViewer->FocusLineL( iViewerHeadingHotSpotData[aIndex].iHotspotLine , EFalse );
- iTextViewer->SetCurrentHotspotByOrderL( aIndex );
- }
- else if ( (aIndex - headingHotspotCount) < bodyHotspotCount )
- {
- iTextViewer->FocusLineL( iViewerHeadingHotSpotData[headingHotspotCount - 1].iHotspotLine , ETrue );
- iTextViewer->SetCurrentHotspotByOrderL( headingHotspotCount - 1 );
- }
- }*/
- // Remove the if/elseif contents above and replace them with the commented line below, once it becomes available in fs_generic
- iTextViewer->SetCurrentHotspotByOrderL( aIndex, ETrue );
- }
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::CurrentHotspotIndexL
-// -----------------------------------------------------------------------------
-TInt CFSEmailUiMailViewerRichText::CurrentHotspotIndexL()
- {
- FUNC_LOG;
- /*TInt hotspotIndex(0);
-
- if ( iTextViewer )
- {
- TInt start(0);
- TInt end(0);
- TInt headingHotspotCount = iViewerHeadingHotSpotData.Count();
- TInt bodyHotspotCount = iBodyTextHotSpotData.Count();
- TBool foundHotspot = EFalse;
-
- iTextViewer->GetCurrentHotspotL( start, end );
-
- if ( headingHotspotCount > 0 )
- {
- TInt headingHotspotEnd = iViewerHeadingHotSpotData[ headingHotspotCount-1 ].iEnd;
- if ( start < headingHotspotEnd )
- {
- for ( TInt i = 0; i < headingHotspotCount; ++i)
- {
- if ( iViewerHeadingHotSpotData[i].iStart == start )
- {
- foundHotspot = ETrue;
- hotspotIndex = i;
- break;
- }
- }
- }
- }
-
- if ( !foundHotspot )
- {
- for ( TInt i = 0; i < bodyHotspotCount; ++i)
- {
- if ( iBodyTextHotSpotData[i].iStartPos + iHeaderLength == start )
- {
- hotspotIndex = i + headingHotspotCount;
- break;
- }
- }
- }
- }
-
- return hotspotIndex;*/
-
- return iTextViewer->GetCurrentHotspotByOrder();
- }
-// </cmail>
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::EmailStatusIconLine
-// -----------------------------------------------------------------------------
-TInt CFSEmailUiMailViewerRichText::EmailStatusIconLine()
- {
- FUNC_LOG;
- return iEmailStatusIconLine;
- }
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::FollowupIconLine
-// -----------------------------------------------------------------------------
-TInt CFSEmailUiMailViewerRichText::FollowupIconLine()
- {
- FUNC_LOG;
- return iFollowupIconLine;
- }
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::RefreshRichTextL
-// -----------------------------------------------------------------------------
-void CFSEmailUiMailViewerRichText::RefreshRichTextL( CFsTextViewer& aTextViewer,
- CFSMailMessage& aMessage,
- CFSMailBox& aMailBox )
- {
- FUNC_LOG;
-
- Reset();
-
- // Save new pointers
- iTextViewer = &aTextViewer;
- iMessage = &aMessage;
- iMailBox = &aMailBox;
-
- // Reconstruct the whole rich text
- // line by line according to information found from current message
- AppendFromLineL( *iMessage, iHeaderLineInfo );
- AppendRecipientLinesL( *iMessage, iHeaderLineInfo, EViewerRecipientTypeTo );
- AppendRecipientLinesL( *iMessage, iHeaderLineInfo, EViewerRecipientTypeCc );
-
- // show bcc field only if opened from sent folder
- TFSMailMsgId currentMessageFolderId = iMessage->GetFolderId();
- CFSMailFolder* currentFolder = NULL;
-
- TRAP_IGNORE( currentFolder = iAppUi.GetMailClient()->GetFolderByUidL(
- iMessage->GetMailBoxId(), currentMessageFolderId ) );
-
- CleanupStack::PushL( currentFolder );
- if ( currentFolder && currentFolder->GetFolderType() == EFSSentFolder )
- {
- AppendRecipientLinesL( *iMessage, iHeaderLineInfo, EViewerRecipientTypeBcc );
- }
- CleanupStack::PopAndDestroy( currentFolder );
-
- AppendSentLineL( *iMessage, iHeaderLineInfo );
-
- AppendSubjectLinesL( *iMessage, iHeaderLineInfo );
- AppendHtmlTextLineL( *iMessage, iHeaderLineInfo );
- AppendAttachmentLinesL( *iMessage, iHeaderLineInfo );
-
- // Append little bit of vertical space before the header area ends.
- InsertTransparentSpacingIconL( EBottomMostSpace );
-
- // <cmail> separator line
- AppendSeparatorLineL();
- // </cmail> separator line
-
- // Add the upmost space also just before the body text.
- InsertTransparentSpacingIconL( ETopMostSpace );
-
- // Save the total header lenght in characters
- iHeaderLength = iViewerRichText->DocumentLength();
-
- // Add body text
- AppendInitialBodytextLinesL( *iMessage );
- }
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::Reset
-// -----------------------------------------------------------------------------
-void CFSEmailUiMailViewerRichText::Reset()
- {
- FUNC_LOG;
-
- // reset all the data
- iTextViewer = NULL;
- iMessage = NULL;
- iMailBox = NULL;
-
- iViewerRichText->Reset();
- iViewerHeadingHotSpotData.Reset();
- iBodyTextHotSpotData.Reset();
- iStatusLayout = NULL;
- iStatusVisual = NULL;
-
- iHeaderLength = 0;
- iHeaderLineInfo.iHeaderLineCount = 0;
- iHeaderLineInfo.iToLineCount = 0;
- iHeaderLineInfo.iCcLineCount = 0;
- iHeaderLineInfo.iSubjectLineCount = 0;
-
- iAttachmentHotSpotIndex = KErrNotFound;
- iViewHtmlHotSpotIndex = KErrNotFound;
- }
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::RichText
-// -----------------------------------------------------------------------------
-CFsRichText& CFSEmailUiMailViewerRichText::RichText()
- {
- FUNC_LOG;
- return *iViewerRichText;
- }
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::SentTextLine
-// -----------------------------------------------------------------------------
-TInt CFSEmailUiMailViewerRichText::SentTextLine() const
- {
- FUNC_LOG;
- return iSentTextLine;
- }
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::SubjectTextLine
-// -----------------------------------------------------------------------------
-TInt CFSEmailUiMailViewerRichText::SubjectTextLine() const
- {
- FUNC_LOG;
- return iSubjectTextLine;
- }
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::AttachmentTextLine
-// -----------------------------------------------------------------------------
-TInt CFSEmailUiMailViewerRichText::AttachmentTextLine() const
- {
- FUNC_LOG;
- TInt line = KErrNotFound;
- if ( iAttachmentHotSpotIndex >= 0 &&
- iAttachmentHotSpotIndex < iViewerHeadingHotSpotData.Count() )
- {
- line = iViewerHeadingHotSpotData[ iAttachmentHotSpotIndex ].iHotspotLine;
- }
- return line;
- }
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::ViewHtmlTextLine
-// -----------------------------------------------------------------------------
-TInt CFSEmailUiMailViewerRichText::ViewHtmlTextLine() const
- {
- FUNC_LOG;
- TInt line = KErrNotFound;
- if ( iViewHtmlHotSpotIndex >= 0 &&
- iViewHtmlHotSpotIndex < iViewerHeadingHotSpotData.Count() )
- {
- line = iViewerHeadingHotSpotData[ iViewHtmlHotSpotIndex ].iHotspotLine;
- }
- return line;
- }
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::HeaderLengthInCharacters
-// -----------------------------------------------------------------------------
-TInt CFSEmailUiMailViewerRichText::HeaderLengthInCharacters() const
- {
- FUNC_LOG;
- return iHeaderLength;
- }
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::UpdateIconL
-// -----------------------------------------------------------------------------
-void CFSEmailUiMailViewerRichText::UpdateIconL( TViewerIconType aViewerIconType )
- {
- FUNC_LOG;
- TInt place = 0;
-
-// <cmail> icons changed
-
- CFbsBitmap* imageImage = NULL;
- CFbsBitmap* mask = NULL;
- TSize newIconSize = iAppUi.LayoutHandler()->ViewerIconSize();
- TFileName iconFile;
- TFsEmailUiUtility::GetFullIconFileNameL( iconFile );
- // Load right icon according to type
- // Email status and follow up icons have their fixed places.
- // Spacing and indentation icons are always appended to the end of the rich text and
- // they are always transparent.
- switch ( aViewerIconType )
- {
- case EViewerEmailStatus:
- {
- TFSEmailUiTextures textureId = TFsEmailUiUtility::GetMsgIconTextureId( iMessage );
- iAppUi.FsTextureManager()->ProvideBitmapL( textureId, imageImage, mask );
- place = iEmailStatusIconPlace;
- }
- break;
- case EViewerIconFollowUp:
- {
- AknsUtils::CreateColorIconL(
- AknsUtils::SkinInstance(),
- KAknsIIDNone,
- KAknsIIDQsnIconColors,
- EAknsCIQsnIconColorsCG7,
- imageImage,
- mask,
- iconFile,
- EMbmFreestyleemailuiQgn_indi_navi_follow_up,
- EMbmFreestyleemailuiQgn_indi_navi_follow_up_mask,
- KRgbBlack );
- AknIconUtils::DisableCompression( imageImage );
- AknIconUtils::DisableCompression( mask );
- place = iFollowupIconPlace;
- }
- break;
- case EViewerIconFollowUpComplete:
- {
- AknsUtils::CreateColorIconL(
- AknsUtils::SkinInstance(),
- KAknsIIDNone,
- KAknsIIDQsnIconColors,
- EAknsCIQsnIconColorsCG7,
- imageImage,
- mask,
- iconFile,
- EMbmFreestyleemailuiQgn_indi_navi_follow_up_complete,
- EMbmFreestyleemailuiQgn_indi_navi_follow_up_complete_mask,
- KRgbBlack );
- AknIconUtils::DisableCompression( imageImage );
- AknIconUtils::DisableCompression( mask );
- place = iFollowupIconPlace;
- }
- break;
- case EViewerIconFollowUpNone:
- {
- AknIconUtils::CreateIconL( imageImage, mask, iconFile,
- EMbmFreestyleemailuiQgn_graf_cmail_blank,
- EMbmFreestyleemailuiQgn_graf_cmail_blank_mask );
- AknIconUtils::DisableCompression( imageImage );
- AknIconUtils::DisableCompression( mask );
- place = iFollowupIconPlace;
- }
- break;
- case EViewerAttachment:
- {
- AknIconUtils::CreateIconL( imageImage, mask, iconFile,
- EMbmFreestyleemailuiQgn_indi_cmail_attachment,
- EMbmFreestyleemailuiQgn_indi_cmail_attachment_mask );
- AknIconUtils::DisableCompression( imageImage );
- AknIconUtils::DisableCompression( mask );
- place = iAttachmentIconPlace;
- // Make the attachment icon a bit smaller than other icons. Shrink only the height:
- // when aspect ratio is preserved, the shrinked image will be centered within the standard width icon.
- // <cmail> Platform layout change
- //newIconSize.iHeight = newIconSize.iHeight * 3 / 4;
- // </cmail> Platform layout change
- }
- break;
- case EViewerIconIndentation:
- {
- AknIconUtils::CreateIconL( imageImage, mask, iconFile,
- EMbmFreestyleemailuiQgn_graf_cmail_blank,
- EMbmFreestyleemailuiQgn_graf_cmail_blank_mask );
- AknIconUtils::DisableCompression( imageImage );
- AknIconUtils::DisableCompression( mask );
- place = iViewerRichText->DocumentLength();
- }
- break;
- case EViewerIconSpacing:
- {
- AknIconUtils::CreateIconL( imageImage, mask, iconFile,
- EMbmFreestyleemailuiQgn_graf_cmail_blank,
- EMbmFreestyleemailuiQgn_graf_cmail_blank_mask );
- AknIconUtils::DisableCompression( imageImage );
- AknIconUtils::DisableCompression( mask );
- place = iViewerRichText->DocumentLength();
- // for spacing icon iCurrentSpacingIconSize need to be calculated beforehand
- // and set properly
- newIconSize = iCurrentSpacingIconSize;
- }
- break;
- // <cmail> separator line
- case EViewerIconSeparatorLine:
- {
- TRgb colorToFetch = iAppUi.LayoutHandler()->SeparatorLineColor();
- TSize lineSize = iAppUi.LayoutHandler()->SeparatorGraphicSizeInThisResolution();
- TInt KMyTempHigh = lineSize.iHeight;
- // Graphic elments width is too large for these rich text classes
- // and thus we have to calculate proper width by ourself.
- TInt KMyTempWidth = SeparatorLineWidth();
-
- // create a bitmap to be used off-screen
- CFbsBitmap* offScreenBitmap = new (ELeave) CFbsBitmap();
- User::LeaveIfError(offScreenBitmap->Create(TSize(KMyTempWidth,KMyTempHigh),
- iAppUi.DisplayMode()));
- CleanupStack::PushL(offScreenBitmap);
-
- mask = new (ELeave) CFbsBitmap();
- CleanupStack::PushL(mask);
-
- // create an off-screen device and context
- CGraphicsContext* bitmapContext=NULL;
- CFbsBitmapDevice* bitmapDevice = CFbsBitmapDevice::NewL(offScreenBitmap);
- CleanupStack::PushL(bitmapDevice);
- User::LeaveIfError(bitmapDevice->CreateContext(bitmapContext));
- CleanupStack::PushL(bitmapContext);
-
- TRect rect(0,0,KMyTempWidth,KMyTempHigh);
- bitmapContext->SetBrushColor(colorToFetch);
- bitmapContext->SetBrushStyle(CGraphicsContext::ESolidBrush);
- bitmapContext->SetPenColor(colorToFetch);
- bitmapContext->DrawRect(rect);
-
- imageImage = offScreenBitmap;
- AknIconUtils::DisableCompression( imageImage );
- place = iViewerRichText->DocumentLength();
- newIconSize = TSize( KMyTempWidth,KMyTempHigh);
- // cleanup
- CleanupStack::PopAndDestroy(2);
- CleanupStack::Pop(2);
- }
- break;
- // </cmail> separator line
- default:
- {
- User::Leave( KErrNotSupported );
- }
- break;
- }
-// </cmail>
-
- AknIconUtils::SetSize( imageImage, newIconSize, EAspectRatioPreserved );
- AknIconUtils::SetSize( mask, newIconSize, EAspectRatioPreserved );
-
- // Create picture object, which takes ownership of bitmaps
- CleanupStack::PushL( imageImage );
- CleanupStack::PushL( mask );
- CMyPicture* picture = new ( ELeave ) CMyPicture( newIconSize, *imageImage, *mask );
- CleanupStack::Pop( mask );
- CleanupStack::Pop( imageImage );
-
- CleanupStack::PushL( picture );
-
- // remove old picture if there is one.
- if ( place < iViewerRichText->DocumentLength() )
- {
- iViewerRichText->DeleteL( place, 1 );
- }
-
- // Insert header object to the right spot
- TPictureHeader header;
- header.iPicture = TSwizzle<CPicture>( picture );
- CleanupStack::Pop( picture ); // The following call will always take the ownership of the picture pointed in the header. Not only when succesful.
- iViewerRichText->InsertL( place, header );
- }
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::FindCurrentHeaderHotSpotL
-// -----------------------------------------------------------------------------
-TBool CFSEmailUiMailViewerRichText::FindCurrentHeaderHotSpotL( SViewerHeadingHotSpotData& aCurrentHotSpot ) const
- {
- FUNC_LOG;
- TBool foundHotSpot = EFalse;
- TInt start(0);
- TInt end(0);
- if ( iTextViewer )
- {
- iTextViewer->GetCurrentHotspotL( start, end );
- TInt headingHotSpotCount = iViewerHeadingHotSpotData.Count();
- if ( headingHotSpotCount > 0 )
- {
- TInt headingHotspotEnd = iViewerHeadingHotSpotData[ headingHotSpotCount-1 ].iEnd;
- if ( start < headingHotspotEnd )
- {
- for ( TInt i = 0 ; i < headingHotSpotCount ; i++ )
- {
- if ( iViewerHeadingHotSpotData[ i ].iStart == start )
- {
- aCurrentHotSpot = iViewerHeadingHotSpotData[ i ];
- foundHotSpot = ETrue;
- break;
- }
- }
- }
- }
- }
- return foundHotSpot;
- }
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::FindCurrentBodyHotSpotL
-// -----------------------------------------------------------------------------
-TBool CFSEmailUiMailViewerRichText::FindCurrentBodyHotSpotL( CFindItemEngine::SFoundItem& aCurrentHotSpot ) const
- {
- FUNC_LOG;
- TBool foundHotSpot = EFalse;
- TInt start(0);
- TInt end(0);
- if ( iTextViewer )
- {
- iTextViewer->GetCurrentHotspotL( start, end );
- for ( TInt a = 0 ; a < iBodyTextHotSpotData.Count() ; a++ )
- {
- if ( start == iBodyTextHotSpotData[a].iStartPos + iHeaderLength )
- {
- aCurrentHotSpot = iBodyTextHotSpotData[a];
- foundHotSpot = ETrue;
- break;
- }
- }
- }
- return foundHotSpot;
- }
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::FindCurrentHotSpotL
-// -----------------------------------------------------------------------------
-THotspotType CFSEmailUiMailViewerRichText::FindCurrentHotSpotL(
- SViewerHeadingHotSpotData& aHeaderHotspot,
- CFindItemEngine::SFoundItem& aBodyHotspot ) const
- {
- FUNC_LOG;
- THotspotType retVal = ENoHotspot;
- if ( FindCurrentHeaderHotSpotL( aHeaderHotspot ) )
- {
- retVal = EHeaderHotspot;
- }
- else if ( FindCurrentBodyHotSpotL( aBodyHotspot ) )
- {
- retVal = EBodyHotspot;
- }
- return retVal;
- }
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::GetHotspotTextLC, heading hotspots
-// -----------------------------------------------------------------------------
-HBufC* CFSEmailUiMailViewerRichText::GetHotspotTextLC(
- const SViewerHeadingHotSpotData& aHotSpot ) const
- {
- FUNC_LOG;
- TInt hotspotTextLength = aHotSpot.iEnd - aHotSpot.iStart;
- if ( aHotSpot.iEnd == aHotSpot.iStart ) // check for special case
- {
- hotspotTextLength = 1;
- }
-
- return GetHotspotTextLC( aHotSpot.iStart, hotspotTextLength );
- }
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::GetHotspotTextLC, body text hotspots
-// -----------------------------------------------------------------------------
-HBufC* CFSEmailUiMailViewerRichText::GetHotspotTextLC(
- const CFindItemEngine::SFoundItem& /*aHotSpot*/ ) const
- {
- FUNC_LOG;
- HBufC* hotspotText = iTextViewer->GetCurrentHotspotTextL();
- CleanupStack::PushL( hotspotText );
- return hotspotText;
- }
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::GetEmailAddressLC
-// -----------------------------------------------------------------------------
-HBufC* CFSEmailUiMailViewerRichText::GetEmailAddressLC(
- const SViewerHeadingHotSpotData& aCurrentHotSpot ) const
- {
- FUNC_LOG;
- HBufC* emailAddress = NULL;
- if( aCurrentHotSpot.iType == ETypeFromAddressDisplayName )
- {
- CFSMailAddress* mailAddressObject = iMessage->GetSender();
- emailAddress = mailAddressObject->GetEmailAddress().AllocLC();
- }
- else if( aCurrentHotSpot.iType == ETypeToAddressDisplayName )
- {
- RPointerArray<CFSMailAddress>& addressArray = iMessage->GetToRecipients();
- emailAddress = addressArray[aCurrentHotSpot.iDisplayNameArrayIndex]->GetEmailAddress().AllocLC();
- }
- else if( aCurrentHotSpot.iType == ETypeCcAddressDisplayName )
- {
- RPointerArray<CFSMailAddress>& addressArray = iMessage->GetCCRecipients();
- emailAddress = addressArray[aCurrentHotSpot.iDisplayNameArrayIndex]->GetEmailAddress().AllocLC();
- }
- else if( aCurrentHotSpot.iType == ETypeBccAddressDisplayName )
- {
- RPointerArray<CFSMailAddress>& addressArray = iMessage->GetBCCRecipients();
- emailAddress = addressArray[aCurrentHotSpot.iDisplayNameArrayIndex]->GetEmailAddress().AllocLC();
- }
- else if( aCurrentHotSpot.iType == ETypeEmailAddress )
- {
- emailAddress = GetHotspotTextLC( aCurrentHotSpot );
- }
- else
- {
- User::Leave( KErrNotSupported );
- }
- return emailAddress;
- }
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::GetHeaderHotspotEmailAddressLC
-// -----------------------------------------------------------------------------
-HBufC* CFSEmailUiMailViewerRichText::GetHeaderHotspotEmailAddressLC(
- const SViewerHeadingHotSpotData& aCurrentHeaderHotSpotData ) const
- {
- FUNC_LOG;
- return GetEmailAddressLC( aCurrentHeaderHotSpotData );
- }
-
-
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::AppendRecipientIndetationL
-// -----------------------------------------------------------------------------
-void CFSEmailUiMailViewerRichText::AppendRecipientIndetationL()
- {
- FUNC_LOG;
- // add transparent indentation icon here, to get right indentation in pixels
- UpdateIconL( EViewerIconIndentation );
- }
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::AppendNewLineL
-// -----------------------------------------------------------------------------
-void CFSEmailUiMailViewerRichText::AppendNewLineL()
- {
- FUNC_LOG;
- AppendFormattedTextL( KLineFeed, EViewerFontText );
- }
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::AppendSpaceL
-// -----------------------------------------------------------------------------
-void CFSEmailUiMailViewerRichText::AppendSpaceL()
- {
- FUNC_LOG;
- AppendFormattedTextL( KSpace, EViewerFontText );
- }
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::ClipHeaderInfoToFitLC
-// -----------------------------------------------------------------------------
-//<cmail>
-HBufC* CFSEmailUiMailViewerRichText::ClipHeaderInfoToFitLC( const TDesC& aText, TBool aIsDisplayName )
- {
- FUNC_LOG;
- // Clip to fit in available amouth of pixels
- const CAknLayoutFont* textNameFont = GetCorrectFontL( EViewerFontHotspotNormal );
- // <cmail> Platform layout change
- TInt textWidthInPixels = HeaderIndentedTextAreaWidth( EFalse );
- // </cmail> Platform layout change
- // create new descriptor for the clipped text.
- HBufC* textBuffer = aText.AllocLC();
- // Drop out unwanted characters from display name such as <> and ""
- if ( aIsDisplayName && textBuffer )
- {
- TFsEmailUiUtility::StripDisplayName( *textBuffer );
- textWidthInPixels -= iAppUi.LayoutHandler()->ViewerIconSize().iWidth;
- }
- TPtr textBufferModDes = textBuffer->Des();
- AknTextUtils::ClipToFit( textBufferModDes, *textNameFont, textWidthInPixels );
- return textBuffer;
- }
-//</cmail>
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::HeaderIndentedTextAreaWidth
-// -----------------------------------------------------------------------------
-TInt CFSEmailUiMailViewerRichText::HeaderIndentedTextAreaWidth( const TBool aAddExtra ) const
- {
- FUNC_LOG;
- // For some reason, the ratioanally calculated text width seems to be a bit
- // wider than the width where GenericTextViewer does line wrapping. Reserve
- // some extra pixels to overcome this. Maybe there is some difference in
- // the ways the text width is calculated?
- // <cmail> Platform layout change
- //const TInt KExtraPixels = 10;
- TInt extraPixels( 10 );
- if ( aAddExtra )
- {
- const CAknLayoutFont* newFont = NULL;
- TRAP_IGNORE( newFont = GetCorrectFontL( EViewerFontText ) );
- if ( newFont )
- {
- TOpenFontMetrics fontMetrics;
- newFont->GetFontMetrics( fontMetrics );
- extraPixels = fontMetrics.MaxWidth();
- }
- }
- // </cmail> Platform layout change
-
- TRect screenRect = iTextViewer->GetControl()->DisplayArea();
-
- TInt recipientIndenInpixels = iAppUi.LayoutHandler()->ViewerIndentationIconSize().iWidth;
- TInt scrollBarBreadth = CEikScrollBar::DefaultScrollBarBreadth();
-
- // Calculate space left for actual text
- TInt rightMargin = iAppUi.LayoutHandler()->ViewerRightMarginInPixels() + scrollBarBreadth;
- TInt leftMargin = iAppUi.LayoutHandler()->ViewerLeftMarginInPixels();
- TInt textWidthInPixels = screenRect.iBr.iX - recipientIndenInpixels - rightMargin - leftMargin - extraPixels;
-
- return textWidthInPixels;
- }
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::AppendFromLineL
-// -----------------------------------------------------------------------------
-void CFSEmailUiMailViewerRichText::AppendFromLineL( CFSMailMessage& aMessagePtr,
- SMailMsgHeaderInfo& aHeaderInfo )
- {
- FUNC_LOG;
-
- // Add the upmost space before the header information
- InsertTransparentSpacingIconL( ETopMostSpace );
-
- CFSMailAddress* fromAddress = aMessagePtr.GetSender();
- if ( fromAddress )
- {
- // Append "from:" text
- HBufC* fromHeadingText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_VIEWER_FROM );
- AppendFormattedTextL( *fromHeadingText, EViewerFontTitle );
- CleanupStack::PopAndDestroy( fromHeadingText );
-
- // Append new line
- AppendNewLineL();
- aHeaderInfo.iHeaderLineCount++;
-
- AppendRecipientIndetationL();
-
- TDesC* displayName = &fromAddress->GetDisplayName();
- TDesC* emailAddrs = &fromAddress->GetEmailAddress();
- if ( displayName && displayName->Length() != 0 )
- {
- HBufC* clippedDisplayName = ClipHeaderInfoToFitLC( *displayName, ETrue );
-
- // Append display name and hotspot
- InsertHotspotTextAndFontL( *clippedDisplayName );
-
- // Add hotspot information to rich text and hotspot data to header hotspots array
- TInt hotSpotLength = clippedDisplayName->Length();
- iViewerRichText->SetHotSpotL( iRichTextDocumentLength, hotSpotLength, KHotspotHighlightOn );
- SViewerHeadingHotSpotData hsData;
- hsData.iType = ETypeFromAddressDisplayName;
- hsData.iStart = iRichTextDocumentLength;
- hsData.iEnd = iRichTextDocumentLength + hotSpotLength;
- hsData.iDisplayNameArrayIndex = 0;
- hsData.iHotspotLine = aHeaderInfo.iHeaderLineCount;
- iViewerHeadingHotSpotData.Append( hsData );
-
- CleanupStack::PopAndDestroy( clippedDisplayName );
-
- // Append new line
- AppendNewLineL();
- aHeaderInfo.iHeaderLineCount++;
- }
- else if ( emailAddrs && emailAddrs->Length() != 0 )
- {
- // clip emailAddress to fit in one line.
- HBufC* clippedDisplayName = ClipHeaderInfoToFitLC( *displayName, ETrue );
-
- // Append email address and hotspot
- InsertHotspotTextAndFontL( *clippedDisplayName );
- TInt hotSpotLength = clippedDisplayName->Length();
- iViewerRichText->SetHotSpotL(iRichTextDocumentLength, hotSpotLength, KHotspotHighlightOn );
- SViewerHeadingHotSpotData hsData;
- hsData.iType = ETypeEmailAddress;
- hsData.iStart = iRichTextDocumentLength;
- hsData.iEnd = iRichTextDocumentLength + hotSpotLength;
- hsData.iDisplayNameArrayIndex = 0;
- hsData.iHotspotLine = aHeaderInfo.iHeaderLineCount;
- iViewerHeadingHotSpotData.Append( hsData );
-
- CleanupStack::PopAndDestroy( clippedDisplayName );
-
- // Append new line
- AppendNewLineL();
- aHeaderInfo.iHeaderLineCount++;
- }
- }
- }
-
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::AppendRecipientsL
-// -----------------------------------------------------------------------------
-void CFSEmailUiMailViewerRichText::AppendRecipientsL(
- const RPointerArray<CFSMailAddress>& aRecipientArray, SMailMsgHeaderInfo& aHeaderInfo,
- TViewerRecipientType aRecipientType )
- {
- FUNC_LOG;
-
- TInt showAddresses(0);
- TInt recipientCount = aRecipientArray.Count();
- TInt maxRecipientCount = iAppUi.LayoutHandler()->ViewerMaxRecipientLineCount();
-
- if ( recipientCount <= maxRecipientCount )
- {
- // All recipients fit to screen
- showAddresses = recipientCount;
- }
- else
- {
- // Reserve space for additional recipients count
- showAddresses = maxRecipientCount - 1;
- }
-
- for ( TInt i = 0; i < showAddresses; i++ )
- {
- iRichTextDocumentLength = iViewerRichText->DocumentLength();
- TDesC* displayName = &( aRecipientArray[i]->GetDisplayName() );
- TDesC* emailAddrs = &( aRecipientArray[i]->GetEmailAddress() );
- if ( displayName && displayName->Length() != 0 )
- {
- AppendRecipientIndetationL();
-
- HBufC* clippedDisplayName = ClipHeaderInfoToFitLC( *displayName, ETrue );
-
- // Append display name and set hotspot data
- InsertHotspotTextAndFontL( *clippedDisplayName );
-
- iViewerRichText->SetHotSpotL( iRichTextDocumentLength, clippedDisplayName->Length(), KHotspotHighlightOn );
- SViewerHeadingHotSpotData hsData;
- switch ( aRecipientType )
- {
- case EViewerRecipientTypeCc:
- hsData.iType = ETypeCcAddressDisplayName;
- break;
- case EViewerRecipientTypeBcc:
- hsData.iType = ETypeBccAddressDisplayName;
- break;
- case EViewerRecipientTypeTo:
- default:
- hsData.iType = ETypeToAddressDisplayName;
- break;
- }
- hsData.iStart = iRichTextDocumentLength;
- hsData.iEnd = iRichTextDocumentLength + clippedDisplayName->Length();
- hsData.iDisplayNameArrayIndex = i;
- hsData.iHotspotLine = aHeaderInfo.iHeaderLineCount;
- iViewerHeadingHotSpotData.Append( hsData );
-
- CleanupStack::PopAndDestroy( clippedDisplayName );
-
- // Append new line
- AppendNewLineL();
- aHeaderInfo.iHeaderLineCount++;
- }
- else if ( emailAddrs && emailAddrs->Length() != 0 )
- {
- AppendRecipientIndetationL();
-
- // clip emailAddress to fit in one line.
- HBufC* clippedDisplayName = ClipHeaderInfoToFitLC( *displayName, ETrue );
-
- // Append email address name and set hotspot data
- InsertHotspotTextAndFontL( *clippedDisplayName );
- iViewerRichText->SetHotSpotL( iRichTextDocumentLength, clippedDisplayName->Length(), KHotspotHighlightOn );
- SViewerHeadingHotSpotData hsData;
- hsData.iType = ETypeEmailAddress;
- hsData.iStart = iRichTextDocumentLength;
- hsData.iEnd = iRichTextDocumentLength + clippedDisplayName->Length();
- hsData.iHotspotLine = aHeaderInfo.iHeaderLineCount;
- iViewerHeadingHotSpotData.Append( hsData );
-
- CleanupStack::PopAndDestroy( clippedDisplayName );
-
- // Append new line
- AppendNewLineL();
- aHeaderInfo.iHeaderLineCount++;
- }
- }
- if ( recipientCount > showAddresses )
- {
- InsertTransparentSpacingIconL( EHeaderInfoSpace );
-
- AppendRecipientIndetationL();
-
- HBufC* nMoreRecipientsText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_VIEWER_N_MORE_RECIPIENTS, recipientCount );
- // Append n more recipients address name and set hotspot data
- InsertHotspotTextAndFontL( *nMoreRecipientsText );
- iViewerRichText->SetHotSpotL(iRichTextDocumentLength, nMoreRecipientsText->Length(), KHotspotHighlightOn );
- SViewerHeadingHotSpotData hsData;
- switch ( aRecipientType )
- {
- case EViewerRecipientTypeCc:
- hsData.iType = ETypeCcNMoreRecipients;
- break;
- case EViewerRecipientTypeBcc:
- hsData.iType = ETypeBccNMoreRecipients;
- break;
- case EViewerRecipientTypeTo:
- default:
- hsData.iType = ETypeToNMoreRecipients;
- break;
- }
- hsData.iStart = iRichTextDocumentLength;
- hsData.iEnd = iRichTextDocumentLength+nMoreRecipientsText->Length();
- hsData.iHotspotLine = aHeaderInfo.iHeaderLineCount;
- iViewerHeadingHotSpotData.Append( hsData );
- // Append new line
- AppendNewLineL();
- aHeaderInfo.iHeaderLineCount++;
- CleanupStack::PopAndDestroy( nMoreRecipientsText );
- }
- }
-
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::AppendRecipientLinesL
-// -----------------------------------------------------------------------------
-void CFSEmailUiMailViewerRichText::AppendRecipientLinesL( CFSMailMessage& aMessagePtr,
- SMailMsgHeaderInfo& aHeaderInfo, TViewerRecipientType aRecipientType )
- {
- FUNC_LOG;
-
- RPointerArray<CFSMailAddress>* mailAddressArray = NULL;
- HBufC* headingText = NULL;
- switch ( aRecipientType )
- {
- case EViewerRecipientTypeTo:
- {
- mailAddressArray = &aMessagePtr.GetToRecipients(); // ownership is not transfered.
- headingText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_VIEWER_TO );
- }
- break;
- case EViewerRecipientTypeCc:
- {
- mailAddressArray = &aMessagePtr.GetCCRecipients(); // ownership is not transfered.
- headingText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_VIEWER_CC );
- }
- break;
- case EViewerRecipientTypeBcc:
- {
- mailAddressArray = &aMessagePtr.GetBCCRecipients(); // ownership is not transfered.
- headingText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_VIEWER_BCC );
- }
- break;
- default:
- {
- // nothing here.
- }
- break;
- }
-
- if ( mailAddressArray && mailAddressArray->Count() )
- {
- // Add vertical empty space between last recipient and new heading info text
- InsertTransparentSpacingIconL( EHeaderInfoSpace );
-
- AppendFormattedTextL( *headingText, EViewerFontTitle );
-
- AppendNewLineL();
- aHeaderInfo.iHeaderLineCount++;
-
- // Append the recipients
- AppendRecipientsL( *mailAddressArray, aHeaderInfo, aRecipientType );
- }
-
- // cleanup if heading text was created
- if ( headingText )
- {
- CleanupStack::PopAndDestroy( headingText );
- }
-
- }
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::AppendSentLineL
-// -----------------------------------------------------------------------------
-void CFSEmailUiMailViewerRichText::AppendSentLineL( CFSMailMessage& aMessagePtr,
- SMailMsgHeaderInfo& aHeaderInfo )
- {
- FUNC_LOG;
-
- InsertTransparentSpacingIconL( EHeaderInfoSpace );
-
- // Save "Sent ..." text line number for initial focus setting
- iSentTextLine = aHeaderInfo.iHeaderLineCount;
-
- HBufC* dateText = TFsEmailUiUtility::DateTextFromMsgLC( &aMessagePtr );
- HBufC* timeText = TFsEmailUiUtility::TimeTextFromMsgLC( &aMessagePtr );
- HBufC* sentHeadingText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_VIEWER_SENT );
- HBufC* combinedSentText = sentHeadingText->ReAllocL( sentHeadingText->Length() + KSpace().Length() +
- dateText->Length() +
- KSentLineDateAndTimeSeparatorText().Length() +
- timeText->Length() );
- CleanupStack::Pop( sentHeadingText );
- CleanupStack::PushL( combinedSentText );
- TPtr combinedSentTextPtr = combinedSentText->Des();
- combinedSentTextPtr.Append( KSpace );
- combinedSentTextPtr.Append( *dateText );
- combinedSentTextPtr.Append( KSentLineDateAndTimeSeparatorText );
- combinedSentTextPtr.Append( *timeText );
-
- AppendFormattedTextL( *combinedSentText, EViewerFontSent );
-
- CleanupStack::PopAndDestroy( combinedSentText );
- CleanupStack::PopAndDestroy( timeText );
- CleanupStack::PopAndDestroy( dateText );
-
- AppendNewLineL();
- aHeaderInfo.iHeaderLineCount++;
- }
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::AppendSubjectLinesL
-// -----------------------------------------------------------------------------
-void CFSEmailUiMailViewerRichText::AppendSubjectLinesL( CFSMailMessage& aMessagePtr,
- SMailMsgHeaderInfo& aHeaderInfo )
- {
- FUNC_LOG;
- InsertTransparentSpacingIconL( EHeaderInfoSpace );
-
- // "Subject:" text
- HBufC* subjectHeadingText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_VIEWER_SUBJECT );
- AppendFormattedTextL( *subjectHeadingText, EViewerFontTitle );
- CleanupStack::PopAndDestroy( subjectHeadingText );
-
- AppendNewLineL();
- aHeaderInfo.iHeaderLineCount++;
-
- // Save "subject:" text line number for initial focus setting
- iSubjectTextLine = aHeaderInfo.iHeaderLineCount;
-
- TInt subjectLineCount = 0;
-
- // Get the subject text to modifyable buffer because truncation may be needed.
- // Use "no subject" text if not available.
- HBufC* subjectBuf = TFsEmailUiUtility::CreateSubjectTextLC( &aMessagePtr );
- TPtr subjectPtr = subjectBuf->Des();
-
- // Wrap and clip to maximum number of lines
- TInt subjectWidthInPixels = HeaderIndentedTextAreaWidth();
- TInt maxSubjectLines = iAppUi.LayoutHandler()->ViewerMaxSubjectLineCount();
- CArrayFixFlat<TPtrC>* wrappedArray = new (ELeave) CArrayFixFlat<TPtrC>( maxSubjectLines );
- CleanupStack::PushL( wrappedArray );
- CArrayFixFlat<TInt>* lineWidthArray = new (ELeave) CArrayFixFlat<TInt>( maxSubjectLines );
- CleanupStack::PushL( lineWidthArray );
- for ( TInt i = 0 ; i < maxSubjectLines ; ++i )
- {
- lineWidthArray->AppendL( subjectWidthInPixels );
- }
- //<cmail>
- const CAknLayoutFont* subjectFont = GetCorrectFontL( EViewerFontText );
-
- AknTextUtils::WrapToArrayAndClipL( subjectPtr, *lineWidthArray, *subjectFont, *wrappedArray );
- //</cmail>
- subjectLineCount = wrappedArray->Count();
-
- TInt i = 1; // indicating current subject line, starting as 1 = first line, 2 = second line
- for( ; i <= subjectLineCount ; i++ )
- {
- // Rest of the lines have no preceeding icon, just indentation
- AppendRecipientIndetationL();
-
- TPtrC temp = (*wrappedArray)[i-1];
- AppendFormattedTextL( temp, EViewerFontText );
-
- // add line break
- AppendNewLineL();
- aHeaderInfo.iHeaderLineCount++;
- aHeaderInfo.iSubjectLineCount++;
- }
-
- CleanupStack::PopAndDestroy( lineWidthArray );
- CleanupStack::PopAndDestroy( wrappedArray );
- CleanupStack::PopAndDestroy( subjectBuf );
- }
-
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::AppendMessageIconL
-// -----------------------------------------------------------------------------
-void CFSEmailUiMailViewerRichText::AppendMessageIconL()
- {
- FUNC_LOG;
- // append embedded icon.
- iEmailStatusIconPlace = iViewerRichText->DocumentLength();
- iEmailStatusIconLine = iHeaderLineInfo.iHeaderLineCount;
- UpdateIconL( EViewerEmailStatus );
- }
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::AppendFollowUpIconL
-// -----------------------------------------------------------------------------
-TBool CFSEmailUiMailViewerRichText::AppendFollowUpIconL( CFSMailMessage& aMessagePtr )
- {
- FUNC_LOG;
- TBool added = EFalse;
-
- if ( TFsEmailUiUtility::IsFollowUpSupported( *iMailBox ) )
- {
- iFollowupIconPlace = iViewerRichText->DocumentLength();
- iFollowupIconLine = iHeaderLineInfo.iHeaderLineCount;
- if ( aMessagePtr.IsFlagSet( EFSMsgFlag_FollowUpComplete ) )
- {
- UpdateIconL( EViewerIconFollowUpComplete );
- }
- else if ( aMessagePtr.IsFlagSet( EFSMsgFlag_FollowUp ) )
- {
- UpdateIconL( EViewerIconFollowUp );
- }
- else
- {
- UpdateIconL( EViewerIconFollowUpNone );
- }
- added = ETrue;
- }
-
- return added;
- }
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::AppendAttachmentIconL
-// -----------------------------------------------------------------------------
-void CFSEmailUiMailViewerRichText::AppendAttachmentIconL()
- {
- FUNC_LOG;
- // append embedded icon.
- iAttachmentIconPlace = iViewerRichText->DocumentLength();
- UpdateIconL( EViewerAttachment );
-
- InsertSpaceAfterIconL();
- }
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::AppendAttachmentLinesL
-// Append attachement(s) line to the rich text.
-// -----------------------------------------------------------------------------
-void CFSEmailUiMailViewerRichText::AppendAttachmentLinesL( CFSMailMessage& aMessagePtr, SMailMsgHeaderInfo& aHeaderInfo )
- {
- FUNC_LOG;
- if ( aMessagePtr.IsFlagSet( EFSMsgFlag_Attachments ) )
- {
- // get attachments and count
- RPointerArray<CFSMailMessagePart> attachments;
- CleanupResetAndDestroyClosePushL( attachments );
- aMessagePtr.AttachmentListL( attachments );
- TInt attachmentsCount = attachments.Count();
- HBufC* attachmentText = NULL;
- if ( attachmentsCount == 1 )
- {
- TDesC& attachmentName = attachments[0]->AttachmentNameL();
- TUint attachmentSize = attachments[0]->ContentSize(); // bytes
-
- // create size text including the unit and preceeding space character
- HBufC* sizeWithUnit = TFsEmailUiUtility::CreateSizeDescLC( attachmentSize );
- HBufC* sizeText = HBufC::NewL( sizeWithUnit->Length()+1 );
- sizeText->Des().Append( ' ' );
- sizeText->Des().Append( *sizeWithUnit );
- CleanupStack::PopAndDestroy( sizeWithUnit );
- CleanupStack::PushL( sizeText );
-
- // clip attachment name to fit in one line so that size information has enough space too.
- //<cmail>
- const CAknLayoutFont* attachmentFont = GetCorrectFontL( EViewerFontHotspotNormal );
-
- TInt attachmentTextWidthInPixels = HeaderIndentedTextAreaWidth();
- TInt sizeTextInPixels = attachmentFont->TextWidthInPixels( *sizeText );
- TInt pixelsLeftForAttachmentName = attachmentTextWidthInPixels - sizeTextInPixels;
-
- // safe check if the size information is too wide for some reason.
- if ( pixelsLeftForAttachmentName < 0 )
- {
- attachmentText = HBufC::NewL( attachmentName.Length() + sizeText->Length() );
- attachmentText->Des().Append( attachmentName );
- attachmentText->Des().Append( *sizeText );
- TPtr attachmentTextBufferModDes = attachmentText->Des();
- AknTextUtils::ClipToFit( attachmentTextBufferModDes, *attachmentFont, attachmentTextWidthInPixels );
- }
- else
- { // normal case
- HBufC* attacmentNameBuffer = attachmentName.AllocLC();
- TPtr attachmentNameBufferModDes = attacmentNameBuffer->Des();
- AknTextUtils::ClipToFit( attachmentNameBufferModDes, *attachmentFont, pixelsLeftForAttachmentName );
-
- attachmentText = HBufC::NewL( attacmentNameBuffer->Length() + sizeText->Length() );
- attachmentText->Des().Append( *attacmentNameBuffer );
- attachmentText->Des().Append( *sizeText );
- CleanupStack::PopAndDestroy( attacmentNameBuffer );
- }
- CleanupStack::PopAndDestroy( sizeText );
- }
- //</cmail>
- else if ( attachmentsCount > 1 )
- {
- TInt totalSize = 0;
- for( TInt i = 0; i < attachmentsCount ; i++ )
- {
- totalSize += attachments[i]->ContentSize();
- }
- HBufC* sizeText = TFsEmailUiUtility::CreateSizeDescLC( totalSize );
- attachmentText = StringLoader::LoadL( R_FSE_VIEWER_ATTACHMENTS_TEXT_WITH_SIZE,
- *sizeText, attachmentsCount );
- CleanupStack::PopAndDestroy( sizeText );
- }
-
- // Append attachment line to rich text if there was attachments
- if ( attachmentText )
- {
- CleanupStack::PushL( attachmentText );
-
- InsertTransparentSpacingIconL( EHeaderInfoSpace );
-
- AppendAttachmentIconL();
-
- InsertHotspotTextAndFontL( *attachmentText );
- iViewerRichText->SetHotSpotL( iRichTextDocumentLength, attachmentText->Length(), KHotspotHighlightOn );
- SViewerHeadingHotSpotData hsData;
- if ( attachmentsCount == 1 )
- {
- hsData.iType = ETypeAttachment;
- }
- else
- {
- hsData.iType = ETypeAttachments;
- }
- hsData.iStart = iRichTextDocumentLength;
- hsData.iEnd = iRichTextDocumentLength + attachmentText->Length();
- hsData.iHotspotLine = aHeaderInfo.iHeaderLineCount;
- iAttachmentHotSpotIndex = iViewerHeadingHotSpotData.Count();
- iViewerHeadingHotSpotData.Append( hsData );
- CleanupStack::PopAndDestroy( attachmentText );
-
- // Append new lines
- AppendNewLineL();
- aHeaderInfo.iHeaderLineCount++;
- }
- CleanupStack::PopAndDestroy( &attachments );
- }
- }
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::AppendHtmlTextLineL
-// Appends "View as HTML" selection hotspot to the rich text if message has HTML text part
-// -----------------------------------------------------------------------------
-void CFSEmailUiMailViewerRichText::AppendHtmlTextLineL( CFSMailMessage& aMessagePtr, SMailMsgHeaderInfo& aHeaderInfo )
- {
- FUNC_LOG;
-
- CFSMailMessagePart* htmlBodyPart = aMessagePtr.HtmlBodyPartL();
- if ( htmlBodyPart )
- {
- CleanupStack::PushL( htmlBodyPart );
-
- // Add just a little bit of vertical space before the next lines
- InsertTransparentSpacingIconL( EHeaderInfoSpace );
-
- // Indent the "View as HTML" link
- AppendRecipientIndetationL();
-
- HBufC* htmlLineText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_VIEWER_HTML );
- HBufC* clippedHtmlLine = ClipHeaderInfoToFitLC( *htmlLineText, EFalse );
-
- InsertHotspotTextAndFontL( *clippedHtmlLine );
- iViewerRichText->SetHotSpotL( iRichTextDocumentLength, clippedHtmlLine->Length(), KHotspotHighlightOn );
- SViewerHeadingHotSpotData hsData;
- hsData.iType = ETypeHtml;
- hsData.iStart = iRichTextDocumentLength;
- hsData.iEnd = iRichTextDocumentLength + htmlLineText->Length();
- hsData.iHotspotLine = iHeaderLineInfo.iHeaderLineCount;
- iViewHtmlHotSpotIndex = iViewerHeadingHotSpotData.Count();
- iViewerHeadingHotSpotData.Append( hsData );
-
- CleanupStack::PopAndDestroy( clippedHtmlLine );
- CleanupStack::PopAndDestroy( htmlLineText );
- CleanupStack::PopAndDestroy( htmlBodyPart );
-
- // Append one line feed plus little extra vertical space
- AppendNewLineL();
- aHeaderInfo.iHeaderLineCount++;
- }
- }
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::AppendInitialBodytextLinesL
-// Append body text which is found from the message to the end of the rich text.
-// If plain text body part is not found, tries to convert body from html part
-// -----------------------------------------------------------------------------
-void CFSEmailUiMailViewerRichText::AppendInitialBodytextLinesL( CFSMailMessage& aMessagePtr )
- {
- FUNC_LOG;
- CFSMailMessagePart* plainTextBodyPart = aMessagePtr.PlainTextBodyPartL();
-
- if ( plainTextBodyPart )
- {
- CleanupStack::PushL( plainTextBodyPart );
-
- TInt fetchedSize = plainTextBodyPart->FetchedContentSize();
- if ( fetchedSize > 0 )
- {
- // Limit displayed plain text body size to KPlainTextLimitationInBytes
- // currently set to 150K characters of text that should be more than enough for mobile email
- TInt bufSize = Min( fetchedSize, KPlainTextLimitationInChars );
- HBufC* plainTextData16 = HBufC::NewLC( bufSize );
-
- TPtr pointer = plainTextData16->Des();
- plainTextBodyPart->GetContentToBufferL( pointer, 0 );
-
- // Store body length
- iBodyLength = plainTextData16->Length();
-
- // append everything we have now
- AppendFormattedTextL( *plainTextData16, EViewerFontText );
-
- // Append hotspot data for content
- iBodyTextHotSpotData.Reset();
- FindBodyTextHotSpotsL( *plainTextData16 );
- CleanupStack::PopAndDestroy( plainTextData16 );
- // Make sure that text viewer is not filled with more than max
- // number of hotspot count
- TInt hotspotCount = iBodyTextHotSpotData.Count();
- if ( hotspotCount > KMaxHotspotCount )
- {
- hotspotCount = KMaxHotspotCount;
- }
- for ( TInt i=0; i < hotspotCount; i++ )
- {
- AddBodyHotsSpotWithTextFormatingL( iBodyTextHotSpotData[i] );
- }
- }
- CleanupStack::PopAndDestroy( plainTextBodyPart );
- }
- else
- {
- CFSMailMessagePart* htmlBodyPart = aMessagePtr.HtmlBodyPartL();
- if ( htmlBodyPart )
- {
- CleanupStack::PushL( htmlBodyPart );
-
- TInt fetchedBodySize = htmlBodyPart->FetchedContentSize();
- TInt wholeContentSize = htmlBodyPart->ContentSize();
- if ( fetchedBodySize == wholeContentSize )
- {
- HBufC* htmlData = HBufC::NewLC( fetchedBodySize );
- TPtr pointer = htmlData->Des();
- htmlBodyPart->GetContentToBufferL( pointer, 0 );
- HBufC* txtData = TFsEmailUiUtility::ConvertHtmlToTxtL( *htmlData );
- CleanupStack::PopAndDestroy( htmlData );
- CleanupStack::PushL( txtData );
-
- // User large fixed maximum amount of characters to append.
- // In normal cases all text is included.
- TPtrC truncatedText = txtData->Left( KPlainTextLimitationInChars );
- iBodyLength = truncatedText.Length();
- AppendFormattedTextL( truncatedText, EViewerFontText );
- // Append hotspot data for content
- iBodyTextHotSpotData.Reset();
- FindBodyTextHotSpotsL( truncatedText );
- CleanupStack::PopAndDestroy( txtData );
- // Make sure that text viewer is not filled with more than max
- // number of hotspot count
- TInt hotspotCount = iBodyTextHotSpotData.Count();
- if ( hotspotCount > KMaxHotspotCount )
- {
- hotspotCount = KMaxHotspotCount;
- }
- for ( TInt i=0; i < hotspotCount; i++ )
- {
- AddBodyHotsSpotWithTextFormatingL( iBodyTextHotSpotData[i] );
- }
- }
-
- CleanupStack::PopAndDestroy( htmlBodyPart );
- }
- }
- }
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::AppendFetchedBodytextLinesL
-// Append rest of the body text replacing "Fetching more text"
-// -----------------------------------------------------------------------------
-void CFSEmailUiMailViewerRichText::AppendFetchedBodytextLinesL( CFSMailMessage& aMessagePtr )
- {
- FUNC_LOG;
- TInt startBodyPoint = iBodyLength;
- CFSMailMessagePart* plainTextBodyPart = aMessagePtr.PlainTextBodyPartL();
- if ( plainTextBodyPart )
- {
- CleanupStack::PushL( plainTextBodyPart );
- // Fetching More text is not required any more
- SetEmptyStatusLayoutTextL();
-
- // Limit the whole data reading to KPlainTextLimitationInChars, usually this is more than
- // enough for mobile email client
- TInt fetchedSize = plainTextBodyPart->FetchedContentSize();
- TInt bufSize = Min( fetchedSize, KPlainTextLimitationInChars );
- HBufC* plainTextData16 = HBufC::NewLC( bufSize );
-
- // Get more fetched content to buffer
- TPtr pointer = plainTextData16->Des();
- plainTextBodyPart->GetContentToBufferL( pointer, 0 );
-
- // Store body length
- iBodyLength = plainTextData16->Length();
-
- // Safety check required by POP protocol. Sometimes iBodyLength changes
- // when message has been fetched. Following is added to prevent crashes related to that.
- if ( startBodyPoint > iBodyLength )
- {
- startBodyPoint = iBodyLength;
- }
-
- // Insert rest of the body text after previously added body text
- TPtrC restOfThePlainText = plainTextData16->Mid( startBodyPoint );
- InsertFormattedTextL( restOfThePlainText, EViewerFontText,
- iHeaderLength + startBodyPoint );
-
- // Find hotspots from the added body text
- TInt previousBodyHotspotCount = iBodyTextHotSpotData.Count();
- FindBodyTextHotSpotsL( restOfThePlainText );
- // Make sure that text viewer is not filled with more than max
- // number of hotspot count
- TInt hotspotCount = iBodyTextHotSpotData.Count();
- if ( hotspotCount > KMaxHotspotCount )
- {
- hotspotCount = KMaxHotspotCount;
- }
- for ( TInt i = previousBodyHotspotCount; i < hotspotCount; i++ )
- {
- iBodyTextHotSpotData[i].iStartPos += startBodyPoint;
- AddBodyHotsSpotWithTextFormatingL( iBodyTextHotSpotData[i] );
- }
-
- iTextViewer->ReloadTextL();
- CleanupStack::PopAndDestroy( plainTextData16 );
- CleanupStack::PopAndDestroy( plainTextBodyPart );
- }
-
- }
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::CreateStatusLayoutL
-// Creates status layout to display fetching more text.
-// -----------------------------------------------------------------------------
-void CFSEmailUiMailViewerRichText::CreateStatusLayoutL( TBool aSetEmptyContents /*= ETrue*/ )
- {
- FUNC_LOG;
- // ensure not created twice
- if ( !iStatusVisual && iTextViewer )
- {
- iStatusLayout = static_cast<CAlfAnchorLayout*>( iTextViewer->GetStatusLayout() );
- CAlfControl* textViewerControl = iTextViewer->GetControl();
- iStatusVisual = CAlfTextVisual::AddNewL( *textViewerControl, iStatusLayout );
- iStatusVisual->EnableShadow( EFalse );
- iStatusVisual->SetColor( iAppUi.LayoutHandler()->ViewerBodyTextColor() );
-
- TAlfTimedValue statusVisualOpacity;
- statusVisualOpacity.SetValueNow ( 1 );
- iStatusVisual->SetOpacity( statusVisualOpacity );
-
- // <cmail> Platform layout change
- /*iStatusVisual->SetTextStyle( iAppUi.LayoutHandler()->FSTextStyleFromIdL( EFSFontTypeSmallBold )->Id() );*/
- iStatusVisual->SetTextStyle( iAppUi.LayoutHandler()->FSTextStyleFromLayoutL( AknLayoutScalable_Apps::list_single_cmail_header_caption_pane_t1() ).Id() );
- // </cmail> Platform layout change
- iStatusVisual->SetAlign( EAlfAlignHCenter, EAlfAlignVTop );
-
- if ( aSetEmptyContents )
- {
- SetEmptyStatusLayoutTextL();
- }
- }
- }
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::AppendFetchingMoreTextL
-// metdod for updating the animated text while rest of the message is been fetched
-// -----------------------------------------------------------------------------
-void CFSEmailUiMailViewerRichText::AppendFetchingMoreTextL()
- {
- FUNC_LOG;
- // Create status layout if it doesn't exist yet
- CreateStatusLayoutL( EFalse );
-
- // add fetching content text with current animation
- HBufC* fetchingContentText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_VIEWER_FETCHING_CONTENT_TEXT );
-
- // create buffer for "Fetching more text" and dots animation
- HBufC* newDes = HBufC::NewLC( fetchingContentText->Length() + KTotalNumberOfLines + KTotalNumberOfLines);
- TPtr des = newDes->Des();
-
- // add KTotalNumberOfLines always at the beginning
- for( TInt i = 0 ; i < KTotalNumberOfLines / KNumberOfLines ; i++ )
- {
- des.Append( KThreeLines );
- }
-
- // append fething text
- des.Append( *fetchingContentText );
-
- // add dots according to current ellipsis count
- for( TInt i = 0 ; i < iCurrentEllipsisCount ; i++ )
- {
- des.Append( KThreeLines );
- }
-
- // ellipses count counter going through 0,1,2,3,0,1,2,3,0,... sequence
- if( iCurrentEllipsisCount >= KTotalNumberOfLines / KNumberOfLines )
- {
- iCurrentEllipsisCount = 0;
- }
- else
- {
- iCurrentEllipsisCount++;
- }
-
- // just in case, try clipping the text if it doesn't fit in one line for some reason.
- TRect screenRect = iTextViewer->GetControl()->DisplayArea();
- //<cmail>
- const CAknLayoutFont* bodyTextFont = GetCorrectFontL( EViewerFontBody );
- TInt rightMargin = iAppUi.LayoutHandler()->ViewerRightMarginInPixels();
- TInt leftMargin = iAppUi.LayoutHandler()->ViewerLeftMarginInPixels();
- TInt pixelsToFit = screenRect.iBr.iX - rightMargin - leftMargin;
- AknTextUtils::ClipToFit( des, *bodyTextFont, pixelsToFit );
- //</cmail>
-
- // Assign the text to status layout.
- iStatusVisual->SetTextL( *newDes );
- iStatusLayout->SetClipping( EFalse );
- TSize statusSize = iStatusVisual->TextExtents();
- iStatusLayout->SetSize( statusSize );
- iStatusVisual->SetRect( TRect( TPoint( 0, 0 ), statusSize ) );
- iTextViewer->UpdateStatusLayout();
-
- CleanupStack::PopAndDestroy( newDes );
- CleanupStack::PopAndDestroy( fetchingContentText );
- }
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::SetEmptyStatusLayoutTextL
-// The text in status layout is updated to contain only a couple of line feeds.
-// This ensures, that the whole body can be scrolled visible also when the
-// attachment downloading popup is shown in the bottom.
-// -----------------------------------------------------------------------------
-void CFSEmailUiMailViewerRichText::SetEmptyStatusLayoutTextL()
- {
- FUNC_LOG;
- _LIT( KEmptyStatusText, "\n " );
- if ( iStatusVisual && iStatusLayout && iTextViewer )
- {
- iStatusVisual->SetTextL( KEmptyStatusText );
- iStatusLayout->SetClipping( EFalse );
- TSize statusSize = iStatusVisual->TextExtents();
- iStatusLayout->SetSize( statusSize );
- iStatusVisual->SetRect( TRect( TPoint( 0, 0 ), statusSize ) );
- iTextViewer->UpdateStatusLayout();
- }
- }
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::SetHotspotHighlightedColorL
-// -----------------------------------------------------------------------------
-void CFSEmailUiMailViewerRichText::SetHotspotHighlightedColorL( TInt aStartIndx, TInt aLenght, TBool aHighlight )
- {
- FUNC_LOG;
- TCharFormat charFormat;
- TCharFormatMask charFormatMask;
- if ( aHighlight )
- {
- charFormat.iFontPresentation.iTextColor = SkinFontColorByType( EViewerFontHotspotHighLighted );
- }
- else
- {
- charFormat.iFontPresentation.iTextColor = SkinFontColorByType( EViewerFontHotspotNormal );
- }
-
- charFormatMask.SetAttrib( EAttColor );
- iViewerRichText->ApplyCharFormatL( charFormat, charFormatMask, aStartIndx, aLenght );
- iTextViewer->ReloadTextL();
- }
-
-// ---------------------------------------------------------------------------
-// Getter for the index of the attachment hotspot
-// ---------------------------------------------------------------------------
-TInt CFSEmailUiMailViewerRichText::AttachmentHotSpotIndex() const
- {
- FUNC_LOG;
- return iAttachmentHotSpotIndex;
- }
-
-// ---------------------------------------------------------------------------
-// Getter for the index of the View HTML hotspot
-// ---------------------------------------------------------------------------
-TInt CFSEmailUiMailViewerRichText::ViewHtmlHotSpotIndex() const
- {
- FUNC_LOG;
- return iViewHtmlHotSpotIndex;
- }
-
-// ---------------------------------------------------------------------------
-// Helper function for getting hotspot text from rich text data
-// ---------------------------------------------------------------------------
-HBufC* CFSEmailUiMailViewerRichText::GetHotspotTextLC( TInt aStartPos,
- TInt aLength ) const
- {
- FUNC_LOG;
- __ASSERT_DEBUG( aStartPos >= 0, User::Invariant() );
- __ASSERT_DEBUG( aLength > 0, User::Invariant() );
-
- HBufC* des = HBufC::NewLC( aLength );
-
- // Hotspot text is retrived in a loop, because the CPlainText::Read
- // method may return only part of the requested text
- TInt documentLength = iViewerRichText->DocumentLength();
- while ( aLength > 0 && aStartPos < documentLength )
- {
- TPtrC text = iViewerRichText->Read( aStartPos, aLength );
- des->Des().Append( text );
- aLength -= text.Length();
- aStartPos += text.Length();
- }
-
- return des;
- }
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::FindBodyTextHotSpotsL
-// -----------------------------------------------------------------------------
-void CFSEmailUiMailViewerRichText::FindBodyTextHotSpotsL( const TDesC& aBodyContent )
- {
- FUNC_LOG;
- // Use s60 find item engine to find hotspots from the body text
- CFindItemEngine* hotspotSearch = CFindItemEngine::NewL
- (
- aBodyContent,
- // define wanted
- (CFindItemEngine::TFindItemSearchCase)
- (CFindItemEngine::EFindItemSearchMailAddressBin |
- CFindItemEngine::EFindItemSearchPhoneNumberBin |
- CFindItemEngine::EFindItemSearchURLBin |
- CFindItemEngine::EFindItemSearchScheme )
- );
- CleanupStack::PushL( hotspotSearch );
-
- // <cmail>
- // insert found data to member variable iHotSpotData
- const CArrayFixFlat<CFindItemEngine::SFoundItem>* itemArray = hotspotSearch->ItemArray();
- TInt itemCount = hotspotSearch->ItemCount();
- for ( TInt i = 0; i < itemCount; i++ )
- {
- CFindItemEngine::SFoundItem* foundItem = const_cast<CFindItemEngine::SFoundItem*> ( &itemArray->At( i ) );
- TBool foundSameHotspotTwice = EFalse;
- // Check if same hotspot is found twice. This may happen when both flags
- // EFindItemSearchScheme and EFindItemSearchURLBin are ON for search request.
- for ( TInt j = i + 1; j < itemCount; j++ )
- {
- if ( foundItem->iStartPos == itemArray->At( j ).iStartPos )
- {
- foundSameHotspotTwice = ETrue;
- break;
- }
- }
- if ( !foundSameHotspotTwice )
- {
- // At this phase hotspot is one character too early
- // Change it to right place. If FindItemEngine implementation
- // will change then following line must be removed.
- //foundItem->iStartPos++;
- iBodyTextHotSpotData.AppendL( itemArray->At( i ) );
- }
- }
- // </cmail>
-
- CleanupStack::PopAndDestroy( hotspotSearch );
- }
-
-
-//<cmail>
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::GetCorrectFontL
-// -----------------------------------------------------------------------------
-const CAknLayoutFont* CFSEmailUiMailViewerRichText::GetCorrectFontL( TViewerFontType aFontType ) const
- {
- FUNC_LOG;
- /*
- EViewerFontTitle = 0,
- EViewerFontText,
- EViewerFontBody,
- EViewerFontHotspotNormal,
- EViewerFontHotspotHighLighted,
- EViewerFontSent,
- EViewerFontIndentation
- */
- const CAknLayoutFont* font = NULL;
-
- switch ( aFontType )
- {
- case EViewerFontTitle:
- case EViewerFontSent:
- {
- font = CurrentTitleFontL();
- }
- break;
- case EViewerFontText:
- case EViewerFontBody:
- case EViewerFontHotspotNormal:
- case EViewerFontHotspotHighLighted:
- case EViewerFontIndentation:
- default:
- {
- font = CurrentTextFontL();
- }
- break;
- }
-
- if (NULL == font)
- User::Leave(KErrGeneral);
-
- return font;
-
- }
-
-/*
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::ReConstructFontArrayL
-// -----------------------------------------------------------------------------
-void CFSEmailUiMailViewerRichText::ReConstructFontArrayL()
- {
- FUNC_LOG;
- iFontsArray.ResetAndDestroy();
-
- // append title font
- CAknLayoutFont* titleFont = CurrentTitleFontLC();
- iFontsArray.AppendL( titleFont );
- CleanupStack::Pop( titleFont );
-
- // append text font
- CAknLayoutFont* textFont = CurrentTextFontLC();
- iFontsArray.AppendL( textFont );
- CleanupStack::Pop( textFont );
-
- // append body font
- CAknLayoutFont* bodyFont = CurrentTextFontLC();
- iFontsArray.AppendL( bodyFont );
- CleanupStack::Pop( bodyFont );
-
- // append not highlighted hotspot font
- CAknLayoutFont* normalHotspotFont = CurrentTextFontLC();
- iFontsArray.AppendL( normalHotspotFont );
- CleanupStack::Pop( normalHotspotFont );
-
- // append highlighted hotspot font
- CAknLayoutFont* highLightedHotspotFont = CurrentTextFontLC();
- iFontsArray.AppendL( highLightedHotspotFont );
- CleanupStack::Pop( highLightedHotspotFont );
-
- // append sent line font
- CAknLayoutFont* sentLineFont = CurrentSentTextFontLC();
- iFontsArray.AppendL( sentLineFont );
- CleanupStack::Pop( sentLineFont );
-
- // append indentation font
- CAknLayoutFont* indentationFont = CurrentTextFontLC();
- iFontsArray.AppendL( indentationFont );
- CleanupStack::Pop( indentationFont );
- }
-*/
-
-/*
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::FontFromFontArray
-// -----------------------------------------------------------------------------
-CAknLayoutFont& CFSEmailUiMailViewerRichText::FontFromFontArray( TViewerFontType aFontType ) const
- {
- FUNC_LOG;
- return *iFontsArray[aFontType];
- }
-*/
-//</cmail>
-
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::SkinFontColorByType
-// -----------------------------------------------------------------------------
-TRgb CFSEmailUiMailViewerRichText::SkinFontColorByType( TViewerFontType aFontType )
- {
- FUNC_LOG;
- TRgb returnedColor;
- switch ( aFontType )
- {
- case EViewerFontTitle:
- {
- returnedColor = iAppUi.LayoutHandler()->ViewerTitleTextColor();
- }
- break;
- case EViewerFontBody:
- {
- returnedColor = iAppUi.LayoutHandler()->ViewerBodyTextColor();
- }
- break;
- case EViewerFontHotspotNormal:
- {
- returnedColor = iAppUi.LayoutHandler()->ViewerNormalHotspotTextColor();
- }
- break;
- case EViewerFontHotspotHighLighted:
- {
- returnedColor = iAppUi.LayoutHandler()->ViewerHighlightedHotspotTextColor();
- }
- break;
- case EViewerFontSent:
- {
- // <cmail>
- //returnedColor = iAppUi.LayoutHandler()->ViewerTitleFontHeight();
- returnedColor = iAppUi.LayoutHandler()->ViewerTitleTextColor();
- // </cmail>
- }
- break;
- case EViewerFontText:
- default:
- {
- returnedColor = iAppUi.LayoutHandler()->ViewerTextTextColor();
- }
- break;
- }
- return returnedColor;
- }
-
-//<cmail> LAYOUT CHANGES
-
-/*
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::CurrentTitleFontLC
-// -----------------------------------------------------------------------------
-CAknLayoutFont* CFSEmailUiMailViewerRichText::CurrentTitleFontLC()
- {
- FUNC_LOG;
- TAknLogicalFontId logicalFontId = iAppUi.LayoutHandler()->ViewerTitleFontAknLogicalFontId();
- TAknFontSpecification spec( logicalFontId );
- TInt heightInPixels = iAppUi.LayoutHandler()->ViewerTitleFontHeight();
- spec.SetTextPaneHeight( heightInPixels );
- CWsScreenDevice* dev = CCoeEnv::Static()->ScreenDevice();
- CAknLayoutFont* font = AknFontAccess::CreateLayoutFontFromSpecificationL( *dev, spec );
- CleanupStack::PushL( font );
- return font;
- }
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::CurrentTextFontLC
-// -----------------------------------------------------------------------------
-CAknLayoutFont* CFSEmailUiMailViewerRichText::CurrentTextFontLC()
- {
- FUNC_LOG;
- TAknLogicalFontId logicalFontId = iAppUi.LayoutHandler()->ViewerTextFontAknLogicalFontId();
- TAknFontSpecification spec( logicalFontId );
- TInt heightInPixels = iAppUi.LayoutHandler()->ViewerTextFontHeight();
- spec.SetTextPaneHeight( heightInPixels );
- CWsScreenDevice* dev = CCoeEnv::Static()->ScreenDevice();
- CAknLayoutFont* font = AknFontAccess::CreateLayoutFontFromSpecificationL( *dev, spec );
- CleanupStack::PushL( font );
- return font;
- }
-*/
-
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::CurrentTitleFontL
-// -----------------------------------------------------------------------------
-const CAknLayoutFont* CFSEmailUiMailViewerRichText::CurrentTitleFontL() const
- {
- FUNC_LOG;
- TRect mainPaneRect;
- AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect);
-
- TAknLayoutRect cmailPaneRect;
- cmailPaneRect.LayoutRect(mainPaneRect, AknLayoutScalable_Apps::list_cmail_pane());
-
- TAknLayoutRect labelRect;
- labelRect.LayoutRect(cmailPaneRect.Rect(), AknLayoutScalable_Apps::list_single_cmail_header_caption_pane());
-
- TAknLayoutText layoutText;
- layoutText.LayoutText(labelRect.Rect(), AknLayoutScalable_Apps::list_single_cmail_header_caption_pane_t1());
-
- const CAknLayoutFont* font = CAknLayoutFont::AsCAknLayoutFontOrNull( layoutText.Font() );
-
- //All fonts must be loaded properly? Leave if something is failing.
- if(NULL == font)
- User::Leave(KErrGeneral);
-
- return font;
-
- }
-
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::CurrentTextFontL
-// -----------------------------------------------------------------------------
-const CAknLayoutFont* CFSEmailUiMailViewerRichText::CurrentTextFontL() const
- {
- FUNC_LOG;
- TRect mainPaneRect;
- AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect);
-
- TAknLayoutRect cmailPaneRect;
- cmailPaneRect.LayoutRect(mainPaneRect, AknLayoutScalable_Apps::list_cmail_pane());
-
- //Using variety 0 -> 1 row line by default
- TAknLayoutRect labelRect;
- labelRect.LayoutRect(cmailPaneRect.Rect(), AknLayoutScalable_Apps::list_single_cmail_header_detail_pane( 0 ));
-
- TAknLayoutText layoutText;
- layoutText.LayoutText(labelRect.Rect(), AknLayoutScalable_Apps::list_single_cmail_header_detail_pane_t1( 0 ));
-
- const CAknLayoutFont* font = CAknLayoutFont::AsCAknLayoutFontOrNull( layoutText.Font() );
-
- //All fonts must be loaded properly? Leave if something is failing.
- if(NULL == font)
- User::Leave(KErrGeneral);
-
- return font;
-
- }
-
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::CurrentSentTextFontLC
-// -----------------------------------------------------------------------------
-const CAknLayoutFont* CFSEmailUiMailViewerRichText::CurrentSentTextFontL() const
- {
- return CurrentTitleFontL();
- }
-//</cmail>
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::CurrentSpacingHeight
-// -----------------------------------------------------------------------------
-TInt CFSEmailUiMailViewerRichText::CurrentSpacingHeight( TViewerSpacingIconType aSpacingIconType ) const
- {
- FUNC_LOG;
- TInt heightInPixels = 0;
- switch( aSpacingIconType )
- {
- case ETopMostSpace:
- {
- heightInPixels = iAppUi.LayoutHandler()->ViewerTopMostSpaceHeight();
- }
- break;
- case ERecipientSpace:
- {
- heightInPixels = iAppUi.LayoutHandler()->ViewerRecipientSpaceHeight();
- }
- break;
- case EHeaderInfoSpace:
- {
- heightInPixels = iAppUi.LayoutHandler()->ViewerHeaderInfoSpaceHeight();
- }
- break;
- case EBottomMostSpace:
- {
- heightInPixels = iAppUi.LayoutHandler()->ViewerBottomMostSpaceHeight();
- }
- break;
- }
- return heightInPixels;
- }
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::InsertTransparentSpacingIconL
-// -----------------------------------------------------------------------------
-void CFSEmailUiMailViewerRichText::InsertTransparentSpacingIconL( TViewerSpacingIconType aSpacingIconType )
- {
- FUNC_LOG;
- TInt currentSpace = CurrentSpacingHeight( aSpacingIconType );
- TInt fontSide = 0;
- switch ( aSpacingIconType )
- {
- case ETopMostSpace:
- case EBottomMostSpace:
- {
- TInt currentTextHeight = iAppUi.LayoutHandler()->ViewerTitleFontHeight();
- fontSide = currentSpace - currentTextHeight;
- }
- break;
- case ERecipientSpace:
- {
- TInt currentTextHeight = iAppUi.LayoutHandler()->ViewerTextFontHeight();
- fontSide = currentSpace - currentTextHeight;
- }
- break;
- case EHeaderInfoSpace:
- {
- TInt currentTextHeight = iAppUi.LayoutHandler()->ViewerTitleFontHeight();
- fontSide = currentSpace - currentTextHeight;
- }
- break;
- }
- iCurrentSpacingIconSize.SetSize( fontSide, fontSide );
-
- UpdateIconL( EViewerIconSpacing );
-
- // Add extra space before line ending so that we can modify the line height
- AppendSpaceL();
-
- AppendNewLineL();
- iHeaderLineInfo.iHeaderLineCount++;
-
- // to make the icon need less space.
- TCharFormat charFormat;
- TCharFormatMask charFormatMask;
- charFormat.iFontSpec.iHeight = CEikonEnv::Static()->ScreenDevice()->VerticalPixelsToTwips( fontSide );
- charFormat.iFontPresentation.iUnderline = EUnderlineOff;
- charFormatMask.SetAttrib( EAttFontHeight );
- charFormatMask.SetAttrib( EAttFontUnderline );
- iViewerRichText->ApplyCharFormatL( charFormat, charFormatMask, iViewerRichText->DocumentLength() - 3, 3 );
- }
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::InsertSpaceAfterIconL
-// -----------------------------------------------------------------------------
-void CFSEmailUiMailViewerRichText::InsertSpaceAfterIconL()
- {
- FUNC_LOG;
- TInt spaceInPixels = iAppUi.LayoutHandler()->ViewerPixelsBetweenMsgStatusIconAndSubject();
- iCurrentSpacingIconSize.SetSize( spaceInPixels, spaceInPixels );
- UpdateIconL( EViewerIconSpacing );
- }
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::InsertHotspotTextAndFontL
-// -----------------------------------------------------------------------------
-void CFSEmailUiMailViewerRichText::InsertHotspotTextAndFontL( const TDesC& aText )
- {
- FUNC_LOG;
- AppendFormattedTextL( aText, EViewerFontHotspotNormal );
- }
-
-// -----------------------------------------------------------------------------
-// Appends formatted text to the rich text
-// -----------------------------------------------------------------------------
-void CFSEmailUiMailViewerRichText::AppendFormattedTextL( const TDesC& aText,
- TViewerFontType aFontType )
- {
- FUNC_LOG;
- iRichTextDocumentLength = iViewerRichText->DocumentLength();
- InsertFormattedTextL( aText, aFontType, iRichTextDocumentLength );
- }
-
-// -----------------------------------------------------------------------------
-// Inserts formatted text to the rich text
-// -----------------------------------------------------------------------------
-void CFSEmailUiMailViewerRichText::InsertFormattedTextL( const TDesC& aText,
- TViewerFontType aFontType, TInt aPosition )
- {
- FUNC_LOG;
- ASSERT( aPosition >= 0 );
- ASSERT( aPosition <= iViewerRichText->DocumentLength() );
-
- // Insert text at given position
- iViewerRichText->InsertL( aPosition, aText );
-
- //<cmail>
- const CAknLayoutFont* newFont = GetCorrectFontL( aFontType );
-
- TRgb fontColor = SkinFontColorByType( aFontType );
- TFontUnderline underline = EUnderlineOff;
- if ( aFontType == EViewerFontHotspotNormal )
- {
- underline = EUnderlineOn;
- }
-
- ApplyFontToTextL( newFont, aPosition, aText.Length(), fontColor, underline );
- //</cmail>
- }
-
-//<cmail>
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::ApplyFontToTextL
-// -----------------------------------------------------------------------------
-void CFSEmailUiMailViewerRichText::ApplyFontToTextL( const CAknLayoutFont* aFont,
- TInt aStartInx,
- TInt aLength,
- TRgb& aColor,
- TFontUnderline aUnderline )
- {
- FUNC_LOG;
- TCharFormat charFormat;
- TCharFormatMask charFormatMask;
- charFormat.iFontSpec = aFont->FontSpecInTwips();
- // Applies antialiasing for all text in mail viewer.
- charFormat.iFontSpec.iFontStyle.SetBitmapType( EAntiAliasedGlyphBitmap );
- charFormat.iFontPresentation.iTextColor = aColor;
- charFormat.iFontPresentation.iUnderline = aUnderline;
- charFormatMask.SetAll();
- iViewerRichText->ApplyCharFormatL( charFormat, charFormatMask, aStartInx, aLength );
- }
-//</cmail>
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::AddBodyHotsSpotWithTextFormatingL
-// -----------------------------------------------------------------------------
-void CFSEmailUiMailViewerRichText::AddBodyHotsSpotWithTextFormatingL( const CFindItemEngine::SFoundItem& aBodyHotSpotData )
- {
- FUNC_LOG;
- iViewerRichText->SetHotSpotL( aBodyHotSpotData.iStartPos + iHeaderLength,
- aBodyHotSpotData.iLength, KHotspotHighlightOn );
-
- // add underlining and right color the the hotspots
- //<cmail>
- const CAknLayoutFont* newFont = GetCorrectFontL( EViewerFontText );
- TRgb fontColor = SkinFontColorByType( EViewerFontHotspotNormal );
-
- TFontUnderline underline = EUnderlineOn;
- ApplyFontToTextL( newFont, aBodyHotSpotData.iStartPos + iHeaderLength,
- aBodyHotSpotData.iLength, fontColor, underline );
- //</cmail>
-
- }
-
-// <cmail> separator line
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::AppendSeparatorLineL
-// Append attachement(s) line to the rich text.
-// -----------------------------------------------------------------------------
-void CFSEmailUiMailViewerRichText::AppendSeparatorLineL()
- {
- FUNC_LOG;
- UpdateIconL( EViewerIconSeparatorLine );
- }
-
-// -----------------------------------------------------------------------------
-// CFSEmailUiMailViewerRichText::SeparatorLineWidth
-// -----------------------------------------------------------------------------
-TInt CFSEmailUiMailViewerRichText::SeparatorLineWidth() const
- {
- FUNC_LOG;
- // For some reason, the ratioanally calculated text width seems to be a bit
- // wider than the width where GenericTextViewer does line wrapping. Reserve
- // some extra pixels to overcome this. Maybe there is some difference in
- // the ways the text width is calculated?
- const TInt KExtraPixels( 10 );
-
- TRect screenRect = iTextViewer->GetControl()->DisplayArea();
- TInt scrollBarBreadth = CEikScrollBar::DefaultScrollBarBreadth();
-
- // Calculate space left for actual text
- TInt rightMargin = iAppUi.LayoutHandler()->ViewerRightMarginInPixels() + scrollBarBreadth;
- TInt leftMargin = iAppUi.LayoutHandler()->ViewerLeftMarginInPixels();
- TInt widthInPixels = screenRect.iBr.iX - rightMargin - leftMargin - KExtraPixels;
-
- return widthInPixels;
- }
-
-// </cmail> separator line
-
-// End of the file
-