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

📄 cedtelement.cpp

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

void CMemText::MakeEqualLength()
{
	INT nLen, nMaxLen = GetMaxLength();

	POSITION pos = GetHeadPosition();
	while( pos ) {
		CString & rString = GetNext( pos );
		nLen = rString.GetLength();
		if( nLen < nMaxLen ) rString += CString(' ', nMaxLen - nLen);
	}
}

INT CMemText::MemorySize()
{
	INT size = 0;
	POSITION pos = GetHeadPosition();
	while( pos ) {
		CString & rString = GetNext( pos );
		size += rString.GetLength() + 2;
	}
	return size;
}

void CMemText::MemoryLoad(CHAR * pMem, INT size)
{
	RemoveAll(); CHAR * beg, * fwd = pMem;
	while( fwd - pMem < size ) {
		beg = fwd;
		while( fwd - pMem < size && * fwd != '\r' && * fwd != '\n' && * fwd != '\0' ) fwd++;
		AddTail( CString(beg, fwd-beg) );
		if( * fwd != '\0' ) { if(* fwd == '\r') fwd++; if(* fwd == '\n') fwd++; }
		else break;
	}
}

void CMemText::MemorySave(CHAR * pMem, INT size)
{
	CHAR * tmp = pMem; POSITION pos = GetHeadPosition();
	while( pos ) {
		CString & rString = GetNext(pos);
		INT nLength = rString.GetLength();
		memcpy(tmp, rString, nLength); tmp += nLength;
		if( pos ) { * tmp++ = '\r'; * tmp++ = '\n'; }
		else { * tmp++ = '\0'; * tmp++ = '\0'; }
	}
}


// CAnalyzedTextFile

