📄 ccrystaleditview.cpp
字号:
SetSelection (ptCursorPos, ptCursorPos);
SetAnchor (ptCursorPos);
SetCursorPos (ptCursorPos);
EnsureVisible (ptCursorPos);
return;
}
}
m_pTextBuffer->BeginUndoGroup ();
if (QueryEditable () && m_pTextBuffer != NULL)
{
CPoint ptCursorPos;
if (IsSelection ())
{
CPoint ptSelStart, ptSelEnd;
GetSelection (ptSelStart, ptSelEnd);
ptCursorPos = ptSelStart;
/*SetAnchor (ptCursorPos);
SetSelection (ptCursorPos, ptCursorPos);
SetCursorPos (ptCursorPos);
EnsureVisible (ptCursorPos);*/
// [JRT]:
m_pTextBuffer->DeleteText (this, ptSelStart.y, ptSelStart.x, ptSelEnd.y, ptSelEnd.x, CE_ACTION_TYPING);
}
else
ptCursorPos = GetCursorPos ();
ASSERT_VALIDTEXTPOS (ptCursorPos);
const static TCHAR pszText[3] = _T ("\r\n");
int x, y;
m_pTextBuffer->InsertText (this, ptCursorPos.y, ptCursorPos.x, pszText, y, x, CE_ACTION_TYPING); // [JRT]
ptCursorPos.x = x;
ptCursorPos.y = y;
ASSERT_VALIDTEXTPOS (ptCursorPos);
SetSelection (ptCursorPos, ptCursorPos);
SetAnchor (ptCursorPos);
SetCursorPos (ptCursorPos);
EnsureVisible (ptCursorPos);
}
m_pTextBuffer->FlushUndoGroup (this);
return;
}
if (nChar > 31)
{
if (QueryEditable () && m_pTextBuffer != NULL)
{
m_pTextBuffer->BeginUndoGroup (nChar != _T (' '));
CPoint ptSelStart, ptSelEnd;
GetSelection (ptSelStart, ptSelEnd);
CPoint ptCursorPos;
if (ptSelStart != ptSelEnd)
{
ptCursorPos = ptSelStart;
if (IsSelection ())
{
CPoint ptSelStart, ptSelEnd;
GetSelection (ptSelStart, ptSelEnd);
/*SetAnchor (ptCursorPos);
SetSelection (ptCursorPos, ptCursorPos);
SetCursorPos (ptCursorPos);
EnsureVisible (ptCursorPos);*/
// [JRT]:
m_pTextBuffer->DeleteText (this, ptSelStart.y, ptSelStart.x, ptSelEnd.y, ptSelEnd.x, CE_ACTION_TYPING);
}
}
else
{
ptCursorPos = GetCursorPos ();
if (m_bOvrMode && ptCursorPos.x < GetLineLength (ptCursorPos.y))
m_pTextBuffer->DeleteText (this, ptCursorPos.y, ptCursorPos.x, ptCursorPos.y, ptCursorPos.x + 1, CE_ACTION_TYPING); // [JRT]
}
ASSERT_VALIDTEXTPOS (ptCursorPos);
TCHAR pszText[2];
pszText[0] = (TCHAR) nChar;
pszText[1] = 0;
int x, y;
m_pTextBuffer->InsertText (this, ptCursorPos.y, ptCursorPos.x, pszText, y, x, CE_ACTION_TYPING); // [JRT]
ptCursorPos.x = x;
ptCursorPos.y = y;
ASSERT_VALIDTEXTPOS (ptCursorPos);
SetSelection (ptCursorPos, ptCursorPos);
SetAnchor (ptCursorPos);
SetCursorPos (ptCursorPos);
EnsureVisible (ptCursorPos);
m_pTextBuffer->FlushUndoGroup (this);
}
}
}
//
// [JRT]: Added Support For "Disable Backspace At Start Of Line"
//
void CCrystalEditView::
OnEditDeleteBack ()
{
//BEGIN SW
// if we are in incremental search mode ignore backspace
CCrystalTextView::OnEditDeleteBack();
if( m_bIncrementalSearchForward || m_bIncrementalSearchBackward )
return;
//END SW
if (IsSelection ())
{
OnEditDelete ();
return;
}
if (!QueryEditable () || m_pTextBuffer == NULL)
return;
CPoint ptCursorPos = GetCursorPos ();
CPoint ptCurrentCursorPos = ptCursorPos;
bool bDeleted = false;
if (!(ptCursorPos.x)) // If At Start Of Line
{
if (!m_bDisableBSAtSOL) // If DBSASOL Is Disabled
{
if (ptCursorPos.y > 0) // If Previous Lines Available
{
ptCursorPos.y--; // Decrement To Previous Line
ptCursorPos.x = GetLineLength (
ptCursorPos.y); // Set Cursor To End Of Previous Line
bDeleted = true; // Set Deleted Flag
}
}
}
else // If Caret Not At SOL
{
ptCursorPos.x--; // Decrement Position
bDeleted = true; // Set Deleted Flag
}
/*
if (ptCursorPos.x == 0)
{
if (ptCursorPos.y == 0)
return;
ptCursorPos.y --;
ptCursorPos.x = GetLineLength(ptCursorPos.y);
}
else
ptCursorPos.x --;
*/
ASSERT_VALIDTEXTPOS (ptCursorPos);
SetAnchor (ptCursorPos);
SetSelection (ptCursorPos, ptCursorPos);
SetCursorPos (ptCursorPos);
EnsureVisible (ptCursorPos);
if (bDeleted)
{
m_pTextBuffer->DeleteText (this, ptCursorPos.y, ptCursorPos.x, ptCurrentCursorPos.y, ptCurrentCursorPos.x, CE_ACTION_BACKSPACE); // [JRT]
}
return;
}
void CCrystalEditView::
OnEditTab ()
{
if (!QueryEditable () || m_pTextBuffer == NULL)
return;
BOOL bTabify = FALSE;
CPoint ptSelStart, ptSelEnd;
if (IsSelection ())
{
GetSelection (ptSelStart, ptSelEnd);
bTabify = ptSelStart.y != ptSelEnd.y;
}
CPoint ptCursorPos = GetCursorPos ();
ASSERT_VALIDTEXTPOS (ptCursorPos);
static TCHAR pszText[32];
if (m_bInsertTabs)
{
*pszText = _T ('\t');
pszText[1] = _T ('\0');
}
else
{
int nTabSize = GetTabSize ();
int nChars = nTabSize - ptCursorPos.x % nTabSize;
memset(pszText, _T(' '), nChars);
pszText[nChars] = _T ('\0');
}
if (bTabify)
{
m_pTextBuffer->BeginUndoGroup ();
int nStartLine = ptSelStart.y;
int nEndLine = ptSelEnd.y;
ptSelStart.x = 0;
if (ptSelEnd.x > 0)
{
if (ptSelEnd.y == GetLineCount () - 1)
{
ptSelEnd.x = GetLineLength (ptSelEnd.y);
}
else
{
ptSelEnd.x = 0;
ptSelEnd.y++;
}
}
else
nEndLine--;
SetSelection (ptSelStart, ptSelEnd);
SetCursorPos (ptSelEnd);
EnsureVisible (ptSelEnd);
// Shift selection to right
m_bHorzScrollBarLocked = TRUE;
for (int L = nStartLine; L <= nEndLine; L++)
{
int x, y;
m_pTextBuffer->InsertText (this, L, 0, pszText, y, x, CE_ACTION_INDENT); // [JRT]
}
m_bHorzScrollBarLocked = FALSE;
RecalcHorzScrollBar ();
m_pTextBuffer->FlushUndoGroup (this);
return;
}
if (m_bOvrMode)
{
CPoint ptCursorPos = GetCursorPos ();
ASSERT_VALIDTEXTPOS (ptCursorPos);
int nLineLength = GetLineLength (ptCursorPos.y);
LPCTSTR pszLineChars = GetLineChars (ptCursorPos.y);
if (ptCursorPos.x < nLineLength)
{
int nTabSize = GetTabSize ();
int nChars = nTabSize - CalculateActualOffset (ptCursorPos.y, ptCursorPos.x) % nTabSize;
ASSERT (nChars > 0 && nChars <= nTabSize);
while (nChars > 0)
{
if (ptCursorPos.x == nLineLength)
break;
if (pszLineChars[ptCursorPos.x] == _T ('\t'))
{
ptCursorPos.x++;
break;
}
ptCursorPos.x++;
nChars--;
}
ASSERT (ptCursorPos.x <= nLineLength);
ASSERT_VALIDTEXTPOS (ptCursorPos);
SetSelection (ptCursorPos, ptCursorPos);
SetAnchor (ptCursorPos);
SetCursorPos (ptCursorPos);
EnsureVisible (ptCursorPos);
return;
}
}
m_pTextBuffer->BeginUndoGroup ();
if (IsSelection ())
{
CPoint ptSelStart, ptSelEnd;
GetSelection (ptSelStart, ptSelEnd);
/*SetAnchor (ptCursorPos);
SetSelection (ptCursorPos, ptCursorPos);
SetCursorPos (ptCursorPos);
EnsureVisible (ptCursorPos);*/
// [JRT]:
m_pTextBuffer->DeleteText (this, ptSelStart.y, ptSelStart.x, ptSelEnd.y, ptSelEnd.x, CE_ACTION_TYPING);
}
int x, y;
m_pTextBuffer->InsertText (this, ptCursorPos.y, ptCursorPos.x, pszText, y, x, CE_ACTION_TYPING); // [JRT]
ptCursorPos.x = x;
ptCursorPos.y = y;
ASSERT_VALIDTEXTPOS (ptCursorPos);
SetSelection (ptCursorPos, ptCursorPos);
SetAnchor (ptCursorPos);
SetCursorPos (ptCursorPos);
EnsureVisible (ptCursorPos);
m_pTextBuffer->FlushUndoGroup (this);
}
void CCrystalEditView::
OnEditUntab ()
{
if (!QueryEditable () || m_pTextBuffer == NULL)
return;
BOOL bTabify = FALSE;
CPoint ptSelStart, ptSelEnd;
if (IsSelection ())
{
GetSelection (ptSelStart, ptSelEnd);
bTabify = ptSelStart.y != ptSelEnd.y;
}
if (bTabify)
{
m_pTextBuffer->BeginUndoGroup ();
CPoint ptSelStart, ptSelEnd;
GetSelection (ptSelStart, ptSelEnd);
int nStartLine = ptSelStart.y;
int nEndLine = ptSelEnd.y;
ptSelStart.x = 0;
if (ptSelEnd.x > 0)
{
if (ptSelEnd.y == GetLineCount () - 1)
{
ptSelEnd.x = GetLineLength (ptSelEnd.y);
}
else
{
ptSelEnd.x = 0;
ptSelEnd.y++;
}
}
else
nEndLine--;
SetSelection (ptSelStart, ptSelEnd);
SetCursorPos (ptSelEnd);
EnsureVisible (ptSelEnd);
// Shift selection to left
m_bHorzScrollBarLocked = TRUE;
for (int L = nStartLine; L <= nEndLine; L++)
{
int nLength = GetLineLength (L);
if (nLength > 0)
{
LPCTSTR pszChars = GetLineChars (L);
int nPos = 0, nOffset = 0;
while (nPos < nLength)
{
if (pszChars[nPos] == _T (' '))
{
nPos++;
if (++nOffset >= GetTabSize ())
break;
}
else
{
if (pszChars[nPos] == _T ('\t'))
nPos++;
break;
}
}
if (nPos > 0)
m_pTextBuffer->DeleteText (this, L, 0, L, nPos, CE_ACTION_INDENT); // [JRT]
}
}
m_bHorzScrollBarLocked = FALSE;
RecalcHorzScrollBar ();
m_pTextBuffer->FlushUndoGroup (this);
}
else
{
CPoint ptCursorPos = GetCursorPos ();
ASSERT_VALIDTEXTPOS (ptCursorPos);
if (ptCursorPos.x > 0)
{
int nTabSize = GetTabSize ();
int nOffset = CalculateActualOffset (ptCursorPos.y, ptCursorPos.x);
int nNewOffset = nOffset / nTabSize * nTabSize;
if (nOffset == nNewOffset && nNewOffset > 0)
nNewOffset -= nTabSize;
ASSERT (nNewOffset >= 0);
LPCTSTR pszChars = GetLineChars (ptCursorPos.y);
int nCurrentOffset = 0;
int I = 0;
while (nCurrentOffset < nNewOffset)
{
if (pszChars[I] == _T ('\t'))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -