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
This commit is contained in:
Vadim Zeitlin
1999-10-26 19:07:04 +00:00
parent 196c87f43d
commit 3dfac9707a
12 changed files with 537 additions and 433 deletions

View 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! # DO NOT CHANGE THIS FILE, YOUR CHANGES WILL BE LOST! CHANGE UNX.T!
# #
@@ -736,6 +736,7 @@ GTK_COMMONOBJS = \
list.o \ list.o \
log.o \ log.o \
memory.o \ memory.o \
menucmn.o \
mimetype.o \ mimetype.o \
module.o \ module.o \
mstream.o \ mstream.o \
@@ -830,6 +831,7 @@ GTK_COMMONDEPS = \
list.d \ list.d \
log.d \ log.d \
memory.d \ memory.d \
menucmn.d \
mimetype.d \ mimetype.d \
module.d \ module.d \
mstream.d \ mstream.d \
@@ -1120,6 +1122,7 @@ MOTIF_COMMONOBJS = \
list.o \ list.o \
log.o \ log.o \
memory.o \ memory.o \
menucmn.o \
mimetype.o \ mimetype.o \
module.o \ module.o \
mstream.o \ mstream.o \
@@ -1215,6 +1218,7 @@ MOTIF_COMMONDEPS = \
list.d \ list.d \
log.d \ log.d \
memory.d \ memory.d \
menucmn.d \
mimetype.d \ mimetype.d \
module.d \ module.d \
mstream.d \ mstream.d \
@@ -1283,7 +1287,6 @@ MOTIF_GUIOBJS = \
dialog.o \ dialog.o \
filedlg.o \ filedlg.o \
font.o \ font.o \
fontenum.o \
frame.o \ frame.o \
gauge.o \ gauge.o \
gdiobj.o \ gdiobj.o \
@@ -1339,7 +1342,6 @@ MOTIF_GUIDEPS = \
dialog.d \ dialog.d \
filedlg.d \ filedlg.d \
font.d \ font.d \
fontenum.d \
frame.d \ frame.d \
gauge.d \ gauge.d \
gdiobj.d \ gdiobj.d \
@@ -1466,6 +1468,7 @@ MSW_COMMONOBJS = \
list.o \ list.o \
log.o \ log.o \
memory.o \ memory.o \
menucmn.o \
mimetype.o \ mimetype.o \
module.o \ module.o \
mstream.o \ mstream.o \
@@ -1561,6 +1564,7 @@ MSW_COMMONDEPS = \
list.d \ list.d \
log.d \ log.d \
memory.d \ memory.d \
menucmn.d \
mimetype.d \ mimetype.d \
module.d \ module.d \
mstream.d \ mstream.d \
@@ -1892,12 +1896,14 @@ HTMLDEPS = \
UNIX_OBJS = \ UNIX_OBJS = \
dialup.o \ dialup.o \
fontenum.o \
gsocket.o \ gsocket.o \
threadpsx.o \ threadpsx.o \
utilsunx.o utilsunx.o
UNIX_DEPS = \ UNIX_DEPS = \
dialup.d \ dialup.d \
fontenum.d \
gsocket.d \ gsocket.d \
threadpsx.d \ threadpsx.d \
utilsunx.d utilsunx.d

View File

@@ -143,6 +143,7 @@ lboxcmn.cpp C
list.cpp C B list.cpp C B
log.cpp C B log.cpp C B
memory.cpp C memory.cpp C
menucmn.cpp C
mimetype.cpp C 32,B mimetype.cpp C 32,B
module.cpp C B module.cpp C B
mstream.cpp C mstream.cpp C

View File

