]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/msw/menu.h
*** empty log message ***
[wxWidgets.git] / include / wx / msw / menu.h
index 65479f5b200a243e2a258613c64d711036904b5e..9d2ca80bd8f63c33d8b8c0b511def5d4b1063b85 100644 (file)
 
 #include "wx/defs.h"
 #include "wx/event.h"
+#include "wx/dynarray.h"
+#include "wx/string.h"
+
+#if wxUSE_ACCEL
+#include "wx/accel.h"
+#endif // wxUSE_ACCEL
 
 class WXDLLEXPORT wxMenuItem;
 class WXDLLEXPORT wxMenuBar;
 class WXDLLEXPORT wxMenu;
 class WXDLLEXPORT wxFrame;
 
-WXDLLEXPORT_DATA(extern const char*) wxEmptyString;
+WXDLLEXPORT_DATA(extern const wxChar*) wxEmptyString;
 
 // ----------------------------------------------------------------------------
 // Menu
@@ -35,8 +41,23 @@ class WXDLLEXPORT wxMenu : public wxEvtHandler
     DECLARE_DYNAMIC_CLASS(wxMenu)
 
 public:
-    // ctor & dtor
-    wxMenu(const wxString& title = wxEmptyString, const wxFunction func = NULL);
+    // ctors & dtor
+    wxMenu(const wxString& title,
+           const wxFunction func)
+    {
+        Init(title, func);
+    }
+
+    wxMenu( long WXUNUSED(style) )
+    {
+       Init( wxEmptyString );
+    }
+
+    wxMenu(const wxString& title = wxEmptyString, long WXUNUSED(style) = 0)
+    {
+        Init(title);
+    }
+
     virtual ~wxMenu();
 
     // construct menu
@@ -103,20 +124,12 @@ public:
     // menu or associated window will be used.
     void UpdateUI(wxEvtHandler* source = (wxEvtHandler*)NULL);
 
-    void ProcessCommand(wxCommandEvent& event);
+    bool ProcessCommand(wxCommandEvent& event);
 
     virtual void SetParent(wxEvtHandler *parent) { m_parent = parent; }
     void SetEventHandler(wxEvtHandler *handler) { m_eventHandler = handler; }
     wxEvtHandler *GetEventHandler() const { return m_eventHandler; }
 
-#ifdef WXWIN_COMPATIBILITY
-    void Callback(const wxFunction func) { m_callback = func; }
-
-    // compatibility: these functions are deprecated
-    bool Enabled(int id) const { return IsEnabled(id); }
-    bool Checked(int id) const { return IsChecked(id); }
-#endif // WXWIN_COMPATIBILITY
-
     // IMPLEMENTATION
     bool MSWCommand(WXUINT param, WXWORD id);
 
@@ -129,17 +142,38 @@ public:
         // get the menu handle
     WXHMENU GetHMenu() const;
 
+    // only for wxMenuBar
+    void Attach(wxMenuBar *menubar);
+    void Detach();
+
+#if wxUSE_ACCEL
+    size_t GetAccelCount() const { return m_accelKeyCodes.GetCount(); }
+    size_t CopyAccels(wxAcceleratorEntry *accels) const;
+#endif // wxUSE_ACCEL
+
+    wxFunction GetCallback() const { return m_callback; }
+    void Callback(const wxFunction func) { m_callback = func; }
+    wxFunction        m_callback;
+
+#ifdef WXWIN_COMPATIBILITY
+    // compatibility: these functions are deprecated
+    bool Enabled(int id) const { return IsEnabled(id); }
+    bool Checked(int id) const { return IsChecked(id); }
+
+#endif // WXWIN_COMPATIBILITY
+
 private:
-    bool              m_doBreak ;
+    // common part of all ctors
+    void Init(const wxString& title, const wxFunction func = NULL );
+
+    bool              m_doBreak;
 
-public:
     // This is used when m_hMenu is NULL because we don't want to
     // delete it in ~wxMenu (it's been added to a parent menu).
     // But we'll still need the handle for other purposes.
     // Might be better to have a flag saying whether it's deleteable or not.
     WXHMENU           m_savehMenu ; // Used for Enable() on popup
     WXHMENU           m_hMenu;
-    wxFunction        m_callback;
 
     int               m_noItems;
     wxString          m_title;
@@ -150,6 +184,11 @@ public:
     wxEvtHandler *    m_eventHandler;
     wxWindow         *m_pInvokingWindow;
     void*             m_clientData;
+
+#if wxUSE_ACCEL
+    // the accelerators data
+    wxArrayInt        m_accelKeyCodes, m_accelFlags, m_accelIds;
+#endif // wxUSE_ACCEL
 };
 
 // ----------------------------------------------------------------------------
@@ -162,13 +201,21 @@ class WXDLLEXPORT wxMenuBar : public wxEvtHandler
 
 public:
     // ctors & dtor
+        // default constructor
     wxMenuBar();
+        // 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[]);
     virtual ~wxMenuBar();
 
     // menubar construction
+    WXHMENU Create();
     void Append(wxMenu *menu, const wxString& title);
+    void Insert(int pos, wxMenu * menu, const wxString& title);
+    void ReplaceMenu(int pos, wxMenu * new_menu, const wxString& title);
+    int  FindMenu(const wxString& title);
+    void Detach();
     virtual void Delete(wxMenu *menu, int index = 0); /* Menu not destroyed */
 
     // state control
@@ -195,8 +242,9 @@ public:
     void SetLabelTop(int pos, const wxString& label) ;
     wxString GetLabelTop(int pos) const ;
 
-    // notifications
-    virtual bool OnAppend(wxMenu *menu, const char *title);
+    // notifications: return FALSE to prevent the menu from being
+    // appended/deleted
+    virtual bool OnAppend(wxMenu *menu, const wxChar *title);
     virtual bool OnDelete(wxMenu *menu, int index);
 
     // item search
@@ -221,13 +269,41 @@ public:
     bool Checked(int id) const { return IsChecked(id); }
 #endif // WXWIN_COMPATIBILITY
 
-public:
-    wxEvtHandler *            m_eventHandler;
-    int                       m_menuCount;
-    wxMenu **                 m_menus;
-    wxString *                m_titles;
-    wxFrame *                 m_menuBarFrame;
-    WXHMENU                   m_hMenu;
+    // IMPLEMENTATION
+        // returns TRUE if we're attached to a frame
+    bool IsAttached() const { return m_menuBarFrame != NULL; }
+        // get the frame we live in
+    wxFrame *GetFrame() const { return m_menuBarFrame; }
+        // attach to a frame
+    void Attach(wxFrame *frame);
+
+#if wxUSE_ACCEL
+        // get the accel table for the menus
+    const wxAcceleratorTable& GetAccelTable() const { return m_accelTable; }
+#endif // wxUSE_ACCEL
+
+        // get the menu handle
+    WXHMENU GetHMenu() const { return m_hMenu; }
+
+    // if the menubar is modified, the display is not updated automatically,
+    // call this function to update it (m_menuBarFrame should be !NULL)
+    void Refresh();
+
+protected:
+    // common part of all ctors
+    void Init();
+
+    wxEvtHandler *m_eventHandler;
+    int           m_menuCount;
+    wxMenu      **m_menus;
+    wxString     *m_titles;
+    wxFrame      *m_menuBarFrame;
+    WXHMENU       m_hMenu;
+
+#if wxUSE_ACCEL
+    // the accelerator table for all accelerators in all our menus
+    wxAcceleratorTable m_accelTable;
+#endif // wxUSE_ACCEL
 };
 
 #endif // _WX_MENU_H_