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 __FRMTVIEW_H__ williamr@2: #define __FRMTVIEW_H__ williamr@2: williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: williamr@2: /** williamr@2: Internal class - not part of interface williamr@2: @internalComponent williamr@2: */ williamr@2: class RScreenDisplay williamr@2: williamr@2: { williamr@2: public: williamr@2: enum TClippingRects williamr@2: { williamr@2: EFClipTextArea = 0x0001, williamr@2: EFClipLineCursor = 0x0002, williamr@2: EFClipExtendedTextArea = 0x0004, williamr@2: EFClipViewRect = 0x0008, williamr@2: EFClipExtendedViewRect = 0x0010, williamr@2: EFClipInvalid = 0x0200, williamr@2: EFClipAllFlags = 0xFFFF williamr@2: }; williamr@2: public: williamr@2: RScreenDisplay(TDrawTextLayoutContext* const aDrawTextLayoutContext); williamr@2: void Close(); williamr@2: void Destroy(); williamr@2: void SetWindowsServer(RWsSession *aSession) { iSession = aSession; } williamr@2: void SetWindowGroup(RWindowGroup *aWin) { iGroupWin = aWin; } williamr@2: williamr@2: void SetWindow(RWindow *aWin); williamr@2: RWindow* Window() const { return iWin; } williamr@2: void SetBitmapContext(CBitmapContext* aGc) { iGc = aGc; } williamr@2: CBitmapContext* BitmapContext() const { return iGc; } williamr@2: RWsSession* WindowServerSession() { return iSession; } williamr@2: void SetGraphicsDeviceL(CBitmapDevice *aGd); williamr@2: CBitmapDevice* BitmapDevice() const {return iGd; } williamr@2: void CreateContextL(CBitmapDevice *aGd); williamr@2: void CreateContextL(); williamr@2: void SetInvalidRect(const TRect& aRect); williamr@2: void SetInvalidRect(TInt aHeight); williamr@2: void SetInvalidRectHorizontal(TInt aWidth); williamr@2: void SetRects(TUint aRects); williamr@2: TRect LineCursorMargin() const; williamr@2: TPoint TopLeftTextArea() const; williamr@2: TBool IsLineCursor() const; williamr@2: williamr@2: void AddRects(TUint aRects); williamr@2: void SubRects(TUint aRects); williamr@2: TRect ClippingRect(); williamr@2: void ResetClippingRect(); williamr@2: void Scroll(TRect aRect,const TPoint& aBy,TBool aScrollBackground); williamr@2: void Flush(); williamr@2: void ClearRect(const TRect& aRect); williamr@2: void InvertRect(TRect aRect,const TRgb aInvertColor); williamr@2: void SetTextCursor(TPoint aPos, const TTextCursor &aCursor); williamr@2: void RemoveTextCursor(); williamr@2: void BlastBitmap(const TPoint& aPoint,const CFbsBitmap* aBitmap,const TRect& aRect); williamr@2: void DrawPictureFrame(TFrameOverlay* aPictureFrame,const TRect& aLineRect); williamr@2: void Invalidate(TRect aRect); williamr@2: void ActivateContext(); williamr@2: void ActivateContext(CGraphicsContext *aGc); williamr@2: void DeactivateContext(); williamr@2: void DeactivateContext(CGraphicsContext *aGc); williamr@2: void SetLayout(CTextLayout* aLayout); williamr@2: CTextLayout* Layout(); williamr@2: TBool UseWindowGc() const; williamr@2: williamr@2: private: williamr@2: void DestroyContexts(); williamr@2: private: williamr@2: RWsSession *iSession; williamr@2: RWindowGroup *iGroupWin; williamr@2: RWindow *iWin; williamr@2: CBitmapContext *iGc; williamr@2: CBitmapDevice *iGd; williamr@2: TDrawTextLayoutContext* const iDrawTextLayoutContext; williamr@2: TUint iRects; williamr@2: TRect iInvalidRect; williamr@2: TLogicalRgb iBackground; williamr@2: CTextLayout* iTextLayout; williamr@2: }; williamr@2: williamr@2: /** Visibility of line and text cursor. williamr@2: williamr@2: The TVisibility enumeration defined in this class is used in calls to CTextView::SetCursorVisibilityL(). williamr@2: The remainder of this class does not form part of the API. williamr@2: @internalComponent williamr@2: */ williamr@2: class TCursor williamr@2: { williamr@2: public: williamr@2: enum TCursors williamr@2: { williamr@2: EFNeitherCursor = 0, williamr@2: EFTextCursor = 1, williamr@2: EFLineCursor = 2, williamr@2: EFBothCursors = EFTextCursor | EFLineCursor williamr@2: }; williamr@2: williamr@2: /** Cursor visibility */ williamr@2: enum TVisibility williamr@2: { williamr@2: /** Indicates that the cursor should be invisible. */ williamr@2: EFCursorInvisible = 0, williamr@2: /** Indicates that the cursor should be visible. */ williamr@2: EFCursorVisible, williamr@2: /** Indicates a flashing text cursor. When specified for the line williamr@2: cursor, is equivalent to EFCursorVisible, as the line cursor cannot williamr@2: flash. Note that a non-flashing text cursor should only be used when williamr@2: there is to be no editing, reformatting, scrolling or cursor movement. williamr@2: */ williamr@2: EFCursorFlashing williamr@2: }; williamr@2: williamr@2: TCursor(TCursorPosition& aCursorPos,RScreenDisplay& aDisplay); williamr@2: void SetLineCursorBitmap(const CFbsBitmap* aLineCursorBitmap); williamr@2: inline TUint LineCursorVisibility(); williamr@2: inline TUint TextCursorVisibility(); williamr@2: void Draw(TUint aCursors); williamr@2: williamr@2: void SetVisibility(TVisibility aLineCursor,TVisibility aTextCursor); williamr@2: void SetType(TTextCursor::EType aType); williamr@2: void SetPlacement(TTmCursorPlacement aPlacement); williamr@2: void SetAscentAndDescent(TInt aAscent,TInt aDescent); williamr@2: void SetWeight(TInt aWeight); williamr@2: void SetFlash(TBool aEnabled); williamr@2: void SetXorColor(TRgb aColor); williamr@2: void MatchCursorHeightToAdjacentChar(); williamr@2: void SetExtensions(TInt aFirstExtension, TInt aSecondExtension); williamr@2: private: williamr@2: enum williamr@2: { williamr@2: ELineCursorToLabelGap = 2, williamr@2: ETextCursorWeight = 3, williamr@2: ETextCursorInvertColor = 0xFFFFFF williamr@2: }; williamr@2: williamr@2: void DrawLineCursor(TInt aHeight); williamr@2: void RemoveLineCursor(); williamr@2: void DrawTextCursor(TPoint aOrigin,TInt aWidth,TInt aAscent,TInt aDescent); williamr@2: void RemoveTextCursor(); williamr@2: williamr@2: RScreenDisplay& iDisplay; // a reference to the object controlling drawing williamr@2: TCursorPosition& iCursorPos; // a reference to the object holding the cursor's document position williamr@2: TBool iVisible; // TRUE if the text cursor is currently visible in the displayed text williamr@2: TBool iFlash; // TRUE if the text cursor should flash williamr@2: TVisibility iLineCursor; // line cursor state williamr@2: TVisibility iTextCursor; // text cursor state williamr@2: const CFbsBitmap* iLineCursorBitmap; // if non-null, points to a non-owned bitmap representing the line cursor williamr@2: TInt iAscent; // if non-negative, ascent used for vertical cursors williamr@2: TInt iDescent; // if non-negative, descent used for vertical cursors williamr@2: TInt iWeight; // width of vertical cursors, height of horizontal ones williamr@2: TTextCursor::EType iType; // filled or hollow rectangle, etc. williamr@2: TRgb iXorColor; // colour XORed with the background when the cursor is drawn williamr@2: TTmCursorPlacement iPlacement; // vertical, underline, etc. williamr@2: TInt iFirstExtension; // customise the cursor, extends vertical cursors upwards, horizontal cursors leftwards williamr@2: TInt iSecondExtension; // customise the cursor, extends vertical cursors downwards, horizontal cursors rightwards williamr@2: TInt iReserved[2]; williamr@2: }; williamr@2: williamr@2: /** williamr@2: Lays out formatted text for display. williamr@2: williamr@2: The class provides functions to: williamr@2: williamr@2: convert between document positions and x,y coordinates williamr@2: williamr@2: set the dimensions of the rectangle in which text can be viewed (the view williamr@2: rectangle) williamr@2: williamr@2: set margin widths williamr@2: williamr@2: do horizontal and vertical scrolling williamr@2: williamr@2: do text selection williamr@2: williamr@2: set the cursor position and appearance williamr@2: williamr@2: After a change has been made to the text layout, a reformat and redraw should williamr@2: normally take place. CTextView provides functions which are optimised to reformat williamr@2: the minimum amount necessary. For example, when a global formatting parameter williamr@2: is changed (e.g. the wrap width), the whole document's layout needs to be williamr@2: recalculated, so HandleGlobalChangeL() should be called. If the change involves williamr@2: the insertion or deletion of a single character, only a single line may be williamr@2: affected; for this, HandleCharEditL() is appropriate. Most CTextView reformatting williamr@2: functions do scrolling (using block transfer), if necessary, and a redraw. williamr@2: williamr@2: For maximum responsiveness, CTextView uses an active object to carry out williamr@2: reformatting as a background task, so that the application can continue to williamr@2: receive user input. Many CTextView functions force background formatting to williamr@2: complete before they take effect. williamr@2: williamr@2: When scrolling vertically, positive numbers of pixels, lines, paragraphs, williamr@2: pages, etc., mean that the text moves down, and vice versa. When scrolling williamr@2: horizontally, positive numbers of pixels mean that the text moves left and williamr@2: vice versa. williamr@2: williamr@2: A text view can display up to two cursors and up to three margins. The cursors williamr@2: are the text cursor and the line cursor. The purpose of the line cursor is williamr@2: to make it easier to see which line the text cursor (or the selection extension williamr@2: point) is on. The three margins are the label margin (for paragraph labels), williamr@2: the line cursor margin (for the line cursor) and the left text margin (the williamr@2: gap between the edge of the page and the text). All are optional, but if present, williamr@2: they appear in that order, starting at the left edge of the view rectangle. williamr@2: williamr@2: An object of class CTextLayout is used by the text view to calculate changes williamr@2: to the layout. This object must be specified when constructing the text view. williamr@2: It is also used to set layout attributes, including the wrap width, the height williamr@2: of the visible portion of the document (the "band"), whether formatting is williamr@2: set to the band or to the whole document and the text object which is the williamr@2: source of the text and formatting information. williamr@2: williamr@2: The x-y pixel coordinates used by CTextView are called window coordinates. williamr@2: Window coordinates have their origin at the top left corner of the view window williamr@2: (unlike class CTextLayout whose coordinates have their origin at the top left williamr@2: corner of the area within the view rectangle in which text can appear). As williamr@2: in most bitmap graphics systems, x coordinates increase rightwards and y coordinates williamr@2: increase downwards. williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: class CTextView : public CBase williamr@2: williamr@2: { williamr@2: friend class CTestTextView; williamr@2: public: williamr@2: enum TPriorities williamr@2: { williamr@2: EFBackgroundFormattingPriority = (CActive::EPriorityIdle + CActive::EPriorityLow) / 2 williamr@2: }; williamr@2: williamr@2: /** deprecated 8.0 */ williamr@2: enum williamr@2: { williamr@2: EFFirstCharOnLine = -1000000, williamr@2: EFLastCharOnLine = 1000000 williamr@2: }; williamr@2: williamr@2: /** Cursor height matching. williamr@2: williamr@2: Passed as an argument to MatchCursorHeightToAdjacentChar(). */ williamr@2: enum TBeforeAfter williamr@2: { williamr@2: /** Text cursor height is matched to preceding character. */ williamr@2: EFCharacterBefore = ETrue, williamr@2: /** Text cursor height is matched to following character. */ williamr@2: EFCharacterAfter = EFalse williamr@2: }; williamr@2: williamr@2: williamr@2: williamr@2: /** Whether to reformat and redraw. Argument to SetViewL(). */ williamr@2: enum TDiscard williamr@2: { williamr@2: /** Discard all formatting; redraw. */ williamr@2: EFViewDiscardAllFormat, williamr@2: /** Do not discard all formatting; redraw. */ williamr@2: EFViewDontDiscardFormat, williamr@2: /** Discard all formatting; no redraw. */ williamr@2: EFViewDiscardAllNoRedraw, williamr@2: /** Do not discard all formatting; redraw. */ williamr@2: EFViewDontDiscardFullRedraw williamr@2: }; williamr@2: williamr@2: /** williamr@2: Provides notification to the owner of the text view object of changes to the williamr@2: formatting. williamr@2: williamr@2: Its OnReformatL() function is called after reformatting but before redisplay, williamr@2: so that edit windows etc. can be resized. williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: class MObserver williamr@2: williamr@2: { williamr@2: public: williamr@2: williamr@4: /** Called after reformatting but before redisplay, so that the height of edit windows, etc., williamr@4: can be adjusted. There is no need to adjust the width of displaying components as formatting williamr@4: is always done to fit the specified width. williamr@4: Implementers are not allowed to call any formatting functions while handling reformatting williamr@4: notifications as it may cause recursive loops leading to unexpected consequences. williamr@2: @param aTextView A pointer to the current text view object. */ williamr@2: virtual void OnReformatL(const CTextView* aTextView) = 0; williamr@2: }; williamr@2: williamr@2: // argument to SetViewL williamr@2: enum TDoHorizontalScroll williamr@2: { williamr@2: EFNoHorizontalScroll = EFalse, williamr@2: EFCheckForHorizontalScroll = ETrue williamr@2: }; williamr@2: williamr@2: 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@2: functions. williamr@4: williamr@4: The class should only be used internally by FORM component. williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: class TTagmaForwarder: public MTmTextLayoutForwarder williamr@2: williamr@2: { williamr@2: public: williamr@2: inline TTagmaForwarder(); williamr@2: inline void InitL(CTextView* aView); 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: CTextView* iView; williamr@2: }; williamr@2: williamr@2: private: williamr@2: enum TDrawParameters williamr@2: { williamr@2: EFDrawAllWindow = CLayoutData::EFLargeNumber // must be larger than the pixel height of any window. williamr@2: }; williamr@2: williamr@2: // bit values used in iFlags williamr@2: enum williamr@2: { williamr@2: EFSelectionVisible = 1, williamr@2: EFPictureFrameEnabled = 2, williamr@2: EFEverythingVisible = 3, williamr@2: EFFlickerFreeRedraw = 4, williamr@2: EFTextVisible = 8 williamr@2: }; williamr@2: williamr@2: // horizontal scroll jump in pixels williamr@2: enum THorizontalScrollJump williamr@2: { williamr@2: EFDefaultHorizontalScrollJump = 20 williamr@2: #ifdef _DEBUG williamr@2: ,EFUnreasonablyLargeHorizontalScrollJump = 10000 williamr@2: #endif williamr@2: }; williamr@2: williamr@2: // picture frame blob widths in pixels williamr@2: enum TPictureFrameBlobWidths williamr@2: { williamr@2: EFFrameVisibleBlobWidth = 10, williamr@2: EFFrameActiveBlobWidth = 20 williamr@2: }; williamr@2: williamr@2: enum THorizontalScroll williamr@2: { williamr@2: EFNoPreviousHorizontalScroll = 0, williamr@2: EFPreviousHorizontalScroll williamr@2: }; williamr@2: williamr@2: enum TMemoryStatus williamr@2: { williamr@2: EFMemoryOK, williamr@2: EFOutOfMemory, williamr@2: EFRecovering williamr@2: }; williamr@2: williamr@2: enum TExtendedHighlightRedraw williamr@2: { williamr@2: EFTopEdge = 0x0001, williamr@2: EFBottomEdge = 0x0002 williamr@2: }; williamr@2: williamr@2: williamr@2: public: williamr@2: IMPORT_C static CTextView *NewL(CTextLayout* aLayout,const TRect &aDisplay,CBitmapDevice* aGd, williamr@2: MGraphicsDeviceMap* aDeviceMap,RWindow* aWin,RWindowGroup* aGroupWin, williamr@2: RWsSession* aSession); williamr@2: IMPORT_C ~CTextView(); williamr@2: IMPORT_C void SetDisplayContextL(CBitmapDevice* aGd,RWindow* aWin,RWindowGroup* aGroupWin,RWsSession* aSession); williamr@2: IMPORT_C void SetLayout(CTextLayout* aLayout); williamr@2: inline const CTextLayout* Layout() const; williamr@2: IMPORT_C void SetViewRect(const TRect& aDisplay); williamr@2: IMPORT_C void AlterViewRect(const TRect &aViewRect); williamr@2: IMPORT_C void SetMarginWidths(TInt aLabels,TInt aLineCursor); williamr@2: IMPORT_C void SetHorizontalScrollJump(TInt aScrollJump); williamr@2: IMPORT_C void SetLineCursorBitmap(const CFbsBitmap* aLineCursorBitmap); williamr@2: IMPORT_C void SetHighlightExtensions(TInt aLeftExtension, TInt aRightExtension, TInt aTopExtension, TInt aBottomExtension); williamr@2: IMPORT_C void SetExcessHeightRequired(TInt aExcessHeightRequired); williamr@2: IMPORT_C void SetBackgroundColor(TRgb aColor); williamr@2: IMPORT_C void SetTextColorOverride(const TRgb* aOverrideColor = NULL); williamr@2: IMPORT_C void SetCursorVisibilityL(TUint aLineCursor,TUint aTextCursor); williamr@2: IMPORT_C void SetSelectionVisibilityL(TBool aSelectionVisible); williamr@2: IMPORT_C TBool SelectionVisible() const; williamr@2: IMPORT_C void EnablePictureFrameL(TBool aEnabled); williamr@2: IMPORT_C const TRect& ViewRect() const; williamr@2: IMPORT_C const TRect& AlteredViewRect() const; williamr@2: IMPORT_C void MarginWidths(TInt& aLabels,TInt& aLineCursor) const; williamr@2: IMPORT_C TInt HorizontalScrollJump() const; williamr@2: IMPORT_C TInt LeftTextMargin() const; williamr@2: IMPORT_C void SetLatentXPosition(TInt aLatentX); williamr@2: // deprecated 7.0 williamr@2: IMPORT_C void SetParagraphFillTextOnly(TBool aFillTextOnly); williamr@2: IMPORT_C void SetCursorWidthTypeL(TTextCursor::EType aType,TInt aWidth = 0); williamr@2: IMPORT_C void SetCursorPlacement(TTmCursorPlacement aPlacement); williamr@2: IMPORT_C void SetCursorWeight(TInt aWeight); williamr@2: IMPORT_C void SetCursorFlash(TBool aEnabled); williamr@2: IMPORT_C void SetCursorXorColor(TRgb aColor); williamr@2: IMPORT_C void SetCursorExtensions(TInt aFirstExtension, TInt aSecondExtension); williamr@2: IMPORT_C TCursorSelection Selection() const; williamr@2: IMPORT_C TBool IsPictureFrameSelected(TRect& aPictureFrameRect,TInt& aDocPos) const; williamr@2: IMPORT_C TBool GetPictureRectangleL(TInt aDocPos,TRect& aPictureRect,TBool* aCanScaleOrCrop = NULL) const; williamr@2: IMPORT_C TBool GetPictureRectangleL(TPoint aXyPos,TRect& aPictureRect,TBool* aCanScaleOrCrop = NULL); williamr@2: IMPORT_C TBool FindXyPosL(const TPoint& aXyPos,TTmPosInfo2& aPosInfo,TTmLineInfo* aLineInfo = NULL); williamr@2: IMPORT_C TInt XyPosToDocPosL(TPoint& aPoint); williamr@2: IMPORT_C TBool FindDocPosL(const TTmDocPosSpec& aDocPos,TTmPosInfo2& aPosInfo,TTmLineInfo* aLineInfo = NULL); williamr@2: IMPORT_C TBool DocPosToXyPosL(TInt aDocPos,TPoint& aPoint); williamr@2: IMPORT_C TRect ParagraphRectL(TInt aDocPos) const; williamr@2: IMPORT_C void CalculateHorizontalExtremesL(TInt& aLeftX,TInt& aRightX,TBool aOnlyVisibleLines); williamr@2: IMPORT_C void MatchCursorHeightL(const TFontSpec& aFontSpec); williamr@2: IMPORT_C void MatchCursorHeightToAdjacentChar(TBeforeAfter aBasedOn = EFCharacterBefore); williamr@2: IMPORT_C TPoint SetSelectionL(const TCursorSelection& aSelection); williamr@2: IMPORT_C void CancelSelectionL(); williamr@2: IMPORT_C void ClearSelectionL(); williamr@2: IMPORT_C TPoint SetDocPosL(const TTmDocPosSpec& aDocPos,TBool aDragSelectOn = EFalse); williamr@2: IMPORT_C TPoint SetDocPosL(TInt aDocPos,TBool aDragSelectOn = EFalse); williamr@2: IMPORT_C TPoint SetXyPosL(TPoint aPos,TBool aDragSelectOn,TRect*& aPictureRect,TInt& aPictureFrameEdges); williamr@2: IMPORT_C TPoint MoveCursorL(TCursorPosition::TMovementType& aMovement,TBool aDragSelectOn); williamr@2: IMPORT_C TInt ScrollDisplayL(TCursorPosition::TMovementType aMovement, williamr@2: CTextLayout::TAllowDisallow aScrollBlankSpace=CTextLayout::EFDisallowScrollingBlankSpace); williamr@2: IMPORT_C TPoint SetViewLineAtTopL(TInt aLineNo); williamr@4: IMPORT_C void ScrollDisplayPixelsL(TInt& aDeltaY); williamr@4: IMPORT_C void ScrollDisplayPixelsNoLimitBorderL(TInt aDeltaY); williamr@2: IMPORT_C TInt ScrollDisplayLinesL(TInt& aDeltaLines, williamr@2: CTextLayout::TAllowDisallow aScrollBlankSpace = CTextLayout::EFDisallowScrollingBlankSpace); williamr@2: IMPORT_C TInt ScrollDisplayParagraphsL(TInt& aDeltaParas, williamr@2: CTextLayout::TAllowDisallow aScrollBlankSpace = CTextLayout::EFDisallowScrollingBlankSpace); williamr@2: IMPORT_C TPoint SetViewL(TInt aDocPos,TInt& aYPos,TViewYPosQualifier aYPosQualifier = TViewYPosQualifier(), williamr@2: TDiscard aDiscardFormat = EFViewDontDiscardFormat, williamr@2: TDoHorizontalScroll aDoHorizontalScroll = EFCheckForHorizontalScroll); williamr@2: IMPORT_C void SetLeftTextMargin(TInt aLeftMargin); williamr@2: IMPORT_C void DrawL(TRect aRect); williamr@2: IMPORT_C void DrawL(TRect aRect,CBitmapContext& aGc); williamr@2: inline void SetObserver(MObserver* aObserver); williamr@2: IMPORT_C void SetPendingSelection(const TCursorSelection& aSelection); williamr@2: inline void EnableFlickerFreeRedraw(); williamr@2: inline void DisableFlickerFreeRedraw(); williamr@2: inline TBool FlickerFreeRedraw() const; williamr@2: inline void GetOrigin(TPoint& aPoint) const; williamr@2: IMPORT_C TCursorSelection GetForwardDeletePositionL(); williamr@2: IMPORT_C TCursorSelection GetBackwardDeletePositionL(); williamr@2: williamr@2: // reformatting after changes to the content williamr@2: IMPORT_C void FormatTextL(); williamr@2: IMPORT_C TInt HandleCharEditL(TUint aType = CTextLayout::EFCharacterInsert,TBool aFormatChanged = EFalse); williamr@2: IMPORT_C TPoint HandleRangeFormatChangeL(TCursorSelection aSelection,TBool aFormatChanged = EFalse); williamr@2: IMPORT_C TPoint HandleInsertDeleteL(TCursorSelection aSelection,TInt aDeletedChars,TBool aFormatChanged = EFalse); williamr@2: IMPORT_C void HandleGlobalChangeL(TViewYPosQualifier aYPosQualifier = TViewYPosQualifier()); williamr@2: IMPORT_C void HandleGlobalChangeNoRedrawL(TViewYPosQualifier aYPosQualifier = TViewYPosQualifier()); williamr@2: IMPORT_C void HandleAdditionalCharactersAtEndL(); williamr@2: IMPORT_C void FinishBackgroundFormattingL(); williamr@2: williamr@2: IMPORT_C CBitmapContext* BitmapContext(); williamr@2: IMPORT_C const TTmDocPos& VisualEndOfRunL( williamr@2: const TTmDocPos& aStart, const TTmDocPos& aEnd, williamr@2: TCursorPosition::TVisualEnd aDirection); williamr@2: IMPORT_C void GetCursorPos(TTmDocPos& aPos) const; williamr@2: williamr@2: IMPORT_C TPoint SetDocPosL(const TTmDocPos& aDocPos,TBool aDragSelectOn = EFalse); williamr@2: williamr@2: IMPORT_C void SetCursorPositioningHintL(TCursorPosition::TPosHint aHint); williamr@2: williamr@2: IMPORT_C void SetOpaque(TBool aDrawOpaque); williamr@2: IMPORT_C void MakeVisible(TBool aVisible); williamr@2: williamr@2: private: williamr@2: IMPORT_C static TInt IdleL(TAny *aSelf); williamr@2: IMPORT_C CTextView(); williamr@2: IMPORT_C void ConstructL(CTextLayout* aLayout,const TRect &aDisplay,CBitmapDevice* aGd,MGraphicsDeviceMap* aDeviceMap, williamr@2: RWindow* aWin,RWindowGroup* aGroupWin,RWsSession* aSession); williamr@2: inline TInt TopViewRect() const; williamr@2: inline TBool IsFormatting() const; williamr@2: TBool NoMemoryCheckL(); williamr@2: void StartIdleObject(); williamr@2: inline void DrawWithPreviousHighlight(); williamr@2: inline void DrawWithCurrentHighlight(); williamr@2: TInt CalculateBaseLinePos(TTmDocPos& aDocPos); williamr@2: TInt DrawAfterCursorMoveL(TInt aVerticalScrollBy); williamr@2: TBool NextLineL(); williamr@2: void ClearRectAtBottom(TInt aHeight); williamr@2: void DrawTextL(TInt aFromHeight = 0,TInt aToHeight = EFDrawAllWindow); williamr@2: void DisplayNewLinesL(TInt aFrom,TInt aTo); williamr@2: void DrawCursor(TUint aCursors = TCursor::EFBothCursors); williamr@2: TPoint DoMoveCursorL(TBool aDragSelectOn,TCursorPosition::TMovementType& aMovement,TBool aAllowPictureFrame); williamr@2: void ScrollTextL(TInt aScrollY,TInt aFrom,TInt aScrollX,TBool aScrollBackground); williamr@2: void ScrollRect(TRect& aRect,TInt aScrollY,TInt aFrom,TInt aScrollX,TBool aScrollBackground); williamr@2: void ScrollRect(TInt aScrollY,TInt& aFrom,TInt& aTo); williamr@2: TPoint HandleBlockChangeL(TCursorSelection aSelection,TInt aOldCharsChanged,TBool aFormatChanged); williamr@2: void CheckScrollUpL(); williamr@2: TInt CheckHorizontalScroll(const TTmDocPos& aDocPos); williamr@2: TInt DoHorizontalScrollDisplayL(TCursorPosition::TMovementType aMovement, williamr@2: CTextLayout::TAllowDisallow aScrollBlankSpace); williamr@2: TInt DoScrollDisplayL(TCursorPosition::TMovementType aMovement,CTextLayout::TAllowDisallow aScrollBlankSpace); williamr@2: void ScrollDisplayL(); williamr@2: TPoint ViewTopOfLineL(const TTmDocPos& aDocPos,TInt& aYPos, williamr@2: CTextView::TDiscard aDiscardFormat = EFViewDontDiscardFormat, williamr@2: TDoHorizontalScroll aHorizontalScroll = EFCheckForHorizontalScroll); williamr@2: TPoint ViewL(const TTmDocPos& aDocPos,TInt& aYPos,TViewYPosQualifier aYPosQualifier = TViewYPosQualifier(), williamr@2: CTextView::TDiscard aDiscardFormat = EFViewDontDiscardFormat, williamr@2: TDoHorizontalScroll aHorizontalScroll = EFCheckForHorizontalScroll); williamr@2: TPoint DoHandleGlobalChangeL(TViewYPosQualifier aYPosQualifier,CTextView::TDiscard aDiscard); williamr@2: void UpdateHighlightL(); williamr@2: void HighlightUsingExtensions(CTextLayout::TRangeChange aOptimizedRange, CTextLayout::TRangeChange aOriginalRange); williamr@2: void UpdatePictureFrameL(); williamr@2: void RedrawPictureFrameRectL(TInt aPos); williamr@2: void DrawPictureFrameL(TRect& aClipRect); williamr@2: void DestroyWindowServerObjects(); williamr@2: void NoMemoryL(TInt aErr); williamr@2: void RecoverNoMemoryL(); williamr@2: void RecreateWindowServerObjectsL(); williamr@2: void DrawTextSupportL(const TRect& aRect,const TCursorSelection* aHighlight); williamr@2: void DoDrawTextSupportL(const TRect& aRect,const TCursorSelection* aHighlight); williamr@2: void DoDrawTextSupportOpaqueL(const TRect& aRect,const TCursorSelection* aHighlight); williamr@2: void DisplayLineRangeL(TInt aFrom,TInt aTo); williamr@2: inline void NotifyReformatL(); williamr@2: void CalculateHorizontalExtremes(TInt& aLeftX,TInt& aRightX,TBool aOnlyVisibleLines); williamr@2: TBool ExtendedHighlightExists() const; williamr@2: void DoClearSelectionL(const TCursorSelection& aSelection, TBool aIsPictureFrame); williamr@2: void AdjustRectForScrolling(TRect &aRect, TInt aScrollY, TInt aScrollX) const; williamr@2: static void ResetOffScreenBitmapContext(TAny* aTextView); williamr@2: static void ResetExternalDraw(TAny* aTextView); williamr@2: williamr@2: private: williamr@2: CIdle* iWrap; williamr@2: RScreenDisplay iDisplay; williamr@2: CTextLayout* iLayout; // must not be moved williamr@2: TDrawTextLayoutContext iDrawTextLayoutContext; // must not be moved williamr@2: TCursor iCursor; williamr@2: TCursorPosition iCursorPos; // must not be moved williamr@2: TFrameOverlay* iPictureFrame; williamr@2: TMemoryStatus iNoMemory; williamr@2: TUint iFlags; // must not be moved williamr@2: TUint iHorizontalScroll; williamr@2: TInt iGood; williamr@2: TInt iFormattedUpTo; williamr@2: TInt iHorizontalScrollJump; williamr@2: TInt iHeightNotDrawn; williamr@2: MObserver* iObserver; // must not be moved williamr@4: CBitmapContext* iOffScreenContext; //Explicit off-screen bitmap to draw to. williamr@2: TRect iReducedDrawingAreaRect; williamr@2: TUint iDummy;// was iRedrawExtendedHighlight; williamr@2: TBool iContextIsNavigation; williamr@2: TBool iDrawOpaque; williamr@2: }; williamr@2: williamr@2: inline TUint TCursor::LineCursorVisibility() williamr@2: { williamr@2: return iLineCursor; williamr@2: } williamr@2: williamr@2: inline TUint TCursor::TextCursorVisibility() williamr@2: { williamr@2: return iTextCursor; williamr@2: } williamr@2: williamr@2: /** Returns a pointer to the text layout object used by the text view. williamr@2: @return A pointer to the text layout object used by the text view. */ williamr@2: inline const CTextLayout* CTextView::Layout() const williamr@2: { williamr@2: return iLayout; williamr@2: } williamr@2: williamr@2: /** Sets a text view observer. This provides notification to the owner of the williamr@2: text view object of changes to the formatting. Its OnReformatL() function is williamr@2: called after reformatting but before redisplay, so that edit windows etc. can williamr@2: be resized. williamr@2: williamr@2: @param aObserver Pointer to text view observer object. */ williamr@2: inline void CTextView::SetObserver(MObserver* aObserver) williamr@2: { williamr@2: iObserver = aObserver; williamr@2: } williamr@2: williamr@2: inline void CTextView::EnableFlickerFreeRedraw() williamr@2: { williamr@2: iFlags |= EFFlickerFreeRedraw; williamr@2: } williamr@2: williamr@2: inline void CTextView::DisableFlickerFreeRedraw() williamr@2: { williamr@2: iFlags &= ~EFFlickerFreeRedraw; williamr@2: } williamr@2: williamr@2: inline TBool CTextView::FlickerFreeRedraw() const williamr@2: { williamr@2: return iFlags & EFFlickerFreeRedraw; williamr@2: } williamr@2: williamr@2: inline void CTextView::NotifyReformatL() williamr@2: { williamr@2: if (iObserver) williamr@2: iObserver->OnReformatL(this); williamr@2: } williamr@2: williamr@2: inline TBool CTextView::IsFormatting() const williamr@2: { williamr@2: return iLayout->IsBackgroundFormatting(); williamr@2: } williamr@2: williamr@2: inline TInt CTextView::TopViewRect() const williamr@2: { williamr@2: return iDrawTextLayoutContext.iViewRect.iTl.iY; williamr@2: } williamr@2: williamr@2: inline void CTextView::DrawWithPreviousHighlight() williamr@2: { williamr@2: iCursorPos.SetToPreviousHighlight(); williamr@2: } williamr@2: williamr@2: inline void CTextView::DrawWithCurrentHighlight() williamr@2: { williamr@2: iCursorPos.SetToCurrentHighlight(); williamr@2: } williamr@2: williamr@2: /** Gets the origin of the cursor. williamr@2: @param aPoint On return, the cursor origin. */ williamr@2: inline void CTextView::GetOrigin(TPoint& aPoint) const williamr@2: { williamr@2: iLayout->GetOrigin(aPoint); williamr@2: aPoint += iDrawTextLayoutContext.TopLeftText(); williamr@2: } williamr@2: williamr@2: /** This constructor deliberately does not take a pointer or reference to williamr@2: CTextView, to prevent the class from being used unless InitL() is called. */ williamr@2: inline CTextView::TTagmaForwarder::TTagmaForwarder(): williamr@2: iView(NULL) williamr@2: { williamr@2: } williamr@2: williamr@2: /** Called after construction, to complete background reformatting. williamr@2: @param aView A pointer to the text view object. */ williamr@2: inline void CTextView::TTagmaForwarder::InitL(CTextView* aView) williamr@2: { williamr@2: iView = aView; williamr@2: iView->FinishBackgroundFormattingL(); williamr@2: } williamr@2: williamr@2: inline const CTmTextLayout& CTextView::TTagmaForwarder::TextLayout() const williamr@2: { williamr@2: return iView->Layout()->TagmaTextLayout(); williamr@2: } williamr@2: williamr@2: inline void CTextView::TTagmaForwarder::GetOrigin(TPoint& aPoint) const williamr@2: { williamr@2: iView->GetOrigin(aPoint); williamr@2: } williamr@2: williamr@2: #endif