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 19 class WXDLLIMPEXP_FWD_CORE wxMenu; 20 21 // ---------------------------------------------------------------------------- 22 // wxCommand: a single command capable of performing itself 23 // ---------------------------------------------------------------------------- 24 25 class WXDLLEXPORT wxCommand : public wxObject 26 { 27 public: 28 wxCommand(bool canUndoIt = false, const wxString& name = wxEmptyString); ~wxCommand()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 CanUndo()37 virtual bool CanUndo() const { return m_canUndo; } GetName()38 virtual wxString GetName() const { return m_commandName; } 39 40 protected: 41 bool m_canUndo; 42 wxString m_commandName; 43 44 private: 45 DECLARE_CLASS(wxCommand) 46 }; 47 48 // ---------------------------------------------------------------------------- 49 // wxCommandProcessor: wxCommand manager 50 // ---------------------------------------------------------------------------- 51 52 class WXDLLEXPORT wxCommandProcessor : public wxObject 53 { 54 public: 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. SetEditMenu(wxMenu * menu)85 void SetEditMenu(wxMenu *menu) { m_commandEditMenu = menu; } GetEditMenu()86 wxMenu *GetEditMenu() const { return m_commandEditMenu; } 87 #endif // wxUSE_MENUS 88 89 // command list access GetCommands()90 wxList& GetCommands() { return m_commands; } GetCommands()91 const wxList& GetCommands() const { return m_commands; } GetCurrentCommand()92 wxCommand *GetCurrentCommand() const 93 { 94 return (wxCommand *)(m_currentCommand ? m_currentCommand->GetData() : NULL); 95 } GetMaxCommands()96 int GetMaxCommands() const { return m_maxNoCommands; } 97 virtual void ClearCommands(); 98 99 // Has the current project been changed? IsDirty()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 MarkAsSaved()106 void MarkAsSaved() 107 { 108 m_lastSavedCommand = m_currentCommand; 109 } 110 111 112 // By default, the accelerators are "\tCtrl+Z" and "\tCtrl+Y" GetUndoAccelerator()113 const wxString& GetUndoAccelerator() const { return m_undoAccelerator; } GetRedoAccelerator()114 const wxString& GetRedoAccelerator() const { return m_redoAccelerator; } 115 SetUndoAccelerator(const wxString & accel)116 void SetUndoAccelerator(const wxString& accel) { m_undoAccelerator = accel; } SetRedoAccelerator(const wxString & accel)117 void SetRedoAccelerator(const wxString& accel) { m_redoAccelerator = accel; } 118 119 protected: 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 138 private: 139 DECLARE_DYNAMIC_CLASS(wxCommandProcessor) 140 DECLARE_NO_COPY_CLASS(wxCommandProcessor) 141 }; 142 143 #endif // _WX_CMDPROC_H_ 144 145