Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

338 lines
7.7 KiB

//+-------------------------------------------------------------------------
//
// 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;
};