:pserver:cvsanon@mok.lvcm.com:/CVS/ReactOS reactos
[reactos.git] / lib / user32 / windows / menu.c
1 /*
2  *  ReactOS kernel
3  *  Copyright (C) 1998, 1999, 2000, 2001 ReactOS Team
4  *
5  *  This program is free software; you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License as published by
7  *  the Free Software Foundation; either version 2 of the License, or
8  *  (at your option) any later version.
9  *
10  *  This program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  *  GNU General Public License for more details.
14  *
15  *  You should have received a copy of the GNU General Public License
16  *  along with this program; if not, write to the Free Software
17  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18  */
19 /* $Id$
20  *
21  * PROJECT:         ReactOS user32.dll
22  * FILE:            lib/user32/windows/menu.c
23  * PURPOSE:         Menus
24  * PROGRAMMER:      Casper S. Hornstrup (chorns@users.sourceforge.net)
25  * UPDATE HISTORY:
26  *      09-05-2001  CSH  Created
27  */
28
29 /* INCLUDES ******************************************************************/
30
31 #include <windows.h>
32 #include <user32.h>
33 #include <debug.h>
34
35 /* TYPES *********************************************************************/
36
37 typedef struct _MENUITEM
38 {
39   UINT Type;
40   UINT State;
41   UINT Id;
42   HMENU SubMenu;
43   HBITMAP CheckBit;
44   HBITMAP UnCheckBit;
45   LPWSTR Text;
46   DWORD ItemData;
47   DWORD TypeData;
48   HBITMAP BmpItem;
49   RECT Rect;
50   UINT XTab;
51 } MENUITEM, *PMENUITEM;
52
53 typedef struct _POPUP_MENU 
54 {
55   MENUITEM* Items;
56   WORD NrItems;
57 } POPUP_MENU, *PPOPUP_MENU;
58
59 /* FUNCTIONS *****************************************************************/
60
61 static PPOPUP_MENU
62 MenuGetMenu(HMENU hMenu)
63 {
64   PPOPUP_MENU Menu;
65   Menu = (PPOPUP_MENU)hMenu;
66   return(Menu);
67 }
68
69 static MENUITEM*
70 MenuFindItem(HMENU* hMenu, UINT* nPos, UINT wFlags)
71 {
72   POPUP_MENU* Menu;
73   ULONG i;
74
75   if ((ULONG)(*hMenu) == 0xFFFF || (Menu = MenuGetMenu(*hMenu)) == NULL)
76     {
77       return(NULL);
78     }
79   if (wFlags & MF_BYPOSITION)
80     {
81       if ((*nPos) >= Menu->NrItems)
82         {
83           return(NULL);
84         }
85       return(&Menu->Items[*nPos]);
86     }
87   else
88     {
89       MENUITEM* Item = Menu->Items;
90       for (i = 0; i < Menu->NrItems; i++)
91         {
92           if (Item->Id == (*nPos))
93             {
94               *nPos = i;
95               return(Item);
96             }
97           else if (Item->Type & MF_POPUP)
98             {
99               HMENU SubMenu = Item->SubMenu;
100               MENUITEM* SubItem = MenuFindItem(&SubMenu, nPos, wFlags);
101               if (SubItem)
102                 {
103                   *hMenu = SubMenu;
104                   return(SubItem);
105                 }
106             }
107         }
108     }
109   return(NULL);
110 }
111
112 WINBOOL STDCALL
113 AppendMenuA(HMENU hMenu,
114             UINT uFlags,
115             UINT_PTR uIDNewItem,
116             LPCSTR lpNewItem)
117 {
118   DPRINT("AppendMenuA(hMenu 0x%X, uFlags 0x%X, uIDNewItem %d, "
119          "lpNewItem %s\n", hMenu, uFlags, uIDNewItem, lpNewItem);
120   return(InsertMenuA(hMenu, -1, uFlags | MF_BYPOSITION, uIDNewItem, 
121                      lpNewItem));
122 }
123
124 WINBOOL STDCALL
125 AppendMenuW(HMENU hMenu,
126             UINT uFlags,
127             UINT_PTR uIDNewItem,
128             LPCWSTR lpNewItem)
129 {
130   DPRINT("AppendMenuW(hMenu 0x%X, uFlags 0x%X, uIDNewItem %d, "
131          "lpNewItem %S\n", hMenu, uFlags, uIDNewItem, lpNewItem);
132   return(InsertMenuW(hMenu, -1, uFlags | MF_BYPOSITION, uIDNewItem, 
133                      lpNewItem));
134 }
135
136 DWORD STDCALL
137 CheckMenuItem(HMENU hmenu,
138               UINT uIDCheckItem,
139               UINT uCheck)
140 {
141   MENUITEM* Item;
142   DWORD Ret;
143
144   DPRINT("CheckMenuItem(hmenu 0x%X, uIDCheckItem %d, uCheck %d",
145          hmenu, uIDCheckItem, uCheck);
146   if ((Item = MenuFindItem(&hmenu, &uIDCheckItem, uCheck)) == NULL)
147     {
148       return(-1);
149     }
150   Ret = Item->State & MF_CHECKED;
151   if (uCheck & MF_CHECKED)
152     {
153       Item->State |= MF_CHECKED;
154     }
155   else
156     {
157       Item->State &= ~MF_CHECKED;
158     }
159   return(Ret);
160 }
161
162 WINBOOL
163 STDCALL
164 CheckMenuRadioItem(
165   HMENU hmenu,
166   UINT idFirst,
167   UINT idLast,
168   UINT idCheck,
169   UINT uFlags)
170 {
171   return FALSE;
172 }
173 HMENU
174 STDCALL
175 CreateMenu(VOID)
176 {
177   return (HMENU)0;
178 }
179
180 HMENU
181 STDCALL
182 CreatePopupMenu(VOID)
183 {
184   return (HMENU)0;
185 }
186 WINBOOL
187 STDCALL
188 DeleteMenu(
189   HMENU hMenu,
190   UINT uPosition,
191   UINT uFlags)
192 {
193   return FALSE;
194 }
195 WINBOOL
196 STDCALL
197 DestroyMenu(
198   HMENU hMenu)
199 {
200   return FALSE;
201 }
202 WINBOOL
203 STDCALL
204 DrawMenuBar(
205   HWND hWnd)
206 {
207   return FALSE;
208 }
209 WINBOOL
210 STDCALL
211 EnableMenuItem(
212   HMENU hMenu,
213   UINT uIDEnableItem,
214   UINT uEnable)
215 {
216   return FALSE;
217 }
218 WINBOOL
219 STDCALL
220 EndMenu(VOID)
221 {
222   return FALSE;
223 }
224 HMENU
225 STDCALL
226 GetMenu(
227   HWND hWnd)
228 {
229   return (HMENU)0;
230 }
231
232 WINBOOL
233 STDCALL
234 GetMenuBarInfo(
235   HWND hwnd,
236   LONG idObject,
237   LONG idItem,
238   PMENUBARINFO pmbi)
239 {
240   return FALSE;
241 }
242
243 LONG
244 STDCALL
245 GetMenuCheckMarkDimensions(VOID)
246 {
247   return 0;
248 }
249
250 UINT
251 STDCALL
252 GetMenuDefaultItem(
253   HMENU hMenu,
254   UINT fByPos,
255   UINT gmdiFlags)
256 {
257   return 0;
258 }
259
260 WINBOOL
261 STDCALL
262 GetMenuInfo(
263   HMENU hmenu,
264   LPCMENUINFO lpcmi)
265 {
266   return FALSE;
267 }
268
269 int
270 STDCALL
271 GetMenuItemCount(
272   HMENU hMenu)
273 {
274   return 0;
275 }
276
277 UINT
278 STDCALL
279 GetMenuItemID(
280   HMENU hMenu,
281   int nPos)
282 {
283   return 0;
284 }
285
286 WINBOOL
287 STDCALL
288 GetMenuItemInfoA(
289   HMENU hMenu,
290   UINT uItem,
291   WINBOOL fByPosition,
292   LPMENUITEMINFO lpmii)
293 {
294   return FALSE;
295 }
296
297 WINBOOL
298 STDCALL
299 GetMenuItemInfoW(
300   HMENU hMenu,
301   UINT uItem,
302   WINBOOL fByPosition,
303   LPMENUITEMINFO lpmii)
304 {
305   return FALSE;
306 }
307
308 WINBOOL
309 STDCALL
310 GetMenuItemRect(
311   HWND hWnd,
312   HMENU hMenu,
313   UINT uItem,
314   LPRECT lprcItem)
315 {
316   return FALSE;
317 }
318
319 UINT
320 STDCALL
321 GetMenuState(
322   HMENU hMenu,
323   UINT uId,
324   UINT uFlags)
325 {
326   return 0;
327 }
328
329 int
330 STDCALL
331 GetMenuStringA(
332   HMENU hMenu,
333   UINT uIDItem,
334   LPSTR lpString,
335   int nMaxCount,
336   UINT uFlag)
337 {
338   return 0;
339 }
340
341 int
342 STDCALL
343 GetMenuStringW(
344   HMENU hMenu,
345   UINT uIDItem,
346   LPWSTR lpString,
347   int nMaxCount,
348   UINT uFlag)
349 {
350   return 0;
351 }
352 HMENU
353 STDCALL
354 GetSubMenu(
355   HMENU hMenu,
356   int nPos)
357 {
358   return (HMENU)0;
359 }
360 WINBOOL
361 STDCALL
362 HiliteMenuItem(
363   HWND hwnd,
364   HMENU hmenu,
365   UINT uItemHilite,
366   UINT uHilite)
367 {
368   return FALSE;
369 }
370 WINBOOL
371 STDCALL
372 InsertMenuA(
373   HMENU hMenu,
374   UINT uPosition,
375   UINT uFlags,
376   UINT_PTR uIDNewItem,
377   LPCSTR lpNewItem)
378 {
379   return FALSE;
380 }
381
382 WINBOOL
383 STDCALL
384 InsertMenuItemA(
385   HMENU hMenu,
386   UINT uItem,
387   WINBOOL fByPosition,
388   LPCMENUITEMINFO lpmii)
389 {
390   return FALSE;
391 }
392
393 WINBOOL
394 STDCALL
395 InsertMenuItemW(
396   HMENU hMenu,
397   UINT uItem,
398   WINBOOL fByPosition,
399   LPCMENUITEMINFO lpmii)
400 {
401   return FALSE;
402 }
403
404 WINBOOL
405 STDCALL
406 InsertMenuW(
407   HMENU hMenu,
408   UINT uPosition,
409   UINT uFlags,
410   UINT_PTR uIDNewItem,
411   LPCWSTR lpNewItem)
412 {
413   return FALSE;
414 }
415 WINBOOL
416 STDCALL
417 IsMenu(
418   HMENU hMenu)
419 {
420   return FALSE;
421 }
422 HMENU
423 STDCALL
424 LoadMenuA(
425   HINSTANCE hInstance,
426   LPCSTR lpMenuName)
427 {
428   return (HMENU)0;
429 }
430
431 HMENU
432 STDCALL
433 LoadMenuIndirectA(
434   CONST MENUTEMPLATE *lpMenuTemplate)
435 {
436   return (HMENU)0;
437 }
438
439 HMENU
440 STDCALL
441 LoadMenuIndirectW(
442   CONST MENUTEMPLATE *lpMenuTemplate)
443 {
444   return (HMENU)0;
445 }
446
447 HMENU
448 STDCALL
449 LoadMenuW(
450   HINSTANCE hInstance,
451   LPCWSTR lpMenuName)
452 {
453   return (HMENU)0;
454 }
455 int
456 STDCALL
457 MenuItemFromPoint(
458   HWND hWnd,
459   HMENU hMenu,
460   POINT ptScreen)
461 {
462   return 0;
463 }
464 WINBOOL
465 STDCALL
466 ModifyMenuA(
467   HMENU hMnu,
468   UINT uPosition,
469   UINT uFlags,
470   UINT_PTR uIDNewItem,
471   LPCSTR lpNewItem)
472 {
473   return FALSE;
474 }
475
476 WINBOOL
477 STDCALL
478 ModifyMenuW(
479   HMENU hMnu,
480   UINT uPosition,
481   UINT uFlags,
482   UINT_PTR uIDNewItem,
483   LPCWSTR lpNewItem)
484 {
485   return FALSE;
486 }
487 WINBOOL
488 STDCALL
489 RemoveMenu(
490   HMENU hMenu,
491   UINT uPosition,
492   UINT uFlags)
493 {
494   return FALSE;
495 }
496 WINBOOL
497 STDCALL
498 SetMenu(
499   HWND hWnd,
500   HMENU hMenu)
501 {
502   return FALSE;
503 }
504
505 WINBOOL
506 STDCALL
507 SetMenuDefaultItem(
508   HMENU hMenu,
509   UINT uItem,
510   UINT fByPos)
511 {
512   return FALSE;
513 }
514
515 WINBOOL
516 STDCALL
517 SetMenuInfo(
518   HMENU hmenu,
519   LPCMENUINFO lpcmi)
520 {
521   return FALSE;
522 }
523
524 WINBOOL
525 STDCALL
526 SetMenuItemBitmaps(
527   HMENU hMenu,
528   UINT uPosition,
529   UINT uFlags,
530   HBITMAP hBitmapUnchecked,
531   HBITMAP hBitmapChecked)
532 {
533   return FALSE;
534 }
535
536 WINBOOL
537 STDCALL
538 SetMenuItemInfoA(
539   HMENU hMenu,
540   UINT uItem,
541   WINBOOL fByPosition,
542   LPMENUITEMINFO lpmii)
543 {
544   return FALSE;
545 }
546
547 WINBOOL
548 STDCALL
549 SetMenuItemInfoW(
550   HMENU hMenu,
551   UINT uItem,
552   WINBOOL fByPosition,
553   LPMENUITEMINFO lpmii)
554 {
555   return FALSE;
556 }
557
558 WINBOOL
559 STDCALL
560 TrackPopupMenu(
561   HMENU hMenu,
562   UINT uFlags,
563   int x,
564   int y,
565   int nReserved,
566   HWND hWnd,
567   CONST RECT *prcRect)
568 {
569   return FALSE;
570 }
571
572 WINBOOL
573 STDCALL
574 TrackPopupMenuEx(
575   HMENU hmenu,
576   UINT fuFlags,
577   int x,
578   int y,
579   HWND hwnd,
580   LPTPMPARAMS lptpm)
581 {
582   return FALSE;
583 }