Cleaned up SetMenuStrings, factoring out redo and undo label accessors at the same time

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_4_BRANCH@18369 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Julian Smart
2002-12-20 10:15:06 +00:00
parent a973354bf6
commit 417093fe28
3 changed files with 97 additions and 59 deletions

View File

@@ -20,13 +20,13 @@ if you want different behaviour.
\membersection{wxCommandProcessor::wxCommandProcessor} \membersection{wxCommandProcessor::wxCommandProcessor}
\func{}{wxCommandProcessor}{\param{int}{ maxCommands = 100}} \func{}{wxCommandProcessor}{\param{int}{ maxCommands = $-1$}}
Constructor. Constructor.
{\it maxCommands} defaults to a rather arbitrary 100, but can be set from 1 to any integer. {\it maxCommands} may be set to a positive integer to limit the number of
If your wxCommand classes store a lot of data, you may wish the limit the number of commands stored to it, otherwise (and by default) the list of commands can grow
commands stored to a smaller number. arbitrarily.
\membersection{wxCommandProcessor::\destruct{wxCommandProcessor}} \membersection{wxCommandProcessor::\destruct{wxCommandProcessor}}
@@ -76,12 +76,24 @@ Returns the edit menu associated with the command processor.
Returns the string that will be appended to the Redo menu item. Returns the string that will be appended to the Redo menu item.
\membersection{wxCommandProcessor::GetRedoMenuLabel}\label{wxcommandprocessorgetredomenulabel}
\constfunc{wxString}{GetRedoMenuLabel}{\void}
Returns the string that will be shown for the redo menu item.
\membersection{wxCommandProcessor::GetUndoAccelerator}\label{wxcommandprocessorgetundoaccelerator} \membersection{wxCommandProcessor::GetUndoAccelerator}\label{wxcommandprocessorgetundoaccelerator}
\constfunc{const wxString\&}{GetUndoAccelerator}{\void} \constfunc{const wxString\&}{GetUndoAccelerator}{\void}
Returns the string that will be appended to the Undo menu item. Returns the string that will be appended to the Undo menu item.
\membersection{wxCommandProcessor::GetUndoMenuLabel}\label{wxcommandprocessorgetundomenulabel}
\constfunc{wxString}{GetUndoMenuLabel}{\void}
Returns the string that will be shown for the undo menu item.
\membersection{wxCommandProcessor::Initialize} \membersection{wxCommandProcessor::Initialize}
\func{virtual void}{Initialize}{\void} \func{virtual void}{Initialize}{\void}
@@ -99,6 +111,13 @@ menu as appropriate. Set this to NULL if the menu is about to be
destroyed and command operations may still be performed, or the command destroyed and command operations may still be performed, or the command
processor may try to access an invalid pointer. processor may try to access an invalid pointer.
\membersection{wxCommandProcessor::SetMenuStrings}
\func{void}{SetMenuStrings}{\void}
Sets the menu labels according to the currently set menu and the current
command state.
\membersection{wxCommandProcessor::SetRedoAccelerator}\label{wxcommandprocessorsetredoaccelerator} \membersection{wxCommandProcessor::SetRedoAccelerator}\label{wxcommandprocessorsetredoaccelerator}
\func{void}{SetRedoAccelerator}{\param{const wxString\&}{accel}} \func{void}{SetRedoAccelerator}{\param{const wxString\&}{accel}}

View File

@@ -69,9 +69,18 @@ public:
virtual bool CanUndo() const; virtual bool CanUndo() const;
virtual bool CanRedo() const; virtual bool CanRedo() const;
// Initialises the current command and menu strings.
virtual void Initialize(); virtual void Initialize();
// Sets the Undo/Redo menu strings for the current menu.
virtual void SetMenuStrings(); virtual void SetMenuStrings();
// Gets the current Undo menu label.
wxString GetUndoMenuLabel() const;
// Gets the current Undo menu label.
wxString GetRedoMenuLabel() const;
#if wxUSE_MENUS #if wxUSE_MENUS
// Call this to manage an edit menu. // Call this to manage an edit menu.
void SetEditMenu(wxMenu *menu) { m_commandEditMenu = menu; } void SetEditMenu(wxMenu *menu) { m_commandEditMenu = menu; }

View File

