|
|
/*
* _DISPML.H * * Purpose: * CDisplayML class. Multi-line display. * * Authors: * Original RichEdit code: David R. Fulmer * Christian Fortini * Murray Sargent */
#ifndef _DISPML_H
#define _DISPML_H
#include "_disp.h"
class CDisplayML : public CDisplay, public CLineArray { public:
#ifdef DEBUG
BOOL Invariant(void) const; #endif
friend class CLinePtr; friend class CLed; friend BOOL CTxtEdit::OnDisplayBand(const RECT *prc, BOOL fPrintFromDraw); friend class CDisplayPrinter;
private: LONG _cpCalcMax; // last cp for which line breaks have been calc'd + 1
LONG _yCalcMax; // height of calculated lines
LONG _cpWait; // cp WaitForRecalc() is waiting for (or < 0)
LONG _yWait; // y WaitForRecalc() is waiting for (or < 0)
LONG _yScroll; // vertical scroll position of visible view
LONG _dyFirstVisible; // offset from top of view to first visible line
LONG _iliFirstVisible; // index of first visible line
LONG _xWidthMax; // max width of this display (in log unit)
LONG _yHeightMax; // max height of this display (-1 for infinite)
LONG _xWidth; // width of longest calculated line
LONG _yHeight; // sum of heights of calculated lines
LONG _cpMin; // first character in display
CDevDesc *_pddTarget; // target device (if any).
unsigned long _fInRecalcScrollBars:1; // we're trying to recalc scroll
// bars
private: // Helpers
void InitVars(); void RecalcScrollBars(); LONG ConvertScrollToYPos(LONG yPos); LONG GetMaxYScroll() const; BOOL CreateEmptyLine(); LONG CalcScrollHeight(LONG yHeight) const; void RebindFirstVisible();
// Line breaking
BOOL RecalcLines(BOOL fWait = FALSE); BOOL RecalcLines(const CRchTxtPtr &tpFirst, LONG cchOld, LONG cchNew, BOOL fBackground, BOOL fWait, CLed *pled); BOOL RecalcSingleLine(CLed *pled); LONG CalcDisplayWidth();
// Rendering
virtual void Render(const RECT &rcView, const RECT &rcRender);
// Scrolling and scroller bars
void DeferUpdateScrollBar(); BOOL DoDeferredUpdateScrollBar(); virtual BOOL UpdateScrollBar(INT nBar, BOOL fUpdateRange = FALSE );
protected:
virtual LONG GetMaxXScroll() const;
public: virtual LONG ConvertYPosToScrollPos(LONG yPos);
CDisplayML (CTxtEdit* ped); virtual CDisplayML::~CDisplayML();
virtual BOOL Init();
// Device context management
virtual BOOL SetMainTargetDC(HDC hdc, LONG xWidthMax); virtual BOOL SetTargetDC(HDC hdc, LONG dxpInch = -1, LONG dypInch = -1);
// Getting properties
virtual void InitLinePtr ( CLinePtr & ); virtual const CDevDesc* GetDdTarget() const {return _pddTarget;} virtual BOOL IsMain() const {return TRUE;} BOOL IsInOutlineView() const {return _ped->IsInOutlineView();} // maximum height and width
virtual LONG GetMaxWidth() const {return _xWidthMax;} virtual LONG GetMaxHeight() const {return 0;} virtual LONG GetMaxPixelWidth() const;
// Width, height and line count (of all text)
virtual LONG GetWidth() const {return _xWidth;} virtual LONG GetHeight() const {return _yHeight;} virtual LONG GetResizeHeight() const; virtual LONG LineCount() const;
// Visible view properties
virtual LONG GetCliVisible( LONG *pcpMostVisible = NULL, BOOL fLastCharOfLastVisible = FALSE) const;
virtual LONG GetFirstVisibleLine() const {return _iliFirstVisible;} // Line info
virtual LONG GetLineText(LONG ili, TCHAR *pchBuff, LONG cchMost); virtual LONG CpFromLine(LONG ili, LONG *pyLine = NULL); LONG YposFromLine(LONG ili); virtual LONG LineFromYpos(LONG yPos, LONG *pyLine = NULL, LONG *pcpFirst = NULL); virtual LONG LineFromCp(LONG cp, BOOL fAtEnd) ;
// Point <-> cp conversion
virtual LONG CpFromPoint( POINT pt, const RECT *prcClient, CRchTxtPtr * const ptp, CLinePtr * const prp, BOOL fAllowEOL, HITTEST *pHit = NULL, CDispDim *pdispdim = NULL, LONG *pcpActual = NULL);
virtual LONG PointFromTp ( const CRchTxtPtr &tp, const RECT *prcClient, BOOL fAtEnd, POINT &pt, CLinePtr * const prp, UINT taMode, CDispDim *pdispdim = NULL);
// Line break recalc
BOOL StartBackgroundRecalc(); virtual VOID StepBackgroundRecalc(); virtual BOOL RecalcView(BOOL fUpdateScrollBars, RECT* prc = NULL); virtual BOOL WaitForRecalc(LONG cpMax, LONG yMax); virtual BOOL WaitForRecalcIli(LONG ili); virtual BOOL WaitForRecalcView();
// Complete updating (recalc + rendering)
virtual BOOL UpdateView(const CRchTxtPtr &tpFirst, LONG cchOld, LONG cchNew);
// Scrolling
virtual LRESULT VScroll(WORD wCode, LONG xPos); virtual VOID LineScroll(LONG cli, LONG cch); virtual VOID FractionalScrollView ( LONG yDelta ); virtual VOID ScrollToLineStart(LONG iDirection); virtual LONG CalcYLineScrollDelta ( LONG cli, BOOL fFractionalFirst ); virtual BOOL ScrollView(LONG xScroll, LONG yScroll, BOOL fTracking, BOOL fFractionalScroll); virtual LONG GetYScroll() const; virtual LONG GetScrollRange(INT nBar) const; virtual LONG AdjustToDisplayLastLine(LONG yBase, LONG yScroll);
// Selection
virtual BOOL InvertRange(LONG cp, LONG cch, SELDISPLAYACTION selAction);
// Natural size calculation
virtual HRESULT GetNaturalSize( HDC hdcDraw, HDC hicTarget, DWORD dwMode, LONG *pwidth, LONG *pheight);
// Misc. methods
void FindParagraph(LONG cpMin, LONG cpMost, LONG *pcpMin, LONG *pcpMost);
virtual CDisplay *Clone() const;
#ifdef DEBUG
void CheckLineArray() const; void DumpLines(LONG iliFirst, LONG cli); void CheckView(); BOOL VerifyFirstVisible(LONG *pHeight = NULL); #endif
}; #endif
|