BOOL CAnalyzedText::FileLoad(LPCTSTR lpszPathName, INT nEncodingType, INT nFileFormat)
{
	INT chDelim = '\n', chKill = '\r'; // FILE_FORMAT_DOS & FILE_FORMAT_UNIX
	if( nFileFormat == FILE_FORMAT_MAC ) { chDelim = '\r'; chKill = '\0'; }
	
	try {
		CFile file(lpszPathName, CFile::modeRead | CFile::typeBinary | CFile::shareDenyNone);
		RemoveAll(); AddTail(""); // initialize contents

		CHAR szBuffer[FILE_READ_BUFFER_SIZE + 1]; UCHAR szWideBuffer[2 * FILE_READ_BUFFER_SIZE + 2]; 
		INT i, nCount, nTotal = 0; BOOL bDelimFound = FALSE;

		if( nEncodingType == ENCODING_TYPE_UNICODE_LE ) {
			// extract byte-order mark
			nCount = file.Read( szWideBuffer, 2 ); 

			if( nCount >= 2 && szWideBuffer[0] == 0xFF && szWideBuffer[1] == 0xFE ) nTotal = 2;
			file.Seek(nTotal, CFile::begin);

			while( ( nCount = file.Read( szWideBuffer, FILE_READ_BUFFER_SIZE ) ) >= 2 ) { // read file contents
				for( bDelimFound = FALSE, i = 0; i <= nCount-2; i += 2 ) { 
					if( szWideBuffer[i] == chDelim && szWideBuffer[i+1] == 0x00 ) { bDelimFound = TRUE; i += 2; break; }
				}

				nCount = i; nTotal += nCount; 
				szWideBuffer[nCount] = szWideBuffer[nCount+1] = 0x00;

				if( nCount >= 2 && szWideBuffer[nCount-2] == chDelim && szWideBuffer[nCount-1] == 0x00 ) { szWideBuffer[nCount-2] = szWideBuffer[nCount-1] = 0x00; nCount -= 2; }
				if( nCount >= 2 && szWideBuffer[nCount-2] == chKill  && szWideBuffer[nCount-1] == 0x00 ) { szWideBuffer[nCount-2] = szWideBuffer[nCount-1] = 0x00; nCount -= 2; }

				nCount = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)szWideBuffer, -1, szBuffer, FILE_READ_BUFFER_SIZE + 1, NULL, NULL);
				nCount = lstrlen( szBuffer );

				GetTail() += szBuffer;
				if( bDelimFound ) AddTail("");

				file.Seek(nTotal, CFile::begin);
			}
		} else if( nEncodingType == ENCODING_TYPE_UNICODE_BE ) {
			// extract byte-order mark
			nCount = file.Read( szWideBuffer, 2 ); 

			if( nCount >= 2 && szWideBuffer[0] == 0xFE && szWideBuffer[1] == 0xFF ) nTotal = 2;
			file.Seek(nTotal, CFile::begin);

			while( ( nCount = file.Read( szWideBuffer, FILE_READ_BUFFER_SIZE ) ) >= 2 ) { // read file contents
				for( bDelimFound = FALSE, i = 0; i <= nCount-2; i += 2 ) { 
					if( szWideBuffer[i] == 0x00 && szWideBuffer[i+1] == chDelim ) { bDelimFound = TRUE; i += 2; break; }
				}

				nCount = i; nTotal += nCount; 
				szWideBuffer[nCount] = szWideBuffer[nCount+1] = 0x00;

				if( nCount >= 2 && szWideBuffer[nCount-2] == 0x00 && szWideBuffer[nCount-1] == chDelim ) { szWideBuffer[nCount-2] = szWideBuffer[nCount-1] = 0x00; nCount -= 2; }
				if( nCount >= 2 && szWideBuffer[nCount-2] == 0x00 && szWideBuffer[nCount-1] == chKill  ) { szWideBuffer[nCount-2] = szWideBuffer[nCount-1] = 0x00; nCount -= 2; }

				for( i = 0; i < nCount; i += 2 ) _SWAP_UCHAR( szWideBuffer[i], szWideBuffer[i+1] );
				nCount = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)szWideBuffer, -1, szBuffer, FILE_READ_BUFFER_SIZE + 1, NULL, NULL);
				nCount = lstrlen( szBuffer );

				GetTail() += szBuffer;
				if( bDelimFound ) AddTail("");

				file.Seek(nTotal, CFile::begin);
			}
		} else if( nEncodingType == ENCODING_TYPE_UTF8_WBOM || nEncodingType == ENCODING_TYPE_UTF8_XBOM ) {
			// extract byte-order mark
			nCount = file.Read( szWideBuffer, 4 ); 

			if( nCount >= 3 && szWideBuffer[0] == 0xEF && szWideBuffer[1] == 0xBB && szWideBuffer[2] == 0xBF ) nTotal = 3;
			file.Seek(nTotal, CFile::begin);

			while( nCount = file.Read( szBuffer, FILE_READ_BUFFER_SIZE ) ) { // read file contents
				for( bDelimFound = FALSE, i = 0; i <= nCount-1; i++ ) { 
					if( szBuffer[i] == chDelim ) { bDelimFound = TRUE; i++; break; } 
				}

				nCount = i; nTotal += nCount; 
				szBuffer[nCount] = 0x00;

				if( nCount >= 1 && szBuffer[nCount-1] == chDelim ) { szBuffer[nCount-1] = 0x00; nCount--; }
				if( nCount >= 1 && szBuffer[nCount-1] == chKill  ) { szBuffer[nCount-1] = 0x00; nCount--; }

				nCount = MultiByteToWideChar(CP_UTF8, 0, szBuffer, -1, (LPWSTR)szWideBuffer, FILE_READ_BUFFER_SIZE + 1);
				nCount = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)szWideBuffer, -1, szBuffer, FILE_READ_BUFFER_SIZE + 1, NULL, NULL);

				GetTail() += szBuffer; 
				if( bDelimFound ) AddTail("");

				file.Seek(nTotal, CFile::begin);
			}
		} else { /* nEncodingType == ENCODING_TYPE_ASCII */
			while( nCount = file.Read( szBuffer, FILE_READ_BUFFER_SIZE ) ) { // read file contents
				for( bDelimFound = FALSE, i = 0; i <= nCount-1; i++ ) { 
					if( szBuffer[i] == chDelim ) { bDelimFound = TRUE; i++; break; } 
				}

				nCount = i; nTotal += nCount; 
				szBuffer[nCount] = 0x00;

				if( nCount >= 1 && szBuffer[nCount-1] == chDelim ) { szBuffer[nCount-1] = 0x00; nCount--; }
				if( nCount >= 1 && szBuffer[nCount-1] == chKill  ) { szBuffer[nCount-1] = 0x00; nCount--; }

				GetTail() += szBuffer;
				if( bDelimFound ) AddTail("");

				file.Seek(nTotal, CFile::begin);
			}
		}

		file.Close();

	} catch( CException * ex ) {
		ex->ReportError( MB_OK | MB_ICONSTOP );
		ex->Delete(); return FALSE;
	}

	return TRUE;
}

