📄 cedtelement.cpp
字号:
}
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 + -