// XTI for wxMenu(Bar)
// ----------------------------------------------------------------------------
-#if wxUSE_EXTENDED_RTTI
-
-WX_DEFINE_LIST( wxMenuInfoList )
-
wxDEFINE_FLAGS( wxMenuStyle )
wxBEGIN_FLAGS( wxMenuStyle )
wxFLAGS_MEMBER(wxMENU_TEAROFF)
wxIMPLEMENT_DYNAMIC_CLASS_XTI(wxMenu, wxEvtHandler, "wx/menu.h")
wxCOLLECTION_TYPE_INFO( wxMenuItem *, wxMenuItemList ) ;
+#if wxUSE_EXTENDED_RTTI
template<> void wxCollectionToVariantArray( wxMenuItemList const &theList,
- wxVariantBaseArray &value)
+ wxAnyList &value)
{
- wxListCollectionToVariantArray<wxMenuItemList::compatibility_iterator>( theList, 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 *,
- wxObjectReaderCallback *, wxVariantBaseArray & )
+ wxObjectWriterCallback *, const wxStringToAnyHashMap & )
{
return true;
}
+#endif
wxIMPLEMENT_DYNAMIC_CLASS_XTI_CALLBACK(wxMenuBar, wxWindow, "wx/menu.h", \
wxMenuBarStreamingCallback)
-wxIMPLEMENT_DYNAMIC_CLASS_XTI(wxMenuInfo, wxObject, "wx/menu.h")
-wxBEGIN_PROPERTIES_TABLE(wxMenuInfo)
+#if wxUSE_EXTENDED_RTTI
+WX_DEFINE_LIST( wxMenuInfoHelperList )
+
+wxIMPLEMENT_DYNAMIC_CLASS_XTI(wxMenuInfoHelper, wxObject, "wx/menu.h")
+
+wxBEGIN_PROPERTIES_TABLE(wxMenuInfoHelper)
wxREADONLY_PROPERTY( Menu, wxMenu*, GetMenu, wxEMPTY_PARAMETER_VALUE, \
0 /*flags*/, wxT("Helpstring"), wxT("group"))
0 /*flags*/, wxT("Helpstring"), wxT("group"))
wxEND_PROPERTIES_TABLE()
-wxEMPTY_HANDLERS_TABLE(wxMenuInfo)
+wxEMPTY_HANDLERS_TABLE(wxMenuInfoHelper)
-wxCONSTRUCTOR_2( wxMenuInfo, wxMenu*, Menu, wxString, Title )
+wxCONSTRUCTOR_2( wxMenuInfoHelper, wxMenu*, Menu, wxString, Title )
-wxCOLLECTION_TYPE_INFO( wxMenuInfo *, wxMenuInfoList ) ;
+wxCOLLECTION_TYPE_INFO( wxMenuInfoHelper *, wxMenuInfoHelperList ) ;
-template<> void wxCollectionToVariantArray( wxMenuInfoList const &theList,
- wxVariantBaseArray &value)
+template<> void wxCollectionToVariantArray( wxMenuInfoHelperList const &theList,
+ wxAnyList &value)
{
- wxListCollectionToVariantArray<wxMenuInfoList::compatibility_iterator>( theList, value ) ;
+ wxListCollectionToAnyList<wxMenuInfoHelperList::compatibility_iterator>( theList, value ) ;
}
+#endif
+
wxBEGIN_PROPERTIES_TABLE(wxMenuBar)
-wxPROPERTY_COLLECTION( MenuInfos, wxMenuInfoList, wxMenuInfo*, AppendMenuInfo, \
+wxPROPERTY_COLLECTION( MenuInfos, wxMenuInfoHelperList, wxMenuInfoHelper*, AppendMenuInfo, \
GetMenuInfos, 0 /*flags*/, wxT("Helpstring"), wxT("group"))
wxEND_PROPERTIES_TABLE()
wxCONSTRUCTOR_DUMMY( wxMenuBar )
-#else
-// IMPLEMENT_DYNAMIC_CLASS(wxMenu, wxEvtHandler)
-// IMPLEMENT_DYNAMIC_CLASS(wxMenuBar, wxWindow)
-// IMPLEMENT_DYNAMIC_CLASS(wxMenuInfo, wxObject)
-#endif
+#if wxUSE_EXTENDED_RTTI
+
+const wxMenuInfoHelperList& wxMenuBarBase::GetMenuInfos() const
+{
+ wxMenuInfoHelperList* list = const_cast< wxMenuInfoHelperList* > (& m_menuInfos);
+ WX_CLEAR_LIST( wxMenuInfoHelperList, *list);
+ for (size_t i = 0 ; i < GetMenuCount(); ++i)
+ {
+ wxMenuInfoHelper* info = new wxMenuInfoHelper();
+ info->Create( GetMenu(i), GetMenuLabel(i));
+ list->Append(info);
+ }
+ return m_menuInfos;
+}
+#endif
// ----------------------------------------------------------------------------
// XTI for wxMenuItem
#if wxUSE_EXTENDED_RTTI
bool wxMenuItemStreamingCallback( const wxObject *object, wxObjectWriter *,
- wxObjectReaderCallback *, wxVariantBaseArray & )
+ wxObjectWriterCallback *, const wxStringToAnyHashMap & )
{
const wxMenuItem * mitem = wx_dynamic_cast(const wxMenuItem*, object);
if ( mitem->GetMenu() && !mitem->GetMenu()->GetTitle().empty() )
return true;
}
+#endif
+
wxBEGIN_ENUM( wxItemKind )
wxENUM_MEMBER( wxITEM_SEPARATOR )
wxENUM_MEMBER( wxITEM_NORMAL )
0 /*flags*/, wxT("Helpstring"), wxT("group") )
wxPROPERTY( Id, int, SetId, GetId, wxEMPTY_PARAMETER_VALUE, \
0 /*flags*/, wxT("Helpstring"), wxT("group") )
-wxPROPERTY( Text, wxString, SetText, GetText, wxString(), \
+wxPROPERTY( ItemLabel, wxString, SetItemLabel, GetItemLabel, wxString(), \
0 /*flags*/, wxT("Helpstring"), wxT("group") )
wxPROPERTY( Help, wxString, SetHelp, GetHelp, wxString(), \
0 /*flags*/, wxT("Helpstring"), wxT("group") )
0 /*flags*/, wxT("Helpstring"), wxT("group") )
wxPROPERTY( SubMenu, wxMenu*, SetSubMenu, GetSubMenu, wxEMPTY_PARAMETER_VALUE, \
0 /*flags*/, wxT("Helpstring"), wxT("group") )
-wxPROPERTY( Enabled, bool, Enable, IsEnabled, wxVariantBase((bool)true), \
+wxPROPERTY( Enabled, bool, Enable, IsEnabled, wxAny((bool)true), \
0 /*flags*/, wxT("Helpstring"), wxT("group") )
-wxPROPERTY( Checked, bool, Check, IsChecked, wxVariantBase((bool)false), \
+wxPROPERTY( Checked, bool, Check, IsChecked, wxAny((bool)false), \
0 /*flags*/, wxT("Helpstring"), wxT("group") )
-wxPROPERTY( Checkable, bool, SetCheckable, IsCheckable, wxVariantBase((bool)false), \
+wxPROPERTY( Checkable, bool, SetCheckable, IsCheckable, wxAny((bool)false), \
0 /*flags*/, wxT("Helpstring"), wxT("group") )
wxEND_PROPERTIES_TABLE()
wxDIRECT_CONSTRUCTOR_6( wxMenuItem, wxMenu*, Parent, int, Id, wxString, \
Text, wxString, Help, wxItemKind, Kind, wxMenu*, SubMenu )
-#else
-//IMPLEMENT_DYNAMIC_CLASS(wxMenuItem, wxObject)
-#endif
// ----------------------------------------------------------------------------
// wxMenuItemBase
// ----------------------------------------------------------------------------
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 );
}
}