source: trunk/dll/chklist.c@ 689

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

Use QWL_USER; Replace doesn't move the command and Okay on cmd dialog removed error on unchanged command

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