BOOL CAnalyzedText::FileSave(LPCTSTR lpszPathName, INT nEncodingType, INT nFileFormat)
{
	CHAR szDelim[2]; lstrcpy(szDelim, "\r\n"); INT nDelimSize = 2; // FILE_FORMAT_DOS
	if( nFileFormat == FILE_FORMAT_UNIX ) { lstrcpy(szDelim, "\n"); nDelimSize = 1; }
	else if( nFileFormat == FILE_FORMAT_MAC ) { lstrcpy(szDelim, "\r"); nDelimSize = 1; }
	
	try {
		CFile file(lpszPathName, CFile::modeReadWrite | CFile::modeCreate | CFile::shareExclusive);
		POSITION pos = GetHeadPosition();

		INT nCount, nBufferSize = 0; CHAR * pBuffer = NULL;
		UCHAR szWideDelim[4], * pWideBuffer = NULL;

		if( nEncodingType == ENCODING_TYPE_UNICODE_LE ) {
			// write byte-order mark
			file.Write("\xFF\xFE", 2); 

			szWideDelim[0] = szDelim[0];	szWideDelim[1] = 0x00; 
			szWideDelim[2] = szDelim[1];	szWideDelim[3] = 0x00; 

			while( pos ) {
				CAnalyzedString & rLine = GetNext(pos);
				nCount = rLine.GetLength(); if( nCount < FILE_WRITE_BUFFER_SIZE ) nCount = FILE_WRITE_BUFFER_SIZE;

				if( nBufferSize < nCount ) {
					nBufferSize = nCount;
					delete [] pWideBuffer;	pWideBuffer = new UCHAR[2 * (nBufferSize + 1)];
				}

				nCount = MultiByteToWideChar(CP_ACP, 0, rLine, -1, (LPWSTR)pWideBuffer, nBufferSize + 1);
				INT nLength = wcslen( (LPCWSTR)pWideBuffer );

				file.Write( pWideBuffer, 2 * nLength );
				if( pos ) file.Write( szWideDelim, 2 * nDelimSize );
			}
		} else if( nEncodingType == ENCODING_TYPE_UNICODE_BE ) {
			// write byte-order mark
			file.Write("\xFE\xFF", 2); 

			szWideDelim[0] = 0x00; 	szWideDelim[1] = szDelim[0];
			szWideDelim[2] = 0x00; 	szWideDelim[3] = szDelim[1];

			while( pos ) {
				CAnalyzedString & rLine = GetNext(pos);
				nCount = rLine.GetLength(); if( nCount < FILE_WRITE_BUFFER_SIZE ) nCount = FILE_WRITE_BUFFER_SIZE;

				if( nBufferSize < nCount ) {
					nBufferSize = nCount;
					delete [] pWideBuffer;	pWideBuffer = new UCHAR[2 * (nBufferSize + 1)];
				}

				nCount = MultiByteToWideChar(CP_ACP, 0, rLine, -1, (LPWSTR)pWideBuffer, nBufferSize + 1);
				INT nLength = wcslen( (LPCWSTR)pWideBuffer );
				for( INT i = 0; i < nLength; i++ ) _SWAP_UCHAR( pWideBuffer[2*i], pWideBuffer[2*i+1] );

				file.Write( pWideBuffer, 2 * nLength );
				if( pos ) file.Write( szWideDelim, 2 * nDelimSize );
			}
		} else if( nEncodingType == ENCODING_TYPE_UTF8_WBOM || nEncodingType == ENCODING_TYPE_UTF8_XBOM ) {
			// write byte-order mark when it is not ENCODING_TYPE_UTF8_XBOM
			if( nEncodingType != ENCODING_TYPE_UTF8_XBOM ) file.Write("\xEF\xBB\xBF", 3); 

			while( pos ) {
				CAnalyzedString & rLine = GetNext(pos);
				nCount = rLine.GetLength(); if( nCount < FILE_WRITE_BUFFER_SIZE ) nCount = FILE_WRITE_BUFFER_SIZE;

				if( nBufferSize < nCount ) {
					nBufferSize = nCount;
					delete [] pBuffer;		pBuffer = new CHAR[3 * (nBufferSize + 1)];
					delete [] pWideBuffer;	pWideBuffer = new UCHAR[2 * (nBufferSize + 1)];
				}

				nCount = MultiByteToWideChar(CP_ACP, 0, rLine, -1, (LPWSTR)pWideBuffer, nBufferSize + 1);
				nCount = WideCharToMultiByte(CP_UTF8, 0, (LPCWSTR)pWideBuffer, -1, pBuffer, 3 * (nBufferSize + 1), NULL, NULL);
				INT nLength = strlen( pBuffer );

				file.Write( pBuffer, nLength );
				if( pos ) file.Write( szDelim, nDelimSize );
			}
		} else { /* nEncodingType == ENCODING_TYPE_ASCII */
			while( pos ) {
				CAnalyzedString & rLine = GetNext(pos);
				INT nLength = rLine.GetLength();

				file.Write( rLine, nLength );
				if( pos ) file.Write( szDelim, nDelimSize );
			}
		}

		delete [] pBuffer;
		delete [] pWideBuffer;

		file.Close();

	} catch( CException * ex ) {
		ex->ReportError( MB_OK | MB_ICONSTOP );
		ex->Delete(); return FALSE;
	}

	return TRUE;
}


