source: trunk/dll/dircnrs.c@ 36

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

Handle large partitions

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