|
|
//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1996 - 1999.
//
// File: brview.hxx
//
// Contents:
//
// History: 15 Aug 1996 DLee Created
//
//--------------------------------------------------------------------------
#pragma once
struct CharDim { int cxChar; int cyChar; };
// Use for painting other than WM_PAINT
class DeviceContext { public: DeviceContext ( HWND hwnd ): _hwnd(hwnd) { _hdc = GetDC ( hwnd ); }
~DeviceContext () { ReleaseDC ( _hwnd, _hdc ); } protected: HWND _hwnd; HDC _hdc; };
class TextMetrics: public DeviceContext { public: TextMetrics ( HWND hwnd, HFONT hFont ): DeviceContext(hwnd) { HFONT hOldFont = (HFONT) SelectObject ( _hdc, hFont ); GetTextMetrics ( _hdc, &_tm ); SelectObject( _hdc, hOldFont ); }
void GetSizes ( CharDim& dim ); private: TEXTMETRIC _tm; };
class Layout { public: Layout () {} ~Layout () {} // Screen layout methods
void Init ( Model *pModel ) { _pModel = pModel; }
void SetCharSizes (TextMetrics& tm, HFONT hFont) { _hFont = hFont;
tm.GetSizes ( _dim ); }
int CxChar() const { return _dim.cxChar; } int CyChar() const { return _dim.cyChar; } int XBegin () const { return _xBegin; } int MaxLenChar () const { return _cCharWidth; }
int MaxLines () const { return _cLine; } int Y (int line ) const;
// Paragraph layout methods
void SetParaRange (int cParas); void Adjust (int cx, int cy, int& paraVScroll, int& paLineVScroll, int nHsrcollPos);
void Locate (int para, int paOff, int& paLine, int& paOffBeg, int& paOffEnd ) const; BOOL GetLineOffsets (int para, int paLine, int& paOffBeg, int& paOffEnd) const; int LinesInPara (int para) const; int LastLineInPara (int para) { return LinesInPara(para) - 1; } int LastPara() const; int FirstPara() const { return _paraFirst; } int FirstLineInPara() const { return _paLineFirst; } int LineNumber (int para, int paLine) const;
HFONT Font() { return _hFont; } Model & GetModel() { return * _pModel; }
private:
CharDim _dim;
int _xBegin; int _cCharWidth; // window width in chars
int _cLine; // Paragraph layout
int _cParas; // Top of the window
int _paraFirst; int _paLineFirst;
HFONT _hFont; Model * _pModel;
ParaLine const* _aParaLine; };
class Selection { public: Selection() : _paraStart( -1 ), _oStart( 0 ), _paraEnd( -1 ), _oEnd( 0 ) {}
Selection( Selection &s ) : _paraStart( s._paraStart ), _oStart( s._oStart ), _paraEnd( s._paraEnd ), _oEnd( s._oEnd ) {}
void None() { _paraStart = -1; _paraEnd = -1; }
BOOL SelectionExists() { return _paraStart != -1 && _paraEnd != -1; } BOOL IsNull() { return _paraStart == _paraEnd && _oStart == _oEnd; }
BOOL IsInOnePara() { return _paraStart == _paraEnd; }
BOOL IsInSelection( int para ) { return ( para >= _paraStart && para <= _paraEnd ); }
BOOL IsInSelection( int para, int c ) { BOOL fSel = FALSE;
if ( para == _paraStart && para == _paraEnd ) fSel = ( c >= _oStart && c < _oEnd ); else if ( para == _paraStart ) fSel = ( c >= _oStart ); else if ( para == _paraEnd ) fSel = ( c < _oEnd );
return fSel; }
void Set( int ps, int os, int pe, int oe ) { _paraStart = ps; _oStart = os; _paraEnd = pe; _oEnd = oe; }
void SetStart( int ps, int os ) { _paraStart = ps; _oStart = os; }
void SetEnd( int pe, int oe ) { _paraEnd = pe; _oEnd = oe; }
int ParaStart() { return _paraStart; } int OffStart() { return _oStart; } int ParaEnd() { return _paraEnd; } int OffEnd() { return _oEnd; }
private: int _paraStart; int _oStart; int _paraEnd; int _oEnd; };
class View { public: View() : _cyClient( 0 ), _fDblClk( 0 ), _fSelecting(FALSE) {}
void Init ( HWND hwnd, Model *pModel, HFONT hFont ) { _hwnd = hwnd; _nHScrollPos = 0;
_pModel = pModel; _layout.Init( pModel );
FontChange ( hwnd, hFont ); }
void ButtonUp( WPARAM wParam, LPARAM lParam ); void ButtonDown( WPARAM wParam, LPARAM lParam ); void DblClk( WPARAM wParam, LPARAM lParam ); void MouseMove( WPARAM wParam, LPARAM lParam ); void EditCopy( HWND hwnd, WPARAM wParam );
void FontChange ( HWND hwnd, HFONT hFont ) { TextMetrics tm(hwnd, hFont);
_layout.SetCharSizes( tm, hFont ); }
void Paint (HWND hwnd); void Size ( int cx, int cy ); void Home () { _fFullSelRepaint = TRUE; _paraVScroll = 0; _paLineVScroll = 0; } void End () { _fFullSelRepaint = TRUE; _paraVScroll = _paraVScrollMax; _paLineVScroll = _paLineVScrollMax; } int LineHeight () const { return _layout.CyChar(); } int CharWidth () const { return _layout.CxChar(); } int VScrollPara () const { return _paraVScroll; } int HScrollPos () const { return _nHScrollPos; } int VScrollMax () const { return _paraVScrollMax; } int HScrollMax () const { return _nHScrollMax; } void SetRange ( int maxParaLen, int maxParas ); void SetScroll( Position & pos ); int VisibleLines () const { return _cyClient / _layout.CyChar(); } int FirstPara() const { return _layout.FirstPara(); }
int IncVScrollPos ( int delta ); int JumpToPara ( int para );
int IncHScrollPos ( int delta ); void SetScrollMax ();
Selection & GetSelection() { return _Selection; }
int ParaFromY( int y );
private:
void _NoSelection();
void GetParaAndOffset( int x, int y, int & para, int & offset ); void _UpdateSelection( LPARAM lParam );
// dimensions of client window
int _cxClient; int _cyClient;
// scroll position
int _paraVScroll; // paragraph
int _paLineVScroll; // line within paragraph
int _paraVScrollMax; int _paLineVScrollMax;
int _nHScrollPos; int _nHScrollMax;
Layout _layout;
Model * _pModel;
Selection _Selection; BOOL _fDblClk; BOOL _fStartIsAnchor; BOOL _fSelecting; BOOL _fFullSelRepaint; int _cpLastSelY;
HWND _hwnd; };
// Use for painting after WM_PAINT
class Paint: public tagPAINTSTRUCT { public: Paint ( HWND hwnd ); ~Paint (); protected: HWND _hwnd; };
inline Paint::Paint ( HWND hwnd ): _hwnd(hwnd) { BeginPaint ( _hwnd, this ); }
inline Paint::~Paint() { EndPaint( _hwnd, this ); }
class PaintText: public Paint { public: PaintText( HWND hwnd, int paraFirst, int paLineFirst, Layout& layout, Selection & Selection ); ~PaintText(); void PrintLines (); void HiliteHits (); void HiliteSelection ();
private: void PrintCurrentHit( BOOL fCurrent );
int _paraFirst; int _paLineFirst; Layout& _layout; HFONT _hOldFont; Selection & _Selection; };
|