]>
Commit | Line | Data |
---|---|---|
0e320a79 DW |
1 | /////////////////////////////////////////////////////////////////////////////// |
2 | // Name: menuitem.cpp | |
3 | // Purpose: wxMenuItem implementation | |
75f11ad7 DW |
4 | // Author: David Webster |
5 | // Modified by: | |
6 | // Created: 10/10/98 | |
0e320a79 | 7 | // RCS-ID: $Id$ |
75f11ad7 | 8 | // Copyright: (c) David Webster |
0e320a79 DW |
9 | // Licence: wxWindows licence |
10 | /////////////////////////////////////////////////////////////////////////////// | |
11 | ||
12 | // ============================================================================ | |
13 | // headers & declarations | |
14 | // ============================================================================ | |
15 | ||
75f11ad7 DW |
16 | // For compilers that support precompilation, includes "wx.h". |
17 | #include "wx/wxprec.h" | |
18 | ||
19 | #ifndef WX_PRECOMP | |
20 | #include "wx/font.h" | |
21 | #include "wx/bitmap.h" | |
22 | #include "wx/settings.h" | |
23 | #include "wx/font.h" | |
24 | #include "wx/window.h" | |
25 | #include "wx/accel.h" | |
26 | #include "wx/menu.h" | |
27 | #include "wx/string.h" | |
28 | #endif | |
29 | ||
30 | #include "wx/ownerdrw.h" | |
0e320a79 | 31 | #include "wx/menuitem.h" |
75f11ad7 DW |
32 | #include "wx/log.h" |
33 | ||
34 | #include "wx/os2/private.h" | |
35 | ||
36 | // --------------------------------------------------------------------------- | |
37 | // convenience macro | |
38 | // --------------------------------------------------------------------------- | |
39 | ||
40 | #define GetHMenuOf(menu) ((HMENU)menu->GetHMenu()) | |
0e320a79 DW |
41 | |
42 | // ============================================================================ | |
43 | // implementation | |
44 | // ============================================================================ | |
45 | ||
46 | // ---------------------------------------------------------------------------- | |
47 | // dynamic classes implementation | |
48 | // ---------------------------------------------------------------------------- | |
49 | ||
75f11ad7 DW |
50 | #if !defined(USE_SHARED_LIBRARY) || !USE_SHARED_LIBRARY |
51 | #if wxUSE_OWNER_DRAWN | |
52 | IMPLEMENT_DYNAMIC_CLASS2(wxMenuItem, wxObject, wxOwnerDrawn) | |
53 | #else //!USE_OWNER_DRAWN | |
0e320a79 | 54 | IMPLEMENT_DYNAMIC_CLASS(wxMenuItem, wxObject) |
75f11ad7 DW |
55 | #endif //USE_OWNER_DRAWN |
56 | ||
0e320a79 DW |
57 | #endif //USE_SHARED_LIBRARY |
58 | ||
59 | // ---------------------------------------------------------------------------- | |
60 | // wxMenuItem | |
61 | // ---------------------------------------------------------------------------- | |
62 | ||
63 | // ctor & dtor | |
64 | // ----------- | |
65 | ||
66 | wxMenuItem::wxMenuItem(wxMenu *pParentMenu, int id, | |
67 | const wxString& strName, const wxString& strHelp, | |
68 | bool bCheckable, | |
69 | wxMenu *pSubMenu) : | |
75f11ad7 DW |
70 | #if wxUSE_OWNER_DRAWN |
71 | wxOwnerDrawn(strName, bCheckable), | |
72 | #else //no owner drawn support | |
0e320a79 DW |
73 | m_bCheckable(bCheckable), |
74 | m_strName(strName), | |
75f11ad7 | 75 | #endif //owner drawn |
0e320a79 DW |
76 | m_strHelp(strHelp) |
77 | { | |
75f11ad7 DW |
78 | wxASSERT_MSG( pParentMenu != NULL, wxT("a menu item should have a parent") ); |
79 | ||
80 | #if wxUSE_OWNER_DRAWN | |
81 | // set default menu colors | |
82 | #define SYS_COLOR(c) (wxSystemSettings::GetSystemColour(wxSYS_COLOUR_##c)) | |
83 | ||
84 | SetTextColour(SYS_COLOR(MENUTEXT)); | |
85 | SetBackgroundColour(SYS_COLOR(MENU)); | |
86 | ||
87 | // we don't want normal items be owner-drawn | |
88 | ResetOwnerDrawn(); | |
89 | ||
90 | #undef SYS_COLOR | |
91 | #endif | |
0e320a79 | 92 | |
75f11ad7 DW |
93 | m_pParentMenu = pParentMenu; |
94 | m_pSubMenu = pSubMenu; | |
95 | m_bEnabled = TRUE; | |
96 | m_bChecked = FALSE; | |
97 | m_idItem = id; | |
0e320a79 DW |
98 | } |
99 | ||
75f11ad7 | 100 | wxMenuItem::~wxMenuItem() |
0e320a79 DW |
101 | { |
102 | } | |
103 | ||
104 | // misc | |
105 | // ---- | |
106 | ||
75f11ad7 DW |
107 | // return the id for calling Win32 API functions |
108 | int wxMenuItem::GetRealId() const | |
109 | { | |
110 | return m_pSubMenu ? (int)m_pSubMenu->GetHMenu() : GetId(); | |
111 | } | |
112 | ||
0e320a79 | 113 | // delete the sub menu |
75f11ad7 | 114 | // ------------------- |
0e320a79 DW |
115 | void wxMenuItem::DeleteSubMenu() |
116 | { | |
75f11ad7 DW |
117 | delete m_pSubMenu; |
118 | m_pSubMenu = NULL; | |
0e320a79 DW |
119 | } |
120 | ||
121 | // change item state | |
122 | // ----------------- | |
123 | ||
124 | void wxMenuItem::Enable(bool bDoEnable) | |
125 | { | |
75f11ad7 DW |
126 | // TODO: |
127 | /* | |
128 | if ( m_bEnabled != bDoEnable ) { | |
129 | long rc = EnableMenuItem(GetHMenuOf(m_pParentMenu), | |
130 | GetRealId(), | |
131 | MF_BYCOMMAND | | |
132 | (bDoEnable ? MF_ENABLED : MF_GRAYED)); | |
133 | ||
134 | if ( rc == -1 ) { | |
135 | wxLogLastError("EnableMenuItem"); | |
136 | } | |
137 | ||
138 | m_bEnabled = bDoEnable; | |
0e320a79 | 139 | } |
75f11ad7 | 140 | */ |
0e320a79 DW |
141 | } |
142 | ||
143 | void wxMenuItem::Check(bool bDoCheck) | |
144 | { | |
75f11ad7 DW |
145 | wxCHECK_RET( IsCheckable(), wxT("only checkable items may be checked") ); |
146 | ||
147 | // TODO: | |
148 | /* | |
149 | if ( m_bChecked != bDoCheck ) { | |
150 | long rc = CheckMenuItem(GetHMenuOf(m_pParentMenu), | |
151 | GetId(), | |
152 | MF_BYCOMMAND | | |
153 | (bDoCheck ? MF_CHECKED : MF_UNCHECKED)); | |
154 | ||
155 | if ( rc == -1 ) { | |
156 | wxLogLastError("CheckMenuItem"); | |
157 | } | |
158 | ||
159 | m_bChecked = bDoCheck; | |
160 | } | |
161 | */ | |
162 | } | |
163 | ||
164 | void wxMenuItem::SetName(const wxString& strName) | |
165 | { | |
166 | // don't do anything if label didn't change | |
167 | if ( m_strName == strName ) | |
168 | return; | |
169 | ||
170 | m_strName = strName; | |
171 | ||
172 | HMENU hMenu = GetHMenuOf(m_pParentMenu); | |
173 | ||
174 | UINT id = GetRealId(); | |
175 | ||
176 | // TODO: | |
177 | /* | |
178 | UINT flagsOld = ::GetMenuState(hMenu, id, MF_BYCOMMAND); | |
179 | if ( flagsOld == 0xFFFFFFFF ) | |
180 | { | |
181 | wxLogLastError("GetMenuState"); | |
182 | } | |
183 | else | |
184 | { | |
185 | if ( IsSubMenu() ) | |
186 | { | |
187 | // high byte contains the number of items in a submenu for submenus | |
188 | flagsOld &= 0xFF; | |
189 | flagsOld |= MF_POPUP; | |
190 | } | |
191 | ||
192 | LPCTSTR data; | |
193 | #if wxUSE_OWNER_DRAWN | |
194 | if ( IsOwnerDrawn() ) | |
195 | { | |
196 | flagsOld |= MF_OWNERDRAW; | |
197 | data = (LPCTSTR)this; | |
198 | } | |
199 | else | |
200 | #endif //owner drawn | |
201 | { | |
202 | flagsOld |= MF_STRING; | |
203 | data = strName; | |
204 | } | |
205 | ||
206 | if ( ::ModifyMenu(hMenu, id, | |
207 | MF_BYCOMMAND | flagsOld, | |
208 | id, data) == 0xFFFFFFFF ) | |
209 | { | |
210 | wxLogLastError(wxT("ModifyMenu")); | |
211 | } | |
212 | } | |
213 | */ | |
214 | } | |
0e320a79 | 215 |