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

📄 copebuf.cpp

📁 日本的开源编辑器源码
💻 CPP
字号:
//	$Id: COpeBuf.cpp,v 1.6 2002/02/24 02:02:50 genta Exp $
/*!	@file
	@brief アンドゥ?リドゥバッファ

	@author Norio Nakatani
	@date 1998/06/09 新規作成
	$Revision: 1.6 $
*/
/*
	Copyright (C) 1998-2001, Norio Nakatani

	This source code is designed for sakura editor.
	Please contact the copyright holder to use this code for other purpose.
*/
#include "COpeBuf.h"
#include "COpeBlk.h"// 2002/2/10 aroka
#include "debug.h"

/* COpeBufクラス構築 */
COpeBuf::COpeBuf()
{
	m_nCOpeBlkArrNum = 0;	/* 操作ブロックの数 */
	m_ppCOpeBlkArr = NULL;	/* 操作ブロックの配列 */
	m_nCurrentPointer = 0;	/* 現在位置 */
	m_nNoModifiedIndex = 0;	/* 無変更な状態になった位置 */

	return;

}




/* COpeBufクラス消滅 */
COpeBuf::~COpeBuf()
{
	int		i;
	/* 操作ブロックの配列を削除する */
	if( 0 >= m_nCOpeBlkArrNum && NULL != m_ppCOpeBlkArr ){
		return;
	}
	for( i = 0; i < m_nCOpeBlkArrNum; ++i ){
		if( NULL != m_ppCOpeBlkArr[i] ){
			delete m_ppCOpeBlkArr[i];
			m_ppCOpeBlkArr[i] = NULL;
		}
	}
	free( m_ppCOpeBlkArr );
	m_ppCOpeBlkArr = NULL;
	m_nCOpeBlkArrNum = 0;
	return;
}





/* 操作の追加 */
int COpeBuf::AppendOpeBlk( COpeBlk* pcOpeBlk )
{
	int i;
//	pcOpeBlk->DUMP();
	/* 現在位置より後ろ(アンドゥ対象)がある場合は、消去 */
	if( m_nCurrentPointer < m_nCOpeBlkArrNum ){
		for( i = m_nCurrentPointer; i < m_nCOpeBlkArrNum; ++i ){
			if( NULL != m_ppCOpeBlkArr[i] ){
				delete m_ppCOpeBlkArr[i];
				m_ppCOpeBlkArr[i] = NULL;
			}
		}
		m_nCOpeBlkArrNum = m_nCurrentPointer;
		/* 配列の要素数がゼロになった場合は配列のメモリを解放 */
		if( 0 == m_nCOpeBlkArrNum ){
			free( m_ppCOpeBlkArr );
			m_ppCOpeBlkArr = NULL;
		}
	}
	/* 配列のメモリサイズを調整 */
	if( 0 == m_nCOpeBlkArrNum ){
		m_ppCOpeBlkArr = (COpeBlk**)malloc( sizeof( COpeBlk* ) );
	}else{
		m_ppCOpeBlkArr = (COpeBlk**)realloc( (void*)m_ppCOpeBlkArr,  sizeof( COpeBlk* ) * (m_nCOpeBlkArrNum + 1 ) );
	}
	if( NULL == m_ppCOpeBlkArr ){
		::MessageBox( 0, "COpeBlk::AppendOpe() error", "メモリ確保に失敗しました。\n非常に危険な状態です。", MB_OK );
		return FALSE;
	}
	m_ppCOpeBlkArr[m_nCOpeBlkArrNum] = pcOpeBlk;
	m_nCOpeBlkArrNum++;
	m_nCurrentPointer++;
	return TRUE;
}





/* Undo可能な状態か */
int COpeBuf::IsEnableUndo( void )
{
	if( 0 < m_nCOpeBlkArrNum && 0 < m_nCurrentPointer ){
		return TRUE;
	}else{
		return FALSE;
	}
}





/* Redo可能な状態か */
int	COpeBuf::IsEnableRedo( void )
{
	if( 0 < m_nCOpeBlkArrNum && m_nCurrentPointer < m_nCOpeBlkArrNum ){
		return TRUE;
	}else{
		return FALSE;
	}
}





/* 現在のUndo対象の操作ブロックを返す */
COpeBlk* COpeBuf::DoUndo( int* pbModified )
{
	/* Undo可能な状態か */
	if( !IsEnableUndo() ){
		return FALSE;
	}
	m_nCurrentPointer--;
	if( m_nCurrentPointer == m_nNoModifiedIndex ){		/* 無変更な状態になった位置 */
		*pbModified = FALSE;
	}else{
		*pbModified = TRUE;
	}
	return m_ppCOpeBlkArr[m_nCurrentPointer];
}





/* 現在のRedo対象の操作ブロックを返す */
COpeBlk* COpeBuf::DoRedo( int* pbModified )
{
	COpeBlk*	pcOpeBlk;
	/* Redo可能な状態か */
	if( !IsEnableRedo() ){
		return FALSE;
	}
	pcOpeBlk = m_ppCOpeBlkArr[m_nCurrentPointer];
	m_nCurrentPointer++;
	if( m_nCurrentPointer == m_nNoModifiedIndex ){		/* 無変更な状態になった位置 */
		*pbModified = FALSE;
	}else{
		*pbModified = TRUE;
	}
	return pcOpeBlk;
}



/* 現在位置で無変更な状態になったことを通知 */
void COpeBuf::SetNoModified( void )
{
	m_nNoModifiedIndex = m_nCurrentPointer;	/* 無変更な状態になった位置 */
	return;
}


/* アンドゥ?リドゥバッファのダンプ */
void COpeBuf::DUMP( void )
{
#ifdef _DEBUG
	int i;
	MYTRACE( "COpeBuf.m_nCurrentPointer=[%d]----\n", m_nCurrentPointer );
	for( i = 0; i < m_nCOpeBlkArrNum; ++i ){
		MYTRACE( "COpeBuf.m_ppCOpeBlkArr[%d]----\n", i );
		m_ppCOpeBlkArr[i]->DUMP();
	}
	MYTRACE( "COpeBuf.m_nCurrentPointer=[%d]----\n", m_nCurrentPointer );
#endif
	return;
}


/* 全要素のクリア */
void COpeBuf::ClearAll( void )
{
	int		i;
	/* 操作ブロックの配列を削除する */
	if( 0 < m_nCOpeBlkArrNum && NULL != m_ppCOpeBlkArr ){
		for( i = 0; i < m_nCOpeBlkArrNum; ++i ){
			if( NULL != m_ppCOpeBlkArr[i] ){
				delete m_ppCOpeBlkArr[i];
				m_ppCOpeBlkArr[i] = NULL;
			}
		}
		free( m_ppCOpeBlkArr );
		m_ppCOpeBlkArr = NULL;
		m_nCOpeBlkArrNum = 0;
	}
	m_nCurrentPointer = 0;	/* 現在位置 */
	m_nNoModifiedIndex = 0;	/* 無変更な状態になった位置 */
	return;
}


/*[EOF]*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -