📄 ccrystaleditview.cpp
字号:
if (ptCursorPos.x == 0) // If At Start Of Line
{
ASSERT(ptCursorPos.y > 0);
ptCursorPos.y = FindVisibleLine(ptCursorPos.y, -1); // Decrement To Previous Line
ptCursorPos.x = GetLineLength(ptCursorPos.y); // Set Cursor To End Of Previous Line
ExpandLine(ptCursorPos.y);
}
else // If Caret Not At SOL
{
ptCursorPos.x--; // Decrement Position
}
/*
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);
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;
}
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;
static const TCHAR pszText[] = _T("\t");
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;
}
ExpandCurrentLine(); // MiK: expand line before editing it
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();
DeleteCurrentSelection();
CPoint ptCursorPos = GetCursorPos();
ASSERT_VALIDTEXTPOS(ptCursorPos);
static const TCHAR pszText[] = _T("\t");
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
{
ExpandCurrentLine(); // MiK: expand line before editing it
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'))
nCurrentOffset = nCurrentOffset / nTabSize * nTabSize + nTabSize;
else
nCurrentOffset ++;
I ++;
}
ASSERT(nCurrentOffset == nNewOffset);
ptCursorPos.x = I;
ASSERT_VALIDTEXTPOS(ptCursorPos);
SetSelection(ptCursorPos, ptCursorPos);
SetAnchor(ptCursorPos);
SetCursorPos(ptCursorPos);
EnsureVisible(ptCursorPos);
}
}
}
void CCrystalEditView::OnUpdateIndicatorCol(CCmdUI* pCmdUI)
{
pCmdUI->Enable(FALSE);
}
void CCrystalEditView::OnUpdateIndicatorOvr(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_bOvrMode);
}
void CCrystalEditView::OnUpdateIndicatorRead(CCmdUI* pCmdUI)
{
if (m_pTextBuffer == NULL)
pCmdUI->Enable(FALSE);
else
pCmdUI->Enable(m_pTextBuffer->GetReadOnly());
}
void CCrystalEditView::OnEditSwitchOvrmode()
{
m_bOvrMode = ! m_bOvrMode;
}
void CCrystalEditView::OnUpdateEditSwitchOvrmode(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_bOvrMode ? 1 : 0);
}
DROPEFFECT CEditDropTargetImpl::OnDragEnter(CWnd* pWnd, COleDataObject* pDataObject, DWORD dwKeyState, CPoint point)
{
if (! pDataObject->IsDataAvailable(CF_TEXT))
{
m_pOwner->HideDropIndicator();
return DROPEFFECT_NONE;
}
m_pOwner->ShowDropIndicator(point);
if (dwKeyState & MK_CONTROL)
return DROPEFFECT_COPY;
return DROPEFFECT_MOVE;
}
void CEditDropTargetImpl::OnDragLeave(CWnd* pWnd)
{
m_pOwner->HideDropIndicator();
}
DROPEFFECT CEditDropTargetImpl::OnDragOver(CWnd* pWnd, COleDataObject* pDataObject, DWORD dwKeyState, CPoint point)
{
/*
if (! pDataObject->IsDataAvailable(CF_TEXT))
{
m_pOwner->HideDropIndicator();
return DROPEFFECT_NONE;
}
*/
//
// [JRT]
//
bool bDataSupported = false;
if ((!m_pOwner) || // If No Owner
(!( m_pOwner->QueryEditable())) || // Or Not Editable
(m_pOwner->GetDisableDragAndDrop())) // Or Drag And Drop Disabled
{
m_pOwner -> HideDropIndicator(); // Hide Drop Caret
return DROPEFFECT_NONE; // Return DE_NONE
}
// if ((pDataObject->IsDataAvailable( CF_TEXT ) ) || // If Text Available
// ( pDataObject -> IsDataAvailable( xxx ) ) || // Or xxx Available
// ( pDataObject -> IsDataAvailable( yyy ) ) ) // Or yyy Available
if (pDataObject->IsDataAvailable(CF_TEXT)) // If Text Available
{
bDataSupported = true; // Set Flag
}
if (!bDataSupported) // If No Supported Formats Available
{
m_pOwner->HideDropIndicator(); // Hide Drop Caret
return DROPEFFECT_NONE; // Return DE_NONE
}
m_pOwner->ShowDropIndicator(point);
if (dwKeyState & MK_CONTROL)
return DROPEFFECT_COPY;
return DROPEFFECT_MOVE;
}
BOOL CEditDropTargetImpl::OnDrop(CWnd* pWnd, COleDataObject* pDataObject, DROPEFFECT dropEffect, CPoint point)
{
//
// [JRT] ( m_pOwner -> GetDisableDragAndDrop() ) ) // Or Drag And Drop Disabled
//
bool bDataSupported = false;
m_pOwner->HideDropIndicator(); // Hide Drop Caret
if ((!m_pOwner) || // If No Owner
(!( m_pOwner->QueryEditable())) || // Or Not Editable
(m_pOwner->GetDisableDragAndDrop())) // Or Drag And Drop Disabled
{
return DROPEFFECT_NONE; // Return DE_NONE
}
// if( ( pDataObject -> IsDataAvailable( CF_TEXT ) ) || // If Text Available
// ( pDataObject -> IsDataAvailable( xxx ) ) || // Or xxx Available
// ( pDataObject -> IsDataAvailable( yyy ) ) ) // Or yyy Available
if (pDataObject->IsDataAvailable(CF_TEXT)) // If Text Available
{
bDataSupported = true; // Set Flag
}
if (!bDataSupported) // If No Supported Formats Available
{
return DROPEFFECT_NONE; // Return DE_NONE
}
return (m_pOwner->DoDropText(pDataObject, point)); // Return Result Of Drop
}
DROPEFFECT CEditDropTargetImpl::OnDragScroll(CWnd* pWnd, DWORD dwKeyState, CPoint point)
{
ASSERT(m_pOwner == pWnd);
m_pOwner->DoDragScroll(point);
if (dwKeyState & MK_CONTROL)
return DROPEFFECT_COPY;
return DROPEFFECT_MOVE;
}
void CCrystalEditView::DoDragScroll(const CPoint &point)
{
CRect rcClientRect;
GetClientRect(rcClientRect);
if (point.y < rcClientRect.top + DRAG_BORDER_Y)
{
HideDropIndicator();
ScrollUp();
UpdateWindow();
ShowDropIndicator(point);
return;
}
if (point.y >= rcClientRect.bottom - DRAG_BORDER_Y)
{
HideDropIndicator();
ScrollDown();
UpdateWindow();
ShowDropIndicator(point);
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -