📄 ccrystaleditview.cpp
字号:
///////////////////////////////////////////////////////////////////////////
// File: CCrystalEditView.cpp
// Version: 1.0.0.0
// Created: 29-Dec-1998
//
// Copyright: Stcherbatchenko Andrei
// E-mail: windfall@gmx.de
//
// Implementation of the CCrystalEditView class, a part of the Crystal Edit -
// syntax coloring text editor.
//
// You are free to use or modify this code to the following restrictions:
// - Acknowledge me somewhere in your about box, simple "Parts of code by.."
// will be enough. If you can't (or don't want to), contact me personally.
// - LEAVE THIS HEADER INTACT
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
// 21-Feb-99
// Paul Selormey, James R. Twine:
// + FEATURE: description for Undo/Redo actions
// + FEATURE: multiple MSVC-like bookmarks
// + FEATURE: 'Disable backspace at beginning of line' option
// + FEATURE: 'Disable drag-n-drop editing' option
//
// + FEATURE: Auto indent
// + FIX: ResetView() was overriden to provide cleanup
////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "editcmd.h"
#include "editreg.h"
#include "CCrystalEditView.h"
#include "CCrystalTextBuffer.h"
#include "CEditReplaceDlg.h"
#ifndef __AFXPRIV_H__
#pragma message("Include <afxpriv.h> in your stdafx.h to avoid this message")
#include <afxpriv.h>
#endif
#ifndef __AFXOLE_H__
#pragma message("Include <afxole.h> in your stdafx.h to avoid this message")
#include <afxole.h>
#endif
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define DRAG_BORDER_X 5
#define DRAG_BORDER_Y 5
/////////////////////////////////////////////////////////////////////////////
// CEditDropTargetImpl class declaration
class CEditDropTargetImpl : public COleDropTarget
{
private:
CCrystalEditView *m_pOwner;
public:
CEditDropTargetImpl(CCrystalEditView *pOwner) { m_pOwner = pOwner; };
virtual DROPEFFECT OnDragEnter(CWnd* pWnd, COleDataObject* pDataObject, DWORD dwKeyState, CPoint point);
virtual void OnDragLeave(CWnd* pWnd);
virtual DROPEFFECT OnDragOver(CWnd* pWnd, COleDataObject* pDataObject, DWORD dwKeyState, CPoint point);
virtual BOOL OnDrop(CWnd* pWnd, COleDataObject* pDataObject, DROPEFFECT dropEffect, CPoint point);
virtual DROPEFFECT OnDragScroll(CWnd* pWnd, DWORD dwKeyState, CPoint point);
};
/////////////////////////////////////////////////////////////////////////////
// CCrystalEditView
IMPLEMENT_DYNCREATE(CCrystalEditView, CCrystalTextView)
CCrystalEditView::CCrystalEditView()
{
AFX_ZERO_INIT_OBJECT(CCrystalTextView);
m_bAutoIndent = TRUE;
}
CCrystalEditView::~CCrystalEditView()
{
}
BEGIN_MESSAGE_MAP(CCrystalEditView, CCrystalTextView)
//{{AFX_MSG_MAP(CCrystalEditView)
ON_COMMAND(ID_EDIT_PASTE, OnEditPaste)
ON_UPDATE_COMMAND_UI(ID_EDIT_CUT, OnUpdateEditCut)
ON_COMMAND(ID_EDIT_CUT, OnEditCut)
ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE, OnUpdateEditPaste)
ON_COMMAND(ID_EDIT_DELETE, OnEditDelete)
ON_WM_CHAR()
ON_COMMAND(ID_EDIT_DELETE_BACK, OnEditDeleteBack)
ON_COMMAND(ID_EDIT_UNTAB, OnEditUntab)
ON_COMMAND(ID_EDIT_TAB, OnEditTab)
ON_COMMAND(ID_EDIT_SWITCH_OVRMODE, OnEditSwitchOvrmode)
ON_UPDATE_COMMAND_UI(ID_EDIT_SWITCH_OVRMODE, OnUpdateEditSwitchOvrmode)
ON_WM_CREATE()
ON_WM_DESTROY()
ON_COMMAND(ID_EDIT_REPLACE, OnEditReplace)
ON_UPDATE_COMMAND_UI(ID_EDIT_UNDO, OnUpdateEditUndo)
ON_COMMAND(ID_EDIT_UNDO, OnEditUndo)
ON_UPDATE_COMMAND_UI(ID_EDIT_REDO, OnUpdateEditRedo)
ON_COMMAND(ID_EDIT_REDO, OnEditRedo)
//}}AFX_MSG_MAP
ON_UPDATE_COMMAND_UI(ID_EDIT_INDICATOR_READ, OnUpdateIndicatorRead)
ON_UPDATE_COMMAND_UI(ID_INDICATOR_OVR, OnUpdateIndicatorOvr)
ON_UPDATE_COMMAND_UI(ID_EDIT_INDICATOR_COL, OnUpdateIndicatorCol)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCrystalEditView message handlers
void CCrystalEditView::ResetView()
{
m_bAutoIndent = TRUE;
m_bOvrMode = FALSE;
CCrystalTextView::ResetView();
}
BOOL CCrystalEditView::QueryEditable()
{
if (m_pTextBuffer == NULL)
return FALSE;
return ! m_pTextBuffer->GetReadOnly();
}
void CCrystalEditView::OnEditPaste()
{
Paste();
}
void CCrystalEditView::OnUpdateEditPaste(CCmdUI* pCmdUI)
{
pCmdUI->Enable(TextInClipboard());
}
void CCrystalEditView::OnUpdateEditCut(CCmdUI* pCmdUI)
{
pCmdUI->Enable(IsSelection());
}
void CCrystalEditView::OnEditCut()
{
Cut();
}
BOOL CCrystalEditView::DeleteCurrentSelection()
{
if (IsSelection())
{
CPoint ptSelStart, ptSelEnd;
GetSelection(ptSelStart, ptSelEnd);
CPoint ptCursorPos = ptSelStart;
ASSERT_VALIDTEXTPOS(ptCursorPos);
SetAnchor(ptCursorPos);
SetSelection(ptCursorPos, ptCursorPos);
SetCursorPos(ptCursorPos);
EnsureVisible(ptCursorPos);
// [JRT]:
m_pTextBuffer->DeleteText(this, ptSelStart.y, ptSelStart.x, ptSelEnd.y, ptSelEnd.x, CE_ACTION_DELSEL);
return TRUE;
}
return FALSE;
}
void CCrystalEditView::Paste()
{
if (! QueryEditable())
return;
if (m_pTextBuffer == NULL)
return;
m_pTextBuffer->BeginUndoGroup();
DeleteCurrentSelection();
CString text;
if (GetFromClipboard(text))
{
CPoint ptCursorPos = GetCursorPos();
ASSERT_VALIDTEXTPOS(ptCursorPos);
int x, y;
m_pTextBuffer->InsertText(this, ptCursorPos.y, ptCursorPos.x, text, y, x, CE_ACTION_PASTE); // [JRT]
ptCursorPos.x = x;
ptCursorPos.y = y;
ASSERT_VALIDTEXTPOS(ptCursorPos);
SetAnchor(ptCursorPos);
SetSelection(ptCursorPos, ptCursorPos);
SetCursorPos(ptCursorPos);
EnsureVisible(ptCursorPos);
}
m_pTextBuffer->FlushUndoGroup(this);
}
void CCrystalEditView::Cut()
{
if (! QueryEditable())
return;
if (m_pTextBuffer == NULL)
return;
if (! IsSelection())
return;
CPoint ptSelStart, ptSelEnd;
GetSelection(ptSelStart, ptSelEnd);
CString text;
GetText(ptSelStart, ptSelEnd, text);
PutToClipboard(text);
CPoint ptCursorPos = ptSelStart;
ASSERT_VALIDTEXTPOS(ptCursorPos);
SetAnchor(ptCursorPos);
SetSelection(ptCursorPos, ptCursorPos);
SetCursorPos(ptCursorPos);
EnsureVisible(ptCursorPos);
m_pTextBuffer->DeleteText(this, ptSelStart.y, ptSelStart.x, ptSelEnd.y, ptSelEnd.x, CE_ACTION_CUT); // [JRT]
}
void CCrystalEditView::OnEditDelete()
{
if (! QueryEditable() || m_pTextBuffer == NULL)
return;
CPoint ptSelStart, ptSelEnd;
GetSelection(ptSelStart, ptSelEnd);
if (ptSelStart == ptSelEnd)
{
if (ptSelEnd.x == GetLineLength(ptSelEnd.y))
{
if (ptSelEnd.y == GetLineCount() - 1)
return;
ptSelEnd.y ++;
ptSelEnd.x = 0;
}
else
ptSelEnd.x ++;
}
CPoint ptCursorPos = ptSelStart;
ASSERT_VALIDTEXTPOS(ptCursorPos);
SetAnchor(ptCursorPos);
SetSelection(ptCursorPos, ptCursorPos);
SetCursorPos(ptCursorPos);
EnsureVisible(ptCursorPos);
m_pTextBuffer->DeleteText(this, ptSelStart.y, ptSelStart.x, ptSelEnd.y, ptSelEnd.x, CE_ACTION_DELETE); // [JRT]
}
void CCrystalEditView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
CCrystalTextView::OnChar(nChar, nRepCnt, nFlags);
if ((::GetAsyncKeyState(VK_LBUTTON) & 0x8000) != 0 ||
(::GetAsyncKeyState(VK_RBUTTON) & 0x8000) != 0)
return;
BOOL bTranslated = FALSE;
if (nChar == VK_RETURN)
{
if (m_bOvrMode)
{
CPoint ptCursorPos = GetCursorPos();
ASSERT_VALIDTEXTPOS(ptCursorPos);
if (ptCursorPos.y < GetLineCount() - 1)
{
ptCursorPos.x = 0;
ptCursorPos.y++;
ASSERT_VALIDTEXTPOS(ptCursorPos);
SetSelection(ptCursorPos, ptCursorPos);
SetAnchor(ptCursorPos);
SetCursorPos(ptCursorPos);
EnsureVisible(ptCursorPos);
return;
}
}
m_pTextBuffer->BeginUndoGroup();
if (QueryEditable() && m_pTextBuffer != NULL)
{
DeleteCurrentSelection();
CPoint 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;
DeleteCurrentSelection();
}
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);
char pszText[2];
pszText[0] = (char) nChar;
pszText[1] = 0;
int x, y;
USES_CONVERSION;
m_pTextBuffer->InsertText(this, ptCursorPos.y, ptCursorPos.x, A2T(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()
{
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);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -