source: trunk/dll/chklist.c@ 807

Last change on this file since 807 was 793, checked in by Gregg Young, 18 years ago

Move #pragma alloc_text to end for OpenWatcom compat

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