1/*
2 * Copyright 2001-2009, Haiku, Inc.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *		Stefano Ceccherini (stefano.ceccherini@gmail.com)
7 */
8
9#include <MenuPrivate.h>
10
11#include <Bitmap.h>
12#include <Menu.h>
13
14
15const unsigned char kShiftBits[] = {
16	0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x14,
17	0x1d,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14,
18	0x1d,0x1a,0x1a,0x17,0x04,0x04,0x17,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14,
19	0x1d,0x1a,0x1a,0x04,0x17,0x17,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x04,0x04,0x04,0x1a,0x04,0x04,0x04,0x1a,0x17,0x14,
20	0x1d,0x1a,0x1a,0x17,0x04,0x04,0x1a,0x1a,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x1a,0x1a,0x1a,0x04,0x1a,0x1a,0x17,0x14,
21	0x1d,0x1a,0x1a,0x1a,0x1a,0x1a,0x04,0x1a,0x04,0x04,0x04,0x1a,0x04,0x1a,0x04,0x04,0x1a,0x1a,0x1a,0x04,0x1a,0x1a,0x17,0x14,
22	0x1d,0x1a,0x1a,0x04,0x17,0x17,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x1a,0x1a,0x1a,0x04,0x1a,0x1a,0x17,0x14,
23	0x1d,0x1a,0x1a,0x17,0x04,0x04,0x17,0x1a,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x1a,0x1a,0x1a,0x04,0x1a,0x1a,0x17,0x14,
24	0x1d,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14,
25	0x1d,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x14,
26	0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14
27};
28
29
30const unsigned char kCtrlBits[] = {
31	0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x14,
32	0x1d,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14,
33	0x1d,0x1a,0x1a,0x13,0x04,0x04,0x13,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14,
34	0x1d,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x04,0x04,0x04,0x1a,0x04,0x04,0x04,0x1a,0x04,0x1a,0x1a,0x1a,0x17,0x14,
35	0x1d,0x1a,0x1a,0x04,0x1a,0x1a,0x1a,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x1a,0x1a,0x17,0x14,
36	0x1d,0x1a,0x1a,0x04,0x1a,0x1a,0x1a,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x04,0x04,0x1a,0x04,0x1a,0x1a,0x1a,0x17,0x14,
37	0x1d,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x04,0x1a,0x1a,0x04,0x1a,0x1a,0x1a,0x17,0x14,
38	0x1d,0x1a,0x1a,0x13,0x04,0x04,0x13,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x13,0x04,0x1a,0x04,0x04,0x04,0x1a,0x17,0x14,
39	0x1d,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14,
40	0x1d,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x14,
41	0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14
42};
43
44
45const unsigned char kOptBits[] = {
46	0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x14,
47	0x1d,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14,
48	0x1d,0x1a,0x1a,0x13,0x04,0x04,0x13,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14,
49	0x1d,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x04,0x04,0x1a,0x04,0x04,0x04,0x1a,0x17,0x14,
50	0x1d,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x1a,0x17,0x14,
51	0x1d,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x04,0x04,0x1a,0x1a,0x04,0x1a,0x1a,0x17,0x14,
52	0x1d,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x04,0x1a,0x1a,0x1a,0x04,0x1a,0x1a,0x17,0x14,
53	0x1d,0x1a,0x1a,0x13,0x04,0x04,0x13,0x1a,0x04,0x1a,0x1a,0x1a,0x04,0x1a,0x1a,0x17,0x14,
54	0x1d,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14,
55	0x1d,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x14,
56	0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14
57};
58
59
60const unsigned char kAltBits[] = {
61	0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x14,
62	0x1d,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14,
63	0x1d,0x1a,0x1a,0x13,0x04,0x04,0x13,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14,
64	0x1d,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x04,0x1a,0x1a,0x04,0x04,0x04,0x1a,0x17,0x14,
65	0x1d,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x04,0x1a,0x1a,0x1a,0x04,0x1a,0x1a,0x17,0x14,
66	0x1d,0x1a,0x1a,0x04,0x04,0x04,0x04,0x1a,0x04,0x1a,0x1a,0x1a,0x04,0x1a,0x1a,0x17,0x14,
67	0x1d,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x04,0x1a,0x1a,0x1a,0x04,0x1a,0x1a,0x17,0x14,
68	0x1d,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x04,0x04,0x04,0x1a,0x04,0x1a,0x1a,0x17,0x14,
69	0x1d,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14,
70	0x1d,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x14,
71	0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14
72};
73
74
75const unsigned char kMenuBits[] = {
76	0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x14,
77	0x1d,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14,
78	0x1d,0x1a,0x1a,0x04,0x04,0x1a,0x04,0x04,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14,
79	0x1d,0x1a,0x1a,0x04,0x04,0x04,0x04,0x04,0x1a,0x04,0x04,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x17,0x14,
80	0x1d,0x1a,0x1a,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x1a,0x04,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x17,0x14,
81	0x1d,0x1a,0x1a,0x04,0x1a,0x1a,0x1a,0x04,0x1a,0x04,0x04,0x1a,0x04,0x04,0x04,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x17,0x14,
82	0x1d,0x1a,0x1a,0x04,0x1a,0x1a,0x1a,0x04,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x04,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x17,0x14,
83	0x1d,0x1a,0x1a,0x04,0x1a,0x1a,0x1a,0x04,0x1a,0x04,0x04,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x04,0x04,0x04,0x1a,0x17,0x14,
84	0x1d,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14,
85	0x1d,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x14,
86	0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14
87};
88
89
90namespace BPrivate {
91
92
93BBitmap* MenuPrivate::sMenuItemShift;
94BBitmap* MenuPrivate::sMenuItemControl;
95BBitmap* MenuPrivate::sMenuItemOption;
96BBitmap* MenuPrivate::sMenuItemAlt;
97BBitmap* MenuPrivate::sMenuItemMenu;
98
99
100MenuPrivate::MenuPrivate(BMenu* menu)
101	:
102	fMenu(menu)
103{
104}
105
106
107menu_layout
108MenuPrivate::Layout() const
109{
110	return fMenu->Layout();
111}
112
113
114void
115MenuPrivate::SetLayout(menu_layout layout)
116{
117	fMenu->fLayout = layout;
118}
119
120
121void
122MenuPrivate::ItemMarked(BMenuItem* item)
123{
124	fMenu->_ItemMarked(item);
125}
126
127
128void
129MenuPrivate::CacheFontInfo()
130{
131	fMenu->_CacheFontInfo();
132}
133
134
135float
136MenuPrivate::FontHeight() const
137{
138	return fMenu->fFontHeight;
139}
140
141
142float
143MenuPrivate::Ascent() const
144{
145	return fMenu->fAscent;
146}
147
148
149BRect
150MenuPrivate::Padding() const
151{
152	return fMenu->fPad;
153}
154
155
156void
157MenuPrivate::GetItemMargins(float* left, float* top, float* right,
158	float* bottom) const
159{
160	fMenu->GetItemMargins(left, top, right, bottom);
161}
162
163
164void
165MenuPrivate::SetItemMargins(float left, float top, float right, float bottom)
166{
167	fMenu->SetItemMargins(left, top, right, bottom);
168}
169
170
171int
172MenuPrivate::State(BMenuItem** item) const
173{
174	return fMenu->_State(item);
175}
176
177
178void
179MenuPrivate::Install(BWindow* window)
180{
181	fMenu->_Install(window);
182}
183
184
185void
186MenuPrivate::Uninstall()
187{
188	fMenu->_Uninstall();
189}
190
191
192void
193MenuPrivate::SetSuper(BMenu* menu)
194{
195	fMenu->fSuper = menu;
196}
197
198
199void
200MenuPrivate::SetSuperItem(BMenuItem* item)
201{
202	fMenu->fSuperitem = item;
203}
204
205
206void
207MenuPrivate::InvokeItem(BMenuItem* item, bool now)
208{
209	fMenu->_InvokeItem(item, now);
210}
211
212
213void
214MenuPrivate::QuitTracking(bool thisMenuOnly)
215{
216	fMenu->_QuitTracking(thisMenuOnly);
217}
218
219
220/* static */
221status_t
222MenuPrivate::CreateBitmaps()
223{
224	BRect smallRect(0.0f, 0.0f, 16.0f, 10.0f);
225
226	try {
227		sMenuItemShift = new BBitmap(BRect(0.0f, 0.0f, 23.0f, 10.0f), B_CMAP8);
228		sMenuItemControl = new BBitmap(BRect(0.0f, 0.0f, 21.0f, 10.0f),
229			B_CMAP8);
230		sMenuItemOption = new BBitmap(smallRect, B_CMAP8);
231		sMenuItemAlt = new BBitmap(smallRect, B_CMAP8);
232		sMenuItemMenu = new BBitmap(BRect(0.0f, 0.0f, 22.0f, 10.0f), B_CMAP8);
233	} catch (...) {
234		return B_NO_MEMORY;
235	}
236
237	sMenuItemShift->ImportBits(kShiftBits, sizeof(kShiftBits),
238		24, 0, B_CMAP8);
239	sMenuItemControl->ImportBits(kCtrlBits, sizeof(kCtrlBits),
240		22, 0, B_CMAP8);
241	sMenuItemOption->ImportBits(kOptBits, sizeof(kOptBits),
242		17, 0, B_CMAP8);
243	sMenuItemAlt->ImportBits(kAltBits, sizeof(kAltBits),
244		17, 0, B_CMAP8);
245	sMenuItemMenu->ImportBits(kMenuBits, sizeof(kMenuBits),
246		23, 0, B_CMAP8);
247
248	return B_OK;
249}
250
251
252/* static */
253void
254MenuPrivate::DeleteBitmaps()
255{
256	delete sMenuItemShift;
257	delete sMenuItemControl;
258	delete sMenuItemOption;
259	delete sMenuItemAlt;
260	delete sMenuItemMenu;
261}
262
263
264/* static */
265const BBitmap*
266MenuPrivate::MenuItemShift()
267{
268	return sMenuItemShift;
269}
270
271
272/* static */
273const BBitmap*
274MenuPrivate::MenuItemControl()
275{
276	switch (BMenu::sControlKey) {
277		case 0x5d:
278		case 0x5f:
279			return sMenuItemAlt;
280
281		case 0x66:
282		case 0x67:
283			return sMenuItemOption;
284	}
285
286	return sMenuItemControl;
287}
288
289
290/* static */
291const BBitmap*
292MenuPrivate::MenuItemOption()
293{
294	switch (BMenu::sOptionKey) {
295		case 0x5c:
296		case 0x60:
297			return sMenuItemControl;
298
299		case 0x66:
300		case 0x67:
301			return sMenuItemOption;
302	}
303
304	return sMenuItemAlt;
305}
306
307
308/* static */
309const BBitmap*
310MenuPrivate::MenuItemCommand()
311{
312	switch (BMenu::sCommandKey) {
313		case 0x5c:
314		case 0x60:
315			return sMenuItemControl;
316
317		case 0x66:
318		case 0x67:
319			return sMenuItemOption;
320	}
321
322	return sMenuItemAlt;
323}
324
325
326/* static */
327const BBitmap*
328MenuPrivate::MenuItemMenu()
329{
330	return sMenuItemMenu;
331}
332
333
334}	// namespace BPrivate
335