source: trunk/dll/chklist.c@ 551

Last change on this file since 551 was 551, checked in by Gregg Young, 19 years ago

Indentation cleanup

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