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