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

📄 cedtviewcaret.cpp

📁 Crimson编辑器的英文版,完成从韩文版变成英文版的移植,并且附带可执行文件和注册表文件,无需原先的安装包,是改写编辑器的最理想选择.
💻 CPP
字号:
#include "stdafx.h"
#include "cedtHeader.h"


INT CCedtView::GetSelectedLineCount()
{
	if( ! m_bSelected ) return 0;
	INT nBegX, nBegY, nEndX, nEndY;
	GetSelectedIndex(nBegX, nBegY, nEndX, nEndY);
	return (nEndY - nBegY);
}

void CCedtView::SaveCaretAndAnchorPos()
{
	m_nCaretIdxY = GetIdxYFromPosY( m_nCaretPosY );
	CFormatedString & rLine = GetLineFromPosY( m_nCaretPosY );
	m_nCaretIdxX = GetIdxXFromPosX( rLine, m_nCaretPosX );

	m_nAnchorIdxY = GetIdxYFromPosY( m_nAnchorPosY );
	CFormatedString & rLne2 = GetLineFromPosY( m_nAnchorPosY );
	m_nAnchorIdxX = GetIdxXFromPosX( rLne2, m_nAnchorPosX );

	m_nScrollIdxY = GetIdxYFromPosY( m_nScrollPosY );
	CFormatedString & rLne3 = GetLineFromPosY( m_nScrollPosY );
	m_nScrollIdxX = 0;
}

void CCedtView::RestoreCaretAndAnchorPos()
{
	SetCaretPosY( GetPosYFromIdxY( m_nCaretIdxX, m_nCaretIdxY ) );
	CFormatedString & rLine = GetLineFromPosY( m_nCaretPosY );
	SetCaretPosX( GetPosXFromIdxX( rLine, m_nCaretIdxX ) );

	m_nAnchorPosY = GetPosYFromIdxY( m_nAnchorIdxX, m_nAnchorIdxY );
	CFormatedString & rLne2 = GetLineFromPosY( m_nAnchorPosY );
	m_nAnchorPosX = GetPosXFromIdxX( rLne2, m_nAnchorIdxX );

	SetScrollPosY( GetPosYFromIdxY( 0, m_nScrollIdxY ) );
	CFormatedString & rLne3 = GetLineFromPosY( m_nScrollPosY );
	SetScrollPosX( GetPosXFromIdxX( rLne3, m_nScrollIdxX ) );
}


void CCedtView::GetSelectedPosition(INT & nBegX, INT & nBegY, INT & nEndX, INT & nEndY)
{
	if( m_bColumnMode && m_bSelected ) { // column select mode
		if( m_nCaretPosY < m_nAnchorPosY ) {
			nBegY = m_nCaretPosY;	nEndY = m_nAnchorPosY;
		} else {
			nBegY = m_nAnchorPosY;	nEndY = m_nCaretPosY;	
		}

		if( m_nCaretPosX < m_nAnchorPosX ) {
			nBegX = m_nCaretPosX;	nEndX = m_nAnchorPosX;
		} else {
			nBegX = m_nAnchorPosX;	nEndX = m_nCaretPosX;	
		}

	} else if( m_bSelected ) { // line select mode
		if( m_nCaretPosY > m_nAnchorPosY ) {
			nBegX = m_nAnchorPosX;	nBegY = m_nAnchorPosY;
			nEndX = m_nCaretPosX;	nEndY = m_nCaretPosY;

			if( m_bLineSelect ) { // line select mouse move
				if( m_nCaretPosY < GetLastPosY() ) {
					nEndY = m_nCaretPosY + GetLineHeight();
					CFormatedString & rLine = GetLineFromPosY( nEndY );
					nEndX = GetFirstPosX( rLine );
				} else {
					CFormatedString & rLine = GetLineFromPosY( nEndY );
					nEndX = GetLastPosX( rLine ); 
				}
			}
		} else if( m_nCaretPosY < m_nAnchorPosY ) {
			nBegX = m_nCaretPosX;	nBegY = m_nCaretPosY;
			nEndX = m_nAnchorPosX;	nEndY = m_nAnchorPosY;
		} else if( m_nCaretPosX > m_nAnchorPosX ) {
			nBegX = m_nAnchorPosX;	nBegY = m_nAnchorPosY;
			nEndX = m_nCaretPosX;	nEndY = m_nCaretPosY;
		} else {
			nBegX = m_nCaretPosX;	nBegY = m_nCaretPosY;
			nEndX = m_nAnchorPosX;	nEndY = m_nAnchorPosY;
		}

	} else if( m_bComposition ) { // multi-byte character composition
		nBegX = m_nAnchorPosX;	nBegY = m_nAnchorPosY;
		nEndX = m_nCaretPosX;	nEndY = m_nCaretPosY;

	} else {
		nBegX = nBegY = nEndX = nEndY = 0;
	}
}

