source: trunk/src/pe2lx/menu.cpp@ 46

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

* empty log message *

File size: 8.5 KB
Line 
1/*
2 * PE2LX menu conversion code
3 *
4 * Copyright 1998 Sander van Leeuwen (sandervl@xs4all.nl)
5 *
6 *
7 * Project Odin Software License can be found in LICENSE.TXT
8 *
9 */
10#define INCL_DOSFILEMGR /* File Manager values */
11#define INCL_DOSERRORS /* DOS Error values */
12#define INCL_DOSPROCESS /* DOS Process values */
13#define INCL_DOSMISC /* DOS Miscellanous values */
14#define INCL_WIN
15#include <os2.h>
16#include <pmmenu.h>
17#include <stdio.h>
18#include <string.h>
19#include <stdlib.h>
20#include <iostream.h>
21#include <string.h>
22#include "pefile.h"
23#include "lx.h"
24#include "menu.h"
25#include "misc.h"
26
27static int ProcessSubMenu(PopupMenuItem *popupitem, MT_OS2 *os2menu, MTI_OS2 *menuitem, int size);
28static int ProcessMenuItem(NormalMenuItem *popupitem, MT_OS2 *os2menu, MTI_OS2 *menuitem, int size);
29static void menustrcpy(char *dest, char *src);
30//******************************************************************************
31//******************************************************************************
32void ShowMenu(int id, MenuHeader *menu, int size)
33{
34 PopupMenuItem *popupitem = (PopupMenuItem *)((char *)menu + sizeof(MenuHeader));
35 NormalMenuItem *normalitem = (NormalMenuItem *)((char *)menu + sizeof(MenuHeader));
36 MT_OS2 *os2menu, *submenu;
37 MTI_OS2 *menuitem;
38 int newsize;
39
40 //First save original win32 resource
41 OS2Exe.StoreWin32Resource(id, RT_MENU, size, (char *)menu);
42
43 os2menu = (MT_OS2 *)malloc(size*4); //should always be sufficient
44 os2menu->len = sizeof(MT_OS2) - sizeof(MTI_OS2);
45 os2menu->codepage = 437;
46 os2menu->reserved = 4;
47 os2menu->cMti = 0;
48 menuitem = &os2menu->rgMti[0];
49 submenu = os2menu;
50 while(size > 4) {
51 if(popupitem->fItemFlags & POPUP) {
52 cout << "POPUP ";
53 newsize = ProcessSubMenu(popupitem, os2menu, menuitem, size);
54 }
55 else newsize = ProcessMenuItem(normalitem, os2menu, menuitem, size);
56
57 if(popupitem->fItemFlags & ENDMENU) break;
58
59 popupitem = (PopupMenuItem *)((char *)popupitem + (size - newsize));
60 normalitem = (NormalMenuItem *)((char *)normalitem + (size - newsize));
61
62 menuitem = (MTI_OS2 *)((int)os2menu + os2menu->len);
63 size = newsize;
64 }
65 OS2Exe.StoreResource(id, RT_MENU, os2menu->len, (char *)os2menu);
66 free(os2menu);
67}
68//******************************************************************************
69//******************************************************************************
70static int ProcessSubMenu(PopupMenuItem *popupitem, MT_OS2 *os2menu, MTI_OS2 *menuitem, int size)
71{
72NormalMenuItem *normalitem;
73MT_OS2 *submenu;
74int len = 0, newsize;
75
76 menuitem->afStyle = MIS_SUBMENU;
77
78 //A unique id is sufficient, since it's not possible to get info about
79 //the SUBMENU item being selected with the (win32) WM_INITMENU message
80 //(this is possible in OS/2)
81 menuitem->idItem = (USHORT)OS2Exe.GetUniqueId();
82 menuitem->pad = 0;
83
84 if(popupitem->fItemFlags & GRAYED) {
85 cout << "GRAYED ";
86 menuitem->pad |= MIA_DISABLED;
87 }
88 if(popupitem->fItemFlags & INACTIVE) {
89 cout << "INACTIVE ";
90 menuitem->pad |= MIA_DISABLED;
91 }
92 if(popupitem->fItemFlags & BITMAP) {
93 cout << "BITMAP ";
94 //where's the bitmap stored? (same id as id of this menu item?)
95 menuitem->afStyle |= MIS_BITMAP;
96 }
97 if(popupitem->fItemFlags & OWNERDRAW) {
98 cout << "OWNERDRAW ";
99 menuitem->afStyle |= MIS_OWNERDRAW;
100 }
101 if(popupitem->fItemFlags & CHECKED) {
102 menuitem->pad |= MIA_CHECKED;
103 cout << "CHECKED ";
104 }
105 if(popupitem->fItemFlags & MENUBREAK) {
106 menuitem->afStyle |= MIS_BREAK;
107 menuitem->pad |= MIA_DISABLED;
108 cout << "MENUBREAK ";
109 }
110 if(popupitem->fItemFlags & MENUBARBREAK) {
111 cout << "MENUBARBREAK" << endl;
112 menuitem->afStyle |= MIS_BREAKSEPARATOR;
113 menuitem->pad |= MIA_DISABLED;
114 menuitem->c[0] = 0;
115 menuitem->c[1] = 0;
116 }
117 else {
118 len = (UniStrlen(popupitem->szItemText)+1)*2;
119 cout << UnicodeToAscii(popupitem->szItemText) << endl;
120 menustrcpy(menuitem->c, UnicodeToAscii(popupitem->szItemText));
121 }
122 os2menu->len += sizeof(MTI_OS2);
123 if(len > 4) os2menu->len += (len/2 - sizeof(menuitem->c));
124 os2menu->cMti++;
125
126 size -= (sizeof(PopupMenuItem)-2 + len); /*PLF Sat 97-06-21 22:17:51*/
127 //process next menu item
128 submenu = (MT_OS2 *)(menuitem+1);
129 if(len > 4)
130 submenu = (MT_OS2 *)((char *)submenu + len/2 - sizeof(menuitem->c));
131 submenu->len = sizeof(MT_OS2) - sizeof(MTI_OS2);
132 submenu->codepage = 437;
133 submenu->reserved = 4;
134 submenu->cMti = 0;
135 menuitem = &submenu->rgMti[0];
136
137 //normalitem = (NormalMenuItem *)(popupitem + 1);
138 normalitem = (NormalMenuItem *)((char*)popupitem + sizeof(PopupMenuItem)-2); /*PLF Sat 97-06-21 23:54:50*/
139 normalitem = (NormalMenuItem *)((int)normalitem + len);
140
141 while(size > 4) {
142 if(normalitem->fItemFlags & POPUP) {
143 cout << "POPUP ";
144 newsize = ProcessSubMenu((PopupMenuItem *)normalitem, submenu, menuitem, size);
145 }
146 else newsize = ProcessMenuItem(normalitem, submenu, menuitem, size);
147
148 menuitem = (MTI_OS2 *)((int)submenu + submenu->len);
149 if(normalitem->fItemFlags & ENDMENU) {
150 os2menu->len += submenu->len;
151 return(newsize);
152 }
153 normalitem = (NormalMenuItem *)((char *)normalitem + (size - newsize));
154 size = newsize;
155 }
156 os2menu->len += submenu->len;
157 return(size);
158}
159//******************************************************************************
160//******************************************************************************
161static int ProcessMenuItem(NormalMenuItem *normalitem, MT_OS2 *os2menu, MTI_OS2 *menuitem, int size)
162{
163WCHAR *menustring;
164int len = 0;
165
166 cout << "ID " << normalitem->wMenuID << " ";
167 menustring = normalitem->szItemText;
168 menuitem->afStyle = MIS_TEXT;
169 menuitem->idItem = normalitem->wMenuID;
170 menuitem->pad = 0;
171
172 if(normalitem->fItemFlags & ENDMENU) {
173 //signals the end of a (sub)menu
174 cout << "ENDMENU ";
175 len = (UniStrlen(normalitem->szItemText)+1)*2;
176 //don't store this menu item, is it's empty
177 if(len == 2) {
178 size -= (sizeof(NormalMenuItem)-2 + len);
179 return(size);
180 }
181 }
182 if(normalitem->fItemFlags & GRAYED) {
183 cout << "GRAYED ";
184 menuitem->pad |= MIA_DISABLED;
185 }
186 if(normalitem->fItemFlags & INACTIVE) {
187 cout << "INACTIVE ";
188 menuitem->pad |= MIA_DISABLED;
189 }
190 if(normalitem->fItemFlags & BITMAP) {
191 cout << "BITMAP ";
192 //where's the bitmap stored? (same id as id of this menu item?)
193 menuitem->afStyle |= MIS_BITMAP;
194 }
195 if(normalitem->fItemFlags & OWNERDRAW) {
196 cout << "OWNERDRAW ";
197 menuitem->afStyle |= MIS_OWNERDRAW;
198 }
199 if(normalitem->fItemFlags & CHECKED) {
200 menuitem->pad |= MIA_CHECKED;
201 cout << "CHECKED ";
202 }
203 if(normalitem->fItemFlags & MENUBREAK) {
204 menuitem->afStyle |= MIS_BREAK;
205 menuitem->pad |= MIA_DISABLED;
206 cout << "MENUBREAK ";
207 }
208 if(normalitem->fItemFlags & MENUBARBREAK) {
209 cout << "MENUBARBREAK" << endl;
210 menuitem->afStyle |= MIS_BREAKSEPARATOR;
211 menuitem->pad |= MIA_DISABLED;
212 menuitem->c[0] = 0;
213 menuitem->c[1] = 0;
214 }
215 else {
216 len = (UniStrlen(normalitem->szItemText)+1)*2;
217 if(normalitem->fItemFlags == 0 && len == 2) {
218 cout << "SEPARATOR" << endl;
219 menuitem->afStyle = MIS_SEPARATOR;
220 menuitem->pad = MIA_DISABLED;
221 menuitem->idItem = 0xFFFF;
222 menuitem->c[0] = 0;
223 menuitem->c[1] = 0;
224 }
225 else {
226 cout << UnicodeToAscii(normalitem->szItemText) << endl;
227 menustrcpy(menuitem->c, UnicodeToAscii(normalitem->szItemText));
228 }
229 }
230 os2menu->len += sizeof(MTI_OS2);
231 //SvL: Bugfix (>4), 19-10-'97
232 if(len >= 4) os2menu->len += (len/2 - sizeof(menuitem->c));
233 else os2menu->len -= 2; //REQUIRED (even though mi->c[2])
234
235 os2menu->cMti++;
236
237 size -= (sizeof(NormalMenuItem)-2 + len); /*PLF Sat 97-06-21 22:19:57*/
238
239
240 return(size);
241}
242//******************************************************************************
243//******************************************************************************
244static void menustrcpy(char *dest, char *src)
245{
246 int i, len = strlen(src);
247
248 for(i=0;i<len;i++) {
249 if(src[i] == '&') dest[i] = '~';
250 else dest[i] = src[i];
251 }
252 dest[len] = 0;
253}
254//******************************************************************************
255//******************************************************************************
Note: See TracBrowser for help on using the repository browser.