X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/68bc148cac0232c0f0aed3ab2f27dfe074869e45..7344108e8a129a3f9b4df5ab0f98a1713db03b89:/include/wx/menu.h diff --git a/include/wx/menu.h b/include/wx/menu.h index c222caa135..f392729270 100644 --- a/include/wx/menu.h +++ b/include/wx/menu.h @@ -27,6 +27,7 @@ // included wx/menu.h #include "wx/menuitem.h" +class WXDLLIMPEXP_FWD_CORE wxFrame; class WXDLLIMPEXP_FWD_CORE wxMenu; class WXDLLIMPEXP_FWD_CORE wxMenuBarBase; class WXDLLIMPEXP_FWD_CORE wxMenuBar; @@ -40,7 +41,7 @@ WX_DECLARE_EXPORTED_LIST(wxMenuItem, wxMenuItemList); // wxMenu // ---------------------------------------------------------------------------- -class WXDLLEXPORT wxMenuBase : public wxEvtHandler +class WXDLLIMPEXP_CORE wxMenuBase : public wxEvtHandler { public: // create a menu @@ -68,7 +69,7 @@ public: } // append a separator to the menu - wxMenuItem* AppendSeparator() { return Append(wxID_SEPARATOR, wxEmptyString); } + wxMenuItem* AppendSeparator() { return Append(wxID_SEPARATOR); } // append a check item wxMenuItem* AppendCheckItem(int itemid, @@ -248,16 +249,27 @@ public: // the title virtual void SetTitle(const wxString& title) { m_title = title; } - const wxString GetTitle() const { return m_title; } + const wxString& GetTitle() const { return m_title; } // event handler void SetEventHandler(wxEvtHandler *handler) { m_eventHandler = handler; } wxEvtHandler *GetEventHandler() const { return m_eventHandler; } - // invoking window - void SetInvokingWindow(wxWindow *win) { m_invokingWindow = win; } + // Invoking window: this is set by wxWindow::PopupMenu() before showing a + // popup menu and reset after it's hidden. Notice that you probably want to + // use GetWindow() below instead of GetInvokingWindow() as the latter only + // returns non-NULL for the top level menus + // + // NB: avoid calling SetInvokingWindow() directly if possible, use + // wxMenuInvokingWindowSetter class below instead + void SetInvokingWindow(wxWindow *win); wxWindow *GetInvokingWindow() const { return m_invokingWindow; } + // the window associated with this menu: this is the invoking window for + // popup menus or the top level window to which the menu bar is attached + // for menus which are part of a menu bar + wxWindow *GetWindow() const; + // style long GetStyle() const { return m_style; } @@ -267,7 +279,7 @@ public: // Updates the UI for a menu and all submenus recursively. source is the // object that has the update event handlers defined for it. If NULL, the // menu or associated window will be used. - void UpdateUI(wxEvtHandler* source = (wxEvtHandler*)NULL); + void UpdateUI(wxEvtHandler* source = NULL); // get the menu bar this menu is attached to (may be NULL, always NULL for // popup menus). Traverse up the menu hierarchy to find it. @@ -377,14 +389,47 @@ protected: static bool ms_locked; - DECLARE_NO_COPY_CLASS(wxMenuBase) + wxDECLARE_NO_COPY_CLASS(wxMenuBase); +}; + +#if wxUSE_EXTENDED_RTTI + +// ---------------------------------------------------------------------------- +// XTI accessor +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxMenuInfoHelper : public wxObject +{ +public: + wxMenuInfoHelper() { m_menu = NULL; } + virtual ~wxMenuInfoHelper() { } + + bool Create( wxMenu *menu, const wxString &title ) + { + m_menu = menu; + m_title = title; + return true; + } + + wxMenu* GetMenu() const { return m_menu; } + wxString GetTitle() const { return m_title; } + +private: + wxMenu *m_menu; + wxString m_title; + + DECLARE_DYNAMIC_CLASS(wxMenuInfoHelper) }; +WX_DECLARE_EXPORTED_LIST(wxMenuInfoHelper, wxMenuInfoHelperList ); + +#endif + // ---------------------------------------------------------------------------- // wxMenuBar // ---------------------------------------------------------------------------- -class WXDLLEXPORT wxMenuBarBase : public wxWindow +class WXDLLIMPEXP_CORE wxMenuBarBase : public wxWindow { public: // default ctor @@ -496,9 +541,18 @@ public: virtual bool CanBeOutsideClientArea() const { return true; } +#if wxUSE_EXTENDED_RTTI + // XTI helpers: + bool AppendMenuInfo( const wxMenuInfoHelper *info ) + { return Append( info->GetMenu(), info->GetTitle() ); } + const wxMenuInfoHelperList& GetMenuInfos() const; +#endif + #if WXWIN_COMPATIBILITY_2_8 // get or change the label of the menu at given position + // Deprecated in favour of SetMenuLabel wxDEPRECATED( void SetLabelTop(size_t pos, const wxString& label) ); + // Deprecated in favour of GetMenuLabelText wxDEPRECATED( wxString GetLabelTop(size_t pos) const ); #endif @@ -506,10 +560,15 @@ protected: // the list of all our menus wxMenuList m_menus; +#if wxUSE_EXTENDED_RTTI + // used by XTI + wxMenuInfoHelperList m_menuInfos; +#endif + // the frame we are attached to (may be NULL) wxFrame *m_menuBarFrame; - DECLARE_NO_COPY_CLASS(wxMenuBarBase) + wxDECLARE_NO_COPY_CLASS(wxMenuBarBase); }; // ---------------------------------------------------------------------------- @@ -521,8 +580,6 @@ protected: #else // !wxUSE_BASE_CLASSES_ONLY #if defined(__WXUNIVERSAL__) #include "wx/univ/menu.h" -#elif defined(__WXPALMOS__) - #include "wx/palmos/menu.h" #elif defined(__WXMSW__) #include "wx/msw/menu.h" #elif defined(__WXMOTIF__) @@ -532,7 +589,7 @@ protected: #elif defined(__WXGTK__) #include "wx/gtk1/menu.h" #elif defined(__WXMAC__) - #include "wx/mac/menu.h" + #include "wx/osx/menu.h" #elif defined(__WXCOCOA__) #include "wx/cocoa/menu.h" #elif defined(__WXPM__) @@ -540,7 +597,35 @@ protected: #endif #endif // wxUSE_BASE_CLASSES_ONLY/!wxUSE_BASE_CLASSES_ONLY +// ---------------------------------------------------------------------------- +// Helper class used in the implementation only: sets the invoking window of +// the given menu in its ctor and resets it in dtor. +// ---------------------------------------------------------------------------- + +class wxMenuInvokingWindowSetter +{ +public: + // Ctor sets the invoking window for the given menu. + // + // The menu lifetime must be greater than that of this class. + wxMenuInvokingWindowSetter(wxMenu& menu, wxWindow *win) + : m_menu(menu) + { + menu.SetInvokingWindow(win); + } + + // Dtor resets the invoking window. + ~wxMenuInvokingWindowSetter() + { + m_menu.SetInvokingWindow(NULL); + } + +private: + wxMenu& m_menu; + + wxDECLARE_NO_COPY_CLASS(wxMenuInvokingWindowSetter); +}; + #endif // wxUSE_MENUS -#endif - // _WX_MENU_H_BASE_ +#endif // _WX_MENU_H_BASE_