?? cdoclinemgr.cpp
字號:
// default:
// // From Here Feb. 8, 2001 genta 改行コード変換処理を追加
// if( cEol == EOL_NONE ){
//// 1999.12.20
//// /* 改行コードをCRLFに変換 */
//// cmemBuf.Append( gm_pszEolDataArr[EOL_CRLF], LEN_EOL_CRLF );
// /* 改行コードを変換しない */
// cmemBuf.Append( pCDocLine->m_cEol.GetValue(), pCDocLine->m_cEol.GetLen() );
// break;
// }
// else {
// /* 改行コードを指定されたものに変換 */
// cmemBuf.Append( cEol.GetValue(), cEol.GetLen() );
// }
// // To Here Feb. 8, 2001 genta
// }
// 2002/05/09 Frozen ここまで削除
}
if( 0 < cmemBuf.GetLength() )//{
file.Write(cmemBuf.GetPtr(),sizeof(char)*cmemBuf.GetLength());//2002/05/22 Frozen gotoの次の}までをこの一行で置き換え
////- if( HFILE_ERROR == _lwrite( hFile, cmemBuf.GetPtr(), cmemBuf.GetLength() ) ){
// if( fwrite( cmemBuf.GetPtr(), sizeof( char ), cmemBuf. GetLength(), sFile ) /* add */
// < (size_t)cmemBuf.GetLength() ){ /* add */
//// MYTRACE( "file write error %s\n", pszPath );
// nRetVal = FALSE;
// goto _CLOSEFILE_;
// }
// }
// pLine = GetNextLinrStr( &nLineLen );
pCDocLine = pCDocLine->m_pNext;
}
}//この括弧でCFileWriteのデストラクタが呼び出され、ファイルが閉じられます。
// 2002/05/22 Frozen ここから削除(同様の処理はCFileWriteのデストラクタで代わりに行っています)------
//
//_CLOSEFILE_:;
////- _lclose( hFile );
// fflush( sFile );/* add */
// fclose( sFile );/* add */
// //<< 2002/04/13 Azumaiya
// // ファイル屬性を元に戻す。
// ::SetFileAttributes(pszPath, dwFileAttribute);
// //>> 2002/04/13 Azumaiya
//
// Oct 6, 2000 ao end
/* ファイル出力に関する変更はここまで。
この後変更後のファイル情報を開くためにファイルアクセスしているが、ここまで無理に変更する必要はないでしょう。*/
// 2002/05/22 Frozen ここまで削除---------------------------------------------------------
/* 更新後のファイル時刻の取得
* CloseHandle前ではFlushFileBuffersを呼んでもタイムスタンプが更新
* されないことがある。しかたがないのでいったんクローズして再オープ
* ンして時刻を取得する。
*/
DWORD dwFileAttribute = ::GetFileAttributes(pszPath);
if ( dwFileAttribute == (DWORD)-1 )
{
dwFileAttribute = FILE_ATTRIBUTE_NORMAL;
}
HANDLE hFile;
hFile = ::CreateFile(
pszPath, // 開くファイル名
GENERIC_READ, // 読み込みモードで開く。
0, // 共有しない。
NULL, // ハンドルを継承しない。
OPEN_EXISTING, // 存在するファイルを開く。
dwFileAttribute, // ファイル屬性。
NULL // テンプレートファイルを使わない。
);
if ( hFile != INVALID_HANDLE_VALUE )
{
::GetFileTime( (HANDLE)hFile, NULL, NULL, pFileTime );
::CloseHandle(hFile);
}
}
catch(CError_FileOpen)
{
::MYMESSAGEBOX(
hWndParent,
MB_OK | MB_ICONSTOP,
GSTR_APPNAME,
"\'%s\'\nファイルを保存できません。\nパスが存在しないか、他のアプリケーションで使用されている可能性があります。",
pszPath);
nRetVal = FALSE;
}
catch(CError_FileWrite)
{
nRetVal = FALSE;
}
//_RETURN_:; 2002/05/22 Frozen 削除(例外処理を使用するのでgoto用のラベルは使用しない)
if( NULL != hwndProgress ){
::PostMessage( hwndProgress, PBM_SETPOS, 0, 0 );
/* 処理中のユーザー操作を可能にする */
if( !::BlockingHook( NULL ) ){
return FALSE;
}
}
/* 行変更狀態(tài)をすべてリセット */
// if ( nRetVal ) ResetAllModifyFlag(); // ここでむじょうけんにリセットしてはいけません。2002/04/28 YAZAKI
return nRetVal;
}
/* データの削除 */
/*
|| 指定行內(nèi)の文字しか削除できません
|| データ変更によって影響のあった、変更前と変更後の行の範囲を返します
|| この情報をもとに、レイアウト情報などを更新してください。
||
@date 2002/03/24 YAZAKI bUndo削除
*/
void CDocLineMgr::DeleteData_CDocLineMgr(
int nLine,
int nDelPos,
int nDelLen,
int* pnModLineOldFrom, /* 影響のあった変更前の行(from) */
int* pnModLineOldTo, /* 影響のあった変更前の行(to) */
int* pnDelLineOldFrom, /* 削除された変更前論理行(from) */
int* pnDelLineOldNum, /* 削除された行數(shù) */
CMemory& cmemDeleted /* 削除されたデータ */
// int bUndo /* Undo操作かどうか */
)
{
#ifdef _DEBUG
CRunningTimer cRunningTimer( (const char*)"CDocLineMgr::DeleteData" );
#endif
CDocLine* pDocLine;
CDocLine* pDocLine2;
char* pData;
int nDeleteLength;
char* pLine;
int nLineLen;
char* pLine2;
int nLineLen2;
*pnModLineOldFrom = nLine; /* 影響のあった変更前の行(from) */
*pnModLineOldTo = nLine; /* 影響のあった変更前の行(to) */
*pnDelLineOldFrom = 0; /* 削除された変更前論理行(from) */
*pnDelLineOldNum = 0; /* 削除された行數(shù) */
// cmemDeleted.SetData( "", lstrlen( "" ) );
cmemDeleted.SetDataSz( "" );
pDocLine = GetLineInfo( nLine );
if( NULL == pDocLine ){
return;
}
pDocLine->SetModifyFlg(true); /* 変更フラグ */
pLine = pDocLine->m_pLine->GetPtr( &nLineLen );
if( nDelPos >= nLineLen ){
return;
}
/* 「改行」を削除する場合は、次の行と連結(jié)する */
// if( ( nDelPos == nLineLen -1 && ( pLine[nDelPos] == CR || pLine[nDelPos] == LF ) )
// || nDelPos + nDelLen >= nLineLen
if( ( EOL_NONE != pDocLine->m_cEol && nDelPos == nLineLen - pDocLine->m_cEol.GetLen() )
|| ( EOL_NONE != pDocLine->m_cEol && nDelPos + nDelLen > nLineLen - pDocLine->m_cEol.GetLen() )
|| ( EOL_NONE == pDocLine->m_cEol && nDelPos + nDelLen >= nLineLen - pDocLine->m_cEol.GetLen() )
){
/* 実際に削除するバイト數(shù) */
nDeleteLength = nLineLen - nDelPos;
/* 削除されるデータ */
cmemDeleted.SetData( &pLine[nDelPos], nDeleteLength );
/* 次の行の情報 */
if( NULL == ( pDocLine2 = pDocLine->m_pNext ) ){
pData = new char[nLineLen + 1];
if( nDelPos > 0 ){
memcpy( pData, pLine, nDelPos );
}
if( 0 < nLineLen - ( nDelPos + nDeleteLength ) ){
memcpy(
pData + nDelPos,
pLine + nDelPos + nDeleteLength,
nLineLen - ( nDelPos + nDeleteLength )
);
}
pData[ nLineLen - nDeleteLength ] = '\0';
/* 改行コードの情報を更新 */
pDocLine->m_cEol.SetType( EOL_NONE );
if( 0 < nLineLen - nDeleteLength ){
pDocLine->m_pLine->SetData( pData, nLineLen - nDeleteLength );
}else{
// 行の削除
// 2004.03.18 Moca 関數(shù)を使う
DeleteNode( pDocLine );
pDocLine = NULL;
*pnDelLineOldFrom = nLine; /* 削除された変更前論理行(from) */
*pnDelLineOldNum = 1; /* 削除された行數(shù) */
}
delete [] pData;
}else{
*pnModLineOldTo = nLine + 1; /* 影響のあった変更前の行(to) */
pLine2 = pDocLine2->m_pLine->GetPtr( &nLineLen2 );
pData = new char[nLineLen + nLineLen2 + 1];
if( nDelPos > 0 ){
memcpy( pData, pLine, nDelPos );
}
if( 0 < nLineLen - ( nDelPos + nDeleteLength ) ){
memcpy(
pData + nDelPos,
pLine + nDelPos + nDeleteLength,
nLineLen - ( nDelPos + nDeleteLength )
);
}
/* 次の行のデータを連結(jié) */
memcpy( pData + (nLineLen - nDeleteLength), pLine2, nLineLen2 );
pData[ nLineLen - nDeleteLength + nLineLen2 ] = '\0';
pDocLine->m_pLine->SetData( pData, nLineLen - nDeleteLength + nLineLen2 );
/* 改行コードの情報を更新 */
pDocLine->m_cEol = pDocLine2->m_cEol;
/* 次の行を削除 && 次次行とのリストの連結(jié)*/
// 2004.03.18 Moca DeleteNode を使う
DeleteNode( pDocLine2 );
pDocLine2 = NULL;
*pnDelLineOldFrom = nLine + 1; /* 削除された変更前論理行(from) */
*pnDelLineOldNum = 1; /* 削除された行數(shù) */
delete [] pData;
}
}else{
/* 実際に削除するバイト數(shù) */
nDeleteLength = nDelLen;
/* 削除されるデータ */
cmemDeleted.SetData( &pLine[nDelPos], nDeleteLength );
pData = new char[nLineLen + 1];
if( nDelPos > 0 ){
memcpy( pData, pLine, nDelPos );
}
if( 0 < nLineLen - ( nDelPos + nDeleteLength ) ){
memcpy(
pData + nDelPos,
pLine + nDelPos + nDeleteLength,
nLineLen - ( nDelPos + nDeleteLength )
);
}
pData[ nLineLen - nDeleteLength ] = '\0';
if( 0 < nLineLen - nDeleteLength ){
pDocLine->m_pLine->SetData( pData, nLineLen - nDeleteLength );
}else{
}
delete [] pData;
}
// DUMP();
return;
}
/*! データの挿入
@date 2002/03/24 YAZAKI bUndo削除
*/
void CDocLineMgr::InsertData_CDocLineMgr(
int nLine,
int nInsPos,
const char* pInsData,
int nInsDataLen,
int* pnInsLineNum, /* 挿入によって増えた行の數(shù) */
int* pnNewLine, /* 挿入された部分の次の位置の行 */
int* pnNewPos /* 挿入された部分の次の位置のデータ位置 */
// int bUndo /* Undo操作かどうか */
)
{
CDocLine* pDocLine;
CDocLine* pDocLineNew;
char* pLine;
int nLineLen;
int nBgn;
int nPos;
CMemory cmemPrevLine;
CMemory cmemCurLine;
CMemory cmemNextLine;
int nAllLinesOld = m_nLines;
int nCount;
// May 15, 2000 genta
CEOL cEOLType;
CEOL cEOLTypeNext;
//enumEOLType nEOLType;
//enumEOLType nEOLTypeNext;
bool bBookMarkNext; // 2001.12.03 hor 挿入によるマーク行の制御
*pnNewLine = nLine; /* 挿入された部分の次の位置の行 */
// Jan. 25, 2004 genta
// 挿入文字列長が0の場合に最後までpnNewPosが設(shè)定されないので
// 初期値として0ではなく開始位置と同じ値を入れておく.
*pnNewPos = nInsPos; /* 挿入された部分の次の位置のデータ位置 */
/* 挿入データを行終端で區(qū)切った行數(shù)カウンタ */
nCount = 0;
*pnInsLineNum = 0;
pDocLine = GetLineInfo( nLine );
if( NULL == pDocLine ){
/* ここでNULLが帰ってくるということは、*/
/* 全テキストの最後の次の行を追加しようとしていることを示す */
cmemPrevLine.SetDataSz( "" );
cmemNextLine.SetDataSz( "" );
cEOLTypeNext.SetType( EOL_NONE );
bBookMarkNext=false; // 2001.12.03 hor
}else{
pDocLine->SetModifyFlg(true); /* 変更フラグ */
pLine = pDocLine->m_pLine->GetPtr( &nLineLen );
cmemPrevLine.SetData( pLine, nInsPos );
cmemNextLine.SetData( &pLine[nInsPos], nLineLen - nInsPos );
cEOLTypeNext = pDocLine->m_cEol;
bBookMarkNext= pDocLine->IsBookMarked(); // 2001.12.03 hor
}
nBgn = 0;
nPos = 0;
for( nPos = 0; nPos < nInsDataLen; ){
if( pInsData[nPos] == '\n' || pInsData[nPos] == '\r' ){
/* 行終端子の種類を調(diào)べる */
cEOLType.GetTypeFromString( &pInsData[nPos], nInsDataLen - nPos );
/* 行終端子も含めてテキストをバッファに格納 */
cmemCurLine.SetData( &pInsData[nBgn], nPos - nBgn + cEOLType.GetLen() );
nBgn = nPos + cEOLType.GetLen();
nPos = nBgn;
if( NULL == pDocLine ){
pDocLineNew = new CDocLine;
pDocLineNew->m_pLine = new CMemory;
/* 挿入データを行終端で區(qū)切った行數(shù)カウンタ */
if( 0 == nCount ){
if( NULL == m_pDocLineTop ){
m_pDocLineTop = pDocLineNew;
}
pDocLineNew->m_pPrev = m_pDocLineBot;
if( NULL != m_pDocLineBot ){
m_pDocLineBot->m_pNext = pDocLineNew;
}
m_pDocLineBot = pDocLineNew;
pDocLineNew->m_pNext = NULL;
pDocLineNew->m_pLine->SetData( &cmemPrevLine );
*(pDocLineNew->m_pLine) += cmemCurLine;
pDocLineNew->m_cEol = cEOLType; /* 改行コードの種類 */
// pDocLineNew->m_nEOLLen = gm_pnEolLenArr[nEOLType]; /* 改行コードの長さ */
}else{
if( NULL != m_pDocLineBot ){
m_pDocLineBot->m_pNext = pDocLineNew;
}
pDocLineNew->m_pPrev = m_pDocLineBot;
m_pDocLineBot = pDocLineNew;
pDocLineNew->m_pNext = NULL;
pDocLineNew->m_pLine->SetData( &cmemCurLine );
pDocLineNew->m_cEol = cEOLType; /* 改行コードの種類 */
// pDocLineNew->m_nEOLLen = gm_pnEolLenArr[nEOLType]; /* 改行コードの長さ */
}
pDocLine = NULL;
++m_nLines;
}else{
/* 挿入データを行終端で區(qū)切った行數(shù)カウンタ */
if( 0 == nCount ){
pDocLine->m_pLine->SetData( &cmemPrevLine );
*(pDocLine->m_pLine) += cmemCurLine;
pDocLine->m_cEol = cEOLType; /* 改行コードの種類 */
// pDocLine->m_nEOLLen = gm_pnEolLenArr[nEOLType]; /* 改行コードの長さ */
// 2001.12.13 hor
// 行頭で改行したら元の行のマークを新しい行に移動する
// それ以外なら元の行のマークを維持して新しい行にはマークを付けない
if(nInsPos==0){
pDocLine->SetBookMark(false);
}else{
bBookMarkNext=false;
}
pDocLine = pDocLine->m_pNext;
}else{
pDocLineNew = new CDocLine;
pDocLineNew->m_pLine = new CMemory;
pDocLineNew->m_pPrev = pDocLine->m_pPrev;
pDocLineNew->m_pNext = pDocLine;
pDocLine->m_pPrev->m_pNext = pDocLineNew;
pDocLine->m_pPrev = pDocLineNew;
pDocLineNew->m_pLine->SetData( &cmemCurLine );
pDocLineNew->m_cEol = cEOLType; /* 改行コードの種類 */
// pDocLineNew->m_nEOLLen = gm_pnEolLenArr[nEOLType]; /* 改行コードの長さ */
++m_nLines;
}
}
/* 挿入データを行終端で區(qū)切った行數(shù)カウンタ */
++nCount;
++(*pnNewLine); /* 挿入された部分の次の位置の行 */
}else{
++nPos;
}
}
// nEOLType = EOL_NONE;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -