📄 ccrystaleditview.cpp
字号:
// Restore selection
if (m_bSelectionPushed)
{
SetSelection (m_ptSavedSelStart, m_ptSavedSelEnd);
m_bSelectionPushed = FALSE;
}
// Save search parameters to registry
VERIFY (RegSaveNumber (HKEY_CURRENT_USER, REG_EDITPAD, _T ("ReplaceFlags"), m_dwLastReplaceFlags));
// pApp->WriteProfileString (REG_REPLACE_SUBKEY, REG_FIND_WHAT, dlg.m_sText);
// pApp->WriteProfileString (REG_REPLACE_SUBKEY, REG_REPLACE_WITH, dlg.m_sNewText);
}
BOOL CCrystalEditView::
ReplaceSelection (LPCTSTR pszNewText, DWORD dwFlags)
{
if (!pszNewText)
pszNewText = _T ("");
/*ASSERT (pszNewText != NULL);
if (!IsSelection ())
return FALSE;*/
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_REPLACE);
}
else
ptCursorPos = GetCursorPos ();
ASSERT_VALIDTEXTPOS (ptCursorPos);
int x, y;
if (dwFlags & FIND_REGEXP)
{
LPTSTR lpszNewStr;
if (m_pszMatched && !RxReplace(pszNewText, m_pszMatched, m_nLastFindWhatLen, m_rxmatch, &lpszNewStr, &m_nLastReplaceLen))
{
CString text;
if (lpszNewStr && m_nLastReplaceLen > 0)
{
LPTSTR buf = text.GetBuffer (m_nLastReplaceLen + 1);
_tcsncpy (buf, lpszNewStr, m_nLastReplaceLen + 1);
buf [m_nLastReplaceLen] = _T('\0');
text.ReleaseBuffer ();
}
else
text.Empty ();
m_pTextBuffer->InsertText (this, ptCursorPos.y, ptCursorPos.x, text, y, x, CE_ACTION_REPLACE); // [JRT+FRD]
if (lpszNewStr)
free(lpszNewStr);
}
}
else
{
m_pTextBuffer->InsertText (this, ptCursorPos.y, ptCursorPos.x, pszNewText, y, x, CE_ACTION_REPLACE); // [JRT]
m_nLastReplaceLen = _tcslen (pszNewText);
}
CPoint ptEndOfBlock = CPoint (x, y);
ASSERT_VALIDTEXTPOS (ptCursorPos);
ASSERT_VALIDTEXTPOS (ptEndOfBlock);
SetAnchor (ptEndOfBlock);
SetSelection (ptCursorPos, ptEndOfBlock);
SetCursorPos (ptEndOfBlock);
EnsureVisible (ptEndOfBlock);
return TRUE;
}
void CCrystalEditView::
OnUpdateEditUndo (CCmdUI * pCmdUI)
{
BOOL bCanUndo = m_pTextBuffer != NULL && m_pTextBuffer->CanUndo ();
pCmdUI->Enable (bCanUndo);
// Since we need text only for menus...
if (pCmdUI->m_pMenu != NULL)
{
// Tune up 'resource handle'
HINSTANCE hOldResHandle = AfxGetResourceHandle ();
AfxSetResourceHandle (GetResourceHandle ());
CString menu;
if (bCanUndo)
{
// Format menu item text using the provided item description
CString desc;
m_pTextBuffer->GetUndoDescription (desc);
menu.Format (IDS_MENU_UNDO_FORMAT, desc);
}
else
{
// Just load default menu item text
menu.LoadString (IDS_MENU_UNDO_DEFAULT);
}
// Restore original handle
AfxSetResourceHandle (hOldResHandle);
// Set menu item text
pCmdUI->SetText (menu);
}
}
void CCrystalEditView::
OnEditUndo ()
{
if (m_pTextBuffer != NULL && m_pTextBuffer->CanUndo ())
{
CPoint ptCursorPos;
if (m_pTextBuffer->Undo (ptCursorPos))
{
ASSERT_VALIDTEXTPOS (ptCursorPos);
SetAnchor (ptCursorPos);
SetSelection (ptCursorPos, ptCursorPos);
SetCursorPos (ptCursorPos);
EnsureVisible (ptCursorPos);
}
}
}
// [JRT]
void CCrystalEditView::
SetDisableBSAtSOL (BOOL bDisableBSAtSOL)
{
m_bDisableBSAtSOL = bDisableBSAtSOL;
}
void CCrystalEditView::
OnEditRedo ()
{
if (m_pTextBuffer != NULL && m_pTextBuffer->CanRedo ())
{
CPoint ptCursorPos;
if (m_pTextBuffer->Redo (ptCursorPos))
{
ASSERT_VALIDTEXTPOS (ptCursorPos);
SetAnchor (ptCursorPos);
SetSelection (ptCursorPos, ptCursorPos);
SetCursorPos (ptCursorPos);
EnsureVisible (ptCursorPos);
}
}
}
void CCrystalEditView::
OnUpdateEditRedo (CCmdUI * pCmdUI)
{
BOOL bCanRedo = m_pTextBuffer != NULL && m_pTextBuffer->CanRedo ();
pCmdUI->Enable (bCanRedo);
// Since we need text only for menus...
if (pCmdUI->m_pMenu != NULL)
{
// Tune up 'resource handle'
HINSTANCE hOldResHandle = AfxGetResourceHandle ();
AfxSetResourceHandle (GetResourceHandle ());
CString menu;
if (bCanRedo)
{
// Format menu item text using the provided item description
CString desc;
m_pTextBuffer->GetRedoDescription (desc);
menu.Format (IDS_MENU_REDO_FORMAT, desc);
}
else
{
// Just load default menu item text
menu.LoadString (IDS_MENU_REDO_DEFAULT);
}
// Restore original handle
AfxSetResourceHandle (hOldResHandle);
// Set menu item text
pCmdUI->SetText (menu);
}
}
bool
isopenbrace (TCHAR c)
{
return c == _T ('{') || c == _T ('(') || c == _T ('[') || c == _T ('<');
}
bool
isclosebrace (TCHAR c)
{
return c == _T ('}') || c == _T ('}') || c == _T (']') || c == _T ('>');
}
bool
isopenbrace (LPCTSTR s)
{
return s[1] == _T ('\0') && isopenbrace (*s);
}
bool
isclosebrace (LPCTSTR s)
{
return s[1] == _T ('\0') && isclosebrace (*s);
}
int
bracetype (TCHAR c)
{
static LPCTSTR braces = _T("{}()[]<>");
LPCTSTR pos = _tcschr (braces, c);
return pos ? pos - braces + 1 : 0;
}
int
bracetype (LPCTSTR s)
{
if (s[1])
return 0;
return bracetype (*s);
}
void CCrystalEditView::
OnEditOperation (int nAction, LPCTSTR pszText)
{
if (m_bAutoIndent)
{
// Analyse last action...
if (nAction == CE_ACTION_TYPING && _tcscmp (pszText, _T ("\r\n")) == 0 && !m_bOvrMode)
{
// Enter stroke!
CPoint ptCursorPos = GetCursorPos ();
ASSERT (ptCursorPos.y > 0);
// Take indentation from the previos line
int nLength = m_pTextBuffer->GetLineLength (ptCursorPos.y - 1);
LPCTSTR pszLineChars = m_pTextBuffer->GetLineChars (ptCursorPos.y - 1);
int nPos = 0;
while (nPos < nLength && isspace (pszLineChars[nPos]))
nPos++;
if (nPos > 0)
{
if ((GetFlags () & SRCOPT_BRACEGNU) && isclosebrace (pszLineChars[nLength - 1]) && ptCursorPos.y > 0 && nPos && nPos == nLength - 1)
{
if (pszLineChars[nPos - 1] == _T ('\t'))
{
nPos--;
}
else
{
int nTabSize = GetTabSize (),
nDelta = nTabSize - nPos % nTabSize;
if (!nDelta)
{
nDelta = nTabSize;
}
nPos -= nDelta;
if (nPos < 0)
{
nPos = 0;
}
}
}
// Insert part of the previos line
TCHAR *pszInsertStr;
if ((GetFlags () & (SRCOPT_BRACEGNU|SRCOPT_BRACEANSI)) && isopenbrace (pszLineChars[nLength - 1]))
{
if (m_bInsertTabs)
{
pszInsertStr = (TCHAR *) _alloca (sizeof (TCHAR) * (nPos + 2));
_tcsncpy (pszInsertStr, pszLineChars, nPos);
pszInsertStr[nPos++] = _T ('\t');
}
else
{
int nTabSize = GetTabSize ();
int nChars = nTabSize - nPos % nTabSize;
pszInsertStr = (TCHAR *) _alloca (sizeof (TCHAR) * (nPos + nChars));
_tcsncpy (pszInsertStr, pszLineChars, nPos);
while (nChars--)
{
pszInsertStr[nPos++] = _T (' ');
}
}
}
else
{
pszInsertStr = (TCHAR *) _alloca (sizeof (TCHAR) * (nPos + 1));
_tcsncpy (pszInsertStr, pszLineChars, nPos);
}
pszInsertStr[nPos] = 0;
// m_pTextBuffer->BeginUndoGroup ();
int x, y;
m_pTextBuffer->InsertText (NULL, ptCursorPos.y, ptCursorPos.x,
pszInsertStr, y, x, CE_ACTION_AUTOINDENT);
CPoint pt (x, y);
SetCursorPos (pt);
SetSelection (pt, pt);
SetAnchor (pt);
EnsureVisible (pt);
// m_pTextBuffer->FlushUndoGroup (this);
}
else
{
// Insert part of the previos line
TCHAR *pszInsertStr;
if ((GetFlags () & (SRCOPT_BRACEGNU|SRCOPT_BRACEANSI)) && isopenbrace (pszLineChars[nLength - 1]))
{
if (m_bInsertTabs)
{
pszInsertStr = (TCHAR *) _alloca (sizeof (TCHAR) * 2);
pszInsertStr[nPos++] = _T ('\t');
}
else
{
int nTabSize = GetTabSize ();
int nChars = nTabSize - nPos % nTabSize;
pszInsertStr = (TCHAR *) _alloca (sizeof (TCHAR) * (nChars + 1));
while (nChars--)
{
pszInsertStr[nPos++] = _T (' ');
}
}
pszInsertStr[nPos] = 0;
// m_pTextBuffer->BeginUndoGroup ();
int x, y;
m_pTextBuffer->InsertText (NULL, ptCursorPos.y, ptCursorPos.x,
pszInsertStr, y, x, CE_ACTION_AUTOINDENT);
CPoint pt (x, y);
SetCursorPos (pt);
SetSelection (pt, pt);
SetAnchor (pt);
EnsureVisible (pt);
// m_pTextBuffer->FlushUndoGroup (this);
}
}
}
else if (nAction == CE_ACTION_TYPING && (GetFlags () & SRCOPT_FNBRACE) && bracetype (pszText) == 3)
{
// Enter stroke!
CPoint ptCursorPos = GetCursorPos ();
LPCTSTR pszChars = m_pTextBuffer->GetLineChars (ptCursorPos.y);
if (ptCursorPos.x > 1 && xisalnum (pszChars[ptCursorPos.x - 2]))
{
LPTSTR pszInsertStr = (TCHAR *) _alloca (sizeof (TCHAR) * 2);
*pszInsertStr = _T (' ');
pszInsertStr[1] = _T ('\0');
// m_pTextBuffer->BeginUndoGroup ();
int x, y;
m_pTextBuffer->InsertText (NULL, ptCursorPos.y, ptCursorPos.x - 1,
pszInsertStr, y, x, CE_ACTION_AUTOINDENT);
ptCursorPos.x = x + 1;
ptCursorPos.y = y;
SetCursorPos (ptCursorPos);
SetSelection (ptCursorPos, ptCursorPos);
SetAnchor (ptCursorPos);
EnsureVisible (ptCursorPos);
// m_pTextBuffer->FlushUndoGroup (this);
}
}
else if (nAction == CE_ACTION_TYPING && (GetFlags () & SRCOPT_BRACEGNU) && isopenbrace (pszText))
{
// Enter stroke!
CPoint ptCursorPos = GetCursorPos ();
// Take indentation from the previos line
int nLength = m_pTextBuffer->GetLineLength (ptCursorPos.y);
LPCTSTR pszLineChars = m_pTextBuffer->GetLineChars (ptCursorPos.y );
int nPos = 0;
while (nPos < nLength && isspace (pszLineChars[nPos]))
nPos++;
if (nPos == nLength - 1)
{
TCHAR *pszInsertStr;
if (m_bInsertTabs)
{
pszInsertStr = (TCHAR *) _alloca (sizeof (TCHAR) * 2);
*pszInsertStr = _T ('\t');
nPos = 1;
}
else
{
int nTabSize = GetTabSize ();
int nChars = nTabSize - nPos % nTabSize;
pszInsertStr = (TCHAR *) _alloca (sizeof (TCHAR) * (nChars + 1));
nPos = 0;
while (nChars--)
{
pszInsertStr[nPos++] = _T (' ');
}
}
pszInsertStr[nPos] = 0;
// m_pTextBuffer->BeginUndoGroup ();
int x, y;
m_pTextBuffer->InsertText (NULL, ptCursorPos.y, ptCursorPos.x - 1,
pszInsertStr, y, x, CE_ACTION_AUTOINDENT);
CPoint pt (x + 1, y);
SetCursorPos (pt);
SetSelection (pt, pt);
SetAnchor (pt);
EnsureVisible (pt);
// m_pTextBuffer->FlushUndoGroup (this);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -