#include "wx/menu.h"
#endif
+#include "wx/stockitem.h"
+
// ----------------------------------------------------------------------------
// template lists
// ----------------------------------------------------------------------------
return prefixCode + num - first;
}
-bool wxAcceleratorEntry::FromString(const wxString& text)
+/* static */
+bool
+wxAcceleratorEntry::ParseAccel(const wxString& text, int *flagsOut, int *keyOut)
{
- // the parser won't like leading/trailing spaces
- wxString label = text.Strip(wxString::both);
-
- // set to invalid state:
- m_flags = 0;
- m_keyCode = 0;
+ // the parser won't like trailing spaces
+ wxString label = text;
+ label.Trim(true); // the initial \t must be preserved so don't strip leading whitespaces
// check for accelerators: they are given after '\t'
int posTab = label.Find(wxT('\t'));
if ( posTab == wxNOT_FOUND )
+ {
return false;
+ }
// parse the accelerator string
int accelFlags = wxACCEL_NORMAL;
wxASSERT_MSG( keyCode, _T("logic error: should have key code here") );
- m_flags = accelFlags;
- m_keyCode = keyCode;
+ if ( flagsOut )
+ *flagsOut = accelFlags;
+ if ( keyOut )
+ *keyOut = keyCode;
+
return true;
}
+/* static */
+wxAcceleratorEntry *wxAcceleratorEntry::Create(const wxString& str)
+{
+ int flags,
+ keyCode;
+ if ( !ParseAccel(str, &flags, &keyCode) )
+ return NULL;
+
+ return new wxAcceleratorEntry(flags, keyCode);
+}
+
+bool wxAcceleratorEntry::FromString(const wxString& str)
+{
+ return ParseAccel(str, &m_flags, &m_keyCode);
+}
+
wxString wxAcceleratorEntry::ToString() const
{
wxString text;
const int code = GetKeyCode();
- if ( wxIsalnum(code) )
- text << (wxChar)code;
- else if ( code >= WXK_F1 && code <= WXK_F12 )
+ if ( code >= WXK_F1 && code <= WXK_F12 )
text << _("F") << code - WXK_F1 + 1;
else if ( code >= WXK_NUMPAD0 && code <= WXK_NUMPAD9 )
text << _("KP_") << code - WXK_NUMPAD0;
}
}
- wxASSERT_MSG( n != WXSIZEOF(wxKeyNames),
- wxT("unknown keyboard accelerator code") );
+ if ( n == WXSIZEOF(wxKeyNames) )
+ {
+ // must be a simple key
+ if (
+#if !wxUSE_UNICODE
+ isascii(code) &&
+#endif // ANSI
+ wxIsalnum(code) )
+ {
+ text << (wxChar)code;
+ }
+ else
+ {
+ wxFAIL_MSG( wxT("unknown keyboard accelerator code") );
+ }
+ }
}
return text;
wxAcceleratorEntry *wxGetAccelFromString(const wxString& label)
{
- wxAcceleratorEntry *ret = new wxAcceleratorEntry();
- if (ret->FromString(label))
- return ret;
-
- wxDELETE(ret);
- return NULL;
+ return wxAcceleratorEntry::Create(label);
}
-#endif // wxUSE_ACCEL
+#endif // wxUSE_ACCEL
// ----------------------------------------------------------------------------
const wxString& help,
wxItemKind kind,
wxMenu *subMenu)
- : m_text(text),
- m_help(help)
{
wxASSERT_MSG( parentMenu != NULL, wxT("menuitem should have a menu") );
m_id = wxNewId();
if (m_id == wxID_SEPARATOR)
m_kind = wxITEM_SEPARATOR;
+
+ SetText(text);
+ SetHelp(help);
}
wxMenuItemBase::~wxMenuItemBase()
wxAcceleratorEntry *wxMenuItemBase::GetAccel() const
{
- return wxGetAccelFromString(GetText());
+ return wxAcceleratorEntry::Create(GetText());
}
void wxMenuItemBase::SetAccel(wxAcceleratorEntry *accel)
#endif // wxUSE_ACCEL
+void wxMenuItemBase::SetText(const wxString& str)
+{
+ m_text = str;
+
+ if ( m_text.empty() && !IsSeparator() )
+ {
+ wxASSERT_MSG( wxIsStockID(GetId()),
+ wxT("A non-stock menu item with an empty label?") );
+ m_text = wxGetStockLabel(GetId(), wxSTOCK_WITH_ACCELERATOR |
+ wxSTOCK_WITH_MNEMONIC);
+ }
+}
+
+void wxMenuItemBase::SetHelp(const wxString& str)
+{
+ m_help = str;
+
+ if ( m_help.empty() && !IsSeparator() && wxIsStockID(GetId()) )
+ {
+ // get a stock help string
+ m_help = wxGetStockHelpString(GetId());
+ }
+}
+
bool wxMenuBase::ms_locked = true;
// ----------------------------------------------------------------------------