// Author: Julian Smart
// Modified by: Vadim Zeitlin (wxMenuItem is now in separate file)
// Created: 01/02/97
-// RCS-ID: $Id$
// Copyright: (c) Julian Smart
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
class WXDLLIMPEXP_FWD_CORE wxToolBar;
#endif
+class wxMenuRadioItemsData;
// Not using a combined wxToolBar/wxMenuBar? then use
// a commandbar in WinCE .NET to implement the
virtual void SetTitle(const wxString& title);
+ // MSW-only methods
+ // ----------------
+
+ // Create a new menu from the given native HMENU. Takes ownership of the
+ // menu handle and will delete it when this object is destroyed.
+ static wxMenu *MSWNewFromHMENU(WXHMENU hMenu) { return new wxMenu(hMenu); }
+
+
// implementation only from now on
// -------------------------------
- virtual void Attach(wxMenuBarBase *menubar);
-
bool MSWCommand(WXUINT param, WXWORD id);
- // semi-private accessors
- // get the window which contains this menu
- wxWindow *GetWindow() const;
- // get the menu handle
+ // get the native menu handle
WXHMENU GetHMenu() const { return m_hMenu; }
+ // Return the start and end position of the radio group to which the item
+ // at the given position belongs. Returns false if there is no radio group
+ // containing this position.
+ bool MSWGetRadioGroupRange(int pos, int *start, int *end) const;
+
#if wxUSE_ACCEL
// called by wxMenuBar to build its accel table from the accels of all menus
bool HasAccels() const { return !m_accels.empty(); }
m_maxAccelWidth = -1;
}
+ // get the menu with given handle (recursively)
+ wxMenu* MSWGetMenu(WXHMENU hMenu);
+
private:
void CalculateMaxAccelWidth();
virtual wxMenuItem* DoRemove(wxMenuItem *item);
private:
- // common part of all ctors
+ // This constructor is private, use MSWNewFromHMENU() to use it.
+ wxMenu(WXHMENU hMenu);
+
+ // Common part of all ctors, it doesn't create a new HMENU.
+ void InitNoCreate();
+
+ // Common part of all ctors except of the one above taking a native menu
+ // handler: calls InitNoCreate() and also creates a new menu.
void Init();
// common part of Append/Insert (behaves as Append is pos == (size_t)-1)
bool DoInsertOrAppend(wxMenuItem *item, size_t pos = (size_t)-1);
- // terminate the current radio group, if any
- void EndRadioGroup();
+
+ // This variable contains the description of the radio item groups and
+ // allows to find whether an item at the given position is part of the
+ // group and also where its group starts and ends.
+ //
+ // It is initially NULL and only allocated if we have any radio items.
+ wxMenuRadioItemsData *m_radioData;
// if true, insert a breal before appending the next item
bool m_doBreak;
- // the position of the first item in the current radio group or -1
- int m_startRadioGroup;
-
// the menu handle of this menu
WXHMENU m_hMenu;
// Menu Bar (a la Windows)
// ----------------------------------------------------------------------------
-class WXDLLIMPEXP_CORE wxMenuInfo : public wxObject
-{
-public :
- wxMenuInfo() { m_menu = NULL; }
- virtual ~wxMenuInfo() { }
-
- void Create( wxMenu *menu , const wxString &title )
- { m_menu = menu; m_title = title; }
- wxMenu* GetMenu() const { return m_menu; }
- wxString GetTitle() const { return m_title; }
-private :
- wxMenu *m_menu;
- wxString m_title;
-
- DECLARE_DYNAMIC_CLASS(wxMenuInfo)
-};
-
-WX_DECLARE_EXPORTED_LIST(wxMenuInfo, wxMenuInfoList );
-
class WXDLLIMPEXP_CORE wxMenuBar : public wxMenuBarBase
{
public:
virtual ~wxMenuBar();
// menubar construction
- bool Append( wxMenuInfo *info ) { return Append( info->GetMenu() , info->GetTitle() ); }
- const wxMenuInfoList& GetMenuInfos() const;
-
virtual bool Append( wxMenu *menu, const wxString &title );
virtual bool Insert(size_t pos, wxMenu *menu, const wxString& title);
virtual wxMenu *Replace(size_t pos, wxMenu *menu, const wxString& title);
virtual wxMenu *Remove(size_t pos);
virtual void EnableTop( size_t pos, bool flag );
+ virtual bool IsEnabledTop(size_t pos) const;
virtual void SetMenuLabel( size_t pos, const wxString& label );
virtual wxString GetMenuLabel( size_t pos ) const;
void Refresh( bool eraseBackground,
const wxRect *rect = (const wxRect *) NULL ) { wxWindow::Refresh(eraseBackground, rect); }
+ // get the menu with given handle (recursively)
+ wxMenu* MSWGetMenu(WXHMENU hMenu);
+
protected:
// common part of all ctors
void Init();
- wxArrayString m_titles;
- wxMenuInfoList m_menuInfos;
-
WXHMENU m_hMenu;
// Return the MSW position for a wxMenu which is sometimes different from