BOOL CAnalyzedText::HaveAnyOverflowLine()
{
	POSITION pos = GetHeadPosition();
	while( pos ) {
		CAnalyzedString & rLine = GetNext(pos);
		if( rLine.m_sInfoFlags & LT_LINEOVERFLOW ) return TRUE;
	}
	return FALSE;
}


// CUndoBuffer
void CUndoBuffer::EmptyBuffer()
{
	m_lstAction.RemoveAll();
	m_lstIdxX.RemoveAll(); m_lstIdxY.RemoveAll();
	m_lstParam.RemoveAll();
	m_lstChar.RemoveAll();
	m_lstString.RemoveAll();
	m_lstBlock.RemoveAll();
	RemoveAll();
}

void CUndoBuffer::GetRecentIndex(INT & nIdxX, INT & nIdxY)
{
	if( ! GetCount() ) return;
	nIdxX = m_lstIdxX.GetHead();
	nIdxY = m_lstIdxY.GetHead();
}


// CUserCommand
CUserCommand::CUserCommand()
{
	m_wVirtualKeyCode = m_wModifiers = 0x00;
	m_szName = m_szCommand = "";
	m_szArgument = m_szDirectory = "";
	m_bCloseOnExit = TRUE; m_bUseShortFileName = FALSE;
	m_bCaptureOutput = FALSE; m_bSaveBeforeExecute = TRUE;
}

CString CUserCommand::GetHotKeyText()
{
	UINT nScanCode = MapVirtualKey( m_wVirtualKeyCode, 0 );
	LPARAM lParam = nScanCode << 16;
	TCHAR szKeyName[1024]; GetKeyNameText( lParam, szKeyName, 1024 );

	CString szHotKeyText = "";
	if( strlen(szKeyName) ) {
		if( m_wModifiers & HOTKEYF_CONTROL ) szHotKeyText += "Ctrl+";
		if( m_wModifiers & HOTKEYF_ALT ) szHotKeyText += "Alt+";
		if( m_wModifiers & HOTKEYF_SHIFT ) szHotKeyText += "Shift+";
		szHotKeyText += szKeyName;
	}
	return szHotKeyText;
}

