source: trunk/dll/dircnrs.c@ 213

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

Drop unused

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