textrendering/texthandling/stext/TXTINDEX.H
changeset 0 1fb32624e06b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/textrendering/texthandling/stext/TXTINDEX.H	Tue Feb 02 02:02:46 2010 +0200
@@ -0,0 +1,764 @@
+/*
+* Copyright (c) 1997-2009 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: 
+*
+*/
+
+
+#ifndef __TXTINDEX_H__
+#define __TXTINDEX_H__
+
+#include <e32std.h>
+#include <e32base.h>
+#include <txtmrtsr.h>
+#include <txtrich.h>
+#include "TXTSTD.H"
+
+// forward declarations
+class CParaAttribs;
+class CPicturePhrase;
+class RReadStream;
+class RWriteStream;
+class CStoreMap;
+class CStreamStore;
+class CPicture;
+class CCharFormatLayer;
+class CParaFormatLayer;
+class CRichText;
+class MPictureFactory;
+
+/**
+@internalComponent
+*/
+enum TRichTextStylePasteMode
+	{
+	EAddNewStyles,
+	EConvertNewStyles,
+	EIgnoreNewStyles
+	};
+
+class TTextFragment
+/**
+Describes a fragment of text that does not conform to the ERA text model.
+@internalComponent
+*/
+	{
+public:
+	TTextFragment();
+public:
+	TInt iLength;  // Number of characters in text fragment
+	TInt iPhraseCount;  // Number of distinct phrases in text fragment.
+	};
+
+
+class RPhraseAttribsEntry
+/**
+Provides a full description of a phrase.
+A phrase consists of a specified number of contiguous characters [the phrase length]
+of identical character format.
+Where a picture is included as text content, it is described by its own phrase.
+@internalComponent
+*/
+	{
+public:
+	enum {EPictureIndicator = -1};
+	enum {EPicturePhraseLength = 1};
+public:
+	RPhraseAttribsEntry();
+	RPhraseAttribsEntry(CCharFormatLayer* aCharFormat, TInt aLength = 0); // Sets iLen to zero - empty text phrase
+	RPhraseAttribsEntry(CPicturePhrase* aPicturePhrase);  // Sets iLen to EPictureIndicator
+	inline RPhraseAttribsEntry(const RPhraseAttribsEntry& aPhrase);
+	void Discard();
+	inline RPhraseAttribsEntry& operator=(const RPhraseAttribsEntry& aPhrase);
+	//
+	// Persist
+	void ExternalizeL(RWriteStream& aStream) const;
+	//
+	// General enquiry
+	inline TBool IsPicturePhrase() const;
+	TBool IsIdentical(const RPhraseAttribsEntry& aPhrase) const;
+	//
+	// Getters
+	inline TInt Length() const;
+	CCharFormatLayer* CharFormat() const;
+	CCharFormatLayer* ReleaseCharFormatLayerOwnership();
+	TInt GetPictureSizeInTwips(TSize& aSize) const;
+	TPictureHeader* PictureHeaderPtr() const;
+	TPictureHeader PictureHeader() const;
+	const CPicture* PictureHandleL(const MPictureFactory* aFactory,
+								   const MRichTextStoreResolver* aResolver,
+								   TInt aPos,
+								   MLayDoc::TForcePictureLoad aForceLoad) const;
+	//
+	// Setters
+	void AdjustLength(TInt aIncrement);
+ 	void SetLength(TInt aLength);
+private:
+	void AssignAndRelease(const RPhraseAttribsEntry& aPhrase);
+private:
+	TInt iLength;  // No. of characters covered by this phrase
+	union
+		{
+		CCharFormatLayer* iCharFormat;  // *OWNED* format of this text phrase
+		CPicturePhrase* iPicturePhrase;  // *OWNED* pointer to picture phrase information
+		};
+	__DECLARE_TEST;
+	};
+
+
+NONSHARABLE_CLASS(CPicturePhrase) : public CBase
+/**
+A low-level class providing a pointer to the character format layer for this picture phrase,
+and a pointer to a picture itself.  (Which may be expressed in its persistent form).
+@internalComponent
+*/
+	{
+public:
+	static CPicturePhrase* NewL(const TPictureHeader& aPicHdr,
+	                            TCharFormatX& aFormat,
+	                            TCharFormatXMask& aMask,
+	                            CCharFormatLayer* aCharBase,
+	                            TBool& aPictureOwnershipTaken);
+
+	static CPicturePhrase* NewL(const TPictureHeader& aPicHdr,
+	                            CCharFormatLayer* aCharLayer,
+	                            TBool& aPictureOwnershipTaken);
+	~CPicturePhrase();
+protected:
+	CPicturePhrase(const TPictureHeader& aPicHdr,TBool& aPictureOwnershipTaken);
+	CPicturePhrase(const TPictureHeader& aPicHdr, CCharFormatLayer* aCharLayer,TBool& aPictureOwnershipTaken);
+	void ConstructL(TCharFormatX& aFormat, TCharFormatXMask& aMask, CCharFormatLayer* aCharBase);
+public:
+	CCharFormatLayer* iCharFormat;
+	TPictureHeader iPicHdr;
+	};
+
+
+class TParaAttribsEntry
+/**
+Records the length of a paragraph (no. of characters).
+and references a CParaAttributes.
+@internalComponent
+*/
+	{
+public:
+	TParaAttribsEntry();
+	TParaAttribsEntry(TInt aLength, CParaAttribs* aParaAttribs);
+public:
+	TInt iLength;  // Number of characters in the paragraph (paragraph delimiter inclusive).
+	CParaAttribs* iParaAttribs;  // Only references this, does not own it.
+	};
+
+
+class TCurrentIndexRecords
+/**
+Packages current phrase & para records.
+@internalComponent
+*/
+	{
+public:
+	TCurrentIndexRecords();
+public:
+	TParaAttribsEntry* iParaEntry;
+	CParaAttribs* iParaAttribs;
+	RPhraseAttribsEntry* iPhrase;  // May be NULL.
+	};
+
+
+
+class TLogicalPosition
+/**
+Locates the current cursor position within all aspects of the index.
+@internalComponent
+*/
+	{
+public:
+	TLogicalPosition();
+	void Clear();
+public:
+	TInt iDocPos;					// Absolute document position.
+	TInt iParaElement;				// paragraph index
+	TInt iParaElementOffset;		// position from start of paragraph
+	TInt iParaBasePhraseElement;	// index of the first phrase in the paragraph
+	TInt iPhraseElement;
+	TInt iPhraseElementOffset;
+	};
+
+
+
+NONSHARABLE_CLASS(CParaAttribs) : public CBase
+/**
+Describes the attributes that apply to the paragraph.
+*owns* an iParaFormat(Layer), and *owns* an iPhraseAttribsIndex
+or charFormatLayer.
+@internalComponent
+*/
+	{
+public:
+	enum TParaRefCount {EPrimeNonSharedCount, EPrimeSharedCount};
+	enum {EPhraseIxGranularity = 1};
+public:
+	// Create a CParaAttribs with constant character formatting.
+	static CParaAttribs* NewL(const CParaFormatLayer* aParaLayer, const CCharFormatLayer* aCharLayer);
+	// Create a CParaAttribs with specific character formatting.
+	static CParaAttribs* NewL(const CParaFormatLayer* aParaLayer);
+	static CParaAttribs* NewL(const CParaAttribs* aParaAttribs);
+	void Release();
+	void Release(TInt aCount);
+	//
+	// Utility functions
+	inline TBool IsShared() const;
+	TInt PhraseCount() const;
+protected:
+	CParaAttribs();
+	~CParaAttribs();
+	CParaAttribs* CopyParaFormatL();
+private:
+public:
+	TDblQueLink link;
+	TInt iRefCount;  // Indicates re-use of this.
+	CParaFormatLayer* iParaFormat;
+	union
+		{
+		CCharFormatLayer* iCharFormat;	// iRefCount>0 - a single shared phrase - constant char format.
+		TInt iPhraseCount;	// iRefCount==0 - the number of phrases in this para.
+		};
+	};
+
+
+//
+
+class TRtPasteContext
+/**
+Provides the context for pasting of pictures from a clipboard.
+@internalComponent
+*/
+	{
+public:
+	TRtPasteContext(const CStreamStore* aStore, const CParaFormatLayer* aGlobalParaLayer, const CCharFormatLayer* aGlobalCharLayer, const CStyleList* aStyleList);
+public:
+	const CStreamStore* iStore;  // the clipboard store
+	const CParaFormatLayer* iGlobalParaLayer;  // the global para layer of the target text document
+	const CCharFormatLayer* iGlobalCharLayer;  // the global char layer of the target text document
+	const CStyleList* iStyleList;  // style list is present
+	TBool iParagraphStylesFlag;  // ETrue indicates presence of inline style references in index data
+	TBool iIncompleteParaFlag;  // ETrue indicates the pasted text fragment has no final para delimiter
+	TBool iApplyFormatToLastFlag;  // ETrue indicates that para format should be applied to last text fragment
+	TLogicalPosition iPastePos;  // the character position at which the text is to be pasted
+	TInt iParasPasted;  // the number of paragraphs successfully pasted
+	TInt iStylePasteMode;
+	};
+
+
+
+class TIndexDeleteInfo
+/**
+Contains information pertaining to an index delete operation.
+Carries between a SetForDeleteL and a DeleteNow method call.
+@internalComponent
+*/
+	{
+public:
+	enum TDeleteType
+		{
+		EDeleteFromParagraph,
+		EDeleteParagraph,
+		ENonspecificDelete
+		};
+public:
+	TInt iStartPara;
+	TInt iEndPara;
+	TLogicalPosition iDeletePos;
+	TInt iDeleteLength;
+	TDeleteType iDeleteType;
+	};
+
+
+class TRichTextMapEntry
+/**
+A utility class for patching references to persisted shared objects
+of the specified type.
+Code at the bottom of the header
+@internalComponent
+*/
+	{
+public:
+	TRichTextMapEntry(TInt aRefNumber, TAny* aItem);
+	TRichTextMapEntry(TAny* aS, TAny* aT);
+public:
+	union
+		{// The source item - a reference to a persistent one, or the in-memory original.
+		TInt iRefNumber;
+		TAny* iS;  // only used in appending one rich text to another
+		};
+	TAny* iT;  // the newly created/restored item - the target
+	};
+
+
+template <class T>
+class CRichTextStoreMap : public CBase
+/**
+//
+A utility class for patching references to persisted shared objects
+of the specified type.
+Code at the bottom of the header
+Used for clipboarding to i) patch references to paragraph styles
+ii) patch references to shared paragraph formats
+and also used in the appending of one rich text to another.
+@internalComponent
+*/
+	{
+public:
+	static CRichTextStoreMap* NewLC(TInt aMaximumCapacity);
+	~CRichTextStoreMap();
+	//
+	void Bind(TInt aRefNumber, T* aItem);
+	void Bind(T* aS, T* aT);
+	//
+	T* Item(TInt aRefNo)const;
+	T* Item(const T* aS)const;
+	inline const TRichTextMapEntry& At(TInt aIndex)const;
+	//
+	inline TInt Count()const;
+	//
+	void __DbgTestInvariant()const;
+private:
+	void ConstructL(TInt aMaximumCapacity);
+private:
+	CArrayFixFlat<TRichTextMapEntry>* iMap;
+public:
+	TInt iCapacity;
+	};
+
+
+class TGlobalLayerInfoAppend
+/**
+@internalComponent
+*/
+	{
+public:
+	TGlobalLayerInfoAppend();
+	TGlobalLayerInfoAppend(const CParaFormatLayer* aAggParaFormatLayer, const CCharFormatLayer* aAggCharFormatLayer,
+						   const CParaFormatLayer* aComParaFormatLayer, const CCharFormatLayer* aComCharFormatLayer);
+public:
+	const CParaFormatLayer* iAggParaFormatLayer;
+	const CCharFormatLayer* iAggCharFormatLayer;
+	const CParaFormatLayer* iComParaFormatLayer;
+	const CCharFormatLayer* iComCharFormatLayer;
+	};
+
+const TInt KSingleParaGranularity = 1;
+const TInt KMultiParaGranularity = 16;
+const TInt KSmallPhraseGranularity = 5;
+const TInt KLargePhraseGranularity = 16;
+const TUint32 KPhraseSplit = 0x01;
+const TUint32 KSpecificMarkupInternalized = 0x04;
+
+/**
+@internalComponent
+*/
+typedef CRichTextStoreMap<CParagraphStyle> CStyleMap;
+typedef CRichTextStoreMap<CParaAttribs> CParaAttribsMap;
+
+/** Stores the paragraph and character formatting information for CRichText.
+
+iParaIx stores the paragraph formatting, one entry per paragraph. Paragraphs
+are pieces of text delimited by the Unicode Paragraph Delimiter character
+U+2029.
+
+iPhraseIx stores the character formatting.
+
+Paragraph formatting information can be shared or not shared between
+paragraphs. Sharing is only permitted for paragraphs that do not have any
+character formatting applied to their text.
+
+A phrase is a run of consistently formatted characters. A phrase may only
+contain a paragraph delimiter in its last character. In other words, phrases
+are not permitted to span paragraph boundaries.
+
+iPhraseIx only stores formatting for the non-shared paragraphs. Therefore
+adding up the lengths of all the phrases in iPhraseIx will yield the sum of the
+non-shared paragraphs stored in iParaIx.
+
+Note that the "nominal" paragraph delimiter at the end of the text which is not
+stored by CRichText is covered by both character and paragraph formatting. So
+the length of the final paragraph and final phrase (if appropriate) includes
+this character.
+
+@internalComponent
+*/
+class CRichTextIndex : public CBase
+	{
+public:
+	static CRichTextIndex* NewL(const CParaFormatLayer* aGlobalParaLayer, const CCharFormatLayer* aGlobalCharLayer,
+								const CRichText& aText,
+								TInt aParaGran,TInt aPhraseGran);
+	static CRichTextIndex* NewL(const CStreamStore& aStore, TStreamId aId,
+								const CParaFormatLayer* aGlobalParaLayer,
+								const CCharFormatLayer* aGlobalCharLayer,
+								const CRichText& aText);
+	~CRichTextIndex();
+	//
+	// Store/Restore functions - Deferred loading of pictures
+	TStreamId StoreMarkupL(CStreamStore& aStore, const CStyleList* aStyleList) const;
+	//
+	void RestoreL(const CStreamStore& aStore, TStreamId aId,
+				  const CParaFormatLayer* aGlobalParaLayer, const CCharFormatLayer* aGlobalCharLayer,
+				  const CStyleList* aStyleList);
+	//
+	void StorePicturesL(CStreamStore& aStore, CStoreMap& aMap) const;
+	void StorePicturesL(CStreamStore& aStore, CStoreMap& aMap, TInt aPos, TInt aLength) const;
+	void DetachFromStoreL(CPicture::TDetach aDegree, TInt aPos, TInt aLength);
+	void ExternalizeL(RWriteStream& aStream) const;
+	void InternalizeL(RReadStream& aStream, const CParaFormatLayer* aGlobalParaLayer, const CCharFormatLayer* aGlobalCharLayer,
+					  const CStyleList* aStyleList);
+	//
+	// 3n Persist functions
+	TBool HasMarkupData(const CFormatLayer* aGlobalParaFormatLayer) const;
+	TPictureHeader PictureHeader(TInt aPos) const;
+	TPictureHeader* PictureHeaderPtr(TInt aPos);
+	//
+	// Undo/CutPaste
+	void CopyToStreamL(RWriteStream& aStream, TInt aPos, TInt aLength, TBool aCopyStyles) const;
+	void PasteFromStreamL(const CStreamStore& aStore, RReadStream& aStream, TInt aPos, CParagraphStyle::TStylePasteMode aStylePasteMode, const CParaFormatLayer* aGlobalParaLayer, const CCharFormatLayer* aGlobalCharLayer);
+	//
+	// Content modifier functions
+	void Reset(const CParaFormatLayer& aNormalParagraphStyle);
+	void InsertL(TInt aPos, const TDesC& aBuf, const CParaFormatLayer& aGlobalParaFormatLayer);
+	void InsertL(TInt aPos, const TPictureHeader& aPicHdr, TBool& aPictureOwnershipTaken);
+	void SetForDeleteL(TIndexDeleteInfo& aInfo, TInt aPos, TInt aLength);
+	TBool DeleteNow(TIndexDeleteInfo& aInfo);
+	void DeleteFromParagraph(TInt aPos, TInt aLength);
+	TBool DeleteParagraph(TInt aPos, TInt aLength);
+	void Normalize(TInt aPos);
+	//
+	// Insert a new paragraph at position aPos, based on the 'Normal' global defaults.
+	// Any explicit paragraph/character formatting is carried forward into this paragraph.
+	void InsertParagraphL(TInt aPos, const CParaFormatLayer& aGlobalParaFormatLayer);
+	//
+	// Special behaviour format modifier functions.
+	TBool InsertCharFormatIsActive();
+	void SetInsertCharFormatL(const TCharFormatX& aFormat, const TCharFormatXMask& aMask, TInt aPos);
+	void NewInsertCharFormatL(const TCharFormatX& aFormat,
+		const TCharFormatXMask& aMask, TInt aPos);
+	void UpdateInsertCharFormatL(const TCharFormatX& aFormat,
+		const TCharFormatXMask& aMask);
+	CCharFormatLayer* GetCurrentInsertCharFormat();
+	void CancelInsertCharFormat();
+	TBool DelSetInsertCharFormatL(TInt aPos, TInt aLength);
+	//
+	// Laydoc interface support
+	void GetParagraphFormatL(CParaFormat* aFormat,TInt aPos) const;
+	TInt GetChars(TCharFormatX& aFormat,TInt aPos) const;
+	TInt GetPictureSizeInTwips(TSize& aSize, TInt aPos) const;
+	CPicture* PictureHandleL(TInt aPos, MLayDoc::TForcePictureLoad aForceLoad) const;
+	//
+	// FormatText interface support
+	void GetParaFormatL(CParaFormat* aFormat, TParaFormatMask& aUndeterminedMask, TInt aPos, TInt aLength,
+						CParaFormat::TParaFormatGetMode aMode) const;
+	void ApplyParaFormatL(const CParaFormat* aFormat, const TParaFormatMask& aMask, TInt aPos, TInt aLength);
+	void GetCharFormat(TCharFormatX& aFormat, TCharFormatXMask& aMask,TInt aPos, TInt aLength) const;
+	void ApplyCharFormatL(const TCharFormatX& aFormat, const TCharFormatXMask& aMask, TInt aPos, TInt aLength, TBool aRemoveSpecific = EFalse);
+	void RemoveSpecificCharFormatL(TInt aPos, TInt aLength);
+	void RemoveSpecificParaFormatL(TInt aPos, TInt aLength);
+	//
+	//
+	void GetSpecificCharFormat(TCharFormatX& aFormat, TCharFormatXMask& aMask, TInt aPos) const;
+	void GetSpecificCharFormatDirection(TCharFormatX& aFormat, TCharFormatXMask& aMask,
+		TInt aPos, TBool aGetLeft) const;
+	//
+	// Paragraph style implementation
+	void ApplyParagraphStyleL(const CParagraphStyle& aStyle, TInt aPos, TInt aLength, const CCharFormatLayer* aCharStyleNormal, CParagraphStyle::TApplyParaStyleMode aMode);
+	void NotifyStyleChangedL(const CParagraphStyle* aTo, const CParagraphStyle* aFrom, const CParaFormatLayer& aGlobalParaFormatLayer, const CCharFormatLayer& aGlobalCharFormatLayer);
+	const CParaFormatLayer* ParagraphStyle(TBool& aStylesChangesOverRange, TInt aPos, TInt aLength) const;
+	//
+	// Utility functions
+	inline TInt ParagraphCount() const;
+	TInt CharPosOfParagraph(TInt& aLength, TInt aParaOffset) const;
+	TInt ParagraphNumberForPos(TInt& aPos) const;
+	inline void SetSpecificMarkupInternalized(TBool aBool);
+	inline TBool SpecificMarkupInternalized() const;
+	void DocumentChanged()const;
+	//
+	// Speciality functions
+	void AppendTakingSolePictureOwnershipL(const CRichTextIndex* aSource, const TGlobalLayerInfoAppend& aGlobalLayerInfo);
+	void AppendParagraphL(const CParaFormatLayer* aGlobalParaFormatLayer, const CCharFormatLayer* aGlobalCharFormatLayer,
+						  TInt aReplicas);
+	TInt SharedParaCount(const CRichTextIndex* aSource) const;
+	void GetSpecificParagraphFormatL(CParaFormat* aFormat,
+									 TParaFormatMask& aMask,
+									 TInt aPos) const;
+private:
+	enum TScanToPositionMode {EScanToPositionMatchLeft, EScanToPositionAbsolute};
+	enum {EInsertCharFormatReset = -1};
+	enum TPositionOrPhrase 	{EPositionOnly, EFollowingPhrase};
+private:
+	CRichTextIndex(const CRichText& aText);
+	void ConstructL(const CParaFormatLayer* aGlobalParaFormat, const CCharFormatLayer* aGlobalCharFormat, TInt aParaGran, TInt aPhraseGran);
+	//
+	// Persistence/Copy,Paste
+	void InternalizeRtiHeaderL(RReadStream& aStream, TRtPasteContext& aContext);
+	void ExternalizeRtiHeaderL(RWriteStream& aStream, const TLogicalPosition& aEnd, const CStyleList* aStyleList) const;
+	void ExternalizeReferencedStylesL(RWriteStream& aStream, const TLogicalPosition& aStart, const TLogicalPosition& aEnd) const;
+	void InternalizeSharedFormatsL(RReadStream& aStream, const TRtPasteContext& aContext);
+	void ExternalizeSharedFormatsL(RWriteStream& aStream, const TLogicalPosition& aStart, const TLogicalPosition& aEnd, const CStyleList* aStyleList) const;
+	void InternalizeParaIxL(RReadStream& aStream, const TRtPasteContext& aContext);
+	void ExternalizeParagraphFormatL(RWriteStream& aStream, const CParaFormatLayer& aSpecificParaFormatLayer, const CStyleList* aStyleList) const;
+	CParaFormatLayer* InternalizeParagraphFormatL(RReadStream& aStream, const TRtPasteContext& aContext);
+	CParaFormatLayer* PasteParagraphFormatL(RReadStream& aStream, const TRtPasteContext& aContext, CStyleMap* styleMap);
+	RPhraseAttribsEntry* ExternalizeParaIxL(RWriteStream& aStream, const TLogicalPosition& aStart,
+					const TLogicalPosition& aEnd, const CStyleList* aStyleList) const;
+	void InternalizePhraseIxL(RReadStream& aStream, const CCharFormatLayer* aGlobalCharFormat);
+	void ExternalizePhraseIxL(RWriteStream& aStream) const;
+	void ExternalizePhraseIxL(RWriteStream& aStream,
+							  const TLogicalPosition& aStartPos,
+							  TLogicalPosition& aEndPos,
+							  const RPhraseAttribsEntry* aVirtualTrailingText) const;
+	inline void ExternalizePhraseCountL(RWriteStream& aStream, TInt aPhraseCount) const;
+	void ExternalizePhrasesL(RWriteStream& aStream, TInt aStart, TInt aPhraseCount, const RPhraseAttribsEntry* aVirtualPhrase = NULL) const;
+	TInt MarkStyleRegister(TDes8& aBuf, TInt aStartPara, TInt aEndPara) const;
+	TInt MarkRegister(TDes8& aBuf, TInt aStartPara, TInt aEndPara) const;
+	void GenerateAllPhraseLinksL();
+	void GeneratePhraseLink(CCharFormatLayer* aPhraseCharFormatLayer, const CParaFormatLayer* aBase);
+	void ExternalizeItemsPresentInStyleRegisterL(RWriteStream& aStream, TInt aRefStyleCount, const TDes8& aBuf) const;
+	void ExternalizeItemsPresentInRegisterL(RWriteStream& aStream, TInt aParaCount, const TDes8& aBuf, const CStyleList* aStyleList) const;
+	CParaAttribs* SharedParaAttribs(TUint8 aOrdinal);
+	TUint8 RefNum(const CParaAttribs* aParaAttribs) const;
+	//
+	// Copy,Paste
+	void PasteStylesL(RReadStream& aStream, CStyleMap& aMap, const TRtPasteContext& aContext);
+	void PasteSharedFormatsL(RReadStream& aStream, CParaAttribsMap& aMap, const TRtPasteContext& aContext, CStyleMap* aStyleMap);
+	void ImposeCharacterStyleL(CCharFormatLayer** aCharLayer);
+	void PasteIxL(RReadStream& aStream, TRtPasteContext& aContext, const CParaAttribsMap& aMap, CStyleMap* aStyleMap/*,CParaAttribs* aSecondReserved*/);
+	TInt PasteParaIxL(RReadStream& aStream, TRtPasteContext& aContext, TInt aCompleteParaCount, const CParaAttribsMap& aMap, RPhraseAttribsEntry*& aFirstParaVirtualPhrase, CStyleMap* aStyleMap);
+	TParaAttribsEntry DoPasteIntoParaL(RReadStream& aStream, const CParaAttribsMap& aMap, const TRtPasteContext& aContext, CStyleMap* aStyleMap);
+	TParaAttribsEntry DoPasteFirstIntoParaL(RReadStream& aStream, const CParaAttribsMap& aMap, const TRtPasteContext& aContext, RPhraseAttribsEntry*& aFirstParaVirtualPhrase, CStyleMap* aStyleMap);
+	void DoPasteCleanup(TLogicalPosition& aNormalizePos, CParaAttribs* aReclaimed);
+	TTextFragment GetTextFragmentL(RReadStream& aStream);
+	void PastePhraseIxL(RReadStream& aStream, TRtPasteContext& aContext, const RPhraseAttribsEntry* aFirstParaVirtualPhrase);
+	void DoPastePhraseL(RReadStream& aStream, const TRtPasteContext& aContext, RPhraseAttribsEntry& aPhrase);
+	void RbPasteSharedFormatsL(TInt aRet);
+	void NormalizeSharedList();
+	void RbRemoveInsertedParaAttribsEntries(TInt aFirstParaInsertPos, TInt aInsertedParaCount);
+	void RbPasteParaIxL(const TLogicalPosition& aPastePos, TInt aParaCount, TInt aRet);
+	void RbPastePhraseIxL(const TLogicalPosition& aPos,TInt aPhraseCount, TInt aRet);
+	void RbRemoveInsertedPhraseAttribsEntries(TInt aFirstPhraseInsertPos, TInt aInsertedPhraseCount);
+	TUint8 ReadTUint8CountL(RReadStream& aStream) const;
+	//
+	// General utility
+	void DoSoloInsertL(TInt aPos, TInt aLength);
+	void ScanToPosition(TInt aCharPos, TScanToPositionMode aMode, TLogicalPosition* aLastUsed=NULL);  // Reset the logical position to the passed document position.
+	inline TInt PhraseCount() const;
+	TBool FirstPhraseOfParagraph() const;  // Interrogates current iPos record.
+	TInt CurrentPhraseLength() const;  // Encapsulates constant/specific character formatting.
+	TInt CurrentPhraseOffset() const;  // Encapsulates constant/specific character formatting.
+	void CheckForUndetermined(const TCharFormatX& aFormatA, const TCharFormatX& aFormatB, TCharFormatXMask& aVaries) const;
+	void GetCurrentRecords(TCurrentIndexRecords& aRecord) const;
+	void GetPhraseFormat(TCurrentIndexRecords& aCurrent, TCharFormatX& aFormat, TCharFormatXMask& aMask, CCharFormatLayer*& aCharBase) const;
+	TInt OwningParagraph(TInt aPos, TLogicalPosition* aLastUsed = NULL) const;
+	TBool MergePhrases(TInt aPos);
+	TBool MergePhrases(const TLogicalPosition& aPos);
+	TBool DeleteInsertCharFormat();
+	void ConsolidateAt(TInt aPosition, TPositionOrPhrase aPositionOrPhrase);
+	void RemoveFromPhraseIx(TInt aPos, TInt aCount = 1);
+	void SplitPhraseL(TInt aSplitPos);
+	void SplitPhraseL(TInt aPhraseElement, TInt aPhraseOffset, CParaAttribs* aParaAttribs);
+	void DoSplitPhraseL(RPhraseAttribsEntry& aCurrentPhrase, TInt aPhraseOffset, CParaAttribs* aParaAttribs);
+	TUint8 SharedParaAttribsEntryCountL() const;
+	void ModifySpecificFormatting(CParaFormatLayer& aPl, CCharFormatLayer& aCl, CParagraphStyle::TApplyParaStyleMode aMode);
+//
+// support for applycharformat
+	static void ApplyCharFormatCleanup(TAny* aPtr);
+	void ApplyCharFormatRollback();
+	TInt MergePhrases(TInt aPhrase, RPhraseAttribsEntry& aPhraseAttribs, CParaAttribs& aParaAttribs);
+	void SplitPhraseL(TInt aPhrase, TInt anOffset, RPhraseAttribsEntry& aPhraseAttribs, CParaAttribs& aParaAttribs);
+	void Share(TParaAttribsEntry& aParaEntry, TInt aPhrase);
+	//
+	// Specific rollback
+	void RbInsertPicture(CParaAttribs* aGoodParaAttribs);
+	//
+	// General implementation
+	void NormalizeNow(const TLogicalPosition& aNormalizePos);
+	TBool DeleteParagraphText(TInt& aLength);
+	TBool DoDeleteFromParagraph(const TIndexDeleteInfo& aInfo);
+	void TidyAfterDelete(const TIndexDeleteInfo& aInfo);
+	CParaAttribs* ReserveCellL();
+	CParaAttribs* ReserveCellLC();
+	void DoNewInsertCharFormatL(const TCharFormatX& aFormat,
+		const TCharFormatXMask& aMask, CCharFormatLayer* aBasedOn,
+		CParaAttribs* aParaAttribs);
+	TInt ParaLengthFromBuffer(TDesC& aBuf) const;
+	inline const CStreamStore* ResolvedStreamStore(TInt aPos) const;
+	//
+	// Agenda functions
+	void AppendSharedFormatsL(CParaAttribsMap& aMap, const CRichTextIndex* aSource, const TGlobalLayerInfoAppend& aGlobalLayerInfo);
+	void AppendParaIndexL(const CRichTextIndex* aSource, const TGlobalLayerInfoAppend& aGlobalLayerInfo);
+	void AppendPhraseIndexL(const CRichTextIndex* aSource, const TGlobalLayerInfoAppend& aGlobalLayerInfo);
+	//
+	// Shared list management utilities
+	CParaAttribs* RequestReclaimShareL(CParaAttribs* aParaAttribs, TParaAttribsEntry* aParaEntry);
+	CParaAttribs* RequestShareL(CParaAttribs* aParaAttribs, CCharFormatLayer* aCharFormat = NULL, CParaAttribs* aReservedCell = NULL);
+	CParaAttribs* GetParaAttribsL(const CParaFormatLayer* aParaFormat, const CCharFormatLayer* aCharFormat, CParaAttribs* aReservedCell = NULL);
+	CParaAttribs* RequestShare(const TLogicalPosition& aLogicalPosition);
+	CParaAttribs* GetParaAttribs(const TLogicalPosition& aLogicalPosition);
+	CParaAttribs* GetParaAttribs(CParaAttribs* aParaAttribs, CCharFormatLayer& aCharFormatLayer);
+	CParaAttribs* FindSharedParaAttribs(const CParaFormatLayer& aParaFormatLayer, const CCharFormatLayer& aCharFormatLayer);
+	void RebalanceIndex();
+	void SplitParagraphAtPastePosL(TLogicalPosition& aPastePos, TLogicalPosition& aNewPos,
+								   const CParaFormatLayer& aGlobalParaFormatLayer);
+	//
+	inline void SetPhraseSplit(TBool aBool);
+	inline TBool PhraseSplit() const;
+private:
+	const CRichText& iText;  // backward reference to owning rich text.
+	TUint32 iFlags;
+	TInt iPendingNewPhrasePos;  // When *INSERTSTATE* is active, this is used to place the zero-length phrase.
+	CParaAttribs* iRollbackParaAttribsHandle;
+	__MUTABLE TDblQue<CParaAttribs> iSharedParaQueHead;
+	__MUTABLE TLogicalPosition iLastUsed;
+	CCharFormatLayer* iLastCharacterStyle;
+public:
+	CArrayFixSeg<TParaAttribsEntry>* iParaIx;  // One entry per paragraph
+	CArrayFixSeg<RPhraseAttribsEntry>* iPhraseIx;  // One entry per phrase in the rich text
+	__MUTABLE TLogicalPosition iPos;
+	TInt iPictureCount;  // a count of the number of pictures contained by this text
+
+	__DECLARE_TEST;
+	};
+
+////////////////////////////////////////
+
+template <class T>
+void CRichTextStoreMap<T>::__DbgTestInvariant() const
+// Provides class invariants.  Explanations below:
+//
+	{
+#ifdef _DEBUG
+	TInt count = Count();
+	for (TInt ii = 0; ii < count; ii++)
+		{
+		TInt ref = (*iMap)[ii].iRefNumber;
+		__ASSERT_DEBUG(ref > 0, User::Invariant());
+		}
+#endif
+	}
+
+
+template <class T>
+CRichTextStoreMap<T>* CRichTextStoreMap<T>::NewLC(TInt aMaximumCapacity)
+// Return a handle to a new instance of this class.
+//
+	{
+	CRichTextStoreMap* self = new(ELeave) CRichTextStoreMap();
+	CleanupStack::PushL(self);
+	self->ConstructL(aMaximumCapacity);
+	return self;
+	}
+
+
+
+template <class T>
+void CRichTextStoreMap<T>::ConstructL(TInt aMaximumCapacity)
+//
+//
+	{
+	if (aMaximumCapacity > 0)
+		{
+		iMap = new(ELeave) CArrayFixFlat<TRichTextMapEntry>(aMaximumCapacity);
+		iMap->SetReserveL(aMaximumCapacity);	// never need to allocate memory
+		}
+	iCapacity = aMaximumCapacity;
+	}
+
+
+template <class T>
+CRichTextStoreMap<T>::~CRichTextStoreMap()
+//
+//
+	{delete iMap;}
+
+
+template <class T>
+void CRichTextStoreMap<T>::Bind(TInt aRef, T* aT)
+//
+//
+	{
+	__TEST_INVARIANT;
+	__ASSERT_ALWAYS(Count() <= iCapacity, Panic(ESharedFormatsMapOverFlow));
+
+	TRichTextMapEntry entry(aRef, aT);
+	iMap->AppendL(entry);  // will not fail: we have reserved the space
+
+	__TEST_INVARIANT;
+	}
+
+
+
+template <class T>
+void CRichTextStoreMap<T>::Bind(T* aS, T* aT)
+//
+//
+	{
+	__TEST_INVARIANT;
+	__ASSERT_ALWAYS(Count() <= iCapacity, Panic(ESharedFormatsMapOverFlow));
+
+	TRichTextMapEntry entry(aS, aT);
+	iMap->AppendL(entry);  // will not fail: we have reserved the space
+
+	__TEST_INVARIANT;
+	}
+
+
+template <class T>
+T* CRichTextStoreMap<T>::Item(TInt aRef) const
+//
+//
+	{
+	TInt count = Count();
+	if (count > 0)
+		{
+		const TRichTextMapEntry* entry = &(*iMap)[0];
+		for (const TRichTextMapEntry* end = entry + count; entry < end; entry++)
+			{
+			if (entry->iRefNumber == aRef)
+				return (T*)entry->iT;
+			}
+		}
+	return NULL;
+	}
+
+
+template <class T>
+T* CRichTextStoreMap<T>::Item(const T* aS) const
+//
+//
+	{
+	TInt count = Count();
+	if (count > 0)
+		{
+		const TRichTextMapEntry* entry = &(*iMap)[0];
+		for (const TRichTextMapEntry* end = entry + count; entry < end; entry++)
+			{
+			if (entry->iS == (TAny*)aS)
+				return (T*)entry->iT;
+			}
+		}
+	return NULL;
+	}
+
+
+#include "TXTINDEX.INL"
+
+
+#endif