source: trunk/dll/dircnrs.c@ 123

Last change on this file since 123 was 123, checked in by root, 21 years ago

Rework lstrip/rstrip usage

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