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

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@18369 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Julian Smart
2002-12-20 10:15:06 +00:00
parent f9becb8622
commit d863ed8333
3 changed files with 93 additions and 55 deletions

View File

@@ -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()