]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/menu.h
Don't create multiple parent-less top level frames in layout sample.
[wxWidgets.git] / include / wx / menu.h
index 01634e23c5562b8edd4bb2341ac714fad4d472af..f3927292701a151075d3f5523040d2e19cd5fd90 100644 (file)
 #ifndef _WX_MENU_H_BASE_
 #define _WX_MENU_H_BASE_
 
 #ifndef _WX_MENU_H_BASE_
 #define _WX_MENU_H_BASE_
 
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-    #pragma interface "menubase.h"
-#endif
-
 #include "wx/defs.h"
 
 #if wxUSE_MENUS
 #include "wx/defs.h"
 
 #if wxUSE_MENUS
 // included wx/menu.h
 #include "wx/menuitem.h"
 
 // included wx/menu.h
 #include "wx/menuitem.h"
 
-class WXDLLEXPORT wxMenu;
-class WXDLLEXPORT wxMenuBarBase;
-class WXDLLEXPORT wxMenuBar;
-class WXDLLEXPORT wxMenuItem;
+class WXDLLIMPEXP_FWD_CORE wxFrame;
+class WXDLLIMPEXP_FWD_CORE wxMenu;
+class WXDLLIMPEXP_FWD_CORE wxMenuBarBase;
+class WXDLLIMPEXP_FWD_CORE wxMenuBar;
+class WXDLLIMPEXP_FWD_CORE wxMenuItem;
 
 // pseudo template list classes
 WX_DECLARE_EXPORTED_LIST(wxMenu, wxMenuList);
 
 // pseudo template list classes
 WX_DECLARE_EXPORTED_LIST(wxMenu, wxMenuList);
@@ -44,7 +41,7 @@ WX_DECLARE_EXPORTED_LIST(wxMenuItem, wxMenuItemList);
 // wxMenu
 // ----------------------------------------------------------------------------
 
 // wxMenu
 // ----------------------------------------------------------------------------
 