@@ -220,72 +220,82 @@ void wxCommandProcessor::Initialize()
SetMenuStrings(); SetMenuStrings();
} }
static void wxSetMenuLabel(wxMenu* menu, int id, const wxString& label)
{
menu->SetLabel(id, label);
}
void wxCommandProcessor::SetMenuStrings() void wxCommandProcessor::SetMenuStrings()
{ {
#if wxUSE_MENUS #if wxUSE_MENUS
if (m_commandEditMenu) if (m_commandEditMenu)
{ {
wxString buf; wxString undoLabel = GetUndoMenuLabel();
if (m_currentCommand) wxString redoLabel = GetRedoMenuLabel();
m_commandEditMenu->SetLabel(wxID_UNDO, undoLabel);
m_commandEditMenu->Enable(wxID_UNDO, CanUndo());
m_commandEditMenu->SetLabel(wxID_REDO, redoLabel);
m_commandEditMenu->Enable(wxID_REDO, CanRedo());
}
#endif // wxUSE_MENUS
}
// Gets the current Undo menu label.
wxString wxCommandProcessor::GetUndoMenuLabel() const
{
wxString buf;
if (m_currentCommand)
{
wxCommand *command = (wxCommand *)m_currentCommand->Data();
wxString commandName(command->GetName());
if (commandName == wxT("")) commandName = _("Unnamed command");
bool canUndo = command->CanUndo();
if (canUndo)
buf = wxString(_("&Undo ")) + commandName + m_undoAccelerator;
else
buf = wxString(_("Can't &Undo ")) + commandName + m_undoAccelerator;
}
else
{
buf = _("&Undo") + m_undoAccelerator;
}
return buf;
}
// Gets the current Undo menu label.
wxString wxCommandProcessor::GetRedoMenuLabel() const
{
wxString buf;
if (m_currentCommand)
{
// We can redo, if we're not at the end of the history.
if (m_currentCommand->Next())
{ {
wxCommand *command = (wxCommand *)m_currentCommand->Data(); wxCommand *redoCommand = (wxCommand *)m_currentCommand->Next()->Data();
wxString commandName(command->GetName()); wxString redoCommandName(redoCommand->GetName());
if (commandName == wxT("")) commandName = _("Unnamed command"); if (redoCommandName == wxT("")) redoCommandName = _("Unnamed command");
bool canUndo = command->CanUndo(); buf = wxString(_("&Redo ")) + redoCommandName + m_redoAccelerator;
if (canUndo)
buf = wxString(_("&Undo ")) + commandName + m_undoAccelerator;
else
buf = wxString(_("Can't &Undo ")) + commandName + m_undoAccelerator;
wxSetMenuLabel(m_commandEditMenu, wxID_UNDO, buf);
m_commandEditMenu->Enable(wxID_UNDO, canUndo);
// We can redo, if we're not at the end of the history.
if (m_currentCommand->Next())
{
wxCommand *redoCommand = (wxCommand *)m_currentCommand->Next()->Data();
wxString redoCommandName(redoCommand->GetName());
if (redoCommandName == wxT("")) redoCommandName = _("Unnamed command");
buf = wxString(_("&Redo ")) + redoCommandName + m_redoAccelerator;
wxSetMenuLabel(m_commandEditMenu, wxID_REDO, buf);
m_commandEditMenu->Enable(wxID_REDO, TRUE);
}
else
{
wxSetMenuLabel(m_commandEditMenu, wxID_REDO, _("&Redo") + m_redoAccelerator);
m_commandEditMenu->Enable(wxID_REDO, FALSE);
}
} }
else else
{ {
wxSetMenuLabel(m_commandEditMenu, wxID_UNDO, _("&Undo") + m_undoAccelerator); buf = _("&Redo") + m_redoAccelerator;
m_commandEditMenu->Enable(wxID_UNDO, FALSE);
if (m_commands.Number() == 0)
{
wxSetMenuLabel(m_commandEditMenu, wxID_REDO, _("&Redo") + m_redoAccelerator);
m_commandEditMenu->Enable(wxID_REDO, FALSE);
}
else
{
// currentCommand is NULL but there are commands: this means that
// we've undone to the start of the list, but can redo the first.
wxCommand *redoCommand = (wxCommand *)m_commands.First()->Data();
wxString redoCommandName(redoCommand->GetName());
if (redoCommandName == wxT("")) redoCommandName = _("Unnamed command");
buf = wxString(_("&Redo ")) + redoCommandName + m_redoAccelerator;
wxSetMenuLabel(m_commandEditMenu, wxID_REDO, buf);
m_commandEditMenu->Enable(wxID_REDO, TRUE);
}
} }
} }
#endif // wxUSE_MENUS else
{
if (m_commands.Number() == 0)
{
buf = _("&Redo") + m_redoAccelerator;
}
else
{
// currentCommand is NULL but there are commands: this means that
// we've undone to the start of the list, but can redo the first.
wxCommand *redoCommand = (wxCommand *)m_commands.First()->Data();
wxString redoCommandName(redoCommand->GetName());
if (redoCommandName == wxT("")) redoCommandName = _("Unnamed command");
buf = wxString(_("&Redo ")) + redoCommandName + m_redoAccelerator;
}
}
return buf;
} }
void wxCommandProcessor::ClearCommands() void wxCommandProcessor::ClearCommands()