📄 cedtviewedit.cpp
字号:
#include "stdafx.h"
#include "cedtHeader.h"
void CCedtView::ActionInsertChar(UINT nChar)
{
INT nIdxY = GetIdxYFromPosY( m_nCaretPosY );
CFormatedString & rLine = GetLineFromPosY( m_nCaretPosY );
INT nIdxX = GetIdxXFromPosX( rLine, m_nCaretPosX, ! m_bColumnMode );
CAnalyzedString & rString = GetLineFromIdxY( nIdxY );
INT nLstX = GetLastIdxX( rString );
if( nIdxX < nLstX && m_bOverwriteMode ) {
FORMATEDWORDINFO & rWord = GetWordFromIdxX( rLine, nIdxX );
if( rWord.m_cType == WT_DBCHAR ) {
DeleteString(nIdxX, nIdxY, 2);
InsertChar(nIdxX, nIdxY, ' ');
} else {
DeleteChar(nIdxX, nIdxY);
}
} else if( nIdxX > nLstX ) {
CString szInsert(' ', nIdxX - nLstX );
InsertString(nLstX, nIdxY, szInsert);
}
InsertChar(nIdxX, nIdxY, nChar);
// auto indent feature
if( m_bEnableAutoIndent && ! m_bOverwriteMode ) {
BOOL bUnindent = TRUE;
if( bUnindent ) bUnindent = (nIdxX > 0) && (nIdxX == GetFirstNonBlankIdxX(rString));
if( bUnindent ) bUnindent = IsThisIndentOffChar(nIdxX, nIdxY);
if( bUnindent ) nIdxX -= UnindentLine(nIdxY);
}
nIdxX = nIdxX + 1;
SetCaretPosY( GetPosYFromIdxY( nIdxX, nIdxY, ! m_bColumnMode ) );
CFormatedString & rLne2 = GetLineFromPosY( m_nCaretPosY );
SetCaretPosX( GetPosXFromIdxX( rLne2, nIdxX, ! m_bColumnMode ) );
}
void CCedtView::ActionInsertSpacesInPlaceOfTab()
{
INT nSpaceWidth = GetSpaceWidth();
INT nNextPosX = GetNextTabPosition(m_nCaretPosX);
INT nSpaceCount = (nNextPosX - m_nCaretPosX) / nSpaceWidth;
INT nIdxY = GetIdxYFromPosY( m_nCaretPosY );
CFormatedString & rLine = GetLineFromPosY( m_nCaretPosY );
INT nIdxX = GetIdxXFromPosX( rLine, m_nCaretPosX, ! m_bColumnMode );
CAnalyzedString & rString = GetLineFromIdxY( nIdxY );
INT nLstX = GetLastIdxX( rString );
if( nIdxX < nLstX && m_bOverwriteMode ) {
FORMATEDWORDINFO & rWord = GetWordFromIdxX( rLine, nIdxX );
if( rWord.m_cType == WT_DBCHAR ) {
DeleteString(nIdxX, nIdxY, 2);
InsertChar(nIdxX, nIdxY, ' ');
} else {
DeleteChar(nIdxX, nIdxY);
}
} else if( nIdxX > nLstX ) {
CString szInsert(' ', nIdxX - nLstX );
InsertString(nLstX, nIdxY, szInsert);
}
if( nSpaceCount == 1 ) InsertChar(nIdxX, nIdxY, ' ');
else InsertString(nIdxX, nIdxY, CString(' ', nSpaceCount));
nIdxX = nIdxX + nSpaceCount;
SetCaretPosY( GetPosYFromIdxY( nIdxX, nIdxY, ! m_bColumnMode ) );
CFormatedString & rLne2 = GetLineFromPosY( m_nCaretPosY );
SetCaretPosX( GetPosXFromIdxX( rLne2, nIdxX, ! m_bColumnMode ) );
}
void CCedtView::ActionInsertColumnChar(UINT nChar)
{
INT nLineHeight = GetLineHeight(), nAveCharWidth = GetAveCharWidth();
INT nBegX, nBegY, nEndX, nEndY; GetSelectedPosition(nBegX, nBegY, nEndX, nEndY);
for(INT nPosY = nBegY; nPosY <= nEndY; nPosY += nLineHeight ) {
CFormatedString & rLine = GetLineFromPosY( nPosY );
INT nIdxX, nIdxY = GetIdxYFromPosY( nPosY ), nLstX = GetLastPosX( rLine );
if( nBegX <= nLstX ) {
nIdxX = GetIdxXFromPosX( rLine, nBegX, TRUE );
FORMATEDWORDINFO & rWord = GetWordFromIdxX( rLine, nIdxX );
if( rWord.m_cType == WT_DBCHAR && rWord.m_nPosition < nBegX ) {
DeleteString(nIdxX, nIdxY, 2);
InsertString(nIdxX, nIdxY, " ");
}
} else {
nIdxX = GetIdxXFromPosX( rLine, nLstX, TRUE );
CString szInsert(' ', (nBegX - nLstX) / nAveCharWidth);
InsertString(nIdxX, nIdxY, szInsert);
}
nIdxX = GetIdxXFromPosX( rLine, nBegX, TRUE );
InsertChar(nIdxX, nIdxY, nChar);
}
INT nIdxX, nIdxY; PositionToIndex( nBegX, nBegY, nIdxX, nIdxY );
nIdxX = nIdxX + 1; IndexToPosition( nIdxX, nIdxY, nBegX, nBegY );
SetCaretPosY( nBegY ); m_nAnchorPosY = nEndY;
SetCaretPosX( nBegX ); m_nAnchorPosX = nBegX;
}
void CCedtView::ActionInsertColumnSpacesInPlaceOfTab()
{
INT nSpaceWidth = GetSpaceWidth();
INT nNextPosX = GetNextTabPosition(m_nCaretPosX);
INT nSpaceCount = (nNextPosX - m_nCaretPosX) / nSpaceWidth;
INT nLineHeight = GetLineHeight(), nAveCharWidth = GetAveCharWidth();
INT nBegX, nBegY, nEndX, nEndY; GetSelectedPosition(nBegX, nBegY, nEndX, nEndY);
for(INT nPosY = nBegY; nPosY <= nEndY; nPosY += nLineHeight ) {
CFormatedString & rLine = GetLineFromPosY( nPosY );
INT nIdxX, nIdxY = GetIdxYFromPosY( nPosY ), nLstX = GetLastPosX( rLine );
if( nBegX <= nLstX ) {
nIdxX = GetIdxXFromPosX( rLine, nBegX, TRUE );
FORMATEDWORDINFO & rWord = GetWordFromIdxX( rLine, nIdxX );
if( rWord.m_cType == WT_DBCHAR && rWord.m_nPosition < nBegX ) {
DeleteString(nIdxX, nIdxY, 2);
InsertString(nIdxX, nIdxY, " ");
}
} else {
nIdxX = GetIdxXFromPosX( rLine, nLstX, TRUE );
CString szInsert(' ', (nBegX - nLstX) / nAveCharWidth);
InsertString(nIdxX, nIdxY, szInsert);
}
nIdxX = GetIdxXFromPosX( rLine, nBegX, TRUE );
if( nSpaceCount == 1 ) InsertChar(nIdxX, nIdxY, ' ');
else InsertString(nIdxX, nIdxY, CString(' ', nSpaceCount));
}
INT nIdxX, nIdxY; PositionToIndex( nBegX, nBegY, nIdxX, nIdxY );
nIdxX = nIdxX + nSpaceCount; IndexToPosition( nIdxX, nIdxY, nBegX, nBegY );
SetCaretPosY( nBegY ); m_nAnchorPosY = nEndY;
SetCaretPosX( nBegX ); m_nAnchorPosX = nBegX;
}
void CCedtView::ActionInsertString(LPCTSTR lpszString)
{
INT nIdxY = GetIdxYFromPosY( m_nCaretPosY );
CFormatedString & rLine = GetLineFromPosY( m_nCaretPosY );
INT nIdxX = GetIdxXFromPosX( rLine, m_nCaretPosX, ! m_bColumnMode );
INT nSize = strlen( lpszString );
CAnalyzedString & rString = GetLineFromIdxY( nIdxY );
INT nLstX = GetLastIdxX( rString );
if( nSize > 0 && nIdxX < nLstX && m_bOverwriteMode ) {
if( nLstX - nIdxX > nSize ) {
FORMATEDWORDINFO & rWord = GetWordFromIdxX( rLine, nIdxX+nSize-1 );
if( rWord.m_cType == WT_DBCHAR && nIdxX+nSize-1 == rWord.m_sIndex ) {
CString szInsert( lpszString ); szInsert += ' ';
DeleteString(nIdxX, nIdxY, nSize+1);
InsertString(nIdxX, nIdxY, szInsert);
} else {
DeleteString(nIdxX, nIdxY, nSize);
InsertString(nIdxX, nIdxY, lpszString);
}
} else {
DeleteString(nIdxX, nIdxY, nLstX - nIdxX);
InsertString(nIdxX, nIdxY, lpszString);
}
} else if( nSize > 0 && nIdxX > nLstX ) {
CString szInsert(' ', nIdxX - nLstX);
InsertString(nLstX, nIdxY, szInsert);
InsertString(nIdxX, nIdxY, lpszString);
} else if( nSize > 0 ) {
InsertString(nIdxX, nIdxY, lpszString);
}
nIdxX = nIdxX + nSize;
SetCaretPosY( GetPosYFromIdxY( nIdxX, nIdxY, ! m_bColumnMode ) );
CFormatedString & rLne2 = GetLineFromPosY( m_nCaretPosY );
SetCaretPosX( GetPosXFromIdxX( rLne2, nIdxX, ! m_bColumnMode ) );
}
void CCedtView::ActionCarrigeReturn()
{
INT nIdxY = GetIdxYFromPosY( m_nCaretPosY );
CFormatedString & rLine = GetLineFromPosY( m_nCaretPosY );
INT nIdxX = GetIdxXFromPosX( rLine, m_nCaretPosX, TRUE );
if( m_bOverwriteMode && nIdxY < GetLastIdxY() ) {
// overwrite mode && not in last line => do not split line
} else SplitLine(nIdxX, nIdxY);
nIdxY = nIdxY + 1; nIdxX = 0;
// auto indent feature
if( m_bEnableAutoIndent && ! m_bOverwriteMode ) { // insert previous leading spaces + append extra indentation
// find previous non-blank line
for(INT nTmpY = nIdxY - 1; nTmpY > 0; nTmpY--) { if( ! IsBlankLineFromIdxY( nTmpY ) ) break; }
CAnalyzedString & rString = GetLineFromIdxY(nTmpY);
CString szLeadingSpace; INT nTmpX = GetFirstNonBlankIdxX(rString);
if( nTmpX ) CopyToString(szLeadingSpace, 0, nTmpY, nTmpX);
INT nLength = szLeadingSpace.GetLength(); // insert previous leading spaces
if( nLength ) { InsertString(0, nIdxY, szLeadingSpace); nIdxX += nLength; }
BOOL bIndent = TRUE; INT nLstX = GetTrailingBlankIdxX(rString); // append extra indentation
if( bIndent ) bIndent = (nLstX > 0) && IsThisIndentOnChar(nLstX-1, nTmpY);
if( bIndent ) nIdxX += IndentLine(nIdxY);
} else if( m_bEnableAutoIndent && m_bOverwriteMode ) { // go to first nonblank position
CAnalyzedString & rString = GetLineFromIdxY(nIdxY);
nIdxX = GetFirstNonBlankIdxX(rString);
}
SetCaretPosY( GetPosYFromIdxY( nIdxX, nIdxY, ! m_bColumnMode ) );
CFormatedString & rLne2 = GetLineFromPosY( m_nCaretPosY );
SetCaretPosX( GetPosXFromIdxX( rLne2, nIdxX, ! m_bColumnMode ) );
}
void CCedtView::ActionBackspace()
{
INT nIdxY = GetIdxYFromPosY( m_nCaretPosY );
CFormatedString & rLine = GetLineFromPosY( m_nCaretPosY );
INT nIdxX = GetIdxXFromPosX( rLine, m_nCaretPosX, ! m_bColumnMode );
CAnalyzedString & rString = GetLineFromIdxY( nIdxY );
INT nLstX = GetLastIdxX( rString );
if( nIdxX > nLstX ) {
// move caret to the left
nIdxX = nIdxX - 1;
} else if( nIdxX > 0 ) {
FORMATEDWORDINFO & rWord = GetWordFromIdxX( rLine, nIdxX-1 );
if( rWord.m_cType == WT_DBCHAR ) { nIdxX = nIdxX-2; DeleteString(nIdxX, nIdxY, 2); }
else { nIdxX = nIdxX-1; DeleteChar(nIdxX, nIdxY); }
} else if( nIdxY > 0 ) {
CAnalyzedString & rStrn2 = GetLineFromIdxY( nIdxY-1 );
nIdxY = nIdxY - 1; nIdxX = GetLastIdxX( rStrn2 );
JoinLines(nIdxX, nIdxY);
}
SetCaretPosY( GetPosYFromIdxY( nIdxX, nIdxY, ! m_bColumnMode ) );
CFormatedString & rLne2 = GetLineFromPosY( m_nCaretPosY );
SetCaretPosX( GetPosXFromIdxX( rLne2, nIdxX, ! m_bColumnMode ) );
}
void CCedtView::ActionDeleteChar()
{
INT nIdxY = GetIdxYFromPosY( m_nCaretPosY );
CFormatedString & rLine = GetLineFromPosY( m_nCaretPosY );
INT nIdxX = GetIdxXFromPosX( rLine, m_nCaretPosX, ! m_bColumnMode );
CAnalyzedString & rString = GetLineFromIdxY( nIdxY );
INT nLstX = GetLastIdxX( rString );
if( nIdxX < nLstX ) {
FORMATEDWORDINFO & rWord = GetWordFromIdxX( rLine, nIdxX );
if( rWord.m_cType == WT_DBCHAR ) DeleteString(nIdxX, nIdxY, 2);
else DeleteChar(nIdxX, nIdxY);
} else if( nIdxY < GetLastIdxY() ) {
if( nIdxX > nLstX ) {
CString szInsert(' ', nIdxX - nLstX);
InsertString(nLstX, nIdxY, szInsert);
}
JoinLines(nIdxX, nIdxY);
}
SetCaretPosY( GetPosYFromIdxY( nIdxX, nIdxY, ! m_bColumnMode ) );
CFormatedString & rLne2 = GetLineFromPosY( m_nCaretPosY );
SetCaretPosX( GetPosXFromIdxX( rLne2, nIdxX, ! m_bColumnMode ) );
}
void CCedtView::ActionDetabCaret()
{
INT nIdxY = GetIdxYFromPosY( m_nCaretPosY );
CFormatedString & rLine = GetLineFromPosY( m_nCaretPosY );
INT nIdxX = GetIdxXFromPosX( rLine, m_nCaretPosX, ! m_bColumnMode );
INT nPosX = GetPrevTabPosition( m_nCaretPosX );
if( nPosX < GetFirstPosX( rLine ) ) nPosX = GetFirstPosX(rLine);
nIdxX = GetIdxXFromPosX( rLine, nPosX, ! m_bColumnMode );
SetCaretPosY( GetPosYFromIdxY( nIdxX, nIdxY, ! m_bColumnMode ) );
CFormatedString & rLne2 = GetLineFromPosY( m_nCaretPosY );
SetCaretPosX( GetPosXFromIdxX( rLne2, nIdxX, ! m_bColumnMode ) );
}
void CCedtView::ActionJoinLines()
{
INT nIdxY = GetIdxYFromPosY( m_nCaretPosY );
CFormatedString & rLine = GetLineFromPosY( m_nCaretPosY );
INT nIdxX = GetIdxXFromPosX( rLine, m_nCaretPosX, TRUE );
if( nIdxY < GetLastIdxY() ) {
DeleteTrailingSpaces( nIdxY );
DeleteLeadingSpaces( nIdxY + 1 );
CAnalyzedString & rString = GetLineFromIdxY( nIdxY );
nIdxX = GetLastIdxX( rString );
JoinLines(nIdxX, nIdxY);
InsertChar(nIdxX, nIdxY, ' ');
}
SetCaretPosY( GetPosYFromIdxY( nIdxX, nIdxY, ! m_bColumnMode ) );
CFormatedString & rLne2 = GetLineFromPosY( m_nCaretPosY );
SetCaretPosX( GetPosXFromIdxX( rLne2, nIdxX, ! m_bColumnMode ) );
}
void CCedtView::ActionSplitLine()
{
INT nIdxY = GetIdxYFromPosY( m_nCaretPosY );
CFormatedString & rLine = GetLineFromPosY( m_nCaretPosY );
INT nIdxX = GetIdxXFromPosX( rLine, m_nCaretPosX, ! m_bColumnMode );
CAnalyzedString & rString = GetLineFromIdxY( nIdxY );
INT nLstX = GetLastIdxX( rString );
if( nIdxX > nLstX )
SplitLine(nLstX, nIdxY);
else
SplitLine(nIdxX, nIdxY);
SetCaretPosY( GetPosYFromIdxY( nIdxX, nIdxY, ! m_bColumnMode ) );
CFormatedString & rLne2 = GetLineFromPosY( m_nCaretPosY );
SetCaretPosX( GetPosXFromIdxX( rLne2, nIdxX, ! m_bColumnMode ) );
}
void CCedtView::ActionDeleteWord()
{
INT nIdxY = GetIdxYFromPosY( m_nCaretPosY );
CFormatedString & rLine = GetLineFromPosY( m_nCaretPosY );
INT nIdxX = GetIdxXFromPosX( rLine, m_nCaretPosX, ! m_bColumnMode );
CAnalyzedString & rString = GetLineFromIdxY( nIdxY );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -