// Author: Vadim Zeitlin
// Modified by:
// Created: 26.10.99
-// RCS-ID: $Id$
// Copyright: (c) wxWidgets team
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
wxIMPLEMENT_DYNAMIC_CLASS_XTI(wxMenu, wxEvtHandler, "wx/menu.h")
wxCOLLECTION_TYPE_INFO( wxMenuItem *, wxMenuItemList ) ;
+#if wxUSE_EXTENDED_RTTI
template<> void wxCollectionToVariantArray( wxMenuItemList const &theList,
wxAnyList &value)
{
wxListCollectionToAnyList<wxMenuItemList::compatibility_iterator>( theList, value ) ;
}
+#endif
wxBEGIN_PROPERTIES_TABLE(wxMenu)
-wxEVENT_PROPERTY( Select, wxEVT_COMMAND_MENU_SELECTED, wxCommandEvent)
+wxEVENT_PROPERTY( Select, wxEVT_MENU, wxCommandEvent)
wxPROPERTY( Title, wxString, SetTitle, GetTitle, wxString(), \
0 /*flags*/, wxT("Helpstring"), wxT("group") )
wxFLAGS_MEMBER(wxMB_DOCKABLE)
wxEND_FLAGS( wxMenuBarStyle )
+#if wxUSE_EXTENDED_RTTI
// the negative id would lead the window (its superclass !) to
// vetoe streaming out otherwise
bool wxMenuBarStreamingCallback( const wxObject *WXUNUSED(object), wxObjectWriter *,
{
return true;
}
+#endif
wxIMPLEMENT_DYNAMIC_CLASS_XTI_CALLBACK(wxMenuBar, wxWindow, "wx/menu.h", \
wxMenuBarStreamingCallback)
#endif
-wxBEGIN_PROPERTIES_TABLE(wxMenuBar)
-wxPROPERTY_COLLECTION( MenuInfos, wxMenuInfoList, wxMenuInfo*, AppendMenuInfo, \
- GetMenuInfos, 0 /*flags*/, wxT("Helpstring"), wxT("group"))
-wxEND_PROPERTIES_TABLE()
-
-wxEMPTY_HANDLERS_TABLE(wxMenuBar)
-
-wxCONSTRUCTOR_DUMMY( wxMenuBar )
-
// ----------------------------------------------------------------------------
// XTI for wxMenuItem
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
wxMenuItemBase::wxMenuItemBase(wxMenu *parentMenu,
- int id,
+ int itemid,
const wxString& text,
const wxString& help,
wxItemKind kind,
wxMenu *subMenu)
{
- switch ( id )
+ switch ( itemid )
{
case wxID_ANY:
m_id = wxWindow::NewControlId();
// (popup) menu titles in wxMSW use this ID to indicate that
// it's not a real menu item, so we don't want the check below to
// apply to it
- m_id = id;
+ m_id = itemid;
break;
default:
// ids are limited to 16 bits under MSW so portable code shouldn't
// use ids outside of this range (negative ids generated by wx are
// fine though)
- wxASSERT_MSG( (id >= 0 && id < SHRT_MAX) ||
- (id >= wxID_AUTO_LOWEST && id <= wxID_AUTO_HIGHEST),
- wxS("invalid id value") );
- m_id = id;
+ wxASSERT_MSG( (itemid >= 0 && itemid < SHRT_MAX) ||
+ (itemid >= wxID_AUTO_LOWEST && itemid <= wxID_AUTO_HIGHEST),
+ wxS("invalid itemid value") );
+ m_id = itemid;
}
// notice that parentMenu can be NULL: the item can be attached to the menu
}
// non recursive search
-wxMenuItem *wxMenuBase::FindChildItem(int id, size_t *ppos) const
+wxMenuItem *wxMenuBase::FindChildItem(int itemid, size_t *ppos) const
{
wxMenuItem *item = NULL;
wxMenuItemList::compatibility_iterator node = GetMenuItems().GetFirst();
size_t pos;
for ( pos = 0; node; pos++ )
{
- if ( node->GetData()->GetId() == id )
+ if ( node->GetData()->GetId() == itemid )
{
item = node->GetData();
// window will be used.
void wxMenuBase::UpdateUI(wxEvtHandler* source)
{
- if (GetInvokingWindow())
- {
- // Don't update menus if the parent
- // frame is about to get deleted
- wxWindow *tlw = wxGetTopLevelParent( GetInvokingWindow() );
- if (tlw && wxPendingDelete.Member(tlw))
- return;
- }
+ wxWindow * const win = GetWindow();
- if ( !source && GetInvokingWindow() )
- source = GetInvokingWindow()->GetEventHandler();
+ if ( !source && win )
+ source = win->GetEventHandler();
if ( !source )
source = GetEventHandler();
if ( !source )
wxMenuItem* item = node->GetData();
if ( !item->IsSeparator() )
{
- wxWindowID id = item->GetId();
- wxUpdateUIEvent event(id);
- event.SetEventObject( source );
+ wxWindowID itemid = item->GetId();
+ wxUpdateUIEvent event(itemid);
+ event.SetEventObject( this );
if ( source->ProcessEvent(event) )
{
// if anything changed, update the changed attribute
if (event.GetSetText())
- SetLabel(id, event.GetText());
+ SetLabel(itemid, event.GetText());
if (event.GetSetChecked())
- Check(id, event.GetChecked());
+ Check(itemid, event.GetChecked());
if (event.GetSetEnabled())
- Enable(id, event.GetEnabled());
+ Enable(itemid, event.GetEnabled());
}
// recurse to the submenus
}
}
-bool wxMenuBase::SendEvent(int id, int checked)
+bool wxMenuBase::SendEvent(int itemid, int checked)
{
- wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED, id);
+ wxCommandEvent event(wxEVT_MENU, itemid);
event.SetEventObject(this);
event.SetInt(checked);
- bool processed = false;
+ wxWindow* const win = GetWindow();
+ wxMenuBar* const mb = GetMenuBar();
// Try the menu's event handler first
wxEvtHandler *handler = GetEventHandler();
if ( handler )
- processed = handler->SafelyProcessEvent(event);
-
- // Try the window the menu was popped up from or its menu bar belongs to
- if ( !processed )
{
- wxWindow * const win = GetWindow();
- if ( win )
- processed = win->HandleWindowEvent(event);
+ // Indicate to the event processing code that we're going to pass this
+ // event to another handler if it's not processed here to prevent it
+ // from passing the event to wxTheApp: this will be done below if we do
+ // have the associated window.
+ if ( win || mb )
+ event.SetWillBeProcessedAgain();
+
+ if ( handler->SafelyProcessEvent(event) )
+ return true;
}
- return processed;
+ // If this menu is part of the menu bar, process the event there: this will
+ // also propagate it upwards to the window containing the menu bar.
+ if ( mb )
+ return mb->HandleWindowEvent(event);
+
+ // Try the window the menu was popped up from.
+ if ( win )
+ return win->HandleWindowEvent(event);
+
+ // Not processed.
+ return false;
}
// ----------------------------------------------------------------------------
// wxMenu functions forwarded to wxMenuItem
// ----------------------------------------------------------------------------
-void wxMenuBase::Enable( int id, bool enable )
+void wxMenuBase::Enable( int itemid, bool enable )
{
- wxMenuItem *item = FindItem(id);
+ wxMenuItem *item = FindItem(itemid);
wxCHECK_RET( item, wxT("wxMenu::Enable: no such item") );
item->Enable(enable);
}
-bool wxMenuBase::IsEnabled( int id ) const
+bool wxMenuBase::IsEnabled( int itemid ) const
{
- wxMenuItem *item = FindItem(id);
+ wxMenuItem *item = FindItem(itemid);
wxCHECK_MSG( item, false, wxT("wxMenu::IsEnabled: no such item") );
return item->IsEnabled();
}
-void wxMenuBase::Check( int id, bool enable )
+void wxMenuBase::Check( int itemid, bool enable )
{
- wxMenuItem *item = FindItem(id);
+ wxMenuItem *item = FindItem(itemid);
wxCHECK_RET( item, wxT("wxMenu::Check: no such item") );
item->Check(enable);
}
-bool wxMenuBase::IsChecked( int id ) const
+bool wxMenuBase::IsChecked( int itemid ) const
{
- wxMenuItem *item = FindItem(id);
+ wxMenuItem *item = FindItem(itemid);
wxCHECK_MSG( item, false, wxT("wxMenu::IsChecked: no such item") );
return item->IsChecked();
}
-void wxMenuBase::SetLabel( int id, const wxString &label )
+void wxMenuBase::SetLabel( int itemid, const wxString &label )
{
- wxMenuItem *item = FindItem(id);
+ wxMenuItem *item = FindItem(itemid);
wxCHECK_RET( item, wxT("wxMenu::SetLabel: no such item") );
item->SetItemLabel(label);
}
-wxString wxMenuBase::GetLabel( int id ) const
+wxString wxMenuBase::GetLabel( int itemid ) const
{
- wxMenuItem *item = FindItem(id);
+ wxMenuItem *item = FindItem(itemid);
wxCHECK_MSG( item, wxEmptyString, wxT("wxMenu::GetLabel: no such item") );
return item->GetItemLabel();
}
-void wxMenuBase::SetHelpString( int id, const wxString& helpString )
+void wxMenuBase::SetHelpString( int itemid, const wxString& helpString )
{
- wxMenuItem *item = FindItem(id);
+ wxMenuItem *item = FindItem(itemid);
wxCHECK_RET( item, wxT("wxMenu::SetHelpString: no such item") );
item->SetHelp( helpString );
}
-wxString wxMenuBase::GetHelpString( int id ) const
+wxString wxMenuBase::GetHelpString( int itemid ) const
{
- wxMenuItem *item = FindItem(id);
+ wxMenuItem *item = FindItem(itemid);
wxCHECK_MSG( item, wxEmptyString, wxT("wxMenu::GetHelpString: no such item") );
{
wxASSERT_MSG( !IsAttached(), wxT("menubar already attached!") );
+ SetParent(frame);
m_menuBarFrame = frame;
}
wxASSERT_MSG( IsAttached(), wxT("detaching unattached menubar") );
m_menuBarFrame = NULL;
+ SetParent(NULL);
}
// ----------------------------------------------------------------------------
// wxMenuBar searching for items
// ----------------------------------------------------------------------------
-wxMenuItem *wxMenuBarBase::FindItem(int id, wxMenu **menu) const
+wxMenuItem *wxMenuBarBase::FindItem(int itemid, wxMenu **menu) const
{
if ( menu )
*menu = NULL;
wxMenuList::const_iterator it;
for ( i = 0, it = m_menus.begin(); !item && (i < count); i++, it++ )
{
- item = (*it)->FindItem(id, menu);
+ item = (*it)->FindItem(itemid, menu);
}
return item;
// wxMenuBar functions forwarded to wxMenuItem
// ---------------------------------------------------------------------------
-void wxMenuBarBase::Enable(int id, bool enable)
+void wxMenuBarBase::Enable(int itemid, bool enable)
{
- wxMenuItem *item = FindItem(id);
+ wxMenuItem *item = FindItem(itemid);
wxCHECK_RET( item, wxT("attempt to enable an item which doesn't exist") );
item->Enable(enable);
}
-void wxMenuBarBase::Check(int id, bool check)
+void wxMenuBarBase::Check(int itemid, bool check)
{
- wxMenuItem *item = FindItem(id);
+ wxMenuItem *item = FindItem(itemid);
wxCHECK_RET( item, wxT("attempt to check an item which doesn't exist") );
wxCHECK_RET( item->IsCheckable(), wxT("attempt to check an uncheckable item") );
item->Check(check);
}
-bool wxMenuBarBase::IsChecked(int id) const
+bool wxMenuBarBase::IsChecked(int itemid) const
{
- wxMenuItem *item = FindItem(id);
+ wxMenuItem *item = FindItem(itemid);
wxCHECK_MSG( item, false, wxT("wxMenuBar::IsChecked(): no such item") );
return item->IsChecked();
}
-bool wxMenuBarBase::IsEnabled(int id) const
+bool wxMenuBarBase::IsEnabled(int itemid) const
{
- wxMenuItem *item = FindItem(id);
+ wxMenuItem *item = FindItem(itemid);
wxCHECK_MSG( item, false, wxT("wxMenuBar::IsEnabled(): no such item") );
return item->IsEnabled();
}
-void wxMenuBarBase::SetLabel(int id, const wxString& label)
+void wxMenuBarBase::SetLabel(int itemid, const wxString& label)
{
- wxMenuItem *item = FindItem(id);
+ wxMenuItem *item = FindItem(itemid);
wxCHECK_RET( item, wxT("wxMenuBar::SetLabel(): no such item") );
item->SetItemLabel(label);
}
-wxString wxMenuBarBase::GetLabel(int id) const
+wxString wxMenuBarBase::GetLabel(int itemid) const
{
- wxMenuItem *item = FindItem(id);
+ wxMenuItem *item = FindItem(itemid);
wxCHECK_MSG( item, wxEmptyString,
wxT("wxMenuBar::GetLabel(): no such item") );
return item->GetItemLabel();
}
-void wxMenuBarBase::SetHelpString(int id, const wxString& helpString)
+void wxMenuBarBase::SetHelpString(int itemid, const wxString& helpString)
{
- wxMenuItem *item = FindItem(id);
+ wxMenuItem *item = FindItem(itemid);
wxCHECK_RET( item, wxT("wxMenuBar::SetHelpString(): no such item") );
item->SetHelp(helpString);
}
-wxString wxMenuBarBase::GetHelpString(int id) const
+wxString wxMenuBarBase::GetHelpString(int itemid) const
{
- wxMenuItem *item = FindItem(id);
+ wxMenuItem *item = FindItem(itemid);
wxCHECK_MSG( item, wxEmptyString,
wxT("wxMenuBar::GetHelpString(): no such item") );
void wxMenuBarBase::UpdateMenus()
{
- wxEvtHandler* source;
wxMenu* menu;
int nCount = GetMenuCount();
for (int n = 0; n < nCount; n++)
{
menu = GetMenu( n );
if (menu != NULL)
- {
- source = menu->GetEventHandler();
- if (source != NULL)
- menu->UpdateUI( source );
- }
+ menu->UpdateUI( NULL );
}
}