// Created: 26.10.99
// RCS-ID: $Id$
// Copyright: (c) wxWindows team
-// Licence: wxWindows license
+// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
// ============================================================================
#if wxUSE_ACCEL
+static inline bool CompareAccelString(const wxString& str, const wxChar *accel)
+{
+#if wxUSE_INTL
+ return str == accel || str == wxGetTranslation(accel);
+#else
+ return str == accel;
+#endif
+}
+
// return wxAcceleratorEntry for the given menu string or NULL if none
// specified
wxAcceleratorEntry *wxGetAccelFromString(const wxString& label)
wxString current;
for ( size_t n = (size_t)posTab + 1; n < label.Len(); n++ ) {
if ( (label[n] == '+') || (label[n] == '-') ) {
- if ( current == _("ctrl") )
+ if ( CompareAccelString(current, wxTRANSLATE("ctrl")) )
accelFlags |= wxACCEL_CTRL;
- else if ( current == _("alt") )
+ else if ( CompareAccelString(current, wxTRANSLATE("alt")) )
accelFlags |= wxACCEL_ALT;
- else if ( current == _("shift") )
+ else if ( CompareAccelString(current, wxTRANSLATE("shift")) )
accelFlags |= wxACCEL_SHIFT;
else {
// we may have "Ctrl-+", for example, but we still want to
else {
if ( current.Len() == 1 ) {
// it's a letter
- keyCode = wxToupper(current[0U]);
+ keyCode = current[0U];
+
+ // Only call wxToupper if control, alt, or shift is held down,
+ // otherwise lower case accelerators won't work.
+ if (accelFlags != wxACCEL_NORMAL) {
+ keyCode = wxToupper(keyCode);
+ }
}
else {
// is it a function key?
else {
// several special cases
current.MakeUpper();
- if ( current == wxT("DEL") ) {
+ if ( current == wxT("DEL") )
keyCode = WXK_DELETE;
- }
- else if ( current == wxT("DELETE") ) {
+ else if ( current == wxT("DELETE") )
keyCode = WXK_DELETE;
- }
- else if ( current == wxT("INS") ) {
+ else if ( current == wxT("INS") )
keyCode = WXK_INSERT;
- }
- else if ( current == wxT("INSERT") ) {
+ else if ( current == wxT("INSERT") )
keyCode = WXK_INSERT;
- }
-#if 0
- else if ( current == wxT("PGUP") ) {
- keyCode = VK_PRIOR;
- }
- else if ( current == wxT("PGDN") ) {
- keyCode = VK_NEXT;
- }
-#endif
+ else if ( current == wxT("ENTER") || current == wxT("RETURN") )
+ keyCode = WXK_RETURN;
+ else if ( current == wxT("PGUP") )
+ keyCode = WXK_PRIOR;
+ else if ( current == wxT("PGDN") )
+ keyCode = WXK_NEXT;
+ else if ( current == wxT("LEFT") )
+ keyCode = WXK_LEFT;
+ else if ( current == wxT("RIGHT") )
+ keyCode = WXK_RIGHT;
+ else if ( current == wxT("UP") )
+ keyCode = WXK_UP;
+ else if ( current == wxT("DOWN") )
+ keyCode = WXK_DOWN;
+ else if ( current == wxT("HOME") )
+ keyCode = WXK_HOME;
+ else if ( current == wxT("END") )
+ keyCode = WXK_END;
+ else if ( current == wxT("SPACE") )
+ keyCode = WXK_SPACE;
+ else if ( current == wxT("TAB") )
+ keyCode = WXK_TAB;
+ else if ( current == wxT("ESC") || current == wxT("ESCAPE") )
+ keyCode = WXK_ESCAPE;
else
{
wxLogDebug(wxT("Unrecognized accel key '%s', accel string ignored."),
wxCHECK_MSG( item, FALSE, wxT("invalid item in wxMenu::Append()") );
m_items.Append(item);
+ item->SetMenu((wxMenu*)this);
if ( item->IsSubMenu() )
{
AddSubMenu(item->GetSubMenu());
wxCHECK_MSG( node, FALSE, wxT("invalid index in wxMenu::Insert()") );
m_items.Insert(node, item);
+ item->SetMenu((wxMenu*)this);
if ( item->IsSubMenu() )
{
AddSubMenu(item->GetSubMenu());
m_items.DeleteNode(node);
// item isn't attached to anything any more
+ item->SetMenu((wxMenu *)NULL);
wxMenu *submenu = item->GetSubMenu();
if ( submenu )
{
return item;
}
+// find by position
+wxMenuItem* wxMenuBase::FindItemByPosition(size_t position) const
+{
+ wxCHECK_MSG( position < m_items.GetCount(), NULL,
+ _T("wxMenu::FindItemByPosition(): invalid menu index") );
+
+ return m_items.Item( position )->GetData();
+}
+
// ----------------------------------------------------------------------------
// wxMenu helpers used by derived classes
// ----------------------------------------------------------------------------
(wxMenuItem::GetLabelFromText(title2) == label) )
{
// found
- return (int)i;
+ return (int)i;
}
}