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

📄 ceditview_command_new.cpp

📁 日本的开源编辑器源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
				/* カーソルを移動 */
				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 + -