diff --git a/docs/changes.txt b/docs/changes.txt index 6722097017..f61bf6a8e4 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -466,6 +466,7 @@ All (GUI): - Add InsertXXXButton() to wxRibbonButtonBar and wxRibbonToolBar (Emilien Kia). - Allow enabling/disabling and toggling tools in wxRibbonToolBar (Emilien Kia). - Fix multiple item selection in generic wxTreeCtrl (Igor Korot). +- Implement wxMenuBar::IsEnabledTop() for all major ports (Igor Korot). - Implement best size calculation for report mode wxListCtrl. GTK: diff --git a/include/wx/gtk/menu.h b/include/wx/gtk/menu.h index 4f5cf6f187..9e2f53f5a2 100644 --- a/include/wx/gtk/menu.h +++ b/include/wx/gtk/menu.h @@ -33,6 +33,7 @@ public: virtual wxMenuItem* FindItem( int id, wxMenu **menu = NULL ) const; virtual void EnableTop( size_t pos, bool flag ); + virtual bool IsEnabledTop(size_t pos) const; virtual void SetMenuLabel( size_t pos, const wxString& label ); virtual wxString GetMenuLabel( size_t pos ) const; diff --git a/include/wx/msw/menu.h b/include/wx/msw/menu.h index 3ea8404309..0e7c6c52f0 100644 --- a/include/wx/msw/menu.h +++ b/include/wx/msw/menu.h @@ -197,6 +197,7 @@ public: virtual wxMenu *Remove(size_t pos); virtual void EnableTop( size_t pos, bool flag ); + virtual bool IsEnabledTop(size_t pos) const; virtual void SetMenuLabel( size_t pos, const wxString& label ); virtual wxString GetMenuLabel( size_t pos ) const; diff --git a/include/wx/osx/menu.h b/include/wx/osx/menu.h index b3d742defd..17f351efd6 100644 --- a/include/wx/osx/menu.h +++ b/include/wx/osx/menu.h @@ -131,6 +131,7 @@ public: virtual wxMenu *Remove(size_t pos); virtual void EnableTop( size_t pos, bool flag ); + virtual bool IsEnabledTop(size_t pos) const; virtual void SetMenuLabel( size_t pos, const wxString& label ); virtual wxString GetMenuLabel( size_t pos ) const; virtual bool Enable( bool enable = true ); diff --git a/interface/wx/menu.h b/interface/wx/menu.h index d07bf47c1c..93987854ae 100644 --- a/interface/wx/menu.h +++ b/interface/wx/menu.h @@ -107,6 +107,16 @@ public: */ void Enable(int id, bool enable); + /** + Returns true if the menu with the given index is enabled. + + @param pos + The menu position (0-based) + + @since 2.9.4 + */ + bool IsEnabledTop(size_t pos) const; + /** Enables or disables a whole menu. diff --git a/src/gtk/menu.cpp b/src/gtk/menu.cpp index 8c6cf5ea49..83bece8ee6 100644 --- a/src/gtk/menu.cpp +++ b/src/gtk/menu.cpp @@ -416,6 +416,15 @@ void wxMenuBar::EnableTop( size_t pos, bool flag ) gtk_widget_set_sensitive( menu->m_owner, flag ); } +bool wxMenuBar::IsEnabledTop(size_t pos) const +{ + wxMenuList::compatibility_iterator node = m_menus.Item( pos ); + wxCHECK_MSG( node, false, wxS("invalid index in IsEnabledTop") ); + wxMenu* const menu = node->GetData(); + wxCHECK_MSG( menu->m_owner, true, wxS("no menu owner?") ); + return gtk_widget_get_sensitive( menu->m_owner ); +} + wxString wxMenuBar::GetMenuLabel( size_t pos ) const { wxMenuList::compatibility_iterator node = m_menus.Item( pos ); diff --git a/src/msw/menu.cpp b/src/msw/menu.cpp index de56a5509a..b50e52e0cc 100644 --- a/src/msw/menu.cpp +++ b/src/msw/menu.cpp @@ -1221,6 +1221,19 @@ void wxMenuBar::EnableTop(size_t pos, bool enable) Refresh(); } +bool wxMenuBar::IsEnabledTop(size_t pos) const +{ + wxCHECK_MSG( pos < GetMenuCount(), false, wxS("invalid menu index") ); + WinStruct mii; + mii.fMask = MIIM_STATE; + if ( !::GetMenuItemInfo(GetHmenu(), pos, TRUE, &mii) ) + { + wxLogLastError(wxS("GetMenuItemInfo(menubar)")); + } + + return !(mii.fState & MFS_GRAYED); +} + void wxMenuBar::SetMenuLabel(size_t pos, const wxString& label) { wxCHECK_RET( pos < GetMenuCount(), wxT("invalid menu index") ); diff --git a/src/osx/menu_osx.cpp b/src/osx/menu_osx.cpp index da7d66545a..e36c6901c7 100644 --- a/src/osx/menu_osx.cpp +++ b/src/osx/menu_osx.cpp @@ -833,6 +833,17 @@ void wxMenuBar::EnableTop(size_t pos, bool enable) Refresh(); } +bool wxMenuBar::IsEnabledTop(size_t pos) const +{ + wxCHECK_MSG( IsAttached(), true, + wxT("doesn't work with unattached menubars") ); + + wxMenuItem* const item = m_rootMenu->FindItemByPosition(pos+firstMenuPos); + wxCHECK_MSG( item, false, wxT("invalid menu index") ); + + return item->IsEnabled(); +} + bool wxMenuBar::Enable(bool enable) { wxCHECK_MSG( IsAttached(), false, wxT("doesn't work with unattached menubars") ); diff --git a/tests/menu/menu.cpp b/tests/menu/menu.cpp index 7c0c3551d8..60edc46d64 100644 --- a/tests/menu/menu.cpp +++ b/tests/menu/menu.cpp @@ -82,6 +82,7 @@ private: CPPUNIT_TEST_SUITE( MenuTestCase ); CPPUNIT_TEST( FindInMenubar ); CPPUNIT_TEST( FindInMenu ); + CPPUNIT_TEST( EnableTop ); CPPUNIT_TEST( Count ); CPPUNIT_TEST( Labels ); CPPUNIT_TEST( RadioItems ); @@ -92,6 +93,7 @@ private: void FindInMenubar(); void FindInMenu(); + void EnableTop(); void Count(); void Labels(); void RadioItems(); @@ -258,6 +260,16 @@ void MenuTestCase::FindInMenu() } } +void MenuTestCase::EnableTop() +{ + wxMenuBar* const bar = m_frame->GetMenuBar(); + CPPUNIT_ASSERT( bar->IsEnabledTop(0) ); + bar->EnableTop( 0, false ); + CPPUNIT_ASSERT( !bar->IsEnabledTop(0) ); + bar->EnableTop( 0, true ); + CPPUNIT_ASSERT( bar->IsEnabledTop(0) ); +} + void MenuTestCase::Count() { wxMenuBar* bar = m_frame->GetMenuBar();