source: trunk/dll/chklist.c@ 1194

Last change on this file since 1194 was 1184, checked in by John Small, 17 years ago

Ticket 187: Draft 2: Move remaining function declarations

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 15.0 KB
Line 
1
2/***********************************************************************
3
4 $Id: chklist.c 1184 2008-09-10 21:56:44Z jbs $
5
6 Utility windows and mouse positioning
7
8 Copyright (c) 1993-98 M. Kimes
9 Copyright (c) 2005, 2008 Steven H.Levine
10
11 10 Jan 05 SHL Allow DND_TARGET to hold CCHMAXPATH
12 14 Jul 06 SHL Use Runtime_Error
13 22 Mar 07 GKY Use QWL_USER
14 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat
15
16***********************************************************************/
17
18#include <string.h>
19#include <ctype.h>
20
21#define INCL_DOS
22#define INCL_WIN
23#define INCL_GPI
24#define INCL_LONGLONG
25
26#include "fm3dll.h"
27#include "fm3dlg.h"
28#include "fm3str.h"
29#include "makelist.h" // AddToList
30#include "errutil.h" // Dos_Error...
31#include "strutil.h" // GetPString
32#include "getnames.h" // CustomFileDlg
33#include "chklist.h"
34#include "info.h" // FileInfoProc
35#include "defview.h" // QuickView
36#include "valid.h" // IsExecutable
37#include "walkem.h" // WalkAllDlgProc
38#include "misc.h" // PaintRecessedWindow
39
40#pragma data_seg(DATA1)
41
42static PSZ pszSrcFile = __FILE__;
43
44VOID CenterOverWindow(HWND hwnd)
45{
46 SWP swp;
47 POINTL ptl;
48
49 if (!fDontMoveMouse) {
50 if (WinQueryWindowPos(hwnd, &swp)) {
51 ptl.x = swp.x + (swp.cx / 2);
52 ptl.y = swp.y + (swp.cy / 2);
53 WinMapWindowPoints(WinQueryWindow(hwnd, QW_PARENT), HWND_DESKTOP, &ptl,
54 1L);
55 WinSetPointerPos(HWND_DESKTOP, ptl.x, ptl.y);
56 }
57 }
58}
59
60BOOL PopupMenu(HWND hwndParent, HWND hwndOwner, HWND hwndMenu)
61{
62 POINTL ptl;
63 BOOL rc;
64
65 if (!WinQueryPointerPos(HWND_DESKTOP, &ptl))
66 ptl.x = ptl.y = 32;
67 WinMapWindowPoints(HWND_DESKTOP, hwndParent, &ptl, 1L);
68 rc = WinPopupMenu(hwndParent, hwndOwner, hwndMenu,
69 ptl.x, ptl.y, 0,
70 PU_HCONSTRAIN | PU_VCONSTRAIN |
71 PU_KEYBOARD | PU_MOUSEBUTTON1);
72 if (rc)
73 CenterOverWindow(hwndMenu);
74 return rc;
75}
76
77VOID PosOverOkay(HWND hwnd)
78{
79 SWP swp;
80 POINTL ptl;
81
82 if (!fDontMoveMouse) {
83 if (WinQueryWindowPos(WinWindowFromID(hwnd, DID_OK), &swp)) {
84 ptl.x = swp.x + (swp.cx / 2);
85 ptl.y = swp.y + (swp.cy / 2);
86 WinMapWindowPoints(hwnd, HWND_DESKTOP, &ptl, 1L);
87 WinSetPointerPos(HWND_DESKTOP, ptl.x, ptl.y);
88 }
89 }
90}
91
92MRESULT EXPENTRY CheckListProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
93{
94 CHECKLIST *cl;
95
96 switch (msg) {
97 case WM_INITDLG:
98 if (mp2) {
99
100 SHORT x;
101
102 WinSetWindowPtr(hwnd, QWL_USER, (PVOID) mp2);
103 cl = (CHECKLIST *) mp2;
104 if (!cl->list || !cl->list[0]) {
105 WinDismissDlg(hwnd, 0);
106 break;
107 }
108 WinSetDlgItemText(hwnd, CHECK_PROMPT, cl->prompt);
109 for (x = 0; cl->list[x]; x++) {
110 WinSendDlgItemMsg(hwnd, CHECK_LISTBOX, LM_INSERTITEM,
111 MPFROM2SHORT(LIT_END, 0), MPFROMP(cl->list[x]));
112 WinSendDlgItemMsg(hwnd, CHECK_LISTBOX, LM_SELECTITEM,
113 MPFROM2SHORT(x, 0), MPFROMSHORT(TRUE));
114 }
115 PosOverOkay(hwnd);
116 WinEnableWindow(WinWindowFromID(hwnd, CHECK_INFO),
117 ((cl->flags & CHECK_FILES) != 0));
118 WinShowWindow(WinWindowFromID(hwnd, CHECK_INFO),
119 ((cl->flags & CHECK_FILES) != 0));
120 {
121 HBITMAP hbm, hbmd, hbmdd;
122 HPS hps;
123
124 hps = WinGetPS(WinWindowFromID(hwnd, CHECK_BITMAP));
125 hbm = GpiLoadBitmap(hps, 0, cl->cmd, 28, 28);
126 if (hbm) {
127 hbmd =
128 (HBITMAP) WinSendDlgItemMsg(hwnd, CHECK_BITMAP, SM_QUERYHANDLE,
129 MPVOID, MPVOID);
130 hbmdd =
131 (HBITMAP) WinSendDlgItemMsg(hwnd, CHECK_BITMAP, SM_SETHANDLE,
132 MPFROMLONG(hbm), MPVOID);
133 if (hbmdd && hbmd && hbmd != hbmdd)
134 GpiDeleteBitmap(hbmd);
135 }
136 if (hps)
137 WinReleasePS(hps);
138 WinSetWindowPos(WinWindowFromID(hwnd, CHECK_BITMAP), HWND_TOP,
139 0, 0, 28, 28, SWP_SIZE);
140 }
141 }
142 else
143 WinDismissDlg(hwnd, 0);
144 break;
145
146 case WM_ADJUSTWINDOWPOS:
147 PostMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
148 break;
149
150 case UM_SETDIR:
151 PaintRecessedWindow(WinWindowFromID(hwnd, CHECK_HELP), (HPS) 0, FALSE,
152 TRUE);
153 return 0;
154
155 case WM_CONTROL:
156 switch (SHORT1FROMMP(mp1)) {
157 case CHECK_LISTBOX:
158 switch (SHORT2FROMMP(mp1)) {
159 case LN_ENTER:
160 {
161 SHORT x;
162 CHAR szBuffer[CCHMAXPATH];
163
164 x = (SHORT) WinSendDlgItemMsg(hwnd, CHECK_LISTBOX,
165 LM_QUERYSELECTION,
166 MPFROMSHORT(LIT_FIRST), MPVOID);
167 if (x >= 0) {
168 *szBuffer = 0;
169 WinSendDlgItemMsg(hwnd, CHECK_LISTBOX, LM_QUERYITEMTEXT,
170 MPFROM2SHORT(x, CCHMAXPATH), MPFROMP(szBuffer));
171 if (*szBuffer)
172 QuickView(hwnd, szBuffer);
173 }
174 }
175 break;
176 }
177 break;
178 }
179 return 0;
180
181 case WM_COMMAND:
182 switch (SHORT1FROMMP(mp1)) {
183 case CHECK_INFO:
184 cl = INSTDATA(hwnd);
185 if (cl)
186 WinDlgBox(HWND_DESKTOP, hwnd, FileInfoProc, FM3ModHandle,
187 FLE_FRAME, (PVOID) cl->list);
188 break;
189
190 case IDM_HELP:
191 if (hwndHelp)
192 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
193 MPFROM2SHORT(HELP_CHECKLIST, 0),
194 MPFROMSHORT(HM_RESOURCEID));
195 break;
196
197 case DID_OK:
198 cl = INSTDATA(hwnd);
199 if (cl) {
200
201 CHAR szBuffer[CCHMAXPATH + 1];
202 UINT numfiles = 0, numalloc = 0;
203 INT error;
204 SHORT x;
205
206 FreeList(cl->list);
207 cl->list = NULL;
208 x = (SHORT) WinSendDlgItemMsg(hwnd, CHECK_LISTBOX, LM_QUERYSELECTION,
209 MPFROMSHORT(LIT_FIRST), MPVOID);
210 if (x >= 0) {
211 do {
212 *szBuffer = 0;
213 WinSendDlgItemMsg(hwnd, CHECK_LISTBOX, LM_QUERYITEMTEXT,
214 MPFROM2SHORT(x, CCHMAXPATH), MPFROMP(szBuffer));
215 if (*szBuffer) {
216 error = AddToList(szBuffer, &cl->list, &numfiles, &numalloc);
217 if (error) {
218 Runtime_Error(pszSrcFile, __LINE__, "AddToList");
219 break;
220 }
221 }
222 x = (SHORT) WinSendDlgItemMsg(hwnd, CHECK_LISTBOX,
223 LM_QUERYSELECTION,
224 MPFROMSHORT(x), MPVOID);
225 } while (x >= 0);
226 }
227 WinDismissDlg(hwnd, 1);
228 }
229 else
230 WinDismissDlg(hwnd, 0);
231 break;
232
233 case DID_CANCEL:
234 WinDismissDlg(hwnd, 0);
235 break;
236 }
237 return 0;
238 }
239 return WinDefDlgProc(hwnd, msg, mp1, mp2);
240}
241
242MRESULT EXPENTRY DropListProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
243{
244 CHECKLIST *cl;
245 static BOOL Shadow = FALSE, Wild = FALSE;
246
247 switch (msg) {
248 case WM_INITDLG:
249 if (mp2) {
250
251 SHORT x;
252
253 WinSetWindowPtr(hwnd, QWL_USER, (PVOID) mp2);
254 cl = (CHECKLIST *) mp2;
255 if (!cl->list || !cl->list[0]) {
256 WinDismissDlg(hwnd, 0);
257 break;
258 }
259 if (IsRoot(cl->list[0])) {
260 WinDismissDlg(hwnd, DND_COMPARE);
261 break;
262 }
263 WinSendDlgItemMsg(hwnd, DND_LISTBOX, LM_DELETEALL, MPVOID, MPVOID);
264 for (x = 0; cl->list[x]; x++) {
265 WinSendDlgItemMsg(hwnd, DND_LISTBOX, LM_INSERTITEM,
266 MPFROM2SHORT(LIT_END, 0), MPFROMP(cl->list[x]));
267 WinSendDlgItemMsg(hwnd, DND_LISTBOX, LM_SELECTITEM,
268 MPFROM2SHORT(x, 0), MPFROMSHORT(TRUE));
269 }
270 WinSendDlgItemMsg(hwnd, DND_TARGET, EM_SETTEXTLIMIT,
271 (MPARAM) CCHMAXPATH, (MPARAM) 0);
272 PostMsg(hwnd, UM_UNDO, MPVOID, MPVOID);
273 }
274 else
275 WinDismissDlg(hwnd, 0);
276 break;
277
278 case UM_UNDO:
279 cl = INSTDATA(hwnd);
280 if (cl) {
281
282 CHAR *p;
283
284 WinSetDlgItemText(hwnd, DND_TARGET, cl->prompt);
285 WinEnableWindow(WinWindowFromID(hwnd, DND_LAUNCH),
286 (IsExecutable(cl->prompt)));
287 WinEnableWindow(WinWindowFromID(hwnd, DND_COPY), TRUE);
288 WinEnableWindow(WinWindowFromID(hwnd, DND_MOVE), TRUE);
289 WinEnableWindow(WinWindowFromID(hwnd, DND_RENAME), TRUE);
290 WinEnableWindow(WinWindowFromID(hwnd, DND_OBJECT), TRUE);
291 WinEnableWindow(WinWindowFromID(hwnd, DND_SHADOW), TRUE);
292 WinEnableWindow(WinWindowFromID(hwnd, DND_EXTRACT), TRUE);
293 WinEnableWindow(WinWindowFromID(hwnd, DND_SETICON), FALSE);
294 p = strrchr(cl->list[0], '.');
295 if (p) {
296 p++;
297 if (!stricmp(p, "ICO") || !stricmp(p, "PTR"))
298 WinEnableWindow(WinWindowFromID(hwnd, DND_SETICON), TRUE);
299 }
300 if (IsFile(cl->prompt)) {
301 WinEnableWindow(WinWindowFromID(hwnd, DND_OBJECT), FALSE);
302 WinEnableWindow(WinWindowFromID(hwnd, DND_SHADOW), FALSE);
303 WinEnableWindow(WinWindowFromID(hwnd, DND_EXTRACT), FALSE);
304 WinEnableWindow(WinWindowFromID(hwnd, DND_RENAME), FALSE);
305 }
306 else {
307
308 ARC_TYPE *info;
309
310 info = find_type(cl->list[0], NULL);
311 if (!info)
312 WinEnableWindow(WinWindowFromID(hwnd, DND_EXTRACT), FALSE);
313 }
314 if (Shadow)
315 WinCheckButton(hwnd, DND_SHADOW, TRUE);
316 if (Wild)
317 WinCheckButton(hwnd, DND_RENAME, TRUE);
318 PostMsg(hwnd, UM_SETUP, MPVOID, MPVOID);
319 if (cl->prompt && isalpha(*cl->prompt) &&
320 (driveflags[toupper(*cl->prompt) - 'A'] & DRIVE_NOTWRITEABLE)) {
321 WinEnableWindow(WinWindowFromID(hwnd, DND_COPY), FALSE);
322 WinEnableWindow(WinWindowFromID(hwnd, DND_MOVE), FALSE);
323 WinEnableWindow(WinWindowFromID(hwnd, DND_RENAME), FALSE);
324 WinEnableWindow(WinWindowFromID(hwnd, DND_OBJECT), FALSE);
325 WinEnableWindow(WinWindowFromID(hwnd, DND_SHADOW), FALSE);
326 WinEnableWindow(WinWindowFromID(hwnd, DND_EXTRACT), FALSE);
327 }
328 if (cl->prompt && IsFile(cl->prompt) == 1) {
329
330 ARC_TYPE *info;
331
332 info = find_type(cl->prompt, NULL);
333 if (!info) {
334 WinEnableWindow(WinWindowFromID(hwnd, DND_COPY), FALSE);
335 WinEnableWindow(WinWindowFromID(hwnd, DND_MOVE), FALSE);
336 WinEnableWindow(WinWindowFromID(hwnd, DND_RENAME), FALSE);
337 WinEnableWindow(WinWindowFromID(hwnd, DND_OBJECT), FALSE);
338 WinEnableWindow(WinWindowFromID(hwnd, DND_SHADOW), FALSE);
339 WinEnableWindow(WinWindowFromID(hwnd, DND_EXTRACT), FALSE);
340 }
341 }
342 }
343 break;
344
345 case UM_SETUP:
346 cl = WinQueryWindowPtr(hwnd, QWL_USER);
347 if (cl) {
348 if (cl->flags == DO_MOVE)
349 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, DND_MOVE));
350 else if (cl->flags == DO_LINK)
351 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, DND_COMPARE));
352 else
353 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, DND_COPY));
354 }
355 return 0;
356
357 case WM_ADJUSTWINDOWPOS:
358 PostMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
359 break;
360
361 case UM_SETDIR:
362 PaintRecessedWindow(WinWindowFromID(hwnd, DND_HELP), (HPS) 0, FALSE,
363 TRUE);
364 return 0;
365
366 case WM_CONTROL:
367 switch (SHORT1FROMMP(mp1)) {
368 case DND_LISTBOX:
369 switch (SHORT2FROMMP(mp1)) {
370 case LN_SETFOCUS:
371 WinSetDlgItemText(hwnd, DND_HELP, GetPString(IDS_DNDLISTBOXHELPTEXT));
372 break;
373 case LN_KILLFOCUS:
374 WinSetDlgItemText(hwnd, DND_HELP, GetPString(IDS_DNDHELPTEXT));
375 break;
376 case LN_ENTER:
377 {
378 SHORT x;
379 CHAR szBuffer[CCHMAXPATH];
380
381 x = (SHORT) WinSendDlgItemMsg(hwnd, DND_LISTBOX, LM_QUERYSELECTION,
382 MPFROMSHORT(LIT_FIRST), MPVOID);
383 if (x >= 0) {
384 *szBuffer = 0;
385 WinSendDlgItemMsg(hwnd, DND_LISTBOX, LM_QUERYITEMTEXT,
386 MPFROM2SHORT(x, CCHMAXPATH), MPFROMP(szBuffer));
387 if (*szBuffer)
388 QuickView(hwnd, szBuffer);
389 }
390 }
391 break;
392 }
393 break;
394 case DND_TARGET:
395 switch (SHORT2FROMMP(mp1)) {
396 case EN_SETFOCUS:
397 WinSetDlgItemText(hwnd, DND_HELP, GetPString(IDS_DNDTARGETHELPTEXT));
398 break;
399 case EN_KILLFOCUS:
400 WinSetDlgItemText(hwnd, DND_HELP, GetPString(IDS_DNDHELPTEXT));
401 break;
402 }
403 break;
404 }
405 return 0;
406
407 case WM_COMMAND:
408 switch (SHORT1FROMMP(mp1)) {
409 case IDM_HELP:
410 if (hwndHelp)
411 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
412 MPFROM2SHORT(HELP_DNDDLG, 0), MPFROMSHORT(HM_RESOURCEID));
413 break;
414
415 case DND_INFO:
416 cl = INSTDATA(hwnd);
417 if (cl)
418 WinDlgBox(HWND_DESKTOP, hwnd, FileInfoProc, FM3ModHandle,
419 FLE_FRAME, (PVOID) cl->list);
420 break;
421
422 case DND_CHANGETARGET:
423 cl = INSTDATA(hwnd);
424 if (cl) {
425 if (cl->prompt && *cl->prompt) {
426 if (!IsFile(cl->prompt)) {
427
428 CHAR newpath[CCHMAXPATH];
429
430 strcpy(newpath, cl->prompt);
431 if (WinDlgBox(HWND_DESKTOP, hwnd, WalkAllDlgProc,
432 FM3ModHandle, WALK_FRAME,
433 MPFROMP(newpath)) && *newpath) {
434 strcpy(cl->prompt, newpath);
435 PostMsg(hwnd, UM_UNDO, MPVOID, MPVOID);
436 }
437 }
438 else {
439
440 FILEDLG fdlg;
441 FILESTATUS3 fs3;
442 CHAR drive[3], *pdrive = drive, filename[CCHMAXPATH], *p;
443
444 memset(&fdlg, 0, sizeof(FILEDLG));
445 fdlg.cbSize = (ULONG) sizeof(FILEDLG);
446 fdlg.fl = FDS_HELPBUTTON | FDS_CENTER |
447 FDS_OPEN_DIALOG | FDS_CUSTOM;
448 fdlg.pszTitle = GetPString(IDS_NEWTARGETTEXT);
449 fdlg.pszOKButton = GetPString(IDS_CHANGETEXT);
450 *drive = *cl->prompt;
451 drive[1] = ':';
452 drive[2] = 0;
453 fdlg.pszIDrive = pdrive;
454 strcpy(fdlg.szFullFile, cl->prompt);
455 p = strrchr(fdlg.szFullFile, '\\');
456 if (p)
457 *p = 0;
458 strcat(fdlg.szFullFile, "\\*");
459
460 fdlg.pfnDlgProc = (PFNWP) CustomFileDlg;
461 fdlg.hMod = FM3ModHandle;
462 fdlg.usDlgId = FDLG_FRAME;
463
464 if (WinFileDlg(HWND_DESKTOP, hwnd, &fdlg)) {
465 if (fdlg.lReturn != DID_CANCEL && !fdlg.lSRC) {
466 if (!DosQueryPathInfo(fdlg.szFullFile,
467 FIL_QUERYFULLNAME,
468 filename, sizeof(filename))) {
469 if (!DosQueryPathInfo(filename,
470 FIL_STANDARD, &fs3, sizeof(fs3))) {
471 p = filename;
472 while (*p) {
473 if (*p == '/')
474 *p = '\\';
475 p++;
476 }
477 strcpy(cl->prompt, filename);
478 PostMsg(hwnd, UM_UNDO, MPVOID, MPVOID);
479 }
480// else saymsg(MB_ENTER,hwnd,DEBUG_STRING,"DosQueryPathInfo FIL_STANDARDL failed");
481 }
482// else saymsg(MB_ENTER,hwnd,DEBUG_STRING,"DosQueryPathInfo FIL_QUERYFULLNAME failed");
483 }
484// else saymsg(MB_ENTER,hwnd,DEBUG_STRING,"lReturn = %lu lSRC = %lu",fdlg.lReturn,fdlg.lSRC);
485 }
486// else saymsg(MB_ENTER,hwnd,DEBUG_STRING,"WinFileDlg failed");
487 }
488 }
489 }
490 break;
491
492 case DND_TARGETINFO:
493 cl = INSTDATA(hwnd);
494 if (cl) {
495
496 CHAR *list[2];
497
498 list[0] = cl->prompt;
499 list[1] = NULL;
500 WinDlgBox(HWND_DESKTOP, hwnd, FileInfoProc, FM3ModHandle,
501 FLE_FRAME, (PVOID) & list);
502 }
503 break;
504
505 case DND_EXTRACT:
506 case DND_LAUNCH:
507 case DND_COPY:
508 case DND_MOVE:
509 case DND_OBJECT:
510 case DND_COMPARE:
511 case DND_SETICON:
512 case DND_APPEND:
513 cl = INSTDATA(hwnd);
514 if (cl) {
515
516 SHORT x;
517 CHAR szBuffer[CCHMAXPATH + 1];
518 UINT numfiles = 0, numalloc = 0;
519 INT error;
520 USHORT cmd;
521
522 FreeList(cl->list);
523 cl->list = NULL;
524 x = (SHORT) WinSendDlgItemMsg(hwnd, DND_LISTBOX, LM_QUERYSELECTION,
525 MPFROMSHORT(LIT_FIRST), MPVOID);
526 if (x >= 0) {
527 do {
528 *szBuffer = 0;
529 WinSendDlgItemMsg(hwnd, DND_LISTBOX, LM_QUERYITEMTEXT,
530 MPFROM2SHORT(x, CCHMAXPATH), MPFROMP(szBuffer));
531 if (*szBuffer) {
532 error = AddToList(szBuffer, &cl->list, &numfiles, &numalloc);
533 if (error) {
534 Runtime_Error(pszSrcFile, __LINE__, "AddToList");
535 break;
536 }
537 }
538 x = (SHORT) WinSendDlgItemMsg(hwnd, DND_LISTBOX,
539 LM_QUERYSELECTION,
540 MPFROMSHORT(x), MPVOID);
541 } while (x >= 0);
542 }
543 cmd = SHORT1FROMMP(mp1);
544 switch (cmd) {
545 case DND_COPY:
546 if (WinQueryButtonCheckstate(hwnd, DND_RENAME)) {
547 Wild = TRUE;
548 cmd = DND_WILDCOPY;
549 }
550 else
551 Wild = FALSE;
552 break;
553 case DND_MOVE:
554 if (WinQueryButtonCheckstate(hwnd, DND_RENAME)) {
555 Wild = TRUE;
556 cmd = DND_WILDMOVE;
557 }
558 else
559 Wild = FALSE;
560 break;
561 case DND_OBJECT:
562 if (WinQueryButtonCheckstate(hwnd, DND_SHADOW)) {
563 Shadow = TRUE;
564 cmd = DND_SHADOW;
565 }
566 else
567 Shadow = FALSE;
568 break;
569 }
570 WinDismissDlg(hwnd, cmd);
571 }
572 else
573 WinDismissDlg(hwnd, 0);
574 break;
575
576 case DID_CANCEL:
577 WinDismissDlg(hwnd, 0);
578 break;
579 }
580 return 0;
581 }
582 return WinDefDlgProc(hwnd, msg, mp1, mp2);
583}
584
585#pragma alloc_text(CHECKLIST,CheckListProc)
586#pragma alloc_text(DNDLIST,DropListProc)
587#pragma alloc_text(MISC7,PosOverOkay,CenterOverWindow,PopupMenu)
Note: See TracBrowser for help on using the repository browser.