@@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// Name: menu.h // Name: wx/gtk/menu.h
// Purpose: // Purpose:
// Author: Robert Roebling // Author: Robert Roebling
// Id: $Id$ // Id: $Id$
@@ -7,95 +7,56 @@
// Licence: wxWindows licence // Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
#ifndef __GTKMENUH__ #ifndef __GTKMENUH__
#define __GTKMENUH__ #define __GTKMENUH__
#ifdef __GNUG__ #ifdef __GNUG__
#pragma interface #pragma interface "menu.h"
#endif #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 // wxMenuBar
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
class wxMenuBar : public wxWindow class wxMenuBar : public wxMenuBarBase
{ {
DECLARE_DYNAMIC_CLASS(wxMenuBar)
public: public:
// ctors // ctors
wxMenuBar(); wxMenuBar();
wxMenuBar(long style); wxMenuBar(long style);
wxMenuBar(int n, wxMenu *menus[], const wxString titles[]); wxMenuBar(int n, wxMenu *menus[], const wxString titles[]);
~wxMenuBar(); virtual ~wxMenuBar();
// menubar construction // implement base class (pure) virtuals
void Append( wxMenu *menu, const wxString &title ); 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, virtual int FindMenuItem(const wxString& menuString,
const wxString& itemString) const; const wxString& itemString) const;
// returns NULL if not found virtual wxMenuItem* FindItem( int id, wxMenu **menu = NULL ) const;
wxMenuItem* FindItem( int id ) const;
// returns NULL if not found, fills menuForItem if !NULL
wxMenuItem *FindItemForId(int itemId, wxMenu **menuForItem = NULL) const;
// state control virtual void EnableTop( size_t pos, bool flag );
void Check( int id, bool check ); virtual void SetLabelTop( size_t pos, const wxString& label );
bool IsChecked( int id ) const; virtual wxString GetLabelTop( size_t pos ) 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(); }
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; }
// implementation only from now on
void SetInvokingWindow( wxWindow *win ); void SetInvokingWindow( wxWindow *win );
void UnsetInvokingWindow( wxWindow *win ); void UnsetInvokingWindow( wxWindow *win );
GtkAccelGroup *m_accel; GtkAccelGroup *m_accel;
GtkItemFactory *m_factory; GtkItemFactory *m_factory;
wxList m_menus;
GtkWidget *m_menubar; GtkWidget *m_menubar;
long m_style; long m_style;
wxWindow *m_invokingWindow; 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 // title
void SetTitle(const wxString& label); void SetTitle(const wxString& label);
const wxString GetTitle() const; const wxString GetTitle() const;
// menu creation // menu creation
void AppendSeparator(); void AppendSeparator();
void Append(int id, const wxString &item, void Append(int id, const wxString &item,
@@ -201,7 +162,7 @@ public:
private: private:
// common code for both constructors: // common code for both constructors:
void Init( const wxString& title, void Init( const wxString& title,
long style, long style,
const wxFunction func = (wxFunction) NULL ); const wxFunction func = (wxFunction) NULL );
wxString m_title; wxString m_title;

View File

@@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// Name: menu.h // Name: wx/gtk/menu.h
// Purpose: // Purpose:
// Author: Robert Roebling // Author: Robert Roebling
// Id: $Id$ // Id: $Id$
@@ -7,95 +7,56 @@
// Licence: wxWindows licence // Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
#ifndef __GTKMENUH__ #ifndef __GTKMENUH__
#define __GTKMENUH__ #define __GTKMENUH__
#ifdef __GNUG__ #ifdef __GNUG__
#pragma interface #pragma interface "menu.h"
#endif #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 // wxMenuBar
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
class wxMenuBar : public wxWindow class wxMenuBar : public wxMenuBarBase
{ {
DECLARE_DYNAMIC_CLASS(wxMenuBar)
public: public:
// ctors // ctors
wxMenuBar(); wxMenuBar();
wxMenuBar(long style); wxMenuBar(long style);
wxMenuBar(int n, wxMenu *menus[], const wxString titles[]); wxMenuBar(int n, wxMenu *menus[], const wxString titles[]);
~wxMenuBar(); virtual ~wxMenuBar();
// menubar construction // implement base class (pure) virtuals
void Append( wxMenu *menu, const wxString &title ); 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, virtual int FindMenuItem(const wxString& menuString,
const wxString& itemString) const; const wxString& itemString) const;
// returns NULL if not found virtual wxMenuItem* FindItem( int id, wxMenu **menu = NULL ) const;
wxMenuItem* FindItem( int id ) const;
// returns NULL if not found, fills menuForItem if !NULL
wxMenuItem *FindItemForId(int itemId, wxMenu **menuForItem = NULL) const;
// state control virtual void EnableTop( size_t pos, bool flag );
void Check( int id, bool check ); virtual void SetLabelTop( size_t pos, const wxString& label );
bool IsChecked( int id ) const; virtual wxString GetLabelTop( size_t pos ) 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(); }
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; }
// implementation only from now on
void SetInvokingWindow( wxWindow *win ); void SetInvokingWindow( wxWindow *win );
void UnsetInvokingWindow( wxWindow *win ); void UnsetInvokingWindow( wxWindow *win );
GtkAccelGroup *m_accel; GtkAccelGroup *m_accel;
GtkItemFactory *m_factory; GtkItemFactory *m_factory;
wxList m_menus;
GtkWidget *m_menubar; GtkWidget *m_menubar;
long m_style; long m_style;
wxWindow *m_invokingWindow; 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 // title
void SetTitle(const wxString& label); void SetTitle(const wxString& label);
const wxString GetTitle() const; const wxString GetTitle() const;
// menu creation // menu creation
void AppendSeparator(); void AppendSeparator();
void Append(int id, const wxString &item, void Append(int id, const wxString &item,
@@ -201,7 +162,7 @@ public:
private: private:
// common code for both constructors: // common code for both constructors:
void Init( const wxString& title, void Init( const wxString& title,
long style, long style,
const wxFunction func = (wxFunction) NULL ); const wxFunction func = (wxFunction) NULL );
wxString m_title; wxString m_title;

View File

@@ -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_ #ifndef _WX_MENU_H_BASE_
#define _WX_MENU_H_BASE_ #define _WX_MENU_H_BASE_
#if defined(__WXMSW__) #ifdef __GNUG__
#include "wx/msw/menu.h" #pragma interface "menubase.h"
#elif defined(__WXMOTIF__)
#include "wx/motif/menu.h"
#elif defined(__WXGTK__)
#include "wx/gtk/menu.h"
#elif defined(__WXQT__)
#include "wx/qt/menu.h"
#elif defined(__WXMAC__)
#include "wx/mac/menu.h"
#elif defined(__WXPM__)
#include "wx/os2/menu.h"
#elif defined(__WXSTUBS__)
#include "wx/stubs/menu.h"
#endif #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"
#elif defined(__WXMOTIF__)
#include "wx/motif/menu.h"
#elif defined(__WXGTK__)
#include "wx/gtk/menu.h"
#elif defined(__WXQT__)
#include "wx/qt/menu.h"
#elif defined(__WXMAC__)
#include "wx/mac/menu.h"
#elif defined(__WXPM__)
#include "wx/os2/menu.h"
#elif defined(__WXSTUBS__)
#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 #endif
// _WX_MENU_H_BASE_ // _WX_MENU_H_BASE_

View File

@@ -52,6 +52,9 @@ public:
bool isCheckable = FALSE, bool isCheckable = FALSE,
wxMenu *subMenu = (wxMenu *)NULL); wxMenu *subMenu = (wxMenu *)NULL);
// the menu we're in
wxMenu *GetMenu() const { return m_parentMenu; }
// get/set id // get/set id
void SetId(int id) { m_id = id; } void SetId(int id) { m_id = id; }
int GetId() const { return m_id; } int GetId() const { return m_id; }

View File

@@ -49,6 +49,7 @@ public:
virtual void Enable(bool bDoEnable = TRUE); virtual void Enable(bool bDoEnable = TRUE);
virtual void Check(bool bDoCheck = TRUE); virtual void Check(bool bDoCheck = TRUE);
virtual void IsChecked() const;
// unfortunately needed to resolve ambiguity between // unfortunately needed to resolve ambiguity between
// wxMenuItemBase::IsCheckable() and wxOwnerDrawn::IsCheckable() // wxMenuItemBase::IsCheckable() and wxOwnerDrawn::IsCheckable()

203
src/common/menucmn.cpp Normal file
View File

@@ -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();
}

