]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/menu.h
Slightly more efficient wxDataViewCtrl::StartEditor().
[wxWidgets.git] / include / wx / menu.h
index 00fcd5995a0c334c4181ef94a63ff3fadc0f2227..7525bc763f7f795f037ed2ea57b89ac42d0967bc 100644 (file)
@@ -27,6 +27,7 @@
 // included wx/menu.h
 #include "wx/menuitem.h"
 
 // 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;
 class WXDLLIMPEXP_FWD_CORE wxMenu;
 class WXDLLIMPEXP_FWD_CORE wxMenuBarBase;
 class WXDLLIMPEXP_FWD_CORE wxMenuBar;
@@ -68,7 +69,7 @@ public:
     }
 
     // append a separator to the menu
     }
 
     // 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,
 
     // append a check item
     wxMenuItem* AppendCheckItem(int itemid,
@@ -248,16 +249,27 @@ public:
 
     // the title
     virtual void SetTitle(const wxString& title) { m_title = title; }
 
     // 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; }
 
 
     // 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; }
 
     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; }
 
     // 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.
     // 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.
 
     // 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,9 +389,42 @@ protected:
 
     static bool      ms_locked;
 
 
     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
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
 // wxMenuBar
 // ----------------------------------------------------------------------------
@@ -496,9 +541,18 @@ public:
 
     virtual bool CanBeOutsideClientArea() const { return true; }
 
 
     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
 #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) );
     wxDEPRECATED( void SetLabelTop(size_t pos, const wxString& label) );
+    // Deprecated in favour of GetMenuLabelText
     wxDEPRECATED( wxString GetLabelTop(size_t pos) const );
 #endif
 
     wxDEPRECATED( wxString GetLabelTop(size_t pos) const );
 #endif
 
@@ -506,10 +560,15 @@ protected:
     // the list of all our menus
     wxMenuList m_menus;
 
     // 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;
 
     // the frame we are attached to (may be NULL)
     wxFrame *m_menuBarFrame;
 
-    DECLARE_NO_COPY_CLASS(wxMenuBarBase)
+    wxDECLARE_NO_COPY_CLASS(wxMenuBarBase);
 };
 
 // ----------------------------------------------------------------------------
 };
 
 // ----------------------------------------------------------------------------
@@ -532,7 +591,7 @@ protected:
 #elif defined(__WXGTK__)
     #include "wx/gtk1/menu.h"
 #elif defined(__WXMAC__)
 #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__)
 #elif defined(__WXCOCOA__)
     #include "wx/cocoa/menu.h"
 #elif defined(__WXPM__)
@@ -540,7 +599,35 @@ protected:
 #endif
 #endif // wxUSE_BASE_CLASSES_ONLY/!wxUSE_BASE_CLASSES_ONLY
 
 #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 // wxUSE_MENUS
 
-#endif
-    // _WX_MENU_H_BASE_
+#endif // _WX_MENU_H_BASE_