Simplify wxMSW wxMenuBar title management.

Store the titles of the menu bar menus in the menu objects themselves. This
makes wxMenu::GetTitle() return the expected result for them (which also fixes
the current unit test failures for wxMSW) and makes wxMenuBar code simpler.

This removes the wxMenuInfo class which existed for XTI purposes only but as
it was apparently unfinished and MSW-specific it shouldn't be a big loss.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@66178 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 2010-11-17 01:20:50 +00:00
parent 5d4510dc48
commit 7ee9a64bd6
2 changed files with 13 additions and 76 deletions

View File

@ -154,25 +154,6 @@ private:
// Menu Bar (a la Windows)
// ----------------------------------------------------------------------------
class WXDLLIMPEXP_CORE wxMenuInfo : public wxObject
{
public :
wxMenuInfo() { m_menu = NULL; }
virtual ~wxMenuInfo() { }
void Create( wxMenu *menu , const wxString &title )
{ m_menu = menu; m_title = title; }
wxMenu* GetMenu() const { return m_menu; }
wxString GetTitle() const { return m_title; }
private :
wxMenu *m_menu;
wxString m_title;
DECLARE_DYNAMIC_CLASS(wxMenuInfo)
};
WX_DECLARE_EXPORTED_LIST(wxMenuInfo, wxMenuInfoList );
class WXDLLIMPEXP_CORE wxMenuBar : public wxMenuBarBase
{
public:
@ -186,9 +167,6 @@ public:
virtual ~wxMenuBar();
// menubar construction
bool Append( wxMenuInfo *info ) { return Append( info->GetMenu() , info->GetTitle() ); }
const wxMenuInfoList& GetMenuInfos() const;
virtual bool Append( wxMenu *menu, const wxString &title );
virtual bool Insert(size_t pos, wxMenu *menu, const wxString& title);
virtual wxMenu *Replace(size_t pos, wxMenu *menu, const wxString& title);
@ -234,9 +212,6 @@ protected:
// common part of all ctors
void Init();
wxArrayString m_titles;
wxMenuInfoList m_menuInfos;
WXHMENU m_hMenu;
// Return the MSW position for a wxMenu which is sometimes different from

View File

@ -163,8 +163,6 @@ inline bool IsGreaterThanStdSize(const wxBitmap& bmp)
#include "wx/listimpl.cpp"
WX_DEFINE_LIST( wxMenuInfoList )
#if wxUSE_EXTENDED_RTTI
WX_DEFINE_FLAGS( wxMenuStyle )
@ -210,27 +208,6 @@ IMPLEMENT_DYNAMIC_CLASS_XTI_CALLBACK(wxMenuBar, wxWindow ,"wx/menu.h",wxMenuBarS
IMPLEMENT_DYNAMIC_CLASS_XTI(wxMenuInfo, wxObject , "wx/menu.h" )
wxBEGIN_PROPERTIES_TABLE(wxMenuInfo)
wxREADONLY_PROPERTY( Menu , wxMenu* , GetMenu , EMPTY_MACROVALUE , 0 /*flags*/ , wxT("Helpstring") , wxT("group"))
wxREADONLY_PROPERTY( Title , wxString , GetTitle , wxString() , 0 /*flags*/ , wxT("Helpstring") , wxT("group"))
wxEND_PROPERTIES_TABLE()
wxBEGIN_HANDLERS_TABLE(wxMenuInfo)
wxEND_HANDLERS_TABLE()
wxCONSTRUCTOR_2( wxMenuInfo , wxMenu* , Menu , wxString , Title )
wxCOLLECTION_TYPE_INFO( wxMenuInfo * , wxMenuInfoList ) ;
template<> void wxCollectionToVariantArray( wxMenuInfoList const &theList, wxxVariantArray &value)
{
wxListCollectionToVariantArray<wxMenuInfoList::compatibility_iterator>( theList , value ) ;
}
wxBEGIN_PROPERTIES_TABLE(wxMenuBar)
wxPROPERTY_COLLECTION( MenuInfos , wxMenuInfoList , wxMenuInfo* , Append , GetMenuInfos , 0 /*flags*/ , wxT("Helpstring") , wxT("group"))
wxEND_PROPERTIES_TABLE()
wxBEGIN_HANDLERS_TABLE(wxMenuBar)
wxEND_HANDLERS_TABLE()
@ -239,22 +216,8 @@ wxCONSTRUCTOR_DUMMY( wxMenuBar )
#else
IMPLEMENT_DYNAMIC_CLASS(wxMenu, wxEvtHandler)
IMPLEMENT_DYNAMIC_CLASS(wxMenuBar, wxWindow)
IMPLEMENT_DYNAMIC_CLASS(wxMenuInfo, wxObject)
#endif
const wxMenuInfoList& wxMenuBar::GetMenuInfos() const
{
wxMenuInfoList* list = const_cast< wxMenuInfoList* >( &m_menuInfos ) ;
WX_CLEAR_LIST( wxMenuInfoList , *list ) ;
for( size_t i = 0 ; i < GetMenuCount() ; ++i )
{
wxMenuInfo* info = new wxMenuInfo() ;
info->Create( const_cast<wxMenuBar*>(this)->GetMenu(i) , GetMenuLabel(i) ) ;
list->Append( info ) ;
}
return m_menuInfos ;
}
// ---------------------------------------------------------------------------
// wxMenu construction, adding and removing menu items
// ---------------------------------------------------------------------------
@ -1013,12 +976,13 @@ wxMenuBar::wxMenuBar(size_t count, wxMenu *menus[], const wxString titles[], lon
{
Init();
m_titles.Alloc(count);
for ( size_t i = 0; i < count; i++ )
{
// We just want to store the menu title in the menu itself, not to
// show it as a dummy item in the menu itself as we do with the popup
// menu titles in overridden wxMenu::SetTitle().
menus[i]->wxMenuBase::SetTitle(titles[i]);
m_menus.Append(menus[i]);
m_titles.Add(titles[i]);
menus[i]->Attach(this);
}
@ -1131,13 +1095,13 @@ WXHMENU wxMenuBar::Create()
}
else
{
size_t count = GetMenuCount(), i;
wxMenuList::iterator it;
for ( i = 0, it = m_menus.begin(); i < count; i++, it++ )
for ( wxMenuList::iterator it = m_menus.begin();
it != m_menus.end();
++it )
{
if ( !::AppendMenu((HMENU)m_hMenu, MF_POPUP | MF_STRING,
(UINT_PTR)(*it)->GetHMenu(),
m_titles[i].wx_str()) )
(*it)->GetTitle().wx_str()) )
{
wxLogLastError(wxT("AppendMenu"));
}
@ -1198,7 +1162,7 @@ void wxMenuBar::SetMenuLabel(size_t pos, const wxString& label)
{
wxCHECK_RET( pos < GetMenuCount(), wxT("invalid menu index") );
m_titles[pos] = label;
m_menus[pos]->wxMenuBase::SetTitle(label);
if ( !IsAttached() )
{
@ -1257,7 +1221,7 @@ wxString wxMenuBar::GetMenuLabel(size_t pos) const
wxCHECK_MSG( pos < GetMenuCount(), wxEmptyString,
wxT("invalid menu index in wxMenuBar::GetMenuLabel") );
return m_titles[pos];
return m_menus[pos]->GetTitle();
}
// ---------------------------------------------------------------------------
@ -1270,7 +1234,7 @@ wxMenu *wxMenuBar::Replace(size_t pos, wxMenu *menu, const wxString& title)
if ( !menuOld )
return NULL;
m_titles[pos] = title;
menu->wxMenuBase::SetTitle(title);
#if defined(WINCE_WITHOUT_COMMANDBAR)
if (IsAttached())
@ -1327,7 +1291,7 @@ bool wxMenuBar::Insert(size_t pos, wxMenu *menu, const wxString& title)
if ( !wxMenuBarBase::Insert(pos, menu, title) )
return false;
m_titles.Insert(title, pos);
menu->wxMenuBase::SetTitle(title);
if ( isAttached )
{
@ -1383,7 +1347,7 @@ bool wxMenuBar::Append(wxMenu *menu, const wxString& title)
if ( !wxMenuBarBase::Append(menu, title) )
return false;
m_titles.Add(title);
menu->wxMenuBase::SetTitle(title);
#if defined(WINCE_WITHOUT_COMMANDBAR)
if (IsAttached())
@ -1474,8 +1438,6 @@ wxMenu *wxMenuBar::Remove(size_t pos)
Refresh();
}
m_titles.RemoveAt(pos);
return menu;
}