// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
+#include <ctype.h>
+
#ifdef __BORLANDC__
#pragma hdrstop
#endif
wxMenuItemBase::~wxMenuItemBase()
{
- delete m_subMenu;
+ if (m_subMenu)
+ delete m_subMenu;
}
#if wxUSE_ACCEL
m_style = style;
m_clientData = (void *)NULL;
m_eventHandler = this;
+
+#if wxUSE_MENU_CALLBACK
+ m_callback = (wxFunction) NULL;
+#endif // wxUSE_MENU_CALLBACK
}
wxMenuBase::~wxMenuBase()
{
- // nothing to do, wxMenuItemList dtor will delete the menu items
+ // nothing to do, wxMenuItemList dtor will delete the menu items.
+ // Actually, in GTK, the submenus have to get deleted first.
}
// ----------------------------------------------------------------------------
bool wxMenuBase::Insert(size_t pos, wxMenuItem *item)
{
wxCHECK_MSG( item, FALSE, wxT("invalid item in wxMenu::Insert") );
- wxCHECK_MSG( pos < GetMenuItemCount(), FALSE,
- wxT("invalid index in wxMenu::Insert") );
- return DoInsert(pos, item);
+ if ( pos == GetMenuItemCount() )
+ {
+ return DoAppend(item);
+ }
+ else
+ {
+ wxCHECK_MSG( pos < GetMenuItemCount(), FALSE,
+ wxT("invalid index in wxMenu::Insert") );
+
+ return DoInsert(pos, item);
+ }
}
bool wxMenuBase::DoInsert(size_t pos, wxMenuItem *item)
bool wxMenuBase::Delete(wxMenuItem *item)
{
- wxCHECK_MSG( item, NULL, wxT("invalid item in wxMenu::Delete") );
+ wxCHECK_MSG( item, FALSE, wxT("invalid item in wxMenu::Delete") );
return DoDelete(item);
}
bool wxMenuBase::Destroy(wxMenuItem *item)
{
- wxCHECK_MSG( item, NULL, wxT("invalid item in wxMenu::Destroy") );
+ wxCHECK_MSG( item, FALSE, wxT("invalid item in wxMenu::Destroy") );
return DoDestroy(item);
}
// Finds the item id matching the given string, -1 if not found.
int wxMenuBase::FindItem(const wxString& text) const
{
- wxString label = wxMenuItem(NULL, wxID_SEPARATOR, text).GetLabel();
+ wxString label = wxMenuItem::GetLabelFromText(text);
for ( wxMenuItemList::Node *node = m_items.GetFirst();
node;
node = node->GetNext() )
if ( rc != wxNOT_FOUND )
return rc;
}
- else if ( !item->IsSeparator() )
+
+ // we execute this code for submenus as well to alllow finding them by
+ // name just like the ordinary items
+ if ( !item->IsSeparator() )
{
if ( item->GetLabel() == label )
return item->GetId();
size_t pos;
for ( pos = 0; node; pos++ )
{
- item = node->GetData();
- if ( item->GetId() == id )
+ if ( node->GetData()->GetId() == id )
+ {
+ item = node->GetData();
+
break;
+ }
node = node->GetNext();
}
if ( ppos )
{
- *ppos = item ? pos : wxNOT_FOUND;
+ *ppos = item ? pos : (size_t)wxNOT_FOUND;
}
return item;
}
bool wxMenuBarBase::Insert(size_t pos, wxMenu *menu,
- const wxString& WXUNUSED(title))
+ const wxString& title)
{
- wxCHECK_MSG( menu, FALSE, wxT("can't insert NULL menu") );
+ if ( pos == m_menus.GetCount() )
+ {
+ return wxMenuBarBase::Append(menu, title);
+ }
+ else
+ {
+ wxCHECK_MSG( menu, FALSE, wxT("can't insert NULL menu") );
- wxMenuList::Node *node = m_menus.Item(pos);
- wxCHECK_MSG( node, FALSE, wxT("bad index in wxMenuBar::Insert()") );
+ wxMenuList::Node *node = m_menus.Item(pos);
+ wxCHECK_MSG( node, FALSE, wxT("bad index in wxMenuBar::Insert()") );
- m_menus.Insert(node, menu);
+ m_menus.Insert(node, menu);
- return TRUE;
+ return TRUE;
+ }
}
wxMenu *wxMenuBarBase::Replace(size_t pos, wxMenu *menu,
return menu;
}
+int wxMenuBarBase::FindMenu(const wxString& title) const
+{
+ wxString label = wxMenuItem::GetLabelFromText(title);
+
+ size_t count = GetMenuCount();
+ for ( size_t i = 0; i < count; i++ )
+ {
+ wxString title2 = GetLabelTop(i);
+ if ( (title2 == title) ||
+ (wxMenuItem::GetLabelFromText(title2) == label) )
+ {
+ // found
+ return (int)i;
+ }
+ }
+
+ return wxNOT_FOUND;
+
+}
+
// ---------------------------------------------------------------------------
// wxMenuBar functions forwarded to wxMenuItem
// ---------------------------------------------------------------------------