source: trunk/dll/dircnrs.c@ 130

Last change on this file since 130 was 130, checked in by root, 20 years ago

Use QWL_USER

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 132.9 KB
Line 
1
2/***********************************************************************
3
4 $Id: dircnrs.c 130 2005-05-23 19:04:06Z root $
5
6 Directory containers
7
8 Copyright (c) 1993-98 M. Kimes
9 Copyright (c) 2001, 2005 Steven H.Levine
10
11 16 Oct 02 SHL Handle large partitions
12 01 Aug 04 SHL Rework lstrip/rstrip usage
13 23 May 05 SHL Use QWL_USER
14
15***********************************************************************/
16
17#define INCL_DOS
18#define INCL_WIN
19#define INCL_GPI
20#define INCL_DOSERRORS
21
22#include <os2.h>
23#include <stdarg.h>
24#include <stdio.h>
25#include <stdlib.h>
26#include <string.h>
27#include <ctype.h>
28#include <limits.h>
29#include "fm3dll.h"
30#include "fm3dlg.h"
31#include "fm3str.h"
32#include "mle.h"
33
34#pragma data_seg(DATA1)
35#pragma alloc_text(DIRCNRS,DirCnrWndProc,DirObjWndProc,DirClientWndProc)
36#pragma alloc_text(DIRCNRS,DirTextProc,DirFrameWndProc)
37#pragma alloc_text(STARTUP,StartDirCnr)
38
39
40MRESULT EXPENTRY DirFrameWndProc (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2) {
41
42 return CommonFrameWndProc(DIR_CNR,hwnd,msg,mp1,mp2);
43}
44
45
46MRESULT EXPENTRY DirTextProc (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2) {
47
48 static BOOL emphasized = FALSE;
49 static HWND hwndButtonPopup = (HWND)0;
50 static USHORT lastid = 0;
51 static ULONG timestamp = ULONG_MAX;
52
53 switch(msg) {
54 case WM_CREATE:
55 return CommonTextProc(hwnd,msg,mp1,mp2);
56
57 case WM_COMMAND:
58 {
59 DIRCNRDATA *dcd;
60 MRESULT mr;
61
62 mr = WinSendMsg(WinWindowFromID(WinQueryWindow(hwnd,
63 QW_PARENT),
64 DIR_CNR),
65 msg,
66 mp1,
67 mp2);
68 if(hwndButtonPopup &&
69 SHORT1FROMMP(mp1) > IDM_DETAILSTITLES &&
70 SHORT1FROMMP(mp1) < IDM_DETAILSSETUP) {
71 dcd = WinQueryWindowPtr(WinWindowFromID(WinQueryWindow(hwnd,
72 QW_PARENT),
73 DIR_CNR),
74 0);
75 if(dcd)
76 SetDetailsSwitches(hwndButtonPopup,
77 dcd);
78 }
79 return mr;
80 }
81
82 case UM_CONTEXTMENU:
83 case WM_CONTEXTMENU:
84 {
85 USHORT id;
86
87 id = WinQueryWindowUShort(hwnd,QWS_ID);
88 switch(id) {
89 case DIR_FOLDERICON:
90 if(fNoFoldMenu) {
91 PostMsg(WinWindowFromID(WinQueryWindow(hwnd,QW_PARENT),
92 DIR_CNR),
93 WM_COMMAND,
94 MPFROM2SHORT(IDM_PREVIOUS,0),
95 mp2);
96 break;
97 }
98 /* else intentional fallthru */
99 case DIR_SELECTED:
100 case DIR_VIEW:
101 case DIR_SORT:
102 {
103 POINTL ptl = {0,0};
104 SWP swp;
105 DIRCNRDATA *dcd;
106
107 if(hwndButtonPopup)
108 WinDestroyWindow(hwndButtonPopup);
109 if(id == DIR_SELECTED && msg == WM_CONTEXTMENU)
110 id = DIR_MAX;
111 if(id == lastid) {
112
113 ULONG check;
114
115 DosQuerySysInfo(QSV_MS_COUNT,
116 QSV_MS_COUNT,
117 &check,
118 sizeof(check));
119 if(check < timestamp + 500) {
120 lastid = 0;
121 goto MenuAbort;
122 }
123 }
124 hwndButtonPopup = WinLoadMenu(HWND_DESKTOP,
125 FM3ModHandle,
126 id);
127 if(hwndButtonPopup) {
128 WinSetWindowUShort(hwndButtonPopup,
129 QWS_ID,
130 id);
131 dcd = WinQueryWindowPtr(WinWindowFromID(WinQueryWindow(hwnd,
132 QW_PARENT),
133 DIR_CNR),
134 0);
135 if(id == DIR_SORT) { /* don't have sort pathname in dirs */
136 WinSendMsg(hwndButtonPopup,
137 MM_DELETEITEM,
138 MPFROM2SHORT(IDM_SORTNAME,
139 FALSE),
140 MPVOID);
141 WinSendMsg(hwndButtonPopup,
142 MM_DELETEITEM,
143 MPFROM2SHORT(IDM_SORTNONE,
144 FALSE),
145 MPVOID);
146 if(dcd)
147 SetSortChecks(hwndButtonPopup,
148 dcd->sortFlags);
149 }
150 else if(id == DIR_VIEW) {
151 if(dcd) {
152 SetViewMenu(hwndButtonPopup,
153 dcd->flWindowAttr);
154 SetDetailsSwitches(hwndButtonPopup,
155 dcd);
156 }
157 }
158 else if(id == DIR_MAX) {
159
160 int x;
161 BOOL enable;
162 USHORT ids[] = {IDM_SELECTBOTH,
163 IDM_SELECTMORE,
164 IDM_SELECTONE,
165 IDM_SELECTNEWER,
166 IDM_SELECTOLDER,
167 IDM_SELECTBIGGER,
168 IDM_SELECTSMALLER,
169 IDM_DESELECTBOTH,
170 IDM_DESELECTMORE,
171 IDM_DESELECTONE,
172 IDM_DESELECTNEWER,
173 IDM_DESELECTOLDER,
174 IDM_DESELECTBIGGER,
175 IDM_DESELECTSMALLER,
176 0};
177
178 enable = (CountDirCnrs(dcd->hwndParent) > 1);
179 for(x = 0;ids[x];x++)
180 WinEnableMenuItem(hwndButtonPopup,
181 ids[x],
182 enable);
183 }
184 else if(id == DIR_SELECTED) {
185 if(dcd)
186 WinEnableMenuItem(hwndButtonPopup,
187 IDM_RESELECT,
188 (dcd->lastselection != NULL));
189 }
190 ptl.x = 0;
191 if(WinPopupMenu(HWND_OBJECT,
192 HWND_OBJECT,
193 hwndButtonPopup,
194 -32767,
195 -32767,
196 0,
197 0)) {
198 WinQueryWindowPos(hwndButtonPopup,
199 &swp);
200 ptl.y = -(swp.cy + 2);
201 }
202 else {
203 WinQueryWindowPos(hwnd,
204 &swp);
205 ptl.y = swp.cy + 2;
206 }
207 if(WinPopupMenu(hwnd,
208 hwnd,
209 hwndButtonPopup,
210 ptl.x,
211 ptl.y,
212 0,
213 PU_HCONSTRAIN | PU_VCONSTRAIN |
214 PU_KEYBOARD | PU_MOUSEBUTTON1)) {
215 CenterOverWindow(hwndButtonPopup);
216 PaintRecessedWindow(hwnd,
217 (HPS)0,
218 FALSE,
219 FALSE);
220 }
221 }
222 }
223 break;
224 default:
225 PostMsg(WinWindowFromID(WinQueryWindow(hwnd,QW_PARENT),
226 DIR_CNR),
227 WM_CONTROL,
228 MPFROM2SHORT(DIR_CNR,
229 CN_CONTEXTMENU),
230 MPVOID);
231 break;
232 }
233 }
234MenuAbort:
235 if(msg == UM_CONTEXTMENU)
236 return 0;
237 break;
238
239 case WM_MENUEND:
240 if(hwndButtonPopup == (HWND)mp2) {
241 lastid = WinQueryWindowUShort((HWND)mp2,QWS_ID);
242 WinDestroyWindow(hwndButtonPopup);
243 hwndButtonPopup = (HWND)0;
244 DosQuerySysInfo(QSV_MS_COUNT,
245 QSV_MS_COUNT,
246 &timestamp,
247 sizeof(timestamp));
248 switch(lastid) {
249 case DIR_VIEW:
250 case DIR_SORT:
251 case DIR_FOLDERICON:
252 case DIR_SELECTED:
253 case DIR_MAX:
254 PaintRecessedWindow(hwnd,(HPS)0,TRUE,FALSE);
255 break;
256 }
257 }
258 break;
259
260 case WM_BUTTON3DOWN:
261 case WM_BUTTON1DOWN:
262 case WM_BUTTON3UP:
263 case WM_BUTTON1UP:
264 {
265 USHORT id;
266
267 id = WinQueryWindowUShort(hwnd,QWS_ID);
268 switch(id) {
269 case DIR_FILTER:
270 case DIR_VIEW:
271 case DIR_SORT:
272 case DIR_SELECTED:
273 case DIR_FOLDERICON:
274 case DIR_MAX:
275 return CommonTextButton(hwnd,msg,mp1,mp2);
276 }
277 }
278 break;
279
280 case WM_BUTTON1DBLCLK:
281 {
282 NOTIFYRECORDENTER nr;
283
284 memset(&nr,0,sizeof(NOTIFYRECORDENTER));
285 nr.hwndCnr = WinWindowFromID(WinQueryWindow(hwnd,QW_PARENT),
286 DIR_CNR);
287 WinSendMsg(WinQueryWindow(hwnd,QW_PARENT),
288 WM_CONTROL,
289 MPFROM2SHORT(DIR_CNR,
290 CN_ENTER),
291 MPFROMP(&nr));
292 }
293 break;
294
295 case WM_MOUSEMOVE:
296 {
297 USHORT id = WinQueryWindowUShort(hwnd,QWS_ID);
298 char *s = NULL;
299
300 if(fOtherHelp) {
301 if((!hwndBubble ||
302 WinQueryWindowULong(hwndBubble,QWL_USER) != hwnd) &&
303 !WinQueryCapture(HWND_DESKTOP)) {
304 switch(id) {
305 case DIR_TOTALS:
306 s = GetPString(IDS_DIRCNRTOTALHELP);
307 break;
308 case DIR_SELECTED:
309 s = GetPString(IDS_DIRCNRSELECTEDHELP);
310 break;
311 case DIR_VIEW:
312 s = GetPString(IDS_DIRCNRVIEWHELP);
313 break;
314 case DIR_SORT:
315 s = GetPString(IDS_DIRCNRSORTHELP);
316 break;
317 case DIR_FILTER:
318 s = GetPString(IDS_DIRCNRFILTERHELP);
319 break;
320 case DIR_MAX:
321 s = GetPString(IDS_DIRCNRMAXHELP);
322 break;
323 case DIR_FOLDERICON:
324 s = GetPString(IDS_DIRCNRFOLDERHELP);
325 break;
326 default:
327 break;
328 }
329 if(s)
330 MakeBubble(hwnd,TRUE,s);
331 else if(hwndBubble)
332 WinDestroyWindow(hwndBubble);
333 }
334 }
335 switch(id) {
336 case DIR_MAX:
337 case DIR_FOLDERICON:
338 case DIR_FILTER:
339 case DIR_SORT:
340 case DIR_VIEW:
341 case DIR_SELECTED:
342 return CommonTextButton(hwnd,msg,mp1,mp2);
343 }
344 }
345 break;
346
347 case WM_CHORD:
348 case WM_BUTTON3CLICK:
349 case WM_BUTTON1CLICK:
350 case UM_CLICKED:
351 case UM_CLICKED3:
352 {
353 USHORT id,cmd = 0;
354
355 id = WinQueryWindowUShort(hwnd,QWS_ID);
356 if(msg == UM_CLICKED || msg == UM_CLICKED3) {
357 switch(id) {
358 case DIR_MAX:
359 cmd = IDM_MAXIMIZE;
360 break;
361 case DIR_VIEW:
362 case DIR_SELECTED:
363 case DIR_SORT:
364 PostMsg(hwnd,
365 UM_CONTEXTMENU,
366 MPVOID,
367 MPVOID);
368 break;
369 case DIR_FILTER:
370 cmd = IDM_FILTER;
371 break;
372 default:
373 break;
374 }
375 }
376 else if(id == DIR_FOLDERICON) {
377 if((msg == WM_BUTTON1CLICK && (SHORT2FROMMP(mp2) & KC_CTRL)))
378 cmd = IDM_PREVIOUS;
379 else if(msg == WM_BUTTON3CLICK || msg == WM_CHORD)
380 cmd = IDM_RESCAN;
381 else if(msg == WM_BUTTON1CLICK && (SHORT2FROMMP(mp2) & KC_SHIFT))
382 cmd = IDM_WALKDIR;
383 else if(msg == WM_BUTTON1CLICK && (SHORT2FROMMP(mp2) & KC_ALT))
384 cmd = IDM_WINDOWDLG;
385 else
386 cmd = IDM_PARENT;
387 }
388 if(cmd)
389 PostMsg(WinWindowFromID(WinQueryWindow(hwnd,QW_PARENT),
390 DIR_CNR),
391 WM_COMMAND,
392 MPFROM2SHORT(cmd,0),
393 MPVOID);
394 }
395 if(msg == UM_CLICKED || msg == UM_CLICKED3)
396 return 0;
397 break;
398
399 case DM_DROP:
400 case DM_DRAGOVER:
401 case DM_DRAGLEAVE:
402 case DM_DROPHELP:
403 case WM_BEGINDRAG:
404 if(msg == DM_DRAGOVER) {
405 if(!emphasized) {
406 emphasized = TRUE;
407 DrawTargetEmphasis(hwnd,emphasized);
408 }
409 }
410 else if(msg != WM_BEGINDRAG){
411 if(emphasized) {
412 emphasized = FALSE;
413 DrawTargetEmphasis(hwnd,emphasized);
414 }
415 }
416 switch(WinQueryWindowUShort(hwnd,QWS_ID)) {
417 case DIR_FOLDERICON:
418 switch(msg) {
419 case DM_DRAGOVER:
420 if(AcceptOneDrop(mp1,mp2))
421 return MRFROM2SHORT(DOR_DROP,
422 DO_MOVE);
423 return(MRFROM2SHORT(DOR_NODROP,0)); /* Drop not valid */
424 case DM_DROPHELP:
425 DropHelp(mp1,mp2,hwnd,
426 GetPString(IDS_DIRCNRFOLDERDROPHELP));
427 return 0;
428 case DM_DROP:
429 {
430 char szFrom[CCHMAXPATH + 2];
431
432 if(emphasized) {
433 emphasized = FALSE;
434 DrawTargetEmphasis(hwnd,emphasized);
435 }
436 if(GetOneDrop(mp1,mp2,szFrom,sizeof(szFrom)))
437 WinSendMsg(WinWindowFromID(WinQueryWindow(hwnd,QW_PARENT),
438 DIR_CNR),
439 WM_COMMAND,MPFROM2SHORT(IDM_SWITCH,0),
440 MPFROMP(szFrom));
441 }
442 return 0;
443 default:
444 return PFNWPStatic(hwnd,msg,mp1,mp2);
445 }
446 case DIR_MAX:
447 if(msg == WM_BEGINDRAG)
448 return PFNWPStatic(hwnd,msg,mp1,mp2);
449 default:
450 {
451 CNRDRAGINFO cnd;
452 USHORT dcmd;
453
454 switch(msg) {
455 case DM_DROP:
456 dcmd = CN_DROP;
457 break;
458 case DM_DRAGOVER:
459 dcmd = CN_DRAGOVER;
460 break;
461 case DM_DRAGLEAVE:
462 dcmd = CN_DRAGLEAVE;
463 break;
464 case DM_DROPHELP:
465 dcmd = CN_DROPHELP;
466 break;
467 case WM_BEGINDRAG:
468 dcmd = CN_INITDRAG;
469 break;
470 }
471 memset(&cnd,0,sizeof(cnd));
472 cnd.pDragInfo = (PDRAGINFO)mp1;
473 cnd.pRecord = NULL;
474 return WinSendMsg(WinQueryWindow(hwnd,QW_PARENT),
475 WM_CONTROL,
476 MPFROM2SHORT(DIR_CNR,dcmd),
477 MPFROMP(&cnd));
478 }
479 }
480 }
481 return PFNWPStatic(hwnd,msg,mp1,mp2);
482}
483
484
485MRESULT EXPENTRY DirClientWndProc (HWND hwnd,ULONG msg,MPARAM mp1,
486 MPARAM mp2) {
487
488 switch(msg) {
489 case UM_CONTAINERDIR:
490 if(mp1) {
491
492 DIRCNRDATA *dcd;
493
494 *(CHAR *)mp1 = 0;
495 dcd = WinQueryWindowPtr(WinWindowFromID(hwnd,DIR_CNR),QWL_USER);
496 if(dcd)
497 strcpy((CHAR *)mp1,dcd->directory);
498 return MRFROMLONG(TRUE);
499 }
500 return 0;
501
502 case UM_CONTAINERHWND:
503 return MRFROMLONG(WinWindowFromID(hwnd,DIR_CNR));
504
505 case UM_VIEWSMENU:
506 return MRFROMLONG(CheckMenu(&DirCnrMenu,DIRCNR_POPUP));
507
508 case UM_DRIVECMD:
509 case WM_INITMENU:
510 case UM_FILTER:
511 case UM_INITMENU:
512 case MM_PORTHOLEINIT:
513 case UM_COMMAND:
514 case UM_FILESMENU:
515 case UM_UPDATERECORD:
516 case UM_UPDATERECORDLIST:
517 return WinSendMsg(WinWindowFromID(hwnd,DIR_CNR),msg,mp1,mp2);
518
519
520 case WM_PSETFOCUS:
521 case WM_SETFOCUS:
522 if(mp2)
523 PostMsg(hwnd,UM_FOCUSME,MPVOID,MPVOID);
524 break;
525
526 case UM_FOCUSME:
527 WinSetFocus(HWND_DESKTOP,WinWindowFromID(hwnd,DIR_CNR));
528 break;
529
530 case WM_PAINT:
531 {
532 HPS hps;
533 RECTL rcl;
534
535 hps = WinBeginPaint(hwnd,(HPS)0,NULL);
536 if(hps) {
537 WinQueryWindowRect(hwnd,&rcl);
538 WinFillRect(hps,&rcl,CLR_PALEGRAY);
539 CommonTextPaint(hwnd,hps);
540 WinEndPaint(hps);
541 }
542 }
543 break;
544
545 case UM_SIZE:
546 case WM_SIZE:
547 if(msg == UM_SIZE) {
548
549 SWP swp;
550
551 WinQueryWindowPos(hwnd,&swp);
552 mp1 = MPFROM2SHORT(swp.cx,swp.cy);
553 mp2 = MPFROM2SHORT(swp.cx,swp.cy);
554 }
555 {
556 USHORT cx,cy,bx;
557
558 cx = SHORT1FROMMP(mp2);
559 cy = SHORT2FROMMP(mp2);
560 WinSetWindowPos(WinWindowFromID(hwnd,DIR_CNR),HWND_TOP,
561 0,
562 0,
563 cx,
564 cy - 24,
565 SWP_SHOW | SWP_MOVE | SWP_SIZE);
566 if(WinWindowFromID(hwnd,DIR_MAX) != (HWND)0) {
567 WinSetWindowPos(WinWindowFromID(hwnd,DIR_MAX),HWND_TOP,
568 cx - 22,
569 cy - 22,
570 20,20,SWP_SHOW | SWP_MOVE | SWP_SIZE);
571 cx -= 24;
572 }
573 WinSetWindowPos(WinWindowFromID(hwnd,DIR_FOLDERICON),HWND_TOP,
574 2,
575 cy - 22,
576 24,
577 20,
578 SWP_SHOW | SWP_MOVE | SWP_SIZE);
579 WinSetWindowPos(WinWindowFromID(hwnd,DIR_TOTALS),HWND_TOP,
580 29,
581 cy - 22,
582 (cx / 3) - 2,
583 20,
584 SWP_SHOW | SWP_MOVE | SWP_SIZE);
585 WinSetWindowPos(WinWindowFromID(hwnd,DIR_SELECTED),HWND_TOP,
586 29 + (cx / 3) + 2,
587 cy - 22,
588 (cx / 3) - 2,
589 20,
590 SWP_SHOW | SWP_MOVE | SWP_SIZE);
591 bx = (cx - (29 + (((cx / 3) + 2) * 2))) / 3;
592 WinSetWindowPos(WinWindowFromID(hwnd,DIR_VIEW),HWND_TOP,
593 29 + (((cx / 3) + 2) * 2),
594 cy - 22,
595 bx - 4,
596 20,
597 SWP_SHOW | SWP_MOVE | SWP_SIZE);
598 WinSetWindowPos(WinWindowFromID(hwnd,DIR_SORT),HWND_TOP,
599 29 + (((cx / 3) + 2) * 2) + bx,
600 cy - 22,
601 bx - 4,
602 20,
603 SWP_SHOW | SWP_MOVE | SWP_SIZE);
604 WinSetWindowPos(WinWindowFromID(hwnd,DIR_FILTER),HWND_TOP,
605 29 + (((cx / 3) + 2) * 2) + (bx * 2),
606 cy - 22,
607 bx - 4,
608 20,
609 SWP_SHOW | SWP_MOVE | SWP_SIZE);
610 }
611 CommonTextPaint(hwnd,(HPS)0);
612 if(msg == UM_SIZE) {
613 WinSetWindowPos(WinQueryWindow(hwnd,QW_PARENT),HWND_TOP,0,0,0,0,
614 SWP_SHOW | SWP_ZORDER | SWP_ACTIVATE);
615 return 0;
616 }
617 break;
618
619 case WM_COMMAND:
620 case WM_CONTROL:
621 case WM_CLOSE:
622 return WinSendMsg(WinWindowFromID(hwnd,DIR_CNR),
623 msg,
624 mp1,
625 mp2);
626 }
627 return WinDefWindowProc(hwnd,msg,mp1,mp2);
628}
629
630
631MRESULT EXPENTRY DirObjWndProc (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2) {
632
633 DIRCNRDATA *dcd;
634
635 switch(msg) {
636 case WM_CREATE:
637 break;
638
639 case DM_PRINTOBJECT:
640 return MRFROMLONG(DRR_TARGET);
641
642 case DM_DISCARDOBJECT:
643 dcd = INSTDATA(hwnd);
644 if(fFM2Deletes && dcd) {
645
646 LISTINFO *li;
647 CNRDRAGINFO cni;
648
649 cni.pRecord = NULL;
650 cni.pDragInfo = (PDRAGINFO)mp1;
651 li = DoFileDrop(dcd->hwndCnr,dcd->directory,FALSE,MPVOID,MPFROMP(&cni));
652 if(li) {
653 li->type = (fDefaultDeletePerm) ? IDM_PERMDELETE : IDM_DELETE;
654 if(!PostMsg(hwnd,UM_MASSACTION,MPFROMP(li),MPVOID))
655 FreeListInfo(li);
656 else
657 return MRFROMLONG(DRR_SOURCE);
658 }
659 }
660 return MRFROMLONG(DRR_TARGET);
661
662 case UM_UPDATERECORDLIST:
663 dcd = WinQueryWindowPtr(hwnd,QWL_USER);
664 if(dcd && mp1) {
665
666 INT numentries = 0;
667 CHAR **list = (CHAR **)mp1;
668
669 while(list[numentries])
670 numentries++;
671 if(numentries)
672 UpdateCnrList(dcd->hwndCnr,
673 list,
674 numentries,
675 TRUE,
676 dcd);
677 }
678 return 0;
679
680 case UM_SETUP:
681 dcd = WinQueryWindowPtr(hwnd,QWL_USER);
682 if(dcd) {
683 /* set unique id */
684 WinSetWindowUShort(hwnd,
685 QWS_ID,
686 DIROBJ_FRAME + (DIR_FRAME - dcd->id));
687 dcd->hwndObject = hwnd;
688 if(ParentIsDesktop(hwnd,dcd->hwndParent))
689 DosSleep(250L);
690 }
691 else
692 PostMsg(hwnd,WM_CLOSE,MPVOID,MPVOID);
693 return 0;
694
695 case UM_RESCAN2:
696 dcd = WinQueryWindowPtr(hwnd,QWL_USER);
697 if(dcd && dcd->hwndFrame == WinQueryActiveWindow(dcd->hwndParent)) {
698
699 FSALLOCATE fsa;
700 CHAR s[CCHMAXPATH * 2],tf[81],tb[81],fbytes[81];
701
702 DosError(FERR_DISABLEHARDERR);
703 if(!DosQueryFSInfo(toupper(*dcd->directory) - '@',
704 FSIL_ALLOC,&fsa,sizeof(FSALLOCATE))) {
705 strcpy(fbytes," {");
706 commafmt(fbytes + 3,sizeof(fbytes) - 5,
707 (ULONG)(((float)fsa.cUnitAvail *
708 (fsa.cSectorUnit * fsa.cbSector)) / 1024L));
709 strcat(fbytes,GetPString(IDS_KFREETEXT));
710 strcat(fbytes,"}");
711 }
712 else
713 *fbytes = 0;
714 commafmt(tf,sizeof(tf),dcd->totalfiles);
715 commafmt(tb,sizeof(tb),dcd->totalbytes);
716 if(!fMoreButtons)
717 sprintf(s," [%s / %sb]%s%s%s%s %s",tf,tb,
718 fbytes,
719 (*dcd->mask.szMask || dcd->mask.antiattr ||
720 dcd->mask.attrFile != ALLATTRS) ? " (" : NullStr,
721 (*dcd->mask.szMask) ? dcd->mask.szMask :
722 (dcd->mask.antiattr ||
723 dcd->mask.attrFile != ALLATTRS) ?
724 GetPString(IDS_ALLTEXT) : NullStr,
725 (*dcd->mask.szMask || dcd->mask.antiattr ||
726 dcd->mask.attrFile != ALLATTRS) ? ")" : NullStr,
727 dcd->directory);
728 else
729 sprintf(s," [%s / %sb]%s %s",tf,tb,fbytes,
730 dcd->directory);
731 if(dcd->hwndFrame == WinQueryActiveWindow(dcd->hwndParent))
732 WinSetWindowText(hwndStatus,s);
733 }
734 return 0;
735
736 case UM_FLESH:
737 dcd = WinQueryWindowPtr(hwnd,QWL_USER);
738 if(dcd) {
739
740 PCNRITEM pci,pciC;
741
742 pci = WinSendMsg(dcd->hwndCnr,
743 CM_QUERYRECORD,
744 MPVOID,
745 MPFROM2SHORT(CMA_FIRST,CMA_ITEMORDER));
746 while(pci && (INT)pci != -1) {
747 if(pci->attrFile & FILE_DIRECTORY) {
748 pciC = WinSendMsg(dcd->hwndCnr,
749 CM_QUERYRECORD,
750 MPFROMP(pci),
751 MPFROM2SHORT(CMA_FIRSTCHILD,CMA_ITEMORDER));
752 if(!pciC) {
753 Stubby(dcd->hwndCnr,pci);
754 DosSleep(0L);
755 }
756 }
757 pci = WinSendMsg(dcd->hwndCnr,
758 CM_QUERYRECORD,
759 MPFROMP(pci),
760 MPFROM2SHORT(CMA_NEXT,CMA_ITEMORDER));
761 }
762 dcd->firsttree = TRUE;
763 }
764 return 0;
765
766 case UM_RESCAN:
767 /*
768 * populate container
769 */
770 dcd = WinQueryWindowPtr(hwnd,QWL_USER);
771 if(dcd) {
772 DosEnterCritSec();
773 if(dcd->stopflag)
774 dcd->stopflag--;
775 if(dcd->stopflag) {
776 DosExitCritSec();
777 return 0;
778 }
779 DosExitCritSec();
780 if(mp1) {
781 strcpy(dcd->previous,dcd->directory);
782 strcpy(dcd->directory,(CHAR *)mp1);
783 }
784 MakeValidDir(dcd->directory);
785 {
786 CHAR s[CCHMAXPATH + 8];
787
788 sprintf(s,
789 "%s%s%s",
790 (ParentIsDesktop(dcd->hwndFrame,(HWND)0)) ?
791 "VDir" :
792 NullStr,
793 (ParentIsDesktop(dcd->hwndFrame,(HWND)0)) ?
794 (!dcd->dontclose) ?
795 " Master: " :
796 ": " :
797 NullStr,
798 dcd->directory);
799 WinSetWindowText(dcd->hwndFrame,
800 s);
801 WinSetWindowText(WinWindowFromID(dcd->hwndFrame,FID_TITLEBAR),
802 s);
803 }
804 WinSendMsg(dcd->hwndCnr,
805 CM_REMOVERECORD,
806 MPVOID,
807 MPFROM2SHORT(0,CMA_FREE | CMA_INVALIDATE | CMA_ERASE));
808 AdjustCnrColsForFSType(dcd->hwndCnr,
809 dcd->directory,
810 dcd);
811 dcd->totalbytes = dcd->totalfiles =
812 dcd->selectedfiles = dcd->selectedbytes = 0;
813 WinSetDlgItemText(dcd->hwndClient,
814 DIR_TOTALS,
815 "0 / 0k");
816 WinSetDlgItemText(dcd->hwndClient,
817 DIR_SELECTED,
818 "0 / 0k");
819 if(hwndStatus &&
820 dcd->hwndFrame == WinQueryActiveWindow(dcd->hwndParent)) {
821 WinSetWindowText(hwndStatus,
822 GetPString(IDS_SCANNINGTEXT));
823 if(hwndMain)
824 WinSendMsg(hwndMain,
825 UM_LOADFILE,
826 MPVOID,
827 MPVOID);
828 }
829 if(fSwitchTree && hwndTree) {
830 if(hwndMain) {
831 if(TopWindow(hwndMain,
832 (HWND)0) == dcd->hwndFrame)
833 WinSendMsg(hwndTree,
834 UM_SHOWME,
835 MPFROMP(dcd->directory),
836 MPVOID);
837 }
838 else
839 WinSendMsg(hwndTree,
840 UM_SHOWME,
841 MPFROMP(dcd->directory),
842 MPVOID);
843 }
844 dcd->firsttree = FALSE;
845 dcd->totalbytes = FillDirCnr(dcd->hwndCnr,
846 dcd->directory,
847 dcd);
848 PostMsg(dcd->hwndCnr,
849 UM_RESCAN,
850 MPVOID,
851 MPVOID);
852 if(mp2 &&
853 !fLeaveTree &&
854 (dcd->flWindowAttr & CV_TREE)) {
855
856 ULONG flWindowAttr = dcd->flWindowAttr;
857 CNRINFO cnri;
858
859 flWindowAttr &= (~(CV_NAME | CV_TREE | CV_ICON | CV_DETAIL | CV_TEXT));
860 if(dcd->lastattr) {
861 if(dcd->lastattr & CV_TEXT)
862 flWindowAttr |= CV_TEXT;
863 else if(dcd->lastattr & CV_DETAIL)
864 flWindowAttr |= CV_DETAIL;
865 else if(dcd->lastattr & CV_ICON)
866 flWindowAttr |= CV_ICON;
867 else
868 flWindowAttr |= CV_NAME;
869 }
870 else
871 flWindowAttr |= CV_NAME;
872 flWindowAttr |= CV_FLOW;
873 memset(&cnri,0,sizeof(CNRINFO));
874 cnri.cb = sizeof(CNRINFO);
875 if(WinSendMsg(dcd->hwndCnr,CM_QUERYCNRINFO,MPFROMP(&cnri),
876 MPFROMLONG(sizeof(CNRINFO)))) {
877 dcd->flWindowAttr = cnri.flWindowAttr = flWindowAttr;
878 WinSendMsg(dcd->hwndCnr,CM_SETCNRINFO,
879 MPFROMP(&cnri),
880 MPFROMLONG(CMA_FLWINDOWATTR));
881 SayView(WinWindowFromID(dcd->hwndClient,
882 DIR_VIEW),dcd->flWindowAttr);
883 }
884 }
885 if(dcd->flWindowAttr & CV_TREE)
886 PostMsg(dcd->hwndObject,UM_FLESH,MPVOID,MPVOID);
887 if(*dcd->previous) {
888 if(strlen(dcd->previous) > strlen(dcd->directory) &&
889 !strnicmp(dcd->directory,dcd->previous,strlen(dcd->directory))) {
890
891 PCNRITEM pci;
892
893 pci = FindCnrRecord(dcd->hwndCnr,
894 dcd->previous,
895 NULL,
896 TRUE,
897 FALSE,
898 TRUE);
899 if(pci && (INT)pci != -1) {
900 /* make found item current (cursored) item */
901 WinSendMsg(dcd->hwndCnr,CM_SETRECORDEMPHASIS,MPFROMP(pci),
902 MPFROM2SHORT(TRUE,CRA_CURSORED));
903 /* make sure that record shows in viewport */
904 ShowCnrRecord(dcd->hwndCnr,(PMINIRECORDCORE)pci);
905 }
906 }
907 }
908 }
909 return 0;
910
911 case UM_COMMAND:
912 if(mp1) {
913
914 LISTINFO *li = (LISTINFO *)mp1;
915
916 switch(li->type) {
917 case IDM_DOITYOURSELF:
918 case IDM_APPENDTOCLIP:
919 case IDM_SAVETOCLIP:
920 case IDM_ARCHIVE:
921 case IDM_ARCHIVEM:
922 case IDM_VIEWTEXT:
923 case IDM_VIEWBINARY:
924 case IDM_VIEWARCHIVE:
925 case IDM_VIEW:
926 case IDM_EDITTEXT:
927 case IDM_EDITBINARY:
928 case IDM_EDIT:
929 case IDM_OBJECT:
930 case IDM_SHADOW:
931 case IDM_SHADOW2:
932 case IDM_PRINT:
933 case IDM_ATTRS:
934 case IDM_DELETE:
935 case IDM_PERMDELETE:
936 case IDM_MCIPLAY:
937 case IDM_UPDATE:
938 if(PostMsg(hwnd,
939 UM_MASSACTION,
940 mp1,
941 mp2))
942 return (MRESULT)TRUE;
943 break;
944 default:
945 if(PostMsg(hwnd,
946 UM_ACTION,
947 mp1,
948 mp2))
949 return (MRESULT)TRUE;
950 }
951 }
952 return 0;
953
954 case UM_SELECT:
955 dcd = WinQueryWindowPtr(hwnd,QWL_USER);
956 if(dcd) {
957 switch(SHORT1FROMMP(mp1)) {
958 case IDM_SELECTBOTH:
959 case IDM_SELECTONE:
960 case IDM_SELECTMORE:
961 case IDM_SELECTNEWER:
962 case IDM_SELECTOLDER:
963 case IDM_SELECTBIGGER:
964 case IDM_SELECTSMALLER:
965 case IDM_DESELECTBOTH:
966 case IDM_DESELECTONE:
967 case IDM_DESELECTMORE:
968 case IDM_DESELECTNEWER:
969 case IDM_DESELECTOLDER:
970 case IDM_DESELECTBIGGER:
971 case IDM_DESELECTSMALLER:
972 SpecialSelect2(dcd->hwndParent,SHORT1FROMMP(mp1));
973 break;
974 case IDM_SELECTLIST:
975 {
976 CHAR filename[CCHMAXPATH],*p,*pp;
977 ULONG size;
978
979 strcpy(filename,"*.LST");
980 size = CCHMAXPATH;
981 PrfQueryProfileData(fmprof,appname,"SaveToListName",
982 filename,&size);
983 pp = strrchr(filename,'\\');
984 if(!pp)
985 pp = filename;
986 p = strrchr(pp,'.');
987 if(p && *(p + 1) && p > pp + 1) {
988 if(pp > filename)
989 pp++;
990 *pp = '*';
991 pp++;
992 if(p > pp)
993 memmove(pp,p,strlen(p) + 1);
994 }
995 if(insert_filename(hwnd,filename,FALSE,FALSE))
996 SelectList(dcd->hwndCnr,TRUE,FALSE,FALSE,NULL,filename,NULL);
997 }
998 break;
999 case IDM_SELECTALL:
1000 SelectAll(dcd->hwndCnr,TRUE,TRUE,NULL,NULL,FALSE);
1001 break;
1002 case IDM_DESELECTALL:
1003 DeselectAll(dcd->hwndCnr,TRUE,TRUE,NULL,NULL,FALSE);
1004 break;
1005 case IDM_SELECTALLFILES:
1006 SelectAll(dcd->hwndCnr,TRUE,FALSE,NULL,NULL,FALSE);
1007 break;
1008 case IDM_DESELECTALLFILES:
1009 DeselectAll(dcd->hwndCnr,TRUE,FALSE,NULL,NULL,FALSE);
1010 break;
1011 case IDM_SELECTALLDIRS:
1012 SelectAll(dcd->hwndCnr,FALSE,TRUE,NULL,NULL,FALSE);
1013 break;
1014 case IDM_DESELECTALLDIRS:
1015 DeselectAll(dcd->hwndCnr,FALSE,TRUE,NULL,NULL,FALSE);
1016 break;
1017 case IDM_DESELECTMASK:
1018 case IDM_SELECTMASK:
1019 {
1020 MASK mask;
1021 PCNRITEM pci = (PCNRITEM)mp2;
1022
1023 memset(&mask,0,sizeof(MASK));
1024 mask.fNoAttribs = TRUE;
1025 mask.fNoDirs = TRUE;
1026 mask.fText = TRUE;
1027 strcpy(mask.prompt,
1028 GetPString((SHORT1FROMMP(mp1) == IDM_SELECTMASK) ?
1029 IDS_SELECTFILTERTEXT :
1030 IDS_DESELECTFILTERTEXT));
1031 if(pci && (INT)pci != -1)
1032 strcpy(mask.szMask,pci->szFileName);
1033 if(WinDlgBox(HWND_DESKTOP,
1034 dcd->hwndCnr,
1035 PickMaskDlgProc,
1036 FM3ModHandle,
1037 MSK_FRAME,
1038 MPFROMP(&mask))) {
1039 if(SHORT1FROMMP(mp1) == IDM_SELECTMASK)
1040 SelectAll(dcd->hwndCnr,
1041 TRUE,
1042 TRUE,
1043 mask.szMask,
1044 mask.szText,
1045 FALSE);
1046 else
1047 DeselectAll(dcd->hwndCnr,
1048 TRUE,
1049 TRUE,
1050 mask.szMask,
1051 mask.szText,
1052 FALSE);
1053 }
1054 }
1055 break;
1056
1057 case IDM_DESELECTCLIP:
1058 case IDM_SELECTCLIP:
1059 {
1060 CHAR **list;
1061
1062 list = ListFromClipboard(hwnd);
1063 if(list) {
1064 SelectList(dcd->hwndCnr,TRUE,FALSE,
1065 (SHORT1FROMMP(mp1) == IDM_DESELECTCLIP),
1066 NULL,NULL,list);
1067 FreeList(list);
1068 }
1069 }
1070 break;
1071
1072 case IDM_INVERT:
1073 InvertAll(dcd->hwndCnr);
1074 break;
1075 }
1076 }
1077 return 0;
1078
1079 case UM_MASSACTION:
1080 if(mp1) {
1081
1082 dcd = WinQueryWindowPtr(hwnd,QWL_USER);
1083 if(dcd) {
1084
1085 WORKER *wk;
1086
1087 wk = malloc(sizeof(WORKER));
1088 if(wk) {
1089 memset(wk,0,sizeof(WORKER));
1090 wk->size = sizeof(WORKER);
1091 wk->hwndCnr = dcd->hwndCnr;
1092 wk->hwndParent = dcd->hwndParent;
1093 wk->hwndFrame = dcd->hwndFrame;
1094 wk->hwndClient = dcd->hwndClient;
1095 wk->li = (LISTINFO *)mp1;
1096 strcpy(wk->directory,dcd->directory);
1097 if(_beginthread(MassAction,NULL,122880,(PVOID)wk) == -1) {
1098 free(wk);
1099 FreeListInfo((LISTINFO *)mp1);
1100 }
1101 }
1102 else
1103 FreeListInfo((LISTINFO *)mp1);
1104 }
1105 }
1106 return 0;
1107
1108 case UM_ACTION:
1109 if(mp1) {
1110
1111 dcd = WinQueryWindowPtr(hwnd,QWL_USER);
1112 if(dcd) {
1113
1114 WORKER *wk;
1115
1116 wk = malloc(sizeof(WORKER));
1117 if(wk) {
1118 memset(wk,0,sizeof(WORKER));
1119 wk->size = sizeof(WORKER);
1120 wk->hwndCnr = dcd->hwndCnr;
1121 wk->hwndParent = dcd->hwndParent;
1122 wk->hwndFrame = dcd->hwndFrame;
1123 wk->hwndClient = dcd->hwndClient;
1124 wk->li = (LISTINFO *)mp1;
1125 strcpy(wk->directory,dcd->directory);
1126 if(_beginthread(Action,NULL,122880,(PVOID)wk) == -1) {
1127 free(wk);
1128 FreeListInfo((LISTINFO *)mp1);
1129 }
1130 }
1131 else
1132 FreeListInfo((LISTINFO *)mp1);
1133 }
1134 }
1135 return 0;
1136
1137 case WM_CLOSE:
1138 WinDestroyWindow(hwnd);
1139 break;
1140
1141 case WM_DESTROY:
1142 dcd = WinQueryWindowPtr(hwnd,QWL_USER);
1143 if(dcd) {
1144 if(dcd->hwndRestore)
1145 WinSetWindowPos(dcd->hwndRestore,
1146 HWND_TOP,
1147 0,
1148 0,
1149 0,
1150 0,
1151 SWP_RESTORE | SWP_SHOW | SWP_ACTIVATE | SWP_ZORDER);
1152 FreeList(dcd->lastselection);
1153 free(dcd);
1154 DosPostEventSem(CompactSem);
1155 }
1156 if(!PostMsg((HWND)0,
1157 WM_QUIT,
1158 MPVOID,
1159 MPVOID))
1160 WinSendMsg((HWND)0,
1161 WM_QUIT,
1162 MPVOID,
1163 MPVOID);
1164 break;
1165 }
1166 return WinDefWindowProc(hwnd,msg,mp1,mp2);
1167}
1168
1169
1170MRESULT EXPENTRY DirCnrWndProc (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2) {
1171
1172 ULONG ulrc;
1173 DIRCNRDATA *dcd = WinQueryWindowPtr(hwnd,QWL_USER);
1174
1175 switch(msg) {
1176 case DM_PRINTOBJECT:
1177 return MRFROMLONG(DRR_TARGET);
1178
1179 case DM_DISCARDOBJECT:
1180 if(dcd)
1181 return WinSendMsg(dcd->hwndObject,msg,mp1,mp2);
1182 else
1183 return MRFROMLONG(DRR_TARGET);
1184
1185 case WM_CHAR:
1186 shiftstate = (SHORT1FROMMP(mp1) & (KC_SHIFT | KC_ALT | KC_CTRL));
1187 if(SHORT1FROMMP(mp1) & KC_KEYUP)
1188 return (MRESULT)TRUE;
1189 if(SHORT1FROMMP(mp1) & KC_VIRTUALKEY) {
1190 switch(SHORT2FROMMP(mp2)) {
1191 case VK_INSERT:
1192 if((shiftstate & KC_CTRL) == KC_CTRL)
1193 PostMsg(hwnd,
1194 WM_COMMAND,
1195 MPFROM2SHORT(IDM_MKDIR,0),
1196 MPVOID);
1197 else if((shiftstate & KC_ALT) == KC_ALT)
1198 PostMsg(hwnd,
1199 WM_COMMAND,
1200 MPFROM2SHORT(IDM_CREATE,0),
1201 MPVOID);
1202 break;
1203 case VK_PAGEUP:
1204 if((shiftstate & KC_CTRL) == KC_CTRL)
1205 PostMsg(hwnd,
1206 WM_COMMAND,
1207 MPFROM2SHORT(IDM_PARENT,0),
1208 MPVOID);
1209 break;
1210 case VK_PAGEDOWN:
1211 if((shiftstate & KC_CTRL) == KC_CTRL)
1212 PostMsg(hwnd,
1213 WM_COMMAND,
1214 MPFROM2SHORT(IDM_PREVIOUS,0),
1215 MPVOID);
1216 break;
1217 case VK_HOME:
1218 if((shiftstate & KC_CTRL) == KC_CTRL && dcd) {
1219
1220 CHAR s[CCHMAXPATH],*p;
1221
1222 strcpy(s,dcd->directory);
1223 p = strchr(s,'\\');
1224 if(p) {
1225 p++;
1226 *p = 0;
1227 WinSendMsg(hwnd,
1228 UM_SETDIR,
1229 MPFROMP(s),
1230 MPVOID);
1231 }
1232 }
1233 break;
1234 case VK_DELETE:
1235 if((shiftstate & KC_CTRL) == KC_CTRL)
1236 PostMsg(hwnd,WM_COMMAND,MPFROM2SHORT(IDM_PERMDELETE,0),MPVOID);
1237 else if((shiftstate & KC_SHIFT) == KC_SHIFT)
1238 PostMsg(hwnd,WM_COMMAND,MPFROM2SHORT(IDM_SAVETOCLIP,0),MPVOID);
1239 else
1240 PostMsg(hwnd,WM_COMMAND,MPFROM2SHORT(IDM_DELETE,0),MPVOID);
1241 break;
1242 }
1243 }
1244 if(shiftstate || fNoSearch)
1245 break;
1246 if(SHORT1FROMMP(mp1) & KC_CHAR) {
1247
1248 ULONG thistime,len;
1249 SEARCHSTRING srch;
1250 PCNRITEM pci;
1251
1252 if(!dcd)
1253 break;
1254 switch(SHORT1FROMMP(mp2)) {
1255 case '\x1b':
1256 case '\r':
1257 case '\n':
1258 dcd->lasttime = 0;
1259 *dcd->comnam = 0;
1260 break;
1261 default:
1262 thistime = WinQueryMsgTime(WinQueryAnchorBlock(hwnd));
1263 if(thistime > dcd->lasttime + 1250)
1264 *dcd->comnam = 0;
1265 dcd->lasttime = thistime;
1266 if(SHORT1FROMMP(mp2) == ' ' && !dcd->comnam)
1267 break;
1268KbdRetry:
1269 len = strlen(dcd->comnam);
1270 if(len >= CCHMAXPATH - 1) {
1271 *dcd->comnam = 0;
1272 len = 0;
1273 }
1274 dcd->comnam[len] = toupper(SHORT1FROMMP(mp2));
1275 dcd->comnam[len + 1] = 0;
1276 memset(&srch,0,sizeof(SEARCHSTRING));
1277 srch.cb = (ULONG)sizeof(SEARCHSTRING);
1278 srch.pszSearch = (PSZ)dcd->comnam;
1279 srch.fsPrefix = TRUE;
1280 srch.fsCaseSensitive = FALSE;
1281 srch.usView = CV_ICON;
1282 pci = WinSendMsg(hwnd,CM_SEARCHSTRING,MPFROMP(&srch),
1283 MPFROMLONG(CMA_FIRST));
1284 if(pci && (INT)pci != -1) {
1285
1286 USHORT attrib = CRA_CURSORED;
1287
1288 /* make found item current item */
1289 if(!stricmp(pci->pszFileName,dcd->comnam))
1290 attrib |= CRA_SELECTED;
1291 WinSendMsg(hwnd,CM_SETRECORDEMPHASIS,MPFROMP(pci),
1292 MPFROM2SHORT(TRUE,attrib));
1293 /* make sure that record shows in viewport */
1294 ShowCnrRecord(hwnd,(PMINIRECORDCORE)pci);
1295 return (MRESULT)TRUE;
1296 }
1297 else {
1298 if(SHORT1FROMMP(mp2) == ' ') {
1299 dcd->comnam[len] = 0;
1300 break;
1301 }
1302 *dcd->comnam = 0;
1303 dcd->lasttime = 0;
1304 if(len) // retry as first letter if no match
1305 goto KbdRetry;
1306 }
1307 break;
1308 }
1309 }
1310 break;
1311
1312 case WM_MOUSEMOVE:
1313 case WM_BUTTON1UP:
1314 case WM_BUTTON2UP:
1315 case WM_BUTTON3UP:
1316 case WM_CHORD:
1317 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
1318 break;
1319
1320 case WM_BUTTON1MOTIONEND:
1321 {
1322 CNRINFO cnri;
1323
1324 memset(&cnri,0,sizeof(CNRINFO));
1325 cnri.cb = sizeof(CNRINFO);
1326 if(WinSendMsg(hwnd,CM_QUERYCNRINFO,MPFROMP(&cnri),
1327 MPFROMLONG(sizeof(CNRINFO)))) {
1328 if(cnri.flWindowAttr & CV_DETAIL)
1329 PrfWriteProfileData(fmprof,appname,"CnrSplitBar",
1330 (PVOID)&cnri.xVertSplitbar,sizeof(LONG));
1331 }
1332 }
1333 break;
1334
1335 case UM_COMPARE:
1336 if(dcd && mp1 && mp2) {
1337
1338 COMPARE *cmp;
1339 CHAR *leftdir = (CHAR *)mp1,*rightdir = (CHAR *)mp2;
1340
1341 if(!IsFile(leftdir) &&
1342 !IsFile(rightdir)) {
1343 cmp = malloc(sizeof(COMPARE));
1344 if(cmp) {
1345 memset(cmp,0,sizeof(COMPARE));
1346 cmp->size = sizeof(COMPARE);
1347 strcpy(cmp->leftdir,leftdir);
1348 strcpy(cmp->rightdir,rightdir);
1349 cmp->hwndParent = dcd->hwndParent;
1350 cmp->dcd.hwndParent = dcd->hwndParent;
1351 WinDlgBox(HWND_DESKTOP,
1352 HWND_DESKTOP,
1353 CompareDlgProc,
1354 FM3ModHandle,
1355 COMP_FRAME,
1356 MPFROMP(cmp));
1357 }
1358 }
1359 }
1360 return 0;
1361
1362 case WM_PRESPARAMCHANGED:
1363 PresParamChanged(hwnd,
1364 "DirCnr",
1365 mp1,
1366 mp2);
1367 break;
1368
1369 case UM_UPDATERECORDLIST:
1370 if(dcd && mp1)
1371 WinSendMsg(dcd->hwndObject,
1372 msg,
1373 mp1,
1374 mp2);
1375 return 0;
1376
1377 case UM_UPDATERECORD:
1378 if(dcd && mp1) {
1379
1380 CHAR *filename;
1381
1382 filename = mp1;
1383 if(filename)
1384 UpdateCnrRecord(hwnd,
1385 filename,
1386 TRUE,
1387 dcd);
1388 }
1389 return 0;
1390
1391 case WM_SETFOCUS:
1392 /*
1393 * put name of our window (directory name) on status line
1394 */
1395 if(dcd && hwndStatus && mp2) {
1396
1397 PCNRITEM pci = NULL;
1398
1399 if(fAutoView && hwndMain) {
1400 pci = WinSendMsg(hwnd,CM_QUERYRECORDEMPHASIS,MPFROMLONG(CMA_FIRST),
1401 MPFROMSHORT(CRA_CURSORED));
1402 if(pci && (INT)pci != -1 &&
1403 (!(driveflags[toupper(*pci->szFileName) - 'A'] & DRIVE_SLOW)))
1404 WinSendMsg(hwndMain,
1405 UM_LOADFILE,
1406 MPFROMP(pci->szFileName),
1407 MPVOID);
1408 else
1409 WinSendMsg(hwndMain,
1410 UM_LOADFILE,
1411 MPVOID,
1412 MPVOID);
1413 }
1414 if(*dcd->directory) {
1415 if(hwndMain)
1416 WinSendMsg(hwndMain,
1417 UM_SETUSERLISTNAME,
1418 MPFROMP(dcd->directory),
1419 MPVOID);
1420 else
1421 add_udir(FALSE,dcd->directory);
1422 }
1423 if(hwndMain)
1424 PostMsg(hwndMain,
1425 UM_ADVISEFOCUS,
1426 MPFROMLONG(dcd->hwndFrame),
1427 MPVOID);
1428 }
1429 if(mp2) {
1430 LastDir = hwnd;
1431 PostMsg(hwnd,
1432 UM_RESCAN,
1433 MPVOID,
1434 MPVOID);
1435 if(fSwitchTreeOnFocus &&
1436 hwndTree &&
1437 dcd &&
1438 *dcd->directory)
1439 WinSendMsg(hwndTree,
1440 UM_SHOWME,
1441 MPFROMP(dcd->directory),
1442 MPVOID);
1443 }
1444 break;
1445
1446 case UM_SETDIR:
1447 if(dcd && mp1) {
1448
1449 CHAR fullname[CCHMAXPATH];
1450
1451 DosError(FERR_DISABLEHARDERR);
1452 if(!DosQueryPathInfo((CHAR *)mp1,
1453 FIL_QUERYFULLNAME,
1454 fullname,
1455 sizeof(fullname))) {
1456 if(stricmp(dcd->directory,fullname)) {
1457 strcpy(dcd->previous,dcd->directory);
1458 strcpy(dcd->directory,fullname);
1459 DosEnterCritSec();
1460 dcd->stopflag++;
1461 DosExitCritSec();
1462 if(!PostMsg(dcd->hwndObject,
1463 UM_RESCAN,
1464 MPVOID,
1465 MPFROMLONG(1L))) {
1466 strcpy(dcd->directory,dcd->previous);
1467 DosEnterCritSec();
1468 dcd->stopflag--;
1469 DosExitCritSec();
1470 }
1471 else if(*dcd->directory) {
1472 if(hwndMain)
1473 WinSendMsg(hwndMain,
1474 UM_SETUSERLISTNAME,
1475 MPFROMP(dcd->directory),
1476 MPVOID);
1477 else
1478 add_udir(FALSE,
1479 dcd->directory);
1480 }
1481 }
1482 }
1483 }
1484 break;
1485
1486 case UM_RESCAN:
1487 if(dcd) {
1488
1489 CNRINFO cnri;
1490 CHAR s[CCHMAXPATH * 2],tf[81],tb[81];
1491 PCNRITEM pci;
1492
1493 memset(&cnri,0,sizeof(CNRINFO));
1494 cnri.cb = sizeof(CNRINFO);
1495 WinSendMsg(hwnd,
1496 CM_QUERYCNRINFO,
1497 MPFROMP(&cnri),
1498 MPFROMLONG(sizeof(CNRINFO)));
1499 cnri.pszCnrTitle = dcd->directory;
1500 WinSendMsg(hwnd,
1501 CM_SETCNRINFO,
1502 MPFROMP(&cnri),
1503 MPFROMLONG(CMA_CNRTITLE));
1504 dcd->totalfiles = cnri.cRecords;
1505 commafmt(tb,sizeof(tb),dcd->totalfiles);
1506 if(dcd->totalbytes < 1024)
1507 commafmt(tf,sizeof(tf),dcd->totalbytes);
1508 else
1509 commafmt(tf,sizeof(tf),dcd->totalbytes / 1024L);
1510 sprintf(s,"%s / %s%s",tb,tf,(dcd->totalbytes < 1024) ? "b" : "k");
1511 WinSetDlgItemText(dcd->hwndClient,DIR_TOTALS,s);
1512 commafmt(tb,sizeof(tb),dcd->selectedfiles);
1513 if(dcd->selectedbytes < 1024)
1514 commafmt(tf,sizeof(tf),dcd->selectedbytes);
1515 else
1516 commafmt(tf,sizeof(tf),dcd->selectedbytes / 1024L);
1517 sprintf(s,"%s / %s%s",tb,tf,(dcd->selectedbytes < 1024) ? "b" : "k");
1518 WinSetDlgItemText(dcd->hwndClient,DIR_SELECTED,s);
1519 if(hwndStatus &&
1520 dcd->hwndFrame == WinQueryActiveWindow(dcd->hwndParent)) {
1521 PostMsg(dcd->hwndObject,
1522 UM_RESCAN2,
1523 MPVOID,
1524 MPVOID);
1525 if((fSplitStatus &&
1526 hwndStatus2) ||
1527 fMoreButtons) {
1528 pci = WinSendMsg(hwnd,
1529 CM_QUERYRECORDEMPHASIS,
1530 MPFROMLONG(CMA_FIRST),
1531 MPFROMSHORT(CRA_CURSORED));
1532 if(pci && (INT)pci != -1) {
1533 if(fSplitStatus &&
1534 hwndStatus2) {
1535 commafmt(tb,sizeof(tb),pci->cbFile + pci->easize);
1536 if(!fMoreButtons)
1537 sprintf(s,
1538 " %sb %04u/%02u/%02u %02u:%02u:%02u [%s] %s",
1539 tb,
1540 pci->date.year,
1541 pci->date.month,
1542 pci->date.day,
1543 pci->time.hours,
1544 pci->time.minutes,
1545 pci->time.seconds,
1546 pci->pszDispAttr,
1547 pci->pszFileName);
1548 else {
1549 *tf = 0;
1550 if(pci->cbFile + pci->easize > 1024)
1551 commafmt(tf,sizeof(tf),
1552 (pci->cbFile + pci->easize) / 1024);
1553 sprintf(s,
1554 GetPString(IDS_STATUSSIZETEXT),
1555 tb,
1556 (*tf) ? " (" : NullStr,
1557 tf,
1558 (*tf) ? "k)" : NullStr);
1559 }
1560 WinSetWindowText(hwndStatus2,s);
1561 }
1562 else
1563 WinSetWindowText(hwndStatus2,NullStr);
1564 if(fMoreButtons) {
1565 WinSetWindowText(hwndName,pci->pszFileName);
1566 sprintf(s,
1567 "%04u/%02u/%02u %02u:%02u:%02u",
1568 pci->date.year,
1569 pci->date.month,
1570 pci->date.day,
1571 pci->time.hours,
1572 pci->time.minutes,
1573 pci->time.seconds);
1574 WinSetWindowText(hwndDate,s);
1575 WinSetWindowText(hwndAttr,pci->pszDispAttr);
1576 }
1577 }
1578 else {
1579 WinSetWindowText(hwndStatus2,NullStr);
1580 WinSetWindowText(hwndName,NullStr);
1581 WinSetWindowText(hwndDate,NullStr);
1582 WinSetWindowText(hwndAttr,NullStr);
1583 }
1584 }
1585 }
1586 }
1587 return 0;
1588
1589 case UM_SORTRECORD:
1590 if(dcd) {
1591
1592 CNRINFO cnri;
1593
1594 memset(&cnri,0,sizeof(CNRINFO));
1595 cnri.cb = sizeof(CNRINFO);
1596 WinSendMsg(hwnd,
1597 CM_QUERYCNRINFO,
1598 MPFROMP(&cnri),
1599 MPFROMLONG(sizeof(CNRINFO)));
1600 cnri.pSortRecord = (PVOID)SortDirCnr;
1601 WinSendMsg(hwnd,
1602 CM_SETCNRINFO,
1603 MPFROMP(&cnri),
1604 MPFROMLONG(CMA_PSORTRECORD));
1605 WinSendMsg(hwnd,
1606 CM_SORTRECORD,
1607 MPFROMP(SortDirCnr),
1608 MPFROMLONG(dcd->sortFlags));
1609 }
1610 return 0;
1611
1612 case UM_SETUP:
1613 if(dcd) {
1614 if(!dcd->hwndObject) {
1615 /*
1616 * first time through -- set things up
1617 */
1618
1619 CNRINFO cnri;
1620
1621 RestorePresParams(hwnd,"DirCnr");
1622 LoadDetailsSwitches("DirCnr",dcd);
1623 memset(&cnri,0,sizeof(CNRINFO));
1624 cnri.cb = sizeof(CNRINFO);
1625 WinSendMsg(hwnd,
1626 CM_QUERYCNRINFO,
1627 MPFROMP(&cnri),
1628 MPFROMLONG(sizeof(CNRINFO)));
1629 cnri.cyLineSpacing = 0;
1630 cnri.cxTreeIndent = 12L;
1631
1632 cnri.flWindowAttr &= (~(CV_TREE | CV_ICON | CV_DETAIL | CV_TEXT));
1633 cnri.flWindowAttr |= (CV_NAME | CA_DETAILSVIEWTITLES | CV_MINI |
1634 CV_FLOW);
1635 cnri.pSortRecord = (PVOID)SortDirCnr;
1636
1637 {
1638 ULONG size = sizeof(ULONG);
1639
1640 PrfQueryProfileData(fmprof,
1641 appname,
1642 "DirflWindowAttr",
1643 (PVOID)&cnri.flWindowAttr,
1644 &size);
1645 size = sizeof(MASK);
1646 if(!*dcd->mask.szMask &&
1647 !dcd->mask.attrFile &&
1648 !dcd->mask.antiattr) {
1649 if(PrfQueryProfileSize(fmprof,
1650 appname,
1651 "DirFilter",
1652 &size) &&
1653 size) {
1654 PrfQueryProfileData(fmprof,
1655 appname,
1656 "DirFilter",
1657 &dcd->mask,
1658 &size);
1659 SetMask(dcd->mask.szMask,&dcd->mask);
1660 }
1661 else
1662 dcd->mask.attrFile = (FILE_READONLY | FILE_NORMAL |
1663 FILE_ARCHIVED | FILE_DIRECTORY |
1664 FILE_HIDDEN | FILE_SYSTEM);
1665 }
1666 *(dcd->mask.prompt) = 0;
1667 }
1668 if(dcd->flWindowAttr)
1669 cnri.flWindowAttr = dcd->flWindowAttr;
1670 else
1671 dcd->flWindowAttr = cnri.flWindowAttr;
1672 cnri.flWindowAttr &= (~(CA_MIXEDTARGETEMPH | CA_ORDEREDTARGETEMPH |
1673 CA_TITLEREADONLY | CA_TITLESEPARATOR));
1674 cnri.flWindowAttr |= CV_FLOW;
1675 dcd->flWindowAttr |= CV_FLOW;
1676 if(WinWindowFromID(dcd->hwndFrame,FID_TITLEBAR))
1677 cnri.flWindowAttr &= (~CA_CONTAINERTITLE);
1678 else
1679 cnri.flWindowAttr |= CA_CONTAINERTITLE;
1680 if(!dcd->sortFlags)
1681 dcd->sortFlags = sortFlags;
1682 WinSendMsg(hwnd,
1683 CM_SETCNRINFO,
1684 MPFROMP(&cnri),
1685 MPFROMLONG(CMA_FLWINDOWATTR | CMA_LINESPACING |
1686 CMA_CXTREEINDENT | CMA_PSORTRECORD));
1687 SetCnrCols(hwnd,FALSE);
1688 AdjustCnrColsForPref(hwnd,
1689 NULL,
1690 dcd,
1691 FALSE);
1692 if(_beginthread(MakeObjWin,
1693 NULL,
1694 245760,
1695 (PVOID)dcd) == -1) {
1696 PostMsg(hwnd,
1697 WM_CLOSE,
1698 MPVOID,
1699 MPVOID);
1700 return 0;
1701 }
1702 else
1703 DosSleep(64L);
1704 WinEnableMenuItem(DirCnrMenu,IDM_FINDINTREE,
1705 (hwndTree != (HWND)0));
1706 }
1707 SayFilter(WinWindowFromID(WinQueryWindow(hwnd,QW_PARENT),
1708 DIR_FILTER),&dcd->mask,FALSE);
1709 SaySort(WinWindowFromID(WinQueryWindow(hwnd,QW_PARENT),
1710 DIR_SORT),dcd->sortFlags,FALSE);
1711 SayView(WinWindowFromID(WinQueryWindow(hwnd,QW_PARENT),
1712 DIR_VIEW),dcd->flWindowAttr);
1713 }
1714 else {
1715 PostMsg(hwnd,
1716 WM_CLOSE,
1717 MPVOID,
1718 MPVOID);
1719 return 0;
1720 }
1721 return 0;
1722
1723 case WM_MENUEND:
1724 if(dcd) {
1725
1726 HWND hwndMenu = (HWND)mp2;
1727
1728 if(hwndMenu == DirCnrMenu || hwndMenu == FileMenu ||
1729 hwndMenu == DirMenu) {
1730 MarkAll(hwnd,TRUE,FALSE,TRUE);
1731 if(dcd->cnremphasized) {
1732 WinSendMsg(hwnd,CM_SETRECORDEMPHASIS,MPVOID,
1733 MPFROM2SHORT(FALSE,CRA_SOURCE));
1734 dcd->cnremphasized = FALSE;
1735 }
1736 }
1737 }
1738 break;
1739
1740 case UM_OPENWINDOWFORME:
1741 if(dcd) {
1742 if(mp1 &&
1743 !IsFile((CHAR *)mp1))
1744 OpenDirCnr(hwnd,
1745 dcd->hwndParent,
1746 dcd->hwndFrame,
1747 FALSE,
1748 (char *)mp1);
1749 else if(mp1 &&
1750 IsFile(mp1) == 1)
1751 StartArcCnr(HWND_DESKTOP,
1752 dcd->hwndFrame,
1753 (CHAR *)mp1,
1754 4,
1755 (ARC_TYPE *)mp2);
1756 }
1757 return 0;
1758
1759 case MM_PORTHOLEINIT:
1760 if(dcd) {
1761 switch(SHORT1FROMMP(mp1)) {
1762 case 0:
1763 case 1:
1764 {
1765 ULONG wmsg;
1766
1767 wmsg = (SHORT1FROMMP(mp1) == 0) ? UM_FILESMENU : UM_VIEWSMENU;
1768 PortholeInit((HWND)WinSendMsg(dcd->hwndClient,
1769 wmsg,
1770 MPVOID,
1771 MPVOID),
1772 mp1,
1773 mp2);
1774 }
1775 break;
1776 }
1777 }
1778 break;
1779
1780 case UM_INITMENU:
1781 case WM_INITMENU:
1782 if(dcd) {
1783 switch(SHORT1FROMMP(mp1)) {
1784 case IDM_FILESMENU:
1785 if(isalpha(*dcd->directory)) {
1786 if(driveflags[toupper(*dcd->directory) - 'A'] & DRIVE_NOTWRITEABLE) {
1787 WinEnableMenuItem((HWND)mp2,IDM_MOVEMENU,FALSE);
1788 WinEnableMenuItem((HWND)mp2,IDM_RENAME,FALSE);
1789 WinEnableMenuItem((HWND)mp2,IDM_MKDIR,FALSE);
1790 WinEnableMenuItem((HWND)mp2,IDM_UNDELETE,FALSE);
1791 WinEnableMenuItem((HWND)mp2,IDM_DELETESUBMENU,FALSE);
1792 WinEnableMenuItem((HWND)mp2,IDM_DELETE,FALSE);
1793 WinEnableMenuItem((HWND)mp2,IDM_EDIT,FALSE);
1794 WinEnableMenuItem((HWND)mp2,IDM_EDITTEXT,FALSE);
1795 WinEnableMenuItem((HWND)mp2,IDM_EDITBINARY,FALSE);
1796 WinEnableMenuItem((HWND)mp2,IDM_ATTRS,FALSE);
1797 }
1798 else {
1799 WinEnableMenuItem((HWND)mp2,IDM_MOVEMENU,TRUE);
1800 WinEnableMenuItem((HWND)mp2,IDM_RENAME,TRUE);
1801 WinEnableMenuItem((HWND)mp2,IDM_MKDIR,TRUE);
1802 WinEnableMenuItem((HWND)mp2,IDM_UNDELETE,TRUE);
1803 WinEnableMenuItem((HWND)mp2,IDM_DELETESUBMENU,TRUE);
1804 WinEnableMenuItem((HWND)mp2,IDM_DELETE,TRUE);
1805 WinEnableMenuItem((HWND)mp2,IDM_EDIT,TRUE);
1806 WinEnableMenuItem((HWND)mp2,IDM_EDITTEXT,TRUE);
1807 WinEnableMenuItem((HWND)mp2,IDM_EDITBINARY,TRUE);
1808 WinEnableMenuItem((HWND)mp2,IDM_ATTRS,TRUE);
1809 }
1810 }
1811 break;
1812
1813 case IDM_VIEWSMENU:
1814 SetViewMenu((HWND)mp2,dcd->flWindowAttr);
1815 WinEnableMenuItem((HWND)mp2,IDM_RESELECT,
1816 (dcd->lastselection != NULL));
1817 if(isalpha(*dcd->directory)) {
1818 if(driveflags[toupper(*dcd->directory) - 'A'] &
1819 DRIVE_NOTWRITEABLE)
1820 WinEnableMenuItem((HWND)mp2,
1821 IDM_MKDIR,
1822 FALSE);
1823 else
1824 WinEnableMenuItem((HWND)mp2,
1825 IDM_MKDIR,
1826 TRUE);
1827 }
1828 WinEnableMenuItem((HWND)mp2,
1829 IDM_SELECTCOMPAREMENU,
1830 (CountDirCnrs(dcd->hwndParent) > 1));
1831 break;
1832
1833 case IDM_DETAILSSETUP:
1834 SetDetailsSwitches((HWND)mp2,dcd);
1835 break;
1836
1837 case IDM_COMMANDSMENU:
1838 SetupCommandMenu((HWND)mp2,hwnd);
1839 break;
1840
1841 case IDM_SORTSUBMENU:
1842 SetSortChecks((HWND)mp2,dcd->sortFlags);
1843 break;
1844
1845 case IDM_WINDOWSMENU:
1846 SetupWinList((HWND)mp2,
1847 (hwndMain) ? hwndMain : (HWND)0,
1848 dcd->hwndFrame);
1849 break;
1850 }
1851 dcd->hwndLastMenu = (HWND)mp2;
1852 }
1853 if(msg == WM_INITMENU)
1854 break;
1855 return 0;
1856
1857 case UM_FILTER:
1858 if(dcd) {
1859
1860 PCNRITEM pci;
1861
1862 if(mp1) {
1863 DosEnterCritSec();
1864 SetMask((CHAR *)mp1,&dcd->mask);
1865 DosExitCritSec();
1866 }
1867 dcd->suspendview = 1;
1868 WinSendMsg(hwnd,CM_FILTER,MPFROMP(Filter),MPFROMP(&dcd->mask));
1869 dcd->suspendview = 0;
1870 if(fAutoView && hwndMain) {
1871 pci = WinSendMsg(hwnd,CM_QUERYRECORDEMPHASIS,
1872 MPFROMLONG(CMA_FIRST),
1873 MPFROMSHORT(CRA_CURSORED));
1874 if(pci && (INT)pci != -1 &&
1875 (!(driveflags[toupper(*pci->szFileName) - 'A'] & DRIVE_SLOW)))
1876 WinSendMsg(hwndMain,
1877 UM_LOADFILE,
1878 MPFROMP(pci->szFileName),
1879 MPVOID);
1880 else
1881 WinSendMsg(hwndMain,
1882 UM_LOADFILE,
1883 MPVOID,
1884 MPVOID);
1885 }
1886 PostMsg(hwnd,
1887 UM_RESCAN,
1888 MPVOID,
1889 MPVOID);
1890 }
1891 return 0;
1892
1893 case UM_COMMAND:
1894 if(mp1) {
1895 if(dcd) {
1896 if(!PostMsg(dcd->hwndObject,
1897 UM_COMMAND,
1898 mp1,
1899 mp2)) {
1900 FreeListInfo((LISTINFO *)mp1);
1901 DosBeep(50,100);
1902 }
1903 else
1904 return (MRESULT)TRUE;
1905 }
1906 else
1907 FreeListInfo((LISTINFO *)mp1);
1908 }
1909 return 0;
1910
1911 case UM_NOTIFY:
1912 if(mp2)
1913 Notify((CHAR *)mp2);
1914 return 0;
1915
1916 case UM_DRIVECMD:
1917 if(mp1)
1918 WinSendMsg(hwnd,
1919 WM_COMMAND,
1920 MPFROM2SHORT(IDM_SWITCH,0),
1921 mp1);
1922 return 0;
1923
1924 case WM_COMMAND:
1925 DosError(FERR_DISABLEHARDERR);
1926 if(dcd) {
1927 switch(SHORT1FROMMP(mp1)) {
1928 case IDM_SETTARGET:
1929 SetTargetDir(hwnd,FALSE);
1930 break;
1931
1932 case IDM_CREATE:
1933 {
1934 STRINGINPARMS sip;
1935 CHAR filename[CCHMAXPATHCOMP];
1936
1937 memset(&sip,0,sizeof(sip));
1938 sip.help = GetPString(IDS_CREATETEXT);
1939 sip.prompt = GetPString(IDS_CREATEPROMPTTEXT);
1940 sip.inputlen = CCHMAXPATHCOMP - (strlen(dcd->directory) - 1);
1941 strcpy(filename,"NEWFILE.TXT");
1942 sip.ret = filename;
1943 sip.title = GetPString(IDS_CREATETITLETEXT);
1944 if (WinDlgBox(HWND_DESKTOP,hwnd,InputDlgProc,FM3ModHandle,
1945 STR_FRAME,&sip))
1946 {
1947 bstrip(sip.ret);
1948 if (*sip.ret)
1949 {
1950
1951 CHAR newfile[CCHMAXPATH];
1952 FILE *fp;
1953 INT test;
1954 PCNRITEM pci;
1955
1956 strcpy(newfile,dcd->directory);
1957 if(newfile[strlen(newfile) - 1] != '\\')
1958 strcat(newfile,"\\");
1959 strcat(newfile,sip.ret);
1960 test = IsFile(newfile);
1961 if(test != 1)
1962 fp = fopen(newfile,"w");
1963 if(test == 1 || fp) {
1964 if(fp) {
1965 WinSendMsg(hwnd,
1966 UM_UPDATERECORD,
1967 MPFROMP(newfile),
1968 MPVOID);
1969 fclose(fp);
1970 }
1971 if(*editor) {
1972
1973 CHAR *dummy[2];
1974
1975 dummy[0] = newfile;
1976 dummy[1] = NULL;
1977 ExecOnList(hwnd,
1978 editor,
1979 WINDOWED | SEPARATE,
1980 NULL,
1981 dummy,
1982 NULL);
1983 }
1984 else
1985 StartMLEEditor(dcd->hwndParent,
1986 4,
1987 newfile,
1988 dcd->hwndFrame);
1989 pci = FindCnrRecord(hwnd,
1990 newfile,
1991 NULL,
1992 TRUE,
1993 FALSE,
1994 TRUE);
1995 if(pci && (INT)pci != -1)
1996 /* make sure that record shows in viewport */
1997 ShowCnrRecord(hwnd,(PMINIRECORDCORE)pci);
1998 }
1999 else
2000 saymsg(MB_ENTER,
2001 hwnd,
2002 GetPString(IDS_ERRORTEXT),
2003 GetPString(IDS_CREATEERRORTEXT),
2004 newfile);
2005 }
2006 }
2007 }
2008 break;
2009
2010 case IDM_CONTEXTMENU:
2011 {
2012 PCNRITEM pci;
2013
2014 pci = (PCNRITEM)CurrentRecord(hwnd);
2015 PostMsg(hwnd,WM_CONTROL,MPFROM2SHORT(DIR_CNR,CN_CONTEXTMENU),
2016 MPFROMP(pci));
2017 }
2018 break;
2019
2020 case IDM_MAXIMIZE:
2021 PostMsg(hwndMain,
2022 UM_MAXIMIZE,
2023 MPFROMLONG(dcd->hwndFrame),
2024 MPVOID);
2025 break;
2026
2027 case IDM_SHOWALLFILESCNR:
2028 StartSeeAll(HWND_DESKTOP,FALSE,dcd->directory);
2029 break;
2030
2031 case IDM_SHOWALLFILES:
2032 {
2033 PCNRITEM pci;
2034
2035 pci = WinSendMsg(hwnd,CM_QUERYRECORDEMPHASIS,
2036 MPFROMLONG(CMA_FIRST),
2037 MPFROMSHORT(CRA_CURSORED));
2038 if(pci && (INT)pci != -1) {
2039
2040 static CHAR dirname[CCHMAXPATH];
2041
2042 strcpy(dirname,pci->szFileName);
2043 MakeValidDir(dirname);
2044 StartSeeAll(HWND_DESKTOP,FALSE,dirname);
2045 }
2046 }
2047 break;
2048
2049 case IDM_FINDINTREE:
2050 if(hwndTree)
2051 WinSendMsg(hwndTree,UM_SHOWME,MPFROMP(dcd->directory),
2052 MPFROMLONG(1L));
2053 break;
2054
2055 case IDM_BEGINEDIT:
2056 OpenEdit(hwnd);
2057 break;
2058
2059 case IDM_ENDEDIT:
2060 WinSendMsg(hwnd,
2061 CM_CLOSEEDIT,
2062 MPVOID,
2063 MPVOID);
2064 break;
2065
2066 case IDM_SHOWSELECT:
2067 QuickPopup(hwnd,
2068 dcd,
2069 CheckMenu(&DirCnrMenu,DIRCNR_POPUP),
2070 IDM_SELECTSUBMENU);
2071 break;
2072
2073 case IDM_SHOWSORT:
2074 QuickPopup(hwnd,dcd,CheckMenu(&DirCnrMenu,DIRCNR_POPUP),
2075 IDM_SORTSUBMENU);
2076 break;
2077
2078 case IDM_VIEWORARC:
2079 {
2080 SWP swp;
2081 PCNRITEM pci;
2082
2083 pci = (PCNRITEM)WinSendMsg(hwnd,CM_QUERYRECORDEMPHASIS,
2084 MPFROMLONG(CMA_FIRST),
2085 MPFROMSHORT(CRA_CURSORED));
2086 if(pci &&
2087 (INT)pci != -1) {
2088 WinQueryWindowPos(dcd->hwndFrame,&swp);
2089 DefaultViewKeys(hwnd,
2090 dcd->hwndFrame,
2091 dcd->hwndParent,
2092 &swp,
2093 pci->szFileName);
2094 }
2095 }
2096 break;
2097
2098 case IDM_NOTEBOOK:
2099 if(!ParentIsDesktop(dcd->hwndParent,dcd->hwndParent))
2100 PostMsg(dcd->hwndParent,msg,mp1,mp2);
2101 else
2102 WinDlgBox(HWND_DESKTOP,hwnd,CfgDlgProc,FM3ModHandle,
2103 CFG_FRAME,(PVOID)"Directory");
2104 break;
2105
2106 case IDM_QTREE:
2107 case IDM_TREE:
2108 {
2109 CHAR newpath[CCHMAXPATH];
2110 APIRET rc;
2111 PCNRITEM pci;
2112
2113 if(SHORT1FROMMP(mp1) == IDM_TREE) {
2114 pci = (PCNRITEM)CurrentRecord(hwnd);
2115 if(pci && (INT)pci != -1)
2116 strcpy(newpath,pci->szFileName);
2117 else
2118 strcpy(newpath,dcd->directory);
2119 }
2120 else
2121 strcpy(newpath,dcd->directory);
2122 MakeValidDir(newpath);
2123 rc = WinDlgBox(HWND_DESKTOP,dcd->hwndClient,ObjCnrDlgProc,
2124 FM3ModHandle,QTREE_FRAME,MPFROMP(newpath));
2125 if(rc)
2126 WinSendMsg(hwnd,UM_SETDIR,MPFROMP(newpath),MPVOID);
2127 }
2128 break;
2129
2130 case IDM_RESELECT:
2131 SelectList(hwnd,TRUE,FALSE,FALSE,NULL,NULL,
2132 dcd->lastselection);
2133 break;
2134
2135 case IDM_HELP:
2136 if(hwndHelp) {
2137 if(!ParentIsDesktop(dcd->hwndFrame,dcd->hwndParent))
2138 PostMsg(dcd->hwndParent,UM_COMMAND,mp1,mp2);
2139 else
2140 WinSendMsg(hwndHelp,HM_HELP_CONTENTS,MPVOID,MPVOID);
2141 }
2142 break;
2143
2144 case IDM_WINDOWDLG:
2145 if(!ParentIsDesktop(dcd->hwndFrame,dcd->hwndParent))
2146 PostMsg(dcd->hwndParent,UM_COMMAND,
2147 MPFROM2SHORT(IDM_WINDOWDLG,0),MPVOID);
2148 break;
2149
2150 case IDM_SORTSMARTNAME:
2151 case IDM_SORTNAME:
2152 case IDM_SORTFILENAME:
2153 case IDM_SORTSIZE:
2154 case IDM_SORTEASIZE:
2155 case IDM_SORTFIRST:
2156 case IDM_SORTLAST:
2157 case IDM_SORTLWDATE:
2158 case IDM_SORTLADATE:
2159 case IDM_SORTCRDATE:
2160 case IDM_SORTSUBJECT:
2161 dcd->sortFlags &= (SORT_REVERSE | SORT_DIRSFIRST | SORT_DIRSLAST);
2162 case IDM_SORTDIRSFIRST:
2163 case IDM_SORTDIRSLAST:
2164 case IDM_SORTREVERSE:
2165 switch(SHORT1FROMMP(mp1)) {
2166 case IDM_SORTSUBJECT:
2167 dcd->sortFlags |= SORT_SUBJECT;
2168 break;
2169 case IDM_SORTSMARTNAME:
2170 case IDM_SORTFILENAME:
2171 dcd->sortFlags |= SORT_FILENAME;
2172 break;
2173 case IDM_SORTSIZE:
2174 dcd->sortFlags |= SORT_SIZE;
2175 break;
2176 case IDM_SORTEASIZE:
2177 dcd->sortFlags |= SORT_EASIZE;
2178 break;
2179 case IDM_SORTFIRST:
2180 dcd->sortFlags |= SORT_FIRSTEXTENSION;
2181 break;
2182 case IDM_SORTLAST:
2183 dcd->sortFlags |= SORT_LASTEXTENSION;
2184 break;
2185 case IDM_SORTLWDATE:
2186 dcd->sortFlags |= SORT_LWDATE;
2187 break;
2188 case IDM_SORTLADATE:
2189 dcd->sortFlags |= SORT_LADATE;
2190 break;
2191 case IDM_SORTCRDATE:
2192 dcd->sortFlags |= SORT_CRDATE;
2193 break;
2194 case IDM_SORTDIRSFIRST:
2195 if(dcd->sortFlags & SORT_DIRSFIRST)
2196 dcd->sortFlags &= (~SORT_DIRSFIRST);
2197 else {
2198 dcd->sortFlags |= SORT_DIRSFIRST;
2199 dcd->sortFlags &= (~SORT_DIRSLAST);
2200 }
2201 break;
2202 case IDM_SORTDIRSLAST:
2203 if(dcd->sortFlags & SORT_DIRSLAST)
2204 dcd->sortFlags &= (~SORT_DIRSLAST);
2205 else {
2206 dcd->sortFlags |= SORT_DIRSLAST;
2207 dcd->sortFlags &= (~SORT_DIRSFIRST);
2208 }
2209 break;
2210 case IDM_SORTREVERSE:
2211 if(dcd->sortFlags & SORT_REVERSE)
2212 dcd->sortFlags &= (~SORT_REVERSE);
2213 else
2214 dcd->sortFlags |= SORT_REVERSE;
2215 break;
2216 }
2217 WinSendMsg(hwnd,CM_SORTRECORD,MPFROMP(SortDirCnr),
2218 MPFROMLONG(dcd->sortFlags));
2219 SaySort(WinWindowFromID(WinQueryWindow(hwnd,QW_PARENT),
2220 DIR_SORT),dcd->sortFlags,FALSE);
2221 break;
2222
2223 case IDM_COLLECT:
2224 if(!Collector) {
2225
2226 HWND hwndC;
2227 SWP swp;
2228
2229 if(!ParentIsDesktop(hwnd,dcd->hwndParent) && !fAutoTile &&
2230 (!fExternalCollector && !strcmp(realappname,FM3Str)))
2231 GetNextWindowPos(dcd->hwndParent,&swp,NULL,NULL);
2232 hwndC = StartCollector((fExternalCollector ||
2233 strcmp(realappname,FM3Str)) ?
2234 HWND_DESKTOP :
2235 dcd->hwndParent,4);
2236 if(hwndC) {
2237 if(!ParentIsDesktop(hwnd,dcd->hwndParent) && !fAutoTile &&
2238 (!fExternalCollector && !strcmp(realappname,FM3Str)))
2239 WinSetWindowPos(hwndC,HWND_TOP,swp.x,swp.y,
2240 swp.cx,swp.cy,SWP_MOVE | SWP_SIZE |
2241 SWP_SHOW | SWP_ZORDER);
2242 else if(!ParentIsDesktop(hwnd,dcd->hwndParent) && fAutoTile &&
2243 !strcmp(realappname,FM3Str))
2244 TileChildren(dcd->hwndParent,TRUE);
2245 WinSetWindowPos(hwndC,HWND_TOP,0,0,0,0,SWP_ACTIVATE);
2246 DosSleep(250L);
2247 }
2248 }
2249 else
2250 StartCollector(dcd->hwndParent,4);
2251 PostMsg(hwnd,WM_COMMAND,MPFROM2SHORT(IDM_COLLECTOR,0),MPVOID);
2252 break;
2253
2254 case IDM_COLLECTOR:
2255 DosSleep(64L);
2256 {
2257 CHAR **list;
2258
2259 list = BuildList(hwnd);
2260 if(list) {
2261 if(Collector) {
2262 if(!PostMsg(Collector,WM_COMMAND,
2263 MPFROM2SHORT(IDM_COLLECTOR,0),
2264 MPFROMP(list)))
2265 FreeList(list);
2266 else if(fUnHilite)
2267 UnHilite(hwnd,TRUE,&dcd->lastselection);
2268 }
2269 else
2270 FreeList(list);
2271 }
2272 }
2273 break;
2274
2275 case IDM_UNDELETE:
2276 {
2277 PCNRITEM pci;
2278 CHAR path[CCHMAXPATH];
2279
2280 pci = (PCNRITEM)CurrentRecord(hwnd);
2281 if(pci && (INT)pci != -1) {
2282 strcpy(path,pci->szFileName);
2283 MakeValidDir(path);
2284 WinDlgBox(HWND_DESKTOP,hwnd,UndeleteDlgProc,FM3ModHandle,
2285 UNDEL_FRAME,MPFROMP(path));
2286 }
2287 }
2288 break;
2289
2290 case IDM_UNDELETESPEC:
2291 WinDlgBox(HWND_DESKTOP,
2292 hwnd,
2293 UndeleteDlgProc,
2294 FM3ModHandle,
2295 UNDEL_FRAME,
2296 MPFROMP(dcd->directory));
2297 break;
2298
2299 case IDM_RESORT:
2300// WinSendMsg(hwnd,
2301// CM_SORTRECORD,
2302// MPFROMP(SortDirCnr),
2303// MPFROMLONG((fSyncUpdates) ? sortFlags : dcd->sortFlags));
2304 WinSendMsg(hwnd,
2305 CM_SORTRECORD,
2306 MPFROMP(SortDirCnr),
2307 MPFROMLONG(dcd->sortFlags));
2308 break;
2309
2310 case IDM_FILTER:
2311 {
2312 BOOL empty = FALSE;
2313 PCNRITEM pci;
2314 CHAR *p;
2315
2316 if(!*dcd->mask.szMask) {
2317 empty = TRUE;
2318 pci = (PCNRITEM)CurrentRecord(hwnd);
2319 if(pci && !(pci->attrFile & FILE_DIRECTORY)) {
2320 p = strrchr(pci->szFileName,'\\');
2321 if(p) {
2322 p++;
2323 strcpy(dcd->mask.szMask,p);
2324 }
2325 }
2326 }
2327 *(dcd->mask.prompt) = 0;
2328
2329 if(WinDlgBox(HWND_DESKTOP,hwnd,PickMaskDlgProc,
2330 FM3ModHandle,MSK_FRAME,MPFROMP(&dcd->mask)))
2331 WinSendMsg(hwnd,UM_FILTER,MPVOID,MPVOID);
2332 else if(empty)
2333 *dcd->mask.szMask = 0;
2334 SayFilter(WinWindowFromID(WinQueryWindow(hwnd,QW_PARENT),
2335 DIR_FILTER),&dcd->mask,FALSE);
2336 }
2337 break;
2338
2339 case IDM_HIDEALL:
2340 if(fAutoView && hwndMain)
2341 PostMsg(hwndMain,
2342 UM_LOADFILE,
2343 MPVOID,
2344 MPVOID);
2345 dcd->suspendview = 1;
2346 HideAll(hwnd);
2347 dcd->suspendview = 0;
2348 PostMsg(hwnd,
2349 UM_RESCAN,
2350 MPVOID,
2351 MPVOID);
2352 break;
2353
2354 case IDM_SELECTBOTH:
2355 case IDM_SELECTONE:
2356 case IDM_SELECTMORE:
2357 case IDM_SELECTNEWER:
2358 case IDM_SELECTOLDER:
2359 case IDM_SELECTBIGGER:
2360 case IDM_SELECTSMALLER:
2361 case IDM_DESELECTBOTH:
2362 case IDM_DESELECTONE:
2363 case IDM_DESELECTMORE:
2364 case IDM_DESELECTNEWER:
2365 case IDM_DESELECTOLDER:
2366 case IDM_DESELECTBIGGER:
2367 case IDM_DESELECTSMALLER:
2368 if(ParentIsDesktop(hwnd,dcd->hwndParent)) {
2369 DosBeep(50,100);
2370 break;
2371 }
2372 case IDM_SELECTLIST:
2373 case IDM_SELECTALL:
2374 case IDM_DESELECTALL:
2375 case IDM_SELECTALLFILES:
2376 case IDM_DESELECTALLFILES:
2377 case IDM_SELECTALLDIRS:
2378 case IDM_DESELECTALLDIRS:
2379 case IDM_SELECTMASK:
2380 case IDM_DESELECTMASK:
2381 case IDM_INVERT:
2382 case IDM_SELECTCLIP:
2383 case IDM_DESELECTCLIP:
2384 {
2385 PCNRITEM pci;
2386
2387 pci = (PCNRITEM)CurrentRecord(hwnd);
2388 if((INT)pci == -1)
2389 pci = NULL;
2390 if(SHORT1FROMMP(mp1) == IDM_HIDEALL) {
2391 if(pci) {
2392 if(!(pci->rc.flRecordAttr & CRA_SELECTED))
2393 pci->rc.flRecordAttr |= CRA_FILTERED;
2394 WinSendMsg(hwnd,CM_INVALIDATERECORD,MPFROMP(&pci),
2395 MPFROM2SHORT(1,CMA_ERASE | CMA_REPOSITION));
2396 break;
2397 }
2398 }
2399 PostMsg(dcd->hwndObject,
2400 UM_SELECT,
2401 mp1,
2402 MPFROMP(pci));
2403 }
2404 break;
2405
2406 case IDM_RESCAN:
2407 DosEnterCritSec();
2408 dcd->stopflag++;
2409 DosExitCritSec();
2410 if(!PostMsg(dcd->hwndObject,
2411 UM_RESCAN,
2412 MPVOID,
2413 MPVOID)) {
2414 DosEnterCritSec();
2415 dcd->stopflag--;
2416 DosExitCritSec();
2417 }
2418 break;
2419
2420 case IDM_SHOWLNAMES:
2421 case IDM_SHOWSUBJECT:
2422 case IDM_SHOWEAS:
2423 case IDM_SHOWSIZE:
2424 case IDM_SHOWICON:
2425 case IDM_SHOWLWDATE:
2426 case IDM_SHOWLWTIME:
2427 case IDM_SHOWLADATE:
2428 case IDM_SHOWLATIME:
2429 case IDM_SHOWCRDATE:
2430 case IDM_SHOWCRTIME:
2431 case IDM_SHOWATTR:
2432 AdjustDetailsSwitches(hwnd,
2433 dcd->hwndLastMenu,
2434 SHORT1FROMMP(mp1),
2435 dcd->directory,
2436 "DirCnr",
2437 dcd,
2438 FALSE);
2439 break;
2440
2441 case IDM_TREEVIEW:
2442 case IDM_ICON:
2443 case IDM_TEXT:
2444 case IDM_DETAILS:
2445 case IDM_NAME:
2446 case IDM_MINIICONS:
2447 case IDM_DETAILSTITLES:
2448 {
2449 CNRINFO cnri;
2450
2451 memset(&cnri,0,sizeof(CNRINFO));
2452 cnri.cb = sizeof(CNRINFO);
2453 WinSendMsg(hwnd,CM_QUERYCNRINFO,MPFROMP(&cnri),
2454 MPFROMLONG(sizeof(CNRINFO)));
2455 switch(SHORT1FROMMP(mp1)) {
2456 case IDM_TREEVIEW:
2457 if(!(cnri.flWindowAttr & CV_TREE))
2458 dcd->lastattr = cnri.flWindowAttr;
2459 cnri.flWindowAttr &= (~(CV_ICON | CV_TREE | CV_TEXT |
2460 CV_DETAIL | CV_NAME | CA_TREELINE));
2461 cnri.flWindowAttr |= CA_TREELINE | CV_TREE | CV_ICON;
2462 if(!dcd->firsttree)
2463 PostMsg(dcd->hwndObject,UM_FLESH,MPVOID,MPVOID);
2464 break;
2465 case IDM_ICON:
2466 cnri.flWindowAttr &= (~(CV_ICON | CV_TREE | CV_TEXT |
2467 CV_DETAIL | CV_NAME | CA_TREELINE));
2468 cnri.flWindowAttr |= CV_ICON;
2469 break;
2470 case IDM_NAME:
2471 cnri.flWindowAttr &= (~(CV_ICON | CV_TREE | CV_TEXT |
2472 CV_DETAIL | CV_NAME | CA_TREELINE));
2473 cnri.flWindowAttr |= CV_NAME;
2474 break;
2475 case IDM_TEXT:
2476 cnri.flWindowAttr &= (~(CV_ICON | CV_TREE | CV_TEXT |
2477 CV_DETAIL | CV_NAME | CA_TREELINE));
2478 cnri.flWindowAttr |= CV_TEXT;
2479 break;
2480 case IDM_DETAILS:
2481 cnri.flWindowAttr &= (~(CV_ICON | CV_TREE | CV_TEXT |
2482 CV_DETAIL | CV_NAME | CA_TREELINE));
2483 cnri.flWindowAttr |= CV_DETAIL;
2484 break;
2485 case IDM_MINIICONS:
2486 if(cnri.flWindowAttr & CV_MINI)
2487 cnri.flWindowAttr &= (~CV_MINI);
2488 else
2489 cnri.flWindowAttr |= CV_MINI;
2490 break;
2491 case IDM_DETAILSTITLES:
2492 if(cnri.flWindowAttr & CA_DETAILSVIEWTITLES)
2493 cnri.flWindowAttr &= (~CA_DETAILSVIEWTITLES);
2494 else
2495 cnri.flWindowAttr |= CA_DETAILSVIEWTITLES;
2496 break;
2497 }
2498 cnri.flWindowAttr &= (~(CA_ORDEREDTARGETEMPH |
2499 CA_MIXEDTARGETEMPH));
2500 cnri.flWindowAttr |= CV_FLOW;
2501 dcd->flWindowAttr = cnri.flWindowAttr;
2502 WinSendMsg(hwnd,CM_SETCNRINFO,MPFROMP(&cnri),
2503 MPFROMLONG(CMA_FLWINDOWATTR));
2504 WinSendMsg(hwnd,CM_INVALIDATERECORD,MPVOID,
2505 MPFROM2SHORT(0,CMA_ERASE | CMA_REPOSITION));
2506 SayView(WinWindowFromID(WinQueryWindow(hwnd,QW_PARENT),
2507 DIR_VIEW),dcd->flWindowAttr);
2508 }
2509 break;
2510
2511 case IDM_SAVETOLIST:
2512 WinDlgBox(HWND_DESKTOP,hwnd,SaveListDlgProc,FM3ModHandle,
2513 SAV_FRAME,MPFROMP(&hwnd));
2514 break;
2515
2516 case IDM_SIZES:
2517 {
2518 PCNRITEM pci;
2519 CHAR path[CCHMAXPATH];
2520
2521 pci = (PCNRITEM)CurrentRecord(hwnd);
2522 if(pci && (INT)pci != -1)
2523 strcpy(path,pci->szFileName);
2524 else
2525 strcpy(path,dcd->directory);
2526 MakeValidDir(path);
2527 WinDlgBox(HWND_DESKTOP,
2528 HWND_DESKTOP,
2529 DirSizeProc,
2530 FM3ModHandle,
2531 DSZ_FRAME,
2532 path);
2533 }
2534 break;
2535
2536 case IDM_MKDIR:
2537 {
2538 PCNRITEM pci;
2539
2540 pci = (PCNRITEM)CurrentRecord(hwnd);
2541 PMMkDir(dcd->hwndParent,
2542 ((pci && (INT)pci != -1) ?
2543 pci->szFileName :
2544 dcd->directory),
2545 FALSE);
2546 }
2547 break;
2548
2549 case IDM_SWITCH:
2550 if(mp2) {
2551 strcpy(dcd->previous,dcd->directory);
2552 strcpy(dcd->directory,(CHAR *)mp2);
2553 DosEnterCritSec();
2554 dcd->stopflag++;
2555 DosExitCritSec();
2556 if(!PostMsg(dcd->hwndObject,
2557 UM_RESCAN,
2558 MPVOID,
2559 MPFROMLONG(1L))) {
2560 strcpy(dcd->directory,
2561 dcd->previous);
2562 DosEnterCritSec();
2563 dcd->stopflag--;
2564 DosExitCritSec();
2565 }
2566 else if(*dcd->directory) {
2567 if(hwndMain)
2568 WinSendMsg(hwndMain,
2569 UM_SETUSERLISTNAME,
2570 MPFROMP(dcd->directory),
2571 MPVOID);
2572 else
2573 add_udir(FALSE,dcd->directory);
2574 }
2575 }
2576 break;
2577
2578 case IDM_PARENT:
2579 {
2580 CHAR tempname1[CCHMAXPATH],
2581 tempname2[CCHMAXPATH];
2582
2583 strcpy(tempname1,dcd->directory);
2584 if(tempname1[strlen(tempname1) - 1] != '\\')
2585 strcat(tempname1,"\\");
2586 strcat(tempname1,"..");
2587 DosError(FERR_DISABLEHARDERR);
2588 if(!DosQueryPathInfo(tempname1,
2589 FIL_QUERYFULLNAME,
2590 tempname2,
2591 sizeof(tempname2))) {
2592 if(stricmp(dcd->directory,tempname2)) {
2593 strcpy(dcd->previous,dcd->directory);
2594 strcpy(dcd->directory,tempname2);
2595 DosEnterCritSec();
2596 dcd->stopflag++;
2597 DosExitCritSec();
2598 if(!PostMsg(dcd->hwndObject,
2599 UM_RESCAN,
2600 MPVOID,
2601 MPFROMLONG(1L))) {
2602 strcpy(dcd->directory,dcd->previous);
2603 DosEnterCritSec();
2604 dcd->stopflag--;
2605 DosExitCritSec();
2606 }
2607 else if(*dcd->directory) {
2608 if(hwndMain)
2609 WinSendMsg(hwndMain,
2610 UM_SETUSERLISTNAME,
2611 MPFROMP(dcd->directory),
2612 MPVOID);
2613 else
2614 add_udir(FALSE,
2615 dcd->directory);
2616 }
2617 }
2618 }
2619 }
2620 break;
2621
2622 case IDM_PREVIOUS:
2623 if(*dcd->previous &&
2624 stricmp(dcd->directory,dcd->previous)) {
2625
2626 CHAR tempname[CCHMAXPATH];
2627
2628 if(IsValidDir(dcd->previous)) {
2629 strcpy(tempname,dcd->directory);
2630 strcpy(dcd->directory,dcd->previous);
2631 strcpy(dcd->previous,tempname);
2632 DosEnterCritSec();
2633 dcd->stopflag++;
2634 DosExitCritSec();
2635 if(!PostMsg(dcd->hwndObject,
2636 UM_RESCAN,
2637 MPVOID,
2638 MPFROMLONG(1L))) {
2639 strcpy(dcd->directory,dcd->previous);
2640 DosEnterCritSec();
2641 dcd->stopflag--;
2642 DosExitCritSec();
2643 }
2644 else if(*dcd->directory) {
2645 if(hwndMain)
2646 WinSendMsg(hwndMain,
2647 UM_SETUSERLISTNAME,
2648 MPFROMP(dcd->directory),
2649 MPVOID);
2650 else
2651 add_udir(FALSE,
2652 dcd->directory);
2653 }
2654 }
2655 else
2656 *dcd->previous = 0;
2657 }
2658 break;
2659
2660 case IDM_WALKDIR:
2661 {
2662 CHAR newdir[CCHMAXPATH];
2663
2664 strcpy(newdir,dcd->directory);
2665 if(!WinDlgBox(HWND_DESKTOP,
2666 dcd->hwndParent,
2667 WalkAllDlgProc,
2668 FM3ModHandle,
2669 WALK_FRAME,
2670 MPFROMP(newdir)) ||
2671 !*newdir)
2672 break;
2673 if(stricmp(newdir,dcd->directory)) {
2674 strcpy(dcd->previous,dcd->directory);
2675 strcpy(dcd->directory,newdir);
2676 DosEnterCritSec();
2677 dcd->stopflag++;
2678 DosExitCritSec();
2679 if(!PostMsg(dcd->hwndObject,
2680 UM_RESCAN,
2681 MPVOID,
2682 MPFROMLONG(1L))) {
2683 strcpy(dcd->directory,dcd->previous);
2684 DosEnterCritSec();
2685 dcd->stopflag--;
2686 DosExitCritSec();
2687 }
2688 else if(*dcd->directory) {
2689 if(hwndMain)
2690 WinSendMsg(hwndMain,
2691 UM_SETUSERLISTNAME,
2692 MPFROMP(dcd->directory),
2693 MPVOID);
2694 else
2695 add_udir(FALSE,
2696 dcd->directory);
2697 }
2698 }
2699 }
2700 break;
2701
2702 case IDM_OPENICONME:
2703 OpenObject(dcd->directory,
2704 "ICON",
2705 dcd->hwndFrame);
2706 break;
2707 case IDM_OPENDETAILSME:
2708 OpenObject(dcd->directory,
2709 "DETAILS",
2710 dcd->hwndFrame);
2711 break;
2712 case IDM_OPENTREEME:
2713 OpenObject(dcd->directory,
2714 "TREE",
2715 dcd->hwndFrame);
2716 break;
2717 case IDM_OPENSETTINGSME:
2718 OpenObject(dcd->directory,
2719 Settings,
2720 dcd->hwndFrame);
2721 break;
2722
2723 case IDM_DOITYOURSELF:
2724 case IDM_UPDATE:
2725 case IDM_OPENWINDOW:
2726 case IDM_OPENSETTINGS:
2727 case IDM_OPENDEFAULT:
2728 case IDM_OPENICON:
2729 case IDM_OPENDETAILS:
2730 case IDM_OPENTREE:
2731 case IDM_OBJECT:
2732 case IDM_SHADOW:
2733 case IDM_SHADOW2:
2734 case IDM_DELETE:
2735 case IDM_PERMDELETE:
2736 case IDM_PRINT:
2737 case IDM_ATTRS:
2738 case IDM_INFO:
2739 case IDM_COPY:
2740 case IDM_MOVE:
2741 case IDM_WPSMOVE:
2742 case IDM_WPSCOPY:
2743 case IDM_WILDCOPY:
2744 case IDM_WILDMOVE:
2745 case IDM_RENAME:
2746 case IDM_COMPARE:
2747 case IDM_EAS:
2748 case IDM_SUBJECT:
2749 case IDM_VIEW:
2750 case IDM_VIEWTEXT:
2751 case IDM_VIEWBINARY:
2752 case IDM_VIEWARCHIVE:
2753 case IDM_EDIT:
2754 case IDM_EDITTEXT:
2755 case IDM_EDITBINARY:
2756 case IDM_SAVETOCLIP:
2757 case IDM_APPENDTOCLIP:
2758 case IDM_ARCHIVE:
2759 case IDM_ARCHIVEM:
2760 case IDM_EXTRACT:
2761 case IDM_MCIPLAY:
2762 case IDM_COLLECTFROMFILE:
2763 case IDM_UUDECODE:
2764 case IDM_MERGE:
2765 {
2766 LISTINFO *li;
2767 ULONG action = UM_ACTION;
2768
2769 li = malloc(sizeof(LISTINFO));
2770 if(li) {
2771 memset(li,0,sizeof(LISTINFO));
2772 li->type = SHORT1FROMMP(mp1);
2773 li->hwnd = hwnd;
2774 li->list = BuildList(hwnd);
2775 switch(SHORT1FROMMP(mp1)) {
2776 case IDM_WILDMOVE:
2777 case IDM_WILDCOPY:
2778 case IDM_MOVE:
2779 case IDM_COPY:
2780 case IDM_WPSMOVE:
2781 case IDM_WPSCOPY:
2782 break;
2783 default:
2784 strcpy(li->targetpath,dcd->directory);
2785 break;
2786 }
2787 if(li->list) {
2788 if(SHORT1FROMMP(mp1) == IDM_COLLECTFROMFILE) {
2789 if(!Collector) {
2790
2791 HWND hwndC;
2792 SWP swp;
2793
2794 if(!ParentIsDesktop(hwnd,dcd->hwndParent) &&
2795 !fAutoTile &&
2796 (!fExternalCollector && !strcmp(realappname,FM3Str)))
2797 GetNextWindowPos(dcd->hwndParent,&swp,NULL,NULL);
2798 hwndC = StartCollector((fExternalCollector ||
2799 strcmp(realappname,FM3Str)) ?
2800 HWND_DESKTOP :
2801 dcd->hwndParent,4);
2802 if(hwndC) {
2803 if(!ParentIsDesktop(hwnd,dcd->hwndParent) &&
2804 !fAutoTile && (!fExternalCollector &&
2805 !strcmp(realappname,FM3Str)))
2806 WinSetWindowPos(hwndC,HWND_TOP,swp.x,swp.y,
2807 swp.cx,swp.cy,SWP_MOVE | SWP_SIZE |
2808 SWP_SHOW | SWP_ZORDER);
2809 else if(!ParentIsDesktop(hwnd,dcd->hwndParent) &&
2810 fAutoTile && !strcmp(realappname,FM3Str))
2811 TileChildren(dcd->hwndParent,TRUE);
2812 WinSetWindowPos(hwndC,HWND_TOP,0,0,0,0,SWP_ACTIVATE);
2813 DosSleep(250L);
2814 }
2815 }
2816 else
2817 StartCollector(dcd->hwndParent,4);
2818 }
2819 switch(SHORT1FROMMP(mp1)) {
2820 case IDM_APPENDTOCLIP:
2821 case IDM_SAVETOCLIP:
2822 case IDM_ARCHIVE:
2823 case IDM_ARCHIVEM:
2824 case IDM_DELETE:
2825 case IDM_PERMDELETE:
2826 case IDM_ATTRS:
2827 case IDM_PRINT:
2828 case IDM_SHADOW:
2829 case IDM_SHADOW2:
2830 case IDM_OBJECT:
2831 case IDM_VIEW:
2832 case IDM_VIEWTEXT:
2833 case IDM_VIEWBINARY:
2834 case IDM_EDIT:
2835 case IDM_EDITTEXT:
2836 case IDM_EDITBINARY:
2837 case IDM_MCIPLAY:
2838 case IDM_UPDATE:
2839 case IDM_DOITYOURSELF:
2840 case IDM_INFO:
2841 case IDM_EAS:
2842 action = UM_MASSACTION;
2843 break;
2844 }
2845 if(SHORT1FROMMP(mp1) == IDM_OBJECT ||
2846 SHORT1FROMMP(mp1) == IDM_SHADOW ||
2847 SHORT1FROMMP(mp1) == IDM_SHADOW2)
2848 *li->targetpath = 0;
2849 if(!PostMsg(dcd->hwndObject,
2850 action,
2851 MPFROMP(li),
2852 MPVOID)) {
2853 FreeListInfo(li);
2854 DosBeep(50,100);
2855 }
2856 else if(fUnHilite)
2857 UnHilite(hwnd,
2858 TRUE,
2859 &dcd->lastselection);
2860 }
2861 else
2862 free(li);
2863 }
2864 }
2865 break;
2866
2867 case IDM_DRIVESMENU:
2868 if(!hwndMain)
2869 PostMsg(hwnd,
2870 WM_COMMAND,
2871 MPFROM2SHORT(IDM_WALKDIR,0),
2872 MPVOID);
2873 break;
2874
2875 default:
2876 if(SwitchCommand(dcd->hwndLastMenu,
2877 SHORT1FROMMP(mp1)))
2878 return 0;
2879 else {
2880 if(SHORT1FROMMP(mp1) >= IDM_COMMANDSTART &&
2881 SHORT1FROMMP(mp1) < IDM_QUICKTOOLSTART) {
2882
2883 register INT x;
2884
2885 if(!cmdloaded)
2886 load_commands();
2887 x = SHORT1FROMMP(mp1) - IDM_COMMANDSTART;
2888 if(x >= 0) {
2889 x++;
2890 RunCommand(hwnd,x);
2891 if(fUnHilite)
2892 UnHilite(hwnd,
2893 TRUE,
2894 &dcd->lastselection);
2895 }
2896 }
2897 }
2898 break;
2899 }
2900 }
2901 return 0;
2902
2903 case UM_FIXCNRMLE:
2904 case UM_FIXEDITNAME:
2905 return CommonCnrProc(hwnd,msg,mp1,mp2);
2906
2907 case UM_FILESMENU:
2908 {
2909 PCNRITEM pci;
2910 HWND menuHwnd = (HWND)0;
2911
2912 pci = (PCNRITEM)CurrentRecord(hwnd);
2913 if(pci && (INT)pci != -1) {
2914 if(pci->attrFile & FILE_DIRECTORY) {
2915 menuHwnd = CheckMenu(&DirMenu,
2916 DIR_POPUP);
2917// WinEnableMenuItem(DirMenu,IDM_TREE,TRUE);
2918 }
2919 else
2920 menuHwnd = CheckMenu(&FileMenu,
2921 FILE_POPUP);
2922 }
2923 return MRFROMLONG(menuHwnd);
2924 }
2925
2926 case WM_CONTROL:
2927 DosError(FERR_DISABLEHARDERR);
2928 if(dcd) {
2929 switch(SHORT2FROMMP(mp1)) {
2930 case CN_COLLAPSETREE:
2931 case CN_EXPANDTREE:
2932 {
2933 PCNRITEM pci = (PCNRITEM)mp2;
2934
2935 if(pci &&
2936 (INT)pci != -1 &&
2937 !(pci->flags & RECFLAGS_ENV)) {
2938 if(driveflags[toupper(*pci->szFileName) - 'A'] &
2939 DRIVE_REMOVABLE) {
2940
2941 struct {
2942 ULONG serial;
2943 CHAR volumelength;
2944 CHAR volumelabel[CCHMAXPATH];
2945 } volser;
2946
2947 memset(&volser,0,sizeof(volser));
2948 DosError(FERR_DISABLEHARDERR);
2949 if(!DosQueryFSInfo(toupper(*pci->szFileName) - '@',
2950 FSIL_VOLSER,
2951 &volser,
2952 (ULONG)sizeof(volser))) {
2953 if(SHORT2FROMMP(mp1) == CN_COLLAPSETREE &&
2954 !volser.serial ||
2955 driveserial[toupper(*pci->szFileName) - 'A'] !=
2956 volser.serial)
2957 UnFlesh(hwnd,pci);
2958 if(SHORT2FROMMP(mp1) != CN_COLLAPSETREE ||
2959 (!volser.serial ||
2960 driveserial[toupper(*pci->szFileName) - 'A'] !=
2961 volser.serial)) {
2962 if(Flesh(hwnd,pci) &&
2963 SHORT2FROMMP(mp1) == CN_EXPANDTREE &&
2964 !dcd->suspendview && fTopDir)
2965 PostMsg(hwnd,UM_TOPDIR,MPFROMP(pci),MPVOID);
2966 }
2967 driveserial[toupper(*pci->szFileName) - 'A'] =
2968 volser.serial;
2969 }
2970 else {
2971 driveserial[toupper(*pci->szFileName) - 'A'] = -1;
2972 UnFlesh(hwnd,pci);
2973 PostMsg(hwnd,
2974 UM_RESCAN,
2975 MPVOID,
2976 MPVOID);
2977 DosBeep(250,100);
2978 }
2979 }
2980 else if(SHORT2FROMMP(mp1) == CN_EXPANDTREE) {
2981 if(Flesh(hwnd,pci) &&
2982 !dcd->suspendview && fTopDir)
2983 PostMsg(hwnd,
2984 UM_TOPDIR,
2985 MPFROMP(pci),
2986 MPVOID);
2987 }
2988 if(SHORT2FROMMP(mp1) == CN_EXPANDTREE &&
2989 !dcd->suspendview)
2990 WinSendMsg(hwnd,
2991 UM_FILTER,
2992 MPVOID,
2993 MPVOID);
2994 }
2995 }
2996 break;
2997
2998/*
2999 case CN_PICKUP:
3000 return PickUp(hwnd,dcd->hwndObject,mp2);
3001*/
3002
3003 case CN_CONTEXTMENU:
3004 {
3005 PCNRITEM pci = (PCNRITEM)mp2;
3006
3007 if(pci) {
3008 WinSendMsg(hwnd,
3009 CM_SETRECORDEMPHASIS,
3010 MPFROMP(pci),
3011 MPFROM2SHORT(TRUE,CRA_CURSORED));
3012 MarkAll(hwnd,
3013 FALSE,
3014 FALSE,
3015 TRUE);
3016 if(pci->attrFile & FILE_DIRECTORY)
3017 dcd->hwndLastMenu = CheckMenu(&DirMenu,DIR_POPUP);
3018 else
3019 dcd->hwndLastMenu = CheckMenu(&FileMenu,FILE_POPUP);
3020 }
3021 else {
3022 dcd->hwndLastMenu = CheckMenu(&DirCnrMenu,DIRCNR_POPUP);
3023 if(dcd->hwndLastMenu && !dcd->cnremphasized) {
3024 WinSendMsg(hwnd,
3025 CM_SETRECORDEMPHASIS,
3026 MPVOID,
3027 MPFROM2SHORT(TRUE,CRA_SOURCE));
3028 dcd->cnremphasized = TRUE;
3029 }
3030 }
3031 if(dcd->hwndLastMenu) {
3032 if(dcd->hwndLastMenu == DirCnrMenu) {
3033 if(dcd->flWindowAttr & CV_MINI)
3034 WinCheckMenuItem(dcd->hwndLastMenu,
3035 IDM_MINIICONS,
3036 TRUE);
3037 }
3038 if(dcd->hwndLastMenu == DirMenu)
3039 WinEnableMenuItem(DirMenu,
3040 IDM_TREE,
3041 TRUE);
3042 if(!PopupMenu(hwnd,hwnd,dcd->hwndLastMenu)) {
3043 if(dcd->cnremphasized) {
3044 WinSendMsg(hwnd,
3045 CM_SETRECORDEMPHASIS,
3046 MPVOID,
3047 MPFROM2SHORT(FALSE,CRA_SOURCE));
3048 dcd->cnremphasized = TRUE;
3049 }
3050 MarkAll(hwnd,TRUE,FALSE,TRUE);
3051 }
3052 }
3053 }
3054 break;
3055
3056 case CN_DROPHELP:
3057 if(mp2) {
3058
3059 PDRAGINFO pDInfo;
3060 PCNRITEM pci;
3061 ULONG numitems;
3062 USHORT usOperation;
3063
3064 pci = (PCNRITEM)((PCNRDRAGINFO)mp2)->pRecord;
3065 pDInfo = (PDRAGINFO)((PCNRDRAGINFO)mp2)->pDragInfo;
3066 if(!DrgAccessDraginfo(pDInfo)) {
3067 General_Error(WinQueryAnchorBlock(hwnd),
3068 hwnd,
3069 __FILE__,
3070 __LINE__,
3071 "%s",
3072 GetPString(IDS_DROPERRORTEXT));
3073 break;
3074 }
3075 numitems = DrgQueryDragitemCount(pDInfo);
3076 usOperation = pDInfo->usOperation;
3077 DrgDeleteDraginfoStrHandles(pDInfo);
3078 DrgFreeDraginfo(pDInfo);
3079 saymsg(MB_ENTER | MB_ICONASTERISK,
3080 hwnd,
3081 GetPString(IDS_DROPHELPHDRTEXT),
3082 GetPString(IDS_DROPHELPTEXT),
3083 numitems,
3084 &"s"[numitems == 1L],
3085 (pci) ? NullStr : GetPString(IDS_NOTEXT),
3086 (pci) ? NullStr : " ",
3087 (pci) ? pci->szFileName : NullStr,
3088 (pci) ? " " : NullStr,
3089 GetPString((usOperation == DO_COPY) ?
3090 IDS_COPYTEXT :
3091 (usOperation == DO_LINK) ?
3092 IDS_LINKTEXT : IDS_MOVETEXT));
3093 }
3094 return 0;
3095
3096 case CN_DRAGLEAVE:
3097#ifdef NEVER
3098 if(mp2) {
3099
3100 PDRAGINFO pDInfo;
3101
3102 pDInfo = ((PCNRDRAGINFO)mp2)->pDragInfo;
3103 DrgAccessDraginfo(pDInfo); /* Access DRAGINFO */
3104 DrgFreeDraginfo(pDInfo); /* Free DRAGINFO */
3105 }
3106#endif
3107 return 0;
3108
3109 case CN_DRAGAFTER:
3110 case CN_DRAGOVER:
3111 if(mp2) {
3112
3113 PDRAGITEM pDItem; /* Pointer to DRAGITEM */
3114 PDRAGINFO pDInfo; /* Pointer to DRAGINFO */
3115 PCNRITEM pci;
3116 USHORT uso;
3117
3118 pci = (PCNRITEM)((PCNRDRAGINFO)mp2)->pRecord;
3119 pDInfo = ((PCNRDRAGINFO)mp2)->pDragInfo;
3120 DrgAccessDraginfo(pDInfo); /* Access DRAGINFO */
3121 if(*dcd->directory &&
3122 (driveflags[toupper(*dcd->directory) - 'A'] &
3123 DRIVE_NOTWRITEABLE)) {
3124 DrgFreeDraginfo(pDInfo);
3125 return MRFROM2SHORT(DOR_DROP, /* Return okay to link */
3126 DO_LINK); /* (compare) only */
3127 }
3128 if(pci) {
3129 if(pci->rc.flRecordAttr & CRA_SOURCE) {
3130 DrgFreeDraginfo(pDInfo);
3131 return(MRFROM2SHORT(DOR_NODROP,0));
3132 }
3133 uso = pDInfo->usOperation;
3134 if(uso == DO_DEFAULT)
3135 uso = (fCopyDefault) ? DO_COPY : DO_MOVE;
3136 if(!(pci->attrFile & FILE_DIRECTORY)) {
3137 if(uso != DO_LINK && uso != DO_COPY &&
3138 uso != DO_MOVE) {
3139 DrgFreeDraginfo(pDInfo);
3140 return MRFROM2SHORT(DOR_NODROP,0);
3141 }
3142 if(uso != DO_LINK &&
3143 !(driveflags[toupper(*pci->szFileName) - 'A'] &
3144 DRIVE_NOTWRITEABLE)) {
3145
3146 ARC_TYPE *info = NULL;
3147
3148 if(!fQuickArcFind &&
3149 !(driveflags[toupper(*pci->szFileName) - 'A'] &
3150 DRIVE_SLOW))
3151 info = find_type(pci->szFileName,NULL);
3152 else
3153 info = quick_find_type(pci->szFileName,NULL);
3154 if(!info || ((uso == DO_MOVE && !info->move) ||
3155 (uso == DO_COPY && !info->create))) {
3156 DrgFreeDraginfo(pDInfo);
3157 return MRFROM2SHORT(DOR_NODROP,0);
3158 }
3159 }
3160 }
3161 }
3162 pDItem = DrgQueryDragitemPtr(pDInfo, /* Access DRAGITEM */
3163 0); /* Index to DRAGITEM */
3164 if(DrgVerifyRMF(pDItem, /* Check valid rendering */
3165 DRM_OS2FILE, /* mechanisms and data */
3166 NULL) ||
3167 ((!pci || (pci->attrFile & FILE_DIRECTORY)) &&
3168 DrgVerifyRMF(pDItem,
3169 DRM_FM2ARCMEMBER,
3170 DRF_FM2ARCHIVE))) { /* formats */
3171 DrgFreeDraginfo(pDInfo); /* Free DRAGINFO */
3172 if(driveflags[toupper(*dcd->directory) - 'A'] &
3173 DRIVE_NOTWRITEABLE)
3174 return MRFROM2SHORT(DOR_DROP,DO_LINK);
3175 if(toupper(*dcd->directory) < 'C')
3176 return MRFROM2SHORT(DOR_DROP,DO_COPY);
3177 return MRFROM2SHORT(DOR_DROP, /* Return okay to drop */
3178 ((fCopyDefault) ?
3179 DO_COPY :
3180 DO_MOVE));
3181 }
3182 DrgFreeDraginfo(pDInfo); /* Free DRAGINFO */
3183 }
3184 return MRFROM2SHORT(DOR_NODROP,0); /* Drop not valid */
3185
3186 case CN_INITDRAG:
3187 {
3188 BOOL wasemphasized = FALSE;
3189 PCNRDRAGINIT pcd = (PCNRDRAGINIT)mp2;
3190 PCNRITEM pci;
3191
3192 if(pcd) {
3193 pci = (PCNRITEM)pcd->pRecord;
3194 if(pci) {
3195 if((INT)pci == -1)
3196 pci = NULL;
3197 else if(pci->rc.flRecordAttr & CRA_SELECTED)
3198 wasemphasized = TRUE;
3199 }
3200 else if(!*dcd->directory ||
3201 IsRoot(dcd->directory)) {
3202 DosBeep(50,100);
3203 break;
3204 }
3205 if(hwndStatus2) {
3206 if(pci)
3207 WinSetWindowText(hwndStatus2,
3208 GetPString(IDS_DRAGFILEOBJTEXT));
3209 else
3210 WinSetWindowText(hwndStatus2,
3211 GetPString(IDS_DRAGDIRTEXT));
3212 }
3213 if(DoFileDrag(hwnd,
3214 dcd->hwndObject,
3215 mp2,
3216 NULL,
3217 (pci) ? NULL : dcd->directory,
3218 (pci) ? TRUE : FALSE)) {
3219 if(pci && fUnHilite && wasemphasized)
3220 UnHilite(hwnd,
3221 TRUE,
3222 &dcd->lastselection);
3223 }
3224 if(hwndStatus2) {
3225 WinSetFocus(HWND_DESKTOP,hwnd);
3226 PostMsg(hwnd,
3227 UM_RESCAN,
3228 MPVOID,
3229 MPVOID);
3230 }
3231 }
3232 }
3233 return 0;
3234
3235 case CN_DROP:
3236 if(mp2) {
3237
3238 LISTINFO *li;
3239 ULONG action = UM_ACTION;
3240
3241 li = DoFileDrop(hwnd,dcd->directory,TRUE,mp1,mp2);
3242 if(li) {
3243 if(li->list && li->list[0] && IsRoot(li->list[0]))
3244 li->type = DO_LINK;
3245 else if(fDragndropDlg && (!*li->arcname || !li->info)) {
3246
3247 CHECKLIST cl;
3248
3249 memset(&cl,0,sizeof(cl));
3250 cl.size = sizeof(cl);
3251 cl.flags = li->type;
3252 cl.list = li->list;
3253 cl.cmd = li->type;
3254 cl.prompt = li->targetpath;
3255 li->type = WinDlgBox(HWND_DESKTOP,dcd->hwndParent,
3256 DropListProc,FM3ModHandle,
3257 DND_FRAME,MPFROMP(&cl));
3258 if(!li->type) {
3259 FreeListInfo(li);
3260 return 0;
3261 }
3262 li->list = cl.list;
3263 if(!li->list || !li->list[0]) {
3264 FreeListInfo(li);
3265 return 0;
3266 }
3267 }
3268 switch(li->type) {
3269 case DND_LAUNCH:
3270 strcat(li->targetpath," %a");
3271 ExecOnList(dcd->hwndParent,li->targetpath,
3272 PROMPT | WINDOWED,NULL,li->list,NULL);
3273 FreeList(li->list);
3274 li->list = NULL;
3275 break;
3276 case DO_LINK:
3277 if(fLinkSetsIcon) {
3278 li->type = IDM_SETICON;
3279 action = UM_MASSACTION;
3280 }
3281 else
3282 li->type = IDM_COMPARE;
3283 break;
3284 case DND_EXTRACT:
3285 if(*li->targetpath && !IsFile(li->targetpath))
3286 li->type = IDM_EXTRACT;
3287 break;
3288 case DND_MOVE:
3289 li->type = IDM_MOVE;
3290 if(*li->targetpath && IsFile(li->targetpath) == 1) {
3291 action = UM_MASSACTION;
3292 li->type = IDM_ARCHIVEM;
3293 }
3294 break;
3295 case DND_WILDMOVE:
3296 li->type = IDM_WILDMOVE;
3297 if(*li->targetpath && IsFile(li->targetpath) == 1) {
3298 action = UM_MASSACTION;
3299 li->type = IDM_ARCHIVEM;
3300 }
3301 break;
3302 case DND_OBJECT:
3303 li->type = IDM_OBJECT;
3304 action = UM_MASSACTION;
3305 break;
3306 case DND_SHADOW:
3307 li->type = IDM_SHADOW;
3308 action = UM_MASSACTION;
3309 break;
3310 case DND_COMPARE:
3311 li->type = IDM_COMPARE;
3312 break;
3313 case DND_SETICON:
3314 action = UM_MASSACTION;
3315 li->type = IDM_SETICON;
3316 break;
3317 case DND_COPY:
3318 li->type = IDM_COPY;
3319 if(*li->targetpath && IsFile(li->targetpath) == 1) {
3320 action = UM_MASSACTION;
3321 li->type = IDM_ARCHIVE;
3322 }
3323 break;
3324 case DND_WILDCOPY:
3325 li->type = IDM_WILDCOPY;
3326 if(*li->targetpath && IsFile(li->targetpath) == 1) {
3327 action = UM_MASSACTION;
3328 li->type = IDM_ARCHIVE;
3329 }
3330 break;
3331 default:
3332 if(*li->arcname && li->info) {
3333 action = UM_MASSACTION;
3334 li->type = (li->type == DO_MOVE) ? IDM_FAKEEXTRACTM : IDM_FAKEEXTRACT;
3335 }
3336 else if(*li->targetpath && IsFile(li->targetpath) == 1) {
3337 action = UM_MASSACTION;
3338 li->type = (li->type == DO_MOVE) ? IDM_ARCHIVEM : IDM_ARCHIVE;
3339 }
3340 else
3341 li->type = (li->type == DO_MOVE) ? IDM_MOVE : IDM_COPY;
3342 break;
3343 }
3344 if(!li->list || !li->list[0])
3345 FreeListInfo(li);
3346 else if(!PostMsg(dcd->hwndObject,action,MPFROMP(li),MPVOID))
3347 FreeListInfo(li);
3348 else {
3349
3350 USHORT usop = 0;
3351
3352 switch(li->type) {
3353 case IDM_COPY:
3354 case IDM_WILDCOPY:
3355 usop = DO_COPY;
3356 break;
3357 case IDM_MOVE:
3358 case IDM_WILDMOVE:
3359 case IDM_ARCHIVEM:
3360 usop = DO_MOVE;
3361 break;
3362 }
3363 if(usop)
3364 return MRFROM2SHORT(DOR_DROP,usop);
3365 }
3366 }
3367 }
3368 return 0;
3369
3370 case CN_ENDEDIT:
3371 case CN_BEGINEDIT:
3372 {
3373 PFIELDINFO pfi = ((PCNREDITDATA)mp2)->pFieldInfo;
3374 PCNRITEM pci = (PCNRITEM)((PCNREDITDATA)mp2)->pRecord;
3375
3376 if(pfi || pci) {
3377
3378 MRESULT mre;
3379
3380 mre = CnrDirectEdit(hwnd,msg,mp1,mp2);
3381 if(mre != (MRESULT)-1)
3382 return mre;
3383 }
3384 else if(!pfi && !pci)
3385 PostMsg(hwnd,
3386 UM_FIXCNRMLE,
3387 MPFROMLONG(CCHMAXPATH),
3388 MPVOID);
3389 }
3390 return 0;
3391
3392 case CN_REALLOCPSZ:
3393 {
3394 PFIELDINFO pfi = ((PCNREDITDATA)mp2)->pFieldInfo;
3395 PCNRITEM pci = (PCNRITEM)((PCNREDITDATA)mp2)->pRecord;
3396 HWND hwndMLE;
3397 static CHAR szData[CCHMAXPATH];
3398 CHAR testname[CCHMAXPATH],*p;
3399
3400 if(!pci && !pfi) {
3401 hwndMLE = WinWindowFromID(hwnd,CID_MLE);
3402 WinQueryWindowText(hwndMLE,
3403 sizeof(szData),
3404 szData);
3405 p = strchr(szData,'\n');
3406 if(p)
3407 *p = 0;
3408 p = strchr(szData,'\r');
3409 if(p)
3410 *p = 0;
3411 bstrip(szData);
3412 if(*szData) {
3413 if(!DosQueryPathInfo(szData,
3414 FIL_QUERYFULLNAME,
3415 testname,
3416 sizeof(testname))) {
3417 if(!SetDir(dcd->hwndParent,
3418 hwnd,
3419 testname,
3420 1))
3421 PostMsg(hwnd,
3422 UM_SETDIR,
3423 MPFROMP(testname),
3424 MPVOID);
3425 }
3426 }
3427 }
3428 else {
3429
3430 MRESULT mre;
3431
3432 mre = CnrDirectEdit(hwnd,msg,mp1,mp2);
3433 if(mre != (MRESULT)-1)
3434 return mre;
3435 }
3436 }
3437 return 0;
3438
3439 case CN_EMPHASIS:
3440 if(mp2) {
3441
3442 PNOTIFYRECORDEMPHASIS pre = mp2;
3443 PCNRITEM pci;
3444 CHAR s[CCHMAXPATHCOMP + 91],tb[81],tf[81],
3445 *tbk;
3446
3447 pci = (PCNRITEM)((pre) ? pre->pRecord : NULL);
3448 if(!pci) {
3449 if(hwndStatus2)
3450 WinSetWindowText(hwndStatus2,NullStr);
3451 if(fMoreButtons) {
3452 WinSetWindowText(hwndName,NullStr);
3453 WinSetWindowText(hwndDate,NullStr);
3454 WinSetWindowText(hwndAttr,NullStr);
3455 }
3456 if(hwndMain)
3457 WinSendMsg(hwndMain,
3458 UM_LOADFILE,
3459 MPVOID,
3460 MPVOID);
3461 break;
3462 }
3463 if(pre->fEmphasisMask & CRA_SELECTED) {
3464 if(pci->rc.flRecordAttr & CRA_SELECTED) {
3465 dcd->selectedbytes += (pci->cbFile + pci->easize);
3466 dcd->selectedfiles++;
3467 }
3468 else if(dcd->selectedfiles) {
3469 dcd->selectedbytes -= (pci->cbFile + pci->easize);
3470 dcd->selectedfiles--;
3471 }
3472 if(!dcd->suspendview) {
3473 commafmt(tf,sizeof(tf),dcd->selectedfiles);
3474 if(dcd->selectedbytes > 1024) {
3475 tbk = "k";
3476 commafmt(tb,sizeof(tb),dcd->selectedbytes / 1024L);
3477 }
3478 else {
3479 tbk = "b";
3480 commafmt(tb,sizeof(tb),dcd->selectedbytes);
3481 }
3482 sprintf(s,"%s / %s%s",tf,tb,tbk);
3483 WinSetDlgItemText(dcd->hwndClient,DIR_SELECTED,s);
3484 }
3485 }
3486 if(!dcd->suspendview && hwndMain &&
3487 (pre->fEmphasisMask & CRA_CURSORED) &&
3488 (pci->rc.flRecordAttr & CRA_CURSORED) &&
3489 WinQueryActiveWindow(dcd->hwndParent) == dcd->hwndFrame) {
3490 if(driveflags[toupper(*pci->szFileName) - 'A'] & DRIVE_SLOW)
3491 WinSendMsg(hwndMain,
3492 UM_LOADFILE,
3493 MPVOID,
3494 MPVOID);
3495 else
3496 WinSendMsg(hwndMain,
3497 UM_LOADFILE,
3498 MPFROMP(pci->szFileName),
3499 MPVOID);
3500 }
3501 if(!dcd->suspendview &&
3502 WinQueryActiveWindow(dcd->hwndParent) == dcd->hwndFrame) {
3503 if(pre->fEmphasisMask & CRA_CURSORED) {
3504 if(pci->rc.flRecordAttr & CRA_CURSORED) {
3505 if(fSplitStatus && hwndStatus2) {
3506 commafmt(tb,sizeof(tb),pci->cbFile + pci->easize);
3507 if(!fMoreButtons)
3508 sprintf(s," %sb %04u/%02u/%02u %02u:%02u:%02u [%s] %s",
3509 tb,pci->date.year,
3510 pci->date.month,pci->date.day,pci->time.hours,
3511 pci->time.minutes,pci->time.seconds,
3512 pci->pszDispAttr,pci->pszFileName);
3513 else {
3514 *tf = 0;
3515 if(pci->cbFile + pci->easize > 1024)
3516 commafmt(tf,sizeof(tf),
3517 (pci->cbFile + pci->easize) / 1024);
3518 sprintf(s,GetPString(IDS_STATUSSIZETEXT),
3519 tb,
3520 (*tf) ? " (" : NullStr,
3521 tf,
3522 (*tf) ? "k)" : NullStr);
3523 }
3524 WinSetWindowText(hwndStatus2,s);
3525 }
3526 if(fMoreButtons) {
3527 WinSetWindowText(hwndName,pci->pszFileName);
3528 sprintf(s,"%04u/%02u/%02u %02u:%02u:%02u",
3529 pci->date.year,pci->date.month,
3530 pci->date.day,pci->time.hours,pci->time.minutes,
3531 pci->time.seconds);
3532 WinSetWindowText(hwndDate,s);
3533 WinSetWindowText(hwndAttr,pci->pszDispAttr);
3534 }
3535 }
3536 }
3537 }
3538 }
3539 else
3540 DosBeep(2000,100);
3541 break;
3542
3543 case CN_ENTER:
3544 if(mp2) {
3545
3546 PCNRITEM pci = (PCNRITEM)((PNOTIFYRECORDENTER)mp2)->pRecord;
3547 FILEFINDBUF3 ffb;
3548 HDIR hDir = HDIR_CREATE;
3549 ULONG nm = 1L;
3550 APIRET status = 0;
3551
3552 SetShiftState();
3553 if(pci) {
3554 if(pci->rc.flRecordAttr & CRA_INUSE)
3555 break;
3556 DosError(FERR_DISABLEHARDERR);
3557 status = DosFindFirst(pci->szFileName,
3558 &hDir,
3559 FILE_NORMAL | FILE_DIRECTORY |
3560 FILE_ARCHIVED | FILE_READONLY |
3561 FILE_HIDDEN | FILE_SYSTEM,
3562 &ffb,
3563 sizeof(ffb),
3564 &nm,
3565 FIL_STANDARD);
3566 priority_bumped();
3567 if(!status) {
3568 DosFindClose(hDir);
3569 if(ffb.attrFile & FILE_DIRECTORY) {
3570 if((shiftstate & (KC_CTRL | KC_ALT)) ==
3571 (KC_CTRL | KC_ALT))
3572 PostMsg(hwnd,
3573 WM_COMMAND,
3574 MPFROM2SHORT(IDM_SHOWALLFILES,0),
3575 MPVOID);
3576 else if((shiftstate & (KC_CTRL | KC_SHIFT)) ==
3577 (KC_CTRL | KC_SHIFT))
3578 OpenObject(pci->szFileName,
3579 Settings,
3580 dcd->hwndFrame);
3581 else if(shiftstate & KC_CTRL)
3582 OpenObject(pci->szFileName,
3583 Default,
3584 dcd->hwndFrame);
3585 else if(shiftstate & KC_SHIFT) {
3586
3587 HWND hwndDir;
3588
3589 hwndDir = OpenDirCnr((HWND)0,
3590 dcd->hwndParent,
3591 dcd->hwndFrame,
3592 FALSE,
3593 pci->szFileName);
3594 if(hwndDir) {
3595 if(fMinOnOpen)
3596 WinSetWindowPos(dcd->hwndFrame,
3597 HWND_BOTTOM,
3598 0,
3599 0,
3600 0,
3601 0,
3602 SWP_MINIMIZE | SWP_ZORDER);
3603 if(fAutoTile)
3604 TileChildren(dcd->hwndParent,
3605 TRUE);
3606 WinSetWindowPos(hwndDir,
3607 HWND_TOP,
3608 0,
3609 0,
3610 0,
3611 0,
3612 SWP_ACTIVATE);
3613 }
3614 }
3615 else {
3616 strcpy(dcd->previous,dcd->directory);
3617 strcpy(dcd->directory,pci->szFileName);
3618 DosEnterCritSec();
3619 dcd->stopflag++;
3620 DosExitCritSec();
3621 if(!PostMsg(dcd->hwndObject,
3622 UM_RESCAN,
3623 MPVOID,
3624 MPFROMLONG(1L))) {
3625 DosEnterCritSec();
3626 dcd->stopflag--;
3627 DosExitCritSec();
3628 }
3629 else if(*dcd->directory) {
3630 if(hwndMain)
3631 WinSendMsg(hwndMain,
3632 UM_SETUSERLISTNAME,
3633 MPFROMP(dcd->directory),
3634 MPVOID);
3635 else
3636 add_udir(FALSE,
3637 dcd->directory);
3638 }
3639 }
3640 }
3641 else {
3642
3643 SWP swp;
3644
3645 WinQueryWindowPos(dcd->hwndFrame,&swp);
3646 WinSendMsg(hwnd,
3647 CM_SETRECORDEMPHASIS,
3648 MPFROMP(pci),
3649 MPFROM2SHORT(TRUE,CRA_INUSE));
3650 DefaultViewKeys(hwnd,
3651 dcd->hwndFrame,
3652 dcd->hwndParent,
3653 &swp,
3654 pci->szFileName);
3655 WinSendMsg(hwnd,
3656 CM_SETRECORDEMPHASIS,
3657 MPFROMP(pci),
3658 MPFROM2SHORT(FALSE,
3659 CRA_INUSE |
3660 ((fUnHilite) ?
3661 CRA_SELECTED :
3662 0)));
3663 }
3664 }
3665 else {
3666 if(!*dcd->directory ||
3667 IsValidDir(dcd->directory)) {
3668 NotifyError(pci->szFileName,
3669 status);
3670 WinSendMsg(hwnd,
3671 CM_REMOVERECORD,
3672 MPFROMP(&pci),
3673 MPFROM2SHORT(1,
3674 CMA_FREE | CMA_INVALIDATE |
3675 CMA_ERASE));
3676 if(hwndStatus)
3677 WinSetWindowText(hwndStatus,
3678 GetPString(IDS_RESCANSUGGESTEDTEXT));
3679 }
3680 else {
3681 DosEnterCritSec();
3682 dcd->stopflag++;
3683 DosExitCritSec();
3684 if(!PostMsg(dcd->hwndObject,
3685 UM_RESCAN,
3686 MPVOID,
3687 MPFROMLONG(1L))) {
3688 DosEnterCritSec();
3689 dcd->stopflag--;
3690 DosExitCritSec();
3691 }
3692 else if(*dcd->directory) {
3693 if(hwndMain)
3694 WinSendMsg(hwndMain,
3695 UM_SETUSERLISTNAME,
3696 MPFROMP(dcd->directory),
3697 MPVOID);
3698 else
3699 add_udir(FALSE,
3700 dcd->directory);
3701 }
3702 }
3703 }
3704 }
3705 else if(*dcd->directory)
3706 OpenObject(dcd->directory,
3707 Default,
3708 hwnd);
3709 }
3710 break;
3711 }
3712 break;
3713 }
3714 return 0;
3715
3716 case UM_LOADFILE:
3717 if(dcd && mp2) {
3718
3719 HWND ret;
3720
3721 ret = StartMLEEditor(dcd->hwndParent,
3722 (INT)mp1,
3723 (CHAR *)mp2,
3724 dcd->hwndFrame);
3725 if(mp2)
3726 free((CHAR *)mp2);
3727 return MRFROMLONG(ret);
3728 }
3729 return 0;
3730
3731 case WM_SAVEAPPLICATION:
3732 if(dcd &&
3733 ParentIsDesktop(hwnd,dcd->hwndParent)) {
3734
3735 SWP swp;
3736
3737 WinQueryWindowPos(dcd->hwndFrame,&swp);
3738 if(!(swp.fl & (SWP_HIDE | SWP_MINIMIZE | SWP_MAXIMIZE)))
3739 PrfWriteProfileData(fmprof,
3740 appname,
3741 "VDirSizePos",
3742 &swp,
3743 sizeof(swp));
3744 }
3745 break;
3746
3747 case WM_CLOSE:
3748 WinSendMsg(hwnd,
3749 WM_SAVEAPPLICATION,
3750 MPVOID,
3751 MPVOID);
3752 if(LastDir == hwnd)
3753 LastDir = (HWND)0;
3754 if(dcd) {
3755 dcd->stopflag++;
3756 if(!dcd->dontclose &&
3757 ParentIsDesktop(dcd->hwndFrame,(HWND)0))
3758 PostMsg((HWND)0,
3759 WM_QUIT,
3760 MPVOID,
3761 MPVOID);
3762 if(!dcd->hwndObject ||
3763 !PostMsg(dcd->hwndObject,
3764 WM_CLOSE,
3765 MPVOID,
3766 MPVOID)) {
3767 if(dcd->hwndObject)
3768 WinSetWindowPtr(dcd->hwndObject,
3769 0,
3770 NULL);
3771 WinSetWindowPtr(hwnd,
3772 0,
3773 NULL);
3774 if(dcd->hwndRestore)
3775 WinSetWindowPos(dcd->hwndRestore,
3776 HWND_TOP,
3777 0,
3778 0,
3779 0,
3780 0,
3781 SWP_RESTORE | SWP_SHOW | SWP_ACTIVATE |
3782 SWP_ZORDER);
3783 FreeList(dcd->lastselection);
3784 free(dcd);
3785 DosPostEventSem(CompactSem);
3786 }
3787 }
3788 WinDestroyWindow(WinQueryWindow(WinQueryWindow(hwnd,QW_PARENT),
3789 QW_PARENT));
3790 return 0;
3791
3792 case WM_DESTROY:
3793 if(DirMenu)
3794 WinDestroyWindow(DirMenu);
3795 if(DirCnrMenu)
3796 WinDestroyWindow(DirCnrMenu);
3797 if(FileMenu)
3798 WinDestroyWindow(FileMenu);
3799 DirMenu = DirCnrMenu = FileMenu = (HWND)0;
3800 EmptyCnr(hwnd);
3801 break;
3802 }
3803 return (dcd && dcd->oldproc) ? dcd->oldproc(hwnd,msg,mp1,mp2) :
3804 PFNWPCnr(hwnd,msg,mp1,mp2);
3805}
3806
3807
3808HWND StartDirCnr (HWND hwndParent,CHAR *directory,HWND hwndRestore,
3809 ULONG flags) {
3810
3811 /* bitmapped flags:
3812 * 0x00000001 = don't close app when window closes
3813 * 0x00000002 = no frame controls
3814 */
3815
3816 HWND hwndFrame = (HWND)0,hwndClient;
3817 ULONG FrameFlags = FCF_TITLEBAR | FCF_SYSMENU |
3818 FCF_SIZEBORDER | FCF_MINMAX |
3819 FCF_ICON | FCF_NOBYTEALIGN |
3820 FCF_ACCELTABLE;
3821 USHORT id;
3822 static USHORT idinc = 0;
3823 DIRCNRDATA *dcd;
3824 static BOOL first = FALSE;
3825
3826 if(flags & 2)
3827 FrameFlags &= (~(FCF_TITLEBAR | FCF_SYSMENU | FCF_SIZEBORDER |
3828 FCF_MINMAX | FCF_ICON));
3829 if(!idinc)
3830 idinc = (rand() % 100);
3831 if(!hwndParent)
3832 hwndParent = HWND_DESKTOP;
3833 if(ParentIsDesktop(hwndParent,hwndParent))
3834 FrameFlags |= (FCF_TASKLIST | FCF_MENU);
3835 if(!hwndMain && !first) {
3836 if(DirCnrMenu) {
3837
3838 MENUITEM mi;
3839
3840 memset(&mi,0,sizeof(mi));
3841 WinSendMsg(DirCnrMenu,
3842 MM_DELETEITEM,
3843 MPFROM2SHORT(IDM_DRIVESMENU,FALSE),
3844 MPVOID);
3845 mi.iPosition = MIT_END;
3846 mi.afStyle = MIS_TEXT;
3847 mi.id = IDM_DRIVESMENU;
3848 WinSendMsg(DirCnrMenu,
3849 MM_INSERTITEM,
3850 MPFROMP(&mi),
3851 MPFROMP(GetPString(IDS_DRIVESMENUTEXT)));
3852 }
3853 first = TRUE;
3854 }
3855 if(directory) {
3856 hwndFrame = WinCreateStdWindow(hwndParent,
3857 WS_VISIBLE,
3858 &FrameFlags,
3859 GetPString(IDS_WCDIRCONTAINER),
3860 NULL,
3861 WS_VISIBLE | fwsAnimate,
3862 FM3ModHandle,
3863 DIR_FRAME,
3864 &hwndClient);
3865 if(hwndFrame && hwndClient) {
3866 id = DIR_FRAME + idinc++;
3867 if(idinc > 99)
3868 idinc = 0;
3869 WinSetWindowUShort(hwndFrame,QWS_ID,id);
3870 dcd = malloc(sizeof(DIRCNRDATA));
3871 if(dcd) {
3872 memset(dcd,0,sizeof(DIRCNRDATA));
3873 dcd->size = sizeof(DIRCNRDATA);
3874 dcd->id = id;
3875 dcd->type = DIR_FRAME;
3876 dcd->hwndParent = (hwndParent) ? hwndParent : HWND_DESKTOP;
3877 dcd->hwndFrame = hwndFrame;
3878 dcd->hwndClient = hwndClient;
3879 dcd->hwndRestore = hwndRestore;
3880 dcd->dontclose = ((flags & 1) != 0);
3881 strcpy(dcd->directory,directory);
3882 add_udir(FALSE,directory);
3883 {
3884 PFNWP oldproc;
3885
3886 oldproc = WinSubclassWindow(hwndFrame,
3887 (PFNWP)DirFrameWndProc);
3888 WinSetWindowPtr(hwndFrame,
3889 0,
3890 (PVOID)oldproc);
3891 }
3892 dcd->hwndCnr = WinCreateWindow(hwndClient,
3893 WC_CONTAINER,
3894 NULL,
3895 CCS_AUTOPOSITION | CCS_MINIICONS |
3896 CCS_MINIRECORDCORE | ulCnrType |
3897 WS_VISIBLE,
3898 0,
3899 0,
3900 0,
3901 0,
3902 hwndClient,
3903 HWND_TOP,
3904 (ULONG)DIR_CNR,
3905 NULL,
3906 NULL);
3907 if(dcd->hwndCnr) {
3908 WinSetWindowPtr(dcd->hwndCnr,QWL_USER,(PVOID)dcd);
3909 dcd->oldproc = WinSubclassWindow(dcd->hwndCnr,
3910 (PFNWP)DirCnrWndProc);
3911 {
3912 USHORT ids[] = {DIR_TOTALS,DIR_SELECTED,DIR_VIEW,DIR_SORT,
3913 DIR_FILTER,DIR_FOLDERICON,DIR_MAX,0};
3914
3915 if(!(flags & 2))
3916 ids[6] = 0;
3917 CommonCreateTextChildren(dcd->hwndClient,
3918 GetPString(IDS_WCDIRSTATUS),
3919 ids);
3920 }
3921 if(!PostMsg(dcd->hwndCnr,
3922 UM_SETUP,
3923 MPVOID,
3924 MPVOID))
3925 WinSendMsg(dcd->hwndCnr,
3926 UM_SETUP,
3927 MPVOID,
3928 MPVOID);
3929 if(FrameFlags & FCF_TASKLIST) {
3930
3931 SWP swp,swpD;
3932 ULONG size = sizeof(swp);
3933 LONG cxScreen,cyScreen;
3934
3935 WinQueryTaskSizePos(WinQueryAnchorBlock(hwndFrame),0,&swp);
3936 if(PrfQueryProfileData(fmprof,
3937 appname,
3938 "VDirSizePos",
3939 &swpD,
3940 &size)) {
3941 cxScreen = WinQuerySysValue(HWND_DESKTOP,SV_CXSCREEN);
3942 cyScreen = WinQuerySysValue(HWND_DESKTOP,SV_CYSCREEN);
3943 if(swp.x + swpD.cx > cxScreen)
3944 swp.x = cxScreen - swpD.cx;
3945 if(swp.y + swpD.cy > cyScreen)
3946 swp.y = cyScreen - swpD.cy;
3947 swp.cx = swpD.cx;
3948 swp.cy = swpD.cy;
3949 }
3950 WinSetWindowPos(hwndFrame,
3951 HWND_TOP,
3952 swp.x,
3953 swp.y,
3954 swp.cx,
3955 swp.cy,
3956 SWP_SIZE | SWP_MOVE | SWP_SHOW | SWP_ZORDER |
3957 SWP_ACTIVATE);
3958 }
3959 }
3960 else {
3961 PostMsg(hwndClient,
3962 WM_CLOSE,
3963 MPVOID,
3964 MPVOID);
3965 free(dcd);
3966 hwndFrame = (HWND)0;
3967 }
3968 }
3969 else {
3970 PostMsg(hwndClient,
3971 WM_CLOSE,
3972 MPVOID,
3973 MPVOID);
3974 hwndFrame = (HWND)0;
3975 }
3976 }
3977 }
3978 return hwndFrame;
3979}
3980
Note: See TracBrowser for help on using the repository browser.