📄 ccrystaleditview.cpp
字号:
}
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'))
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;
}
if (point.x < rcClientRect.left + GetMarginWidth() + DRAG_BORDER_X)
{
HideDropIndicator();
ScrollLeft();
UpdateWindow();
ShowDropIndicator(point);
return;
}
if (point.x >= rcClientRect.right - DRAG_BORDER_X)
{
HideDropIndicator();
ScrollRight();
UpdateWindow();
ShowDropIndicator(point);
return;
}
}
BOOL CCrystalEditView::DoDropText(COleDataObject *pDataObject, const CPoint &ptClient)
{
HGLOBAL hData = pDataObject->GetGlobalData(CF_TEXT);
if (hData == NULL)
return FALSE;
CPoint ptDropPos = ClientToText(ptClient);
if (IsDraggingText() && IsInsideSelection(ptDropPos))
{
SetAnchor(ptDropPos);
SetSelection(ptDropPos, ptDropPos);
SetCursorPos(ptDropPos);
EnsureVisible(ptDropPos);
return FALSE;
}
LPSTR pszText = (LPSTR) ::GlobalLock(hData);
if (pszText == NULL)
return FALSE;
int x, y;
USES_CONVERSION;
m_pTextBuffer->InsertText(this, ptDropPos.y, ptDropPos.x, A2T(pszText), y, x, CE_ACTION_DRAGDROP); // [JRT]
CPoint ptCurPos(x, y);
ASSERT_VALIDTEXTPOS(ptCurPos);
SetAnchor(ptDropPos);
SetSelection(ptDropPos, ptCurPos);
SetCursorPos(ptCurPos);
EnsureVisible(ptCurPos);
::GlobalUnlock(hData);
return TRUE;
}
int CCrystalEditView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CCrystalTextView::OnCreate(lpCreateStruct) == -1)
return -1;
ASSERT(m_pDropTarget == NULL);
m_pDropTarget = new CEditDropTargetImpl(this);
if (! m_pDropTarget->Register(this))
{
TRACE0("Warning: Unable to register drop target for CCrystalEditView.\n");
delete m_pDropTarget;
m_pDropTarget = NULL;
}
return 0;
}
void CCrystalEditView::OnDestroy()
{
if (m_pDropTarget != NULL)
{
m_pDropTarget->Revoke();
delete m_pDropTarget;
m_pDropTarget = NULL;
}
CCrystalTextView::OnDestroy();
}
void CCrystalEditView::ShowDropIndicator(const CPoint &point)
{
if (! m_bDropPosVisible)
{
HideCursor();
m_ptSavedCaretPos = GetCursorPos();
m_bDropPosVisible = TRUE;
::CreateCaret(m_hWnd, (HBITMAP) 1, 2, GetLineHeight());
}
m_ptDropPos = ClientToText(point);
if (m_ptDropPos.x >= m_nOffsetChar)
{
SetCaretPos(TextToClient(m_ptDropPos));
ShowCaret();
}
else
{
HideCaret();
}
}
void CCrystalEditView::HideDropIndicator()
{
if (m_bDropPosVisible)
{
SetCursorPos(m_ptSavedCaretPos);
ShowCursor();
m_bDropPosVisible = FALSE;
}
}
DROPEFFECT CCrystalEditView::GetDropEffect()
{
return DROPEFFECT_COPY | DROPEFFECT_MOVE;
}
void CCrystalEditView::OnDropSource(DROPEFFECT de)
{
if (! IsDraggingText())
return;
ASSERT_VALIDTEXTPOS(m_ptDraggedTextBegin);
ASSERT_VALIDTEXTPOS(m_ptDraggedTextEnd);
if (de == DROPEFFECT_MOVE)
{
m_pTextBuffer->DeleteText(this, m_ptDraggedTextBegin.y, m_ptDraggedTextBegin.x, m_ptDraggedTextEnd.y,
m_ptDraggedTextEnd.x, CE_ACTION_DRAGDROP); // [JRT]
}
}
void CCrystalEditView::UpdateView(CCrystalTextView *pSource, CUpdateContext *pContext, DWORD dwFlags, int nLineIndex /*= -1*/)
{
CCrystalTextView::UpdateView(pSource, pContext, dwFlags, nLineIndex);
if (m_bSelectionPushed && pContext != NULL)
{
pContext->RecalcPoint(m_ptSavedSelStart);
pContext->RecalcPoint(m_ptSavedSelEnd);
ASSERT_VALIDTEXTPOS(m_ptSavedSelStart);
ASSERT_VALIDTEXTPOS(m_ptSavedSelEnd);
}
}
void CCrystalEditView::OnEditReplace()
{
if (! QueryEditable())
return;
CWinApp *pApp = AfxGetApp();
ASSERT(pApp != NULL);
CEditReplaceDlg dlg(this);
// Take search parameters from registry
dlg.m_bMatchCase = pApp->GetProfileInt(REG_REPLACE_SUBKEY, REG_MATCH_CASE, FALSE);
dlg.m_bWholeWord = pApp->GetProfileInt(REG_REPLACE_SUBKEY, REG_WHOLE_WORD, FALSE);
dlg.m_sText = pApp->GetProfileString(REG_REPLACE_SUBKEY, REG_FIND_WHAT, _T(""));
dlg.m_sNewText = pApp->GetProfileString(REG_REPLACE_SUBKEY, REG_REPLACE_WITH, _T(""));
if (IsSelection())
{
GetSelection(m_ptSavedSelStart, m_ptSavedSelEnd);
m_bSelectionPushed = TRUE;
dlg.m_nScope = 0; // Replace in current selection
dlg.m_ptCurrentPos = m_ptSavedSelStart;
dlg.m_bEnableScopeSelection = TRUE;
dlg.m_ptBlockBegin = m_ptSavedSelStart;
dlg.m_ptBlockEnd = m_ptSavedSelEnd;
}
else
{
dlg.m_nScope = 1; // Replace in whole text
dlg.m_ptCurrentPos = GetCursorPos();
dlg.m_bEnableScopeSelection = FALSE;
}
// Execute Replace dialog
m_bShowInactiveSelection = TRUE;
dlg.DoModal();
m_bShowInactiveSelection = FALSE;
// Restore selection
if (m_bSelectionPushed)
{
SetSelection(m_ptSavedSelStart, m_ptSavedSelEnd);
m_bSelectionPushed = FALSE;
}
// Save search parameters to registry
pApp->WriteProfileInt(REG_REPLACE_SUBKEY, REG_MATCH_CASE, dlg.m_bMatchCase);
pApp->WriteProfileInt(REG_REPLACE_SUBKEY, REG_WHOLE_WORD, dlg.m_bWholeWord);
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)
{
ASSERT(pszNewText != NULL);
if (! IsSelection())
return FALSE;
DeleteCurrentSelection();
CPoint ptCursorPos = GetCursorPos();
ASSERT_VALIDTEXTPOS(ptCursorPos);
int x, y;
m_pTextBuffer->InsertText(this, ptCursorPos.y, ptCursorPos.x, pszNewText, y, x, CE_ACTION_REPLACE); // [JRT]
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);
}
}
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)
{
// Insert part of the previos line
TCHAR *pszInsertStr = (TCHAR *) _alloca(sizeof(TCHAR) * (nLength + 1));
_tcsncpy(pszInsertStr, pszLineChars, nPos);
pszInsertStr[nPos] = 0;
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);
}
}
}
}
void CCrystalEditView::SelLast()
{
int nLineCount = GetLineCount();
CPoint point;
point.x = GetLineLength(nLineCount - 1);
point.y = nLineCount - 1;
SetSelection( point, point );
}
// added by 陆晓春
BOOL CCrystalEditView::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
if( zDelta != 0 ) {
// 3 lines
SendMessage( WM_VSCROLL, (zDelta > 0) ? SB_LINEUP : SB_LINEDOWN, NULL );
SendMessage( WM_VSCROLL, (zDelta > 0) ? SB_LINEUP : SB_LINEDOWN, NULL );
SendMessage( WM_VSCROLL, (zDelta > 0) ? SB_LINEUP : SB_LINEDOWN, NULL );
}
return CCrystalTextView::OnMouseWheel(nFlags, zDelta, pt);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -