⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cedtviewedit.cpp

📁 Crimson编辑器的英文版,完成从韩文版变成英文版的移植,并且附带可执行文件和注册表文件,无需原先的安装包,是改写编辑器的最理想选择.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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 + -