void CCedtView::GetSelectedIndex(INT & nBegX, INT & nBegY, INT & nEndX, INT & nEndY)
{
	GetSelectedPosition(nBegX, nBegY, nEndX, nEndY);

	CFormatedString & rLine = GetLineFromPosY( nBegY );
	nBegY = GetIdxYFromPosY( nBegY );
	nBegX = GetIdxXFromPosX( rLine, nBegX );

	CFormatedString & rLne2 = GetLineFromPosY( nEndY );
	nEndY = GetIdxYFromPosY( nEndY );
	nEndX = GetIdxXFromPosX( rLne2, nEndX );
}


void CCedtView::SetCaretPosY(INT nPosY)
{
	INT nLineHeight = GetLineHeight();
	INT nLastPosY = GetLastPosY();

	if( nPosY > nLastPosY ) m_nCaretPosY = nLastPosY;
	else if( nPosY > 0 ) m_nCaretPosY = (nPosY / nLineHeight) * nLineHeight;
	else m_nCaretPosY = 0;
}

void CCedtView::SetCaretPosX(INT nPosX, BOOL bFix)
{
	CFormatedString & rLine = GetLineFromPosY( m_nCaretPosY );
	INT nLastPosX, nFrstPosX;

	if( ! bFix ) nPosX = m_nCaretPosXFixed;

	if( nPosX > ( nLastPosX = GetLastPosX(rLine) ) ) {
		if( m_bColumnMode ) { // is using fixed pitch font
			INT nCharWidth = GetAveCharWidth();
			m_nCaretPosX = (nPosX / nCharWidth) * nCharWidth;
		} else m_nCaretPosX = nLastPosX;
	} else if( nPosX > ( nFrstPosX = GetFirstPosX(rLine) ) ) {
		INT nIdxX = GetIdxXFromPosX( rLine, nPosX );
		m_nCaretPosX = GetPosXFromIdxX( rLine, nIdxX );
	} else { // nPosX <= nFrstPosX
		m_nCaretPosX = nFrstPosX;
	}

	if( bFix ) m_nCaretPosXFixed = m_nCaretPosX;
}

void CCedtView::SetCaretPosFromMouse(CPoint point)
{
	TRACE0("SetCaretPosFromMouse\n");
	SetCaretPosY( point.y + m_nScrollPosY );

	CFormatedString & rLine = GetLineFromPosY( m_nCaretPosY );
	INT nPosX = point.x + m_nScrollPosX - GetLeftMargin();
	INT nLastPosX, nFrstPosX;

	if( nPosX > ( nLastPosX = GetLastPosX(rLine) ) ) {
		if( m_bColumnMode ) {
			INT nCharWidth = GetAveCharWidth();
			INT nPos1 = (nPosX / nCharWidth) * nCharWidth;
			INT nPos2 = (nPosX / nCharWidth + 1) * nCharWidth;
			SetCaretPosX( (nPosX-nPos1 < nPos2-nPosX) ? nPos1 : nPos2 );
		} else SetCaretPosX( nLastPosX );
	} else if( nPosX > ( nFrstPosX = GetFirstPosX(rLine) ) ) {
		INT nIdxX = GetIdxXFromPosX( rLine, nPosX );
		FORMATEDWORDINFO & rWord = GetWordFromIdxX( rLine, nIdxX );
		INT nIncX = ( rWord.m_cType == WT_DBCHAR ) ? 2 : 1;

		INT nPos1 = GetPosXFromIdxX( rLine, nIdxX );
		INT nPos2 = GetPosXFromIdxX( rLine, nIdxX + nIncX );
		SetCaretPosX( (nPosX-nPos1 < nPos2-nPosX) ? nPos1 : nPos2 );
	} else {
		SetCaretPosX( nFrstPosX );
	}
}

void CCedtView::SetDragPosY(INT nPosY)
{
	INT nLineHeight = GetLineHeight();
	INT nLastPosY = GetLastPosY();

	if( nPosY > nLastPosY ) m_nDragPosY = nLastPosY;
	else if( nPosY > 0 ) m_nDragPosY = (nPosY / nLineHeight) * nLineHeight;
	else m_nDragPosY = 0;
}

void CCedtView::SetDragPosX(INT nPosX)
{
	CFormatedString & rLine = GetLineFromPosY( m_nDragPosY );
	INT nLastPosX, nFrstPosX;

	if( nPosX > ( nLastPosX = GetLastPosX(rLine) ) ) {
		if( m_bColumnMode ) { // is using fixed pitch font
			INT nCharWidth = GetAveCharWidth();
			m_nDragPosX = (nPosX / nCharWidth) * nCharWidth;
		} else m_nDragPosX = nLastPosX;
	} else if( nPosX > ( nFrstPosX = GetFirstPosX(rLine) ) ) {
		INT nIdxX = GetIdxXFromPosX( rLine, nPosX );
		m_nDragPosX = GetPosXFromIdxX( rLine, nIdxX );
	} else { // nPosX <= nFrstPosX
		m_nDragPosX = nFrstPosX;
	}
}