-class WXDLLEXPORT wxMenuBase : public wxEvtHandler
+class WXDLLIMPEXP_CORE wxMenuBase : public wxEvtHandler
 {
 public:
     // create a menu
 {
 public:
     // create a menu
@@ -64,7 +61,7 @@ public:
 
     // append any kind of item (normal/check/radio/separator)
     wxMenuItem* Append(int itemid,
 
     // append any kind of item (normal/check/radio/separator)
     wxMenuItem* Append(int itemid,
-                       const wxString& text,
+                       const wxString& text = wxEmptyString,
                        const wxString& help = wxEmptyString,
                        wxItemKind kind = wxITEM_NORMAL)
     {
                        const wxString& help = wxEmptyString,
                        wxItemKind kind = wxITEM_NORMAL)
     {
@@ -72,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,
@@ -91,12 +88,11 @@ public:
     }
 
     // append a submenu
     }
 
     // append a submenu
-    wxMenuItem* Append(int itemid,
-                       const wxString& text,
-                       wxMenu *submenu,
-                       const wxString& help = wxEmptyString)
+    wxMenuItem* AppendSubMenu(wxMenu *submenu,
+                              const wxString& text,
+                              const wxString& help = wxEmptyString)
     {
     {
-        return DoAppend(wxMenuItem::New((wxMenu *)this, itemid, text, help,
+        return DoAppend(wxMenuItem::New((wxMenu *)this, wxID_ANY, text, help,
                                         wxITEM_NORMAL, submenu));
     }
 
                                         wxITEM_NORMAL, submenu));
     }
 
@@ -113,7 +109,7 @@ public:
     // insert an item before given position
     wxMenuItem* Insert(size_t pos,
                        int itemid,
     // insert an item before given position
     wxMenuItem* Insert(size_t pos,
                        int itemid,
-                       const wxString& text,
+                       const wxString& text = wxEmptyString,
                        const wxString& help = wxEmptyString,
                        wxItemKind kind = wxITEM_NORMAL)
     {
                        const wxString& help = wxEmptyString,
                        wxItemKind kind = wxITEM_NORMAL)
     {
@@ -163,7 +159,7 @@ public:
 
     // prepend any item to the menu
     wxMenuItem* Prepend(int itemid,
 
     // prepend any item to the menu
     wxMenuItem* Prepend(int itemid,
-                        const wxString& text,
+                        const wxString& text = wxEmptyString,
                         const wxString& help = wxEmptyString,
                         wxItemKind kind = wxITEM_NORMAL)
     {
                         const wxString& help = wxEmptyString,
                         wxItemKind kind = wxITEM_NORMAL)
     {
@@ -242,6 +238,9 @@ public:
     void SetLabel(int itemid, const wxString& label);
     wxString GetLabel(int itemid) const;
 
     void SetLabel(int itemid, const wxString& label);
     wxString GetLabel(int itemid) const;
 
+    //  Returns the stripped label
+    wxString GetLabelText(int itemid) const { return wxMenuItem::GetLabelText(GetLabel(itemid)); }
+
     virtual void SetHelpString(int itemid, const wxString& helpString);
     virtual wxString GetHelpString(int itemid) const;
 
     virtual void SetHelpString(int itemid, const wxString& helpString);
     virtual wxString GetHelpString(int itemid) const;
 
@@ -250,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; }
 
@@ -269,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.
@@ -294,8 +304,8 @@ public:
     // pos != NULL
     wxMenuItem *FindChildItem(int itemid, size_t *pos = NULL) const;
 
     // pos != NULL
     wxMenuItem *FindChildItem(int itemid, size_t *pos = NULL) const;
 
-    // called to generate a wxCommandEvent, return TRUE if it was processed,
-    // FALSE otherwise
+    // called to generate a wxCommandEvent, return true if it was processed,
+    // false otherwise
     //
     // the checked parameter may have boolean value or -1 for uncheckable items
     bool SendEvent(int itemid, int checked = -1);
     //
     // the checked parameter may have boolean value or -1 for uncheckable items
     bool SendEvent(int itemid, int checked = -1);
@@ -313,6 +323,16 @@ public:
         Append(itemid, text, help, isCheckable ? wxITEM_CHECK : wxITEM_NORMAL);
     }
 
         Append(itemid, text, help, isCheckable ? wxITEM_CHECK : wxITEM_NORMAL);
     }
 
+    // use more readable and not requiring unused itemid AppendSubMenu() instead
+    wxMenuItem* Append(int itemid,
+                       const wxString& text,
+                       wxMenu *submenu,
+                       const wxString& help = wxEmptyString)
+    {
+        return DoAppend(wxMenuItem::New((wxMenu *)this, itemid, text, help,
+                                        wxITEM_NORMAL, submenu));
+    }
+
     void Insert(size_t pos,
                 int itemid,
                 const wxString& text,
     void Insert(size_t pos,
                 int itemid,
                 const wxString& text,
@@ -334,7 +354,7 @@ public:
     {
         ms_locked = locked;
     }
     {
         ms_locked = locked;
     }
-    
+
 protected:
     // virtuals to override in derived classes
     // ---------------------------------------
 protected:
     // virtuals to override in derived classes
     // ---------------------------------------
@@ -368,15 +388,48 @@ protected:
     wxEvtHandler  *m_eventHandler;      // a pluggable in event handler
 
     static bool      ms_locked;
     wxEvtHandler  *m_eventHandler;      // a pluggable in event handler
 
     static bool      ms_locked;
+
+    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_NO_COPY_CLASS(wxMenuBase)
+    DECLARE_DYNAMIC_CLASS(wxMenuInfoHelper)
 };
 
 };
 
+WX_DECLARE_EXPORTED_LIST(wxMenuInfoHelper, wxMenuInfoHelperList );
+
+#endif
+
 // ----------------------------------------------------------------------------
 // wxMenuBar
 // ----------------------------------------------------------------------------
 
 // ----------------------------------------------------------------------------
 // wxMenuBar
 // ----------------------------------------------------------------------------
 
-class WXDLLEXPORT wxMenuBarBase : public wxWindow
+class WXDLLIMPEXP_CORE wxMenuBarBase : public wxWindow
 {
 public:
     // default ctor
 {
 public:
     // default ctor
@@ -388,10 +441,10 @@ public:
     // menu bar construction
     // ---------------------
 
     // menu bar construction
     // ---------------------
 
-    // append a menu to the end of menubar, return TRUE if ok
+    // append a menu to the end of menubar, return true if ok
     virtual bool Append(wxMenu *menu, const wxString& title);
 
     virtual bool Append(wxMenu *menu, const wxString& title);
 
-    // insert a menu before the given position into the menubar, return TRUE
+    // 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);
 
     // if inserted ok
     virtual bool Insert(size_t pos, wxMenu *menu, const wxString& title);
 
@@ -416,11 +469,14 @@ public:
     virtual void EnableTop(size_t pos, bool enable) = 0;
 
     // is the menu enabled?
     virtual void EnableTop(size_t pos, bool enable) = 0;
 
     // is the menu enabled?
-    virtual bool IsEnabledTop(size_t WXUNUSED(pos)) const { return TRUE; }
+    virtual bool IsEnabledTop(size_t WXUNUSED(pos)) const { return true; }
 
     // get or change the label of the menu at given position
 
     // 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;
+    virtual void SetMenuLabel(size_t pos, const wxString& label) = 0;
+    virtual wxString GetMenuLabel(size_t pos) const = 0;
+
+    // get the stripped label of the menu at given position
+    virtual wxString GetMenuLabelText(size_t pos) const { return wxMenuItem::GetLabelText(GetMenuLabel(pos)); }
 
     // item search
     // -----------
 
     // item search
     // -----------
@@ -450,6 +506,7 @@ public:
     void Check(int itemid, bool check);
     bool IsChecked(int itemid) const;
     bool IsEnabled(int itemid) const;
     void Check(int itemid, bool check);
     bool IsChecked(int itemid) const;
     bool IsEnabled(int itemid) const;
+    virtual bool IsEnabled() const { return wxWindow::IsEnabled(); }
 
     void SetLabel(int itemid, const wxString &label);
     wxString GetLabel(int itemid) const;
 
     void SetLabel(int itemid, const wxString &label);
     wxString GetLabel(int itemid) const;
@@ -462,7 +519,7 @@ public:
     // get the frame we are attached to (may return NULL)
     wxFrame *GetFrame() const { return m_menuBarFrame; }
 
     // get the frame we are attached to (may return NULL)
     wxFrame *GetFrame() const { return m_menuBarFrame; }
 
-    // returns TRUE if we're attached to a frame
+    // returns true if we're attached to a frame
     bool IsAttached() const { return GetFrame() != NULL; }
 
     // associate the menubar with the frame
     bool IsAttached() const { return GetFrame() != NULL; }
 
     // associate the menubar with the frame
@@ -472,21 +529,46 @@ public:
     virtual void Detach();
 
     // need to override these ones to avoid virtual function hiding
     virtual void Detach();
 
     // need to override these ones to avoid virtual function hiding
-    virtual bool Enable(bool enable = TRUE) { return wxWindow::Enable(enable); }
+    virtual bool Enable(bool enable = true) { return wxWindow::Enable(enable); }
     virtual void SetLabel(const wxString& s) { wxWindow::SetLabel(s); }
     virtual wxString GetLabel() const { return wxWindow::GetLabel(); }
 
     // don't want menu bars to accept the focus by tabbing to them
     virtual void SetLabel(const wxString& s) { wxWindow::SetLabel(s); }
     virtual wxString GetLabel() const { return wxWindow::GetLabel(); }
 
     // don't want menu bars to accept the focus by tabbing to them
-    virtual bool AcceptsFocusFromKeyboard() const { return FALSE; }
+    virtual bool AcceptsFocusFromKeyboard() const { return false; }
+
+    // update all menu item states in all menus
+    virtual void UpdateMenus();
+
+    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
 
 protected:
     // the list of all our menus
     wxMenuList m_menus;
 
 
 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;
 
     // the frame we are attached to (may be NULL)
     wxFrame *m_menuBarFrame;
 
-    DECLARE_NO_COPY_CLASS(wxMenuBarBase)
+    wxDECLARE_NO_COPY_CLASS(wxMenuBarBase);
 };
 
 // ----------------------------------------------------------------------------
 };
 
 // ----------------------------------------------------------------------------
@@ -502,10 +584,12 @@ protected:
     #include "wx/msw/menu.h"
 #elif defined(__WXMOTIF__)
     #include "wx/motif/menu.h"
     #include "wx/msw/menu.h"
 #elif defined(__WXMOTIF__)
     #include "wx/motif/menu.h"
-#elif defined(__WXGTK__)
+#elif defined(__WXGTK20__)
     #include "wx/gtk/menu.h"
     #include "wx/gtk/menu.h"
+#elif defined(__WXGTK__)
+    #include "wx/gtk1/menu.h"
 #elif defined(__WXMAC__)
 #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__)
@@ -513,7 +597,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_