📄 ccrystaltextview.cpp
字号:
}
else
DrawScreenLine(
pdc, origin, rc,
pBuf, nBlocks, nActualItem,
crText, crBkgnd, bDrawWhitespace,
pszChars, 0, nLength, CPoint(0, nLineIndex));
// Draw whitespaces to the left of the text
//BEGIN SW
// Drawing is now realized by DrawScreenLine()
/*ORIGINAL
CRect frect = rc;
if (origin.x > frect.left)
frect.left = origin.x;
if (frect.right > frect.left)
{
if ((m_bFocused || m_bShowInactiveSelection) && IsInsideSelBlock(CPoint(nLength, nLineIndex)))
{
pdc->FillSolidRect(frect.left, frect.top, GetCharWidth(), frect.Height(),
GetColor(COLORINDEX_SELBKGND));
frect.left += GetCharWidth();
}
if (frect.right > frect.left)
pdc->FillSolidRect(frect, bDrawWhitespace ? crBkgnd : GetColor(COLORINDEX_WHITESPACE));
}
*/
//END SW
}
COLORREF CCrystalTextView::
GetColor (int nColorIndex)
{
switch (nColorIndex)
{
case COLORINDEX_WHITESPACE :
case COLORINDEX_BKGND:
return::GetSysColor (COLOR_WINDOW);
case COLORINDEX_NORMALTEXT:
return::GetSysColor (COLOR_WINDOWTEXT);
case COLORINDEX_SELMARGIN:
return::GetSysColor (COLOR_SCROLLBAR);
case COLORINDEX_PREPROCESSOR:
return RGB (0, 128, 192);
case COLORINDEX_COMMENT:
// return RGB(128, 128, 128);
return RGB (0, 128, 0);
// [JRT]: Enabled Support For Numbers...
case COLORINDEX_NUMBER:
// return RGB(0x80, 0x00, 0x00);
return RGB (0xff, 0x00, 0x00);
// [JRT]: Support For C/C++ Operators
case COLORINDEX_OPERATOR:
// return RGB(0x00, 0x00, 0x00);
return RGB (96, 96, 96);
case COLORINDEX_KEYWORD:
return RGB (0, 0, 255);
case COLORINDEX_FUNCNAME:
return RGB (128, 0, 128);
case COLORINDEX_USER1:
return RGB (0, 0, 128);
case COLORINDEX_USER2:
return RGB (0, 128, 192);
case COLORINDEX_SELBKGND:
return RGB (0, 0, 0);
case COLORINDEX_SELTEXT:
return RGB (255, 255, 255);
}
// return RGB(255, 0, 0);
return RGB (128, 0, 0);
}
DWORD CCrystalTextView::
GetLineFlags (int nLineIndex)
{
if (m_pTextBuffer == NULL)
return 0;
return m_pTextBuffer->GetLineFlags (nLineIndex);
}
void CCrystalTextView::
DrawMargin (CDC * pdc, const CRect & rect, int nLineIndex)
{
if (!m_bSelMargin)
{
pdc->FillSolidRect (rect, GetColor (COLORINDEX_BKGND));
return;
}
pdc->FillSolidRect (rect, GetColor (COLORINDEX_SELMARGIN));
int nImageIndex = -1;
if (nLineIndex >= 0)
{
DWORD dwLineFlags = GetLineFlags (nLineIndex);
static const DWORD adwFlags[] =
{
LF_EXECUTION,
LF_BREAKPOINT,
LF_COMPILATION_ERROR,
LF_BOOKMARK (1),
LF_BOOKMARK (2),
LF_BOOKMARK (3),
LF_BOOKMARK (4),
LF_BOOKMARK (5),
LF_BOOKMARK (6),
LF_BOOKMARK (7),
LF_BOOKMARK (8),
LF_BOOKMARK (9),
LF_BOOKMARK (0),
LF_BOOKMARKS,
LF_INVALID_BREAKPOINT
};
for (int I = 0; I <= sizeof (adwFlags) / sizeof (adwFlags[0]); I++)
{
if ((dwLineFlags & adwFlags[I]) != 0)
{
nImageIndex = I;
break;
}
}
}
if (nImageIndex >= 0)
{
if (m_pIcons == NULL)
{
m_pIcons = new CImageList;
VERIFY (m_pIcons->Create (IDR_MARGIN_ICONS, 16, 16, RGB (255, 255, 255)));
}
//BEGIN SW
CPoint pt(rect.left + 2, rect.top + (GetLineHeight() - 16) / 2);
/*ORIGINAL
CPoint pt(rect.left + 2, rect.top + (rect.Height() - 16) / 2);
*///END SW
VERIFY(m_pIcons->Draw(pdc, nImageIndex, pt, ILD_TRANSPARENT));
VERIFY (m_pIcons->Draw (pdc, nImageIndex, pt, ILD_TRANSPARENT));
}
}
BOOL CCrystalTextView::
IsInsideSelBlock (CPoint ptTextPos)
{
ASSERT_VALIDTEXTPOS (ptTextPos);
if (ptTextPos.y < m_ptDrawSelStart.y)
return FALSE;
if (ptTextPos.y > m_ptDrawSelEnd.y)
return FALSE;
if (ptTextPos.y < m_ptDrawSelEnd.y && ptTextPos.y > m_ptDrawSelStart.y)
return TRUE;
if (m_ptDrawSelStart.y < m_ptDrawSelEnd.y)
{
if (ptTextPos.y == m_ptDrawSelEnd.y)
return ptTextPos.x < m_ptDrawSelEnd.x;
ASSERT (ptTextPos.y == m_ptDrawSelStart.y);
return ptTextPos.x >= m_ptDrawSelStart.x;
}
ASSERT (m_ptDrawSelStart.y == m_ptDrawSelEnd.y);
return ptTextPos.x >= m_ptDrawSelStart.x && ptTextPos.x < m_ptDrawSelEnd.x;
}
BOOL CCrystalTextView::
IsInsideSelection (const CPoint & ptTextPos)
{
PrepareSelBounds ();
return IsInsideSelBlock (ptTextPos);
}
void CCrystalTextView::
PrepareSelBounds ()
{
if (m_ptSelStart.y < m_ptSelEnd.y ||
(m_ptSelStart.y == m_ptSelEnd.y && m_ptSelStart.x < m_ptSelEnd.x))
{
m_ptDrawSelStart = m_ptSelStart;
m_ptDrawSelEnd = m_ptSelEnd;
}
else
{
m_ptDrawSelStart = m_ptSelEnd;
m_ptDrawSelEnd = m_ptSelStart;
}
}
void CCrystalTextView::
OnDraw (CDC * pdc)
{
CRect rcClient;
GetClientRect (rcClient);
int nLineCount = GetLineCount ();
int nLineHeight = GetLineHeight ();
PrepareSelBounds ();
CDC cacheDC;
VERIFY (cacheDC.CreateCompatibleDC (pdc));
if (m_pCacheBitmap == NULL)
{
m_pCacheBitmap = new CBitmap;
//BEGIN SW
VERIFY(m_pCacheBitmap->CreateCompatibleBitmap(pdc, rcClient.Width(), rcClient.Height()));
/*ORIGINAL
VERIFY(m_pCacheBitmap->CreateCompatibleBitmap(pdc, rcClient.Width(), nLineHeight));
*/
//END SW
}
CBitmap *pOldBitmap = cacheDC.SelectObject (m_pCacheBitmap);
CRect rcLine;
rcLine = rcClient;
rcLine.bottom = rcLine.top + nLineHeight;
CRect rcCacheMargin (0, 0, GetMarginWidth (), nLineHeight);
CRect rcCacheLine (GetMarginWidth (), 0, rcLine.Width (), nLineHeight);
//BEGIN SW
// initialize rects
int nSubLineOffset = GetSubLineIndex( m_nTopLine ) - m_nTopSubLine;
if( nSubLineOffset < 0 )
{
rcCacheMargin.OffsetRect( 0, nSubLineOffset * nLineHeight );
rcCacheLine.OffsetRect( 0, nSubLineOffset * nLineHeight );
}
int nBreaks;
int nMaxLineChars = GetScreenChars();
//END SW
int nCurrentLine = m_nTopLine;
while (rcLine.top < rcClient.bottom)
{
//BEGIN SW
nBreaks = 0;
if( nCurrentLine < nLineCount /*&& GetLineLength( nCurrentLine ) > nMaxLineChars*/ )
WrapLineCached( nCurrentLine, nMaxLineChars, NULL, nBreaks );
rcLine.bottom = rcLine.top + (nBreaks + 1) * nLineHeight;
rcCacheLine.bottom = rcCacheLine.top + rcLine.Height();
rcCacheMargin.bottom = rcCacheMargin.top + rcLine.Height();
if( rcCacheLine.top < 0 )
rcLine.bottom+= rcCacheLine.top;
//END SW
if (nCurrentLine < nLineCount)
{
DrawMargin (&cacheDC, rcCacheMargin, nCurrentLine);
DrawSingleLine (&cacheDC, rcCacheLine, nCurrentLine);
}
else
{
DrawMargin (&cacheDC, rcCacheMargin, -1);
DrawSingleLine (&cacheDC, rcCacheLine, -1);
}
VERIFY (pdc->BitBlt (rcLine.left, rcLine.top, rcLine.Width (), rcLine.Height (), &cacheDC, 0, 0, SRCCOPY));
nCurrentLine++;
//BEGIN SW
rcLine.top = rcLine.bottom;
rcCacheLine.top = 0;
rcCacheMargin.top = 0;
/*ORIGINAL
rcLine.OffsetRect(0, nLineHeight);
*/
//END SW
}
cacheDC.SelectObject (pOldBitmap);
cacheDC.DeleteDC ();
}
void CCrystalTextView::
ResetView ()
{
// m_bWordWrap = FALSE;
m_nTopLine = 0;
m_nOffsetChar = 0;
m_nLineHeight = -1;
m_nCharWidth = -1;
m_nTabSize = 4;
m_nMaxLineLength = -1;
m_nScreenLines = -1;
m_nScreenChars = -1;
m_nIdealCharPos = -1;
m_ptAnchor.x = 0;
m_ptAnchor.y = 0;
if (m_pIcons != NULL)
{
delete m_pIcons;
m_pIcons = NULL;
}
for (int I = 0; I < 4; I++)
{
if (m_apFonts[I] != NULL)
{
m_apFonts[I]->DeleteObject ();
delete m_apFonts[I];
m_apFonts[I] = NULL;
}
}
if (m_pdwParseCookies != NULL)
{
delete m_pdwParseCookies;
m_pdwParseCookies = NULL;
}
if (m_pnActualLineLength != NULL)
{
delete m_pnActualLineLength;
m_pnActualLineLength = NULL;
}
m_nParseArraySize = 0;
m_nActualLengthArraySize = 0;
m_ptCursorPos.x = 0;
m_ptCursorPos.y = 0;
m_ptSelStart = m_ptSelEnd = m_ptCursorPos;
m_bDragSelection = FALSE;
m_bVertScrollBarLocked = FALSE;
m_bHorzScrollBarLocked = FALSE;
if (::IsWindow (m_hWnd))
UpdateCaret ();
m_bLastSearch = FALSE;
m_bShowInactiveSelection = TRUE; // FP: reverted because I like it
m_bPrintHeader = FALSE;
m_bPrintFooter = TRUE;
m_bBookmarkExist = FALSE; // More bookmarks
m_bMultipleSearch = FALSE; // More search
}
void CCrystalTextView::
UpdateCaret ()
{
ASSERT_VALIDTEXTPOS (m_ptCursorPos);
if (m_bFocused && !m_bCursorHidden &&
CalculateActualOffset (m_ptCursorPos.y, m_ptCursorPos.x) >= m_nOffsetChar)
{
CreateSolidCaret (2, GetLineHeight ());
SetCaretPos (TextToClient (m_ptCursorPos));
ShowCaret ();
}
else
{
HideCaret ();
}
}
int CCrystalTextView::
GetCRLFMode ()
{
if (m_pTextBuffer)
{
return m_pTextBuffer->GetCRLFMode ();
}
return -1;
}
void CCrystalTextView::
SetCRLFMode (int nCRLFMode)
{
if (m_pTextBuffer)
{
m_pTextBuffer->SetCRLFMode (nCRLFMode);
}
}
int CCrystalTextView::
GetTabSize ()
{
ASSERT (m_nTabSize >= 0 && m_nTabSize <= 64);
return m_nTabSize;
}
void CCrystalTextView::
SetTabSize (int nTabSize)
{
ASSERT (nTabSize >= 0 && nTabSize <= 64);
if (m_nTabSize != nTabSize)
{
m_nTabSize = nTabSize;
if (m_pnActualLineLength != NULL)
{
delete m_pnActualLineLength;
m_pnActualLineLength = NULL;
}
m_nActualLengthArraySize = 0;
m_nMaxLineLength = -1;
RecalcHorzScrollBar ();
Invalidate ();
UpdateCaret ();
}
}
CFont *CCrystalTextView::
GetFont (BOOL bItalic /*= FALSE*/ , BOOL bBold /*= FALSE*/ )
{
int nIndex = 0;
if (bBold)
nIndex |= 1;
if (bItalic)
nIndex |= 2;
if (m_apFonts[nIndex] == NULL)
{
m_apFonts[nIndex] = new CFont;
if (!m_lfBaseFont.lfHeight)
{
CClientDC dc (GetDesktopWindow ());
m_lfBaseFont.lfHeight = -MulDiv (11, dc.GetDeviceCaps (LOGPIXELSY), 72);
}
m_lfBaseFont.lfWeight = bBold && !_tcsnicmp (m_lfBaseFont.lfFaceName, _T ("Courier"), 7) ? FW_BOLD : FW_NORMAL;
m_lfBaseFont.lfItalic = (BYTE) (bItalic && !_tcsnicmp (m_lfBaseFont.lfFaceName, _T ("Courier"), 7));
if (!m_apFonts[nIndex]->CreateFontIndirect (&m_lfBaseFont))
{
delete m_apFonts[nIndex];
m_apFonts[nIndex] = NULL;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -