277 lines
5.1 KiB
C++
277 lines
5.1 KiB
C++
|
|
#include "stdafx.h"
|
|||
|
|
#include <wx/wx.h>
|
|||
|
|
#include "CmdProcessor.h"
|
|||
|
|
#include "CommandSet.h"
|
|||
|
|
|
|||
|
|
|
|||
|
|
const int CMD_HISTORY_CAPACITY = 50;
|
|||
|
|
|
|||
|
|
|
|||
|
|
CCmdProcessor::CCmdProcessor(void) : m_pNowCommand( NULL ),
|
|||
|
|
m_pLastDidCommand( NULL ),
|
|||
|
|
m_iCmdHistoryCapacity( CMD_HISTORY_CAPACITY ),
|
|||
|
|
m_iCmdIndex( -1 ),
|
|||
|
|
m_bCmdUpdated( false ),
|
|||
|
|
m_iLastCommandID( -1 )
|
|||
|
|
//m_pLogReceiver( NULL )
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CCmdProcessor::~CCmdProcessor(void)
|
|||
|
|
{
|
|||
|
|
// <20><><EFBFBD><EFBFBD> ť<><C5A5> <20><EFBFBD><D7BF>ִ°<D6B4> <20><EFBFBD><DEB8><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
|||
|
|
for_each( m_dqCmdList.begin(), m_dqCmdList.end(), DeleteData<ICommand*>() );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
void CCmdProcessor::SetCommand( ICommand* pCommand )
|
|||
|
|
{
|
|||
|
|
assert( NULL == m_pNowCommand && "Ŀ<EFBFBD>ǵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߿<EFBFBD> <20>ٽ<EFBFBD> Ŀ<>ǵ带 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵ˴ϴ<CBB4>." );
|
|||
|
|
|
|||
|
|
m_pNowCommand = pCommand;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
void CCmdProcessor::DoCommand( void )
|
|||
|
|
{
|
|||
|
|
if( m_pNowCommand->Recordable() )
|
|||
|
|
{
|
|||
|
|
// <20>ϴ<EFBFBD> Ŀ<>ǵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>(Ŀ<>ǵ<EFBFBD> <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)
|
|||
|
|
// <20>ؼ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD> <20><><EFBFBD><EFBFBD> Ŀ<>ǵ带 <20><><EFBFBD><EFBFBD>
|
|||
|
|
m_pNowCommand = m_pNowCommand->CreateSame();
|
|||
|
|
|
|||
|
|
++m_iCmdIndex;
|
|||
|
|
|
|||
|
|
// Ŀ<>ǵ<EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD> <20>ƴ϶<C6B4><CFB6><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> Ŀ<>ǵ<EFBFBD><C7B5><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
while( m_iCmdIndex <= (int)m_dqCmdList.size()-1 )
|
|||
|
|
{
|
|||
|
|
delete m_dqCmdList.back();
|
|||
|
|
m_dqCmdList.pop_back();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
m_dqCmdList.push_back( m_pNowCommand );
|
|||
|
|
|
|||
|
|
m_bCmdUpdated = true;
|
|||
|
|
|
|||
|
|
// <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѿ<D1BE><EEB0A1> <20>ʵ<EFBFBD><CAB5><EFBFBD>.
|
|||
|
|
if( (int)m_dqCmdList.size() > m_iCmdHistoryCapacity )
|
|||
|
|
{
|
|||
|
|
delete m_dqCmdList.front();
|
|||
|
|
m_dqCmdList.pop_front();
|
|||
|
|
|
|||
|
|
m_iCmdIndex = (int)m_dqCmdList.size() - 1;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
m_iLastCommandID = m_pNowCommand->GetTypeID();
|
|||
|
|
m_pNowCommand->Excute();
|
|||
|
|
|
|||
|
|
m_pLastDidCommand = m_pNowCommand;
|
|||
|
|
|
|||
|
|
const wxChar* pDesc = m_pNowCommand->GetDesc();
|
|||
|
|
if( pDesc )
|
|||
|
|
{
|
|||
|
|
m_strLastCmdMsg.assign( pDesc );
|
|||
|
|
//if( m_pLogReceiver )
|
|||
|
|
// m_pLogReceiver->DataChanged();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
m_pNowCommand = NULL;
|
|||
|
|
//m_bCmdUpdated = false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
bool CCmdProcessor::CanUndo( void )
|
|||
|
|
{
|
|||
|
|
return -1 != m_iCmdIndex;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
void CCmdProcessor::UndoCommand( void )
|
|||
|
|
{
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڵ<EFBFBD><DAB5><EFBFBD> <20><><EFBFBD><EFBFBD>. ļļļ.
|
|||
|
|
if( CanUndo() )
|
|||
|
|
{
|
|||
|
|
// Undo <20><> ȣ<><C8A3> <20>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŀ<>ǵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>丮<EFBFBD><E4B8AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>
|
|||
|
|
// <20>༮<EFBFBD><E0BCAE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ν<EFBFBD><CEBD><EFBFBD> <20><> <20>ֵ<EFBFBD><D6B5><EFBFBD> Undo <20><> ȣ<><C8A3><EFBFBD>DZ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
|
|||
|
|
ICommand* pCommand = m_dqCmdList.at( m_iCmdIndex );
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> Ŀ<>ǵ<EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD>̴<EFBFBD>.
|
|||
|
|
--m_iCmdIndex;
|
|||
|
|
m_bCmdUpdated = true;
|
|||
|
|
|
|||
|
|
m_iLastCommandID = pCommand->GetTypeID();
|
|||
|
|
pCommand->Undo();
|
|||
|
|
m_pLastDidCommand = pCommand;
|
|||
|
|
|
|||
|
|
m_strLastCmdMsg.assign( wxT("*Undo : ") );
|
|||
|
|
const wxChar* pDesc = pCommand->GetDesc();
|
|||
|
|
if( pDesc )
|
|||
|
|
{
|
|||
|
|
m_strLastCmdMsg.append( pDesc );
|
|||
|
|
//if( m_pLogReceiver )
|
|||
|
|
// m_pLogReceiver->DataChanged();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//m_bCmdUpdated = false;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
m_bErrorOccured = true;
|
|||
|
|
m_strLastError.assign( wxT("[Command Invoker] UndoCommand() <20>Լ<EFBFBD> <20><><EFBFBD><EFBFBD>. <20><> <20>̻<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.\n") );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
bool CCmdProcessor::CanRedo( void )
|
|||
|
|
{
|
|||
|
|
return m_iCmdIndex < ((int)m_dqCmdList.size()-1);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
void CCmdProcessor::RedoCommand( void )
|
|||
|
|
{
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD><CFB0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڵ<EFBFBD>. -_-;
|
|||
|
|
if( CanRedo() )
|
|||
|
|
{
|
|||
|
|
// Redo <20><> Undo <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
++m_iCmdIndex;
|
|||
|
|
|
|||
|
|
ICommand* pCommand = m_dqCmdList.at( m_iCmdIndex );
|
|||
|
|
|
|||
|
|
m_bCmdUpdated = true;
|
|||
|
|
|
|||
|
|
m_iLastCommandID = pCommand->GetTypeID();
|
|||
|
|
pCommand->Excute();
|
|||
|
|
m_pLastDidCommand = pCommand;
|
|||
|
|
|
|||
|
|
m_strLastCmdMsg.assign( wxT("*Redo : ") );
|
|||
|
|
const wxChar* pDesc = pCommand->GetDesc();
|
|||
|
|
if( pDesc )
|
|||
|
|
{
|
|||
|
|
m_strLastCmdMsg.append( pDesc );
|
|||
|
|
//if( m_pLogReceiver )
|
|||
|
|
// m_pLogReceiver->DataChanged();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//m_bCmdUpdated = false;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
m_bErrorOccured = true;
|
|||
|
|
m_strLastError.assign( wxT("[Command Invoker] RedoCommand() <20>Լ<EFBFBD> <20><><EFBFBD><EFBFBD>. <20><> <20>̻<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.\n") );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
void CCmdProcessor::OnUpdatedAllListeners( void )
|
|||
|
|
{
|
|||
|
|
m_bCmdUpdated = false;
|
|||
|
|
m_iLastCommandID = CMD_NULL;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
int CCmdProcessor::GetNumCmdHistory( void )
|
|||
|
|
{
|
|||
|
|
return (int)m_dqCmdList.size();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
ICommand* CCmdProcessor::GetCmdHistory( int iIndex )
|
|||
|
|
{
|
|||
|
|
return m_dqCmdList.at( iIndex );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
void CCmdProcessor::UpdateToThisHistory( int iCmdIndex )
|
|||
|
|
{
|
|||
|
|
assert( iCmdIndex != -1 );
|
|||
|
|
|
|||
|
|
if( iCmdIndex != -1 )
|
|||
|
|
{
|
|||
|
|
// Ŀ<>ǵ尡 <20><><EFBFBD><EFBFBD> Ŀ<>ǵ庸<C7B5><E5BAB8> <20>ֱ<EFBFBD> Ŀ<>ǵ<EFBFBD><C7B5><EFBFBD><EFBFBD><EFBFBD> redo
|
|||
|
|
if( m_iCmdIndex < iCmdIndex )
|
|||
|
|
{
|
|||
|
|
while( m_iCmdIndex < iCmdIndex )
|
|||
|
|
{
|
|||
|
|
RedoCommand();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
if( m_iCmdIndex > iCmdIndex )
|
|||
|
|
{
|
|||
|
|
// Ŀ<>ǵ尡 <20><><EFBFBD><EFBFBD> Ŀ<>ǵ庸<C7B5><E5BAB8> <20><><EFBFBD><EFBFBD> Ŀ<>ǵ<EFBFBD><C7B5><EFBFBD><EFBFBD><EFBFBD> undo
|
|||
|
|
while( m_iCmdIndex > iCmdIndex )
|
|||
|
|
{
|
|||
|
|
UndoCommand();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
const wxChar* CCmdProcessor::GetCommandMsg( void )
|
|||
|
|
{
|
|||
|
|
//if( m_bCmdUpdated )
|
|||
|
|
//{
|
|||
|
|
return m_strLastCmdMsg.c_str();
|
|||
|
|
//}
|
|||
|
|
//else
|
|||
|
|
// return NULL;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
const wxChar* CCmdProcessor::GetLastError( void )
|
|||
|
|
{
|
|||
|
|
m_bErrorOccured = false;
|
|||
|
|
|
|||
|
|
return m_strLastError.c_str();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
void CCmdProcessor::Clear( void )
|
|||
|
|
{
|
|||
|
|
m_pNowCommand = NULL;
|
|||
|
|
m_iCmdIndex = -1;
|
|||
|
|
m_bCmdUpdated = true; // <20>̷<EFBFBD><CCB7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>丮<EFBFBD><E4B8AE> <20><><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>Ѵ<EFBFBD>.
|
|||
|
|
m_iLastCommandID = CMD_NULL;
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD> ť<><C5A5> <20><EFBFBD><D7BF>ִ°<D6B4> <20><EFBFBD><DEB8><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
|||
|
|
for_each( m_dqCmdList.begin(), m_dqCmdList.end(), DeleteData<ICommand*>() );
|
|||
|
|
|
|||
|
|
m_dqCmdList.clear();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//
|
|||
|
|
//void CCmdProcessor::RemoveCommand( int iCmdType )
|
|||
|
|
//{
|
|||
|
|
// deque<ICommand*>::iterator iter = m_dqCmdList.begin();
|
|||
|
|
// for( iter; iter != m_dqCmdList.end(); ++iter )
|
|||
|
|
// {
|
|||
|
|
// if( iCmdType == (*iter)->GetTypeID() )
|
|||
|
|
// {
|
|||
|
|
// iter = m_dqCmdList.erase( iter );
|
|||
|
|
//
|
|||
|
|
// if( m_dqCmdList.empty())
|
|||
|
|
// break;
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
//}
|