View File

@@ -12,10 +12,10 @@
#pragma implementation "menuitem.h" #pragma implementation "menuitem.h"
#endif #endif
#include "wx/menu.h"
#include "wx/log.h" #include "wx/log.h"
#include "wx/intl.h" #include "wx/intl.h"
#include "wx/app.h" #include "wx/app.h"
#include "wx/menu.h"
#if wxUSE_ACCEL #if wxUSE_ACCEL
#include "wx/accel.h" #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 ); m_menus.Append( menu );
@@ -283,6 +283,38 @@ void wxMenuBar::Append( wxMenu *menu, const wxString &title )
// adding menu later on. // adding menu later on.
if (m_invokingWindow) if (m_invokingWindow)
wxMenubarSetInvokingWindow( menu, 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 ) 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; 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 int wxMenuBar::FindMenuItem( const wxString &menuString, const wxString &itemString ) const
{ {
wxNode *node = m_menus.First(); wxNode *node = m_menus.First();
@@ -351,7 +371,7 @@ static wxMenuItem* FindMenuItemByIdRecursive(const wxMenu* menu, int id)
return result; return result;
} }
wxMenuItem* wxMenuBar::FindItem( int id ) const wxMenuItem* wxMenuBar::FindItem( int id, wxMenu **menuForItem ) const
{ {
wxMenuItem* result = 0; wxMenuItem* result = 0;
wxNode *node = m_menus.First(); wxNode *node = m_menus.First();
@@ -362,115 +382,48 @@ wxMenuItem* wxMenuBar::FindItem( int id ) const
node = node->Next(); node = node->Next();
} }
if ( menuForItem )
{
*menuForItem = result ? result->GetMenu() : (wxMenu *)NULL;
}
return result; return result;
} }
void wxMenuBar::Check( int id, bool check ) void wxMenuBar::EnableTop( size_t pos, bool flag )
{ {
wxMenuItem* item = FindMenuItemById( id ); wxMenuList::Node *node = m_menus.Item( pos );
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") );
item->SetText( label );
}
void wxMenuBar::EnableTop( int pos, bool flag )
{
wxNode *node = m_menus.Nth( pos );
wxCHECK_RET( node, wxT("menu not found") ); wxCHECK_RET( node, wxT("menu not found") );
wxMenu* menu = (wxMenu*)node->Data(); wxMenu* menu = node->GetData();
if (menu->m_owner) if (menu->m_owner)
gtk_widget_set_sensitive( menu->m_owner, flag ); 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") ); wxCHECK_MSG( node, wxT("invalid"), wxT("menu not found") );
wxMenu* menu = (wxMenu*)node->Data(); wxMenu* menu = node->GetData();
return menu->GetTitle(); 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") ); wxCHECK_RET( node, wxT("menu not found") );
wxMenu* menu = (wxMenu*)node->Data(); wxMenu* menu = node->GetData();
menu->SetTitle( label ); 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" // "activate"
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@@ -840,7 +793,7 @@ static wxString GetHotKey( const wxMenuItem& item )
case WXK_F10: case WXK_F10:
case WXK_F11: case WXK_F11:
case WXK_F12: case WXK_F12:
hotkey << wxT('F') << code = WXK_F1 + 1; hotkey << wxT('F') << code - WXK_F1 + 1;
break; break;
// if there are any other keys wxGetAccelFromString() may return, // if there are any other keys wxGetAccelFromString() may return,

View File

@@ -12,10 +12,10 @@
#pragma implementation "menuitem.h" #pragma implementation "menuitem.h"
#endif #endif
#include "wx/menu.h"
#include "wx/log.h" #include "wx/log.h"
#include "wx/intl.h" #include "wx/intl.h"
#include "wx/app.h" #include "wx/app.h"
#include "wx/menu.h"
#if wxUSE_ACCEL #if wxUSE_ACCEL
#include "wx/accel.h" #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 ); m_menus.Append( menu );
@@ -283,6 +283,38 @@ void wxMenuBar::Append( wxMenu *menu, const wxString &title )
// adding menu later on. // adding menu later on.
if (m_invokingWindow) if (m_invokingWindow)
wxMenubarSetInvokingWindow( menu, 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 ) 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; 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 int wxMenuBar::FindMenuItem( const wxString &menuString, const wxString &itemString ) const
{ {
wxNode *node = m_menus.First(); wxNode *node = m_menus.First();
@@ -351,7 +371,7 @@ static wxMenuItem* FindMenuItemByIdRecursive(const wxMenu* menu, int id)
return result; return result;
} }
wxMenuItem* wxMenuBar::FindItem( int id ) const wxMenuItem* wxMenuBar::FindItem( int id, wxMenu **menuForItem ) const
{ {
wxMenuItem* result = 0; wxMenuItem* result = 0;
wxNode *node = m_menus.First(); wxNode *node = m_menus.First();
@@ -362,115 +382,48 @@ wxMenuItem* wxMenuBar::FindItem( int id ) const
node = node->Next(); node = node->Next();
} }
if ( menuForItem )
{
*menuForItem = result ? result->GetMenu() : (wxMenu *)NULL;
}
return result; return result;
} }
void wxMenuBar::Check( int id, bool check ) void wxMenuBar::EnableTop( size_t pos, bool flag )
{ {
wxMenuItem* item = FindMenuItemById( id ); wxMenuList::Node *node = m_menus.Item( pos );
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") );
item->SetText( label );
}
void wxMenuBar::EnableTop( int pos, bool flag )
{
wxNode *node = m_menus.Nth( pos );
wxCHECK_RET( node, wxT("menu not found") ); wxCHECK_RET( node, wxT("menu not found") );
wxMenu* menu = (wxMenu*)node->Data(); wxMenu* menu = node->GetData();
if (menu->m_owner) if (menu->m_owner)
gtk_widget_set_sensitive( menu->m_owner, flag ); 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") ); wxCHECK_MSG( node, wxT("invalid"), wxT("menu not found") );
wxMenu* menu = (wxMenu*)node->Data(); wxMenu* menu = node->GetData();
return menu->GetTitle(); 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") ); wxCHECK_RET( node, wxT("menu not found") );
wxMenu* menu = (wxMenu*)node->Data(); wxMenu* menu = node->GetData();
menu->SetTitle( label ); 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" // "activate"
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@@ -840,7 +793,7 @@ static wxString GetHotKey( const wxMenuItem& item )
case WXK_F10: case WXK_F10:
case WXK_F11: case WXK_F11:
case WXK_F12: case WXK_F12:
hotkey << wxT('F') << code = WXK_F1 + 1; hotkey << wxT('F') << code - WXK_F1 + 1;
break; break;
// if there are any other keys wxGetAccelFromString() may return, // if there are any other keys wxGetAccelFromString() may return,

View 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, // NB: we don't support owner drawn top level items for now, if we do these
// otherwise use individual menus to enable/disable items // functions would have to be changed to use wxMenuItem as well
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);
}
void wxMenuBar::EnableTop(int pos, bool enable) void wxMenuBar::EnableTop(int pos, bool enable)
{ {
@@ -694,92 +685,6 @@ void wxMenuBar::EnableTop(int pos, bool enable)
Refresh(); 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) void wxMenuBar::SetLabelTop(int pos, const wxString& label)
{ {
UINT id; UINT id;

View File

@@ -137,6 +137,17 @@ void wxMenuItem::DeleteSubMenu()
m_subMenu = NULL; 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 // change item state
// ----------------- // -----------------