📄 ccrystaltextview2.cpp
字号:
////////////////////////////////////////////////////////////////////////////
// File: ccrystaltextview2.cpp
// Version: 1.0.0.0
// Created: 29-Dec-1998
//
// Author: Stcherbatchenko Andrei
// E-mail: windfall@gmx.de
//
// Implementation of the CCrystalTextView class, a part of 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
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
// 19-Jul-99
// Ferdinand Prantl:
// + FEATURE: regular expressions, go to line and things ...
// + FEATURE: plenty of syntax highlighting definitions
// + FEATURE: corrected bug in syntax highlighting C comments
// + FEATURE: extended registry support for saving settings
// + FEATURE: some other things I've forgotten ...
//
// ... it's being edited very rapidly so sorry for non-commented
// and maybe "ugly" code ...
////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "editcmd.h"
#include "ccrystaltextview.h"
#include "ccrystaltextbuffer.h"
#include <malloc.h>
#ifndef __AFXPRIV_H__
#pragma message("Include <afxpriv.h> in your stdafx.h to avoid this message")
#include <afxpriv.h>
#endif
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define CRYSTAL_TIMER_DRAGSEL 1001
/////////////////////////////////////////////////////////////////////////////
// CCrystalTextView
void CCrystalTextView::
MoveLeft (BOOL bSelect)
{
PrepareSelBounds ();
if (m_ptDrawSelStart != m_ptDrawSelEnd && !bSelect)
{
m_ptCursorPos = m_ptDrawSelStart;
}
else
{
if (m_ptCursorPos.x == 0)
{
if (m_ptCursorPos.y > 0)
{
m_ptCursorPos.y--;
m_ptCursorPos.x = GetLineLength (m_ptCursorPos.y);
}
}
else
{
m_ptCursorPos.x--;
if (m_pTextBuffer->IsMBSTrail (m_ptCursorPos.y, m_ptCursorPos.x) &&
// here... if its a MBSTrail, then should move one character more....
m_ptCursorPos.x > 0)
m_ptCursorPos.x--;
}
}
m_nIdealCharPos = CalculateActualOffset (m_ptCursorPos.y, m_ptCursorPos.x);
EnsureVisible (m_ptCursorPos);
UpdateCaret ();
if (!bSelect)
m_ptAnchor = m_ptCursorPos;
SetSelection (m_ptAnchor, m_ptCursorPos);
}
void CCrystalTextView::
MoveRight (BOOL bSelect)
{
PrepareSelBounds ();
if (m_ptDrawSelStart != m_ptDrawSelEnd && !bSelect)
{
m_ptCursorPos = m_ptDrawSelEnd;
}
else
{
if (m_ptCursorPos.x == GetLineLength (m_ptCursorPos.y))
{
if (m_ptCursorPos.y < GetLineCount () - 1)
{
m_ptCursorPos.y++;
m_ptCursorPos.x = 0;
}
}
else
{
m_ptCursorPos.x++;
if (m_pTextBuffer->IsMBSTrail (m_ptCursorPos.y, m_ptCursorPos.x) &&
// here... if its a MBSTrail, then should move one character more....
m_ptCursorPos.x < GetLineLength (m_ptCursorPos.y))
m_ptCursorPos.x++;
}
}
m_nIdealCharPos = CalculateActualOffset (m_ptCursorPos.y, m_ptCursorPos.x);
EnsureVisible (m_ptCursorPos);
UpdateCaret ();
if (!bSelect)
m_ptAnchor = m_ptCursorPos;
SetSelection (m_ptAnchor, m_ptCursorPos);
}
void CCrystalTextView::
MoveWordLeft (BOOL bSelect)
{
PrepareSelBounds ();
if (m_ptDrawSelStart != m_ptDrawSelEnd && !bSelect)
{
MoveLeft (bSelect);
return;
}
if (m_ptCursorPos.x == 0)
{
if (m_ptCursorPos.y == 0)
return;
m_ptCursorPos.y--;
m_ptCursorPos.x = GetLineLength (m_ptCursorPos.y);
}
LPCTSTR pszChars = GetLineChars (m_ptCursorPos.y);
int nPos = m_ptCursorPos.x;
while (nPos > 0 && isspace (pszChars[nPos - 1]))
nPos--;
if (nPos > 0)
{
nPos--;
if (xisalnum (pszChars[nPos]))
{
while (nPos > 0 && xisalnum (pszChars[nPos - 1]))
nPos--;
}
else
{
while (nPos > 0 && !xisalnum (pszChars[nPos - 1])
&& !isspace (pszChars[nPos - 1]))
nPos--;
}
}
m_ptCursorPos.x = nPos;
m_nIdealCharPos = CalculateActualOffset (m_ptCursorPos.y, m_ptCursorPos.x);
EnsureVisible (m_ptCursorPos);
UpdateCaret ();
if (!bSelect)
m_ptAnchor = m_ptCursorPos;
SetSelection (m_ptAnchor, m_ptCursorPos);
}
void CCrystalTextView::
MoveWordRight (BOOL bSelect)
{
PrepareSelBounds ();
if (m_ptDrawSelStart != m_ptDrawSelEnd && !bSelect)
{
MoveRight (bSelect);
return;
}
if (m_ptCursorPos.x == GetLineLength (m_ptCursorPos.y))
{
if (m_ptCursorPos.y == GetLineCount () - 1)
return;
m_ptCursorPos.y++;
m_ptCursorPos.x = 0;
}
int nLength = GetLineLength (m_ptCursorPos.y);
if (m_ptCursorPos.x == nLength)
{
MoveRight (bSelect);
return;
}
LPCTSTR pszChars = GetLineChars (m_ptCursorPos.y);
int nPos = m_ptCursorPos.x;
if (xisalnum (pszChars[nPos]))
{
while (nPos < nLength && xisalnum (pszChars[nPos]))
nPos++;
}
else
{
while (nPos < nLength && !xisalnum (pszChars[nPos])
&& !isspace (pszChars[nPos]))
nPos++;
}
while (nPos < nLength && isspace (pszChars[nPos]))
nPos++;
m_ptCursorPos.x = nPos;
m_nIdealCharPos = CalculateActualOffset (m_ptCursorPos.y, m_ptCursorPos.x);
EnsureVisible (m_ptCursorPos);
UpdateCaret ();
if (!bSelect)
m_ptAnchor = m_ptCursorPos;
SetSelection (m_ptAnchor, m_ptCursorPos);
}
void CCrystalTextView::
MoveUp (BOOL bSelect)
{
PrepareSelBounds ();
if (m_ptDrawSelStart != m_ptDrawSelEnd && !bSelect)
m_ptCursorPos = m_ptDrawSelStart;
//BEGIN SW
CPoint subLinePos;
CharPosToPoint( m_ptCursorPos.y, m_ptCursorPos.x, subLinePos );
int nSubLine = GetSubLineIndex( m_ptCursorPos.y ) + subLinePos.y;
if( nSubLine > 0 )
/*ORIGINAL
if (m_ptCursorPos.y > 0)
*///END SW
{
if (m_nIdealCharPos == -1)
m_nIdealCharPos = CalculateActualOffset (m_ptCursorPos.y, m_ptCursorPos.x);
//BEGIN SW
SubLineCursorPosToTextPos( CPoint( m_nIdealCharPos, nSubLine - 1 ), m_ptCursorPos );
/*ORIGINAL
m_ptCursorPos.y --;
m_ptCursorPos.x = ApproxActualOffset(m_ptCursorPos.y, m_nIdealCharPos);
*///END SW
if (m_ptCursorPos.x > GetLineLength (m_ptCursorPos.y))
m_ptCursorPos.x = GetLineLength (m_ptCursorPos.y);
}
EnsureVisible (m_ptCursorPos);
UpdateCaret ();
if (!bSelect)
m_ptAnchor = m_ptCursorPos;
SetSelection (m_ptAnchor, m_ptCursorPos);
}
void CCrystalTextView::
MoveDown (BOOL bSelect)
{
PrepareSelBounds ();
if (m_ptDrawSelStart != m_ptDrawSelEnd && !bSelect)
m_ptCursorPos = m_ptDrawSelEnd;
//BEGIN SW
CPoint subLinePos;
CharPosToPoint( m_ptCursorPos.y, m_ptCursorPos.x, subLinePos );
int nSubLine = GetSubLineIndex( m_ptCursorPos.y ) + subLinePos.y;
if( nSubLine < GetSubLineCount() - 1 )
/*ORIGINAL
if (m_ptCursorPos.y < GetLineCount() - 1)
*/
{
if (m_nIdealCharPos == -1)
m_nIdealCharPos = CalculateActualOffset (m_ptCursorPos.y, m_ptCursorPos.x);
//BEGIN SW
SubLineCursorPosToTextPos( CPoint( m_nIdealCharPos, nSubLine + 1 ), m_ptCursorPos );
/*ORIGINAL
m_ptCursorPos.y ++;
m_ptCursorPos.x = ApproxActualOffset(m_ptCursorPos.y, m_nIdealCharPos);
*///END SW
if (m_ptCursorPos.x > GetLineLength (m_ptCursorPos.y))
m_ptCursorPos.x = GetLineLength (m_ptCursorPos.y);
}
EnsureVisible (m_ptCursorPos);
UpdateCaret ();
if (!bSelect)
m_ptAnchor = m_ptCursorPos;
SetSelection (m_ptAnchor, m_ptCursorPos);
}
void CCrystalTextView::
MoveHome (BOOL bSelect)
{
int nLength = GetLineLength (m_ptCursorPos.y);
LPCTSTR pszChars = GetLineChars (m_ptCursorPos.y);
//BEGIN SW
CPoint pos;
CharPosToPoint( m_ptCursorPos.y, m_ptCursorPos.x, pos );
int nHomePos = SubLineHomeToCharPos( m_ptCursorPos.y, pos.y );
int nOriginalHomePos = nHomePos;
/*ORIGINAL
int nHomePos = 0;
*///END SW
while (nHomePos < nLength && isspace (pszChars[nHomePos]))
nHomePos++;
if (nHomePos == nLength || m_ptCursorPos.x == nHomePos)
//BEGIN SW
m_ptCursorPos.x = nOriginalHomePos;
/*ORIGINAL
m_ptCursorPos.x = 0;
*///END SW
else
m_ptCursorPos.x = nHomePos;
m_nIdealCharPos = CalculateActualOffset (m_ptCursorPos.y, m_ptCursorPos.x);
EnsureVisible (m_ptCursorPos);
UpdateCaret ();
if (!bSelect)
m_ptAnchor = m_ptCursorPos;
SetSelection (m_ptAnchor, m_ptCursorPos);
}
void CCrystalTextView::
MoveEnd (BOOL bSelect)
{
//BEGIN SW
CPoint pos;
CharPosToPoint( m_ptCursorPos.y, m_ptCursorPos.x, pos );
m_ptCursorPos.x = SubLineEndToCharPos( m_ptCursorPos.y, pos.y );
/*ORIGINAL
m_ptCursorPos.x = GetLineLength(m_ptCursorPos.y);
*///END SW
m_nIdealCharPos = CalculateActualOffset (m_ptCursorPos.y, m_ptCursorPos.x);
EnsureVisible (m_ptCursorPos);
UpdateCaret ();
if (!bSelect)
m_ptAnchor = m_ptCursorPos;
SetSelection (m_ptAnchor, m_ptCursorPos);
}
void CCrystalTextView::
MovePgUp (BOOL bSelect)
{
//BEGIN SW
// scrolling windows
int nNewTopSubLine = m_nTopSubLine - GetScreenLines() + 1;
if (nNewTopSubLine < 0)
nNewTopSubLine = 0;
if (m_nTopSubLine != nNewTopSubLine)
{
ScrollToSubLine(nNewTopSubLine);
UpdateSiblingScrollPos(TRUE);
}
// setting cursor
CPoint subLinePos;
CharPosToPoint( m_ptCursorPos.y, m_ptCursorPos.x, subLinePos );
int nSubLine = GetSubLineIndex( m_ptCursorPos.y ) + subLinePos.y - GetScreenLines() + 1;
if( nSubLine < 0 )
nSubLine = 0;
SubLineCursorPosToTextPos(
CPoint( m_nIdealCharPos, nSubLine ), m_ptCursorPos );
/*ORIGINAL
int nNewTopLine = m_nTopLine - GetScreenLines() + 1;
if (nNewTopLine < 0)
nNewTopLine = 0;
if (m_nTopLine != nNewTopLine)
{
ScrollToLine(nNewTopLine);
UpdateSiblingScrollPos(TRUE);
}
m_ptCursorPos.y -= GetScreenLines() - 1;
if (m_ptCursorPos.y < 0)
m_ptCursorPos.y = 0;
if (m_ptCursorPos.x > GetLineLength(m_ptCursorPos.y))
m_ptCursorPos.x = GetLineLength(m_ptCursorPos.y);
*///END SW
m_nIdealCharPos = CalculateActualOffset (m_ptCursorPos.y, m_ptCursorPos.x);
EnsureVisible (m_ptCursorPos); //todo: no vertical scroll
UpdateCaret ();
if (!bSelect)
m_ptAnchor = m_ptCursorPos;
SetSelection (m_ptAnchor, m_ptCursorPos);
}
void CCrystalTextView::
MovePgDn (BOOL bSelect)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -