Don't pass strings not containing accelerators to ParseAccel().

Check for the presence of accelerator part in the string passed to
wxAcceleratorEntry::Create() and don't call ParseAccel() at all if it's not
there. This avoids the spurious warnings about unrecognized accelerators when
creating menu items that don't have any accelerators at all.

Also update wxAcceleratorEntry::FromString() documentation to mention that
the new code should pass just the accelerator to this function and that it
only accepts full menu item labels for compatibility.

Closes #12770.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@66379 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2010-12-15 11:18:42 +00:00
parent a67c2d4161
commit 6fc7a1ad1c
2 changed files with 20 additions and 6 deletions

View File

@@ -119,7 +119,10 @@ public:
ToString(), i.e. contain the accelerator itself only, or have the ToString(), i.e. contain the accelerator itself only, or have the
format of a full menu item text with i.e. <code>Label TAB format of a full menu item text with i.e. <code>Label TAB
Accelerator</code>. In the latter case, the part of the string Accelerator</code>. In the latter case, the part of the string
before the TAB is ignored. before the TAB is ignored. Notice that the latter format is only
supported for the compatibility with the previous wxWidgets
versions and the new code should pass only the accelerator string
itself to this function.
@return @true if the given string correctly initialized this object @return @true if the given string correctly initialized this object
(i.e. if IsOk() returns true after this call) (i.e. if IsOk() returns true after this call)

View File

@@ -158,11 +158,13 @@ wxAcceleratorEntry::ParseAccel(const wxString& text, int *flagsOut, int *keyOut)
{ {
// the parser won't like trailing spaces // the parser won't like trailing spaces
wxString label = text; wxString label = text;
label.Trim(true); // the initial \t must be preserved so don't strip leading whitespaces label.Trim(true);
// If we're passed the entire menu item label instead of just the // For compatibility with the old wx versions which accepted (and actually
// accelerator, skip the label part and only look after the TAB. // even required) a TAB character in the string passed to this function we
// check for accelerators: they are given after '\t' // ignore anything up to the first TAB. Notice however that the correct
// input consists of just the accelerator itself and nothing else, this is
// done for compatibility and compatibility only.
int posTab = label.Find(wxT('\t')); int posTab = label.Find(wxT('\t'));
if ( posTab == wxNOT_FOUND ) if ( posTab == wxNOT_FOUND )
posTab = 0; posTab = 0;
@@ -274,9 +276,18 @@ wxAcceleratorEntry::ParseAccel(const wxString& text, int *flagsOut, int *keyOut)
/* static */ /* static */
wxAcceleratorEntry *wxAcceleratorEntry::Create(const wxString& str) wxAcceleratorEntry *wxAcceleratorEntry::Create(const wxString& str)
{ {
const wxString accelStr = str.AfterFirst('\t');
if ( accelStr.empty() )
{
// It's ok to pass strings not containing any accelerators at all to
// this function, wxMenuItem code does it and we should just return
// NULL in this case.
return NULL;
}
int flags, int flags,
keyCode; keyCode;
if ( !ParseAccel(str, &flags, &keyCode) ) if ( !ParseAccel(accelStr, &flags, &keyCode) )
return NULL; return NULL;
return new wxAcceleratorEntry(flags, keyCode); return new wxAcceleratorEntry(flags, keyCode);