void CCedtView::SetDragPosFromMouse(CPoint point)
{
	SetDragPosY( point.y + m_nScrollPosY );

	CFormatedString & rLine = GetLineFromPosY( m_nDragPosY );
	INT nPosX = point.x + m_nScrollPosX - GetLeftMargin();
	INT nLastPosX, nFrstPosX;

	if( nPosX > ( nLastPosX = GetLastPosX(rLine) ) ) {
		if( m_bColumnMode ) {
			INT nCharWidth = GetAveCharWidth();
			INT nPos1 = (nPosX / nCharWidth) * nCharWidth;
			INT nPos2 = (nPosX / nCharWidth + 1) * nCharWidth;
			SetDragPosX( (nPosX-nPos1 < nPos2-nPosX) ? nPos1 : nPos2 );
		} else SetDragPosX( nLastPosX );
	} else if( nPosX > ( nFrstPosX = GetFirstPosX(rLine) ) ) {
		INT nIdxX = GetIdxXFromPosX( rLine, nPosX );
		FORMATEDWORDINFO & rWord = GetWordFromIdxX( rLine, nIdxX );
		INT nIncX = ( rWord.m_cType == WT_DBCHAR ) ? 2 : 1;

		INT nPos1 = GetPosXFromIdxX( rLine, nIdxX );
		INT nPos2 = GetPosXFromIdxX( rLine, nIdxX + nIncX );
		SetDragPosX( (nPosX-nPos1 < nPos2-nPosX) ? nPos1 : nPos2 );
	} else {
		SetDragPosX( nFrstPosX );
	}
}

BOOL CCedtView::IsCaretVisible()
{
	RECT rect; GetClientRect( & rect );
	INT nLeftMargin = GetLeftMargin();	INT nMaxCharWidth = GetMaxCharWidth();
	INT nLineHeight = GetLineHeight();	INT nLinesPerPage = GetLinesPerPage();

	INT nPosY = m_nCaretPosY - m_nScrollPosY;
	if( nPosY < 0 || nPosY > (nLinesPerPage - 1) * nLineHeight ) return FALSE;

	INT nPosX = m_nCaretPosX - m_nScrollPosX + nLeftMargin;
	if( nPosX < nLeftMargin || nPosX > rect.right - nMaxCharWidth ) return FALSE;

	return TRUE;
}

BOOL CCedtView::IsPointInSelection(CPoint point)
{
	INT nLeftMargin = GetLeftMargin();

	INT nPosX = point.x + m_nScrollPosX - nLeftMargin;
	INT nPosY = point.y + m_nScrollPosY;

	return IsPositionInSelection(nPosX, nPosY);
}

BOOL CCedtView::IsPositionInSelection(INT nPosX, INT nPosY)
{
	INT nLineHeight = GetLineHeight(); 
	INT nBegX, nBegY, nEndX, nEndY; GetSelectedPosition(nBegX, nBegY, nEndX, nEndY);

	if( m_bColumnMode ) { /* column editing mode */
		if( nPosY < nBegY ) {
			return FALSE;
		} else if( nPosY < nEndY + nLineHeight ) {
			if( nPosX <  nBegX  ) return FALSE;
			if( nPosX <  nEndX  ) return TRUE;
			/*  nPosX >= nEndX */ return FALSE;
		} else /* nPosY >= nEndY + nLineHeight */ {
			return FALSE;
		}
	} else { /* line editing mode */
		if( nPosY >= nBegY && nPosY < nBegY + nLineHeight && nBegY == nEndY ) {
			if( nPosX <  nBegX  ) return FALSE;
			if( nPosX <  nEndX  ) return TRUE;
			/*  nPosX >= nEndX */ return FALSE;
		} else {
			if( nPosY <  nBegY  ) return FALSE;
			if( nPosY <  nBegY + nLineHeight  ) return (nPosX <  nBegX) ? FALSE : TRUE;
			if( nPosY <  nEndY  ) return TRUE;
			if( nPosY <  nEndY + nLineHeight  ) return (nPosX <  nEndX) ? TRUE : FALSE;
			/*  nPosY >= nEndY + nLineHeight */ return FALSE;
		}
	}

	return FALSE;
}

INT CCedtView::RelativePosToSavedSelection(INT nPosX, INT nPosY)
{
	if( m_bColumnMode ) { /* column editing mode */
		if( nPosY < m_nSaveSelBegY ) {
			if( nPosX <  m_nSaveSelBegX  ) return -4;
			if( nPosX <  m_nSaveSelEndX  ) return -3;
			/*  nPosX >= m_nSaveSelEndX */ return -2;
		} else if( nPosY < m_nSaveSelEndY ) {
			if( nPosX <  m_nSaveSelBegX  ) return -1;
			if( nPosX <  m_nSaveSelEndX  ) return  0;
			/*  nPosX >= m_nSaveSelEndX */ return  1;
		} else /* nPosY > m_nSaveSelEndY */ {
			if( nPosX <  m_nSaveSelBegX  ) return  2;
			if( nPosX <  m_nSaveSelEndX  ) return  3;
			/*  nPosX >= m_nSaveSelEndX */ return  4;
		}
	} else { /* line editing mode */
		if( nPosY == m_nSaveSelBegY && m_nSaveSelBegY == m_nSaveSelEndY ) {
			if( nPosX <  m_nSaveSelBegX  ) return -1;
			if( nPosX <  m_nSaveSelEndX  ) return  0;
			/*  nPosX >= m_nSaveSelEndX */ return  1;
		} else {
			if( nPosY <  m_nSaveSelBegY  ) return -2;
			if( nPosY == m_nSaveSelBegY  ) return (nPosX <  m_nSaveSelBegX) ? -1 : 0;
			if( nPosY <  m_nSaveSelEndY  ) return  0;
			if( nPosY == m_nSaveSelEndY  ) return (nPosX <  m_nSaveSelEndX) ?  0 : 1;
			/*  nPosY >  m_nSaveSelEndY */ return  2;
		}
	}
}

void CCedtView::AdjustCaretAndAnchorPosRelativeToSavedSelection()
{
	INT nRelativePos = RelativePosToSavedSelection(m_nCaretPosX, m_nCaretPosY);

	if( m_bColumnMode ) { // column editing mode
		switch( nRelativePos ) {
		case -4: m_nAnchorPosY = m_nSaveSelEndY; m_nAnchorPosX = m_nSaveSelEndX; break;
		case -3: m_nAnchorPosY = m_nSaveSelEndY; m_nAnchorPosX = m_nSaveSelEndX; m_nCaretPosX = m_nSaveSelBegX; break;
		case -2: m_nAnchorPosY = m_nSaveSelEndY; m_nAnchorPosX = m_nSaveSelBegX; break;
		case -1: m_nAnchorPosY = m_nSaveSelEndY; m_nAnchorPosX = m_nSaveSelEndX; m_nCaretPosY = m_nSaveSelBegY; break;
		case  0: m_nAnchorPosY = m_nSaveSelEndY; m_nAnchorPosX = m_nSaveSelEndX; m_nCaretPosY = m_nSaveSelBegY; m_nCaretPosX = m_nSaveSelBegX; break;
		case  1: m_nAnchorPosY = m_nSaveSelBegY; m_nAnchorPosX = m_nSaveSelBegX; m_nCaretPosY = m_nSaveSelEndY; break;
		case  2: m_nAnchorPosY = m_nSaveSelBegY; m_nAnchorPosX = m_nSaveSelEndX; break;
		case  3: m_nAnchorPosY = m_nSaveSelBegY; m_nAnchorPosX = m_nSaveSelBegX; m_nCaretPosX = m_nSaveSelEndX; break;
		case  4: m_nAnchorPosY = m_nSaveSelBegY; m_nAnchorPosX = m_nSaveSelBegX; break;
		}
	} else { // line editing mode
		switch( nRelativePos ) {
		case -2: m_nAnchorPosY = m_nSaveSelEndY; m_nAnchorPosX = m_nSaveSelEndX; break;
		case -1: m_nAnchorPosY = m_nSaveSelEndY; m_nAnchorPosX = m_nSaveSelEndX; break;
		case  0: m_nAnchorPosY = m_nSaveSelEndY; m_nAnchorPosX = m_nSaveSelEndX; m_nCaretPosY = m_nSaveSelBegY; m_nCaretPosX = m_nSaveSelBegX; break;
		case  1: m_nAnchorPosY = m_nSaveSelBegY; m_nAnchorPosX = m_nSaveSelBegX; break;
		case  2: m_nAnchorPosY = m_nSaveSelBegY; m_nAnchorPosX = m_nSaveSelBegX; break;
		}
	}
}

void CCedtView::AdjustCaretPosAfterLineSelectMouseMove()
{
	if( m_nCaretPosY > m_nAnchorPosY ) {
		if( m_nCaretPosY < GetLastPosY() ) {
			SetCaretPosY( m_nCaretPosY + GetLineHeight() );
			CFormatedString & rLine = GetLineFromPosY( m_nCaretPosY );
			SetCaretPosX( GetFirstPosX( rLine ) );
		} else {
			CFormatedString & rLine = GetLineFromPosY( m_nCaretPosY );
			SetCaretPosX( GetLastPosX( rLine ) ); 
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -