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
This commit is contained in:
Vadim Zeitlin
2012-01-15 13:41:17 +00:00
parent 2db3b9a6a4
commit e4a23857ec
9 changed files with 59 additions and 0 deletions

View File

@@ -466,6 +466,7 @@ All (GUI):
- Add InsertXXXButton() to wxRibbonButtonBar and wxRibbonToolBar (Emilien Kia). - Add InsertXXXButton() to wxRibbonButtonBar and wxRibbonToolBar (Emilien Kia).
- Allow enabling/disabling and toggling tools in wxRibbonToolBar (Emilien Kia). - Allow enabling/disabling and toggling tools in wxRibbonToolBar (Emilien Kia).
- Fix multiple item selection in generic wxTreeCtrl (Igor Korot). - 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. - Implement best size calculation for report mode wxListCtrl.
GTK: GTK:

View File

@@ -33,6 +33,7 @@ public:
virtual wxMenuItem* FindItem( int id, wxMenu **menu = NULL ) const; virtual wxMenuItem* FindItem( int id, wxMenu **menu = NULL ) const;
virtual void EnableTop( size_t pos, bool flag ); 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 void SetMenuLabel( size_t pos, const wxString& label );
virtual wxString GetMenuLabel( size_t pos ) const; virtual wxString GetMenuLabel( size_t pos ) const;

View File

@@ -197,6 +197,7 @@ public:
virtual wxMenu *Remove(size_t pos); virtual wxMenu *Remove(size_t pos);
virtual void EnableTop( size_t pos, bool flag ); 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 void SetMenuLabel( size_t pos, const wxString& label );
virtual wxString GetMenuLabel( size_t pos ) const; virtual wxString GetMenuLabel( size_t pos ) const;

View File

@@ -131,6 +131,7 @@ public:
virtual wxMenu *Remove(size_t pos); virtual wxMenu *Remove(size_t pos);
virtual void EnableTop( size_t pos, bool flag ); 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 void SetMenuLabel( size_t pos, const wxString& label );
virtual wxString GetMenuLabel( size_t pos ) const; virtual wxString GetMenuLabel( size_t pos ) const;
virtual bool Enable( bool enable = true ); virtual bool Enable( bool enable = true );

View File

@@ -107,6 +107,16 @@ public:
*/ */
void Enable(int id, bool enable); 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. Enables or disables a whole menu.

View File

@@ -416,6 +416,15 @@ void wxMenuBar::EnableTop( size_t pos, bool flag )
gtk_widget_set_sensitive( menu->m_owner, 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 wxString wxMenuBar::GetMenuLabel( size_t pos ) const
{ {
wxMenuList::compatibility_iterator node = m_menus.Item( pos ); wxMenuList::compatibility_iterator node = m_menus.Item( pos );

View File

@@ -1221,6 +1221,19 @@ void wxMenuBar::EnableTop(size_t pos, bool enable)
Refresh(); 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) void wxMenuBar::SetMenuLabel(size_t pos, const wxString& label)
{ {
wxCHECK_RET( pos < GetMenuCount(), wxT("invalid menu index") ); wxCHECK_RET( pos < GetMenuCount(), wxT("invalid menu index") );

View File

@@ -833,6 +833,17 @@ void wxMenuBar::EnableTop(size_t pos, bool enable)
Refresh(); 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) bool wxMenuBar::Enable(bool enable)
{ {
wxCHECK_MSG( IsAttached(), false, wxT("doesn't work with unattached menubars") ); wxCHECK_MSG( IsAttached(), false, wxT("doesn't work with unattached menubars") );

View File

@@ -82,6 +82,7 @@ private:
CPPUNIT_TEST_SUITE( MenuTestCase ); CPPUNIT_TEST_SUITE( MenuTestCase );
CPPUNIT_TEST( FindInMenubar ); CPPUNIT_TEST( FindInMenubar );
CPPUNIT_TEST( FindInMenu ); CPPUNIT_TEST( FindInMenu );
CPPUNIT_TEST( EnableTop );
CPPUNIT_TEST( Count ); CPPUNIT_TEST( Count );
CPPUNIT_TEST( Labels ); CPPUNIT_TEST( Labels );
CPPUNIT_TEST( RadioItems ); CPPUNIT_TEST( RadioItems );
@@ -92,6 +93,7 @@ private:
void FindInMenubar(); void FindInMenubar();
void FindInMenu(); void FindInMenu();
void EnableTop();
void Count(); void Count();
void Labels(); void Labels();
void RadioItems(); 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() void MenuTestCase::Count()
{ {
wxMenuBar* bar = m_frame->GetMenuBar(); wxMenuBar* bar = m_frame->GetMenuBar();