-wxCommand::wxCommand(bool canUndoIt, const wxString& name)
-{
- m_canUndo = canUndoIt;
- m_commandName = name;
-}
-
-wxCommand::~wxCommand()
-{
-}
-
-// Command processor
-wxCommandProcessor::wxCommandProcessor(int maxCommands)
-{
- m_maxNoCommands = maxCommands;
- m_currentCommand = (wxNode *) NULL;
- m_commandEditMenu = (wxMenu *) NULL;
- m_undoAccelerator = wxT("\tCtrl+Z");
- m_redoAccelerator = wxT("\tCtrl+Y");
-}
-
-wxCommandProcessor::~wxCommandProcessor()
-{
- ClearCommands();
-}
-
-// Pass a command to the processor. The processor calls Do();
-// if successful, is appended to the command history unless
-// storeIt is FALSE.
-bool wxCommandProcessor::Submit(wxCommand *command, bool storeIt)
-{
- bool success = command->Do();
- if (success && storeIt)
- {
- if (m_commands.Number() == m_maxNoCommands)
- {
- wxNode *firstNode = m_commands.First();
- wxCommand *firstCommand = (wxCommand *)firstNode->Data();
- delete firstCommand;
- delete firstNode;
- }
-
- // Correct a bug: we must chop off the current 'branch'
- // so that we're at the end of the command list.
- if (!m_currentCommand)
- ClearCommands();
- else
- {
- wxNode *node = m_currentCommand->Next();
- while (node)
- {
- wxNode *next = node->Next();
- delete (wxCommand *)node->Data();
- delete node;
- node = next;
- }
- }
-
- m_commands.Append(command);
- m_currentCommand = m_commands.Last();
- SetMenuStrings();
- }
- return success;
-}
-
-bool wxCommandProcessor::Undo()
-{
- if (m_currentCommand)
- {
- wxCommand *command = (wxCommand *)m_currentCommand->Data();
- if (command->CanUndo())
- {
- bool success = command->Undo();
- if (success)
- {
- m_currentCommand = m_currentCommand->Previous();
- SetMenuStrings();
- return TRUE;
- }
- }
- }
- return FALSE;
-}
-
-bool wxCommandProcessor::Redo()
-{
- wxCommand *redoCommand = (wxCommand *) NULL;
- wxNode *redoNode = (wxNode *) NULL;
- if (m_currentCommand && m_currentCommand->Next())
- {
- redoCommand = (wxCommand *)m_currentCommand->Next()->Data();
- redoNode = m_currentCommand->Next();
- }
- else
- {
- if (m_commands.Number() > 0)
- {
- redoCommand = (wxCommand *)m_commands.First()->Data();
- redoNode = m_commands.First();
- }
- }
-
- if (redoCommand)
- {
- bool success = redoCommand->Do();
- if (success)
- {
- m_currentCommand = redoNode;
- SetMenuStrings();
- return TRUE;
- }
- }
- return FALSE;
-}
-
-bool wxCommandProcessor::CanUndo() const
-{
- if (m_currentCommand)
- return ((wxCommand *)m_currentCommand->Data())->CanUndo();
- return FALSE;
-}
-
-bool wxCommandProcessor::CanRedo() const
-{
- if ((m_currentCommand != (wxNode*) NULL) && (m_currentCommand->Next() == (wxNode*) NULL))
- return FALSE;
-
- if ((m_currentCommand != (wxNode*) NULL) && (m_currentCommand->Next() != (wxNode*) NULL))
- return TRUE;
-
- if ((m_currentCommand == (wxNode*) NULL) && (m_commands.Number() > 0))
- return TRUE;
-
- return FALSE;
-}
-
-void wxCommandProcessor::Initialize()
-{
- m_currentCommand = m_commands.Last();
- SetMenuStrings();
-}
-
-void wxCommandProcessor::SetMenuStrings()