wxMenuBarBase for MSW (untested)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@4205 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -197,10 +197,8 @@ private:
|
||||
// Menu Bar (a la Windows)
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
class WXDLLEXPORT wxMenuBar : public wxEvtHandler
|
||||
class WXDLLEXPORT wxMenuBar : public wxMenuBarBase
|
||||
{
|
||||
DECLARE_DYNAMIC_CLASS(wxMenuBar)
|
||||
|
||||
public:
|
||||
// ctors & dtor
|
||||
// default constructor
|
||||
@@ -212,66 +210,38 @@ public:
|
||||
virtual ~wxMenuBar();
|
||||
|
||||
// menubar construction
|
||||
WXHMENU Create();
|
||||
void Append(wxMenu *menu, const wxString& title);
|
||||
void Insert(int pos, wxMenu * menu, const wxString& title);
|
||||
void ReplaceMenu(int pos, wxMenu * new_menu, const wxString& title);
|
||||
int FindMenu(const wxString& title);
|
||||
void Detach();
|
||||
virtual void Delete(wxMenu *menu, int index = 0); /* Menu not destroyed */
|
||||
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);
|
||||
virtual wxMenu *Remove(size_t pos);
|
||||
|
||||
// state control
|
||||
// NB: must only be used AFTER menu has been attached to frame,
|
||||
// otherwise use individual menus to enable/disable items
|
||||
// enable the item
|
||||
void Enable(int id, bool enable);
|
||||
// TRUE if item enabled
|
||||
bool IsEnabled(int id) const;
|
||||
//
|
||||
void EnableTop(int pos, bool enable);
|
||||
virtual int FindMenuItem(const wxString& menuString,
|
||||
const wxString& itemString) const;
|
||||
virtual wxMenuItem* FindItem( int id, wxMenu **menu = NULL ) const;
|
||||
|
||||
// works only with checkable items
|
||||
void Check(int id, bool check);
|
||||
// TRUE if checked
|
||||
bool IsChecked(int id) const;
|
||||
|
||||
void SetLabel(int id, const wxString& label) ;
|
||||
wxString GetLabel(int id) const ;
|
||||
|
||||
virtual void SetHelpString(int id, const wxString& helpString);
|
||||
virtual wxString GetHelpString(int id) const ;
|
||||
|
||||
void SetLabelTop(int pos, const wxString& label) ;
|
||||
wxString GetLabelTop(int pos) const ;
|
||||
virtual void EnableTop( size_t pos, bool flag );
|
||||
virtual void SetLabelTop( size_t pos, const wxString& label );
|
||||
virtual wxString GetLabelTop( size_t pos ) const;
|
||||
|
||||
// notifications: return FALSE to prevent the menu from being
|
||||
// appended/deleted
|
||||
virtual bool OnAppend(wxMenu *menu, const wxChar *title);
|
||||
virtual bool OnDelete(wxMenu *menu, int index);
|
||||
|
||||
// item search
|
||||
// by menu and item names, returns wxNOT_FOUND if not found
|
||||
virtual int FindMenuItem(const wxString& menuString,
|
||||
const wxString& itemString) const;
|
||||
// returns NULL if not found
|
||||
wxMenuItem* FindItem(int id) const { return FindItemForId(id); }
|
||||
// returns NULL if not found, fills menuForItem if !NULL
|
||||
wxMenuItem *FindItemForId(int itemId, wxMenu **menuForItem = NULL) const;
|
||||
|
||||
// submenus access
|
||||
int GetMenuCount() const { return m_menuCount; }
|
||||
wxMenu *GetMenu(int i) const { return m_menus[i]; }
|
||||
|
||||
// compatibility: these functions are deprecated
|
||||
#ifdef WXWIN_COMPATIBILITY
|
||||
void SetEventHandler(wxEvtHandler *handler) { m_eventHandler = handler; }
|
||||
wxEvtHandler *GetEventHandler() { return m_eventHandler; }
|
||||
|
||||
#ifdef WXWIN_COMPATIBILITY
|
||||
// compatibility: these functions are deprecated
|
||||
bool Enabled(int id) const { return IsEnabled(id); }
|
||||
bool Checked(int id) const { return IsChecked(id); }
|
||||
#endif // WXWIN_COMPATIBILITY
|
||||
|
||||
// IMPLEMENTATION
|
||||
// implementation from now on
|
||||
WXHMENU Create();
|
||||
int FindMenu(const wxString& title);
|
||||
void Detach();
|
||||
|
||||
// returns TRUE if we're attached to a frame
|
||||
bool IsAttached() const { return m_menuBarFrame != NULL; }
|
||||
// get the frame we live in
|
||||
@@ -295,10 +265,12 @@ protected:
|
||||
// common part of all ctors
|
||||
void Init();
|
||||
|
||||
#ifdef WXWIN_COMPATIBILITY
|
||||
wxEvtHandler *m_eventHandler;
|
||||
int m_menuCount;
|
||||
wxMenu **m_menus;
|
||||
wxString *m_titles;
|
||||
#endif // WXWIN_COMPATIBILITY
|
||||
|
||||
wxArrayString m_titles;
|
||||
|
||||
wxFrame *m_menuBarFrame;
|
||||
WXHMENU m_hMenu;
|
||||
|
||||
@@ -306,6 +278,9 @@ protected:
|
||||
// the accelerator table for all accelerators in all our menus
|
||||
wxAcceleratorTable m_accelTable;
|
||||
#endif // wxUSE_ACCEL
|
||||
|
||||
private:
|
||||
DECLARE_DYNAMIC_CLASS(wxMenuBar)
|
||||
};
|
||||
|
||||
#endif // _WX_MENU_H_
|
||||
|
@@ -49,7 +49,7 @@ public:
|
||||
|
||||
virtual void Enable(bool bDoEnable = TRUE);
|
||||
virtual void Check(bool bDoCheck = TRUE);
|
||||
virtual void IsChecked() const;
|
||||
virtual bool IsChecked() const;
|
||||
|
||||
// unfortunately needed to resolve ambiguity between
|
||||
// wxMenuItemBase::IsCheckable() and wxOwnerDrawn::IsCheckable()
|
||||
|
218
src/msw/menu.cpp
218
src/msw/menu.cpp
@@ -585,8 +585,6 @@ void wxMenu::Detach()
|
||||
void wxMenuBar::Init()
|
||||
{
|
||||
m_eventHandler = this;
|
||||
m_menuCount = 0;
|
||||
m_menus = NULL;
|
||||
m_titles = NULL;
|
||||
m_menuBarFrame = NULL;
|
||||
m_hMenu = 0;
|
||||
@@ -606,27 +604,19 @@ wxMenuBar::wxMenuBar(int count, wxMenu *menus[], const wxString titles[])
|
||||
{
|
||||
Init();
|
||||
|
||||
m_menuCount = count;
|
||||
m_menus = menus;
|
||||
m_titles = new wxString[count];
|
||||
m_titles.Alloc(count);
|
||||
|
||||
int i;
|
||||
for ( i = 0; i < count; i++ )
|
||||
m_titles[i] = titles[i];
|
||||
for ( int i = 0; i < count; i++ )
|
||||
{
|
||||
m_menus.Append(menus[i]);
|
||||
m_titles.Add(titles[i]);
|
||||
|
||||
for ( i = 0; i < count; i++ )
|
||||
m_menus[i]->Attach(this);
|
||||
menus[i]->Attach(this);
|
||||
}
|
||||
}
|
||||
|
||||
wxMenuBar::~wxMenuBar()
|
||||
{
|
||||
for ( int i = 0; i < m_menuCount; i++ )
|
||||
{
|
||||
delete m_menus[i];
|
||||
}
|
||||
|
||||
delete[] m_menus;
|
||||
delete[] m_titles;
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
@@ -655,7 +645,8 @@ WXHMENU wxMenuBar::Create()
|
||||
}
|
||||
else
|
||||
{
|
||||
for ( int i = 0; i < m_menuCount; i++ )
|
||||
size_t count = GetMenuCount();
|
||||
for ( size_t i = 0; i < count; i++ )
|
||||
{
|
||||
if ( !::AppendMenu((HMENU)m_hMenu, MF_POPUP | MF_STRING,
|
||||
(UINT)m_menus[i]->GetHMenu(),
|
||||
@@ -676,7 +667,7 @@ WXHMENU wxMenuBar::Create()
|
||||
// NB: we don't support owner drawn top level items for now, if we do these
|
||||
// functions would have to be changed to use wxMenuItem as well
|
||||
|
||||
void wxMenuBar::EnableTop(int pos, bool enable)
|
||||
void wxMenuBar::EnableTop(size_t pos, bool enable)
|
||||
{
|
||||
int flag = enable ? MF_ENABLED : MF_GRAYED;;
|
||||
|
||||
@@ -685,7 +676,7 @@ void wxMenuBar::EnableTop(int pos, bool enable)
|
||||
Refresh();
|
||||
}
|
||||
|
||||
void wxMenuBar::SetLabelTop(int pos, const wxString& label)
|
||||
void wxMenuBar::SetLabelTop(size_t pos, const wxString& label)
|
||||
{
|
||||
UINT id;
|
||||
UINT flagsOld = ::GetMenuState((HMENU)m_hMenu, pos, MF_BYPOSITION);
|
||||
@@ -714,7 +705,7 @@ void wxMenuBar::SetLabelTop(int pos, const wxString& label)
|
||||
}
|
||||
}
|
||||
|
||||
wxString wxMenuBar::GetLabelTop(int pos) const
|
||||
wxString wxMenuBar::GetLabelTop(size_t pos) const
|
||||
{
|
||||
int len = ::GetMenuString((HMENU)m_hMenu, pos, NULL, 0, MF_BYCOMMAND);
|
||||
|
||||
@@ -780,10 +771,13 @@ bool wxMenuBar::OnAppend(wxMenu *a_menu, const wxChar *title)
|
||||
// ---------------------------------------------------------------------------
|
||||
// wxMenuBar construction
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
int wxMenuBar::FindMenu(const wxString& title)
|
||||
{
|
||||
wxString menuTitle = wxStripMenuCodes(title);
|
||||
for ( int i = 0; i < m_menuCount; i++ )
|
||||
|
||||
size_t count = GetMenuCount();
|
||||
for ( size_t i = 0; i < count; i++ )
|
||||
{
|
||||
wxString title = wxStripMenuCodes(m_titles[i]);
|
||||
if ( menuTitle == title )
|
||||
@@ -794,121 +788,75 @@ int wxMenuBar::FindMenu(const wxString& title)
|
||||
|
||||
}
|
||||
|
||||
|
||||
void wxMenuBar::ReplaceMenu(int pos, wxMenu * new_menu, const wxString& title)
|
||||
wxMenu *wxMenuBar::Replace(size_t pos, wxMenu *menu, const wxString& title)
|
||||
{
|
||||
if (m_menuBarFrame) return;
|
||||
|
||||
if ( pos >= 0 && pos < m_menuCount )
|
||||
if ( m_menuBarFrame )
|
||||
{
|
||||
wxMenu *old_menu = m_menus[pos];
|
||||
m_menus[pos] = new_menu;
|
||||
delete old_menu;
|
||||
wxFAIL_MSG(wxT("not implemented"));
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
void wxMenuBar::Insert(int pos, wxMenu * menu, const wxString& title)
|
||||
{
|
||||
if (m_menuBarFrame) return;
|
||||
if ( pos < 0 && pos >= m_menuCount ) return;
|
||||
|
||||
m_menuCount ++;
|
||||
wxMenu **new_menus = new wxMenu *[m_menuCount];
|
||||
wxString *new_titles = new wxString[m_menuCount];
|
||||
int i;
|
||||
|
||||
for (i = 0; i < pos; i++)
|
||||
else
|
||||
{
|
||||
new_menus[i] = m_menus[i];
|
||||
m_menus[i] = NULL;
|
||||
new_titles[i] = m_titles[i];
|
||||
m_titles[i] = wxT("");
|
||||
}
|
||||
|
||||
new_menus[pos] = (wxMenu *)menu;
|
||||
new_titles[i] = title;
|
||||
|
||||
for (i = pos+1; i < m_menuCount; i++)
|
||||
{
|
||||
new_menus[i] = m_menus[i-1];
|
||||
m_menus[i-1] = NULL;
|
||||
new_titles[i] = m_titles[i-1];
|
||||
m_titles[i-1] = wxT("");
|
||||
}
|
||||
if (m_menus)
|
||||
{
|
||||
delete[]m_menus;
|
||||
delete[]m_titles;
|
||||
}
|
||||
m_menus = new_menus;
|
||||
m_titles = new_titles;
|
||||
|
||||
menu->SetParent(this);
|
||||
|
||||
}
|
||||
|
||||
|
||||
void wxMenuBar::Append (wxMenu * menu, const wxString& title)
|
||||
{
|
||||
if (!OnAppend(menu, title))
|
||||
return;
|
||||
|
||||
m_menuCount ++;
|
||||
wxMenu **new_menus = new wxMenu *[m_menuCount];
|
||||
wxString *new_titles = new wxString[m_menuCount];
|
||||
int i;
|
||||
|
||||
for (i = 0; i < m_menuCount - 1; i++)
|
||||
{
|
||||
new_menus[i] = m_menus[i];
|
||||
m_menus[i] = NULL;
|
||||
new_titles[i] = m_titles[i];
|
||||
m_titles[i] = wxT("");
|
||||
}
|
||||
if (m_menus)
|
||||
{
|
||||
delete[]m_menus;
|
||||
delete[]m_titles;
|
||||
}
|
||||
m_menus = new_menus;
|
||||
m_titles = new_titles;
|
||||
|
||||
m_menus[m_menuCount - 1] = (wxMenu *)menu;
|
||||
m_titles[m_menuCount - 1] = title;
|
||||
|
||||
menu->SetParent(this);
|
||||
}
|
||||
|
||||
void wxMenuBar::Delete(wxMenu * menu, int i)
|
||||
{
|
||||
int j;
|
||||
int ii = (int) i;
|
||||
|
||||
if (menu != 0) {
|
||||
for (ii = 0; ii < m_menuCount; ii++) {
|
||||
if (m_menus[ii] == menu)
|
||||
break;
|
||||
wxMenu *menuOld = wxMenuBarBase::Replace(pos, menu, title);
|
||||
if ( menuOld )
|
||||
{
|
||||
m_titles[pos] = title;
|
||||
}
|
||||
if (ii >= m_menuCount)
|
||||
return;
|
||||
} else {
|
||||
if (ii < 0 || ii >= m_menuCount)
|
||||
return;
|
||||
menu = m_menus[ii];
|
||||
}
|
||||
|
||||
if (!OnDelete(menu, ii))
|
||||
return;
|
||||
return menuOld;
|
||||
}
|
||||
}
|
||||
|
||||
bool wxMenuBar::Insert(size_t pos, wxMenu *menu, const wxString& title)
|
||||
{
|
||||
if ( m_menuBarFrame )
|
||||
{
|
||||
wxFAIL_MSG(wxT("not implemented"));
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( !wxMenuBarBase::Insert(pos, menu, title) )
|
||||
return FALSE;
|
||||
|
||||
m_titles.Insert(title, pos);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
bool wxMenuBar::Append(wxMenu * menu, const wxString& title)
|
||||
{
|
||||
if ( !wxMenuBarBase::Append(menu, title) )
|
||||
return FALSE;
|
||||
|
||||
// menu is already appended, ignore errors
|
||||
(void)OnAppend(menu, title);
|
||||
|
||||
m_titles.Add(title);
|
||||
|
||||
menu->SetParent(this);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
wxMenu *wxMenuBar::Remove(size_t pos)
|
||||
{
|
||||
wxMenu *menu = wxMenuBarBase::Remove(pos);
|
||||
if ( !menu )
|
||||
return NULL;
|
||||
|
||||
menu->SetParent(NULL);
|
||||
|
||||
-- m_menuCount;
|
||||
for (j = ii; j < m_menuCount; j++) {
|
||||
m_menus[j] = m_menus[j + 1];
|
||||
m_titles[j] = m_titles[j + 1];
|
||||
}
|
||||
// the menu is deleted from the list anyhow, so we have to ignore all
|
||||
// possible errors here
|
||||
(void)OnDelete(menu, pos);
|
||||
|
||||
m_titles.Remove(pos);
|
||||
|
||||
return menu;
|
||||
}
|
||||
|
||||
void wxMenuBar::Attach(wxFrame *frame)
|
||||
@@ -921,8 +869,8 @@ void wxMenuBar::Attach(wxFrame *frame)
|
||||
// create the accel table - we consider that the menubar construction is
|
||||
// finished
|
||||
size_t nAccelCount = 0;
|
||||
int i;
|
||||
for ( i = 0; i < m_menuCount; i++ )
|
||||
size_t i, count = GetMenuCount();
|
||||
for ( i = 0; i < count; i++ )
|
||||
{
|
||||
nAccelCount += m_menus[i]->GetAccelCount();
|
||||
}
|
||||
@@ -932,7 +880,7 @@ void wxMenuBar::Attach(wxFrame *frame)
|
||||
wxAcceleratorEntry *accelEntries = new wxAcceleratorEntry[nAccelCount];
|
||||
|
||||
nAccelCount = 0;
|
||||
for ( i = 0; i < m_menuCount; i++ )
|
||||
for ( i = 0; i < count; i++ )
|
||||
{
|
||||
nAccelCount += m_menus[i]->CopyAccels(&accelEntries[nAccelCount]);
|
||||
}
|
||||
@@ -961,7 +909,8 @@ int wxMenuBar::FindMenuItem(const wxString& menuString,
|
||||
const wxString& itemString) const
|
||||
{
|
||||
wxString menuLabel = wxStripMenuCodes(menuString);
|
||||
for ( int i = 0; i < m_menuCount; i++ )
|
||||
size_t count = GetMenuCount();
|
||||
for ( size_t i = 0; i < count; i++ )
|
||||
{
|
||||
wxString title = wxStripMenuCodes(m_titles[i]);
|
||||
if ( menuString == title )
|
||||
@@ -971,13 +920,14 @@ int wxMenuBar::FindMenuItem(const wxString& menuString,
|
||||
return wxNOT_FOUND;
|
||||
}
|
||||
|
||||
wxMenuItem *wxMenuBar::FindItemForId (int id, wxMenu **itemMenu) const
|
||||
wxMenuItem *wxMenuBar::FindItem(int id, wxMenu **itemMenu) const
|
||||
{
|
||||
if ( itemMenu )
|
||||
*itemMenu = NULL;
|
||||
|
||||
wxMenuItem *item = NULL;
|
||||
for ( int i = 0; !item && (i < m_menuCount); i++ )
|
||||
size_t count = GetMenuCount();
|
||||
for ( size_t i = 0; !item && (i < count); i++ )
|
||||
{
|
||||
item = m_menus[i]->FindItemForId(id, itemMenu);
|
||||
}
|
||||
|
@@ -140,9 +140,9 @@ void wxMenuItem::DeleteSubMenu()
|
||||
// get item state
|
||||
// --------------
|
||||
|
||||
void wxMenuItem::IsChecked() const
|
||||
bool wxMenuItem::IsChecked() const
|
||||
{
|
||||
int flag = ::GetMenuState(GetHMenuOf(m_parentMenu), id, MF_BYCOMMAND);
|
||||
int flag = ::GetMenuState(GetHMenuOf(m_parentMenu), GetId(), MF_BYCOMMAND);
|
||||
|
||||
// don't "and" with MF_ENABLED because its value is 0
|
||||
return (flag & MF_DISABLED) == 0;
|
||||
|
Reference in New Issue
Block a user