diff -r d189ee25cf9d -r 3533d4323edc emailuis/uicomponents/src/fstextparser.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailuis/uicomponents/src/fstextparser.cpp Wed Sep 01 12:28:57 2010 +0100 @@ -0,0 +1,1504 @@ +/* +* 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: Implementation of class CFsTextParser +* +*/ + + + +// removed __FS_ALFRED_SUPPORT flag +//#include +// removed __FS_ALFRED_SUPPORT flag +// SF +#include "emailtrace.h" +#include +// +#include +#include +// +#include +// +#include + +#include "fstextparser.h" +#include "fsrichtexttext.h" +#include "fsrichtextpicture.h" +#include "fsrichtextsmiley.h" +#include "fsrichtextnewline.h" +#include "fsrichtext.h" +#include "fsrichtextfields.h" +#include "fssmileyparser.h" +#include "fstextureloader.h" +#include "fstexture.h" +#include "fstextstylemanager.h" + + +#include "fbs.h" + + +CFsTextParser::CFsTextParser( + CFsRichText& aText, + CAlfEnv& aEnv, + CFsTextureLoader* aTextureLoader): + iText(aText), + iTextureLoader(aTextureLoader), + iEnv(aEnv), + iTextStyleManager(NULL), + iIsWordTooLong(EFalse), + iIsSetSizeOfSmiley(EFalse), + iGetCharsUsed(EFalse), + iGetCharsUsedOfNextBlock(EFalse), + iNewLineArrayIndex(0), + iLastNewLinePositionIndex(0) + { + FUNC_LOG; + + } + +CFsTextParser* CFsTextParser::NewL( + CFsRichText& aText, + CAlfEnv& aEnv, + CFsTextureLoader* aTextureLoader) + { + FUNC_LOG; + CFsTextParser * self = new(ELeave) CFsTextParser( + aText, + aEnv, + aTextureLoader ); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +CFsTextParser::~CFsTextParser() + { + FUNC_LOG; + iExpandArray.Close(); + iHotSpotArray.Close(); + iFieldLocation.Close(); + iTextureIndex.Close(); + iNewLineArray.Close(); + iLineDirection.Close(); + + delete iSmileyParser; + } + +void CFsTextParser::SetSizeOfSmile(TSize aSizeOfSmiley) + { + FUNC_LOG; + iIsSetSizeOfSmiley = ETrue; + iSizeOfSmiley = aSizeOfSmiley; + } + +void CFsTextParser::ConstructL() + { + FUNC_LOG; + iEikon = CEikonEnv::Static(); + } + +TBool CFsTextParser::SetParsingPosition( TInt aPosition ) + { + FUNC_LOG; + TBool retVal = ETrue; + + if( aPosition < 0 || aPosition >= iText.DocumentLength()) + { + retVal = EFalse; + } + else + { + iPosition = aPosition; + } + + return retVal; + } + +void CFsTextParser::MoveBack() + { + FUNC_LOG; + iPosition = iLastPosition; + } + +TInt CFsTextParser::IsWordPartOfExpandArea( + TInt aStartPosition, + TInt aEndPosition ) + { + FUNC_LOG; + TInt retVal = -1; + + for(TInt i = 0 ; i < iExpandArray.Count() ; ++i) + { + if(iExpandArray[i].iStartIndex >= aStartPosition && + iExpandArray[i].iStartIndex < aEndPosition) + { + if(-1 == retVal) + { + retVal = i; + } + else + { + if ( iExpandArray[i].iStartIndex + < iExpandArray[retVal].iStartIndex ) + { + retVal = i; + } + } + } + else if ( aStartPosition >= iExpandArray[i].iStartIndex + && aStartPosition + < iExpandArray[i].iStartIndex + iExpandArray[i].iLength ) + { + if(-1 == retVal) + { + retVal = i; + } + else + { + if ( iExpandArray[i].iStartIndex + < iExpandArray[retVal].iStartIndex ) + { + retVal = i; + } + } + } + } + return retVal; + } + + +void CFsTextParser::CutWord(TInt aBeginOfWord, TInt aNewLengthOfWord) + { + FUNC_LOG; + iIsWordTooLong = ETrue; + iPosition = aBeginOfWord; + iNewLengthOfWord = aNewLengthOfWord; + } + +// --------------------------------------------------------------------------- +// GetTextL +// --------------------------------------------------------------------------- +HBufC* CFsTextParser::GetTextL(TInt aStart, TInt aEnd) const + { + FUNC_LOG; + HBufC* retVal = HBufC::NewL( aEnd - aStart + 1 ); +// TBuf<200> someText01; + if(aStart < 0 || aEnd > iText.DocumentLength() || aEnd < aStart) + { + User::Leave(KErrArgument); + } + +// someText01.Zero(); + TPtr ptr( retVal->Des() ); + ptr.Append( iText.Read(aStart, aEnd - aStart + 1) ); + while ( ptr.Length() < aEnd - aStart + 1 ) + { + ptr.Append( iText.Read( aStart + ptr.Length(), aEnd - aStart + 1 - ptr.Length() ) ); + } +// TPtrC retVal; +// retVal.Set( someText01.Ptr(), someText01.Length() ); + return retVal; + } + +// --------------------------------------------------------------------------- +// GetTextureL +// --------------------------------------------------------------------------- +CFsTexture& CFsTextParser::GetTextureL(TInt aPos) + { + FUNC_LOG; + if(aPos > iText.DocumentLength()) + { + User::Leave(KErrArgument); + } + + const CTextField* field = iText.TextField(aPos); + + CFsTexture* retVal = NULL; + + TInt textureId; + if(!IsTexturePosition(aPos, textureId)) + { + if(KFsRichTextPictureFieldUid == field->Type()) + { + TPictureHeader header = iText.PictureHeader(aPos); + + CMyPicture* picture = + static_cast(header.iPicture.AsPtr() ); + + CFbsBitmap* bitmap = picture->GetBitmap(); + CFbsBitmap* bitmapMask = picture->GetBitmapMask(); + + CFsTexture& texture = (iTextureLoader->AppendBitmapL(bitmap, bitmapMask)); + + TTextureIndex newTextureIndex; + newTextureIndex.iPositionInText = aPos; + newTextureIndex.iTextureId = texture.Id(); + + iTextureIndex.Append(newTextureIndex); + + retVal = &texture; + } + else if(KFsRichTextSmileyFieldUid == field->Type()) + { + + TInt smileyIndex = ((CSmileyField*)(field))->GetSmileyIndex(); + + + TFileName fileName = iSmileyParser->GetSmileyFileName(smileyIndex); + + + CFsTexture& texture = iTextureLoader->LoadTextureL( fileName ); + + TTextureIndex newTextureIndex; + newTextureIndex.iPositionInText = aPos; + newTextureIndex.iTextureId = texture.Id(); + + iTextureIndex.Append(newTextureIndex); + + retVal = &texture; + } + else + { + User::Leave(KErrArgument); + } + } + else + { + CFsTexture* texture = iTextureLoader->SearchById(textureId); + + retVal = texture; + } + + return *retVal; + } + +TBool CFsTextParser::IsFieldInrange(TInt aStartPosition, TInt aRange) + { + FUNC_LOG; + TInt siezOfArray = iFieldLocation.Count(); + + TBool retVal = EFalse; + + TInt endPosition = aStartPosition + aRange; + TInt pos; + + for(TInt i = 0 ; i < siezOfArray ; i++) + { + pos = iFieldLocation[i]; + + if(aStartPosition <= pos && pos <= endPosition) + { + retVal = ETrue; + i = siezOfArray; + } + } + + return retVal; + } + +void CFsTextParser::FindBlokOfText() + { + if(!iGetCharsUsed) + { + iText.GetChars(iGNOSomeText, iGNOCharFormat, iPosition); + iLastGetCharsPos = iPosition; + iLastGetCharsLength = iGNOSomeText.Length(); + iGetCharsUsed = ETrue; + } + else + { + if(iPosition >= iLastGetCharsPos && iPosition < (iLastGetCharsPos + iLastGetCharsLength)) + { + iGNOSomeText.Set(iText.Read( + iPosition, + iLastGetCharsLength - (iPosition - iLastGetCharsPos))); + + iLastGetCharsPos = iPosition; + iLastGetCharsLength = iGNOSomeText.Length(); + } + else + { + if(iPosition == iLastGetCharsPosOfNextBlock) + { + iGNOSomeText.Set(iText.Read(iPosition, + iLastGetCharsLengthOfNextBlock)); + + iLastGetCharsPos = iPosition; + iLastGetCharsLength = iGNOSomeText.Length(); + iGNOCharFormat = iGNOCharFormatOfNextBlock; + } + else + { + iText.GetChars(iGNOSomeText, iGNOCharFormat, iPosition); + + iLastGetCharsPos = iPosition; + iLastGetCharsLength = iGNOSomeText.Length(); + } + } + } + } + +void CFsTextParser::FindNextBlokOfText() + { + if(!iGetCharsUsedOfNextBlock) + { + iText.GetChars(iGNOSomeTextOfNextBlock, iGNOCharFormatOfNextBlock, iGNONextPosition ); + iLastGetCharsPosOfNextBlock = iGNONextPosition; + iLastGetCharsLengthOfNextBlock = iGNOSomeTextOfNextBlock.Length(); + iGetCharsUsedOfNextBlock = ETrue; + } + else + { + if(iLastGetCharsPosOfNextBlock == iGNONextPosition) + { + iGNOSomeTextOfNextBlock.Set(iText.Read(iGNONextPosition, + iLastGetCharsLengthOfNextBlock)); + } + else + { + iText.GetChars(iGNOSomeTextOfNextBlock, iGNOCharFormatOfNextBlock, iGNONextPosition ); + iLastGetCharsPosOfNextBlock = iGNONextPosition; + iLastGetCharsLengthOfNextBlock = iGNOSomeTextOfNextBlock.Length(); + } + } + } + +TInt CFsTextParser::IsNewLinePresent(TInt aPosition, TInt aLength) + { + TInt retVal = -1; + + TInt index = 0; + TInt newLineArrayCount = iNewLineArray.Count(); + + if(iNewLineArray[iNewLineArrayIndex] < aPosition && + iNewLineArray[iNewLineArrayIndex] < (aPosition + aLength)) + { + for(index = iNewLineArrayIndex ; index < newLineArrayCount - 1 ; ++index) + { + TInt alamakota= iNewLineArray[index]; + + if(iNewLineArray[index] >= aPosition && + iNewLineArray[index] < (aPosition + aLength)) + { + retVal = iNewLineArray[index] - aPosition; + iNewLineArrayIndex = index; + index = newLineArrayCount + 1; + } + else if(iNewLineArray[index] > aPosition && + iNewLineArray[index] > (aPosition + aLength)) + { + retVal = -1; + index = newLineArrayCount + 1; + } + } + } + else + { + for(index = iNewLineArrayIndex ; index >= 0 ; --index) + { + TInt alamakota= iNewLineArray[index]; + + if(iNewLineArray[index] >= aPosition && + iNewLineArray[index] < (aPosition + aLength)) + { + retVal = iNewLineArray[index] - aPosition; + iNewLineArrayIndex = index; + index = 0; + } + else if(iNewLineArray[index] > aPosition && + iNewLineArray[index] > (aPosition + aLength)) + { + retVal = -1; + index = 0; + } + } + } + + return retVal; + } + + +MFsRichTextObject* CFsTextParser::GetNextObjectL() + { + MFsRichTextObject* textObject = NULL; + + TInt startPos = 0; + TInt wordLength = 0; + + FindBlokOfText(); + + iGNONextPosition = iPosition + iGNOSomeText.Length(); + + if(iGNONextPosition < iText.DocumentLength()) + { + FindNextBlokOfText(); + + if(iGNOCharFormat.IsEqual(iGNOCharFormatOfNextBlock)) + { + TBool connect = ETrue; + + if(iGNOSomeTextOfNextBlock.Length() == 1) + { + TBuf<1> checkForSpecialChar; + _LIT(specialChar, "\xFFFC"); + + iText.Extract(checkForSpecialChar, iGNONextPosition, 1); + + if(checkForSpecialChar.Right(1).Compare(specialChar) == 0) + { + connect = EFalse; + } + } + if(iGNOSomeText.Length() == 1) + { + TBuf<1> checkForSpecialChar; + _LIT(specialChar, "\xFFFC"); + + iText.Extract(checkForSpecialChar, iPosition, 1); + + if(checkForSpecialChar.Right(1).Compare(specialChar) == 0) + { + connect = EFalse; + } + } + + if(connect) + { + TInt l1 = iGNOSomeText.Length(); + TInt l2 = iGNOSomeTextOfNextBlock.Length(); + + TBuf<121> someCharacter; + + TInt getTextLength = (l1 + l2) > 120 ? 120 : (l1 + l2); + + iText.Extract(someCharacter, iPosition, getTextLength); + + iGNOSomeText.Set(someCharacter.Left(someCharacter.Length())); + } + } + } + + if(iPosition == 0 || iLastPosition != iLastWordPosition || iLastLength < 120) + { + iText.GetWordInfo( + iPosition, + startPos, + wordLength, + EFalse, + EFalse); + iLastLength = wordLength; + } + + if(iGNOSomeText.Length() > 100) + { + //iGNOSomeText.Set(iText.Read(iPosition,100)); + iGNOSomeText.Set(iGNOSomeText.Mid(0, 100)); + + iLastLength -= 100; + + //wordLength = 100; + //startPos = iPosition; + } + + + iLastWordPosition = iPosition; + + if ( !wordLength ) + { + wordLength = iNewLengthOfWord != 0 ? iNewLengthOfWord : 0; + startPos = iPosition; + } + + TInt a1 = iGNOSomeText.Length(); + TInt a2 = startPos + wordLength - iPosition + 1; + + if(a1 > a2) + { + //iGNOSomeText.Set(iText.Read(iPosition,startPos + wordLength - iPosition + 1)); + iGNOSomeText.Set(iGNOSomeText.Mid(0, startPos + wordLength - iPosition + 1)); + } + + /*_LIT(endOfFile, "\x2029"); + if(iGNOSomeText.Length() > 0 && iGNOSomeText.Right(1).Compare(endOfFile) == 0) + { + iGNOSomeText.Set(iGNOSomeText.Mid(0, iGNOSomeText.Length() - 1)); + }*/ + + + if(iIsWordTooLong) + { + iIsWordTooLong = EFalse; + + if(iGNOSomeText.Length() > iNewLengthOfWord) + { + iGNOSomeText.Set(iText.Read( + iPosition, + iNewLengthOfWord)); + } + } + + //czy text jest elementem expanda + TInt isWordPartOfExpandArea = IsWordPartOfExpandArea(iPosition, + iPosition + iGNOSomeText.Length() - 1); + + if(-1 != isWordPartOfExpandArea) + { + // Profile + if(iExpandArray.Count() > isWordPartOfExpandArea && + iExpandArray[isWordPartOfExpandArea].iStartIndex > iPosition && + iExpandArray[isWordPartOfExpandArea].iStartIndex < + (iPosition + iGNOSomeText.Length() - 1)) + { + //w polowie slowa zaczyna sie expand - + //nalezy slowo uciac i zajac sie + //poczatkowa czescia, ktora nie jest expandem= + iGNOSomeText.Set( iText.Read( + iPosition, + iExpandArray[isWordPartOfExpandArea].iStartIndex + - iPosition ) ); + + isWordPartOfExpandArea = -1; + } + //wariant 3 + else if(iExpandArray[isWordPartOfExpandArea].iStartIndex + + iExpandArray[isWordPartOfExpandArea].iLength >= iPosition + && + iExpandArray[isWordPartOfExpandArea].iStartIndex + + iExpandArray[isWordPartOfExpandArea].iLength < + (iPosition + iGNOSomeText.Length() - 1)) + { + //poczatek slowa jest expandem + //a jego konie nie jest - ten koniec nalezy uciac + iGNOSomeText.Set(iText.Read( + iPosition, + iExpandArray[isWordPartOfExpandArea].iStartIndex + + iExpandArray[isWordPartOfExpandArea].iLength - + iPosition)); + } + } + + if(-1 != isWordPartOfExpandArea) + { + //Profile + if(!iExpandArray[isWordPartOfExpandArea].iIsExpand) + { + if(iPosition >= + iExpandArray[isWordPartOfExpandArea].iStartIndex + + iExpandArray[isWordPartOfExpandArea].iCaptionLength) + { + iLastPosition = iPosition; + iPosition = + iExpandArray[isWordPartOfExpandArea].iStartIndex + + iExpandArray[isWordPartOfExpandArea].iLength; + + //jak expand jest do konca textu; + if(IsNextObject()) + { + return GetNextObjectL(); + } + else + { + textObject = CFsRichTextNewLine::NewL(); + + textObject->SetBeginOfObject(iPosition); + textObject->SetEndOfObject(iPosition); + + iLastPosition = iPosition; + iPosition += 1; + + return textObject; + } + } + + //expand nie jest rozwiniety dlatego + //mozemy przekazac tylko caption + if(iExpandArray[isWordPartOfExpandArea].iStartIndex + + iExpandArray[isWordPartOfExpandArea].iCaptionLength > + iPosition && + iExpandArray[isWordPartOfExpandArea].iStartIndex + + iExpandArray[isWordPartOfExpandArea].iCaptionLength < + iPosition + iGNOSomeText.Length()) + { + iGNOSomeText.Set(iText.Read( + iPosition, + iExpandArray[isWordPartOfExpandArea].iStartIndex + + iExpandArray[isWordPartOfExpandArea].iCaptionLength + - iPosition)); + } + } +// if ( Profiling2( &iGNOSomeText, &isWordPartOfExpandArea, textObject ) ) +// { +// return GetNextObjectL(); +// } + } + + TInt isWordPartOfHotSpotArea = + IsWordPartOfHotSpotArea( + iPosition, + iPosition + iGNOSomeText.Length() - 1); + + if(-1 != isWordPartOfHotSpotArea + && iHotSpotArray.Count() > isWordPartOfHotSpotArea) + { + if(iHotSpotArray[isWordPartOfHotSpotArea].iStartIndex > iPosition && + iHotSpotArray[isWordPartOfHotSpotArea].iStartIndex < + (iPosition + iGNOSomeText.Length() - 1)) + { + //w polowie slowa zaczyna sie expand - + //nalezy slowo uciac i zajac sie + //poczatkowa czescia, ktora nie jest expandem= + iGNOSomeText.Set( iText.Read( + iPosition, + iHotSpotArray[isWordPartOfHotSpotArea].iStartIndex + - iPosition ) ); + + isWordPartOfHotSpotArea = -1; + } + //wariant 3 + else if(iHotSpotArray[isWordPartOfHotSpotArea].iStartIndex + + iHotSpotArray[isWordPartOfHotSpotArea].iLength >= iPosition && + iHotSpotArray[isWordPartOfHotSpotArea].iStartIndex + + iHotSpotArray[isWordPartOfHotSpotArea].iLength < + (iPosition + iGNOSomeText.Length() - 1)) + { + //poczatek slowa jest expandem + //a jego konie nie jest - ten koniec nalezy uciac + iGNOSomeText.Set(iText.Read( + iPosition, + iHotSpotArray[isWordPartOfHotSpotArea].iStartIndex + + iHotSpotArray[isWordPartOfHotSpotArea].iLength - iPosition)); + } + } + + TFindFieldInfo info; + + TInt dx = iGNOSomeText.Length(); + + if(iPosition + dx > iText.DocumentLength()) + { + dx = iText.DocumentLength() - iPosition - 1; + } + + //is new line in iGNOSomeText + + TInt positionOfNewLine = IsNewLinePresent(iPosition, iGNOSomeText.Length()); + TBool isNewLinePresent = EFalse; + + if( positionOfNewLine > -1 ) + { + if(positionOfNewLine == 0) + { + isNewLinePresent = ETrue; + iGNOSomeText.Set(iGNOSomeText.Mid(0, 1)); + } + else + { + iGNOSomeText.Set(iGNOSomeText.Mid(0, positionOfNewLine)); + } + } + + if(IsFieldInrange(iPosition, dx) && iText.FindFields(info, iPosition, dx)) + { + if(iPosition != info.iFirstFieldPos) + { + iGNOSomeText.Set(iText.Read( + iPosition, + info.iFirstFieldPos - iPosition)); + textObject = static_cast + (CFsRichTextText::NewL(iGNOSomeText, 0)); + CleanupStack::PushL(textObject); + TInt styleId = iTextStyleManager->GetStyleIDL(iGNOCharFormat); + ((CFsRichTextText*)textObject)->SetStyleId(styleId); + + textObject->SetBeginOfObject(iPosition); + textObject->SetEndOfObject(iPosition + iGNOSomeText.Length() - 1); + + ((CFsRichTextText*)textObject)->SetTextColor( + iGNOCharFormat.iFontPresentation.iTextColor ); + + iLastPosition = iPosition; + iPosition += iGNOSomeText.Length(); + CleanupStack::Pop(textObject); + } + else + { + //pobrac fielda + const CTextField* field = iText.TextField(iPosition); + + if(KFsRichTextPictureFieldUid == field->Type()) + { + TPictureHeader header = iText.PictureHeader(iPosition); + + CMyPicture* picture = + static_cast(header.iPicture.AsPtr() ); + + textObject = CFsRichTextPicture::NewL(); + + TSize sizeOfPicture = TSize( 0, 0 ); + picture->GetOriginalSizeInTwips( sizeOfPicture ); + + static_cast< CFsRichTextPicture* > + (textObject)->SetTextureSize(sizeOfPicture); + + textObject->SetBeginOfObject(iPosition); + textObject->SetEndOfObject(iPosition); + + iLastPosition = iPosition; + iPosition += 1; + } + else if(KFsRichTextSmileyFieldUid == field->Type()) + { + TInt smileyIndex = ((CSmileyField*)(field))->GetSmileyIndex(); + + iGNOSomeText.Set(iText.Read( + iPosition, + iSmileyParser->GetSmileyLength(smileyIndex))); + + CFsRichTextText* smileyTextObject = + CFsRichTextText::NewL(iGNOSomeText, 0); + CleanupStack::PushL(smileyTextObject); + smileyTextObject->SetTextColor( + iGNOCharFormat.iFontPresentation.iTextColor ); + + TInt styleId = iTextStyleManager->GetStyleIDL(iGNOCharFormat); + ((CFsRichTextText*)smileyTextObject)->SetStyleId(styleId); + + TFileName fileName = + iSmileyParser->GetSmileyFileName(smileyIndex); + + TInt textureId = 0; + TSize texturesize = TSize( 0, 0 ); + if(IsTexturePosition(iPosition, textureId)) + { + CFsTexture* texture = iTextureLoader->SearchById(textureId); + texturesize = texture->Texture().Size(); + } + else + { + CFsTexture& texture = iTextureLoader->LoadTextureL( fileName ); + + TTextureIndex newTextureIndex; + newTextureIndex.iPositionInText = iPosition; + newTextureIndex.iTextureId = texture.Id(); + + iTextureIndex.Append(newTextureIndex); + + texturesize = texture.Texture().Size(); + } + + CFsRichTextPicture* smileyPictureObject = + CFsRichTextPicture::NewL(); + CleanupStack::PushL(smileyPictureObject); + if(iIsSetSizeOfSmiley) + { + texturesize = iSizeOfSmiley; + } + else if ( texturesize == TSize( 0, 0 ) ) + { + TFrameInfo frameInfo; + + CFsTextureLoader::GetFrameInfoL( + fileName, + frameInfo ); + texturesize = frameInfo.iOverallSizeInPixels; + TSize texturesize = TSize( 10, 10 ); + } + + static_cast< CFsRichTextPicture* > + (smileyPictureObject)->SetTextureSize( texturesize ); + + textObject = CFsRichTextSmiley::NewL( + smileyTextObject, + smileyPictureObject); + + CleanupStack::Pop(smileyPictureObject); + CleanupStack::Pop(smileyTextObject); + textObject->SetBeginOfObject(iPosition); + textObject->SetEndOfObject(iPosition + iGNOSomeText.Length() - 1); + + iLastPosition = iPosition; + iPosition += iGNOSomeText.Length(); + } + } + } + else + { + if(isNewLinePresent) + { + textObject = CFsRichTextNewLine::NewL(); + + textObject->SetBeginOfObject(iPosition); + textObject->SetEndOfObject(iPosition); + + iLastPosition = iPosition; + iPosition += 1; + } + else + { + textObject = static_cast + (CFsRichTextText::NewL(iGNOSomeText, 0)); + CleanupStack::PushL(textObject); + TInt styleId = iTextStyleManager->GetStyleIDL(iGNOCharFormat); + ((CFsRichTextText*)textObject)->SetStyleId(styleId); + + textObject->SetBeginOfObject(iPosition); + textObject->SetEndOfObject(iPosition + iGNOSomeText.Length() - 1); + + ((CFsRichTextText*)textObject)->SetTextColor( + iGNOCharFormat.iFontPresentation.iTextColor ); + + TBidiText * bidiText = TBidiText::NewL(iGNOSomeText.Length() + 1, 1); + + TBool found = EFalse; + + TBidiText::TDirectionality direction = bidiText->TextDirectionality(iGNOSomeText, &found ); + + // + if ( !found ) + { + direction = AknLayoutUtils::LayoutMirrored() ? + TBidiText::ERightToLeft : TBidiText::ELeftToRight; + } + // + + static_cast(textObject)->SetTextDirection(direction); + + delete bidiText; + + TInt sizeOfSomeText = iGNOSomeText.Length(); + TBool isWhiteSpace = ETrue; + for(TInt k = 0 ; k < sizeOfSomeText ; ++k) + { + if(iGNOSomeText[k] != ' ') + { + isWhiteSpace = EFalse; + k = sizeOfSomeText + 1; + } + } + + textObject->SetIsWhiteSpace(isWhiteSpace); + + iLastPosition = iPosition; + iPosition += iGNOSomeText.Length(); + + CleanupStack::Pop(textObject); + } + } + + if(-1 != isWordPartOfHotSpotArea) + { + textObject->SetHotSpot( ETrue ); + textObject->SetIdOfHotSpot(isWordPartOfHotSpotArea); + textObject->SetTypeOfHotSpot( + iHotSpotArray[isWordPartOfHotSpotArea].iId ); + } + + if(-1 != isWordPartOfExpandArea) + { + textObject->SetEmbeded( ETrue ); + textObject->SetIdOfEmbeded(isWordPartOfExpandArea); + } + + return textObject; + } + +void CFsTextParser::SetTextStylemanager( + CFsTextStyleManager* aTextStyleManager ) + { + FUNC_LOG; + iTextStyleManager = aTextStyleManager; + } + +void CFsTextParser::ConvertBitmapL(CPicture* aPicture, CFbsBitmap*& aBitmap) + { + FUNC_LOG; + TSize size; + aPicture->GetOriginalSizeInTwips(size); + aBitmap = new (ELeave)CFbsBitmap; + + size.iWidth = 45; + size.iWidth = 45; + + User::LeaveIfError(aBitmap->Create(size,EColor256)); + CleanupStack::PushL(aBitmap); + + //create an offscreen device and context + CGraphicsContext* bitmapContext = NULL; + CFbsBitmapDevice* bitmapDevice = CFbsBitmapDevice::NewL(aBitmap); + CleanupStack::PushL(bitmapDevice); + User::LeaveIfError(bitmapDevice->CreateContext(bitmapContext)); + CleanupStack::PushL(bitmapContext); + + aPicture->Draw( + *bitmapContext, + TPoint(0,0), + TRect( TPoint(0,0),TPoint(45,45) ), + bitmapDevice); + + CleanupStack::PopAndDestroy(bitmapContext); + CleanupStack::PopAndDestroy(bitmapDevice); + CleanupStack::Pop(aBitmap); + } + + + +TInt CFsTextParser::IsWordPartOfHotSpotArea( + TInt aStartPosition, + TInt aEndPosition ) + { + FUNC_LOG; + TInt retVal = -1; + + for(TInt i = 0 ; i < iHotSpotArray.Count() ; ++i) + { + /* + TRichTextHotSpotArea test; + test.iLength = iHotSpotArray[i].iLength; + test.iStartIndex = iHotSpotArray[i].iStartIndex; + */ + + if(iHotSpotArray[i].iStartIndex >= aStartPosition && + iHotSpotArray[i].iStartIndex < aEndPosition) + { + if(-1 == retVal) + { + retVal = i; + } + else + { + if ( iHotSpotArray[i].iStartIndex + < iHotSpotArray[retVal].iStartIndex ) + { + retVal = i; + } + } + } + else if ( aStartPosition >= iHotSpotArray[i].iStartIndex + && aStartPosition + < iHotSpotArray[i].iStartIndex + + iHotSpotArray[i].iLength ) + { + if(-1 == retVal) + { + retVal = i; + } + else + { + if ( iHotSpotArray[i].iStartIndex + < iHotSpotArray[retVal].iStartIndex ) + { + retVal = i; + } + } + } + } + return retVal; + } + + + + +TBool CFsTextParser::IsNextObject() const + { + FUNC_LOG; + + TInt documentLength = iText.DocumentLength() - 1; + TBool retVal = EFalse; + + if(documentLength < iPosition) + { + retVal = EFalse; + } + else + { + retVal = ETrue; + } + + return retVal; + } + +TBool CFsTextParser::MoveParsingPosition( TInt aMoveParsingPositionBy ) + { + FUNC_LOG; + TBool retVal = ETrue; + + if( (iPosition + aMoveParsingPositionBy) < 0 || + (iPosition + aMoveParsingPositionBy) >= iText.DocumentLength()) + { + retVal = EFalse; + } + else + { + iPosition += aMoveParsingPositionBy; + } + + return retVal; + } + + + +TBool CFsTextParser::ParseTextL() + { + FUNC_LOG; + TBool retVal = ETrue; + + TInt textLength = iText.DocumentLength(); + + TBuf<1> someCharacter; + + _LIT(fourSpaces, " "); + _LIT(validNewLine, "\n"); + + + _LIT(newLine1, "\x2028"); + _LIT(newLine2, "\x2029"); + _LIT(newLine3, "\x85"); + _LIT(newLine4, "\x0D"); + + _LIT(tabulator,"\x2007"); + + for(TInt i = 0 ; i < iText.GetNumberOfExpandAreas() ; ++i) + { + iExpandArray.AppendL(iText.GetExpandAreaL(i)); + } + + for(TInt i = 0 ; i < iText.GetNumberOfHotSpotAreas() ; ++i) + { + iHotSpotArray.AppendL(iText.GetHotSpotAreaL(i)); + } + + textLength = iText.DocumentLength(); + for(TInt i = 0 ; i < textLength ; ++i) + { + iText.Extract(someCharacter, i, 1); + + if(someCharacter[0] == '\t') + { + iText.DeleteL(i,1); + iText.InsertL(i,fourSpaces); + + textLength = iText.DocumentLength(); + + for(TInt j = 0 ; j < iText.GetNumberOfExpandAreas() ; ++j) + { + if(iExpandArray[j].iStartIndex > i) + { + iExpandArray[j].iStartIndex += 3; + } + } + + for(TInt j = 0 ; j < iText.GetNumberOfHotSpotAreas() ; ++j) + { + if(iHotSpotArray[j].iStartIndex <= i && + iHotSpotArray[j].iStartIndex + iHotSpotArray[j].iLength > i) + { + iHotSpotArray[j].iLength += 3; + } + if(iHotSpotArray[j].iStartIndex > i) + { + iHotSpotArray[j].iStartIndex += 3; + } + } + + ++i; + } + else if(someCharacter.Right(1).Compare(tabulator) == 0) + { + iText.DeleteL(i,1); + iText.InsertL(i,fourSpaces); + + textLength = iText.DocumentLength(); + ++i; + } + else if(someCharacter.Right(1).Compare(validNewLine) == 0) + { + TBuf<1> anotherCharacter; + if ( iText.DocumentLength() > ( i + 1 ) ) + { + iText.Extract(anotherCharacter, i + 1, 1); + + if( anotherCharacter.Right(1).Compare(newLine3) == 0 || + anotherCharacter.Right(1).Compare(newLine4) == 0 ) + { + iText.DeleteL( i, 2 ); + iText.InsertL( i, validNewLine ); + iText.InsertL( i, _L(" ") ); + + textLength = iText.DocumentLength(); + } + } + } + } + + textLength = iText.DocumentLength(); + TInt lastNewLine = 0; + TPtrC someText; + + for(TInt i = 0 ; i < textLength ; ++i) + { + iText.Extract(someCharacter, i, 1); + + if(someCharacter.Right(1).Compare(validNewLine) == 0 || + someCharacter.Right(1).Compare(newLine1) == 0 || + someCharacter.Right(1).Compare(newLine2) == 0 || + someCharacter.Right(1).Compare(newLine3) == 0 || + someCharacter.Right(1).Compare(newLine4) == 0 + || i == textLength - 1 + ) + { + iNewLineArray.AppendL(i); + + someText.Set(iText.Read( + lastNewLine, + i - lastNewLine)); + + // + TInt partOfHotspotArea = IsWordPartOfHotSpotArea( + lastNewLine, + i); + // + + lastNewLine = i; + + TBidiText * bidiText = TBidiText::NewL(someText.Length() + 1, 1); + + TBool found = EFalse; + + TBidiText::TDirectionality direction = bidiText->TextDirectionality(someText, &found ); + + delete bidiText; + + // + if (!found || partOfHotspotArea != -1) + { + direction = AknLayoutUtils::LayoutMirrored() ? TBidiText::ERightToLeft : TBidiText::ELeftToRight; + } + // + + iLineDirection.AppendL(direction); + } + } + + + for(int i = 0 ; i < textLength ; ++i) + { + iText.Extract(someCharacter, i, 1); + + if(!iSmileyParser->IsPartOfSmileyL(someCharacter)) + { + if(iSmileyParser->IsSmiley()) + { + TInt smileysIndex = iSmileyParser->GetSmileyIndex(); + CTextField* field = + (CTextField*)new(ELeave)CSmileyField(smileysIndex); + + TInt smileysLength = + iSmileyParser->GetSmileyLength(smileysIndex); + iText.InsertFieldL( + i-smileysLength, + field, + KFsRichTextSmileyFieldUid); + + iFieldLocation.Append(i-smileysLength); + } + } + + if(someCharacter[0] == CRichText::EPictureCharacter) + { + CTextField* field = (CTextField*) + new(ELeave)CPictureField(TSize(50,50)); + iText.InsertFieldL(i, field, KFsRichTextPictureFieldUid); + + iFieldLocation.Append(i); + } + } + + return retVal; + } + +TBool CFsTextParser::IsPartOfHotSpot(TInt aIndex) + { + FUNC_LOG; + TBool retVal = EFalse; + + for(TInt i = 0 ; i < iHotSpotArray.Count() ; ++i) + { + if ( aIndex > iHotSpotArray[i].iStartIndex + && aIndex < + iHotSpotArray[i].iStartIndex + + iHotSpotArray[i].iLength + - 1 ) + { + retVal = ETrue; + break; + } + } + + return retVal; + } + +void CFsTextParser::SetSmileyParser(CFsSmileyParser* aSmileyParser) + { + FUNC_LOG; + iSmileyParser = aSmileyParser; + } + +TBool CFsTextParser::SetExpandStatusL(TInt aIdOfExpand, TBool aStatus) + { + FUNC_LOG; + TBool retVal = ETrue; + + if(aIdOfExpand >= iExpandArray.Count()) + { + User::Leave(KErrArgument); + } + + iExpandArray[aIdOfExpand].iIsExpand = aStatus; + + return retVal; + } + +TInt CFsTextParser::GetEndIndexOfExpandAreaL(TInt aId) + { + FUNC_LOG; + if(aId >= iExpandArray.Count()) + { + User::Leave(KErrArgument); + } + + return iExpandArray[aId].iStartIndex + iExpandArray[aId].iLength - 1; + } + +TInt CFsTextParser::GetStartIndexOfExpandAreaL(TInt aId) + { + FUNC_LOG; + if(aId >= iExpandArray.Count()) + { + User::Leave(KErrArgument); + } + + return iExpandArray[aId].iStartIndex; + } + +TInt CFsTextParser::GetBodyIndexOfExpandAreaL(TInt aId) + { + FUNC_LOG; + if(aId >= iExpandArray.Count()) + { + User::Leave(KErrArgument); + } + + return + iExpandArray[aId].iStartIndex + + iExpandArray[aId].iCaptionLength - 1; + } + +TInt CFsTextParser::GetEndIndexOfHotSpotAreaL(TInt aId, TBool aOriginal) + { + FUNC_LOG; + if(aId >= iHotSpotArray.Count()) + { + User::Leave(KErrArgument); + } + + TInt retVal; + + retVal = aOriginal + ? iHotSpotArray[aId].iOriginalStartIndex + iHotSpotArray[aId].iOriginalLength - 1 + : iHotSpotArray[aId].iStartIndex + iHotSpotArray[aId].iLength - 1; + + return retVal; + } + +TInt CFsTextParser::GetStartIndexOfHotSpotAreaL(TInt aId, TBool aOriginal) + { + FUNC_LOG; + if(aId >= iHotSpotArray.Count()) + { + User::Leave(KErrArgument); + } + + TInt retVal = aOriginal + ? iHotSpotArray[aId].iOriginalStartIndex + : iHotSpotArray[aId].iStartIndex; + + return retVal; + } + +CFsRichText* CFsTextParser::GetRichTextL(TInt aBeginIndex, TInt aEndIndex) + { + FUNC_LOG; + CFsRichText* fsRichText = CFsRichText::NewL( + iEikon->SystemParaFormatLayerL(), + iEikon->SystemCharFormatLayerL()); + + TBuf<1> c; + + TCharFormat charFormat; + TCharFormatMask charMask; + + if(aBeginIndex < 0 || aBeginIndex > iText.DocumentLength() || + aEndIndex < 0 || aEndIndex > iText.DocumentLength()) + { + User::Leave(KErrArgument); + } + + for(TInt i = aBeginIndex ; i < aEndIndex ; ++i ) + { + iText.Extract( c, i, 1 ); + + TRAPD(err, fsRichText->InsertL(i,c)); + if(err == KErrNone) + { + iText.GetSpecificCharFormat(charFormat,charMask,i); + fsRichText->SetInsertCharFormatL(charFormat,charMask,i); + } + } + + return fsRichText; + } + +TBidiText::TDirectionality CFsTextParser::GetParagraphDirection(TInt aPosInText) + { + FUNC_LOG; + /*if(aPosInText > iText.DocumentLength()) + { + User::Leave(KErrArgument); + } + + if(iNewLineArray.Count() <= 0 || (iNewLineArray.Count() != iLineDirection.Count())) + { + User::Leave(KErrArgument); + }*/ + + // + TBidiText::TDirectionality retVal = AknLayoutUtils::LayoutMirrored() ? TBidiText::ERightToLeft : TBidiText::ELeftToRight; + // + + //TBool found = EFalse; + + TInt newLineArrayCount = iNewLineArray.Count(); + TInt lastNewLinePosition = 0; + if( aPosInText > iNewLineArray[iLastNewLinePositionIndex] ) + { + return iLineDirection[iLastNewLinePositionIndex + 1]; + } + for(TInt i = 0 ; i < newLineArrayCount ; ++i) + { + if(lastNewLinePosition <= aPosInText && iNewLineArray[i] >= aPosInText) + { + retVal = iLineDirection[i]; + iLastNewLinePositionIndex = i; + break; + } + + lastNewLinePosition = iNewLineArray[i]; + } + + /*if(!found) + { + User::Leave(KErrArgument); + }*/ + + return retVal; + } + +TBool CFsTextParser::SetTextDirection(TInt aStartPosInText, TInt aEndPosInText, + TBidiText::TDirectionality aDirection) + { + FUNC_LOG; + TInt indexOfStart = 0; + TInt indexOfEnd = 0; + + TInt tableCount = iNewLineArray.Count(); + + for(TInt i = 0 ; i < tableCount ; ++i) + { + TInt ala = iNewLineArray[i]; + + if(iNewLineArray[i] >= aStartPosInText) + { + indexOfStart = i; + i = tableCount + 1; + } + } + + for(TInt i = indexOfStart ; i < tableCount ; ++i) + { + TInt ala = iNewLineArray[i]; + + if(iNewLineArray[i] >= aEndPosInText) + { + indexOfEnd = i; + i = tableCount + 1; + } + } + + if(indexOfEnd == indexOfStart) + { + iNewLineArray.Insert(aStartPosInText, indexOfStart); + iNewLineArray.Insert(aEndPosInText, indexOfStart + 1); + + TBidiText::TDirectionality direction = iLineDirection[indexOfEnd]; + + iLineDirection.Insert(direction, indexOfStart); + iLineDirection.Insert(aDirection, indexOfStart + 1); + } + else + { + iNewLineArray.Insert(aEndPosInText, indexOfEnd); + iNewLineArray.Insert(aStartPosInText, indexOfStart); + + for(TInt i = indexOfEnd ; i > indexOfStart ; --i) + { + iNewLineArray.Remove(i); + } + + TBidiText::TDirectionality direction = iLineDirection[indexOfStart]; + + iLineDirection.Insert(aDirection, indexOfEnd); + iLineDirection.Insert(direction, indexOfStart); + + for(TInt i = indexOfEnd ; i > indexOfStart ; --i) + { + iLineDirection.Remove(i); + } + } + if(0 == aStartPosInText) + { + iLineDirection[indexOfStart] = aDirection; + } + return ETrue; + } + +TBool CFsTextParser::IsTexturePosition(TInt aPos, TInt &aId) + { + TBool retVal = EFalse; + + TInt tableCount = iTextureIndex.Count(); + + for(TInt i = 0 ; i < tableCount ; ++i) + { + TInt texturePosition = iTextureIndex[i].iPositionInText; + + if(aPos == texturePosition) + { + retVal = ETrue; + aId = iTextureIndex[i].iTextureId; + i = tableCount + 1; + } + } + + return retVal; + }