From e4a23857ec9c4f4e3f3e1251f566f55df31e4177 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 15 Jan 2012 13:41:17 +0000 Subject: [PATCH] Implement wxMenuBar::EnableTop() for wxMSW and wxGTK. This method was only available in wxUniv before and just always returned true in the other ports. Implement it for wxMSW and wxGTK too now and document it. Also add a unit test. Closes #795. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@70350 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/changes.txt | 1 + include/wx/gtk/menu.h | 1 + include/wx/msw/menu.h | 1 + include/wx/osx/menu.h | 1 + interface/wx/menu.h | 10 ++++++++++ src/gtk/menu.cpp | 9 +++++++++ src/msw/menu.cpp | 13 +++++++++++++ src/osx/menu_osx.cpp | 11 +++++++++++ tests/menu/menu.cpp | 12 ++++++++++++ 9 files changed, 59 insertions(+) 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(); -- 2.47.2