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