⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ceditview_command_new.cpp

📁 日本的开源编辑器源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
//	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 + -