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

📄 ceditview_command_new.cpp

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