source: trunk/src/kernel32/cvtmenu.cpp@ 761

Last change on this file since 761 was 761, checked in by sandervl, 26 years ago

Menu resource changes

File size: 11.3 KB
Line 
1/* $Id: cvtmenu.cpp,v 1.2 1999-08-31 17:15:29 sandervl Exp $ */
2
3/*
4 * PE2LX menu conversion code
5 *
6 * Copyright 1998 Sander van Leeuwen (sandervl@xs4all.nl)
7 *
8 *
9 * Project Odin Software License can be found in LICENSE.TXT
10 *
11 */
12#define INCL_DOSFILEMGR /* File Manager values */
13#define INCL_DOSERRORS /* DOS Error values */
14#define INCL_DOSPROCESS /* DOS Process values */
15#define INCL_DOSMISC /* DOS Miscellanous values */
16#define INCL_DOSNLS
17#define INCL_WIN
18#include <os2wrap.h>
19#include <pmmenu.h>
20#include <stdio.h>
21#include <string.h>
22#include <stdlib.h>
23#include <string.h>
24#include <win32type.h>
25#include <winmenu.h>
26#include <misc.h>
27#include "cvtresource.h"
28
29static int ProcessSubMenu(PopupMenuItem *popupitem, MT_OS2 *os2menu, MTI_OS2 *menuitem, int size, int cp);
30static int QuerySubMenuSize(PopupMenuItem *popupitem);
31static int ProcessMenuItem(NormalMenuItem *popupitem, MT_OS2 *os2menu, MTI_OS2 *menuitem, int size, int cp);
32static int QueryMenuItemSize(NormalMenuItem *normalitem);
33static void menustrcpy(char *dest, char *src);
34//******************************************************************************
35//******************************************************************************
36static int QueryMenuSize(MenuHeader *menu)
37{
38 PopupMenuItem *popupitem = (PopupMenuItem *)((char *)menu + sizeof(MenuHeader));
39 NormalMenuItem *normalitem = (NormalMenuItem *)((char *)menu + sizeof(MenuHeader));
40 int size = sizeof(MenuHeader);
41 int increment;
42
43 while(TRUE)
44 {
45 if(popupitem->fItemFlags & POPUP) {
46 increment = QuerySubMenuSize(popupitem);
47 }
48 else increment = QueryMenuItemSize(normalitem);
49
50 size += increment;
51
52 if(popupitem->fItemFlags & ENDMENU) break;
53
54 popupitem = (PopupMenuItem *)((char *)popupitem + increment);
55 normalitem = (NormalMenuItem *)((char *)normalitem + increment);
56 }
57 return size;
58}
59//******************************************************************************
60//******************************************************************************
61void *ConvertMenu(MenuHeader *menu, int size, int cp)
62{
63 PopupMenuItem *popupitem = (PopupMenuItem *)((char *)menu + sizeof(MenuHeader));
64 NormalMenuItem *normalitem = (NormalMenuItem *)((char *)menu + sizeof(MenuHeader));
65 MT_OS2 *os2menu, *submenu;
66 MTI_OS2 *menuitem;
67 int newsize;
68 ULONG ulCpSize, ulCP;
69
70 if(size == 0) {
71 size = QueryMenuSize(menu);
72 }
73 os2menu = (MT_OS2 *)malloc(size*4); //should always be sufficient
74 os2menu->len = sizeof(MT_OS2) - sizeof(MTI_OS2);
75 if(cp == 0) {
76 os2menu->codepage = 437;
77 }
78 else
79 {
80 DosQueryCp(sizeof(ulCP), &ulCP, &ulCpSize);
81 os2menu->codepage = ulCP;
82 }
83 os2menu->reserved = 4;
84 os2menu->cMti = 0;
85 menuitem = &os2menu->rgMti[0];
86 submenu = os2menu;
87 while(size > 4)
88 {
89 if(popupitem->fItemFlags & POPUP) {
90 dprintf(("POPUP "));
91 newsize = ProcessSubMenu(popupitem, os2menu, menuitem, size, cp);
92 }
93 else newsize = ProcessMenuItem(normalitem, os2menu, menuitem, size, cp);
94
95 if(popupitem->fItemFlags & ENDMENU) break;
96
97 popupitem = (PopupMenuItem *)((char *)popupitem + (size - newsize));
98 normalitem = (NormalMenuItem *)((char *)normalitem + (size - newsize));
99
100 menuitem = (MTI_OS2 *)((int)os2menu + os2menu->len);
101 size = newsize;
102 }
103 return (void *)os2menu;
104}
105//******************************************************************************
106//******************************************************************************
107static int ProcessSubMenu(PopupMenuItem *popupitem, MT_OS2 *os2menu, MTI_OS2 *menuitem, int size, int cp)
108{
109 static int uniqueid = 0;
110 NormalMenuItem *normalitem;
111 MT_OS2 *submenu;
112 int len = 0, newsize;
113 ULONG ulCpSize, ulCP;
114 char *menuname;
115
116 menuitem->afStyle = MIS_SUBMENU;
117
118 //A unique id is sufficient, since it's not possible to get info about
119 //the SUBMENU item being selected with the (win32) WM_INITMENU message
120 //(this is possible in OS/2)
121 menuitem->idItem = (USHORT)uniqueid++;
122 menuitem->pad = 0;
123
124 if(popupitem->fItemFlags & GRAYED) {
125 dprintf(("GRAYED "));
126 menuitem->pad |= MIA_DISABLED;
127 }
128 if(popupitem->fItemFlags & INACTIVE) {
129 dprintf(("INACTIVE "));
130 menuitem->pad |= MIA_DISABLED;
131 }
132 if(popupitem->fItemFlags & BITMAP) {
133 dprintf(("BITMAP "));
134 //where's the bitmap stored? (same id as id of this menu item?)
135 menuitem->afStyle |= MIS_BITMAP;
136 }
137 if(popupitem->fItemFlags & OWNERDRAW) {
138 dprintf(("OWNERDRAW "));
139 menuitem->afStyle |= MIS_OWNERDRAW;
140 }
141 if(popupitem->fItemFlags & CHECKED) {
142 menuitem->pad |= MIA_CHECKED;
143 dprintf(("CHECKED "));
144 }
145 if(popupitem->fItemFlags & MENUBREAK) {
146 menuitem->afStyle |= MIS_BREAK;
147 menuitem->pad |= MIA_DISABLED;
148 dprintf(("MENUBREAK "));
149 }
150 if(popupitem->fItemFlags & MENUBARBREAK) {
151 dprintf(("MENUBARBREAK"));
152 menuitem->afStyle |= MIS_BREAKSEPARATOR;
153 menuitem->pad |= MIA_DISABLED;
154 menuitem->c[0] = 0;
155 menuitem->c[1] = 0;
156 }
157 else {
158 len = (UniStrlen(popupitem->szItemText)+1)*2;
159 menuname = UnicodeToAsciiString(popupitem->szItemText);
160 dprintf(("%s", menuname));
161 menustrcpy(menuitem->c, menuname);
162 FreeAsciiString(menuname);
163 }
164 os2menu->len += sizeof(MTI_OS2);
165 if(len > 4) os2menu->len += (len/2 - sizeof(menuitem->c));
166 os2menu->cMti++;
167
168 size -= (sizeof(PopupMenuItem)-2 + len); /*PLF Sat 97-06-21 22:17:51*/
169 //process next menu item
170 submenu = (MT_OS2 *)(menuitem+1);
171 if(len > 4) {
172 submenu = (MT_OS2 *)((char *)submenu + len/2 - sizeof(menuitem->c));
173 }
174
175 submenu->len = sizeof(MT_OS2) - sizeof(MTI_OS2);
176
177 if(cp == 0) {
178 submenu->codepage = 437;
179 }
180 else
181 {
182 DosQueryCp(sizeof(ulCP), &ulCP, &ulCpSize);
183 submenu->codepage = ulCP;
184 }
185
186 submenu->reserved = 4;
187 submenu->cMti = 0;
188 menuitem = &submenu->rgMti[0];
189
190 //normalitem = (NormalMenuItem *)(popupitem + 1);
191 normalitem = (NormalMenuItem *)((char*)popupitem + sizeof(PopupMenuItem)-2); /*PLF Sat 97-06-21 23:54:50*/
192 normalitem = (NormalMenuItem *)((int)normalitem + len);
193
194 while(size > 4) {
195 if(normalitem->fItemFlags & POPUP) {
196 dprintf(("POPUP "));
197 newsize = ProcessSubMenu((PopupMenuItem *)normalitem, submenu, menuitem, size, cp);
198 }
199 else newsize = ProcessMenuItem(normalitem, submenu, menuitem, size, cp);
200
201 menuitem = (MTI_OS2 *)((int)submenu + submenu->len);
202 if(normalitem->fItemFlags & ENDMENU) {
203 os2menu->len += submenu->len;
204 return(newsize);
205 }
206 normalitem = (NormalMenuItem *)((char *)normalitem + (size - newsize));
207 size = newsize;
208 }
209 os2menu->len += submenu->len;
210 return(size);
211}
212//******************************************************************************
213//******************************************************************************
214static int QuerySubMenuSize(PopupMenuItem *popupitem)
215{
216 NormalMenuItem *normalitem;
217 int len = 0, size, increment;
218
219 if(!(popupitem->fItemFlags & MENUBARBREAK)) {
220 len = (UniStrlen(popupitem->szItemText)+1)*2;
221 }
222
223 size = (sizeof(PopupMenuItem)-2 + len); /*PLF Sat 97-06-21 22:17:51*/
224
225 normalitem = (NormalMenuItem *)((char*)popupitem + sizeof(PopupMenuItem)-2); /*PLF Sat 97-06-21 23:54:50*/
226 normalitem = (NormalMenuItem *)((int)normalitem + len);
227
228 while(TRUE) {
229 if(normalitem->fItemFlags & POPUP) {
230 increment = QuerySubMenuSize((PopupMenuItem *)normalitem);
231 }
232 else increment = QueryMenuItemSize(normalitem);
233
234 size += increment;
235
236 if(normalitem->fItemFlags & ENDMENU) {
237 return(size);
238 }
239 normalitem = (NormalMenuItem *)((char *)normalitem + increment);
240 }
241 return(size);
242}
243//******************************************************************************
244//******************************************************************************
245static int ProcessMenuItem(NormalMenuItem *normalitem, MT_OS2 *os2menu, MTI_OS2 *menuitem, int size, int cp)
246{
247 WCHAR *menustring;
248 int len = 0;
249 char *menuname;
250
251 dprintf(("ID %d ", normalitem->wMenuID));
252 menustring = normalitem->szItemText;
253 menuitem->afStyle = MIS_TEXT;
254 menuitem->idItem = normalitem->wMenuID;
255 menuitem->pad = 0;
256
257 if(normalitem->fItemFlags & ENDMENU) {
258 //signals the end of a (sub)menu
259 dprintf(("ENDMENU"));
260 len = (UniStrlen(normalitem->szItemText)+1)*2;
261 //don't store this menu item, is it's empty
262 if(len == 2) {
263 size -= (sizeof(NormalMenuItem)-2 + len);
264 return(size);
265 }
266 }
267 if(normalitem->fItemFlags & GRAYED) {
268 dprintf(("GRAYED "));
269 menuitem->pad |= MIA_DISABLED;
270 }
271 if(normalitem->fItemFlags & INACTIVE) {
272 dprintf(("INACTIVE "));
273 menuitem->pad |= MIA_DISABLED;
274 }
275 if(normalitem->fItemFlags & BITMAP) {
276 dprintf(("BITMAP "));
277 //where's the bitmap stored? (same id as id of this menu item?)
278 menuitem->afStyle |= MIS_BITMAP;
279 }
280 if(normalitem->fItemFlags & OWNERDRAW) {
281 dprintf(("OWNERDRAW "));
282 menuitem->afStyle |= MIS_OWNERDRAW;
283 }
284 if(normalitem->fItemFlags & CHECKED) {
285 menuitem->pad |= MIA_CHECKED;
286 dprintf(("CHECKED "));
287 }
288 if(normalitem->fItemFlags & MENUBREAK) {
289 menuitem->afStyle |= MIS_BREAK;
290 menuitem->pad |= MIA_DISABLED;
291 dprintf(("MENUBREAK "));
292 }
293 if(normalitem->fItemFlags & MENUBARBREAK) {
294 dprintf(("MENUBARBREAK"));
295 menuitem->afStyle |= MIS_BREAKSEPARATOR;
296 menuitem->pad |= MIA_DISABLED;
297 menuitem->c[0] = 0;
298 menuitem->c[1] = 0;
299 }
300 else {
301 len = (UniStrlen(normalitem->szItemText)+1)*2;
302 if(normalitem->fItemFlags == 0 && len == 2) {
303 dprintf(("SEPARATOR"));
304 menuitem->afStyle = MIS_SEPARATOR;
305 menuitem->pad = MIA_DISABLED;
306 menuitem->idItem = 0xFFFF;
307 menuitem->c[0] = 0;
308 menuitem->c[1] = 0;
309 }
310 else {
311 menuname = UnicodeToAsciiString(normalitem->szItemText);
312 dprintf(("%s", menuname));
313 menustrcpy(menuitem->c, menuname);
314 FreeAsciiString(menuname);
315 }
316 }
317 os2menu->len += sizeof(MTI_OS2);
318 //SvL: Bugfix (>4), 19-10-'97
319 if(len >= 4) os2menu->len += (len/2 - sizeof(menuitem->c));
320 else os2menu->len -= 2; //REQUIRED (even though mi->c[2])
321
322 os2menu->cMti++;
323
324 size -= (sizeof(NormalMenuItem)-2 + len); /*PLF Sat 97-06-21 22:19:57*/
325
326 return(size);
327}
328//******************************************************************************
329//******************************************************************************
330static int QueryMenuItemSize(NormalMenuItem *normalitem)
331{
332 int len = 0;
333
334 if(!(normalitem->fItemFlags & MENUBARBREAK)) {
335 len = (UniStrlen(normalitem->szItemText)+1)*2;
336 }
337
338 return(sizeof(NormalMenuItem)-2 + len);
339}
340//******************************************************************************
341//******************************************************************************
342static void menustrcpy(char *dest, char *src)
343{
344 int i, len = strlen(src);
345
346 for(i=0;i<len;i++) {
347 if(src[i] == '&') dest[i] = '~';
348 else dest[i] = src[i];
349 }
350 dest[len] = 0;
351}
352//******************************************************************************
353//******************************************************************************
Note: See TracBrowser for help on using the repository browser.