source: trunk/dll/dircnrs.c@ 171

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

More large file formatting updates

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