]>
Commit | Line | Data |
---|---|---|
fb896a32 DE |
1 | /////////////////////////////////////////////////////////////////////////////// |
2 | // Name: wx/cocoa/menu.h | |
3 | // Purpose: wxMenu and wxMenuBar classes | |
4 | // Author: David Elliott | |
5 | // Modified by: | |
6 | // Created: 2002/12/09 | |
7 | // RCS-ID: $Id: | |
8 | // Copyright: (c) 2002 David Elliott | |
9 | // Licence: wxWindows licence | |
10 | /////////////////////////////////////////////////////////////////////////////// | |
11 | ||
12 | #ifndef __WX_COCOA_MENU_H__ | |
13 | #define __WX_COCOA_MENU_H__ | |
14 | ||
15 | #include "wx/cocoa/NSMenu.h" | |
16 | ||
17 | #if wxUSE_ACCEL | |
18 | #include "wx/accel.h" | |
19 | #endif // wxUSE_ACCEL | |
20 | ||
21 | // ======================================================================== | |
22 | // wxMenu | |
23 | // ======================================================================== | |
24 | ||
25 | class WXDLLEXPORT wxMenu : public wxMenuBase, public wxCocoaNSMenu | |
26 | { | |
27 | public: | |
28 | // ctors and dtor | |
29 | wxMenu(const wxString& title, long style = 0) | |
30 | : wxMenuBase(title, style) { Create(title,style); } | |
31 | bool Create(const wxString& title, long style = 0); | |
32 | ||
33 | wxMenu(long style = 0) : wxMenuBase(style) { Create(wxEmptyString, style); } | |
34 | ||
35 | virtual ~wxMenu(); | |
36 | ||
605c7e7e DE |
37 | // ------------------------------------------------------------------------ |
38 | // Cocoa specifics | |
39 | // ------------------------------------------------------------------------ | |
40 | public: | |
41 | inline WX_NSMenu GetNSMenu() { return m_cocoaNSMenu; } | |
42 | protected: | |
43 | WX_NSMenu m_cocoaNSMenu; | |
44 | // ------------------------------------------------------------------------ | |
45 | // Implementation | |
46 | // ------------------------------------------------------------------------ | |
fb896a32 DE |
47 | protected: |
48 | // implement base class virtuals | |
fe4a107d RD |
49 | virtual wxMenuItem* DoAppend(wxMenuItem *item); |
50 | virtual wxMenuItem* DoInsert(size_t pos, wxMenuItem *item); | |
51 | virtual wxMenuItem* DoRemove(wxMenuItem *item); | |
fb896a32 DE |
52 | |
53 | #if wxUSE_ACCEL | |
54 | // add/remove accel for the given menu item | |
55 | void AddAccelFor(wxMenuItem *item); | |
56 | void RemoveAccelFor(wxMenuItem *item); | |
57 | #endif // wxUSE_ACCEL | |
58 | ||
59 | private: | |
60 | #if wxUSE_ACCEL | |
61 | // the accel table for this menu | |
62 | wxAcceleratorTable m_accelTable; | |
63 | #endif // wxUSE_ACCEL | |
64 | ||
65 | DECLARE_DYNAMIC_CLASS(wxMenu) | |
66 | }; | |
67 | ||
68 | // ======================================================================== | |
69 | // wxMenuBar | |
70 | // ======================================================================== | |
71 | class WXDLLEXPORT wxMenuBar : public wxMenuBarBase, public wxCocoaNSMenu | |
72 | { | |
73 | public: | |
74 | // ctors and dtor | |
75 | wxMenuBar(long style = 0) { Create(style); } | |
76 | bool Create(long style = 0); | |
77 | virtual ~wxMenuBar(); | |
78 | ||
605c7e7e DE |
79 | // ------------------------------------------------------------------------ |
80 | // Cocoa specifics | |
81 | // ------------------------------------------------------------------------ | |
82 | public: | |
83 | inline WX_NSMenu GetNSMenu() { return m_cocoaNSMenu; } | |
84 | protected: | |
85 | WX_NSMenu m_cocoaNSMenu; | |
86 | // ------------------------------------------------------------------------ | |
87 | // Implementation | |
88 | // ------------------------------------------------------------------------ | |
89 | public: | |
fb896a32 DE |
90 | // implement base class virtuals |
91 | virtual bool Append(wxMenu *menu, const wxString &title); | |
92 | virtual bool Insert(size_t pos, wxMenu *menu, const wxString& title); | |
93 | virtual wxMenu *Replace(size_t pos, wxMenu *menu, const wxString& title); | |
94 | virtual wxMenu *Remove(size_t pos); | |
95 | ||
96 | virtual void EnableTop(size_t pos, bool enable); | |
97 | virtual bool IsEnabledTop(size_t pos) const; | |
98 | ||
99 | virtual void SetLabelTop(size_t pos, const wxString& label); | |
100 | virtual wxString GetLabelTop(size_t pos) const; | |
101 | ||
102 | virtual void Attach(wxFrame *frame); | |
103 | virtual void Detach(); | |
104 | ||
105 | // get the next item for the givan accel letter (used by wxFrame), return | |
106 | // -1 if none | |
107 | // | |
108 | // if unique is not NULL, filled with TRUE if there is only one item with | |
109 | // this accel, FALSE if two or more | |
110 | int FindNextItemForAccel(int idxStart, | |
111 | int keycode, | |
112 | bool *unique = NULL) const; | |
113 | ||
114 | // called by wxFrame to set focus to or open the given menu | |
115 | void SelectMenu(size_t pos); | |
116 | ||
117 | #if wxUSE_ACCEL | |
118 | // find the item for the given accel and generate an event if found | |
119 | bool ProcessAccelEvent(const wxKeyEvent& event); | |
120 | #endif // wxUSE_ACCEL | |
121 | ||
122 | protected: | |
123 | // event handlers | |
124 | void OnLeftDown(wxMouseEvent& event); | |
125 | void OnMouseMove(wxMouseEvent& event); | |
126 | void OnKeyDown(wxKeyEvent& event); | |
127 | void OnKillFocus(wxFocusEvent& event); | |
128 | ||
129 | // process the mouse move event, return TRUE if we did, FALSE to continue | |
130 | // processing as usual | |
131 | // | |
132 | // the coordinates are client coordinates of menubar, convert if necessary | |
133 | bool ProcessMouseEvent(const wxPoint& pt); | |
134 | ||
135 | // menubar geometry | |
136 | virtual wxSize DoGetBestClientSize() const; | |
137 | ||
138 | // has the menubar been created already? | |
139 | bool IsCreated() const { return m_frameLast != NULL; } | |
140 | ||
141 | // get the (total) width of the specified menu | |
142 | wxCoord GetItemWidth(size_t pos) const; | |
143 | ||
144 | // get the rect of the item | |
145 | wxRect GetItemRect(size_t pos) const; | |
146 | ||
147 | // get the menu from the given point or -1 if none | |
148 | int GetMenuFromPoint(const wxPoint& pos) const; | |
149 | ||
150 | // refresh the given item | |
151 | void RefreshItem(size_t pos); | |
152 | ||
153 | // refresh all items after this one (including it) | |
154 | void RefreshAllItemsAfter(size_t pos); | |
155 | ||
156 | // do we show a menu currently? | |
157 | bool IsShowingMenu() const { return m_menuShown != 0; } | |
158 | ||
159 | // we don't want to have focus except while selecting from menu | |
160 | void GiveAwayFocus(); | |
161 | ||
162 | // the current item (only used when menubar has focus) | |
163 | int m_current; | |
164 | ||
165 | private: | |
166 | // the last frame to which we were attached, NULL initially | |
167 | wxFrame *m_frameLast; | |
168 | ||
169 | // the currently shown menu or NULL | |
170 | wxMenu *m_menuShown; | |
171 | ||
172 | // should be showing the menu? this is subtly different from m_menuShown != | |
173 | // NULL as the menu which should be shown may be disabled in which case we | |
174 | // don't show it - but will do as soon as the focus shifts to another menu | |
175 | bool m_shouldShowMenu; | |
176 | ||
177 | DECLARE_DYNAMIC_CLASS(wxMenuBar) | |
178 | }; | |
179 | ||
180 | #endif // _WX_COCOA_MENU_H_ |