📄 ceditview_command_new.cpp
字号:
// int nModLineTo; /* 再描画ヒント 変更されたレイアウト行From(レイアウト行の増減が0のとき使う) */
// int nNewLine; /* 挿入された部分の次の位置の行(レイアウト行) */
// int nNewPos; /* 挿入された部分の次の位置のデータ位置(レイアウト桁位置) */
LayoutReplaceArg LRArg;
LRArg.nDelLineFrom = nDelLineFrom; /* 削除範囲行 From レイアウト行番号 */
LRArg.nDelColmFrom = nDelColmFrom; /* 削除範囲位置From レイアウト行桁位置 */
LRArg.nDelLineTo = nDelLineTo; /* 削除範囲行 To レイアウト行番号 */
LRArg.nDelColmTo = nDelColmTo; /* 削除範囲位置To レイアウト行桁位置 */
LRArg.pcmemDeleted = pcMemDeleted; /* 削除されたデータ */
LRArg.pInsData = pInsData; /* 挿入するデータ */
LRArg.nInsDataLen = nInsDataLen; /* 挿入するデータの長さ */
// LRArg.nAddLineNum = 0; /* 再描画ヒント レイアウト行の増減 */
// LRArg.nModLineFrom = 0; /* 再描画ヒント 変更されたレイアウト行From(レイアウト行の増減が0のとき使う) */
// LRArg.nModLineTo = 0; /* 再描画ヒント 変更されたレイアウト行From(レイアウト行の増減が0のとき使う) */
// LRArg.nNewLine = 0; /* 挿入された部分の次の位置の行(レイアウト行) */
// LRArg.nNewPos = 0; /* 挿入された部分の次の位置のデータ位置(レイアウト桁位置) */
LRArg.bDispSSTRING = m_pcEditDoc->GetDocumentAttribute().m_ColorInfoArr[COLORIDX_SSTRING].m_bDisp; /* シングルクォーテーション文字列を表示する */
LRArg.bDispWSTRING = m_pcEditDoc->GetDocumentAttribute().m_ColorInfoArr[COLORIDX_WSTRING].m_bDisp; /* ダブルクォーテーション文字列を表示する */
// LRArg.bUndo = m_bDoing_UndoRedo; /* Undo操作かどうか */
m_pcEditDoc->m_cLayoutMgr.ReplaceData_CLayoutMgr(
&LRArg
#if 0
nDelLineFrom, /* 削除範囲行 From レイアウト行番号 */
nDelColmFrom, /* 削除範囲位置From レイアウト行桁位置 */
nDelLineTo, /* 削除範囲行 To レイアウト行番号 */
nDelColmTo, /* 削除範囲位置To レイアウト行桁位置 */
pcMemDeleted, /* 削除されたデータ */
pInsData, /* 挿入するデータ */
nInsDataLen, /* 挿入するデータの長さ */
&nAddLineNum, /* 再描画ヒント レイアウト行の増減 */
&nModLineFrom, /* 再描画ヒント 変更されたレイアウト行From(レイアウト行の増減が0のとき使う) */
&nModLineTo, /* 再描画ヒント 変更されたレイアウト行From(レイアウト行の増減が0のとき使う) */
&nNewLine, /* 挿入された部分の次の位置の行(レイアウト行) */
&nNewPos, /* 挿入された部分の次の位置のデータ位置(レイアウト桁位置) */
m_pcEditDoc->GetDocumentAttribute().m_ColorInfoArr[COLORIDX_SSTRING].m_bDisp, /* シングルクォーテーション文字列を表示する */
m_pcEditDoc->GetDocumentAttribute().m_ColorInfoArr[COLORIDX_WSTRING].m_bDisp, /* ダブルクォーテーション文字列を表示する */
m_bDoing_UndoRedo /* Undo操作かどうか */
#endif
);
// Jan. 30, 2001 genta
// 再描画の時点でファイル更新フラグが適切になっていないといけないので
// 関数の末尾からここへ移動
/* 状態遷移 */
if( FALSE == m_bDoing_UndoRedo ){ /* アンドゥ?リドゥの実行中か */
m_pcEditDoc->SetModified(true,bRedraw); // Jan. 22, 2002 genta
}
/* 現在の選択範囲を非選択状態に戻す */
DisableSelectArea( bRedraw );
/* 行番号表示に必要な幅を設定 */
if( m_pcEditDoc->DetectWidthOfLineNumberAreaAllPane( bRedraw ) ){
/* キャレットの表示?更新 */
ShowEditCaret();
}else{
if( bRedraw ){
/* 再描画 */
HDC hdc;
PAINTSTRUCT ps;
hdc = ::GetDC( m_hWnd );
/* 再描画ヒント レイアウト行の増減 */
// Jan. 30, 2001 genta 貼り付けで行数が減る場合の考慮が抜けていた
if( 0 != LRArg.nAddLineNum ){
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); // 2002.02.25 Del By KK 次で上書きされているため未使用。
//ps.rcPaint.top = 0/*m_nViewAlignTop*/; // 2002.02.25 Del By KK
ps.rcPaint.top = m_nViewAlignTop - m_nTopYohaku; // ルーラーを範囲に含めない。2002.02.25 Add By KK
ps.rcPaint.bottom = m_nViewAlignTop + m_nViewCy;
}else{
ps.rcPaint.left = 0;
ps.rcPaint.right = m_nViewAlignLeft + m_nViewCx;
/* 再描画ヒント 変更されたレイアウト行From(レイアウト行の増減が0のとき使う) */
ps.rcPaint.top = m_nViewAlignTop + (LRArg.nModLineFrom - m_nViewTopLine)* (m_nCharHeight + m_pcEditDoc->GetDocumentAttribute().m_nLineSpace);
if( m_pcEditDoc->GetDocumentAttribute().m_bWordWrap
|| m_pcEditDoc->GetDocumentAttribute().m_bKinsokuHead //@@@ 2002.04.19 MIK
|| m_pcEditDoc->GetDocumentAttribute().m_bKinsokuTail //@@@ 2002.04.19 MIK
|| m_pcEditDoc->GetDocumentAttribute().m_bKinsokuRet //@@@ 2002.04.19 MIK
|| m_pcEditDoc->GetDocumentAttribute().m_bKinsokuKuto ) //@@@ 2002.04.19 MIK
{
ps.rcPaint.top -= (m_nCharHeight + m_pcEditDoc->GetDocumentAttribute().m_nLineSpace);
}
if( ps.rcPaint.top < 0 ){
ps.rcPaint.top = 0;
}
ps.rcPaint.bottom = m_nViewAlignTop + (LRArg.nModLineTo - m_nViewTopLine + 1)* (m_nCharHeight + m_pcEditDoc->GetDocumentAttribute().m_nLineSpace);
if( m_nViewAlignTop + m_nViewCy < ps.rcPaint.bottom ){
ps.rcPaint.bottom = m_nViewAlignTop + m_nViewCy;
}
}
// OnKillFocus();
OnPaint( hdc, &ps, TRUE ); /* メモリDCを使用してちらつきのない再描画 */
// OnSetFocus();
::ReleaseDC( m_hWnd, hdc );
}
}
/* 削除されたデータのコピー(NULL可能) */
if( NULL != pcmemCopyOfDeleted /* 削除されたデータのコピー(NULL可能) */
&& 0 < pcMemDeleted->GetLength() /* 削除したデータの長さ */
){
*pcmemCopyOfDeleted = *pcMemDeleted;
}
if( !m_bDoing_UndoRedo /* アンドゥ?リドゥの実行中か */
&& 0 < pcMemDeleted->GetLength() /* 削除したデータの長さ */
){
pcOpe->m_nDataLen = pcMemDeleted->GetLength(); /* 操作に関連するデータのサイズ */
pcOpe->m_pcmemData = pcMemDeleted; /* 操作に関連するデータ */
/* 操作の追加 */
m_pcOpeBlk->AppendOpe( pcOpe );
}else{
delete pcMemDeleted;
pcMemDeleted = NULL;
}
if( !m_bDoing_UndoRedo /* アンドゥ?リドゥの実行中か */
&& 0 < nInsDataLen /* 挿入するデータの長さ */
){
pcOpe = new COpe;
pcOpe->m_nOpe = OPE_INSERT; /* 操作種別 */
// pcOpe->m_nCaretPosX_Before = nDelColmFrom/*m_nCaretPosX*/; /* 操作前のキャレット位置X */
// pcOpe->m_nCaretPosY_Before = nDelLineFrom/*m_nCaretPosY*/; /* 操作前のキャレット位置Y */
m_pcEditDoc->m_cLayoutMgr.CaretPos_Log2Phys(
nDelColmFrom,
nDelLineFrom,
&pcOpe->m_nCaretPosX_PHY_Before,
&pcOpe->m_nCaretPosY_PHY_Before
);
m_pcEditDoc->m_cLayoutMgr.CaretPos_Log2Phys(
LRArg.nNewPos,
LRArg.nNewLine,
&pcOpe->m_nCaretPosX_PHY_To,
&pcOpe->m_nCaretPosY_PHY_To
);
pcOpe->m_nCaretPosX_PHY_After = pcOpe->m_nCaretPosX_PHY_To;
pcOpe->m_nCaretPosY_PHY_After = pcOpe->m_nCaretPosY_PHY_To;
/* 操作の追加 */
m_pcOpeBlk->AppendOpe( pcOpe );
}else{
pcOpe = NULL;
}
/* 挿入直後位置へカーソルを移動 */
MoveCursor(
LRArg.nNewPos, /* 挿入された部分の次の位置のデータ位置(レイアウト桁位置) */
LRArg.nNewLine, /* 挿入された部分の次の位置の行(レイアウト行) */
bRedraw
);
m_nCaretPosX_Prev = m_nCaretPosX;
if( !m_bDoing_UndoRedo ){ /* アンドゥ?リドゥの実行中か */
pcOpe = new COpe;
pcOpe->m_nOpe = OPE_MOVECARET; /* 操作種別 */
// pcOpe->m_nCaretPosX_Before = nCaretPosXOld; /* 操作前のキャレット位置X */
// pcOpe->m_nCaretPosY_Before = nCaretPosYOld; /* 操作前のキャレット位置Y */
pcOpe->m_nCaretPosX_PHY_Before = nCaretPosX_PHY_Old; /* 操作後のキャレット位置X */
pcOpe->m_nCaretPosY_PHY_Before = nCaretPosY_PHY_Old; /* 操作後のキャレット位置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 */
// m_pcEditDoc->m_cLayoutMgr.CaretPos_Log2Phys(
// pcOpe->m_nCaretPosX_After,
// pcOpe->m_nCaretPosY_After,
// &pcOpe->m_nCaretPosX_PHY_After,
// &pcOpe->m_nCaretPosY_PHY_After
// );
/* 操作の追加 */
m_pcOpeBlk->AppendOpe( pcOpe );
}
// Jan. 30, 2001 genta
// ファイル全体の更新フラグが立っていないと各行の更新状態が表示されないので
// フラグ更新処理を再描画より前に移動する
return;
}
/* C/C++スマートインデント処理 */
void CEditView::SmartIndent_CPP( char cChar )
{
//! 2000.1.12 編集動作とスマートインデントのUndo/Redoバッファを分ける場合
//!
//! /* アンドゥバッファの処理 */
//! if( NULL != m_pcOpeBlk ){
//! if( 0 < m_pcOpeBlk->GetNum() ){ /* 操作の数を返す */
//! /* 操作の追加 */
//! m_pcEditDoc->m_cOpeBuf.AppendOpeBlk( m_pcOpeBlk );
//! }else{
//! delete m_pcOpeBlk;
//! }
//! m_pcOpeBlk = NULL;
//! }
//! /* アンドゥバッファの処理 */
//! m_pcOpeBlk = new COpeBlk;
const char* pLine;
int nLineLen;
int i;
int j;
int k;
int m;
const char* pLine2;
int nLineLen2;
int nLevel;
/* 調整によって置換される箇所 */
int nXFm = -1;
int nYFm = -1;
int nXTo = -1;
int nYTo = -1;
char* pszData = NULL;
int nDataLen;
int nCPX;
int nCPY;
COpe* pcOpe = NULL;
int nWork;
int nCaretPosX_PHY;
CDocLine* pCDocLine = NULL;
int nCharChars;
int nSrcLen;
char pszSrc[1024];
BOOL bChange;
switch( cChar ){
case CR:
case ':':
case '}':
case ')':
case '{':
case '(':
break;
default:
return;
}
switch( cChar ){
case CR:
case ':':
case '}':
case ')':
case '{':
case '(':
/* インデント調整可能か */
// if( 0 >= m_nCaretPosY_PHY ){
// return;
// }
nCaretPosX_PHY = m_nCaretPosX_PHY;
pLine = m_pcEditDoc->m_cDocLineMgr.GetLineStr( m_nCaretPosY_PHY, &nLineLen );
if( NULL == pLine ){
if( CR != cChar ){
return;
}
/* 調整によって置換される箇所 */
nXFm = 0;
nYFm = m_nCaretPosY_PHY;
nXTo = 0;
nYTo = m_nCaretPosY_PHY;
}else{
pCDocLine = m_pcEditDoc->m_cDocLineMgr.GetLineInfo( m_nCaretPosY_PHY );
// nWorkに処理の基準桁位置を設定する
if( CR != cChar ){
nWork = nCaretPosX_PHY - 1;
}else{
/*
|| CRが入力された時、カーソル直後の識別子をインデントする。
|| カーソル直後の識別子が'}'や')'ならば
|| '}'や')'が入力された時と同じ処理をする
*/
for( i = nCaretPosX_PHY; i < nLineLen; i++ ){
if( TAB != pLine[i] && SPACE != pLine[i] ){
break;
}
}
if( i < nLineLen ){
nCharChars = CMemory::MemCharNext( pLine, nLineLen, &pLine[i] ) - &pLine[i];
if( 1 == nCharChars && ( pLine[i] == ')' || pLine[i] == '}' ) ){
cChar = pLine[i];
}
nCaretPosX_PHY = i;
nWork = nCaretPosX_PHY;
}else{
nWork = nCaretPosX_PHY;
}
}
for( i = 0; i < nWork; i++ ){
if( TAB != pLine[i] && SPACE != pLine[i] ){
break;
}
}
if( i < nWork ){
if( ( ':' == cChar
&& (
0 == strncmp( &pLine[i], "case", 4 )
|| 0 == strncmp( &pLine[i], "default:", 8 )
|| 0 == strncmp( &pLine[i], "public:", 7 )
|| 0 == strncmp( &pLine[i], "private:", 8 )
|| 0 == strncmp( &pLine[i], "protected:", 10 )
)
)
// Sep. 18, 2002 かろと
|| (( '{' == cChar ) && ( '#' != pLine[i] ))
|| (( '(' == cChar ) && ( '#' != pLine[i] ))
){
}else{
return;
}
}else{
if( ':' == cChar ){
return;
}
}
/* 調整によって置換される箇所 */
nXFm = 0;
nYFm = m_nCaretPosY_PHY;
nXTo = i;
nYTo = m_nCaretPosY_PHY;
}
/* 対応する括弧をさがす */
nLevel = 0; /* {}の入れ子レベル */
// bString = FALSE;
nDataLen = 0;
for( j = m_nCaretPosY_PHY; j >= 0 && NULL != ( pLine2 = m_pcEditDoc->m_cDocLineMgr.GetLineStr( j, &nLineLen2 ) ); --j ){
if( j == m_nCaretPosY_PHY ){
nCharChars = &pLine2[nWork] - CMemory::MemCharPrev( pLine2, nLineLen2, &pLine2[nWork] );
k = nWork - nCharChars;
}else{
nCharChars = &pLine2[nLineLen2] - CMemory::MemCharPrev( pLine2, nLineLen2, &pLine2[nLineLen2] );
k = nLineLen2 - nCharChars;
}
for( ; k >= 0; /*k--*/ ){
if( 1 == nCharChars && ( '}' == pLine2[k] || ')' == pLine2[k] )
){
if( 0 < k && '\'' == pLine2[k - 1]
&& nLineLen2 - 1 > k && '\'' == pLine2[k + 1]
){
// MYTRACE( "▼[%s]\n", pLine2 );
}else{
//同じ行の場合
if( j == m_nCaretPosY_PHY ){
if( '{' == cChar && '}' == pLine2[k] ){
cChar = '}';
nLevel--; /* {}の入れ子レベル */
// return;
}
if( '(' == cChar && ')' == pLine2[k] ){
cChar = ')';
nLevel--; /* {}の入れ子レベル */
// return;
}
}
nLevel++; /* {}の入れ子レベル */
}
}
if( 1 == nCharChars && ( '{' == pLine2[k] || '(' == pLine2[k] )
){
if( 0 < k && '\'' == pLine2[k - 1]
&& nLineLen2 - 1 > k && '\'' == pLine2[k + 1]
){
// MYTRACE( "▼[%s]\n", pLine2 );
}else{
//同じ行の場合
if( j == m_nCaretPosY_PHY ){
if( '{' == cChar && '{' == pLine2[k] ){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -