📄 ccrystaltextview2.cpp
字号:
{
//BEGIN SW
// scrolling windows
int nNewTopSubLine = m_nTopSubLine + GetScreenLines() - 1;
int nSubLineCount = GetSubLineCount();
if (nNewTopSubLine > nSubLineCount)
nNewTopSubLine = nSubLineCount - 1;
if (m_nTopSubLine != nNewTopSubLine)
{
ScrollToSubLine(nNewTopSubLine);
UpdateSiblingScrollPos(TRUE);
}
// setting cursor
CPoint subLinePos;
CharPosToPoint( m_ptCursorPos.y, m_ptCursorPos.x, subLinePos );
int nSubLine = GetSubLineIndex( m_ptCursorPos.y ) + subLinePos.y + GetScreenLines() - 1;
if( nSubLine > nSubLineCount - 1 )
nSubLine = nSubLineCount - 1;
SubLineCursorPosToTextPos(
CPoint( m_nIdealCharPos, nSubLine ), m_ptCursorPos );
/*ORIGINAL
int nNewTopLine = m_nTopLine + GetScreenLines() - 1;
if (nNewTopLine >= GetLineCount())
nNewTopLine = GetLineCount() - 1;
if (m_nTopLine != nNewTopLine)
{
ScrollToLine(nNewTopLine);
UpdateSiblingScrollPos(TRUE);
}
m_ptCursorPos.y += GetScreenLines() - 1;
if (m_ptCursorPos.y >= GetLineCount())
m_ptCursorPos.y = GetLineCount() - 1;
if (m_ptCursorPos.x > GetLineLength(m_ptCursorPos.y))
m_ptCursorPos.x = GetLineLength(m_ptCursorPos.y);
*///END SW
m_nIdealCharPos = CalculateActualOffset (m_ptCursorPos.y, m_ptCursorPos.x);
EnsureVisible (m_ptCursorPos); //todo: no vertical scroll
UpdateCaret ();
if (!bSelect)
m_ptAnchor = m_ptCursorPos;
SetSelection (m_ptAnchor, m_ptCursorPos);
}
void CCrystalTextView::
MoveCtrlHome (BOOL bSelect)
{
m_ptCursorPos.x = 0;
m_ptCursorPos.y = 0;
m_nIdealCharPos = CalculateActualOffset (m_ptCursorPos.y, m_ptCursorPos.x);
EnsureVisible (m_ptCursorPos);
UpdateCaret ();
if (!bSelect)
m_ptAnchor = m_ptCursorPos;
SetSelection (m_ptAnchor, m_ptCursorPos);
}
void CCrystalTextView::
MoveCtrlEnd (BOOL bSelect)
{
m_ptCursorPos.y = GetLineCount () - 1;
m_ptCursorPos.x = GetLineLength (m_ptCursorPos.y);
m_nIdealCharPos = CalculateActualOffset (m_ptCursorPos.y, m_ptCursorPos.x);
EnsureVisible (m_ptCursorPos);
UpdateCaret ();
if (!bSelect)
m_ptAnchor = m_ptCursorPos;
SetSelection (m_ptAnchor, m_ptCursorPos);
}
void CCrystalTextView::
ScrollUp ()
{
if (m_nTopLine > 0)
{
ScrollToLine (m_nTopLine - 1);
UpdateSiblingScrollPos (TRUE);
}
}
void CCrystalTextView::
ScrollDown ()
{
if (m_nTopLine < GetLineCount () - 1)
{
ScrollToLine (m_nTopLine + 1);
UpdateSiblingScrollPos (TRUE);
}
}
void CCrystalTextView::
ScrollLeft ()
{
if (m_nOffsetChar > 0)
{
ScrollToChar (m_nOffsetChar - 1);
UpdateCaret ();
}
}
void CCrystalTextView::
ScrollRight ()
{
if (m_nOffsetChar < GetMaxLineLength () - 1)
{
ScrollToChar (m_nOffsetChar + 1);
UpdateCaret ();
}
}
CPoint CCrystalTextView::
WordToRight (CPoint pt)
{
ASSERT_VALIDTEXTPOS (pt);
int nLength = GetLineLength (pt.y);
LPCTSTR pszChars = GetLineChars (pt.y);
while (pt.x < nLength)
{
if (!xisalnum (pszChars[pt.x]))
break;
pt.x++;
}
ASSERT_VALIDTEXTPOS (pt);
return pt;
}
CPoint CCrystalTextView::
WordToLeft (CPoint pt)
{
ASSERT_VALIDTEXTPOS (pt);
LPCTSTR pszChars = GetLineChars (pt.y);
while (pt.x > 0)
{
if (!xisalnum (pszChars[pt.x - 1]))
break;
pt.x--;
}
ASSERT_VALIDTEXTPOS (pt);
return pt;
}
void CCrystalTextView::
SelectAll ()
{
int nLineCount = GetLineCount ();
m_ptCursorPos.x = GetLineLength (nLineCount - 1);
m_ptCursorPos.y = nLineCount - 1;
SetSelection (CPoint (0, 0), m_ptCursorPos);
UpdateCaret ();
}
void CCrystalTextView::
OnLButtonDown (UINT nFlags, CPoint point)
{
CView::OnLButtonDown (nFlags, point);
BOOL bShift = GetKeyState (VK_SHIFT) & 0x8000;
BOOL bControl = GetKeyState (VK_CONTROL) & 0x8000;
if (point.x < GetMarginWidth ())
{
AdjustTextPoint (point);
if (bControl)
{
SelectAll ();
}
else
{
m_ptCursorPos = ClientToText (point);
//BEGIN SW
// Find char pos that is the beginning of the subline clicked on
CPoint pos;
CharPosToPoint( m_ptCursorPos.y, m_ptCursorPos.x, pos );
m_ptCursorPos.x = SubLineHomeToCharPos( m_ptCursorPos.y, pos.y );
/*ORIGINAL
m_ptCursorPos.x = 0; // Force beginning of the line
*///END SW
if (!bShift)
m_ptAnchor = m_ptCursorPos;
CPoint ptStart, ptEnd;
//BEGIN SW
CharPosToPoint( m_ptAnchor.y, m_ptAnchor.x, pos );
ptStart.y = m_ptAnchor.y;
if( GetSubLineIndex( ptStart.y ) + pos.y == GetSubLineCount() - 1 )
{
// select to end of subline
ptStart = SubLineEndToCharPos( ptStart.y, pos.y );
}
else
{
int nLine, nSubLine;
GetLineBySubLine( GetSubLineIndex( ptStart.y ) + pos.y + 1, nLine, nSubLine );
ptStart.y = nLine;
ptStart.x = SubLineHomeToCharPos( nLine, nSubLine );
}
/*ORIGINAL
ptStart = m_ptAnchor;
if (ptStart.y == GetLineCount() - 1)
ptStart.x = GetLineLength(ptStart.y);
else
{
ptStart.y ++;
ptStart.x = 0;
}
*///END SW
//BEGIN SW
ptEnd = m_ptCursorPos;
/*ORIGINAL
ptEnd = m_ptCursorPos;
ptEnd.x = 0;
*///END SW
m_ptCursorPos = ptEnd;
UpdateCaret ();
EnsureVisible (m_ptCursorPos);
SetSelection (ptStart, ptEnd);
SetCapture ();
m_nDragSelTimer = SetTimer (CRYSTAL_TIMER_DRAGSEL, 100, NULL);
ASSERT (m_nDragSelTimer != 0);
m_bWordSelection = FALSE;
m_bLineSelection = TRUE;
m_bDragSelection = TRUE;
}
}
else
{
CPoint ptText = ClientToText (point);
PrepareSelBounds ();
// [JRT]: Support For Disabling Drag and Drop...
if ((IsInsideSelBlock (ptText)) && // If Inside Selection Area
(!m_bDisableDragAndDrop)) // And D&D Not Disabled
{
m_bPreparingToDrag = TRUE;
}
else
{
AdjustTextPoint (point);
m_ptCursorPos = ClientToText (point);
if (!bShift)
m_ptAnchor = m_ptCursorPos;
CPoint ptStart, ptEnd;
if (bControl)
{
if (m_ptCursorPos.y < m_ptAnchor.y ||
m_ptCursorPos.y == m_ptAnchor.y && m_ptCursorPos.x < m_ptAnchor.x)
{
ptStart = WordToLeft (m_ptCursorPos);
ptEnd = WordToRight (m_ptAnchor);
}
else
{
ptStart = WordToLeft (m_ptAnchor);
ptEnd = WordToRight (m_ptCursorPos);
}
}
else
{
ptStart = m_ptAnchor;
ptEnd = m_ptCursorPos;
}
m_ptCursorPos = ptEnd;
UpdateCaret ();
EnsureVisible (m_ptCursorPos);
SetSelection (ptStart, ptEnd);
SetCapture ();
m_nDragSelTimer = SetTimer (CRYSTAL_TIMER_DRAGSEL, 100, NULL);
ASSERT (m_nDragSelTimer != 0);
m_bWordSelection = bControl;
m_bLineSelection = FALSE;
m_bDragSelection = TRUE;
}
}
ASSERT_VALIDTEXTPOS (m_ptCursorPos);
//BEGIN SW
// we must set the ideal character position here!
m_nIdealCharPos = CalculateActualOffset( m_ptCursorPos.y, m_ptCursorPos.x );
//END SW
}
void CCrystalTextView::
OnMouseMove (UINT nFlags, CPoint point)
{
CView::OnMouseMove (nFlags, point);
if (m_bDragSelection)
{
BOOL bOnMargin = point.x < GetMarginWidth ();
AdjustTextPoint (point);
CPoint ptNewCursorPos = ClientToText (point);
CPoint ptStart, ptEnd;
if (m_bLineSelection)
{
if (bOnMargin)
{
if (ptNewCursorPos.y < m_ptAnchor.y ||
ptNewCursorPos.y == m_ptAnchor.y && ptNewCursorPos.x < m_ptAnchor.x)
{
//BEGIN SW
CPoint pos;
ptEnd = m_ptAnchor;
CharPosToPoint( ptEnd.y, ptEnd.x, pos );
if( GetSubLineIndex( ptEnd.y ) + pos.y == GetSubLineCount() - 1 )
ptEnd = SubLineEndToCharPos( ptEnd.y, pos.y );
else
{
int nLine, nSubLine;
GetLineBySubLine( GetSubLineIndex( ptEnd.y ) + pos.y + 1, nLine, nSubLine );
ptEnd.y = nLine;
ptEnd.x = SubLineHomeToCharPos( nLine, nSubLine );
}
CharPosToPoint( ptNewCursorPos.y, ptNewCursorPos.x, pos );
ptNewCursorPos.x = SubLineHomeToCharPos( ptNewCursorPos.y, pos.y );
/*ORIGINAL
ptEnd = m_ptAnchor;
if (ptEnd.y == GetLineCount() - 1)
{
ptEnd.x = GetLineLength(ptEnd.y);
}
else
{
ptEnd.y ++;
ptEnd.x = 0;
}
ptNewCursorPos.x = 0;
*///END SW
m_ptCursorPos = ptNewCursorPos;
}
else
{
ptEnd = m_ptAnchor;
//BEGIN SW
CPoint pos;
CharPosToPoint( ptEnd.y, ptEnd.x, pos );
ptEnd.x = SubLineHomeToCharPos( ptEnd.y, pos.y );
m_ptCursorPos = ptNewCursorPos;
CharPosToPoint( ptNewCursorPos.y, ptNewCursorPos.x, pos );
if( GetSubLineIndex( ptNewCursorPos.y ) + pos.y == GetSubLineCount() - 1 )
ptNewCursorPos.x = SubLineEndToCharPos( ptNewCursorPos.y, pos.y );
else
{
int nLine, nSubLine;
GetLineBySubLine( GetSubLineIndex( ptNewCursorPos.y ) + pos.y + 1, nLine, nSubLine );
ptNewCursorPos.y = nLine;
ptNewCursorPos.x = SubLineHomeToCharPos( nLine, nSubLine );
}
int nLine, nSubLine;
GetLineBySubLine( GetSubLineIndex( m_ptCursorPos.y ) + pos.y, nLine, nSubLine );
m_ptCursorPos.y = nLine;
m_ptCursorPos.x = SubLineHomeToCharPos( nLine, nSubLine );
/*ORIGINAL
ptEnd.x = 0;
m_ptCursorPos = ptNewCursorPos;
if (ptNewCursorPos.y == GetLineCount() - 1)
{
ptNewCursorPos.x = GetLineLength(ptNewCursorPos.y);
}
else
{
ptNewCursorPos.y ++;
ptNewCursorPos.x = 0;
}
m_ptCursorPos.x = 0;
*///END SW
}
UpdateCaret ();
SetSelection (ptNewCursorPos, ptEnd);
return;
}
// Moving to normal selection mode
::SetCursor (::LoadCursor (NULL, MAKEINTRESOURCE (IDC_IBEAM)));
m_bLineSelection = m_bWordSelection = FALSE;
}
if (m_bWordSelection)
{
if (ptNewCursorPos.y < m_ptAnchor.y ||
ptNewCursorPos.y == m_ptAnchor.y && ptNewCursorPos.x < m_ptAnchor.x)
{
ptStart = WordToLeft (ptNewCursorPos);
ptEnd = WordToRight (m_ptAnchor);
}
else
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -