source: trunk/dll/chklist.c@ 1160

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

Ticket 187: Draft 1: Functions only

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