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.
\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}
\constfunc{const wxString\&}{GetUndoAccelerator}{\void}
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}
\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
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}
\func{void}{SetRedoAccelerator}{\param{const wxString\&}{accel}}

View File

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

View File

@@ -220,72 +220,82 @@ void wxCommandProcessor::Initialize()
SetMenuStrings();
}
static void wxSetMenuLabel(wxMenu* menu, int id, const wxString& label)
{
menu->SetLabel(id, label);
}
void wxCommandProcessor::SetMenuStrings()
{
#if wxUSE_MENUS
if (m_commandEditMenu)
{
wxString buf;
if (m_currentCommand)
wxString undoLabel = GetUndoMenuLabel();
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();
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;
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);
}
wxCommand *redoCommand = (wxCommand *)m_currentCommand->Next()->Data();
wxString redoCommandName(redoCommand->GetName());
if (redoCommandName == wxT("")) redoCommandName = _("Unnamed command");
buf = wxString(_("&Redo ")) + redoCommandName + m_redoAccelerator;
}
else
{
wxSetMenuLabel(m_commandEditMenu, wxID_UNDO, _("&Undo") + m_undoAccelerator);
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);
}
buf = _("&Redo") + m_redoAccelerator;
}
}
#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()