1///////////////////////////////////////////////////////////////////////////////
2// Name:        wx/menuitem.h
3// Purpose:     wxMenuItem class
4// Author:      Vadim Zeitlin
5// Modified by:
6// Created:     25.10.99
7// RCS-ID:      $Id: menuitem.h 49563 2007-10-31 20:46:21Z VZ $
8// Copyright:   (c) 1999 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
9// Licence:     wxWindows licence
10///////////////////////////////////////////////////////////////////////////////
11
12#ifndef _WX_MENUITEM_H_BASE_
13#define _WX_MENUITEM_H_BASE_
14
15#include "wx/defs.h"
16
17#if wxUSE_MENUS
18
19// ----------------------------------------------------------------------------
20// headers
21// ----------------------------------------------------------------------------
22
23#include "wx/object.h"  // base class
24
25// ----------------------------------------------------------------------------
26// forward declarations
27// ----------------------------------------------------------------------------
28
29class WXDLLIMPEXP_FWD_CORE wxAcceleratorEntry;
30class WXDLLIMPEXP_FWD_CORE wxMenuItem;
31class WXDLLIMPEXP_FWD_CORE wxMenu;
32
33// ----------------------------------------------------------------------------
34// wxMenuItem is an item in the menu which may be either a normal item, a sub
35// menu or a separator
36// ----------------------------------------------------------------------------
37
38class WXDLLEXPORT wxMenuItemBase : public wxObject
39{
40public:
41    // creation
42    static wxMenuItem *New(wxMenu *parentMenu = (wxMenu *)NULL,
43                           int itemid = wxID_SEPARATOR,
44                           const wxString& text = wxEmptyString,
45                           const wxString& help = wxEmptyString,
46                           wxItemKind kind = wxITEM_NORMAL,
47                           wxMenu *subMenu = (wxMenu *)NULL);
48
49    // destruction: wxMenuItem will delete its submenu
50    virtual ~wxMenuItemBase();
51
52    // the menu we're in
53    wxMenu *GetMenu() const { return m_parentMenu; }
54    void SetMenu(wxMenu* menu) { m_parentMenu = menu; }
55
56    // get/set id
57    void SetId(int itemid) { m_id = itemid; }
58    int  GetId() const { return m_id; }
59    bool IsSeparator() const { return m_id == wxID_SEPARATOR; }
60
61    // the item's text (or name)
62    //
63    // NB: the item's text includes the accelerators and mnemonics info (if
64    //     any), i.e. it may contain '&' or '_' or "\t..." and thus is
65    //     different from the item's label which only contains the text shown
66    //     in the menu
67    virtual void SetText(const wxString& str);
68
69    wxString GetLabel() const { return GetLabelFromText(m_text); }
70    const wxString& GetText() const { return m_text; }
71
72    // get the label from text (implemented in platform-specific code)
73    static wxString GetLabelFromText(const wxString& text);
74
75    // what kind of menu item we are
76    wxItemKind GetKind() const { return m_kind; }
77    void SetKind(wxItemKind kind) { m_kind = kind; }
78
79    virtual void SetCheckable(bool checkable) { m_kind = checkable ? wxITEM_CHECK : wxITEM_NORMAL; }
80    bool IsCheckable() const
81        { return m_kind == wxITEM_CHECK || m_kind == wxITEM_RADIO; }
82
83    bool IsSubMenu() const { return m_subMenu != NULL; }
84    void SetSubMenu(wxMenu *menu) { m_subMenu = menu; }
85    wxMenu *GetSubMenu() const { return m_subMenu; }
86
87    // state
88    virtual void Enable(bool enable = true) { m_isEnabled = enable; }
89    virtual bool IsEnabled() const { return m_isEnabled; }
90
91    virtual void Check(bool check = true) { m_isChecked = check; }
92    virtual bool IsChecked() const { return m_isChecked; }
93    void Toggle() { Check(!m_isChecked); }
94
95    // help string (displayed in the status bar by default)
96    void SetHelp(const wxString& str);
97    const wxString& GetHelp() const { return m_help; }
98
99#if wxUSE_ACCEL
100    // extract the accelerator from the given menu string, return NULL if none
101    // found
102    static wxAcceleratorEntry *GetAccelFromString(const wxString& label);
103
104    // get our accelerator or NULL (caller must delete the pointer)
105    virtual wxAcceleratorEntry *GetAccel() const;
106
107    // set the accel for this item - this may also be done indirectly with
108    // SetText()
109    virtual void SetAccel(wxAcceleratorEntry *accel);
110#endif // wxUSE_ACCEL
111
112    // compatibility only, use new functions in the new code
113    void SetName(const wxString& str) { SetText(str); }
114    const wxString& GetName() const { return GetText(); }
115
116    static wxMenuItem *New(wxMenu *parentMenu,
117                           int itemid,
118                           const wxString& text,
119                           const wxString& help,
120                           bool isCheckable,
121                           wxMenu *subMenu = (wxMenu *)NULL)
122    {
123        return New(parentMenu, itemid, text, help,
124                   isCheckable ? wxITEM_CHECK : wxITEM_NORMAL, subMenu);
125    }
126
127protected:
128    int           m_id;             // numeric id of the item >= 0 or wxID_ANY or wxID_SEPARATOR
129    wxMenu       *m_parentMenu,     // the menu we belong to
130                 *m_subMenu;        // our sub menu or NULL
131    wxString      m_text,           // label of the item
132                  m_help;           // the help string for the item
133    wxItemKind    m_kind;           // separator/normal/check/radio item?
134    bool          m_isChecked;      // is checked?
135    bool          m_isEnabled;      // is enabled?
136
137    // this ctor is for the derived classes only, we're never created directly
138    wxMenuItemBase(wxMenu *parentMenu = (wxMenu *)NULL,
139                   int itemid = wxID_SEPARATOR,
140                   const wxString& text = wxEmptyString,
141                   const wxString& help = wxEmptyString,
142                   wxItemKind kind = wxITEM_NORMAL,
143                   wxMenu *subMenu = (wxMenu *)NULL);
144
145private:
146    // and, if we have one ctor, compiler won't generate a default copy one, so
147    // declare them ourselves - but don't implement as they shouldn't be used
148    wxMenuItemBase(const wxMenuItemBase& item);
149    wxMenuItemBase& operator=(const wxMenuItemBase& item);
150
151public:
152
153#if wxABI_VERSION >= 20805
154    // Sets the label. This function replaces SetText.
155    void SetItemLabel(const wxString& str) { SetText(str); }
156
157    // return the item label including any mnemonics and accelerators.
158    // This used to be called GetText.
159    // We can't implement this in the base class (no new virtuals in stable branch)
160    // wxString GetItemLabel() const;
161
162    // return just the text of the item label, without any mnemonics
163    // This used to be called GetLabel.
164    wxString GetItemLabelText() const { return GetLabelText(m_text); }
165
166    // return just the text part of the given label. In 2.9 and up, this is implemented in
167    // platform-specific code, but is now implemented in terms of GetLabelFromText.
168    static wxString GetLabelText(const wxString& label);
169#endif
170};
171
172// ----------------------------------------------------------------------------
173// include the real class declaration
174// ----------------------------------------------------------------------------
175
176#ifdef wxUSE_BASE_CLASSES_ONLY
177    #define wxMenuItem wxMenuItemBase
178#else // !wxUSE_BASE_CLASSES_ONLY
179#if defined(__WXUNIVERSAL__)
180    #include "wx/univ/menuitem.h"
181#elif defined(__WXPALMOS__)
182    #include "wx/palmos/menuitem.h"
183#elif defined(__WXMSW__)
184    #include "wx/msw/menuitem.h"
185#elif defined(__WXMOTIF__)
186    #include "wx/motif/menuitem.h"
187#elif defined(__WXGTK20__)
188    #include "wx/gtk/menuitem.h"
189#elif defined(__WXGTK__)
190    #include "wx/gtk1/menuitem.h"
191#elif defined(__WXMAC__)
192    #include "wx/mac/menuitem.h"
193#elif defined(__WXCOCOA__)
194    #include "wx/cocoa/menuitem.h"
195#elif defined(__WXPM__)
196    #include "wx/os2/menuitem.h"
197#endif
198#endif // wxUSE_BASE_CLASSES_ONLY/!wxUSE_BASE_CLASSES_ONLY
199
200#endif // wxUSE_MENUS
201
202#endif
203    // _WX_MENUITEM_H_BASE_
204