]> git.saurik.com Git - wxWidgets.git/commitdiff
Implement wxMenuBar::EnableTop() for wxMSW and wxGTK.
authorVadim Zeitlin <vadim@wxwidgets.org>
Sun, 15 Jan 2012 13:41:17 +0000 (13:41 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sun, 15 Jan 2012 13:41:17 +0000 (13:41 +0000)
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
include/wx/gtk/menu.h
include/wx/msw/menu.h
include/wx/osx/menu.h
interface/wx/menu.h
src/gtk/menu.cpp
src/msw/menu.cpp
src/osx/menu_osx.cpp
tests/menu/menu.cpp

index 6722097017cb66f244d5d23db044962d70805859..f61bf6a8e41d6ea95ee157769b9282d2d8124e26 100644 (file)
@@ -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:
index 4f5cf6f187e32207ea10be433b362b6d99e8b7a1..9e2f53f5a29b740a706f075e1438e7767fe63bd1 100644 (file)
@@ -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;
 
index 3ea840430974eed2dab1fd0bf6ab557526e197de..0e7c6c52f013eb5f5b46d694bc760e3a750f2d51 100644 (file)
@@ -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;
 
index b3d742defd86ba75511f333070f9460d11ed117d..17f351efd6ff0c724c86a553213522b905a0bd8f 100644 (file)
@@ -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 );
index d07bf47c1c2d38f5cc8fb2aa9d019b0e9f186adc..93987854aee3131be277c49944e04c2c61e2f796 100644 (file)
@@ -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.
 
index 8c6cf5ea49e4f114d3d394c7690cd4d6a281dfc3..83bece8ee67467671804f66003fe2629cc99ec99 100644 (file)
@@ -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 );
index de56a5509a8bfcc61ed3dc38ba945b00fec87d0f..b50e52e0cc8f824d3cd99de32a56a62642b43004 100644 (file)
@@ -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<MENUITEMINFO> 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") );
index da7d66545a7e11ca6b1ffaf57ea1c394624109ca..e36c6901c78a76f12b2097d970740bd5182ac69a 100644 (file)
@@ -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") );
index 7c0c3551d860bd07a352a6d54048c9818557bfdf..60edc46d6401f177b5ec23ed4a92aecf3d82f0e9 100644 (file)
@@ -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();