192 lines
6.2 KiB
C
192 lines
6.2 KiB
C
|
/*
|
||
|
* _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
|