williamr@4: /* williamr@4: * Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). williamr@4: * All rights reserved. williamr@4: * This component and the accompanying materials are made available williamr@4: * under the terms of "Eclipse Public License v1.0" williamr@4: * which accompanies this distribution, and is available williamr@4: * at the URL "http://www.eclipse.org/legal/epl-v10.html". williamr@4: * williamr@4: * Initial Contributors: williamr@4: * Nokia Corporation - initial contribution. williamr@4: * williamr@4: * Contributors: williamr@4: * williamr@4: * Description: williamr@4: * williamr@4: */ williamr@4: williamr@2: williamr@2: #ifndef __TXTRICH_H__ williamr@2: #define __TXTRICH_H__ williamr@2: williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: williamr@4: #ifndef SYMBIAN_ENABLE_SPLIT_HEADERS williamr@4: #include williamr@4: #include williamr@4: #endif williamr@2: williamr@2: // forward references williamr@2: class CRichTextIndex; williamr@2: class CStreamStore; williamr@2: class CStoreMap; williamr@2: class MPictureFactory; williamr@2: class MRichTextStoreResolver; williamr@2: class TCharFormatX; williamr@2: class TCharFormatXMask; williamr@2: class CParserData; williamr@2: williamr@2: williamr@2: class CRichText : public CGlobalText williamr@2: /** williamr@2: Text with rich formatting. williamr@2: williamr@2: In rich text, each paragraph can have a different paragraph format, and each williamr@2: character can have a different character format. williamr@2: williamr@2: All formatting in a rich text object is based on a global character and williamr@2: paragraph format layer, and a chain of layers on which they may be based. In williamr@2: case of conflict, upper layers override lower layers. These two format layers williamr@2: are specified on construction, and are not owned by the text object. Additional williamr@2: formatting may then be added to any portion of the text. This is called specific williamr@2: formatting and in case of conflict, it overrides the formatting in the global williamr@2: layers. Specific formatting is owned by the text object. So, the effective williamr@2: formatting of a rich text object may be composed of specific formatting and williamr@2: formatting specified in a chain of format layers. williamr@2: williamr@2: Rich text supports styles. A style is a named set of paragraph and character williamr@2: format attributes. Styles are stored in a list which is passed to the rich williamr@2: text object on construction, or which is assigned to the object after williamr@2: construction. Styles can be appended to and removed from the list and existing williamr@2: styles can be modified. Only paragraph styles are supported. This means that williamr@2: styles are applied to entire paragraphs, although both character and paragraph williamr@2: format attributes may be set in the style. williamr@2: williamr@2: Rich text also supports object embedding. Embedded objects are represented williamr@2: in rich text by CPicture-derived objects. A rich text object which supports williamr@2: the display of pictures needs to be supplied with a picture factory. williamr@2: williamr@2: @see CParagraphStyle williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: { williamr@2: public: williamr@2: williamr@2: /** Number of paragraphs in the object. */ williamr@2: enum TParaType williamr@2: { williamr@2: /** The text object will contain a single paragraph. */ williamr@2: ESinglePara, williamr@2: /** The text object will contain multiple paragraphs. */ williamr@2: EMultiPara williamr@2: }; williamr@2: public: williamr@2: // Create new rich text component whose sole content is an end-of-document character. williamr@2: IMPORT_C static CRichText* NewL(const CParaFormatLayer* aGlobalParaLayer, const CCharFormatLayer* aGlobalCharLayer, williamr@2: TDocumentStorage aStorage = ESegmentedStorage, williamr@2: TInt aDefaultTextGranularity = EDefaultTextGranularity, williamr@2: TParaType aParaType = EMultiPara); williamr@2: // Create new rich text component, supporting STYLES, whose sole content is an end-of-document character. williamr@2: IMPORT_C static CRichText* NewL(const CParaFormatLayer* aGlobalParaLayer, const CCharFormatLayer* aGlobalCharLayer, williamr@2: const CStyleList& aStyleList, williamr@2: TDocumentStorage aStorage = ESegmentedStorage, williamr@2: TInt aDefaultTextGranularity = EDefaultTextGranularity, williamr@2: TParaType aParaType = EMultiPara); williamr@2: // Restore into new rich text, using the specified global layers. williamr@2: IMPORT_C static CRichText* NewL(const CStreamStore& aStore, TStreamId aStreamId, williamr@2: const CParaFormatLayer* aGlobalParaLayer, const CCharFormatLayer* aGlobalCharLayer, williamr@2: MTextFieldFactory* aFieldFactory = NULL, williamr@2: TDocumentStorage aStorage = ESegmentedStorage); williamr@2: // Restore into new rich text, using the specified layers, store & picture factory. williamr@2: IMPORT_C static CRichText* NewL(const CStreamStore& aStore, TStreamId aStreamId, williamr@2: const CParaFormatLayer* aGlobalParaLayer, const CCharFormatLayer * aGlobalCharLayer, williamr@2: MPictureFactory* aPictureFactory, MRichTextStoreResolver* aStoreResolver, williamr@2: MTextFieldFactory* aFieldFactory = NULL, williamr@2: TDocumentStorage aStorage = ESegmentedStorage); williamr@2: IMPORT_C virtual ~CRichText(); williamr@2: // williamr@2: // Default persist functions - Deferred loading of pictures williamr@2: IMPORT_C void RestoreWithStyleListL(const CStreamStore& aStore, TStreamId aStreamId, const CStyleList& aExternalStyleList); williamr@2: // williamr@2: IMPORT_C virtual void StoreComponentsL(CStreamStore& aStore, CStoreMap& aMap) const; williamr@2: IMPORT_C virtual void RestoreComponentsL(const CStreamStore& aStore); williamr@2: IMPORT_C virtual void ExternalizeL(RWriteStream& aStream) const; williamr@2: IMPORT_C virtual void InternalizeL(RReadStream& aStream); williamr@2: // williamr@2: // Custom persist functions williamr@2: IMPORT_C void ExternalizeStyleDataL(RWriteStream& aStream) const; williamr@2: IMPORT_C void InternalizeStyleDataL(RReadStream& aStream); williamr@2: // williamr@2: IMPORT_C void StoreMarkupComponentsL(CStreamStore& aStore, CStoreMap& aMap) const; williamr@2: IMPORT_C void ExternalizeMarkupDataL(RWriteStream& aStream) const; williamr@2: IMPORT_C void InternalizeMarkupDataL(RReadStream& aStream); williamr@2: // williamr@2: // Utility persist functions williamr@2: IMPORT_C void SetPictureFactory(MPictureFactory* aPictureFactory, MRichTextStoreResolver* aStoreResolver); williamr@2: inline MPictureFactory* PictureFactory() const; williamr@2: inline MRichTextStoreResolver* StoreResolver() const; williamr@2: IMPORT_C TPictureHeader PictureHeader(TInt aPos) const; williamr@2: IMPORT_C void DropPictureOwnership(TInt aPos); // delete picture character. Forget but don't delete picture. williamr@2: IMPORT_C void DetachFromStoreL(CPicture::TDetach aDegree); williamr@2: IMPORT_C void DetachFromStoreL(CPicture::TDetach aDegree, TInt aPos, TInt aLength); williamr@2: IMPORT_C TBool HasMarkupData() const; williamr@2: // williamr@2: // Copy/Paste williamr@2: IMPORT_C virtual void CopyToStoreL(CStreamStore& aStore, CStreamDictionary& aDictionary, TInt aPos, TInt aLength) const; williamr@2: IMPORT_C virtual TInt PasteFromStoreL(const CStreamStore& aStore, const CStreamDictionary& aDictionary, TInt aPos); williamr@2: IMPORT_C TInt PasteFromStoreL(const CStreamStore& aStore, const CStreamDictionary& aDictionary, TInt aPos, CParagraphStyle::TStylePasteMode aStylePasteMode); williamr@2: // williamr@2: // Content modifier functions williamr@2: IMPORT_C virtual void Reset(); williamr@2: IMPORT_C virtual void InsertL(TInt aPos, const TChar& aChar); // Insert a single character. williamr@2: IMPORT_C virtual void InsertL(TInt aPos, const TDesC& aBuf); williamr@2: IMPORT_C void InsertL(TInt aPos, const TPictureHeader& aHeader); // Insert a picture header. williamr@2: // williamr@2: // aPos is the position of the character being deleted, *not* the current cursor position! williamr@2: IMPORT_C virtual TBool DeleteL(TInt aPos, TInt aLength); // Call this for a delete-forward. williamr@2: // williamr@2: // Leave-safe delete for removing content from *within* a single paragraph only williamr@2: IMPORT_C void DeleteFromParagraph(TInt aPos, TInt aLength); williamr@2: // williamr@2: // Leave-safe delete for removing *entire* paragraphs williamr@2: IMPORT_C void DeleteParagraph(TInt aPos, TInt aLength); williamr@2: // williamr@2: // Special behaviour format modifier functions. williamr@2: // Call this when applying a character format to a zero length selection, eg, turning bold on. williamr@2: IMPORT_C void SetInsertCharFormatL(const TCharFormat& aFormat, const TCharFormatMask& aMask, TInt aPos); williamr@2: // williamr@2: // Call this on every cursor movement, page up/down etc... williamr@2: IMPORT_C void CancelInsertCharFormat(); williamr@2: // williamr@2: // Delete content, but preserve phrase format if aPos is at a phrase boundary. williamr@2: // aPos is the position of the character being deleted, *not* the current cursor position! williamr@2: IMPORT_C TBool DelSetInsertCharFormatL(TInt aPos, TInt aLength); williamr@2: // williamr@2: // MLaydoc implementation williamr@2: IMPORT_C virtual void GetParagraphFormatL(CParaFormat* aFormat, TInt aPos) const; williamr@2: IMPORT_C virtual void GetChars(TPtrC& aView, TCharFormat& aFormat, TInt aPos) const; williamr@2: IMPORT_C virtual TInt GetPictureSizeInTwips(TSize& aSize, TInt aPos) const; williamr@2: IMPORT_C virtual CPicture* PictureHandleL(TInt aPos, MLayDoc::TForcePictureLoad aForceLoad = MLayDoc::EForceLoadTrue) const; williamr@2: // williamr@2: // MFormatText implementation williamr@2: // Used only by dialog writers, since they are not interested in the text, but require knowledge williamr@2: // of attributes whose values change across the specified range. williamr@2: IMPORT_C virtual void GetParaFormatL(CParaFormat* aFormat, TParaFormatMask& aVaries, TInt aPos, TInt aLength, williamr@2: CParaFormat::TParaFormatGetMode aMode = CParaFormat::EAllAttributes) const; williamr@2: IMPORT_C virtual void ApplyParaFormatL(const CParaFormat* aFormat, const TParaFormatMask& aMask, TInt aPos, TInt aLength); williamr@2: IMPORT_C virtual void GetCharFormat(TCharFormat& aFormat, TCharFormatMask& aVaries, TInt aPos, TInt aLength) const; williamr@2: IMPORT_C virtual void ApplyCharFormatL(const TCharFormat& aFormat, const TCharFormatMask& aMask, TInt aPos, TInt aLength); williamr@2: // williamr@2: // williamr@2: IMPORT_C void GetSpecificCharFormat(TCharFormat& aFormat, TCharFormatMask& aMask, TInt aPos) const; williamr@2: IMPORT_C void GetSpecificCharFormatRight(TCharFormat& aFormat, TCharFormatMask& aMask, TInt aPos) const; williamr@2: IMPORT_C void GetSpecificParagraphFormatL(CParaFormat* aFormat, TParaFormatMask& aMask, TInt aPos) const; williamr@2: // williamr@2: // Paragraph style implementation williamr@2: IMPORT_C void ApplyParagraphStyleL(const CParagraphStyle& aStyle, TInt aPos, TInt aLength, CParagraphStyle::TApplyParaStyleMode aMode); williamr@2: inline void NotifyStyleDeletedL(const CParagraphStyle* aStyle); williamr@2: IMPORT_C void NotifyStyleChangedL(const CParagraphStyle* aTo, const CParagraphStyle* aFrom); williamr@2: IMPORT_C const CParaFormatLayer* ParagraphStyle(TBool& aStyleChangesOverRange, TInt aPos, TInt aLength) const; williamr@2: // williamr@2: // StyleList implementation williamr@2: inline TBool StyleListPresent() const; williamr@2: inline CStyleList* StyleList() const; williamr@2: inline TInt StyleCount() const; williamr@2: williamr@2: inline void SetStyleListExternallyOwned(TBool aExternallyOwned); williamr@2: IMPORT_C void SetStyleListExternallyOwned(const CStyleList& aStyleList); williamr@2: inline TBool StyleListExternallyOwned() const; williamr@2: // williamr@2: // Utility functions williamr@2: IMPORT_C void RemoveSpecificParaFormatL(TInt aPos, TInt aLength); williamr@2: IMPORT_C void RemoveSpecificCharFormatL(TInt aPos, TInt aLength); williamr@2: IMPORT_C TInt PictureCount() const; williamr@2: IMPORT_C virtual TInt ParagraphCount() const; williamr@2: IMPORT_C virtual TInt CharPosOfParagraph(TInt& aLength, TInt aParaOffset) const; williamr@2: IMPORT_C virtual TInt ParagraphNumberForPos(TInt& aPos) const; williamr@2: IMPORT_C virtual TEtextComponentInfo ComponentInfo() const; williamr@2: // williamr@2: // Text field implementation williamr@2: IMPORT_C virtual void UpdateFieldL(TInt aPos); // updates the field at aPos williamr@2: // finds number of fields in range. Includes the field containing aPos, if applicable williamr@2: // aInfo is set to the first field in the range (if any are found) williamr@2: // williamr@2: // Speciality functions williamr@2: IMPORT_C void AppendTakingSolePictureOwnershipL(const CRichText& aSource); williamr@2: IMPORT_C void AppendParagraphL(TInt aReplicas = 1); williamr@2: IMPORT_C virtual void SetHasChanged(TBool aHasChanged); williamr@2: williamr@2: IMPORT_C void ExtendedInterface(TAny*& aInterface, TUid aInterfaceId); // from CEditableText williamr@2: williamr@2: // non-exported public functions williamr@2: void ApplyExtendedCharFormatL(const TCharFormatX& aFormat, const TCharFormatXMask& aMask, TInt aPos, TInt aLength); williamr@2: void GetExtendedCharFormat(TCharFormatX& aFormat, TCharFormatXMask& aVaries, TInt aPos, TInt aLength) const; williamr@2: void GetTextAndExtendedFormat(TPtrC& aText, TCharFormatX& aFormat, TInt aPos) const; williamr@2: williamr@2: private: williamr@2: CRichText(const CRichText& aRichText); williamr@2: CRichText& operator=(const CRichText& aRichText); williamr@2: void KillStyleList(); williamr@2: void KillIndex(); williamr@2: TBool CreateEmptyMarkupComponentL(); williamr@2: void CreateAndGenerateMarkupComponentL(); williamr@2: void GenerateMarkupL(); williamr@2: void CompletePastePlainTextL(TInt aPos,TInt aCharacterCount); williamr@2: TInt DoPasteRtFromStoreL(const CStreamStore& aStore, const CStreamDictionary& aDictionary, TInt aPos, CParagraphStyle::TStylePasteMode aStylePasteMode); williamr@2: TBool IndexPresent() const; williamr@2: inline void SetParaTypeIsSingle(TBool aBool); williamr@2: inline TBool ParaTypeIsSingle() const; williamr@2: void SetExtendedInsertCharFormatL(const TCharFormatX& aFormat, const TCharFormatXMask& aMask, TInt aPos); williamr@2: void GetSpecificCharFormatLeftRight(TCharFormat& aFormat, williamr@2: TCharFormatMask& aMask, TInt aPos, TBool aLeft) const; williamr@2: void DoApplyExtendedCharFormatL(const TCharFormatX& aFormat,const TCharFormatXMask& aMask,TInt aPos,TInt aLength); williamr@2: williamr@2: protected: williamr@2: IMPORT_C CRichText(const CParaFormatLayer* aGlobalParaLayer, const CCharFormatLayer* aGlobalCharLayer, williamr@2: CStyleList* aStyleList = NULL); williamr@2: // New constructL's - to be merged post 057 williamr@2: IMPORT_C void ConstructL(TDocumentStorage aStorage, TInt aDefaultTextGranularity, TParaType aParaType); williamr@2: IMPORT_C void ConstructL(const CStreamStore& aStore, TStreamId aStreamId, MPictureFactory* aFactory, MRichTextStoreResolver* aStoreResolver, williamr@2: MTextFieldFactory* aFieldFactory=NULL, williamr@2: TDocumentStorage aStorage = ESegmentedStorage); williamr@2: // williamr@2: void InternalizeL(RReadStream& aStream, const CStyleList* aExternalStyleList); williamr@2: IMPORT_C void DoExternalizeStyleDataL(RWriteStream& aStream) const; williamr@2: IMPORT_C void DoInternalizeStyleDataL(RReadStream& aStream); williamr@2: void DoInternalizeStyleDataL(RReadStream& aStream, const CStyleList* aExternalStyleList); williamr@2: IMPORT_C void DoExternalizeMarkupDataL(RWriteStream& aStream) const; williamr@2: IMPORT_C void DoInternalizeMarkupDataL(RReadStream& aStream); williamr@2: void StoreStylesL(CStreamStore& aStore,CStoreMap& aMap) const; williamr@2: void RestoreStylesL(const CStreamStore& aStore, TStreamId aId, const CParaFormatLayer* aParaFormatLayer, const CCharFormatLayer* aCharFormatLayer); williamr@2: void StoreMarkupL(CStreamStore& aStore,CStoreMap& aMap)const; williamr@2: // williamr@2: IMPORT_C void RtInsertL(TInt aPos,const TDesC& aBuf); williamr@2: // williamr@2: TStreamId DoCopyToStoreL(CStreamStore& aStore, TInt aPos, TInt aLength, TStreamId aGlobalTextId, TBool aCopyStyles) const; williamr@2: IMPORT_C void CopyComponentsL(CStreamStore& aStore, CStoreMap& aMap, TInt aPos,TInt aLength, TStreamId aGlobalTextId) const; williamr@2: IMPORT_C void CopyToStreamL(RWriteStream& aStream, TInt aPos, TInt aLength, TStreamId aGlobalTextId) const; williamr@2: IMPORT_C void CopyToStreamL(RWriteStream& aStream, TInt aPos, TInt aLength) const; williamr@2: void CopyToStreamL(RWriteStream& aStream, TInt aPos, TInt aLength, TStreamId aGlobalTextId, TBool aCopyStyles) const; williamr@2: TInt PasteRichTextFromStoreL(const CStreamStore& aStore, const CStreamDictionary& aDictionary, TStreamId& anId, TInt aPos, CParagraphStyle::TStylePasteMode aStylePasteMode); williamr@2: void CompletePasteRichTextFromStoreL(const CStreamStore& aStore, TStreamId& aRichTextStreamId, TInt aPos, CParagraphStyle::TStylePasteMode aStylePasteMode); williamr@2: TInt PastePlainTextFromStoreL(const CStreamStore& aStore, TStreamId& anId, TInt aPos); williamr@2: // williamr@2: // Append williamr@2: void PrepareAppendMarkupL(const CRichText& aSource); williamr@2: void DoAppendTakingSolePictureOwnershipL(const CRichText& aSource); williamr@2: public: williamr@2: IMPORT_C static void ActivateParserL(MParser* aParser); // Switch on a particular parser williamr@2: IMPORT_C static void DeactivateParser(MParser* aParser); // Switch off a particular parser williamr@2: IMPORT_C static void ActivateDefaultParserL(MParser* aParser); // Switch on a default parser williamr@2: IMPORT_C static void DeactivateParserDefaults(); // Switch off default set (if any) williamr@2: // and delete EText TLS williamr@2: williamr@2: IMPORT_C void SetEditObserver(MEditObserver* aEditObserver); williamr@2: IMPORT_C TBool ParseText(TInt& aStartOfTags, TInt& aLength, TBool aForceScanAllText); williamr@2: IMPORT_C TBool CursorOverTag(TInt aPos, MParser*& aParser, TInt& aTagStart, TInt& aLength) const; williamr@2: // Next tag (forwards), any or specific parser williamr@2: IMPORT_C TInt PositionOfNextTag(TInt aPos) const; williamr@2: IMPORT_C TInt PositionOfNextTag(TInt aPos, const MParser* aParser) const; williamr@2: // Prev tag (backwards), any or specific parser williamr@2: IMPORT_C TInt PositionOfPrevTag(TInt aPos) const; williamr@2: IMPORT_C TInt PositionOfPrevTag(TInt aPos, const MParser* aParser) const; williamr@2: williamr@2: private: williamr@2: static void CreateParserETextTLSL(); williamr@2: TBool DoCursorOverTag(TInt aPos, MParser*& aParser, TInt& aTagStart, TInt& aLength) const; williamr@2: void OverrideFormatForParsersIfApplicable(TPtrC& aText, TCharFormatX& aFormat, TInt aStartPos) const; williamr@2: void CallEditObserver(TInt aStart, TInt aExtent) const; williamr@2: williamr@2: protected: williamr@2: enum {EDelimiterCharacterLength = 1}; williamr@2: private: williamr@2: TSwizzle iStyleList; williamr@2: TSwizzle iIndex; williamr@2: TUint32 iFlags; williamr@2: MPictureFactory* iPictureFactory; williamr@2: MRichTextStoreResolver* iStoreResolver; williamr@2: williamr@2: CParserData* iParserData; williamr@2: williamr@2: void* iReserved_3; williamr@2: williamr@2: __DECLARE_TEST; // Index consistency check with document length. williamr@2: }; williamr@2: williamr@2: williamr@2: #include williamr@2: williamr@2: williamr@2: #endif williamr@4: williamr@4: williamr@4: