source: trunk/src/pe2lx/menu.cpp

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

EB change to submenu codepage

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