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 __FRMTLAY_H__ williamr@2: #define __FRMTLAY_H__ williamr@2: williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: williamr@2: class CWindowGc; williamr@2: class MLayDoc; williamr@2: class TLayDocTextSource; williamr@2: class TCursorPosition; williamr@2: williamr@4: class TLayDocTextSource; williamr@4: class CTmTextLayout; williamr@4: class TTmHighlightExtensions; williamr@4: class MTmSource; williamr@4: class TTmFormatParamBase; williamr@4: williamr@4: #ifndef SYMBIAN_ENABLE_SPLIT_HEADERS williamr@4: #include williamr@4: #endif williamr@2: williamr@2: /** williamr@2: This interface class defines an interface for clients of Form to provided williamr@2: implementations of customisation interfaces relating to the source text williamr@2: document as requried by the internals of Form and Tagma. Its use by williamr@2: Form clients is optional. williamr@2: Derived objects of this interface are registered with the CTextLayout williamr@2: API and are called from the TLayDocTextSource class at present. williamr@4: @publishedAll williamr@2: @released williamr@2: @see MTmInlineTextSource williamr@2: */ williamr@2: class MFormCustomInterfaceProvider williamr@2: { williamr@2: public: williamr@2: /** williamr@2: Form uses this method to request an interface implmentation for the williamr@2: specified interface Uid. See class description for interfaces covered williamr@2: by this API. williamr@2: @param aInterfaceId williamr@2: The unique identifier for the interface wanted by Form. williamr@2: @return williamr@2: Ptr to interface instance or 0 if not supported by client williamr@2: */ williamr@2: virtual TAny* GetExtendedInterface(const TUid& aInterfaceId) = 0; williamr@2: }; williamr@2: williamr@2: williamr@2: /** Parameter used to control which part of a line (top, baseline or bottom) williamr@2: should be scrolled to a certain vertical position in a view rectangle. Used williamr@2: as a parameter in functions like CTextView::HandleGlobalChangeL() and williamr@2: CTextLayout::SetViewL(). The selected part of the line is called the hotspot. williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: class TViewYPosQualifier williamr@2: { williamr@2: friend class CTextLayout; williamr@2: friend class CTextView; williamr@2: public: williamr@2: /** Which part of a line (top, baseline or bottom) should appear at a williamr@2: vertical pixel position. */ williamr@2: enum TPartOfLine williamr@2: { williamr@2: /** The top pixel is placed at the specified vertical point. */ williamr@2: EFViewTopOfLine = 1, williamr@2: /** The baseline is placed at the specified vertical point. */ williamr@2: EFViewBaseLine = 0, williamr@2: /** The bottom pixel is placed at the specified vertical point. */ williamr@2: EFViewBottomOfLine = 2 williamr@2: }; williamr@2: williamr@2: /** Whether the top line in the view should be fully visible. */ williamr@2: enum TFullyVisible williamr@2: { williamr@2: /** Force a partially visible top line to be fully visible. */ williamr@2: EFViewForceLineFullyVisible = ETrue, williamr@2: /** Do not force a partially visible top line to be fully visible. */ williamr@2: EFViewDontForceLineFullyVisible = EFalse williamr@2: }; williamr@2: public: williamr@2: inline TViewYPosQualifier(); williamr@2: IMPORT_C void SetHotSpot(TPartOfLine aHotSpot); williamr@2: IMPORT_C void SetFillScreen(TBool aFillScreen = ETrue); williamr@2: IMPORT_C void SetMakeLineFullyVisible(TFullyVisible aMakeLineFullyVisible = EFViewForceLineFullyVisible); williamr@2: private: williamr@2: TPartOfLine iHotSpot; williamr@2: TBool iFillScreen; williamr@2: TFullyVisible iFullyVisible; williamr@2: }; williamr@2: williamr@2: /** williamr@2: A structure used to return the results of a reformatting operation. williamr@2: @see CTextLayout::HandleBlockChangeL() williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: class TViewRectChanges williamr@2: williamr@2: { williamr@2: public: williamr@2: inline TViewRectChanges(); williamr@2: williamr@2: public: williamr@2: /** The vertical coordinate of the top of the first line of reformatted williamr@2: text. */ williamr@2: TInt iFormattedFrom; williamr@2: /** The vertical coordinate of the bottom of the last line of reformatted williamr@2: text. */ williamr@2: TInt iFormattedTo; williamr@2: /** The number of pixels by which text above the reformatted or edited williamr@2: block has scrolled (positive values mean the text moved down). */ williamr@2: TInt iScrollAtTop; williamr@2: /** The number of pixels by which text below the reformatted or edited williamr@2: block has scrolled (positive values mean the text moved down). */ williamr@2: TInt iScrollAtBottom; williamr@2: }; williamr@2: williamr@2: /** williamr@2: The cursor or cursor selection within a document. williamr@2: williamr@2: If the cursor and anchor position differ, the selection covers the text from williamr@2: the lower to the higher position, not including the character after the higher williamr@2: position. If the selection is changed (by shift plus arrow keys in many UIs) williamr@2: the cursor position changes and the anchor remains the same. williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: class TCursorSelection williamr@2: williamr@2: { williamr@2: public: williamr@2: inline TCursorSelection(); williamr@2: inline TCursorSelection(TInt aCursorPos,TInt aAnchorPos); williamr@2: inline void SetSelection(TInt aCursorPos,TInt aAnchorPos); williamr@2: inline TInt LowerPos() const; williamr@2: inline TInt HigherPos() const; williamr@2: inline TInt Length() const; williamr@2: public: williamr@2: /** The cursor position. */ williamr@2: TInt iCursorPos; williamr@2: /** The anchor position. */ williamr@2: TInt iAnchorPos; williamr@2: }; williamr@2: williamr@2: /** williamr@2: Parameters used by functions that draw text. williamr@2: williamr@2: An object of this class is passed to CTextLayout::DrawL() and to williamr@2: InvertRangeL(). The draw context includes the view rectangle, the graphics williamr@2: context, the background colour and the margin widths. williamr@2: williamr@2: You only need to use this class directly when you are using a CTextLayout williamr@2: object which is not owned by a CTextView object. williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: class TDrawTextLayoutContext williamr@2: williamr@2: { williamr@2: private: williamr@2: enum TDrawMode williamr@2: { williamr@2: EFDrawText=0x001, williamr@2: EFDrawGraphics=0x002, williamr@2: EFUseClippingRect=0x004, williamr@2: EFUseWindowGc=0x008, williamr@2: EFUseGcClear=0x020, williamr@2: EFUseBackgroundColor=0x040, williamr@2: EFUseOverrideTextColor=0x080, williamr@2: EFParagraphFillTextOnly=0x100, williamr@2: EFAllFlags=0xfff williamr@2: }; williamr@2: public: williamr@2: IMPORT_C TDrawTextLayoutContext(); williamr@2: williamr@2: IMPORT_C void SetGc(CGraphicsContext* aGc,CGraphicsContext* aPictureGc=NULL); williamr@2: IMPORT_C void SetBitmapGc(CBitmapContext* aGc,CBitmapContext* aPictureGc=NULL); williamr@2: IMPORT_C void SetWindowGc(CWindowGc* aGc,CWindowGc* aPictureGc=NULL); williamr@2: IMPORT_C void SetDrawToEveryPixel(TBool aDrawToEveryPixel); williamr@2: IMPORT_C void SetTextColorOverride(const TRgb *aOverrideColor); williamr@2: IMPORT_C void SetDrawTextOnly(); williamr@2: IMPORT_C void SetDrawGraphicsOnly(); williamr@2: IMPORT_C void SetDrawTextAndGraphics(); williamr@2: IMPORT_C void SetClipping(TBool aClipping); williamr@2: // deprecated 7.0 williamr@2: IMPORT_C void SetParagraphFillTextOnly(TBool aFillTextOnly); williamr@2: williamr@2: //Enquiry functions williamr@2: IMPORT_C const TRgb* TextOverrideColor() const; williamr@2: IMPORT_C CGraphicsContext* PrimaryGc() const; williamr@2: IMPORT_C CGraphicsContext* PictureGc() const; williamr@2: IMPORT_C TBool UseClippingRect() const; williamr@2: IMPORT_C TBool UseGcClear() const; williamr@2: IMPORT_C TBool DrawText() const; williamr@2: IMPORT_C TBool DrawGraphics() const; williamr@2: IMPORT_C TBool UseBackgroundColor() const; williamr@2: // deprecated 7.0 williamr@2: IMPORT_C TBool ParagraphFillTextOnly() const; williamr@2: williamr@2: //Physical dimensions williamr@2: IMPORT_C TRect TextArea() const; williamr@2: IMPORT_C TInt DisplayHeight() const; williamr@2: IMPORT_C TPoint TopLeftTextArea() const; williamr@2: IMPORT_C TRect TotalMargin() const; williamr@2: IMPORT_C TRect LabelMargin() const; williamr@2: IMPORT_C TBool IsLabelMargin() const; williamr@2: IMPORT_C TRect GutterMargin() const; williamr@2: IMPORT_C TBool IsGutterMargin() const; williamr@2: IMPORT_C TPoint TopLeftText() const; williamr@2: IMPORT_C void WindowToText(TPoint& aWinPos) const; williamr@2: IMPORT_C void WindowToText(TRect& aRect) const; williamr@2: IMPORT_C void TextToWindow(TPoint& aTextAreaPos) const; williamr@2: IMPORT_C void TextToWindow(TRect& aRect) const; williamr@2: williamr@2: TBool UseWindowGc() const; williamr@2: void SetDrawMode(TUint aDrawMode); williamr@2: TUint DrawMode() const; williamr@2: williamr@2: public: williamr@2: /** The view rectangle (specified in window coordinates). This is used to williamr@2: set the area in which text can be drawn. Text can only be drawn within the williamr@2: intersection between the text area and the aDrawRect parameter passed to williamr@2: CTextLayout::DrawL() or InvertRangeL(). */ williamr@2: TRect iViewRect; williamr@2: /** The label margin width. By default zero. Must have the same value as williamr@2: the label margin width as set in the text layout object. */ williamr@2: TInt iLabelMarginWidth; williamr@2: /** The gutter margin width (also known as the line cursor margin width). williamr@2: By default zero. */ williamr@2: TInt iGutterMarginWidth; williamr@2: /** The horizontal offset between window coordinates and text layout williamr@2: coordinates. */ williamr@2: TInt iTextStartX; williamr@2: /** The background colour for the view rectangle. The background colour is williamr@2: used to fill the parts of the view rectangle in which text cannot appear, williamr@2: for example, below the last line of the document and in the label, line williamr@2: cursor and left text margins. */ williamr@2: TLogicalRgb iBackgroundColor; williamr@2: private: williamr@2: CGraphicsContext* iGc; williamr@2: CGraphicsContext* iPictureGc; williamr@2: TLogicalRgb iOverrideTextColor; williamr@2: TUint iDrawMode; williamr@2: }; williamr@2: williamr@2: /** williamr@2: An abstract class which specifies the protocol for customising the way text williamr@2: and its background are drawn. williamr@2: williamr@2: Common uses for this are to implement custom highlighting or to draw a williamr@2: background bitmap. You must create an object of a class derived from this class williamr@2: and call CTextLayout::SetCustomDraw(), passing a pointer to the object. All of williamr@2: these functions have default implementations. Your class can override any of the williamr@2: virtual functions listed below. williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: class MFormCustomDraw williamr@2: williamr@2: { williamr@2: public: williamr@2: williamr@2: class TParam williamr@2: /** williamr@2: Parameters used by several custom draw functions williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: { williamr@2: public: williamr@2: TParam(CGraphicsContext& aGc,MGraphicsDeviceMap& aMap,const TPoint& aTextLayoutTopLeft,const TRect& aDrawRect): williamr@2: iGc(aGc), iMap(aMap), iTextLayoutTopLeft(aTextLayoutTopLeft), iDrawRect(aDrawRect) { } williamr@2: williamr@2: CGraphicsContext& iGc; williamr@2: MGraphicsDeviceMap& iMap; williamr@2: const TPoint& iTextLayoutTopLeft; williamr@2: const TRect& iDrawRect; williamr@2: }; williamr@2: williamr@2: class TLineInfo williamr@2: /** williamr@2: Contains the line metrics. williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: { williamr@2: public: williamr@2: TLineInfo(const TRect& aOuterRect,const TRect& aInnerRect,TInt aBaseline): williamr@2: iOuterRect(aOuterRect), iInnerRect(aInnerRect), iBaseline(aBaseline) { } williamr@2: williamr@2: const TRect& iOuterRect; williamr@2: const TRect& iInnerRect; williamr@2: TInt iBaseline; williamr@2: }; williamr@2: williamr@2: IMPORT_C virtual void DrawBackground(const TParam& aParam,const TRgb& aBackground,TRect& aDrawn) const; williamr@2: IMPORT_C virtual void DrawLineGraphics(const TParam& aParam,const TLineInfo& aLineInfo) const; williamr@2: IMPORT_C virtual void DrawText(const TParam& aParam,const TLineInfo& aLineInfo,const TCharFormat& aFormat, williamr@2: const TDesC& aText,const TPoint& aTextOrigin,TInt aExtraPixels) const; williamr@2: IMPORT_C virtual TRgb SystemColor(TUint aColorIndex,TRgb aDefaultColor) const; williamr@2: williamr@4: IMPORT_C virtual void DrawText(const TParam& aParam,const TLineInfo& aLineInfo,const TCharFormat& aFormat, williamr@4: const TDesC& aText,const TInt aStart, const TInt aEnd, const TPoint& aTextOrigin,TInt aExtraPixels) const; williamr@2: IMPORT_C virtual void MFormCustomDraw_Reserved_2(); williamr@2: }; williamr@2: williamr@2: williamr@2: /** williamr@2: An interface class that can be derived from to implement custom line breaking. williamr@2: williamr@2: Custom line breaking allows the Text Views line wrapping algorithm to break williamr@2: lines in any way. For instance, it may be used to avoid the jagged white space williamr@2: at the right edge of text windows caused by normal line wrapping on a small williamr@2: screen. williamr@2: williamr@2: All of these functions have a default implementation. To change the default williamr@2: behaviour, a pointer to an object that overrides any or all of the functions williamr@2: in the interface needs to be passed to the function CTextLayout::SetCustomWrap(). williamr@2: @since 6.2 williamr@2: williamr@2: @see CTextLayout::SetCustomWrap() williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: class MFormCustomWrap williamr@2: williamr@2: { williamr@2: public: williamr@2: IMPORT_C virtual TUint LineBreakClass(TUint aCode,TUint& aRangeStart,TUint& aRangeEnd) const; williamr@2: IMPORT_C virtual TBool LineBreakPossible(TUint aPrevClass,TUint aNextClass,TBool aHaveSpaces) const; williamr@2: IMPORT_C virtual TBool GetLineBreakInContext(const TDesC& aText,TInt aMinBreakPos,TInt aMaxBreakPos, williamr@2: TBool aForwards,TInt& aBreakPos) const; williamr@2: IMPORT_C virtual TBool IsHangingCharacter(TUint aChar) const; williamr@2: private: williamr@2: IMPORT_C virtual void MFormCustomWrap_Reserved_1(); williamr@2: IMPORT_C virtual void MFormCustomWrap_Reserved_2(); williamr@2: }; williamr@2: williamr@2: williamr@2: /** williamr@2: Mixin class used to customize visible appearance of invisible characters williamr@2: such as a paragraph mark or a tab. williamr@2: williamr@2: @see CTextView::SetCustomInvisibleCharacterRemapper() williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: class MFormCustomInvisibleCharacterRemapper williamr@2: { williamr@2: public: williamr@2: IMPORT_C static TUint DefaultMapping(TUint aChar, const TNonPrintingCharVisibility aNonPrintingCharVisibility, const TLayDocTextSource& aLayDoc); williamr@2: williamr@2: /** williamr@2: Allows custom remapping of invisible characters. williamr@2: williamr@2: Called by TLayDocTextSource::Map() if it has been created and registered williamr@2: with TLayDocTextSource using CTextLayout::SetInvisibleCharacterRemapper(). williamr@2: williamr@2: Unless there is a specific reason for doing otherwise it is recommended williamr@2: that where this function has not remapped a given character it should williamr@2: pass it to DefaultMapping() to let it try. williamr@2: williamr@2: @param aChar williamr@2: Invisible character to be remapped williamr@2: @param aDesiredVisibilities williamr@2: Current state of flags showing visibility of invisible characters williamr@2: @param aLayDoc williamr@2: Const ref to the calling CLayDocTextSource williamr@2: @return williamr@2: The replacement character if remapping has taken place, else return original character williamr@2: */ williamr@2: virtual TUint Remap(TUint aChar, const TNonPrintingCharVisibility aNonPrintingCharVisibility, const TLayDocTextSource& aLayDoc) = 0; williamr@2: }; williamr@2: williamr@2: /** williamr@2: Text layout. williamr@2: williamr@2: CTextLayout is the lowest-level text formatting class in the Text Views API. It williamr@2: obtains text and formatting attributes via the MLayDoc interface class and williamr@2: formats the text to a certain width. williamr@2: williamr@2: It has functions for drawing the text and performing hit-detection that is, williamr@2: converting x-y coordinates to document positions, and vice versa. It defines williamr@2: many public functions that are not generally useful, but are called by the williamr@2: higher-level CTextView class, or exist only for the convenience of closely williamr@2: associated classes like the printing and pagination systems. These are williamr@2: identified in the documentation by the text "not generally useful". williamr@2: williamr@2: When using the CTextLayout class, you must be aware of what functions have williamr@2: previously been called. For example: williamr@2: williamr@2: 1) Formatting and scrolling functions must not be called if a CTextView object williamr@2: owns the CTextLayout object, because the CTextView object may be reformatting williamr@2: the CTextLayout object asynchronously by means of an active object, or may hold williamr@2: some state information about the CTextLayout object that would be invalidated williamr@2: by reformatting. These functions are identified in the documentation by the williamr@2: text "Do not use if a CTextView object owns this CTextLayout object.". williamr@2: williamr@2: 2) Functions that raise out of memory exceptions can leave the object in an williamr@2: inconsistent state; these functions can be identified as usual by their williamr@2: trailing L. When this occurs, it is necessary to discard the formatting williamr@2: information by calling DiscardFormat(). williamr@2: williamr@2: 3) Some functions change formatting parameters like the wrap width or band williamr@2: height, but do not reformat to reflect the change. These functions are williamr@2: identified in the documentation by the text "Reformat needed". williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: class CTextLayout: public CBase williamr@2: williamr@2: { williamr@2: friend class CTestTextLayout; williamr@2: public: williamr@2: williamr@2: /**Flags used by CTextLayout::SetViewL(). Whether to reformat and redraw.*/ williamr@2: enum TDiscard williamr@2: { williamr@2: /** Discard all formatting; redraw. */ williamr@2: EFViewDiscardAllFormat = TRUE, williamr@2: /** Do not discard all formatting; redraw. */ williamr@2: EFViewDontDiscardFormat = FALSE williamr@2: }; williamr@2: williamr@2: /** Indicates whether blank space should scroll. williamr@2: Used by several CTextView and CTextLayout scrolling functions. */ williamr@2: enum TAllowDisallow williamr@2: { williamr@2: /** Allow blank space to scroll. */ williamr@2: EFAllowScrollingBlankSpace = TRUE, williamr@2: /** Disallow blank space from scrolling. */ williamr@2: EFDisallowScrollingBlankSpace = FALSE williamr@2: }; williamr@2: williamr@2: enum // flags for HandleCharEditL williamr@2: { williamr@2: /** Insert a character, (not a paragraph delimiter). */ williamr@2: EFCharacterInsert, williamr@2: /** Insert a paragraph delimiter. */ williamr@2: EFParagraphDelimiter, williamr@2: /** Delete single character to the left. */ williamr@2: EFLeftDelete, williamr@2: /** Delete single character to the right. */ williamr@2: EFRightDelete williamr@2: }; williamr@2: williamr@2: enum williamr@2: { williamr@2: /** A value greater than any possible display height indicates that the williamr@2: entire visible area, at least, was scrolled, and so there is no point williamr@2: in blitting text; a full redraw is needed. williamr@2: */ williamr@2: EFScrollRedrawWholeScreen = CLayoutData::EFLargeNumber, williamr@2: /** The maximum line width when wrapping is unset. */ williamr@2: EFMaximumLineWidth = CLayoutData::EFBodyWidthForNoWrapping, williamr@2: }; williamr@2: williamr@2: enum williamr@2: { williamr@2: /** Wrapping off; overrides the paragraph format. */ williamr@2: EFAllParagraphsNotWrapped = TRUE, williamr@2: /** Wrapping on, unless CParaFormat::iWrap is false. */ williamr@2: EFParagraphsWrappedByDefault = FALSE williamr@2: }; williamr@2: williamr@2: /** Amount to format. Used by CTextLayout::SetAmountToFormat(). */ williamr@2: enum TAmountFormatted williamr@2: { williamr@2: /** Format the whole document. */ williamr@2: EFFormatAllText = FALSE, williamr@2: /** Format the visible band only. */ williamr@2: EFFormatBand = TRUE, williamr@2: }; williamr@2: williamr@2: enum TScrollFlags williamr@2: { williamr@2: EFScrollOnlyToTopsOfLines = 1 williamr@2: }; williamr@2: williamr@2: /** Formatting information. */ williamr@2: enum TCurrentFormat williamr@2: { williamr@2: /** Returned by some CTextLayout enquiry functions to indicate that no williamr@2: formatting has taken place so that the requested value cannot be williamr@2: calculated. */ williamr@2: EFNoCurrentFormat = -1, williamr@2: /** Returned by CTextLayout::ParagraphHeight() when the paragraph is not formatted. */ williamr@2: EFNotInCurrentFormat = 0 williamr@2: }; williamr@2: public: williamr@2: class TRangeChange williamr@2: /** williamr@2: Specifies the range of characters involved when setting or clearing a williamr@2: text selection. williamr@2: williamr@2: This class is used in the CTextLayout::Highlight() function. The following williamr@2: code demonstrates how it should be used to clear an existing highlight and williamr@2: set a new one: williamr@2: williamr@2: @code williamr@2: CTextLayout::TRangeChange oldHighlight(anchorPos, old_cursorPos, williamr@2: CTextLayout::TRangeChange::EClear); // existing highlight williamr@2: CTextLayout::TRangeChange newHighlight(anchorPos, new_cursorPos, williamr@2: CTextLayout::TRangeChange::ESet); // new one williamr@2: newHighlight.OptimizeWith(oldHighlight); // doesn't matter which range is williamr@2: the parameter and which is the calling object williamr@2: layout.Highlight(oldHighlight,drawRect,context); // doesn't matter in which williamr@2: order this and following line occur williamr@2: layout.Highlight(newHighlight,drawRect,context); williamr@2: @endcode williamr@2: williamr@2: @see CTextLayout::Highlight() williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: { williamr@2: public: williamr@2: /** Enumerates the possible change types. */ williamr@2: enum TChangeType williamr@2: { williamr@2: /** The object is being used to set a range. */ williamr@2: ESet, williamr@2: /** The object is being used to clear a range. */ williamr@2: EClear williamr@2: }; williamr@2: IMPORT_C TRangeChange(TInt aStart, TInt aEnd, TChangeType aChange); williamr@2: IMPORT_C TRangeChange(); williamr@2: IMPORT_C void Set(TInt aStart, TInt aEnd, TChangeType aChange); williamr@2: IMPORT_C TChangeType Get(TInt& aStart, TInt& aEnd) const; williamr@2: IMPORT_C void OptimizeWith(TRangeChange& aBuddy); williamr@2: IMPORT_C TBool NonNull() const; williamr@2: IMPORT_C TBool Clip(TInt aMin, TInt aMax); williamr@2: williamr@2: TBool IsJoinedTo(const TRangeChange aRange); williamr@2: void Join(const TRangeChange aRange); williamr@2: williamr@2: private: williamr@2: TInt iA; williamr@2: TInt iB; williamr@2: }; williamr@2: williamr@2: public: williamr@2: williamr@2: class TTagmaForwarder: public MTmTextLayoutForwarder williamr@2: /** williamr@2: A standard inquiry interface for the text formatting engine, built on williamr@2: top of a CTextView object. williamr@2: williamr@2: To use it, construct a TTagmaForwarder object, then call InitL(), which williamr@2: finishes background formatting, then call the MTmTextLayoutForwarder williamr@4: functions. williamr@4: williamr@4: The class should only be used internally by FORM component. williamr@2: @internalComponent williamr@2: */ williamr@2: { williamr@2: public: williamr@2: inline TTagmaForwarder(const CTextLayout& aLayout); williamr@2: williamr@2: private: williamr@2: // from MTmTextLayoutForwarder williamr@2: inline const CTmTextLayout& TextLayout() const; williamr@2: inline void GetOrigin(TPoint& aPoint) const; williamr@2: williamr@2: const CTextLayout& iLayout; williamr@2: }; williamr@2: williamr@2: /** williamr@2: Accesses text supplied by MTmSource. williamr@2: @internalComponent williamr@2: */ williamr@2: class TUtf32SourceCache williamr@2: { williamr@2: public: williamr@2: TUtf32SourceCache(const MTmSource& aSource); williamr@2: TUtf32SourceCache(const CTextLayout& aLayout); williamr@2: TText GetUtf16(TInt aIndex); williamr@2: TChar GetUtf32(TInt aIndex); williamr@2: private: williamr@2: const MTmSource* iSource; williamr@2: TPtrC16 iCurrentView; williamr@2: TInt iCurrentViewIndex; williamr@2: }; williamr@2: friend class TUtf32SourceCache; williamr@2: williamr@2: IMPORT_C static CTextLayout *NewL(MLayDoc *aDoc,TInt aWrapWidth); williamr@2: IMPORT_C ~CTextLayout(); williamr@2: IMPORT_C void DiscardFormat(); williamr@2: IMPORT_C void SetLayDoc(MLayDoc *aDoc); williamr@2: IMPORT_C void SetWrapWidth(TInt aWrapWidth); williamr@2: IMPORT_C void SetBandHeight(TInt aHeight); williamr@2: IMPORT_C TInt BandHeight() const; williamr@2: IMPORT_C void SetImageDeviceMap(MGraphicsDeviceMap *aGd); williamr@2: IMPORT_C void SetLabelsDeviceMap(MGraphicsDeviceMap *aDeviceMap); williamr@2: IMPORT_C void SetAmountToFormat(TAmountFormatted aAmountOfFormat = EFFormatBand); williamr@2: IMPORT_C TBool IsFormattingBand() const; williamr@2: IMPORT_C void SetFormatMode(CLayoutData::TFormatMode aFormatMode,TInt aWrapWidth,MGraphicsDeviceMap* aFormatDevice); williamr@2: IMPORT_C void ForceNoWrapping(TBool aNoWrapping = EFAllParagraphsNotWrapped); williamr@2: IMPORT_C TBool IsWrapping() const; williamr@2: IMPORT_C void SetTruncating(TBool aOn); williamr@2: IMPORT_C TBool Truncating() const; williamr@2: IMPORT_C void SetTruncatingEllipsis(TChar aEllipsis); williamr@2: IMPORT_C TChar TruncatingEllipsis() const; williamr@2: IMPORT_C void SetLabelsMarginWidth(TInt aWidth); williamr@2: IMPORT_C void SetNonPrintingCharsVisibility(TNonPrintingCharVisibility aVisibility); williamr@2: IMPORT_C TNonPrintingCharVisibility NonPrintingCharsVisibility() const; williamr@2: IMPORT_C TBool IsBackgroundFormatting() const; williamr@2: IMPORT_C void NotifyTerminateBackgroundFormatting(); williamr@2: // deprecated 7.0 williamr@2: IMPORT_C void SetExcludePartialLines(TBool aExcludePartialLines = TRUE); williamr@2: // deprecated 7.0 williamr@2: IMPORT_C TBool ExcludingPartialLines() const; williamr@2: IMPORT_C void SetFontHeightIncreaseFactor(TInt aPercentage); williamr@2: IMPORT_C TInt FontHeightIncreaseFactor() const; williamr@2: IMPORT_C void SetMinimumLineDescent(TInt aPixels); williamr@2: IMPORT_C TInt MinimumLineDescent() const; williamr@2: IMPORT_C TInt DocumentLength() const; williamr@2: IMPORT_C TInt ToParagraphStart(TInt& aDocPos) const; williamr@2: IMPORT_C TInt PixelsAboveBand() const; williamr@2: IMPORT_C TInt YBottomLastFormattedLine() const; williamr@2: IMPORT_C TInt FormattedHeightInPixels() const; williamr@2: IMPORT_C TInt PosRangeInBand(TInt& aDocPos) const; williamr@2: IMPORT_C TBool PosInBand(const TTmDocPos& aDocPos,TTmLineInfo* aLineInfo = NULL) const; williamr@2: IMPORT_C TBool PosInBand(TTmDocPos aDocPos,TPoint& aXyPos) const; williamr@2: IMPORT_C TBool PosInBand(TInt aDocPos,TPoint& aXyPos) const; williamr@2: IMPORT_C TBool PosIsFormatted(TInt aDocPos) const; williamr@2: IMPORT_C TInt FirstCharOnLine(TInt aLineNo) const; williamr@2: IMPORT_C TInt FormattedLength() const; williamr@2: IMPORT_C TInt FirstFormattedPos() const; williamr@2: IMPORT_C TInt NumFormattedLines() const; williamr@2: IMPORT_C TInt FirstLineInBand() const; williamr@2: IMPORT_C TInt GetLineRect(TInt aYPos,TRect& aLine) const; williamr@2: IMPORT_C TInt ParagraphHeight(TInt aDocPos) const; williamr@2: IMPORT_C TRect ParagraphRectL(TInt aDocPos) const; williamr@2: IMPORT_C TBool CalculateHorizontalExtremesL(TInt& aLeftX,TInt& aRightX,TBool aOnlyVisibleLines, williamr@2: TBool aIgnoreWrapCharacters = FALSE) const; williamr@2: IMPORT_C void GetCharacterHeightAndAscentL(TInt aDocPos,TInt& aHeight,TInt& aAscent) const; williamr@2: IMPORT_C void GetFontHeightAndAscentL(const TFontSpec& aFontSpec,TInt& aHeight,TInt& aAscent) const; williamr@2: IMPORT_C TInt XyPosToDocPosL(TPoint &aPos, TUint aFlags = 0) const; williamr@2: IMPORT_C TBool DocPosToXyPosL(TInt aDocPos, TPoint& aPos, TUint aFlags = 0) const; williamr@2: IMPORT_C TBool FindXyPos(const TPoint& aXyPos,TTmPosInfo2& aPosInfo,TTmLineInfo* aLineInfo = NULL) const; williamr@2: IMPORT_C TBool FindDocPos(const TTmDocPosSpec& aDocPos,TTmPosInfo2& aPosInfo,TTmLineInfo* aLineInfo = NULL) const; williamr@2: IMPORT_C TRect GetLineRectL(TInt aDocPos1,TInt aDocPos2) const; williamr@2: IMPORT_C TBool PictureRectangleL(TInt aDocPos,TRect& aPictureRect,TBool* aCanScaleOrCrop = NULL) const; williamr@2: IMPORT_C TBool PictureRectangleL(const TPoint& aXyPos,TRect& aPictureRect,TBool* aCanScaleOrCrop = NULL) const; williamr@2: IMPORT_C TInt FirstDocPosFullyInBand() const; williamr@2: IMPORT_C void GetMinimumSizeL(TInt aWrapWidth,TSize& aSize); williamr@2: IMPORT_C void GetMinimumSizeL(TInt aWrapWidth,TBool aAllowLegalLineBreaksOnly,TSize& aSize); williamr@2: IMPORT_C TInt MajorVersion() const; williamr@2: IMPORT_C TInt SetViewL(const TTmDocPos& aDocPos,TInt& aYPos,TViewYPosQualifier aYPosQualifier, williamr@2: TDiscard aDiscardFormat = EFViewDontDiscardFormat); williamr@2: IMPORT_C TInt SetViewL(TInt aDocPos,TInt& aYPos,TViewYPosQualifier aYPosQualifier, williamr@2: TDiscard aDiscardFormat = EFViewDontDiscardFormat); williamr@2: IMPORT_C void FormatBandL(); williamr@2: IMPORT_C void FormatCharRangeL(TInt aStartDocPos,TInt aEndDocPos); williamr@2: void FormatCharRangeL(TInt aStartDocPos,TInt aEndDocPos,TInt aPixelOffset); williamr@2: IMPORT_C TBool FormatNextLineL(TInt& aBotPixel); williamr@2: IMPORT_C TBool FormatLineL(CParaFormat* aParaFormat,TInt& aDocPos,TInt& aHeight,TBool& aPageBreak); williamr@2: IMPORT_C TInt ScrollParagraphsL(TInt& aNumParas,TAllowDisallow aScrollBlankSpace); williamr@2: IMPORT_C TInt ScrollLinesL(TInt& aNumLines,TAllowDisallow aScrollBlankSpace = EFDisallowScrollingBlankSpace); williamr@2: IMPORT_C TInt ChangeBandTopL(TInt& aPixels,TAllowDisallow aScrollBlankSpace = EFDisallowScrollingBlankSpace); williamr@4: IMPORT_C void ChangeBandTopNoLimitBorderL(TInt aPixels); williamr@2: IMPORT_C void PageUpL(TInt& aYCursorPos,TInt& aPixelsScrolled); williamr@2: IMPORT_C void PageDownL(TInt& aYCursorPos,TInt& aPixelsScrolled); williamr@2: IMPORT_C TBool HandleCharEditL(TUint aType,TInt& aCursorPos,TInt& aGood,TInt& aFormattedUpTo, williamr@2: TInt& aFormattedFrom,TInt& aScroll,TBool aFormatChanged); williamr@2: IMPORT_C void HandleBlockChangeL(TCursorSelection aSelection,TInt aOldCharsChanged,TViewRectChanges& aViewChanges, williamr@2: TBool aFormatChanged); williamr@2: IMPORT_C void HandleAdditionalCharactersAtEndL(TInt& aFirstPixel,TInt& aLastPixel); williamr@2: // deprecated 6.1 williamr@2: IMPORT_C void ReformatVerticalSpaceL(); williamr@2: IMPORT_C void AdjustVerticalAlignment(CParaFormat::TAlignment aVerticalAlignment); williamr@2: IMPORT_C static void DrawBorders(const MGraphicsDeviceMap* aGd,CGraphicsContext& aGc,const TRect& aRect, williamr@2: const TParaBorderArray& aBorder,const TRgb* aBackground = NULL, williamr@2: TRegion* aClipRegion = NULL,const TRect* aDrawRect = NULL); williamr@2: IMPORT_C void DrawL(const TRect& aDrawRect,const TDrawTextLayoutContext* aDrawTextLayoutContext, williamr@2: const TCursorSelection* aHighlight = NULL); williamr@2: IMPORT_C TBool GetNextVisualCursorPos(const TTmDocPosSpec& aDocPos, williamr@2: TTmPosInfo2& aPosInfo, TBool aToLeft) const; williamr@2: // deprecated 7.0 williamr@2: IMPORT_C void InvertRangeL(const TCursorSelection& aHighlight,const TRect& aDrawRect, williamr@2: const TDrawTextLayoutContext* aDrawTextLayoutContext); williamr@2: IMPORT_C void Highlight(const TRangeChange& aHighlight,const TRect& aDrawRect, williamr@2: const TDrawTextLayoutContext* aDrawTextLayoutContext); williamr@2: IMPORT_C void SetCustomDraw(const MFormCustomDraw* aCustomDraw); williamr@2: IMPORT_C const MFormCustomDraw* CustomDraw() const; williamr@2: IMPORT_C void SetCustomWrap(const MFormCustomWrap* aCustomWrap); williamr@2: IMPORT_C const MFormCustomWrap* CustomWrap() const; williamr@4: /* this function should only used by Symbian internally */ williamr@2: IMPORT_C void ExtendFormattingToCoverYL(TInt aYPos); williamr@2: IMPORT_C void ExtendFormattingToCoverPosL(TInt aDocPos); williamr@2: williamr@2: IMPORT_C TInt GetLineNumber(TInt aDocPos); williamr@2: IMPORT_C void SetHighlightExtensions(TInt aLeftExtension, TInt aRightExtension, TInt aTopExtension, TInt aBottomExtension); williamr@2: void SetExcessHeightRequired(TInt aExcessHeightRequired); williamr@2: IMPORT_C void SetInterfaceProvider( MFormCustomInterfaceProvider* aProvider ); williamr@2: inline const CTmTextLayout& TagmaTextLayout() const; williamr@2: inline void GetOrigin(TPoint& aPoint) const; williamr@2: williamr@2: williamr@2: inline void RestrictScrollToTopsOfLines(TBool aRestrict); williamr@2: williamr@2: williamr@2: // Non-exported public functions williamr@2: void DrawBackground(CGraphicsContext& aGc,const TPoint& aTopLeft,const TRect& aClipRect, williamr@2: const TLogicalRgb& aBackground) const; williamr@2: TBool CalculateHorizontalExtremes(TInt& aLeftX,TInt& aRightX,TBool aOnlyVisibleLines) const; williamr@2: TBool GetCursor(const TTmDocPos& aDocPos,TTmCursorPlacement aPlacement, williamr@2: TRect& aLineRect,TPoint& aOrigin,TInt& aWidth,TInt& aAscent,TInt& aDescent) const; williamr@2: void GetParagraphRect(const TTmDocPos& aDocPos,TRect& aRect) const; williamr@2: TInt ScrollDocPosIntoViewL(const TTmDocPos& aDocPos); williamr@2: TInt PictureRectangleAndPosL(const TPoint& aXyPos, TRect& aPictureRect, williamr@2: TBool* aCanScaleOrCrop = 0) const; williamr@2: void HighlightUsingExtensions(const CTextLayout::TRangeChange& aChangeHighlight,const TRangeChange& aFullHighlight, williamr@2: const TRect& aDrawRect, const TDrawTextLayoutContext* aDrawTextLayoutContext); williamr@2: inline const TTmHighlightExtensions& HighlightExtensions() const; williamr@2: void GetHighlightRemnants(const TRect& aRect, const TDrawTextLayoutContext& aDrawTextLayoutContext, TRect* aRemainderRects) const; williamr@2: TInt WrapWidth() const; williamr@2: williamr@2: void SetOpaqueLC(); williamr@2: williamr@2: IMPORT_C void SetCustomInvisibleCharacterRemapper(MFormCustomInvisibleCharacterRemapper* aInvisibleCharacterRemapper); williamr@2: IMPORT_C MFormCustomInvisibleCharacterRemapper* GetCustomInvisibleCharacterRemapper(); williamr@2: void SetTextViewCursorPos(TCursorPosition* aPos); // Put in for INC092568 williamr@2: williamr@2: void SetWindow(RWindow* aWnd); williamr@2: void SetReadyToRedraw(); williamr@2: void BeginRedraw(const TRect& aRect); williamr@2: void EndRedraw(); williamr@2: void SetExternalDraw(const TRect& aRect); williamr@2: void ResetExternalDraw(); williamr@2: TBool BeginRedrawCalled() const; williamr@2: IMPORT_C void MakeVisible(TBool aVisible); williamr@2: williamr@2: #ifdef _DEBUG williamr@2: TBool __DbgIsFormattingUpToDate() const; williamr@2: #endif williamr@2: williamr@2: enum TPanicNumber williamr@2: { williamr@2: EUnimplemented, williamr@2: ENoMemory, williamr@2: EDrawingBorderError, williamr@2: EFormatDeviceNotSet, williamr@2: EImageDeviceNotSet, williamr@2: EPixelNotInFormattedLine, williamr@2: EInvalidDocPos, williamr@2: ENoCharRangeToFormat, williamr@2: ECharacterNotFormatted, williamr@2: EPrintPreviewModeError, williamr@2: EBadCharacterEditType, williamr@2: EInvalidLineNumber, williamr@2: EPosNotFormatted, williamr@2: EMustFormatAllText, williamr@2: EPageScrollError, williamr@2: EInvalidRedraw williamr@2: }; williamr@2: static void Panic(TPanicNumber aNumber); williamr@2: williamr@2: private: williamr@2: IMPORT_C CTextLayout(); williamr@2: IMPORT_C void ConstructL(MLayDoc *aDoc,TInt aWrapWidth); williamr@2: void InitFormatParam(TTmFormatParamBase& aParam); williamr@4: TInt ScrollL(TInt aDy,TAllowDisallow aScrollBlankSpace,TBool aTopNoLimitBorder=EFalse,TBool aBottomNoLimitBorder=EFalse); williamr@2: void FormatBandL(TInt aStartDocPos,TInt aEndDocPos); williamr@2: void PruneFormatL(TBool aFromStart); williamr@2: TInt VisibleHeightInPixels() const; williamr@2: TInt BandHeightInPixels() const; williamr@2: TInt SuggestCursorPos(TInt aCurrentCursorPos) const; williamr@2: TInt SetBandTop(); williamr@2: TBool AddFormattingAtEndL(TTmFormatParamBase& aFormatParam, TInt& aHeightIncrease, TInt& aParagraphsIncrease); williamr@2: williamr@2: static void ResetOpaque(void* aThis); williamr@2: williamr@2: williamr@4: CTmTextLayout *iText; // the TAGMA object that contains the text layout williamr@4: TInt iDummyForIText[10]; // It is only here to add padding for maintain compatibility williamr@2: TInt iExcessHeightRequired; // The delta required to position the baseline so there is enough williamr@2: // space for the highset glyph in pixels williamr@2: RWindow *iWnd; // the window to be used to draw williamr@2: TBool iBeginRedrawCount; williamr@2: TRect iRedrawRect; williamr@2: TCursorPosition* iTextViewCursorPos; // From and owned by owning CTextView if it exists, williamr@2: // Null otherwise. Put in for INC092568 williamr@2: TBool iIsWndInExternalRedraw; // If ETrue, then iWnd->EndRedraw() will not be called williamr@2: // from within CTextLayout::EndRedraw() as the window redraw williamr@2: // has been initiated externally and will be ended externally as well williamr@2: TBool iReadyToRedraw; // If EFalse, disables CTextLayout::BeginRedraw() and williamr@2: // CTextLayout::EndRedraw() williamr@4: TInt iDummy[4]; // This dummy variable has been inserted to replace the original size of williamr@2: // a variable that had to be moved to avaid a BC break because it had williamr@2: // increased in size. Feel free to reuse this space - just reduce the size williamr@2: // of this variable by the size of any variable you insert in front of it. williamr@2: // Currently it occupies 5 words. williamr@2: TInt iBandTop; // effectively, scroll position: subtract this from CTmTextLayout y position williamr@2: // to give CTextLayout y position williamr@2: TInt iVisibleHeight;// in pixels if iFormatMode is EFScreenMode or EFWysiwygMode, otherwise twips williamr@2: TInt iBandHeight; // in pixels if iFormatMode is EFScreenMode or EFWysiwygMode, otherwise twips williamr@2: williamr@2: TInt iScrollFlags; // from CTextLayout::TScrollFlags williamr@2: TInt iUnformattedStart; // document position of the start of any unformatted text; williamr@2: // if < KMaxTInt, background formatting can be used williamr@2: // (by calling FormatNextLine) to format the remainder williamr@2: TBool iParInvalid; // if true and background formatting is happening, the remainder of the paragraph williamr@2: // containing iUnformattedStart is invalid and must be reformatted; williamr@2: // otherwise, formatting stops when line ends match williamr@4: TTmHighlightExtensions *iHighlightExtensions; williamr@4: TInt iDmmyForIHighlightExtensions[3]; // It is only here to add padding for maintain compatibility williamr@4: TLayDocTextSource* iSource; // the source of the text williamr@2: // before adding any new member variables to the end of this class, please williamr@2: // consider whether you can insert them before the iDummy member variable williamr@2: // further up, which currently represents wasted space. williamr@4: TInt iDmmyForISource[23]; // It is only here to add padding for maintain compatibility williamr@2: }; williamr@2: williamr@2: /** williamr@2: Cursor position. williamr@2: williamr@2: The TMovementType enum defined in this class is used to indicate the direction williamr@2: of a scroll or cursor movement. The remainder of this class does not form part williamr@2: of the API. williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: class TCursorPosition williamr@2: williamr@2: { williamr@2: public: williamr@2: williamr@2: williamr@2: /** Direction of cursor movement. */ williamr@2: enum TMovementType williamr@2: { williamr@2: /** No cursor movement */ williamr@2: EFNoMovement, williamr@2: /** Single character cursor movement to the left */ williamr@2: EFLeft, williamr@2: /** Single character cursor movement to the right */ williamr@2: EFRight, williamr@2: /** Line up cursor movement */ williamr@2: EFLineUp, williamr@2: /** Line down cursor movement */ williamr@2: EFLineDown, williamr@2: /** Page up cursor movement */ williamr@2: EFPageUp, williamr@2: /** Page down cursor movement */ williamr@2: EFPageDown, williamr@2: /** Cursor movement to line start */ williamr@2: EFLineBeg, williamr@2: /** Cursor movement to line end */ williamr@2: EFLineEnd williamr@2: }; williamr@2: williamr@2: /** Selection of the left end or right end of a run of text. */ williamr@2: enum TVisualEnd williamr@2: { williamr@2: /** Leftmost end. */ williamr@2: EVisualLeft, williamr@2: /** Rightmost end. */ williamr@2: EVisualRight williamr@2: }; williamr@2: williamr@2: enum TPosHint williamr@2: { williamr@2: EPosHintUndefined = 0, williamr@2: /** Left to right typing expected. */ williamr@2: EInsertStrongL2R = 1, williamr@2: /** Right to left typing expected. */ williamr@2: EInsertStrongR2L = 2, williamr@2: williamr@2: // Maybe several more. williamr@2: //... williamr@2: EPosHintLast williamr@2: }; williamr@2: williamr@2: inline TCursorPosition(); williamr@2: inline void SetLayout(CTextLayout *aLayout); williamr@2: inline void UpdateLatentX(TInt aX); williamr@2: inline void SetToPreviousHighlight(); williamr@2: inline void SetToCurrentHighlight(); williamr@2: inline void CancelHighlight(); williamr@2: inline void SetDocPos(const TTmDocPos& aDocPos); williamr@2: void UpdateLatentPosition(); williamr@2: TInt SetSelectionL(const TCursorSelection& aSelection); williamr@2: void SetPendingSelection(const TCursorSelection& aSelection); williamr@2: void GetOldSelection(TCursorSelection& aSelection) const; williamr@2: void GetSelection(TCursorSelection& aSelection) const; williamr@2: TInt SetDocPosL(TBool aDragSelectOn,const TTmDocPos& aDocPos); williamr@2: TInt SetXyPosL(TBool aDragSelectOn,TPoint aPos,TBool aAllowPictureFrame); williamr@2: TInt MoveL(TBool aDragSelectOn,TMovementType& aMovement,TBool aAllowPictureFrame); williamr@2: const TTmDocPos& VisualEndOfRunL( williamr@2: const TTmDocPos& aStart, const TTmDocPos& aEnd, williamr@2: TVisualEnd aDirection); williamr@2: void TextMoveVertically(); williamr@2: inline void DontDrawOldPictureFrame(); williamr@2: williamr@2: // inquiry functions williamr@2: inline TBool IsSelection() const; williamr@2: inline TBool IsSelectionToDraw() const; williamr@2: TBool IsPictureFrame() const; williamr@2: TBool IsNewPictureFrame() const; williamr@2: inline const TTmDocPos& TmDocPos() const; williamr@2: inline TInt DocPos() const; williamr@2: inline TBool DrawHighlight() const; williamr@2: inline TBool DrawOldPictureFrame() const; williamr@2: inline TBool DrawNewPictureFrame() const; williamr@2: TBool GetCursor(TTmCursorPlacement aPlacement,TPoint& aOrigin,TInt& aWidth,TInt& aAscent,TInt& aDescent) const; williamr@2: TPosHint PositioningHint() const { return iPositioningHint; } williamr@2: void SetPositioningHint (TPosHint aHint) williamr@2: {iPositioningHint = aHint;} williamr@2: williamr@2: TTmPosInfo2& ChoosePosition(TTmPosInfo2& aPreferred, williamr@2: TTmPosInfo2& aBackup); williamr@2: williamr@2: private: williamr@2: enum williamr@2: { williamr@2: EFAbove = -1, williamr@2: EFInside = 0, williamr@2: EFBelow = 1 williamr@2: }; williamr@2: williamr@2: // bit values for iFlags williamr@2: enum williamr@2: { williamr@2: EDrawHighlight = 1, williamr@2: EDrawOldPictureFrame = 2, williamr@2: EDrawNewPictureFrame = 4, williamr@2: EReturnPreviousHighlight = 8, williamr@2: ESelected = 16 williamr@2: }; williamr@2: williamr@2: TInt ViewTopOfLineL(const TTmDocPos& aDocPos,TInt& aYPos); williamr@2: void CheckSelection(TBool aSelect); williamr@2: void CheckNullSelection(); williamr@2: inline void UpdateLatentY(TInt aY); williamr@2: TInt CheckCursorOnScreenL(TInt& aY); williamr@2: TBool LeftRightL(TTmPosInfo2& aPos, TTmLineInfo& aLine, TMovementType& aMove); williamr@2: void StartEnd(TTmPosInfo2& aPos, TTmLineInfo& aLine, TMovementType& aMove); williamr@2: void UpDownL(TTmPosInfo2& aPos, TTmLineInfo& aLine, TMovementType& aMove); williamr@2: TInt PageScrollL(TMovementType& aMove); williamr@2: TInt DoSetDocPosL(const TTmDocPos& aDocPos); williamr@2: TInt DoSetVisibleDocPosL(const TTmDocPos& aDocPos); williamr@2: void DoSetXyPos(TPoint& aXy); williamr@2: void SetPictureFrame(const TTmDocPos& aDocPos,TInt aAnchor,const TRect& aPictureRect); williamr@2: inline TBool CalculateCursorPos(TPoint& aCurPos); williamr@2: williamr@2: TTmDocPos iDocPos; williamr@2: TInt iAnchor; williamr@2: TInt iOldDocPos; williamr@2: TInt iOldAnchor; williamr@2: TUint iFlags; williamr@2: TInt iLatentX; williamr@2: TInt iLatentY; williamr@2: CTextLayout* iLayout; williamr@2: TPosHint iPositioningHint; williamr@2: }; williamr@2: williamr@2: // inline functions williamr@2: inline const CTmTextLayout& CTextLayout::TagmaTextLayout() const williamr@2: { williamr@4: return *iText; williamr@2: } williamr@2: williamr@2: inline void CTextLayout::GetOrigin(TPoint& aPoint) const williamr@2: { williamr@2: aPoint.iX = 0; williamr@2: aPoint.iY = -iBandTop; williamr@2: } williamr@2: williamr@2: inline CTextLayout::TTagmaForwarder::TTagmaForwarder(const CTextLayout& aLayout): williamr@2: iLayout(aLayout) williamr@2: { williamr@2: } williamr@2: williamr@2: inline const CTmTextLayout& CTextLayout::TTagmaForwarder::TextLayout() const williamr@2: { williamr@2: return iLayout.TagmaTextLayout(); williamr@2: } williamr@2: williamr@2: inline void CTextLayout::TTagmaForwarder::GetOrigin(TPoint& aPoint) const williamr@2: { williamr@2: iLayout.GetOrigin(aPoint); williamr@2: } williamr@2: williamr@2: inline const TTmHighlightExtensions& CTextLayout::HighlightExtensions() const williamr@2: { williamr@4: return *iHighlightExtensions; williamr@2: } williamr@2: williamr@2: /** williamr@2: Dangerous function. Makes scroll operations set the top of the screen flush to williamr@2: the top of a line. In general this might scroll the cursor off the screen. williamr@2: */ williamr@2: void CTextLayout::RestrictScrollToTopsOfLines(TBool a) williamr@2: { williamr@2: if (a) williamr@2: iScrollFlags |= EFScrollOnlyToTopsOfLines; williamr@2: else williamr@2: iScrollFlags &= ~EFScrollOnlyToTopsOfLines; williamr@2: } williamr@2: williamr@2: /**Constructs a fully initialized TViewYPosQualifier object. The hotspot is williamr@2: initialized to be the baseline of the line, the screen is not filled, and the williamr@2: top line is not forced to be fully visible. */ williamr@2: inline TViewYPosQualifier::TViewYPosQualifier(): williamr@2: iHotSpot(EFViewBaseLine), williamr@2: iFillScreen(EFalse), williamr@2: iFullyVisible(EFViewDontForceLineFullyVisible) williamr@2: { williamr@2: } williamr@2: williamr@2: williamr@2: /**Constructs a TViewRectChanges object, initializing its iScrollAtTop and williamr@2: iScrollAtBottom members to zero. */ williamr@2: inline TViewRectChanges::TViewRectChanges(): williamr@2: iScrollAtTop(0), williamr@2: iScrollAtBottom(0) williamr@2: { williamr@2: } williamr@2: williamr@2: /**Constructs the TCursorSelection object initialising the cursor and anchor williamr@2: positions to zero. */ williamr@2: inline TCursorSelection::TCursorSelection(): williamr@2: iCursorPos(0), williamr@2: iAnchorPos(0) williamr@2: { williamr@2: } williamr@2: williamr@2: /** Constructs the TCursorSelection object with a cursor and anchor position. williamr@2: @param aCursorPos The cursor position. williamr@2: @param aAnchorPos The anchor position. */ williamr@2: inline TCursorSelection::TCursorSelection(TInt aCursorPos,TInt aAnchorPos): williamr@2: iCursorPos(aCursorPos), williamr@2: iAnchorPos(aAnchorPos) williamr@2: { williamr@2: } williamr@2: williamr@2: /** Sets the cursor and anchor positions for the selection. williamr@2: @param aCursorPos The new cursor position. williamr@2: @param aAnchorPos The new anchor position. */ williamr@2: inline void TCursorSelection::SetSelection(TInt aCursorPos,TInt aAnchorPos) williamr@2: { williamr@2: iCursorPos = aCursorPos; williamr@2: iAnchorPos = aAnchorPos; williamr@2: } williamr@2: williamr@2: /** Gets the lesser of the cursor and anchor positions. williamr@2: @return The lesser of the cursor and anchor positions. */ williamr@2: inline TInt TCursorSelection::LowerPos() const williamr@2: { williamr@2: return Min(iCursorPos,iAnchorPos); williamr@2: } williamr@2: williamr@2: /** Gets the greater of the cursor and anchor positions. williamr@2: @return The greater of the cursor and anchor positions. */ williamr@2: inline TInt TCursorSelection::HigherPos() const williamr@2: { williamr@2: return Max(iCursorPos,iAnchorPos); williamr@2: } williamr@2: williamr@2: /** Returns the number of characters in the selected range. williamr@2: @return The length of the selection. */ williamr@2: inline TInt TCursorSelection::Length() const williamr@2: { williamr@2: return Abs(iCursorPos - iAnchorPos); williamr@2: } williamr@2: williamr@2: /** Constructs the TCursorPosition object, initializing its members williamr@2: iAnchor, iOldDocPos, iOldAnchor, iFlags, iLatentX, iLatentY to williamr@2: zero, iLayout to NULL, and iPositioningHint to undefined. williamr@2: */ williamr@2: inline TCursorPosition::TCursorPosition(): williamr@2: iAnchor(0), williamr@2: iOldDocPos(0), williamr@2: iOldAnchor(0), williamr@2: iFlags(0), williamr@2: iLatentX(0), williamr@2: iLatentY(0), williamr@2: iLayout(NULL), williamr@2: iPositioningHint(EPosHintUndefined) williamr@2: { williamr@2: } williamr@2: williamr@2: /** Sets the text layout which TCursorPosition is related. williamr@2: @param aLayout The text layout. williamr@2: */ williamr@2: inline void TCursorPosition::SetLayout(CTextLayout *aLayout) williamr@2: { williamr@2: iLayout = aLayout; williamr@2: } williamr@2: williamr@2: /** Tests whether there is currently a selected region. williamr@2: @return True if there is a selected region. False if not. */ williamr@2: inline TBool TCursorPosition::IsSelection() const williamr@2: { williamr@2: return iFlags & ESelected; williamr@2: } williamr@2: williamr@2: /** Tests whether there is currently a highlighted region being drawn. williamr@2: @return True if there is a selected region. False if not. */ williamr@2: inline TBool TCursorPosition::IsSelectionToDraw() const williamr@2: { williamr@2: return iFlags & (EDrawHighlight | EDrawOldPictureFrame | EDrawNewPictureFrame); williamr@2: } williamr@2: williamr@2: /** Sets the flag which directs GetSelection() and williamr@2: IsPictureFrame() to operate on the previous highlight williamr@2: instead of the current highlight. williamr@2: */ williamr@2: inline void TCursorPosition::SetToPreviousHighlight() williamr@2: { williamr@2: iFlags |= EReturnPreviousHighlight; williamr@2: } williamr@2: williamr@2: /** Clears the special flag set in SetToPreviousHighlight() williamr@2: so that GetSelection() and IsPictureFrame() williamr@2: will operate on the current highlight. williamr@2: */ williamr@2: inline void TCursorPosition::SetToCurrentHighlight() williamr@2: { williamr@2: iFlags &= ~EReturnPreviousHighlight; williamr@2: } williamr@2: williamr@2: /** Removes the selection, and redraws the affected part of the screen. williamr@2: */ williamr@2: inline void TCursorPosition::CancelHighlight() williamr@2: { williamr@2: iFlags &= ~(ESelected | EDrawHighlight | EDrawOldPictureFrame | EDrawNewPictureFrame); williamr@2: } williamr@2: williamr@2: /** Sets the latent horizontal text cursor position. This is the horizontal williamr@2: coordinate to which the text cursor will be moved. williamr@2: @param aX The horizontal coordinate to which the text cursor should be moved williamr@2: */ williamr@2: inline void TCursorPosition::UpdateLatentX(TInt aX) williamr@2: { williamr@2: iLatentX = aX; williamr@2: } williamr@2: williamr@2: /** Sets the latent vertical text cursor position. This is the vertical williamr@2: coordinate to which the text cursor will be moved. williamr@2: @param aY The vertical coordinate to which the text cursor should be moved williamr@2: */ williamr@2: inline void TCursorPosition::UpdateLatentY(TInt aY) williamr@2: { williamr@2: iLatentY = aY; williamr@2: } williamr@2: williamr@2: /** Caculate x-y position of the cursor williamr@2: If ETrue is returned, places the position of the intersection of williamr@2: the character edge with the baseline in aPos williamr@2: @param aPos On return, stores the position of the intersection of williamr@2: the character edge with the baseline williamr@2: @return ETrue if the document is in the formatted text, otherwise EFalse. williamr@2: */ williamr@2: inline TBool TCursorPosition::CalculateCursorPos(TPoint& aPos) williamr@2: { williamr@2: TTmPosInfo2 pos_info; williamr@2: TBool result = iLayout->FindDocPos(iDocPos,pos_info); williamr@2: aPos = pos_info.iEdge; williamr@2: return result; williamr@2: } williamr@2: williamr@2: /** Gets the document position, the structure for holding a raw document williamr@2: position that can be converted to or from an x-y position and compared williamr@2: ordinally, which cannot be done with the more abstract TTmDocPosSpec class. williamr@2: @return the document position williamr@2: */ williamr@2: inline const TTmDocPos& TCursorPosition::TmDocPos() const williamr@2: { williamr@2: return iDocPos; williamr@2: } williamr@2: /** Gets the edge position in the document. williamr@2: @return the edge position in the document. williamr@2: */ williamr@2: inline TInt TCursorPosition::DocPos() const williamr@2: { williamr@2: return iDocPos.iPos; williamr@2: } williamr@2: williamr@2: /** Sets the document position, the structure for holding a raw document williamr@2: position that can be converted to or from an x-y position and compared williamr@2: ordinally, which cannot be done with the more abstract TTmDocPosSpec class. williamr@2: @param aDocPos the document position williamr@2: */ williamr@2: inline void TCursorPosition::SetDocPos(const TTmDocPos& aDocPos) williamr@2: { williamr@2: iDocPos = aDocPos; williamr@2: } williamr@2: williamr@2: /** Tests whether the highlighted region needs to be drawn. williamr@2: The function will be called by CTextView::UpdateHighlightL() williamr@2: to correct the highlight after a cursor movement williamr@2: @return True if the highlighted region needs to be drawn. False if not. */ williamr@2: inline TBool TCursorPosition::DrawHighlight() const williamr@2: { williamr@2: return iFlags & EDrawHighlight; williamr@2: } williamr@2: williamr@2: /** Tests whether there is a previous picture frame that needs to be drawn. williamr@2: The function will be called by CTextView::UpdateHighlightL() williamr@2: to correct the highlight after a cursor movement williamr@2: @return True if there is a previous picture frame that needs to be drawn. False if not. */ williamr@2: inline TBool TCursorPosition::DrawOldPictureFrame() const williamr@2: { williamr@2: return iFlags & EDrawOldPictureFrame; williamr@2: } williamr@2: williamr@2: /** Tests whether there is a new picture frame that needs to be drawn. williamr@2: The function will be called by CTextView::UpdateHighlightL() williamr@2: to correct the highlight after a cursor movement williamr@2: @return True if there is a new picture frame that needs to be drawn. False if not. */ williamr@2: inline TBool TCursorPosition::DrawNewPictureFrame() const williamr@2: { williamr@2: return iFlags & EDrawNewPictureFrame; williamr@2: } williamr@2: williamr@2: /** Sets to not draw the previous picture frame williamr@2: */ williamr@2: inline void TCursorPosition::DontDrawOldPictureFrame() williamr@2: { williamr@2: iFlags &= ~EDrawOldPictureFrame; williamr@2: } williamr@2: williamr@2: #endif