📄 ceditview_command_new.cpp
字号:
if( IsTextSelected() ){
CWaitCursor cWaitCursor( m_hWnd ); // 2002.02.05 hor
if( !m_bDoing_UndoRedo ){ /* アンドゥ?リドゥの実行中か */
pcOpe = new COpe;
pcOpe->m_nOpe = OPE_MOVECARET; /* 操作種別 */
pcOpe->m_nCaretPosX_PHY_Before = m_nCaretPosX_PHY; /* 操作前のキャレット位置X */
pcOpe->m_nCaretPosY_PHY_Before = m_nCaretPosY_PHY; /* 操作前のキャレット位置Y */
pcOpe->m_nCaretPosX_PHY_After = pcOpe->m_nCaretPosX_PHY_Before; /* 操作後のキャレット位置X */
pcOpe->m_nCaretPosY_PHY_After = pcOpe->m_nCaretPosY_PHY_Before; /* 操作後のキャレット位置Y */
/* 操作の追加 */
m_pcOpeBlk->AppendOpe( pcOpe );
}
/* 矩形範囲選択中か */
if( m_bBeginBoxSelect ){
m_pcEditDoc->SetModified(true,bRedraw); // 2002/06/04 YAZAKI 矩形選択を削除したときに変更マークがつかない。
m_bDrawSWITCH=FALSE; // 2002.01.25 hor
// bBoxSelected = TRUE; // 2002/2/3 aroka
nSelectColmFrom_Old = m_nSelectColmFrom;
nSelectLineFrom_Old = m_nSelectLineFrom;
/* 選択範囲のデータを取得 */
/* 正常時はTRUE,範囲未選択の場合はFALSEを返す */
/* 2点を対角とする矩形を求める */
TwoPointToRect(
&rcSel,
m_nSelectLineFrom, /* 範囲選択開始行 */
m_nSelectColmFrom, /* 範囲選択開始桁 */
m_nSelectLineTo, /* 範囲選択終了行 */
m_nSelectColmTo /* 範囲選択終了桁 */
);
/* 現在の選択範囲を非選択状態に戻す */
DisableSelectArea( bRedraw );
nIdxFrom = 0;
nIdxTo = 0;
for( nLineNum = rcSel.bottom; nLineNum >= rcSel.top - 1; nLineNum-- ){
nDelPosNext = nIdxFrom;
nDelLenNext = nIdxTo - nIdxFrom;
pLine = m_pcEditDoc->m_cLayoutMgr.GetLineStr( nLineNum, &nLineLen, &pcLayout );
if( NULL != pLine ){
/* 指定された桁に対応する行のデータ内の位置を調べる */
nIdxFrom = LineColmnToIndex( pcLayout, rcSel.left );
nIdxTo = LineColmnToIndex( pcLayout, rcSel.right );
for( i = nIdxFrom; i <= nIdxTo; ++i ){
if( pLine[i] == CR || pLine[i] == LF ){
nIdxTo = i;
break;
}
}
}else{
nIdxFrom = 0;
nIdxTo = 0;
}
nDelPos = nDelPosNext;
nDelLen = nDelLenNext;
if( nLineNum < rcSel.bottom && 0 < nDelLen ){
if( !m_bDoing_UndoRedo ){ /* アンドゥ?リドゥの実行中か */
pcOpe = new COpe;
pLine2 = m_pcEditDoc->m_cLayoutMgr.GetLineStr( nLineNum + 1, &nLineLen2, &pcLayout );
m_pcEditDoc->m_cLayoutMgr.CaretPos_Log2Phys(
LineIndexToColmn( pcLayout, nDelPos ),
nLineNum + 1,
&pcOpe->m_nCaretPosX_PHY_Before,
&pcOpe->m_nCaretPosY_PHY_Before
);
}else{
pcOpe = NULL;
}
pcMemDeleted = new CMemory;
/* 指定位置の指定長データ削除 */
DeleteData2(
rcSel.left,
nLineNum + 1,
nDelLen,
pcMemDeleted,
pcOpe /* 編集操作要素 COpe */
// FALSE/*bRedraw 2002.01.25 hor*/,
// FALSE/*bRedraw* 2002.01.25 hor*/
);
if( !m_bDoing_UndoRedo ){ /* アンドゥ?リドゥの実行中か */
m_pcEditDoc->m_cLayoutMgr.CaretPos_Log2Phys(
rcSel.left,
nLineNum + 1,
&pcOpe->m_nCaretPosX_PHY_After,
&pcOpe->m_nCaretPosY_PHY_After
);
/* 操作の追加 */
m_pcOpeBlk->AppendOpe( pcOpe );
}else{
delete pcMemDeleted;
pcMemDeleted = NULL;
}
}
}
m_bDrawSWITCH=TRUE; // 2002.01.25 hor
/* 行番号表示に必要な幅を設定 */
if ( m_pcEditDoc->DetectWidthOfLineNumberAreaAllPane( TRUE ) ){
/* キャレットの表示?更新 */
ShowEditCaret();
}
if( bRedraw ){
/* スクロールバーの状態を更新する */
AdjustScrollBars();
/* 再描画 */
hdc = ::GetDC( m_hWnd );
ps.rcPaint.left = 0;
ps.rcPaint.right = m_nViewAlignLeft + m_nViewCx;
// ps.rcPaint.top = m_nViewAlignTop + (m_nCharHeight + m_pcEditDoc->GetDocumentAttribute().m_nLineSpace) * (m_nCaretPosY - m_nViewTopLine);
ps.rcPaint.top = m_nViewAlignTop;
ps.rcPaint.bottom = m_nViewAlignTop + m_nViewCy;
// OnKillFocus();
OnPaint( hdc, &ps, TRUE ); /* メモリDCを使用してちらつきのない再描画 */
// OnSetFocus();
::ReleaseDC( m_hWnd, hdc );
}
/* 選択エリアの先頭へカーソルを移動 */
::UpdateWindow( m_hWnd );
MoveCursor( nSelectColmFrom_Old, nSelectLineFrom_Old, bRedraw );
m_nCaretPosX_Prev = m_nCaretPosX;
if( !m_bDoing_UndoRedo ){ /* アンドゥ?リドゥの実行中か */
pcOpe = new COpe;
pcOpe->m_nOpe = OPE_MOVECARET; /* 操作種別 */
m_pcEditDoc->m_cLayoutMgr.CaretPos_Log2Phys(
nCaretPosXOld,
nCaretPosYOld,
&pcOpe->m_nCaretPosX_PHY_Before,
&pcOpe->m_nCaretPosY_PHY_Before
);
pcOpe->m_nCaretPosX_PHY_After = m_nCaretPosX_PHY; /* 操作後のキャレット位置X */
pcOpe->m_nCaretPosY_PHY_After = m_nCaretPosY_PHY; /* 操作後のキャレット位置Y */
/* 操作の追加 */
m_pcOpeBlk->AppendOpe( pcOpe );
}
}else{
/* データ置換 削除&挿入にも使える */
ReplaceData_CEditView(
m_nSelectLineFrom, /* 範囲選択開始行 */
m_nSelectColmFrom, /* 範囲選択開始桁 */
m_nSelectLineTo, /* 範囲選択終了行 */
m_nSelectColmTo, /* 範囲選択終了桁 */
NULL, /* 削除されたデータのコピー(NULL可能) */
"", /* 挿入するデータ */
0, /* 挿入するデータの長さ */
bRedraw
);
}
}else{
/* 現在行のデータを取得 */
pLine = m_pcEditDoc->m_cLayoutMgr.GetLineStr( m_nCaretPosY, &nLineLen, &pcLayout );
if( NULL == pLine ){
goto end_of_func;
// return;
}
/* 最後の行にカーソルがあるかどうか */
if( m_nCaretPosY == m_pcEditDoc->m_cLayoutMgr.GetLineCount() - 1 ){
bLastLine = 1;
}else{
bLastLine = 0;
}
/* 指定された桁に対応する行のデータ内の位置を調べる */
nCurIdx = LineColmnToIndex( pcLayout, m_nCaretPosX );
// MYTRACE("nLineLen=%d nCurIdx=%d \n", nLineLen, nCurIdx);
if( nCurIdx == nLineLen && bLastLine ){ /* 全テキストの最後 */
goto end_of_func;
// return;
}
/* 指定された桁の文字のバイト数を調べる */
if( pLine[nCurIdx] == '\r' || pLine[nCurIdx] == '\n' ){
/* 改行 */
nNxtIdx = nCurIdx + pcLayout->m_cEol.GetLen();
nNxtPos = m_nCaretPosX + pcLayout->m_cEol.GetLen();
}else{
nNxtIdx = CMemory::MemCharNext( pLine, nLineLen, &pLine[nCurIdx] ) - pLine;
/* 指定された行のデータ内の位置に対応する桁の位置を調べる */
nNxtPos = LineIndexToColmn( pcLayout, nNxtIdx );
}
/* データ置換 削除&挿入にも使える */
ReplaceData_CEditView(
m_nCaretPosY, /* 範囲選択開始行 */
m_nCaretPosX, /* 範囲選択開始桁 */
m_nCaretPosY, /* 範囲選択終了行 */
nNxtPos, /* 範囲選択終了桁 */
NULL, /* 削除されたデータのコピー(NULL可能) */
"", /* 挿入するデータ */
0, /* 挿入するデータの長さ */
bRedraw
);
}
m_pcEditDoc->SetModified(true,bRedraw); // Jan. 22, 2002 genta
if( m_pcEditDoc->m_cLayoutMgr.GetLineCount() > 0 ){
if( m_nCaretPosY > m_pcEditDoc->m_cLayoutMgr.GetLineCount() - 1 ){
/* 現在行のデータを取得 */
const CLayout* pcLayout;
pLine = m_pcEditDoc->m_cLayoutMgr.GetLineStr( m_pcEditDoc->m_cLayoutMgr.GetLineCount() - 1, &nLineLen, &pcLayout );
if( NULL == pLine ){
goto end_of_func;
}
/* 改行で終わっているか */
if( ( EOL_NONE != pcLayout->m_cEol ) ){
goto end_of_func;
}
/*ファイルの最後に移動 */
Command_GOFILEEND( FALSE );
}
}
end_of_func:;
return;
}
/* Undo 元に戻す */
void CEditView::Command_UNDO( void )
{
if( m_bBeginSelect ){ /* マウスによる範囲選択中 */
::MessageBeep( MB_ICONHAND );
return;
}
if( !m_pcEditDoc->IsEnableUndo() ){ /* Undo(元に戻す)可能な状態か? */
return;
}
MY_RUNNINGTIMER( cRunningTimer, "CEditView::Command_UNDO()" );
COpe* pcOpe = NULL;
COpeBlk* pcOpeBlk;
int nOpeBlkNum;
int i;
CMemory* pcMem;
int bIsModified;
// int nNewLine; /* 挿入された部分の次の位置の行 */
// int nNewPos; /* 挿入された部分の次の位置のデータ位置 */
HDC hdc;
PAINTSTRUCT ps;
CWaitCursor cWaitCursor( m_hWnd );
//@@@ 2002.01.03 YAZAKI 不使用のため
// BOOL bUndo; /* Undo操作かどうか */
// bUndo = TRUE; /* Undo操作かどうか */
int nCaretPosX_Before;
int nCaretPosY_Before;
// int nCaretPosX_To;
// int nCaretPosY_To;
int nCaretPosX_After;
int nCaretPosY_After;
/* 各種モードの取り消し */
Command_CANCEL_MODE();
m_bDoing_UndoRedo = TRUE; /* アンドゥ?リドゥの実行中か */
/* 現在のUndo対象の操作ブロックを返す */
if( NULL != ( pcOpeBlk = m_pcEditDoc->m_cOpeBuf.DoUndo( &bIsModified ) ) ){
m_bDrawSWITCH = FALSE; // hor
nOpeBlkNum = pcOpeBlk->GetNum();
for( i = nOpeBlkNum - 1; i >= 0; i-- ){
pcOpe = pcOpeBlk->GetOpe( i );
m_pcEditDoc->m_cLayoutMgr.CaretPos_Phys2Log(
pcOpe->m_nCaretPosX_PHY_After,
pcOpe->m_nCaretPosY_PHY_After,
&nCaretPosX_After,
&nCaretPosY_After
);
m_pcEditDoc->m_cLayoutMgr.CaretPos_Phys2Log(
pcOpe->m_nCaretPosX_PHY_Before,
pcOpe->m_nCaretPosY_PHY_Before,
&nCaretPosX_Before,
&nCaretPosY_Before
);
// 2002.02.16 hor
// if( i == nOpeBlkNum - 1 ){
// /* カーソルを移動 */
// MoveCursor( nCaretPosX_After, nCaretPosY_After, TRUE );
// }else{
/* カーソルを移動 */
MoveCursor( nCaretPosX_After, nCaretPosY_After, FALSE );
// }
switch( pcOpe->m_nOpe ){
case OPE_INSERT:
pcMem = new CMemory;
/* 選択範囲の変更 */
m_nSelectLineBgnFrom = nCaretPosY_Before; /* 範囲選択開始行(原点) */
m_nSelectColmBgnFrom = nCaretPosX_Before; /* 範囲選択開始桁(原点) */
m_nSelectLineBgnTo = m_nSelectLineBgnFrom; /* 範囲選択開始行(原点) */
m_nSelectColmBgnTo = m_nSelectColmBgnFrom; /* 範囲選択開始桁(原点) */
m_nSelectLineFrom = nCaretPosY_Before;
m_nSelectColmFrom = nCaretPosX_Before;
m_nSelectLineTo = nCaretPosY_After;
m_nSelectColmTo = nCaretPosX_After;
// GetSelectedData( *pcMem, FALSE, NULL, FALSE );
// DeleteData(
// FALSE,
// bUndo /* Undo操作かどうか */
// );
/* データ置換 削除&挿入にも使える */
ReplaceData_CEditView(
m_nSelectLineFrom, /* 範囲選択開始行 */
m_nSelectColmFrom, /* 範囲選択開始桁 */
m_nSelectLineTo, /* 範囲選択終了行 */
m_nSelectColmTo, /* 範囲選択終了桁 */
pcMem, /* 削除されたデータのコピー(NULL可能) */
"", /* 挿入するデータ */
0, /* 挿入するデータの長さ */
FALSE /*再描画するか否か*/
);
/* 選択範囲の変更 */
m_nSelectLineBgnFrom = -1; /* 範囲選択開始行(原点) */
m_nSelectColmBgnFrom = -1; /* 範囲選択開始桁(原点) */
m_nSelectLineBgnTo = -1; /* 範囲選択開始行(原点) */
m_nSelectColmBgnTo = -1; /* 範囲選択開始桁(原点) */
m_nSelectLineFrom = -1;
m_nSelectColmFrom = -1;
m_nSelectLineTo = -1;
m_nSelectColmTo = -1;
pcOpe->m_pcmemData = pcMem;
// if( 0 == pcMem->GetLength() ){
// MYTRACE( "?? ERROR\n" );
// }
break;
case OPE_DELETE:
pcMem = new CMemory;
if( 0 < pcOpe->m_pcmemData->GetLength() ){
/* データ置換 削除&挿入にも使える */
ReplaceData_CEditView(
nCaretPosY_Before, /* 範囲選択開始行 */
nCaretPosX_Before, /* 範囲選択開始桁 */
nCaretPosY_Before, /* 範囲選択終了行 */
nCaretPosX_Before, /* 範囲選択終了桁 */
pcMem, /* 削除されたデータのコピー(NULL可能) */
pcOpe->m_pcmemData->GetPtr(), /* 挿入するデータ */
pcOpe->m_nDataLen, /* 挿入するデータの長さ */
FALSE /*再描画するか否か*/
);
// InsertData_CEditView(
// nCaretPosX_Before,
// nCaretPosY_Before,
// pcOpe->m_pcmemData->GetPtr(),
// pcOpe->m_nDataLen,
// &nNewLine,
// &nNewPos,
// NULL,
// FALSE,
// bUndo /* Undo操作かどうか */
// );
}
delete pcOpe->m_pcmemData;
pcOpe->m_pcmemData = NULL;
break;
case OPE_MOVECARET:
/* カーソルを移動 */
MoveCursor( nCaretPosX_After, nCaretPosY_After, FALSE/*TRUE 2002.02.16 hor */ );
break;
}
m_pcEditDoc->m_cLayoutMgr.CaretPos_Phys2Log(
pcOpe->m_nCaretPosX_PHY_Before,
pcOpe->m_nCaretPosY_PHY_Before,
&nCaretPosX_Before,
&nCaretPosY_Before
);
if( i == 0 ){
/* カーソルを移動 */
MoveCursor( nCaretPosX_Before, nCaretPosY_Before, TRUE );
}else{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -