From 3dfac9707a98b245370bdffdf3fd30def0122a8d Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Tue, 26 Oct 1999 19:07:04 +0000 Subject: [PATCH] 1. added wxMenuBarBase 2. corrected typo in gtk/menu.cpp when dealing with Fn accel keys git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@4204 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- Makefile.in | 12 +- distrib/msw/tmake/filelist.txt | 1 + include/wx/gtk/menu.h | 85 ++++---------- include/wx/gtk1/menu.h | 85 ++++---------- include/wx/menu.h | 160 ++++++++++++++++++++++++-- include/wx/menuitem.h | 3 + include/wx/msw/menuitem.h | 1 + src/common/menucmn.cpp | 203 +++++++++++++++++++++++++++++++++ src/gtk/menu.cpp | 147 ++++++++---------------- src/gtk1/menu.cpp | 147 ++++++++---------------- src/msw/menu.cpp | 101 +--------------- src/msw/menuitem.cpp | 11 ++ 12 files changed, 530 insertions(+), 426 deletions(-) create mode 100644 src/common/menucmn.cpp diff --git a/Makefile.in b/Makefile.in index fe45c6c8bc..853ec8fbd8 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1,5 +1,5 @@ # -# This file was automatically generated by tmake at 19:47, 1999/10/25 +# This file was automatically generated by tmake at 20:51, 1999/10/26 # DO NOT CHANGE THIS FILE, YOUR CHANGES WILL BE LOST! CHANGE UNX.T! # @@ -736,6 +736,7 @@ GTK_COMMONOBJS = \ list.o \ log.o \ memory.o \ + menucmn.o \ mimetype.o \ module.o \ mstream.o \ @@ -830,6 +831,7 @@ GTK_COMMONDEPS = \ list.d \ log.d \ memory.d \ + menucmn.d \ mimetype.d \ module.d \ mstream.d \ @@ -1120,6 +1122,7 @@ MOTIF_COMMONOBJS = \ list.o \ log.o \ memory.o \ + menucmn.o \ mimetype.o \ module.o \ mstream.o \ @@ -1215,6 +1218,7 @@ MOTIF_COMMONDEPS = \ list.d \ log.d \ memory.d \ + menucmn.d \ mimetype.d \ module.d \ mstream.d \ @@ -1283,7 +1287,6 @@ MOTIF_GUIOBJS = \ dialog.o \ filedlg.o \ font.o \ - fontenum.o \ frame.o \ gauge.o \ gdiobj.o \ @@ -1339,7 +1342,6 @@ MOTIF_GUIDEPS = \ dialog.d \ filedlg.d \ font.d \ - fontenum.d \ frame.d \ gauge.d \ gdiobj.d \ @@ -1466,6 +1468,7 @@ MSW_COMMONOBJS = \ list.o \ log.o \ memory.o \ + menucmn.o \ mimetype.o \ module.o \ mstream.o \ @@ -1561,6 +1564,7 @@ MSW_COMMONDEPS = \ list.d \ log.d \ memory.d \ + menucmn.d \ mimetype.d \ module.d \ mstream.d \ @@ -1892,12 +1896,14 @@ HTMLDEPS = \ UNIX_OBJS = \ dialup.o \ + fontenum.o \ gsocket.o \ threadpsx.o \ utilsunx.o UNIX_DEPS = \ dialup.d \ + fontenum.d \ gsocket.d \ threadpsx.d \ utilsunx.d diff --git a/distrib/msw/tmake/filelist.txt b/distrib/msw/tmake/filelist.txt index 4e0f0fe78f..a00457f633 100644 --- a/distrib/msw/tmake/filelist.txt +++ b/distrib/msw/tmake/filelist.txt @@ -143,6 +143,7 @@ lboxcmn.cpp C list.cpp C B log.cpp C B memory.cpp C +menucmn.cpp C mimetype.cpp C 32,B module.cpp C B mstream.cpp C diff --git a/include/wx/gtk/menu.h b/include/wx/gtk/menu.h index 9d4b13d2d0..b51e7e5230 100644 --- a/include/wx/gtk/menu.h +++ b/include/wx/gtk/menu.h @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: menu.h +// Name: wx/gtk/menu.h // Purpose: // Author: Robert Roebling // Id: $Id$ @@ -7,95 +7,56 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// - #ifndef __GTKMENUH__ #define __GTKMENUH__ #ifdef __GNUG__ -#pragma interface + #pragma interface "menu.h" #endif -#include "wx/defs.h" -#include "wx/object.h" -#include "wx/list.h" -#include "wx/window.h" -#include "wx/menuitem.h" - -//----------------------------------------------------------------------------- -// classes -//----------------------------------------------------------------------------- - -class wxMenuBar; -class wxMenuItem; -class wxMenu; - //----------------------------------------------------------------------------- // wxMenuBar //----------------------------------------------------------------------------- -class wxMenuBar : public wxWindow +class wxMenuBar : public wxMenuBarBase { - DECLARE_DYNAMIC_CLASS(wxMenuBar) - public: // ctors wxMenuBar(); wxMenuBar(long style); wxMenuBar(int n, wxMenu *menus[], const wxString titles[]); - ~wxMenuBar(); + virtual ~wxMenuBar(); - // menubar construction - void Append( wxMenu *menu, const wxString &title ); + // implement base class (pure) virtuals + 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); - // 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; - // returns NULL if not found, fills menuForItem if !NULL - wxMenuItem *FindItemForId(int itemId, wxMenu **menuForItem = NULL) const; - - // state control - void Check( int id, bool check ); - bool IsChecked( int id ) const; - void Enable( int id, bool enable ); - bool IsEnabled( int id ) const; - - void SetLabel( int id, const wxString &label ); - wxString GetLabel( int id ) const; - wxString GetLabel() const { return wxWindow::GetLabel(); } + virtual wxMenuItem* FindItem( int id, wxMenu **menu = NULL ) const; - void EnableTop( int pos, bool flag ); - void SetLabelTop( int pos, const wxString& label ); - wxString GetLabelTop( int pos ) const; - - virtual void SetHelpString( int id, const wxString& helpString ); - virtual wxString GetHelpString( int id ) const; - - int GetMenuCount() const { return m_menus.Number(); } - wxMenu *GetMenu( int n ) const { return (wxMenu *)m_menus.Nth(n)->Data(); } - -#ifdef WXWIN_COMPATIBILITY - // compatibility: these functions are deprecated - bool Enabled(int id) const { return IsEnabled(id); } - bool Checked(int id) const { return IsChecked(id); } - - wxMenuItem* FindMenuItemById( int id ) const { return FindItem(id); } -#endif // WXWIN_COMPATIBILITY - - // implementation only - wxList& GetMenus() { return m_menus; } + virtual void EnableTop( size_t pos, bool flag ); + virtual void SetLabelTop( size_t pos, const wxString& label ); + virtual wxString GetLabelTop( size_t pos ) const; + // implementation only from now on void SetInvokingWindow( wxWindow *win ); void UnsetInvokingWindow( wxWindow *win ); GtkAccelGroup *m_accel; GtkItemFactory *m_factory; - wxList m_menus; GtkWidget *m_menubar; long m_style; wxWindow *m_invokingWindow; + +#if 0 // seems to be unused (VZ) + wxMenuList& GetMenus() { return m_menus; } +#endif // 0 + +private: + DECLARE_DYNAMIC_CLASS(wxMenuBar) }; //----------------------------------------------------------------------------- @@ -125,7 +86,7 @@ public: // title void SetTitle(const wxString& label); const wxString GetTitle() const; - + // menu creation void AppendSeparator(); void Append(int id, const wxString &item, @@ -201,7 +162,7 @@ public: private: // common code for both constructors: void Init( const wxString& title, - long style, + long style, const wxFunction func = (wxFunction) NULL ); wxString m_title; diff --git a/include/wx/gtk1/menu.h b/include/wx/gtk1/menu.h index 9d4b13d2d0..b51e7e5230 100644 --- a/include/wx/gtk1/menu.h +++ b/include/wx/gtk1/menu.h @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: menu.h +// Name: wx/gtk/menu.h // Purpose: // Author: Robert Roebling // Id: $Id$ @@ -7,95 +7,56 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// - #ifndef __GTKMENUH__ #define __GTKMENUH__ #ifdef __GNUG__ -#pragma interface + #pragma interface "menu.h" #endif -#include "wx/defs.h" -#include "wx/object.h" -#include "wx/list.h" -#include "wx/window.h" -#include "wx/menuitem.h" - -//----------------------------------------------------------------------------- -// classes -//----------------------------------------------------------------------------- - -class wxMenuBar; -class wxMenuItem; -class wxMenu; - //----------------------------------------------------------------------------- // wxMenuBar //----------------------------------------------------------------------------- -class wxMenuBar : public wxWindow +class wxMenuBar : public wxMenuBarBase { - DECLARE_DYNAMIC_CLASS(wxMenuBar) - public: // ctors wxMenuBar(); wxMenuBar(long style); wxMenuBar(int n, wxMenu *menus[], const wxString titles[]); - ~wxMenuBar(); + virtual ~wxMenuBar(); - // menubar construction - void Append( wxMenu *menu, const wxString &title ); + // implement base class (pure) virtuals + 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); - // 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; - // returns NULL if not found, fills menuForItem if !NULL - wxMenuItem *FindItemForId(int itemId, wxMenu **menuForItem = NULL) const; - - // state control - void Check( int id, bool check ); - bool IsChecked( int id ) const; - void Enable( int id, bool enable ); - bool IsEnabled( int id ) const; - - void SetLabel( int id, const wxString &label ); - wxString GetLabel( int id ) const; - wxString GetLabel() const { return wxWindow::GetLabel(); } + virtual wxMenuItem* FindItem( int id, wxMenu **menu = NULL ) const; - void EnableTop( int pos, bool flag ); - void SetLabelTop( int pos, const wxString& label ); - wxString GetLabelTop( int pos ) const; - - virtual void SetHelpString( int id, const wxString& helpString ); - virtual wxString GetHelpString( int id ) const; - - int GetMenuCount() const { return m_menus.Number(); } - wxMenu *GetMenu( int n ) const { return (wxMenu *)m_menus.Nth(n)->Data(); } - -#ifdef WXWIN_COMPATIBILITY - // compatibility: these functions are deprecated - bool Enabled(int id) const { return IsEnabled(id); } - bool Checked(int id) const { return IsChecked(id); } - - wxMenuItem* FindMenuItemById( int id ) const { return FindItem(id); } -#endif // WXWIN_COMPATIBILITY - - // implementation only - wxList& GetMenus() { return m_menus; } + virtual void EnableTop( size_t pos, bool flag ); + virtual void SetLabelTop( size_t pos, const wxString& label ); + virtual wxString GetLabelTop( size_t pos ) const; + // implementation only from now on void SetInvokingWindow( wxWindow *win ); void UnsetInvokingWindow( wxWindow *win ); GtkAccelGroup *m_accel; GtkItemFactory *m_factory; - wxList m_menus; GtkWidget *m_menubar; long m_style; wxWindow *m_invokingWindow; + +#if 0 // seems to be unused (VZ) + wxMenuList& GetMenus() { return m_menus; } +#endif // 0 + +private: + DECLARE_DYNAMIC_CLASS(wxMenuBar) }; //----------------------------------------------------------------------------- @@ -125,7 +86,7 @@ public: // title void SetTitle(const wxString& label); const wxString GetTitle() const; - + // menu creation void AppendSeparator(); void Append(int id, const wxString &item, @@ -201,7 +162,7 @@ public: private: // common code for both constructors: void Init( const wxString& title, - long style, + long style, const wxFunction func = (wxFunction) NULL ); wxString m_title; diff --git a/include/wx/menu.h b/include/wx/menu.h index eb6bc59c98..0c8963a80e 100644 --- a/include/wx/menu.h +++ b/include/wx/menu.h @@ -1,21 +1,167 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/menu.h +// Purpose: wxMenu and wxMenuBar classes +// Author: Vadim Zeitlin +// Modified by: +// Created: 26.10.99 +// RCS-ID: $Id$ +// Copyright: (c) wxWindows team +// Licence: wxWindows license +/////////////////////////////////////////////////////////////////////////////// + #ifndef _WX_MENU_H_BASE_ #define _WX_MENU_H_BASE_ +#ifdef __GNUG__ + #pragma interface "menubase.h" +#endif + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/list.h" // for wxMenuList +#include "wx/window.h" // base class for wxMenuBar + +class WXDLLEXPORT wxMenu; +class WXDLLEXPORT wxMenuBar; +class WXDLLEXPORT wxMenuItem; + +// ---------------------------------------------------------------------------- +// wxMenu +// ---------------------------------------------------------------------------- + +// for now, it's in platform-specific file + +WX_DECLARE_LIST(wxMenu, wxMenuList); + +// ---------------------------------------------------------------------------- +// wxMenuBar +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxMenuBarBase : public wxWindow +{ +public: + // default ctor + wxMenuBarBase(); + + // dtor will delete all menus we own + virtual ~wxMenuBarBase(); + + // menu bar construction + // --------------------- + + // append a menu to the end of menubar, return TRUE if ok + virtual bool Append(wxMenu *menu, const wxString& title); + + // insert a menu before the given position into the menubar, return TRUE + // if inserted ok + virtual bool Insert(size_t pos, wxMenu *menu, const wxString& title); + + // menu bar items access + // --------------------- + + // get the number of menus in the menu bar + size_t GetMenuCount() const { return m_menus.GetCount(); } + + // get the menu at given position + wxMenu *GetMenu(size_t pos) const; + + // replace the menu at given position with another one, returns the + // previous menu (which should be deleted by the caller) + virtual wxMenu *Replace(size_t pos, wxMenu *menu, const wxString& title); + + // delete the menu at given position from the menu bar, return the pointer + // to the menu (which should be deleted by the caller) + virtual wxMenu *Remove(size_t pos); + + // enable or disable a submenu + virtual void EnableTop(size_t pos, bool enable) = 0; + + // get or change the label of the menu at given position + virtual void SetLabelTop(size_t pos, const wxString& label) = 0; + virtual wxString GetLabelTop(size_t pos) const = 0; + + // item search + // ----------- + + // by menu and item names, returns wxNOT_FOUND if not found or id of the + // found item + virtual int FindMenuItem(const wxString& menuString, + const wxString& itemString) const = 0; + + // find item by id (in any menu), returns NULL if not found + // + // if menu is !NULL, it will be filled with wxMenu this item belongs to + virtual wxMenuItem* FindItem(int id, wxMenu **menu = NULL) const = 0; + + // item access + // ----------- + + // all these functions just use FindItem() and then call an appropriate + // method on it + // + // NB: under MSW, these methods can only be used after the menubar had + // been attached to the frame + + void Enable(int id, bool enable); + void Check(int id, bool check); + bool IsChecked(int id) const; + bool IsEnabled(int id) const; + + void SetLabel(int id, const wxString &label); + wxString GetLabel(int id) const; + + void SetHelpString(int id, const wxString& helpString); + wxString GetHelpString(int id) const; + + // need to override this one to avoid virtual function hiding + virtual wxString GetLabel() const { return wxWindow::GetLabel(); } + + // compatibility only: these functions are deprecated, use the new ones + // instead +#ifdef WXWIN_COMPATIBILITY + bool Enabled(int id) const { return IsEnabled(id); } + bool Checked(int id) const { return IsChecked(id); } + + wxMenuItem* FindMenuItemById(int id) const + { return FindItem(id); } + wxMenuItem* FindItemForId(int id, wxMenu **menu = NULL) const + { return FindItem(id, menu); } +#endif // WXWIN_COMPATIBILITY + +protected: + // the list of all our menus + wxMenuList m_menus; +}; + +// ---------------------------------------------------------------------------- +// include the real class declaration +// ---------------------------------------------------------------------------- + +#ifdef wxUSE_BASE_CLASSES_ONLY + #define wxMenuItem wxMenuItemBase +#else // !wxUSE_BASE_CLASSES_ONLY #if defined(__WXMSW__) -#include "wx/msw/menu.h" + #include "wx/msw/menu.h" #elif defined(__WXMOTIF__) -#include "wx/motif/menu.h" + #include "wx/motif/menu.h" #elif defined(__WXGTK__) -#include "wx/gtk/menu.h" + #include "wx/gtk/menu.h" #elif defined(__WXQT__) -#include "wx/qt/menu.h" + #include "wx/qt/menu.h" #elif defined(__WXMAC__) -#include "wx/mac/menu.h" + #include "wx/mac/menu.h" #elif defined(__WXPM__) -#include "wx/os2/menu.h" + #include "wx/os2/menu.h" #elif defined(__WXSTUBS__) -#include "wx/stubs/menu.h" + #include "wx/stubs/menu.h" #endif +#endif // wxUSE_BASE_CLASSES_ONLY/!wxUSE_BASE_CLASSES_ONLY + +// also include this one to ensure compatibility with old code which only +// included wx/menu.h +#include "wx/menuitem.h" #endif // _WX_MENU_H_BASE_ diff --git a/include/wx/menuitem.h b/include/wx/menuitem.h index ea5ac56053..f1dacef380 100644 --- a/include/wx/menuitem.h +++ b/include/wx/menuitem.h @@ -52,6 +52,9 @@ public: bool isCheckable = FALSE, wxMenu *subMenu = (wxMenu *)NULL); + // the menu we're in + wxMenu *GetMenu() const { return m_parentMenu; } + // get/set id void SetId(int id) { m_id = id; } int GetId() const { return m_id; } diff --git a/include/wx/msw/menuitem.h b/include/wx/msw/menuitem.h index aa26ee2158..eaced8f990 100644 --- a/include/wx/msw/menuitem.h +++ b/include/wx/msw/menuitem.h @@ -49,6 +49,7 @@ public: virtual void Enable(bool bDoEnable = TRUE); virtual void Check(bool bDoCheck = TRUE); + virtual void IsChecked() const; // unfortunately needed to resolve ambiguity between // wxMenuItemBase::IsCheckable() and wxOwnerDrawn::IsCheckable() diff --git a/src/common/menucmn.cpp b/src/common/menucmn.cpp new file mode 100644 index 0000000000..de656a0a3c --- /dev/null +++ b/src/common/menucmn.cpp @@ -0,0 +1,203 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: common/menucmn.cpp +// Purpose: wxMenu and wxMenuBar methods common to all ports +// Author: Vadim Zeitlin +// Modified by: +// Created: 26.10.99 +// RCS-ID: $Id$ +// Copyright: (c) wxWindows team +// Licence: wxWindows license +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#ifdef __GNUG__ + #pragma implementation "menubase.h" +#endif + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#ifndef WX_PRECOMP + #include "wx/menu.h" +#endif + +// ---------------------------------------------------------------------------- +// template lists +// ---------------------------------------------------------------------------- + +#include "wx/listimpl.cpp" +WX_DEFINE_LIST(wxMenuList); + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// ctor and dtor +// ---------------------------------------------------------------------------- + +wxMenuBarBase::wxMenuBarBase() +{ + // we own the menus when we get them + m_menus.DeleteContents(TRUE); +} + +wxMenuBarBase::~wxMenuBarBase() +{ + // nothing to do, the list will delete the menus because of the call to + // DeleteContents() above +} + +// ---------------------------------------------------------------------------- +// wxMenuBar item access: the base class versions manage m_menus list, the +// derived class should reflect the changes in the real menubar +// ---------------------------------------------------------------------------- + +wxMenu *wxMenuBarBase::GetMenu(size_t pos) const +{ + wxMenuList::Node *node = m_menus.Item(pos); + wxCHECK_MSG( node, NULL, wxT("bad index in wxMenuBar::GetMenu()") ); + + return node->GetData(); +} + +bool wxMenuBarBase::Append(wxMenu *menu, const wxString& WXUNUSED(title)) +{ + wxCHECK_MSG( menu, FALSE, wxT("can't append NULL menu") ); + + m_menus.Append(menu); + + return TRUE; +} + +bool wxMenuBarBase::Insert(size_t pos, wxMenu *menu, + const wxString& WXUNUSED(title)) +{ + wxCHECK_MSG( menu, FALSE, wxT("can't insert NULL menu") ); + + wxMenuList::Node *node = m_menus.Item(pos); + wxCHECK_MSG( node, FALSE, wxT("bad index in wxMenuBar::Insert()") ); + + m_menus.Insert(node, menu); + + return TRUE; +} + +wxMenu *wxMenuBarBase::Replace(size_t pos, wxMenu *menu, + const wxString& WXUNUSED(title)) +{ + wxCHECK_MSG( menu, NULL, wxT("can't insert NULL menu") ); + + wxMenuList::Node *node = m_menus.Item(pos); + wxCHECK_MSG( node, NULL, wxT("bad index in wxMenuBar::Replace()") ); + + wxMenu *menuOld = node->GetData(); + node->SetData(menu); + + return menuOld; +} + +wxMenu *wxMenuBarBase::Remove(size_t pos) +{ + wxMenuList::Node *node = m_menus.Item(pos); + wxCHECK_MSG( node, NULL, wxT("bad index in wxMenuBar::Remove()") ); + + node = m_menus.DetachNode(node); + wxCHECK( node, NULL ); // unexpected + wxMenu *menu = node->GetData(); + + delete node; + + return menu; +} + +// --------------------------------------------------------------------------- +// wxMenuBar functions forwarded to wxMenuItem +// --------------------------------------------------------------------------- + +void wxMenuBarBase::Enable(int id, bool enable) +{ + wxMenuItem *item = FindItem(id); + + wxCHECK_RET( item, wxT("attempt to enable an item which doesn't exist") ); + + item->Enable(enable); +} + +void wxMenuBarBase::Check(int id, bool check) +{ + wxMenuItem *item = FindItem(id); + + wxCHECK_RET( item, wxT("attempt to check an item which doesn't exist") ); + wxCHECK_RET( item->IsCheckable(), wxT("attempt to check an uncheckable item") ); + + item->Check(check); +} + +bool wxMenuBarBase::IsChecked(int id) const +{ + wxMenuItem *item = FindItem(id); + + wxCHECK_MSG( item, FALSE, wxT("wxMenuBar::IsChecked(): no such item") ); + + return item->IsChecked(); +} + +bool wxMenuBarBase::IsEnabled(int id) const +{ + wxMenuItem *item = FindItem(id); + + wxCHECK_MSG( item, FALSE, wxT("wxMenuBar::IsEnabled(): no such item") ); + + return item->IsEnabled(); +} + +void wxMenuBarBase::SetLabel(int id, const wxString& label) +{ + wxMenuItem *item = FindItem(id); + + wxCHECK_RET( item, wxT("wxMenuBar::SetLabel(): no such item") ); + + item->SetText(label); +} + +wxString wxMenuBarBase::GetLabel(int id) const +{ + wxMenuItem *item = FindItem(id); + + wxCHECK_MSG( item, wxEmptyString, + wxT("wxMenuBar::GetLabel(): no such item") ); + + return item->GetText(); +} + +void wxMenuBarBase::SetHelpString(int id, const wxString& helpString) +{ + wxMenuItem *item = FindItem(id); + + wxCHECK_RET( item, wxT("wxMenuBar::SetHelpString(): no such item") ); + + item->SetHelp(helpString); +} + +wxString wxMenuBarBase::GetHelpString(int id) const +{ + wxMenuItem *item = FindItem(id); + + wxCHECK_MSG( item, wxEmptyString, + wxT("wxMenuBar::GetHelpString(): no such item") ); + + return item->GetHelp(); +} + diff --git a/src/gtk/menu.cpp b/src/gtk/menu.cpp index bc156417a7..1d042b817d 100644 --- a/src/gtk/menu.cpp +++ b/src/gtk/menu.cpp @@ -12,10 +12,10 @@ #pragma implementation "menuitem.h" #endif -#include "wx/menu.h" #include "wx/log.h" #include "wx/intl.h" #include "wx/app.h" +#include "wx/menu.h" #if wxUSE_ACCEL #include "wx/accel.h" @@ -199,7 +199,7 @@ void wxMenuBar::UnsetInvokingWindow( wxWindow *win ) } } -void wxMenuBar::Append( wxMenu *menu, const wxString &title ) +bool wxMenuBar::Append( wxMenu *menu, const wxString &title ) { m_menus.Append( menu ); @@ -283,6 +283,38 @@ void wxMenuBar::Append( wxMenu *menu, const wxString &title ) // adding menu later on. if (m_invokingWindow) wxMenubarSetInvokingWindow( menu, m_invokingWindow ); + + return TRUE; +} + +bool wxMenuBar::Insert(size_t pos, wxMenu *menu, const wxString& title) +{ + if ( !wxMenuBarBase::Insert(pos, menu, title) ) + return FALSE; + + wxFAIL_MSG(wxT("TODO")); + + return FALSE; +} + +wxMenu *wxMenuBar::Replace(size_t pos, wxMenu *menu, const wxString& title) +{ + if ( !wxMenuBarBase::Replace(pos, menu, title) ) + return FALSE; + + wxFAIL_MSG(wxT("TODO")); + + return NULL; +} + +wxMenu *wxMenuBar::Remove(size_t pos) +{ + if ( !wxMenuBarBase::Remove(pos) ) + return FALSE; + + wxFAIL_MSG(wxT("TODO")); + + return NULL; } static int FindMenuItemRecursive( const wxMenu *menu, const wxString &menuString, const wxString &itemString ) @@ -307,18 +339,6 @@ static int FindMenuItemRecursive( const wxMenu *menu, const wxString &menuString return wxNOT_FOUND; } -wxMenuItem *wxMenuBar::FindItemForId(int itemId, wxMenu **menuForItem ) const -{ - if ( menuForItem ) - { - // TODO return the pointer to the menu - - *menuForItem = NULL; - } - - return FindItem(itemId); -} - int wxMenuBar::FindMenuItem( const wxString &menuString, const wxString &itemString ) const { wxNode *node = m_menus.First(); @@ -351,7 +371,7 @@ static wxMenuItem* FindMenuItemByIdRecursive(const wxMenu* menu, int id) return result; } -wxMenuItem* wxMenuBar::FindItem( int id ) const +wxMenuItem* wxMenuBar::FindItem( int id, wxMenu **menuForItem ) const { wxMenuItem* result = 0; wxNode *node = m_menus.First(); @@ -362,115 +382,48 @@ wxMenuItem* wxMenuBar::FindItem( int id ) const node = node->Next(); } - return result; -} - -void wxMenuBar::Check( int id, bool check ) -{ - wxMenuItem* item = FindMenuItemById( id ); - - wxCHECK_RET( item, wxT("wxMenuBar::Check: no such item") ); - - item->Check(check); -} - -bool wxMenuBar::IsChecked( int id ) const -{ - wxMenuItem* item = FindMenuItemById( id ); - - wxCHECK_MSG( item, FALSE, wxT("wxMenuBar::IsChecked: no such item") ); - - return item->IsChecked(); -} - -void wxMenuBar::Enable( int id, bool enable ) -{ - wxMenuItem* item = FindMenuItemById( id ); - - wxCHECK_RET( item, wxT("wxMenuBar::Enable: no such item") ); - - item->Enable(enable); -} - -bool wxMenuBar::IsEnabled( int id ) const -{ - wxMenuItem* item = FindMenuItemById( id ); - - wxCHECK_MSG( item, FALSE, wxT("wxMenuBar::IsEnabled: no such item") ); - - return item->IsEnabled(); -} - -wxString wxMenuBar::GetLabel( int id ) const -{ - wxMenuItem* item = FindMenuItemById( id ); - - wxCHECK_MSG( item, wxT(""), wxT("wxMenuBar::GetLabel: no such item") ); - - return item->GetText(); -} - -void wxMenuBar::SetLabel( int id, const wxString &label ) -{ - wxMenuItem* item = FindMenuItemById( id ); - - wxCHECK_RET( item, wxT("wxMenuBar::SetLabel: no such item") ); + if ( menuForItem ) + { + *menuForItem = result ? result->GetMenu() : (wxMenu *)NULL; + } - item->SetText( label ); + return result; } -void wxMenuBar::EnableTop( int pos, bool flag ) +void wxMenuBar::EnableTop( size_t pos, bool flag ) { - wxNode *node = m_menus.Nth( pos ); + wxMenuList::Node *node = m_menus.Item( pos ); wxCHECK_RET( node, wxT("menu not found") ); - wxMenu* menu = (wxMenu*)node->Data(); + wxMenu* menu = node->GetData(); if (menu->m_owner) gtk_widget_set_sensitive( menu->m_owner, flag ); } -wxString wxMenuBar::GetLabelTop( int pos ) const +wxString wxMenuBar::GetLabelTop( size_t pos ) const { - wxNode *node = m_menus.Nth( pos ); + wxMenuList::Node *node = m_menus.Item( pos ); wxCHECK_MSG( node, wxT("invalid"), wxT("menu not found") ); - wxMenu* menu = (wxMenu*)node->Data(); + wxMenu* menu = node->GetData(); return menu->GetTitle(); } -void wxMenuBar::SetLabelTop( int pos, const wxString& label ) +void wxMenuBar::SetLabelTop( size_t pos, const wxString& label ) { - wxNode *node = m_menus.Nth( pos ); + wxMenuList::Node *node = m_menus.Item( pos ); wxCHECK_RET( node, wxT("menu not found") ); - wxMenu* menu = (wxMenu*)node->Data(); + wxMenu* menu = node->GetData(); menu->SetTitle( label ); } -void wxMenuBar::SetHelpString( int id, const wxString& helpString ) -{ - wxMenuItem* item = FindMenuItemById( id ); - - wxCHECK_RET( item, wxT("wxMenuBar::SetHelpString: no such item") ); - - item->SetHelp( helpString ); -} - -wxString wxMenuBar::GetHelpString( int id ) const -{ - wxMenuItem* item = FindMenuItemById( id ); - - wxCHECK_MSG( item, wxT(""), wxT("wxMenuBar::GetHelpString: no such item") ); - - return item->GetHelp(); -} - //----------------------------------------------------------------------------- // "activate" //----------------------------------------------------------------------------- @@ -840,7 +793,7 @@ static wxString GetHotKey( const wxMenuItem& item ) case WXK_F10: case WXK_F11: case WXK_F12: - hotkey << wxT('F') << code = WXK_F1 + 1; + hotkey << wxT('F') << code - WXK_F1 + 1; break; // if there are any other keys wxGetAccelFromString() may return, diff --git a/src/gtk1/menu.cpp b/src/gtk1/menu.cpp index bc156417a7..1d042b817d 100644 --- a/src/gtk1/menu.cpp +++ b/src/gtk1/menu.cpp @@ -12,10 +12,10 @@ #pragma implementation "menuitem.h" #endif -#include "wx/menu.h" #include "wx/log.h" #include "wx/intl.h" #include "wx/app.h" +#include "wx/menu.h" #if wxUSE_ACCEL #include "wx/accel.h" @@ -199,7 +199,7 @@ void wxMenuBar::UnsetInvokingWindow( wxWindow *win ) } } -void wxMenuBar::Append( wxMenu *menu, const wxString &title ) +bool wxMenuBar::Append( wxMenu *menu, const wxString &title ) { m_menus.Append( menu ); @@ -283,6 +283,38 @@ void wxMenuBar::Append( wxMenu *menu, const wxString &title ) // adding menu later on. if (m_invokingWindow) wxMenubarSetInvokingWindow( menu, m_invokingWindow ); + + return TRUE; +} + +bool wxMenuBar::Insert(size_t pos, wxMenu *menu, const wxString& title) +{ + if ( !wxMenuBarBase::Insert(pos, menu, title) ) + return FALSE; + + wxFAIL_MSG(wxT("TODO")); + + return FALSE; +} + +wxMenu *wxMenuBar::Replace(size_t pos, wxMenu *menu, const wxString& title) +{ + if ( !wxMenuBarBase::Replace(pos, menu, title) ) + return FALSE; + + wxFAIL_MSG(wxT("TODO")); + + return NULL; +} + +wxMenu *wxMenuBar::Remove(size_t pos) +{ + if ( !wxMenuBarBase::Remove(pos) ) + return FALSE; + + wxFAIL_MSG(wxT("TODO")); + + return NULL; } static int FindMenuItemRecursive( const wxMenu *menu, const wxString &menuString, const wxString &itemString ) @@ -307,18 +339,6 @@ static int FindMenuItemRecursive( const wxMenu *menu, const wxString &menuString return wxNOT_FOUND; } -wxMenuItem *wxMenuBar::FindItemForId(int itemId, wxMenu **menuForItem ) const -{ - if ( menuForItem ) - { - // TODO return the pointer to the menu - - *menuForItem = NULL; - } - - return FindItem(itemId); -} - int wxMenuBar::FindMenuItem( const wxString &menuString, const wxString &itemString ) const { wxNode *node = m_menus.First(); @@ -351,7 +371,7 @@ static wxMenuItem* FindMenuItemByIdRecursive(const wxMenu* menu, int id) return result; } -wxMenuItem* wxMenuBar::FindItem( int id ) const +wxMenuItem* wxMenuBar::FindItem( int id, wxMenu **menuForItem ) const { wxMenuItem* result = 0; wxNode *node = m_menus.First(); @@ -362,115 +382,48 @@ wxMenuItem* wxMenuBar::FindItem( int id ) const node = node->Next(); } - return result; -} - -void wxMenuBar::Check( int id, bool check ) -{ - wxMenuItem* item = FindMenuItemById( id ); - - wxCHECK_RET( item, wxT("wxMenuBar::Check: no such item") ); - - item->Check(check); -} - -bool wxMenuBar::IsChecked( int id ) const -{ - wxMenuItem* item = FindMenuItemById( id ); - - wxCHECK_MSG( item, FALSE, wxT("wxMenuBar::IsChecked: no such item") ); - - return item->IsChecked(); -} - -void wxMenuBar::Enable( int id, bool enable ) -{ - wxMenuItem* item = FindMenuItemById( id ); - - wxCHECK_RET( item, wxT("wxMenuBar::Enable: no such item") ); - - item->Enable(enable); -} - -bool wxMenuBar::IsEnabled( int id ) const -{ - wxMenuItem* item = FindMenuItemById( id ); - - wxCHECK_MSG( item, FALSE, wxT("wxMenuBar::IsEnabled: no such item") ); - - return item->IsEnabled(); -} - -wxString wxMenuBar::GetLabel( int id ) const -{ - wxMenuItem* item = FindMenuItemById( id ); - - wxCHECK_MSG( item, wxT(""), wxT("wxMenuBar::GetLabel: no such item") ); - - return item->GetText(); -} - -void wxMenuBar::SetLabel( int id, const wxString &label ) -{ - wxMenuItem* item = FindMenuItemById( id ); - - wxCHECK_RET( item, wxT("wxMenuBar::SetLabel: no such item") ); + if ( menuForItem ) + { + *menuForItem = result ? result->GetMenu() : (wxMenu *)NULL; + } - item->SetText( label ); + return result; } -void wxMenuBar::EnableTop( int pos, bool flag ) +void wxMenuBar::EnableTop( size_t pos, bool flag ) { - wxNode *node = m_menus.Nth( pos ); + wxMenuList::Node *node = m_menus.Item( pos ); wxCHECK_RET( node, wxT("menu not found") ); - wxMenu* menu = (wxMenu*)node->Data(); + wxMenu* menu = node->GetData(); if (menu->m_owner) gtk_widget_set_sensitive( menu->m_owner, flag ); } -wxString wxMenuBar::GetLabelTop( int pos ) const +wxString wxMenuBar::GetLabelTop( size_t pos ) const { - wxNode *node = m_menus.Nth( pos ); + wxMenuList::Node *node = m_menus.Item( pos ); wxCHECK_MSG( node, wxT("invalid"), wxT("menu not found") ); - wxMenu* menu = (wxMenu*)node->Data(); + wxMenu* menu = node->GetData(); return menu->GetTitle(); } -void wxMenuBar::SetLabelTop( int pos, const wxString& label ) +void wxMenuBar::SetLabelTop( size_t pos, const wxString& label ) { - wxNode *node = m_menus.Nth( pos ); + wxMenuList::Node *node = m_menus.Item( pos ); wxCHECK_RET( node, wxT("menu not found") ); - wxMenu* menu = (wxMenu*)node->Data(); + wxMenu* menu = node->GetData(); menu->SetTitle( label ); } -void wxMenuBar::SetHelpString( int id, const wxString& helpString ) -{ - wxMenuItem* item = FindMenuItemById( id ); - - wxCHECK_RET( item, wxT("wxMenuBar::SetHelpString: no such item") ); - - item->SetHelp( helpString ); -} - -wxString wxMenuBar::GetHelpString( int id ) const -{ - wxMenuItem* item = FindMenuItemById( id ); - - wxCHECK_MSG( item, wxT(""), wxT("wxMenuBar::GetHelpString: no such item") ); - - return item->GetHelp(); -} - //----------------------------------------------------------------------------- // "activate" //----------------------------------------------------------------------------- @@ -840,7 +793,7 @@ static wxString GetHotKey( const wxMenuItem& item ) case WXK_F10: case WXK_F11: case WXK_F12: - hotkey << wxT('F') << code = WXK_F1 + 1; + hotkey << wxT('F') << code - WXK_F1 + 1; break; // if there are any other keys wxGetAccelFromString() may return, diff --git a/src/msw/menu.cpp b/src/msw/menu.cpp index dce4d3edb9..887bccd4e2 100644 --- a/src/msw/menu.cpp +++ b/src/msw/menu.cpp @@ -670,20 +670,11 @@ WXHMENU wxMenuBar::Create() } // --------------------------------------------------------------------------- -// wxMenuBar functions forwarded to wxMenuItem +// wxMenuBar functions to work with the top level submenus // --------------------------------------------------------------------------- -// Must only be used AFTER menu has been attached to frame, -// otherwise use individual menus to enable/disable items -void wxMenuBar::Enable(int id, bool enable) -{ - wxMenu *itemMenu = NULL; - wxMenuItem *item = FindItemForId(id, &itemMenu) ; - - wxCHECK_RET( item, wxT("attempt to enable an item which doesn't exist") ); - - item->Enable(enable); -} +// 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) { @@ -694,92 +685,6 @@ void wxMenuBar::EnableTop(int pos, bool enable) Refresh(); } -// Must only be used AFTER menu has been attached to frame, -// otherwise use individual menus -void wxMenuBar::Check(int id, bool check) -{ - wxMenu *itemMenu = NULL; - wxMenuItem *item = FindItemForId(id, &itemMenu) ; - - wxCHECK_RET( item, wxT("attempt to check an item which doesn't exist") ); - wxCHECK_RET( item->IsCheckable(), wxT("attempt to check an uncheckable item") ); - - item->Check(check); -} - -bool wxMenuBar::IsChecked(int id) const -{ - wxMenu *itemMenu = NULL; - wxMenuItem *item = FindItemForId(id, &itemMenu) ; - - wxCHECK_MSG( item, FALSE, wxT("wxMenuBar::IsChecked(): no such item") ); - - int flag = ::GetMenuState(GetHmenuOf(itemMenu), id, MF_BYCOMMAND); - - return (flag & MF_CHECKED) != 0; -} - -bool wxMenuBar::IsEnabled(int id) const -{ - wxMenu *itemMenu = NULL; - wxMenuItem *item = FindItemForId(id, &itemMenu) ; - - wxCHECK_MSG( item, FALSE, wxT("wxMenuBar::IsEnabled(): no such item") ); - - int flag = ::GetMenuState(GetHmenuOf(itemMenu), id, MF_BYCOMMAND) ; - - // don't "and" with MF_ENABLED because its value is 0 - return (flag & MF_DISABLED) == 0; -} - -void wxMenuBar::SetLabel(int id, const wxString& label) -{ - wxMenu *itemMenu = NULL; - wxMenuItem *item = FindItemForId(id, &itemMenu) ; - - wxCHECK_RET( item, wxT("wxMenuBar::SetLabel(): no such item") ); - - item->SetText(label); -} - -wxString wxMenuBar::GetLabel(int id) const -{ - wxMenu *itemMenu = NULL; - wxMenuItem *item = FindItemForId(id, &itemMenu) ; - - wxCHECK_MSG( item, wxEmptyString, - wxT("wxMenuBar::GetLabel(): no such item") ); - - return item->GetText(); -} - -void wxMenuBar::SetHelpString (int id, const wxString& helpString) -{ - wxMenu *itemMenu = NULL; - wxMenuItem *item = FindItemForId(id, &itemMenu) ; - - wxCHECK_RET( item, wxT("wxMenuBar::SetHelpString(): no such item") ); - - item->SetHelp(helpString); -} - -wxString wxMenuBar::GetHelpString (int id) const -{ - wxMenu *itemMenu = NULL; - wxMenuItem *item = FindItemForId(id, &itemMenu) ; - - wxCHECK_MSG( item, wxT(""), wxT("wxMenuBar::GetHelpString(): no such item") ); - - return item->GetHelp(); -} - -// --------------------------------------------------------------------------- -// wxMenuBar functions to work with the top level submenus -// --------------------------------------------------------------------------- - -// 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::SetLabelTop(int pos, const wxString& label) { UINT id; diff --git a/src/msw/menuitem.cpp b/src/msw/menuitem.cpp index 09c4986f15..ee2562727e 100644 --- a/src/msw/menuitem.cpp +++ b/src/msw/menuitem.cpp @@ -137,6 +137,17 @@ void wxMenuItem::DeleteSubMenu() m_subMenu = NULL; } +// get item state +// -------------- + +void wxMenuItem::IsChecked() const +{ + int flag = ::GetMenuState(GetHMenuOf(m_parentMenu), id, MF_BYCOMMAND); + + // don't "and" with MF_ENABLED because its value is 0 + return (flag & MF_DISABLED) == 0; +} + // change item state // ----------------- -- 2.45.2