X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a381fd1c0a006628ac9af49e6933ccfb8138ed03..fd5cfba71157c481b5bc90563d0d990ec67ecb11:/include/wx/msw/menu.h diff --git a/include/wx/msw/menu.h b/include/wx/msw/menu.h index 5e2fa12938..0e7c6c52f0 100644 --- a/include/wx/msw/menu.h +++ b/include/wx/msw/menu.h @@ -12,30 +12,41 @@ #ifndef _WX_MENU_H_ #define _WX_MENU_H_ -#ifdef __GNUG__ - #pragma interface "menu.h" -#endif - #if wxUSE_ACCEL #include "wx/accel.h" #include "wx/dynarray.h" - WX_DEFINE_EXPORTED_ARRAY_NO_PTR(wxAcceleratorEntry *, wxAcceleratorArray); + WX_DEFINE_EXPORTED_ARRAY_PTR(wxAcceleratorEntry *, wxAcceleratorArray); #endif // wxUSE_ACCEL -class WXDLLEXPORT wxFrame; +class WXDLLIMPEXP_FWD_CORE wxFrame; #if defined(__WXWINCE__) && wxUSE_TOOLBAR -class WXDLLEXPORT wxToolBar; +class WXDLLIMPEXP_FWD_CORE wxToolBar; +#endif + +class wxMenuRadioItemsData; + +// Not using a combined wxToolBar/wxMenuBar? then use +// a commandbar in WinCE .NET to implement the +// menubar, since there is no ::SetMenu function. +#if defined(__WXWINCE__) +# if ((_WIN32_WCE >= 400) && !defined(__POCKETPC__) && !defined(__SMARTPHONE__)) || \ + defined(__HANDHELDPC__) +# define WINCE_WITH_COMMANDBAR +# else +# define WINCE_WITHOUT_COMMANDBAR +# endif #endif + #include "wx/arrstr.h" // ---------------------------------------------------------------------------- // Menu // ---------------------------------------------------------------------------- -class WXDLLEXPORT wxMenu : public wxMenuBase +class WXDLLIMPEXP_CORE wxMenu : public wxMenuBase { public: // ctors & dtor @@ -46,43 +57,35 @@ public: virtual ~wxMenu(); - // implement base class virtuals - virtual bool DoAppend(wxMenuItem *item); - virtual bool DoInsert(size_t pos, wxMenuItem *item); - virtual wxMenuItem *DoRemove(wxMenuItem *item); - virtual void Break(); virtual void SetTitle(const wxString& title); - // deprecated functions -#if wxUSE_MENU_CALLBACK - wxMenu(const wxString& title, const wxFunction func) - : wxMenuBase(title) - { - Init(); + // 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); } - Callback(func); - } -#endif // wxUSE_MENU_CALLBACK // 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.IsEmpty(); } - size_t GetAccelCount() const { return m_accels.GetCount(); } + bool HasAccels() const { return !m_accels.empty(); } + size_t GetAccelCount() const { return m_accels.size(); } size_t CopyAccels(wxAcceleratorEntry *accels) const; // called by wxMenuItem when its accels changes @@ -90,23 +93,64 @@ public: // helper used by wxMenu itself (returns the index in m_accels) int FindAccel(int id) const; + + // used only by wxMDIParentFrame currently but could be useful elsewhere: + // returns a new accelerator table with accelerators for just this menu + // (shouldn't be called if we don't have any accelerators) + wxAcceleratorTable *CreateAccelTable() const; #endif // wxUSE_ACCEL +#if wxUSE_OWNER_DRAWN + + int GetMaxAccelWidth() + { + if (m_maxAccelWidth == -1) + CalculateMaxAccelWidth(); + return m_maxAccelWidth; + } + + void ResetMaxAccelWidth() + { + m_maxAccelWidth = -1; + } + + // get the menu with given handle (recursively) + wxMenu* MSWGetMenu(WXHMENU hMenu); + private: - // common part of all ctors + void CalculateMaxAccelWidth(); + +#endif // wxUSE_OWNER_DRAWN + +protected: + virtual wxMenuItem* DoAppend(wxMenuItem *item); + virtual wxMenuItem* DoInsert(size_t pos, wxMenuItem *item); + virtual wxMenuItem* DoRemove(wxMenuItem *item); + +private: + // 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(); - // if TRUE, insert a breal before appending the next item - bool m_doBreak; + // 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; - // the position of the first item in the current radio group or -1 - int m_startRadioGroup; + // if true, insert a breal before appending the next item + bool m_doBreak; // the menu handle of this menu WXHMENU m_hMenu; @@ -116,14 +160,25 @@ private: wxAcceleratorArray m_accels; #endif // wxUSE_ACCEL - DECLARE_DYNAMIC_CLASS(wxMenu) +#if wxUSE_OWNER_DRAWN + // true if the menu has any ownerdrawn items + bool m_ownerDrawn; + + // the max width of menu items bitmaps + int m_maxBitmapWidth; + + // the max width of menu items accels + int m_maxAccelWidth; +#endif // wxUSE_OWNER_DRAWN + + DECLARE_DYNAMIC_CLASS_NO_COPY(wxMenu) }; // ---------------------------------------------------------------------------- // Menu Bar (a la Windows) // ---------------------------------------------------------------------------- -class WXDLLEXPORT wxMenuBar : public wxMenuBarBase +class WXDLLIMPEXP_CORE wxMenuBar : public wxMenuBarBase { public: // ctors & dtor @@ -132,7 +187,7 @@ public: // unused under MSW wxMenuBar(long style); // menubar takes ownership of the menus arrays but copies the titles - wxMenuBar(int n, wxMenu *menus[], const wxString titles[]); + wxMenuBar(size_t n, wxMenu *menus[], const wxString titles[], long style = 0); virtual ~wxMenuBar(); // menubar construction @@ -142,17 +197,9 @@ public: virtual wxMenu *Remove(size_t pos); virtual void EnableTop( size_t pos, bool flag ); - virtual void SetLabelTop( size_t pos, const wxString& label ); - virtual wxString GetLabelTop( size_t pos ) const; - - // compatibility: these functions are deprecated -#if WXWIN_COMPATIBILITY - void SetEventHandler(wxEvtHandler *handler) { m_eventHandler = handler; } - wxEvtHandler *GetEventHandler() { return m_eventHandler; } - - bool Enabled(int id) const { return IsEnabled(id); } - bool Checked(int id) const { return IsChecked(id); } -#endif // WXWIN_COMPATIBILITY + virtual bool IsEnabledTop(size_t pos) const; + virtual void SetMenuLabel( size_t pos, const wxString& label ); + virtual wxString GetMenuLabel( size_t pos ) const; // implementation from now on WXHMENU Create(); @@ -165,11 +212,13 @@ public: wxToolBar* GetToolBar() const { return m_toolBar; } #endif -#if wxUSE_ACCEL - // get the accel table for all the menus - const wxAcceleratorTable& GetAccelTable() const { return m_accelTable; } +#ifdef WINCE_WITH_COMMANDBAR + WXHWND GetCommandBar() const { return m_commandBar; } + bool AddAdornments(long style); +#endif - // update the accel table (must be called after adding/deletign a menu) +#if wxUSE_ACCEL + // update the accel table (must be called after adding/deleting a menu) void RebuildAccelTable(); #endif // wxUSE_ACCEL @@ -184,29 +233,30 @@ public: 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(); -#if WXWIN_COMPATIBILITY - wxEvtHandler *m_eventHandler; -#endif // WXWIN_COMPATIBILITY - - wxArrayString m_titles; - WXHMENU m_hMenu; -#if wxUSE_ACCEL - // the accelerator table for all accelerators in all our menus - wxAcceleratorTable m_accelTable; -#endif // wxUSE_ACCEL + // Return the MSW position for a wxMenu which is sometimes different from + // the wxWidgets position. + int MSWPositionForWxMenu(wxMenu *menu, int wxpos); #if defined(__WXWINCE__) && wxUSE_TOOLBAR wxToolBar* m_toolBar; #endif +#ifdef WINCE_WITH_COMMANDBAR + WXHWND m_commandBar; + bool m_adornmentsAdded; +#endif + private: - DECLARE_DYNAMIC_CLASS(wxMenuBar) + DECLARE_DYNAMIC_CLASS_NO_COPY(wxMenuBar) }; #endif // _WX_MENU_H_