source: trunk/dll/dircnrs.c@ 145

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

Rework Win_Error usage

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