source: trunk/dll/chklist.c@ 2

Last change on this file since 2 was 2, checked in by root, 23 years ago

Initial revision

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