📄 ceditview_command_new.cpp
字号:
/* カーソルを移動 */
MoveCursor( nCaretPosX_Before, nCaretPosY_Before, FALSE );
}
}
m_bDrawSWITCH = TRUE; // hor
/* Undo後の変更フラグ */
m_pcEditDoc->SetModified(bIsModified,true); // Jan. 22, 2002 genta
m_bDoing_UndoRedo = FALSE; /* アンドゥ?リドゥの実行中か */
SetBracketPairPos( true ); // 03/03/07 ai
/* 再描画 */
hdc = ::GetDC( m_hWnd );
ps.rcPaint.left = 0;
ps.rcPaint.right = m_nViewAlignLeft + m_nViewCx;
ps.rcPaint.top = m_nViewAlignTop;
ps.rcPaint.bottom = m_nViewAlignTop + m_nViewCy;
// OnKillFocus();
OnPaint( hdc, &ps, TRUE ); /* メモリDCを使用してちらつきのない再描画 */
// OnSetFocus();
DispRuler( hdc );
::ReleaseDC( m_hWnd, hdc );
/* 行番号表示に必要な幅を設定 */
if( m_pcEditDoc->DetectWidthOfLineNumberAreaAllPane( TRUE ) ){
/* キャレットの表示?更新 */
ShowEditCaret();
}
m_pcEditDoc->RedrawInactivePane();/* 他のペインの表示状態を更新 */
#if 0
// 2001/06/21 Start by asa-o: 他のペインの表示状態を更新
m_pcEditDoc->m_cEditViewArr[m_nMyIndex^1].Redraw();
m_pcEditDoc->m_cEditViewArr[m_nMyIndex^2].Redraw();
m_pcEditDoc->m_cEditViewArr[(m_nMyIndex^1)^2].Redraw();
// 2001/06/21 End
#endif
}
m_bDoing_UndoRedo = FALSE; /* アンドゥ?リドゥの実行中か */
return;
}
/* Redo やり直し */
void CEditView::Command_REDO( void )
{
if( m_bBeginSelect ){ /* マウスによる範囲選択中 */
::MessageBeep( MB_ICONHAND );
return;
}
if( !m_pcEditDoc->IsEnableRedo() ){ /* Redo(やり直し)可能な状態か? */
return;
}
MY_RUNNINGTIMER( cRunningTimer, "CEditView::Command_REDO()" );
COpe* pcOpe = NULL;
COpeBlk* pcOpeBlk;
int nOpeBlkNum;
int i;
CMemory* pcMem;
// int nNewLine; /* 挿入された部分の次の位置の行 */
// int nNewPos; /* 挿入された部分の次の位置のデータ位置 */
int bIsModified;
HDC hdc;
PAINTSTRUCT ps;
CWaitCursor cWaitCursor( m_hWnd );
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; /* アンドゥ?リドゥの実行中か */
/* 現在のRedo対象の操作ブロックを返す */
if( NULL != ( pcOpeBlk = m_pcEditDoc->m_cOpeBuf.DoRedo( &bIsModified ) ) ){
nOpeBlkNum = pcOpeBlk->GetNum();
for( i = 0; i < nOpeBlkNum; ++i ){
pcOpe = pcOpeBlk->GetOpe( i );
/*
カーソル位置変換
物理位置(行頭からのバイト数、折り返し無し行位置)
→
レイアウト位置(行頭からの表示桁位置、折り返しあり行位置)
*/
// int nPosX2;
// int nPosY2;
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{
/* カーソルを移動 */
MoveCursor( nCaretPosX_Before, nCaretPosY_Before, FALSE );
}
switch( pcOpe->m_nOpe ){
case OPE_INSERT:
pcMem = new CMemory;
if( 0 < pcOpe->m_pcmemData->GetLength() ){
/* データ置換 削除&挿入にも使える */
ReplaceData_CEditView(
nCaretPosY_Before, /* 範囲選択開始行 */
nCaretPosX_Before, /* 範囲選択開始桁 */
nCaretPosY_Before, /* 範囲選択終了行 */
nCaretPosX_Before, /* 範囲選択終了桁 */
NULL, /* 削除されたデータのコピー(NULL可能) */
pcOpe->m_pcmemData->GetPtr(), /* 挿入するデータ */
pcOpe->m_pcmemData->GetLength(), /* 挿入するデータの長さ */
FALSE /*再描画するか否か*/
);
// InsertData_CEditView(
// nCaretPosX_Before,
// nCaretPosY_Before,
// pcOpe->m_pcmemData->GetPtr(),
// pcOpe->m_pcmemData->GetLength(),//*pcOpe->m_nDataLen,
// &nNewLine,
// &nNewPos,
// NULL,
// FALSE
// );
}
delete pcOpe->m_pcmemData;
pcOpe->m_pcmemData = NULL;
break;
case OPE_DELETE:
pcMem = new CMemory;
m_pcEditDoc->m_cLayoutMgr.CaretPos_Phys2Log(
pcOpe->m_nCaretPosX_PHY_To,
pcOpe->m_nCaretPosY_PHY_To,
&nCaretPosX_To,
&nCaretPosY_To
);
/* データ置換 削除&挿入にも使える */
ReplaceData_CEditView(
nCaretPosY_Before, /* 範囲選択開始行 */
nCaretPosX_Before, /* 範囲選択開始桁 */
nCaretPosY_To, /* 範囲選択終了行 */
nCaretPosX_To, /* 範囲選択終了桁 */
pcMem, /* 削除されたデータのコピー(NULL可能) */
"", /* 挿入するデータ */
0, /* 挿入するデータの長さ */
FALSE
);
// 199.12.20
// DeleteData2(
// pcOpe->m_nCaretPosX_Before,
// pcOpe->m_nCaretPosY_Before,
// pcOpe->m_nDataLen,
// pcMem,
// NULL,
// FALSE,
// FALSE
// );
pcOpe->m_pcmemData = pcMem;
break;
case OPE_MOVECARET:
break;
}
m_pcEditDoc->m_cLayoutMgr.CaretPos_Phys2Log(
pcOpe->m_nCaretPosX_PHY_After,
pcOpe->m_nCaretPosY_PHY_After,
&nCaretPosX_After,
&nCaretPosY_After
);
if( i == nOpeBlkNum - 1 ){
/* カーソルを移動 */
MoveCursor( nCaretPosX_After, nCaretPosY_After, TRUE );
}else{
/* カーソルを移動 */
MoveCursor( nCaretPosX_After, nCaretPosY_After, FALSE );
}
}
/* Redo後の変更フラグ */
m_pcEditDoc->SetModified(bIsModified,true); // Jan. 22, 2002 genta
m_bDoing_UndoRedo = FALSE; /* アンドゥ?リドゥの実行中か */
SetBracketPairPos( true ); // 03/03/07 ai
/* 再描画 */
hdc = ::GetDC( m_hWnd );
ps.rcPaint.left = 0;
ps.rcPaint.right = m_nViewAlignLeft + m_nViewCx;
ps.rcPaint.top = m_nViewAlignTop;
ps.rcPaint.bottom = m_nViewAlignTop + m_nViewCy;
// OnKillFocus();
OnPaint( hdc, &ps, TRUE ); /* メモリDCを使用してちらつきのない再描画 */
// OnSetFocus();
::ReleaseDC( m_hWnd, hdc );
/* 行番号表示に必要な幅を設定 */
if( m_pcEditDoc->DetectWidthOfLineNumberAreaAllPane( TRUE ) ){
/* キャレットの表示?更新 */
ShowEditCaret();
}
m_pcEditDoc->RedrawInactivePane();/* 他のペインの表示状態を更新 */
#if 0
// 2001/06/21 Start by asa-o: 他のペインの表示状態を更新
m_pcEditDoc->m_cEditViewArr[m_nMyIndex^1].Redraw();
m_pcEditDoc->m_cEditViewArr[m_nMyIndex^2].Redraw();
m_pcEditDoc->m_cEditViewArr[(m_nMyIndex^1)^2].Redraw();
// 2001/06/21 End
#endif
}
m_bDoing_UndoRedo = FALSE; /* アンドゥ?リドゥの実行中か */
return;
}
/* データ置換 削除&挿入にも使える */
void CEditView::ReplaceData_CEditView(
int nDelLineFrom, /* 削除範囲行 From レイアウト行番号 */
int nDelColmFrom, /* 削除範囲位置From レイアウト行桁位置 */
int nDelLineTo, /* 削除範囲行 To レイアウト行番号 */
int nDelColmTo, /* 削除範囲位置To レイアウト行桁位置 */
CMemory* pcmemCopyOfDeleted, /* 削除されたデータのコピー(NULL可能) */
const char* pInsData, /* 挿入するデータ */
int nInsDataLen, /* 挿入するデータの長さ */
BOOL bRedraw
// BOOL bUndo /* Undo操作かどうか */
)
{
{
// Jun 23, 2000 genta
// 変数名を書き換え忘れていたのを修正
// Jun. 1, 2000 genta
// DeleteDataから移動した
// May. 29, 2000 genta
// From Here
// 行の後ろが選択されていたときの不具合を回避するため,
// 選択領域から行末以降の部分を取り除く.
// 先頭
int len, pos;
const char *line;
const CLayout* pcLayout;
line = m_pcEditDoc->m_cLayoutMgr.GetLineStr( nDelLineFrom, &len, &pcLayout );
// Jun. 1, 2000 genta
// ちゃんとNULLチェックしましょう
if( line != NULL ){
pos = LineColmnToIndex( pcLayout, nDelColmFrom );
// Jun. 1, 2000 genta
// 同一行の行末以降のみが選択されている場合を考慮する
// Aug. 22, 2000 genta
// 開始位置がEOFの後ろのときは次行に送る処理を行わない
// これをやってしまうと存在しない行をPointして落ちる.
if( nDelLineFrom < m_pcEditDoc->m_cLayoutMgr.GetLineCount() - 1 && pos >= len){
if( nDelLineFrom == nDelLineTo ){
// m_nSelectLineFrom <= m_nSelectLineTo はチェックしない
++nDelLineFrom;
nDelLineTo = nDelLineFrom;
nDelColmTo = nDelColmFrom = 0;
}
else {
nDelLineFrom++;
nDelColmFrom = 0;
}
}
}
// 末尾
line = m_pcEditDoc->m_cLayoutMgr.GetLineStr( nDelLineTo, &len, &pcLayout );
if( line != NULL ){
pos = LineIndexToColmn( pcLayout, len );
if( nDelColmTo > pos ){
nDelColmTo = pos;
}
}
// To Here
}
COpe* pcOpe = NULL; /* 編集操作要素 COpe */
CMemory* pcMemDeleted;
int nCaretPosXOld;
int nCaretPosYOld;
int nCaretPosX_PHY_Old;
int nCaretPosY_PHY_Old;
nCaretPosXOld = m_nCaretPosX;
nCaretPosYOld = m_nCaretPosY;
nCaretPosX_PHY_Old = m_nCaretPosX_PHY;
nCaretPosY_PHY_Old = m_nCaretPosY_PHY;
if( !m_bDoing_UndoRedo ){ /* アンドゥ?リドゥの実行中か */
pcOpe = new COpe;
pcOpe->m_nOpe = OPE_MOVECARET; /* 操作種別 */
// pcOpe->m_nCaretPosX_Before = m_nCaretPosX; /* 操作前のキャレット位置X */
// pcOpe->m_nCaretPosY_Before = m_nCaretPosY; /* 操作前のキャレット位置Y */
pcOpe->m_nCaretPosX_PHY_Before = m_nCaretPosX_PHY; /* 操作前のキャレット位置X */
pcOpe->m_nCaretPosY_PHY_Before = m_nCaretPosY_PHY; /* 操作前のキャレット位置Y */
// pcOpe->m_nCaretPosX_After = m_nCaretPosX; /* 操作後のキャレット位置X */
// pcOpe->m_nCaretPosY_After = m_nCaretPosY; /* 操作後のキャレット位置Y */
// pcOpe->m_nCaretPosX_PHY_After = m_nCaretPosX_PHY; /* 操作後のキャレット位置X */
// pcOpe->m_nCaretPosY_PHY_After = 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_bDoing_UndoRedo ){ /* アンドゥ?リドゥの実行中か */
pcOpe = new COpe;
pcOpe->m_nOpe = OPE_DELETE; /* 操作種別 */
// pcOpe->m_nCaretPosX_Before = nDelColmFrom/*m_nCaretPosX*/; /* 操作前のキャレット位置X */
// pcOpe->m_nCaretPosY_Before = nDelLineFrom/*m_nCaretPosY*/; /* 操作前のキャレット位置Y */
// m_pcEditDoc->m_cLayoutMgr.CaretPos_Log2Phys(
// pcOpe->m_nCaretPosX_Before,
// pcOpe->m_nCaretPosY_Before,
// &pcOpe->m_nCaretPosX_PHY_Before,
// &pcOpe->m_nCaretPosY_PHY_Before
// );
m_pcEditDoc->m_cLayoutMgr.CaretPos_Log2Phys(
nDelColmFrom/*m_nCaretPosX*/,
nDelLineFrom/*m_nCaretPosY*/,
&pcOpe->m_nCaretPosX_PHY_Before,
&pcOpe->m_nCaretPosY_PHY_Before
);
// pcOpe->m_nCaretPosX_To = nDelColmTo; /* 操作前のキャレット位置X */
// pcOpe->m_nCaretPosY_To = nDelLineTo; /* 操作前のキャレット位置Y */
// m_pcEditDoc->m_cLayoutMgr.CaretPos_Log2Phys(
// pcOpe->m_nCaretPosX_To,
// pcOpe->m_nCaretPosY_To,
// &pcOpe->m_nCaretPosX_PHY_To,
// &pcOpe->m_nCaretPosY_PHY_To
// );
m_pcEditDoc->m_cLayoutMgr.CaretPos_Log2Phys(
nDelColmTo,
nDelLineTo,
&pcOpe->m_nCaretPosX_PHY_To,
&pcOpe->m_nCaretPosY_PHY_To
);
// pcOpe->m_nCaretPosX_After = pcOpe->m_nCaretPosX_Before; /* 操作後のキャレット位置X */
// pcOpe->m_nCaretPosY_After = pcOpe->m_nCaretPosY_Before; /* 操作後のキャレット位置Y */
pcOpe->m_nCaretPosX_PHY_After = pcOpe->m_nCaretPosX_PHY_Before; /* 操作後のキャレット位置X */
pcOpe->m_nCaretPosY_PHY_After = pcOpe->m_nCaretPosY_PHY_Before; /* 操作後のキャレット位置Y */
// m_pcEditDoc->m_cLayoutMgr.CaretPos_Log2Phys(
// pcOpe->m_nCaretPosX_After,
// pcOpe->m_nCaretPosY_After,
// &pcOpe->m_nCaretPosX_PHY_After,
// &pcOpe->m_nCaretPosY_PHY_After
// );
}else{
pcOpe = NULL;
}
pcMemDeleted = new CMemory;
/*
|| バッファサイズの調整
*/
if( 2000 < nDelLineTo - nDelLineFrom ){
pcMemDeleted->AllocBuffer( 1024000 );
}
/* 文字列置換 */
// int nAddLineNum; /* 再描画ヒント レイアウト行の増減 */
// int nModLineFrom; /* 再描画ヒント 変更されたレイアウト行From(レイアウト行の増減が0のとき使う) */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -