📄 ccrystaleditview.cpp
字号:
///////////////////////////////////////////////////////////////////////////
// File: ccrystaleditview.cpp
// Version: 1.2.0.5
// 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
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
// 19-Jul-99
// Ferdinand Prantl:
// + FEATURE: support for autoindenting brackets and parentheses
// + FEATURE: menu options, view and window
// + FEATURE: SDI+MDI versions with help
// + FEATURE: extended registry support for saving settings
// + FEATURE: some other things I've forgotten ...
// 27-Jul-99
// + FIX: treating groups in regular expressions corrected
// + FIX: autocomplete corrected
//
// ... it's being edited very rapidly so sorry for non-commented
// and maybe "ugly" code ...
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
// ??-Aug-99
// Sven Wiegand (search for "//BEGIN SW" to find my changes):
// + FEATURE: "Go to last change" (sets the cursor on the position where
// the user did his last edit actions
// + FEATURE: Support for incremental search in CCrystalTextView
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
// 24-Oct-99
// Sven Wiegand
// + FEATURE: Supporting [Return] to exit incremental-search-mode
// (see OnChar())
////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "editcmd.h"
#include "editreg.h"
#include "ccrystaleditview.h"
#include "ccrystaltextbuffer.h"
#include "ceditreplacedlg.h"
#include "registry.h"
#include "cs2cs.h"
#include "chcondlg.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);
};
#pragma warning ( disable : 4100 )
/////////////////////////////////////////////////////////////////////////////
// CCrystalEditView
IMPLEMENT_DYNCREATE (CCrystalEditView, CCrystalTextView)
CCrystalEditView::CCrystalEditView ()
{
AFX_ZERO_INIT_OBJECT (CCrystalTextView);
m_bInsertTabs = TRUE;
m_bAutoIndent = TRUE;
m_mapExpand = new CMap<CString, LPCTSTR, CString, LPCTSTR> (10);
}
CCrystalEditView:: ~ CCrystalEditView ()
{
delete m_mapExpand;
}
bool CCrystalEditView::
DoSetTextType (TextDefinition *def)
{
m_CurSourceDef = def;
SetInsertTabs ((def->flags & SRCOPT_INSERTTABS) != FALSE);
SetAutoIndent ((def->flags & SRCOPT_AUTOINDENT) != FALSE);
SetDisableBSAtSOL ((def->flags & SRCOPT_BSATBOL) == FALSE);
m_mapExpand->RemoveAll ();
CReg reg;
CString sKey = REG_EDITPAD _T("\\");
sKey += def->name;
sKey += _T ("\\Expand");
if (reg.Open (HKEY_CURRENT_USER, sKey, KEY_READ))
{
LPCTSTR pszValue;
RegVal regVal;
if (reg.FindFirstValue (pszValue, ®Val))
{
CString sData;
do
if (RegValGetString (®Val, sData))
m_mapExpand->SetAt (pszValue, sData);
while (reg.FindNextValue (pszValue, ®Val));
}
reg.FindClose ();
}
return CCrystalTextView::DoSetTextType (def);
}
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)
ON_UPDATE_COMMAND_UI (ID_EDIT_AUTOCOMPLETE, OnUpdateEditAutoComplete)
ON_COMMAND (ID_EDIT_AUTOCOMPLETE, OnEditAutoComplete)
ON_UPDATE_COMMAND_UI (ID_EDIT_AUTOEXPAND, OnUpdateEditAutoExpand)
ON_COMMAND (ID_EDIT_AUTOEXPAND, OnEditAutoExpand)
ON_UPDATE_COMMAND_UI (ID_EDIT_LOWERCASE, OnUpdateEditLowerCase)
ON_COMMAND (ID_EDIT_LOWERCASE, OnEditLowerCase)
ON_UPDATE_COMMAND_UI (ID_EDIT_UPPERCASE, OnUpdateEditUpperCase)
ON_COMMAND (ID_EDIT_UPPERCASE, OnEditUpperCase)
ON_UPDATE_COMMAND_UI (ID_EDIT_SWAPCASE, OnUpdateEditSwapCase)
ON_COMMAND (ID_EDIT_SWAPCASE, OnEditSwapCase)
ON_UPDATE_COMMAND_UI (ID_EDIT_SWAPCASE, OnUpdateEditSwapCase)
ON_COMMAND (ID_EDIT_SWAPCASE, OnEditSwapCase)
ON_UPDATE_COMMAND_UI (ID_EDIT_CAPITALIZE, OnUpdateEditCapitalize)
ON_COMMAND (ID_EDIT_CAPITALIZE, OnEditCapitalize)
ON_UPDATE_COMMAND_UI (ID_EDIT_SENTENCE, OnUpdateEditSentence)
ON_COMMAND (ID_EDIT_SENTENCE, OnEditSentence)
ON_UPDATE_COMMAND_UI(ID_EDIT_GOTO_LAST_CHANGE, OnUpdateEditGotoLastChange)
ON_COMMAND(ID_EDIT_GOTO_LAST_CHANGE, OnEditGotoLastChange)
ON_COMMAND(ID_EDIT_DELETE_WORD, OnEditDeleteWord)
ON_COMMAND(ID_EDIT_DELETE_WORD_BACK, OnEditDeleteWordBack)
//}}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_POSITION, OnUpdateIndicatorPosition)
ON_UPDATE_COMMAND_UI (ID_TOOLS_SPELLING, OnUpdateToolsSpelling)
ON_COMMAND (ID_TOOLS_SPELLING, OnToolsSpelling)
ON_UPDATE_COMMAND_UI (ID_TOOLS_CHARCODING, OnUpdateToolsCharCoding)
ON_COMMAND (ID_TOOLS_CHARCODING, OnToolsCharCoding)
END_MESSAGE_MAP ()
/////////////////////////////////////////////////////////////////////////////
// CCrystalEditView message handlers
void CCrystalEditView::ResetView ()
{
// m_bAutoIndent = TRUE;
m_bOvrMode = FALSE;
m_bLastReplace = 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;
CString text;
if (GetFromClipboard (text))
{
m_pTextBuffer->BeginUndoGroup ();
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_PASTE);
}
else
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)
{
//BEGIN SW
// check if incremental search is active before call to CCrystalTextView::OnChar()
BOOL bIncrementalSearch = m_bIncrementalSearchForward || m_bIncrementalSearchBackward;
//END Sw
CCrystalTextView::OnChar (nChar, nRepCnt, nFlags);
//BEGIN SW
// if we are in incremental search mode ignore the character
if( m_bIncrementalSearchForward || m_bIncrementalSearchBackward )
return;
//END SW
// if we *were* in incremental search mode and CCrystalTextView::OnChar()
// exited it the ignore the character (VK_RETURN)
if( bIncrementalSearch && !m_bIncrementalSearchForward && !m_bIncrementalSearchBackward )
return;
//END SW
if ((::GetAsyncKeyState (VK_LBUTTON) & 0x8000) != 0 ||
(::GetAsyncKeyState (VK_RBUTTON) & 0x8000) != 0)
return;
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);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -