1/////////////////////////////////////////////////////////////////////////////// 2// Name: wx/cmdproc.h 3// Purpose: undo/redo capable command processing framework 4// Author: Julian Smart (extracted from docview.h by VZ) 5// Modified by: 6// Created: 05.11.00 7// RCS-ID: $Id: cmdproc.h 49804 2007-11-10 01:09:42Z VZ $ 8// Copyright: (c) wxWidgets team 9// Licence: wxWindows licence 10/////////////////////////////////////////////////////////////////////////////// 11 12#ifndef _WX_CMDPROC_H_ 13#define _WX_CMDPROC_H_ 14 15#include "wx/defs.h" 16#include "wx/object.h" 17#include "wx/list.h" 18 19class WXDLLIMPEXP_FWD_CORE wxMenu; 20 21// ---------------------------------------------------------------------------- 22// wxCommand: a single command capable of performing itself 23// ---------------------------------------------------------------------------- 24 25class WXDLLEXPORT wxCommand : public wxObject 26{ 27public: 28 wxCommand(bool canUndoIt = false, const wxString& name = wxEmptyString); 29 virtual ~wxCommand(){} 30 31 // Override this to perform a command 32 virtual bool Do() = 0; 33 34 // Override this to undo a command 35 virtual bool Undo() = 0; 36 37 virtual bool CanUndo() const { return m_canUndo; } 38 virtual wxString GetName() const { return m_commandName; } 39 40protected: 41 bool m_canUndo; 42 wxString m_commandName; 43 44private: 45 DECLARE_CLASS(wxCommand) 46}; 47 48// ---------------------------------------------------------------------------- 49// wxCommandProcessor: wxCommand manager 50// ---------------------------------------------------------------------------- 51 52class WXDLLEXPORT wxCommandProcessor : public wxObject 53{ 54public: 55 // if max number of commands is -1, it is unlimited 56 wxCommandProcessor(int maxCommands = -1); 57 virtual ~wxCommandProcessor(); 58 59 // Pass a command to the processor. The processor calls Do(); if 60 // successful, is appended to the command history unless storeIt is false. 61 virtual bool Submit(wxCommand *command, bool storeIt = true); 62 63 // just store the command without executing it 64 virtual void Store(wxCommand *command); 65 66 virtual bool Undo(); 67 virtual bool Redo(); 68 virtual bool CanUndo() const; 69 virtual bool CanRedo() const; 70 71 // Initialises the current command and menu strings. 72 virtual void Initialize(); 73 74 // Sets the Undo/Redo menu strings for the current menu. 75 virtual void SetMenuStrings(); 76 77 // Gets the current Undo menu label. 78 wxString GetUndoMenuLabel() const; 79 80 // Gets the current Undo menu label. 81 wxString GetRedoMenuLabel() const; 82 83#if wxUSE_MENUS 84 // Call this to manage an edit menu. 85 void SetEditMenu(wxMenu *menu) { m_commandEditMenu = menu; } 86 wxMenu *GetEditMenu() const { return m_commandEditMenu; } 87#endif // wxUSE_MENUS 88 89 // command list access 90 wxList& GetCommands() { return m_commands; } 91 const wxList& GetCommands() const { return m_commands; } 92 wxCommand *GetCurrentCommand() const 93 { 94 return (wxCommand *)(m_currentCommand ? m_currentCommand->GetData() : NULL); 95 } 96 int GetMaxCommands() const { return m_maxNoCommands; } 97 virtual void ClearCommands(); 98 99 // Has the current project been changed? 100 virtual bool IsDirty() const 101 { 102 return m_currentCommand && (m_lastSavedCommand != m_currentCommand); 103 } 104 105 // Mark the current command as the one where the last save took place 106 void MarkAsSaved() 107 { 108 m_lastSavedCommand = m_currentCommand; 109 } 110 111 112 // By default, the accelerators are "\tCtrl+Z" and "\tCtrl+Y" 113 const wxString& GetUndoAccelerator() const { return m_undoAccelerator; } 114 const wxString& GetRedoAccelerator() const { return m_redoAccelerator; } 115 116 void SetUndoAccelerator(const wxString& accel) { m_undoAccelerator = accel; } 117 void SetRedoAccelerator(const wxString& accel) { m_redoAccelerator = accel; } 118 119protected: 120 // for further flexibility, command processor doesn't call wxCommand::Do() 121 // and Undo() directly but uses these functions which can be overridden in 122 // the derived class 123 virtual bool DoCommand(wxCommand& cmd); 124 virtual bool UndoCommand(wxCommand& cmd); 125 126 int m_maxNoCommands; 127 wxList m_commands; 128 wxList::compatibility_iterator m_currentCommand, 129 m_lastSavedCommand; 130 131#if wxUSE_MENUS 132 wxMenu* m_commandEditMenu; 133#endif // wxUSE_MENUS 134 135 wxString m_undoAccelerator; 136 wxString m_redoAccelerator; 137 138private: 139 DECLARE_DYNAMIC_CLASS(wxCommandProcessor) 140 DECLARE_NO_COPY_CLASS(wxCommandProcessor) 141}; 142 143#endif // _WX_CMDPROC_H_ 144 145