BOOL CUserCommand::StreamSave(ofstream & fout)
{
	INT nLength;

	fout.write((const char *)(& m_wVirtualKeyCode), sizeof(WORD));
	fout.write((const char *)(& m_wModifiers), sizeof(WORD));

	nLength = m_szName.GetLength();
	fout.write((const char *)(& nLength), sizeof(nLength));
	if( nLength ) fout.write((const char *)(LPCTSTR)m_szName, nLength);

	nLength = m_szCommand.GetLength();
	fout.write((const char *)(& nLength), sizeof(nLength));
	if( nLength ) fout.write((const char *)(LPCTSTR)m_szCommand, nLength);

	nLength = m_szArgument.GetLength();
	fout.write((const char *)(& nLength), sizeof(nLength));
	if( nLength ) fout.write((const char *)(LPCTSTR)m_szArgument, nLength);

	nLength = m_szDirectory.GetLength();
	fout.write((const char *)(& nLength), sizeof(nLength));
	if( nLength ) fout.write((const char *)(LPCTSTR)m_szDirectory, nLength);

	fout.write((const char *)(& m_bCloseOnExit), sizeof(BOOL));
	fout.write((const char *)(& m_bUseShortFileName), sizeof(BOOL));
	fout.write((const char *)(& m_bCaptureOutput), sizeof(BOOL));
	fout.write((const char *)(& m_bSaveBeforeExecute), sizeof(BOOL));

	return TRUE;
}

BOOL CUserCommand::StreamLoad(ifstream & fin)
{
	INT nLength; TCHAR szBuffer[4096];

	fin.read((char *)(& m_wVirtualKeyCode), sizeof(WORD));
	fin.read((char *)(& m_wModifiers), sizeof(WORD));

	fin.read((char *)(& nLength), sizeof(nLength));
	if( nLength ) fin.read((char *)(szBuffer), nLength); 
	szBuffer[nLength] = '\0'; m_szName = szBuffer;

	fin.read((char *)(& nLength), sizeof(nLength));
	if( nLength ) fin.read((char *)(szBuffer), nLength); 
	szBuffer[nLength] = '\0'; m_szCommand = szBuffer;

	fin.read((char *)(& nLength), sizeof(nLength));
	if( nLength ) fin.read((char *)(szBuffer), nLength); 
	szBuffer[nLength] = '\0'; m_szArgument = szBuffer;

	fin.read((char *)(& nLength), sizeof(nLength));
	if( nLength ) fin.read((char *)(szBuffer), nLength); 
	szBuffer[nLength] = '\0'; m_szDirectory = szBuffer;

	fin.read((char *)(& m_bCloseOnExit), sizeof(BOOL));
	fin.read((char *)(& m_bUseShortFileName), sizeof(BOOL));
	fin.read((char *)(& m_bCaptureOutput), sizeof(BOOL));
	fin.read((char *)(& m_bSaveBeforeExecute), sizeof(BOOL));

	return TRUE;
}

void CUserCommand::DeleteContents()
{
	m_wVirtualKeyCode = m_wModifiers = 0x00;
	m_szName = m_szCommand = "";
	m_szArgument = m_szDirectory = "";
	m_bCloseOnExit = TRUE; m_bUseShortFileName = FALSE;
	m_bCaptureOutput = FALSE; m_bSaveBeforeExecute = TRUE;
}

void CUserCommand::CopyContents(CUserCommand & rCommand)
{
	m_wVirtualKeyCode = rCommand.m_wVirtualKeyCode; m_wModifiers = rCommand.m_wModifiers;
	m_szName = rCommand.m_szName; m_szCommand = rCommand.m_szCommand;
	m_szArgument = rCommand.m_szArgument; m_szDirectory = rCommand.m_szDirectory;
	m_bCloseOnExit = rCommand.m_bCloseOnExit; m_bUseShortFileName = rCommand.m_bUseShortFileName;
	m_bCaptureOutput = rCommand.m_bCaptureOutput; m_bSaveBeforeExecute = rCommand.m_bSaveBeforeExecute;
}


// CMacroBuffer
CMacroBuffer::CMacroBuffer()
{
	m_wVirtualKeyCode = 0x00; m_wModifiers = 0x00;
	m_szName = "";

⌨️ 快捷键说明

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