]> git.saurik.com Git - wxWidgets.git/commitdiff
1. added wxMenuBarBase
authorVadim Zeitlin <vadim@wxwidgets.org>
Tue, 26 Oct 1999 19:07:04 +0000 (19:07 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Tue, 26 Oct 1999 19:07:04 +0000 (19:07 +0000)
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

12 files changed:
Makefile.in
distrib/msw/tmake/filelist.txt
include/wx/gtk/menu.h
include/wx/gtk1/menu.h
include/wx/menu.h
include/wx/menuitem.h
include/wx/msw/menuitem.h
src/common/menucmn.cpp [new file with mode: 0644]
src/gtk/menu.cpp
src/gtk1/menu.cpp
src/msw/menu.cpp
src/msw/menuitem.cpp

index fe45c6c8bc474a9b30db5d103ab3588200416699..853ec8fbd839731858873c96010ad2fda89750ce 100644 (file)
@@ -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
index 4e0f0fe78fd5af7c5af1de304beece6c8cda38ae..a00457f633ee6750514aa949bbe13a2fac39f350 100644 (file)
@@ -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
index 9d4b13d2d0cbb429d31e3f10f2afe9f295c3d68d..b51e7e5230e353f4f44829de1b0737fe2e68e81c 100644 (file)
@@ -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;
index 9d4b13d2d0cbb429d31e3f10f2afe9f295c3d68d..b51e7e5230e353f4f44829de1b0737fe2e68e81c 100644 (file)
@@ -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;
index eb6bc59c98752ee13f1fc405a6c75a23cdd26fc1..0c8963a80e618c9d4f1d2b5f767ab5868fb3edce 100644 (file)
+///////////////////////////////////////////////////////////////////////////////
+// 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_
index ea5ac56053b7ef35fcdbb1ee0d256c801fa0b982..f1dacef380115952082efa1a60002bfaaa11d434 100644 (file)
@@ -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; }
index aa26ee21582fd6cde6809a4623d197c5c062cca2..eaced8f9902cc4d320c3bba9e258c5d87d6ba4d5 100644 (file)
@@ -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 (file)
index 0000000..de656a0
--- /dev/null
@@ -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();
+}
+
index bc156417a73b20b17898c91deddd6b55aed3ab86..1d042b817d835026845e0fe7d2ee2ad924c1f7bd 100644 (file)
 #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,
index bc156417a73b20b17898c91deddd6b55aed3ab86..1d042b817d835026845e0fe7d2ee2ad924c1f7bd 100644 (file)
 #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,
index dce4d3edb9a96f53592708472775d7659df6cf68..887bccd4e2b131eb2cc76a2799df9dc2902388ce 100644 (file)
@@ -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;
index 09c4986f1538b66c267869c7f4d8123f34aa1895..ee2562727e5c6c283de37594be2ae49426a5a640 100644 (file)
@@ -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
 // -----------------