📄 ceditview_diff.cpp
字号:
//DIFF情報があれば解析する
if( bDiffInfo == true && nDiffLen > 0 )
{
szDiffData[nDiffLen] = '\0';
AnalyzeDiffInfo( szDiffData, nFlgFile12 );
nDiffLen = 0;
}
bDiffInfo = false;
bLineHead = true;
}
else if( bDiffInfo == true )
{
//DIFF情報に追加する
szDiffData[nDiffLen++] = work[j];
if( nDiffLen >= 99 )
{
nDiffLen = 0;
bDiffInfo = false;
}
}
}
}
// Jan. 23, 2004 genta
// 子プロセスの出力をどんどん受け取らないと子プロセスが
// 停止してしまうため,バッファが空になるまでどんどん読み出す.
new_cnt = 0;
if( ! PeekNamedPipe( hStdOutRead, NULL, 0, NULL, &new_cnt, NULL ) ){
break;
}
Sleep(0); // Jan. 23, 2004 genta タスクスイッチを促す
}
}
} while( bLoopFlag || new_cnt > 0 );
//残ったDIFF情報があれば解析する
if( bDiffInfo == true && nDiffLen > 0 )
{
szDiffData[nDiffLen] = '\0';
AnalyzeDiffInfo( szDiffData, nFlgFile12 );
}
}
//DIFF差分が見つからなかったときにメッセージ表示
if( nFlgOpt & 0x0040 )
{
if( false == m_pcEditDoc->m_cDocLineMgr.IsDiffUse() )
{
::MYMESSAGEBOX( m_hWnd, MB_OK | MB_ICONINFORMATION, GSTR_APPNAME,
"DIFF差分は見つかりませんでした。" );
}
}
finish:
//終了処理
CloseHandle( hStdOutWrite );
CloseHandle( hStdOutRead );
if( pi.hProcess ) CloseHandle( pi.hProcess );
if( pi.hThread ) CloseHandle( pi.hThread );
//分割したビューも更新
for( int v = 0; v < 4; ++v )
if( m_pcEditDoc->m_nActivePaneIndex != v )
m_pcEditDoc->m_cEditViewArr[v].Redraw();
Redraw();
return;
}
/*! DIFF差分情報を解析しマーク登録
@param pszDiffInfo [in] 新ファイル名
@param nFlgFile12 [in] 編集中ファイルは...
0 ファイル1(旧ファイル)
1 ファイル2(新ファイル)
@author MIK
@date 2002/05/25
*/
void CEditView::AnalyzeDiffInfo(
const char *pszDiffInfo,
int nFlgFile12 )
{
/*
* 99a99 旧ファイル99行の次行に新ファイル99行が追加された。
* 99a99,99 旧ファイル99行の次行に新ファイル99~99行が追加された。
* 99c99 旧ファイル99行が新ファイル99行に変更された。
* 99,99c99,99 旧ファイル99~99行が新ファイル99~99行に変更された。
* 99d99 旧ファイル99行が新ファイル99行の次行から削除された。
* 99,99d99 旧ファイル99~99行が新ファイル99行の次行から削除された。
* s1,e1 mode s2,e2
* 先頭の場合0の次行となることもある
*/
const char *q;
int s1, e1, s2, e2;
char mode;
//前半ファイルの開始行
s1 = 0;
for( q = pszDiffInfo; *q; q++ )
{
if( *q == ',' ) break;
if( *q == 'a' || *q == 'c' || *q == 'd' ) break;
//行番号を抽出
if( *q >= '0' && *q <= '9' ) s1 = s1 * 10 + (*q - '0');
else return;
}
if( ! *q ) return;
//前半ファイルの終了行
if( *q != ',' )
{
//開始?終了行番号は同じ
e1 = s1;
}
else
{
e1 = 0;
for( q++; *q; q++ )
{
if( *q == 'a' || *q == 'c' || *q == 'd' ) break;
//行番号を抽出
if( *q >= '0' && *q <= '9' ) e1 = e1 * 10 + (*q - '0');
else return;
}
}
if( ! *q ) return;
//DIFFモードを取得
mode = *q;
//後半ファイルの開始行
s2 = 0;
for( q++; *q; q++ )
{
if( *q == ',' ) break;
//行番号を抽出
if( *q >= '0' && *q <= '9' ) s2 = s2 * 10 + (*q - '0');
else return;
}
//後半ファイルの終了行
if( *q != ',' )
{
//開始?終了行番号は同じ
e2 = s2;
}
else
{
e2 = 0;
for( q++; *q; q++ )
{
//行番号を抽出
if( *q >= '0' && *q <= '9' ) e2 = e2 * 10 + (*q - '0');
else return;
}
}
//行末に達してなければエラー
if( *q ) return;
//抽出したDIFF情報から行番号に差分マークを付ける
if( 0 == nFlgFile12 ) //編集中ファイルは旧ファイル
{
if ( mode == 'a' ) m_pcEditDoc->m_cDocLineMgr.SetDiffMarkRange( MARK_DIFF_DELETE, s1 , e1 );
else if( mode == 'c' ) m_pcEditDoc->m_cDocLineMgr.SetDiffMarkRange( MARK_DIFF_CHANGE, s1 - 1, e1 - 1 );
else if( mode == 'd' ) m_pcEditDoc->m_cDocLineMgr.SetDiffMarkRange( MARK_DIFF_APPEND, s1 - 1, e1 - 1 );
}
else //編集中ファイルは新ファイル
{
if ( mode == 'a' ) m_pcEditDoc->m_cDocLineMgr.SetDiffMarkRange( MARK_DIFF_APPEND, s2 - 1, e2 - 1 );
else if( mode == 'c' ) m_pcEditDoc->m_cDocLineMgr.SetDiffMarkRange( MARK_DIFF_CHANGE, s2 - 1, e2 - 1 );
else if( mode == 'd' ) m_pcEditDoc->m_cDocLineMgr.SetDiffMarkRange( MARK_DIFF_DELETE, s2 , e2 );
}
return;
}
/*! 次の差分を探し,見つかったら移動する
*/
void CEditView::Command_Diff_Next( void )
{
int nX = 0;
int nY;
int nYOld;
BOOL bFound = FALSE;
BOOL bRedo = TRUE;
nY = m_nCaretPosY_PHY;
nYOld = nY;
re_do:;
if( m_pcEditDoc->m_cDocLineMgr.SearchDiffMark( nY, 1 /* 後方検索 */, &nY ) )
{
bFound = TRUE;
m_pcEditDoc->m_cLayoutMgr.CaretPos_Phys2Log( nX, nY, &nX, &nY );
if( m_bSelectingLock )
{
if( !IsTextSelected() ) BeginSelectArea();
}
else
{
if( IsTextSelected() ) DisableSelectArea( TRUE );
}
MoveCursor( nX, nY, TRUE );
if( m_bSelectingLock )
{
ChangeSelectAreaByCurrentCursor( nX, nY );
}
}
if( m_pShareData->m_Common.m_bSearchAll )
{
if( !bFound // 見つからなかった
&& bRedo ) // 最初の検索
{
nY = 0 - 1; /* 1個手前を指定 */
bRedo = FALSE;
goto re_do; // 先頭から再検索
}
}
if( bFound )
{
if( nYOld >= nY ) SendStatusMessage( "▼先頭から再検索しました" );
}
else
{
SendStatusMessage( "▽見つかりませんでした" );
if( m_pShareData->m_Common.m_bNOTIFYNOTFOUND ) /* 見つからないときメッセージを表示 */
::MYMESSAGEBOX( m_hWnd, MB_OK | MB_ICONINFORMATION, GSTR_APPNAME,
"後方(↓) に差分が見つかりません。" );
}
return;
}
/*! 前の差分を探し,見つかったら移動する
*/
void CEditView::Command_Diff_Prev( void )
{
int nX = 0;
int nY;
int nYOld;
BOOL bFound = FALSE;
BOOL bRedo = TRUE;
nY = m_nCaretPosY_PHY;
nYOld = nY;
re_do:;
if( m_pcEditDoc->m_cDocLineMgr.SearchDiffMark( nY, 0 /* 前方検索 */, &nY ) )
{
bFound = TRUE;
m_pcEditDoc->m_cLayoutMgr.CaretPos_Phys2Log( nX, nY, &nX, &nY );
if( m_bSelectingLock )
{
if( !IsTextSelected() ) BeginSelectArea();
}
else
{
if( IsTextSelected() ) DisableSelectArea( TRUE );
}
MoveCursor( nX, nY, TRUE );
if( m_bSelectingLock )
{
ChangeSelectAreaByCurrentCursor( nX, nY );
}
}
if( m_pShareData->m_Common.m_bSearchAll )
{
if( !bFound // 見つからなかった
&& bRedo ) // 最初の検索
{
nY = m_pcEditDoc->m_cLayoutMgr.GetLineCount() - 1 + 1; /* 1個手前を指定 */
bRedo = FALSE;
goto re_do; // 末尾から再検索
}
}
if( bFound )
{
if( nYOld <= nY ) SendStatusMessage( "▲末尾から再検索しました" );
}
else
{
SendStatusMessage( "△見つかりませんでした" );
if( m_pShareData->m_Common.m_bNOTIFYNOTFOUND ) /* 見つからないときメッセージを表示 */
::MYMESSAGEBOX( m_hWnd, MB_OK | MB_ICONINFORMATION, GSTR_APPNAME,
"前方(↑) に差分が見つかりません。" );
}
return;
}
/*! 差分表示の全解除
@author MIK
@date 2002/05/26
*/
void CEditView::Command_Diff_Reset( void )
{
m_pcEditDoc->m_cDocLineMgr.ResetAllDiffMark();
//分割したビューも更新
for( int v = 0; v < 4; ++v )
if( m_pcEditDoc->m_nActivePaneIndex != v )
m_pcEditDoc->m_cEditViewArr[v].Redraw();
Redraw();
return;
}
/*! 一時ファイルを作成する
@author MIK
@date 2002/05/26
*/
BOOL CEditView::MakeDiffTmpFile( const char* filename, HWND hWnd )
{
const char* pLineData;
int nLineLen;
int y;
FILE *fp;
//自分か?
if( NULL == hWnd )
{
CEOL cEol( m_pcEditDoc->m_cSaveLineCode );
FILETIME filetime;
return (BOOL)m_pcEditDoc->m_cDocLineMgr.WriteFile(
filename,
m_pcEditDoc->m_hWnd,
NULL,
m_pcEditDoc->m_nCharCode,
&filetime,
cEol,
m_pcEditDoc->m_bBomExist); // Jul. 26, 2003 ryoji BOM
}
fp = fopen( filename, "wb" );
if( NULL == fp )
{
return FALSE;
}
y = 0;
// 行(改行単位)データの要求
if( hWnd )
{
pLineData = m_pShareData->m_szWork;
nLineLen = ::SendMessage( hWnd, MYWM_GETLINEDATA, y, 0 );
}
else
{
pLineData = m_pcEditDoc->m_cDocLineMgr.GetLineStr( y, &nLineLen );
}
while( 1 )
{
if( 0 == nLineLen || NULL == pLineData ) break;
if( hWnd && nLineLen > sizeof( m_pShareData->m_szWork ) )
{
// 一時バッファを超えている
fclose( fp );
return FALSE;
}
if( 1 != fwrite( pLineData, nLineLen, 1, fp ) )
{
fclose( fp );
return FALSE;
}
y++;
// 行(改行単位)データの要求
if( hWnd ) nLineLen = ::SendMessage( hWnd, MYWM_GETLINEDATA, y, 0 );
else pLineData = m_pcEditDoc->m_cDocLineMgr.GetLineStr( y, &nLineLen );
}
fclose( fp );
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -