source: trunk/dll/dircnrs.c@ 186

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

Use QWL_USER

  • 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 186 2005-06-05 19:05:21Z 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 ULONG ulrc;
1187 DIRCNRDATA *dcd = WinQueryWindowPtr(hwnd,QWL_USER);
1188
1189 switch(msg) {
1190 case DM_PRINTOBJECT:
1191 return MRFROMLONG(DRR_TARGET);
1192
1193 case DM_DISCARDOBJECT:
1194 if(dcd)
1195 return WinSendMsg(dcd->hwndObject,msg,mp1,mp2);
1196 else
1197 return MRFROMLONG(DRR_TARGET);
1198
1199 case WM_CHAR:
1200 shiftstate = (SHORT1FROMMP(mp1) & (KC_SHIFT | KC_ALT | KC_CTRL));
1201 if(SHORT1FROMMP(mp1) & KC_KEYUP)
1202 return (MRESULT)TRUE;
1203 if(SHORT1FROMMP(mp1) & KC_VIRTUALKEY) {
1204 switch(SHORT2FROMMP(mp2)) {
1205 case VK_INSERT:
1206 if((shiftstate & KC_CTRL) == KC_CTRL)
1207 PostMsg(hwnd,
1208 WM_COMMAND,
1209 MPFROM2SHORT(IDM_MKDIR,0),
1210 MPVOID);
1211 else if((shiftstate & KC_ALT) == KC_ALT)
1212 PostMsg(hwnd,
1213 WM_COMMAND,
1214 MPFROM2SHORT(IDM_CREATE,0),
1215 MPVOID);
1216 break;
1217 case VK_PAGEUP:
1218 if((shiftstate & KC_CTRL) == KC_CTRL)
1219 PostMsg(hwnd,
1220 WM_COMMAND,
1221 MPFROM2SHORT(IDM_PARENT,0),
1222 MPVOID);
1223 break;
1224 case VK_PAGEDOWN:
1225 if((shiftstate & KC_CTRL) == KC_CTRL)
1226 PostMsg(hwnd,
1227 WM_COMMAND,
1228 MPFROM2SHORT(IDM_PREVIOUS,0),
1229 MPVOID);
1230 break;
1231 case VK_HOME:
1232 if((shiftstate & KC_CTRL) == KC_CTRL && dcd) {
1233
1234 CHAR s[CCHMAXPATH],*p;
1235
1236 strcpy(s,dcd->directory);
1237 p = strchr(s,'\\');
1238 if(p) {
1239 p++;
1240 *p = 0;
1241 WinSendMsg(hwnd,
1242 UM_SETDIR,
1243 MPFROMP(s),
1244 MPVOID);
1245 }
1246 }
1247 break;
1248 case VK_DELETE:
1249 if((shiftstate & KC_CTRL) == KC_CTRL)
1250 PostMsg(hwnd,WM_COMMAND,MPFROM2SHORT(IDM_PERMDELETE,0),MPVOID);
1251 else if((shiftstate & KC_SHIFT) == KC_SHIFT)
1252 PostMsg(hwnd,WM_COMMAND,MPFROM2SHORT(IDM_SAVETOCLIP,0),MPVOID);
1253 else
1254 PostMsg(hwnd,WM_COMMAND,MPFROM2SHORT(IDM_DELETE,0),MPVOID);
1255 break;
1256 }
1257 }
1258 if(shiftstate || fNoSearch)
1259 break;
1260 if(SHORT1FROMMP(mp1) & KC_CHAR) {
1261
1262 ULONG thistime,len;
1263 SEARCHSTRING srch;
1264 PCNRITEM pci;
1265
1266 if(!dcd)
1267 break;
1268 switch(SHORT1FROMMP(mp2)) {
1269 case '\x1b':
1270 case '\r':
1271 case '\n':
1272 dcd->lasttime = 0;
1273 *dcd->szCommonName = 0;
1274 break;
1275 default:
1276 thistime = WinQueryMsgTime(WinQueryAnchorBlock(hwnd));
1277 if(thistime > dcd->lasttime + 1250)
1278 *dcd->szCommonName = 0;
1279 dcd->lasttime = thistime;
1280 if(SHORT1FROMMP(mp2) == ' ' && !dcd->szCommonName)
1281 break;
1282KbdRetry:
1283 len = strlen(dcd->szCommonName);
1284 if(len >= CCHMAXPATH - 1) {
1285 *dcd->szCommonName = 0;
1286 len = 0;
1287 }
1288 dcd->szCommonName[len] = toupper(SHORT1FROMMP(mp2));
1289 dcd->szCommonName[len + 1] = 0;
1290 memset(&srch,0,sizeof(SEARCHSTRING));
1291 srch.cb = (ULONG)sizeof(SEARCHSTRING);
1292 srch.pszSearch = (PSZ)dcd->szCommonName;
1293 srch.fsPrefix = TRUE;
1294 srch.fsCaseSensitive = FALSE;
1295 srch.usView = CV_ICON;
1296 pci = WinSendMsg(hwnd,CM_SEARCHSTRING,MPFROMP(&srch),
1297 MPFROMLONG(CMA_FIRST));
1298 if(pci && (INT)pci != -1) {
1299
1300 USHORT attrib = CRA_CURSORED;
1301
1302 /* make found item current item */
1303 if(!stricmp(pci->pszFileName,dcd->szCommonName))
1304 attrib |= CRA_SELECTED;
1305 WinSendMsg(hwnd,CM_SETRECORDEMPHASIS,MPFROMP(pci),
1306 MPFROM2SHORT(TRUE,attrib));
1307 /* make sure that record shows in viewport */
1308 ShowCnrRecord(hwnd,(PMINIRECORDCORE)pci);
1309 return (MRESULT)TRUE;
1310 }
1311 else {
1312 if(SHORT1FROMMP(mp2) == ' ') {
1313 dcd->szCommonName[len] = 0;
1314 break;
1315 }
1316 *dcd->szCommonName = 0;
1317 dcd->lasttime = 0;
1318 if(len) // retry as first letter if no match
1319 goto KbdRetry;
1320 }
1321 break;
1322 }
1323 }
1324 break;
1325
1326 case WM_MOUSEMOVE:
1327 case WM_BUTTON1UP:
1328 case WM_BUTTON2UP:
1329 case WM_BUTTON3UP:
1330 case WM_CHORD:
1331 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
1332 break;
1333
1334 case WM_BUTTON1MOTIONEND:
1335 {
1336 CNRINFO cnri;
1337
1338 memset(&cnri,0,sizeof(CNRINFO));
1339 cnri.cb = sizeof(CNRINFO);
1340 if(WinSendMsg(hwnd,CM_QUERYCNRINFO,MPFROMP(&cnri),
1341 MPFROMLONG(sizeof(CNRINFO)))) {
1342 if(cnri.flWindowAttr & CV_DETAIL)
1343 PrfWriteProfileData(fmprof,appname,"CnrSplitBar",
1344 (PVOID)&cnri.xVertSplitbar,sizeof(LONG));
1345 }
1346 }
1347 break;
1348
1349 case UM_COMPARE:
1350 if(dcd && mp1 && mp2) {
1351
1352 COMPARE *cmp;
1353 CHAR *leftdir = (CHAR *)mp1,*rightdir = (CHAR *)mp2;
1354
1355 if(!IsFile(leftdir) &&
1356 !IsFile(rightdir)) {
1357 cmp = malloc(sizeof(COMPARE));
1358 if(cmp) {
1359 memset(cmp,0,sizeof(COMPARE));
1360 cmp->size = sizeof(COMPARE);
1361 strcpy(cmp->leftdir,leftdir);
1362 strcpy(cmp->rightdir,rightdir);
1363 cmp->hwndParent = dcd->hwndParent;
1364 cmp->dcd.hwndParent = dcd->hwndParent;
1365 WinDlgBox(HWND_DESKTOP,
1366 HWND_DESKTOP,
1367 CompareDlgProc,
1368 FM3ModHandle,
1369 COMP_FRAME,
1370 MPFROMP(cmp));
1371 }
1372 }
1373 }
1374 return 0;
1375
1376 case WM_PRESPARAMCHANGED:
1377 PresParamChanged(hwnd,
1378 "DirCnr",
1379 mp1,
1380 mp2);
1381 break;
1382
1383 case UM_UPDATERECORDLIST:
1384 if(dcd && mp1)
1385 WinSendMsg(dcd->hwndObject,
1386 msg,
1387 mp1,
1388 mp2);
1389 return 0;
1390
1391 case UM_UPDATERECORD:
1392 if(dcd && mp1) {
1393
1394 CHAR *filename;
1395
1396 filename = mp1;
1397 if(filename)
1398 UpdateCnrRecord(hwnd,
1399 filename,
1400 TRUE,
1401 dcd);
1402 }
1403 return 0;
1404
1405 case WM_SETFOCUS:
1406 /*
1407 * put name of our window (directory name) on status line
1408 */
1409 if(dcd && hwndStatus && mp2) {
1410
1411 PCNRITEM pci = NULL;
1412
1413 if(fAutoView && hwndMain) {
1414 pci = WinSendMsg(hwnd,CM_QUERYRECORDEMPHASIS,MPFROMLONG(CMA_FIRST),
1415 MPFROMSHORT(CRA_CURSORED));
1416 if(pci && (INT)pci != -1 &&
1417 (!(driveflags[toupper(*pci->szFileName) - 'A'] & DRIVE_SLOW)))
1418 WinSendMsg(hwndMain,
1419 UM_LOADFILE,
1420 MPFROMP(pci->szFileName),
1421 MPVOID);
1422 else
1423 WinSendMsg(hwndMain,
1424 UM_LOADFILE,
1425 MPVOID,
1426 MPVOID);
1427 }
1428 if(*dcd->directory) {
1429 if(hwndMain)
1430 WinSendMsg(hwndMain,
1431 UM_SETUSERLISTNAME,
1432 MPFROMP(dcd->directory),
1433 MPVOID);
1434 else
1435 add_udir(FALSE,dcd->directory);
1436 }
1437 if(hwndMain)
1438 PostMsg(hwndMain,
1439 UM_ADVISEFOCUS,
1440 MPFROMLONG(dcd->hwndFrame),
1441 MPVOID);
1442 }
1443 if(mp2) {
1444 LastDir = hwnd;
1445 PostMsg(hwnd,
1446 UM_RESCAN,
1447 MPVOID,
1448 MPVOID);
1449 if(fSwitchTreeOnFocus &&
1450 hwndTree &&
1451 dcd &&
1452 *dcd->directory)
1453 WinSendMsg(hwndTree,
1454 UM_SHOWME,
1455 MPFROMP(dcd->directory),
1456 MPVOID);
1457 }
1458 break;
1459
1460 case UM_SETDIR:
1461 if(dcd && mp1) {
1462
1463 CHAR fullname[CCHMAXPATH];
1464
1465 DosError(FERR_DISABLEHARDERR);
1466 if(!DosQueryPathInfo((CHAR *)mp1,
1467 FIL_QUERYFULLNAME,
1468 fullname,
1469 sizeof(fullname))) {
1470 if(stricmp(dcd->directory,fullname)) {
1471 strcpy(dcd->previous,dcd->directory);
1472 strcpy(dcd->directory,fullname);
1473 DosEnterCritSec();
1474 dcd->stopflag++;
1475 DosExitCritSec();
1476 if(!PostMsg(dcd->hwndObject,
1477 UM_RESCAN,
1478 MPVOID,
1479 MPFROMLONG(1L))) {
1480 strcpy(dcd->directory,dcd->previous);
1481 DosEnterCritSec();
1482 dcd->stopflag--;
1483 DosExitCritSec();
1484 }
1485 else if(*dcd->directory) {
1486 if(hwndMain)
1487 WinSendMsg(hwndMain,
1488 UM_SETUSERLISTNAME,
1489 MPFROMP(dcd->directory),
1490 MPVOID);
1491 else
1492 add_udir(FALSE,
1493 dcd->directory);
1494 }
1495 }
1496 }
1497 }
1498 break;
1499
1500 case UM_RESCAN:
1501 if(dcd) {
1502
1503 CNRINFO cnri;
1504 CHAR s[CCHMAXPATH * 2],tf[81],tb[81];
1505 PCNRITEM pci;
1506
1507 memset(&cnri,0,sizeof(CNRINFO));
1508 cnri.cb = sizeof(CNRINFO);
1509 WinSendMsg(hwnd,
1510 CM_QUERYCNRINFO,
1511 MPFROMP(&cnri),
1512 MPFROMLONG(sizeof(CNRINFO)));
1513 cnri.pszCnrTitle = dcd->directory;
1514 WinSendMsg(hwnd,
1515 CM_SETCNRINFO,
1516 MPFROMP(&cnri),
1517 MPFROMLONG(CMA_CNRTITLE));
1518 dcd->totalfiles = cnri.cRecords;
1519 commafmt(tb,sizeof(tb),dcd->totalfiles);
1520 CommaFmtULL(tf,sizeof(tf),dcd->ullTotalBytes,'K');
1521 sprintf(s,"%s / %s",tb,tf);
1522 WinSetDlgItemText(dcd->hwndClient,DIR_TOTALS,s);
1523 commafmt(tb,sizeof(tb),dcd->selectedfiles);
1524 CommaFmtULL(tf,sizeof(tf),dcd->selectedbytes,'K');
1525 sprintf(s,"%s / %s",tb,tf);
1526 WinSetDlgItemText(dcd->hwndClient,DIR_SELECTED,s);
1527 if(hwndStatus &&
1528 dcd->hwndFrame == WinQueryActiveWindow(dcd->hwndParent)) {
1529 PostMsg(dcd->hwndObject,
1530 UM_RESCAN2,
1531 MPVOID,
1532 MPVOID);
1533 if((fSplitStatus &&
1534 hwndStatus2) ||
1535 fMoreButtons) {
1536 pci = WinSendMsg(hwnd,
1537 CM_QUERYRECORDEMPHASIS,
1538 MPFROMLONG(CMA_FIRST),
1539 MPFROMSHORT(CRA_CURSORED));
1540 if(pci && (INT)pci != -1)
1541 {
1542 if(fSplitStatus && hwndStatus2)
1543 {
1544 CommaFmtULL(tb,sizeof(tb),pci->cbFile + pci->easize,' ');
1545 if(!fMoreButtons)
1546 sprintf(s,
1547 " %s %04u/%02u/%02u %02u:%02u:%02u [%s] %s",
1548 tb,
1549 pci->date.year,
1550 pci->date.month,
1551 pci->date.day,
1552 pci->time.hours,
1553 pci->time.minutes,
1554 pci->time.seconds,
1555 pci->pszDispAttr,
1556 pci->pszFileName);
1557 else {
1558 *tf = 0;
1559 if (pci->cbFile + pci->easize > 1024)
1560 {
1561 CommaFmtULL(tf,sizeof(tf),
1562 pci->cbFile + pci->easize,'K');
1563 }
1564 sprintf(s,
1565 GetPString(IDS_STATUSSIZETEXT),
1566 tb,
1567 *tf ? " (" : NullStr,
1568 tf,
1569 *tf ? ")" : NullStr);
1570 }
1571 WinSetWindowText(hwndStatus2,s);
1572 }
1573 else
1574 WinSetWindowText(hwndStatus2,NullStr);
1575 if(fMoreButtons) {
1576 WinSetWindowText(hwndName,pci->pszFileName);
1577 sprintf(s,
1578 "%04u/%02u/%02u %02u:%02u:%02u",
1579 pci->date.year,
1580 pci->date.month,
1581 pci->date.day,
1582 pci->time.hours,
1583 pci->time.minutes,
1584 pci->time.seconds);
1585 WinSetWindowText(hwndDate,s);
1586 WinSetWindowText(hwndAttr,pci->pszDispAttr);
1587 }
1588 }
1589 else {
1590 WinSetWindowText(hwndStatus2,NullStr);
1591 WinSetWindowText(hwndName,NullStr);
1592 WinSetWindowText(hwndDate,NullStr);
1593 WinSetWindowText(hwndAttr,NullStr);
1594 }
1595 }
1596 }
1597 }
1598 return 0;
1599
1600 case UM_SORTRECORD:
1601 if(dcd) {
1602
1603 CNRINFO cnri;
1604
1605 memset(&cnri,0,sizeof(CNRINFO));
1606 cnri.cb = sizeof(CNRINFO);
1607 WinSendMsg(hwnd,
1608 CM_QUERYCNRINFO,
1609 MPFROMP(&cnri),
1610 MPFROMLONG(sizeof(CNRINFO)));
1611 cnri.pSortRecord = (PVOID)SortDirCnr;
1612 WinSendMsg(hwnd,
1613 CM_SETCNRINFO,
1614 MPFROMP(&cnri),
1615 MPFROMLONG(CMA_PSORTRECORD));
1616 WinSendMsg(hwnd,
1617 CM_SORTRECORD,
1618 MPFROMP(SortDirCnr),
1619 MPFROMLONG(dcd->sortFlags));
1620 }
1621 return 0;
1622
1623 case UM_SETUP:
1624 if(dcd) {
1625 if(!dcd->hwndObject) {
1626 /*
1627 * first time through -- set things up
1628 */
1629
1630 CNRINFO cnri;
1631
1632 RestorePresParams(hwnd,"DirCnr");
1633 LoadDetailsSwitches("DirCnr",dcd);
1634 memset(&cnri,0,sizeof(CNRINFO));
1635 cnri.cb = sizeof(CNRINFO);
1636 WinSendMsg(hwnd,
1637 CM_QUERYCNRINFO,
1638 MPFROMP(&cnri),
1639 MPFROMLONG(sizeof(CNRINFO)));
1640 cnri.cyLineSpacing = 0;
1641 cnri.cxTreeIndent = 12L;
1642
1643 cnri.flWindowAttr &= (~(CV_TREE | CV_ICON | CV_DETAIL | CV_TEXT));
1644 cnri.flWindowAttr |= (CV_NAME | CA_DETAILSVIEWTITLES | CV_MINI |
1645 CV_FLOW);
1646 cnri.pSortRecord = (PVOID)SortDirCnr;
1647
1648 {
1649 ULONG size = sizeof(ULONG);
1650
1651 PrfQueryProfileData(fmprof,
1652 appname,
1653 "DirflWindowAttr",
1654 (PVOID)&cnri.flWindowAttr,
1655 &size);
1656 size = sizeof(MASK);
1657 if(!*dcd->mask.szMask &&
1658 !dcd->mask.attrFile &&
1659 !dcd->mask.antiattr) {
1660 if(PrfQueryProfileSize(fmprof,
1661 appname,
1662 "DirFilter",
1663 &size) &&
1664 size) {
1665 PrfQueryProfileData(fmprof,
1666 appname,
1667 "DirFilter",
1668 &dcd->mask,
1669 &size);
1670 SetMask(dcd->mask.szMask,&dcd->mask);
1671 }
1672 else
1673 dcd->mask.attrFile = (FILE_READONLY | FILE_NORMAL |
1674 FILE_ARCHIVED | FILE_DIRECTORY |
1675 FILE_HIDDEN | FILE_SYSTEM);
1676 }
1677 *(dcd->mask.prompt) = 0;
1678 }
1679 if(dcd->flWindowAttr)
1680 cnri.flWindowAttr = dcd->flWindowAttr;
1681 else
1682 dcd->flWindowAttr = cnri.flWindowAttr;
1683 cnri.flWindowAttr &= (~(CA_MIXEDTARGETEMPH | CA_ORDEREDTARGETEMPH |
1684 CA_TITLEREADONLY | CA_TITLESEPARATOR));
1685 cnri.flWindowAttr |= CV_FLOW;
1686 dcd->flWindowAttr |= CV_FLOW;
1687 if(WinWindowFromID(dcd->hwndFrame,FID_TITLEBAR))
1688 cnri.flWindowAttr &= (~CA_CONTAINERTITLE);
1689 else
1690 cnri.flWindowAttr |= CA_CONTAINERTITLE;
1691 if(!dcd->sortFlags)
1692 dcd->sortFlags = sortFlags;
1693 WinSendMsg(hwnd,
1694 CM_SETCNRINFO,
1695 MPFROMP(&cnri),
1696 MPFROMLONG(CMA_FLWINDOWATTR | CMA_LINESPACING |
1697 CMA_CXTREEINDENT | CMA_PSORTRECORD));
1698 SetCnrCols(hwnd,FALSE);
1699 AdjustCnrColsForPref(hwnd,
1700 NULL,
1701 dcd,
1702 FALSE);
1703 if(_beginthread(MakeObjWin,
1704 NULL,
1705 245760,
1706 (PVOID)dcd) == -1) {
1707 PostMsg(hwnd,
1708 WM_CLOSE,
1709 MPVOID,
1710 MPVOID);
1711 return 0;
1712 }
1713 else
1714 DosSleep(64L);
1715 WinEnableMenuItem(DirCnrMenu,IDM_FINDINTREE,
1716 (hwndTree != (HWND)0));
1717 }
1718 SayFilter(WinWindowFromID(WinQueryWindow(hwnd,QW_PARENT),
1719 DIR_FILTER),&dcd->mask,FALSE);
1720 SaySort(WinWindowFromID(WinQueryWindow(hwnd,QW_PARENT),
1721 DIR_SORT),dcd->sortFlags,FALSE);
1722 SayView(WinWindowFromID(WinQueryWindow(hwnd,QW_PARENT),
1723 DIR_VIEW),dcd->flWindowAttr);
1724 }
1725 else {
1726 PostMsg(hwnd,
1727 WM_CLOSE,
1728 MPVOID,
1729 MPVOID);
1730 return 0;
1731 }
1732 return 0;
1733
1734 case WM_MENUEND:
1735 if(dcd) {
1736
1737 HWND hwndMenu = (HWND)mp2;
1738
1739 if(hwndMenu == DirCnrMenu || hwndMenu == FileMenu ||
1740 hwndMenu == DirMenu) {
1741 MarkAll(hwnd,TRUE,FALSE,TRUE);
1742 if(dcd->cnremphasized) {
1743 WinSendMsg(hwnd,CM_SETRECORDEMPHASIS,MPVOID,
1744 MPFROM2SHORT(FALSE,CRA_SOURCE));
1745 dcd->cnremphasized = FALSE;
1746 }
1747 }
1748 }
1749 break;
1750
1751 case UM_OPENWINDOWFORME:
1752 if(dcd) {
1753 if(mp1 &&
1754 !IsFile((CHAR *)mp1))
1755 OpenDirCnr(hwnd,
1756 dcd->hwndParent,
1757 dcd->hwndFrame,
1758 FALSE,
1759 (char *)mp1);
1760 else if(mp1 &&
1761 IsFile(mp1) == 1)
1762 StartArcCnr(HWND_DESKTOP,
1763 dcd->hwndFrame,
1764 (CHAR *)mp1,
1765 4,
1766 (ARC_TYPE *)mp2);
1767 }
1768 return 0;
1769
1770 case MM_PORTHOLEINIT:
1771 if(dcd) {
1772 switch(SHORT1FROMMP(mp1)) {
1773 case 0:
1774 case 1:
1775 {
1776 ULONG wmsg;
1777
1778 wmsg = (SHORT1FROMMP(mp1) == 0) ? UM_FILESMENU : UM_VIEWSMENU;
1779 PortholeInit((HWND)WinSendMsg(dcd->hwndClient,
1780 wmsg,
1781 MPVOID,
1782 MPVOID),
1783 mp1,
1784 mp2);
1785 }
1786 break;
1787 }
1788 }
1789 break;
1790
1791 case UM_INITMENU:
1792 case WM_INITMENU:
1793 if(dcd) {
1794 switch(SHORT1FROMMP(mp1)) {
1795 case IDM_FILESMENU:
1796 if(isalpha(*dcd->directory)) {
1797 if(driveflags[toupper(*dcd->directory) - 'A'] & DRIVE_NOTWRITEABLE) {
1798 WinEnableMenuItem((HWND)mp2,IDM_MOVEMENU,FALSE);
1799 WinEnableMenuItem((HWND)mp2,IDM_RENAME,FALSE);
1800 WinEnableMenuItem((HWND)mp2,IDM_MKDIR,FALSE);
1801 WinEnableMenuItem((HWND)mp2,IDM_UNDELETE,FALSE);
1802 WinEnableMenuItem((HWND)mp2,IDM_DELETESUBMENU,FALSE);
1803 WinEnableMenuItem((HWND)mp2,IDM_DELETE,FALSE);
1804 WinEnableMenuItem((HWND)mp2,IDM_EDIT,FALSE);
1805 WinEnableMenuItem((HWND)mp2,IDM_EDITTEXT,FALSE);
1806 WinEnableMenuItem((HWND)mp2,IDM_EDITBINARY,FALSE);
1807 WinEnableMenuItem((HWND)mp2,IDM_ATTRS,FALSE);
1808 }
1809 else {
1810 WinEnableMenuItem((HWND)mp2,IDM_MOVEMENU,TRUE);
1811 WinEnableMenuItem((HWND)mp2,IDM_RENAME,TRUE);
1812 WinEnableMenuItem((HWND)mp2,IDM_MKDIR,TRUE);
1813 WinEnableMenuItem((HWND)mp2,IDM_UNDELETE,TRUE);
1814 WinEnableMenuItem((HWND)mp2,IDM_DELETESUBMENU,TRUE);
1815 WinEnableMenuItem((HWND)mp2,IDM_DELETE,TRUE);
1816 WinEnableMenuItem((HWND)mp2,IDM_EDIT,TRUE);
1817 WinEnableMenuItem((HWND)mp2,IDM_EDITTEXT,TRUE);
1818 WinEnableMenuItem((HWND)mp2,IDM_EDITBINARY,TRUE);
1819 WinEnableMenuItem((HWND)mp2,IDM_ATTRS,TRUE);
1820 }
1821 }
1822 break;
1823
1824 case IDM_VIEWSMENU:
1825 SetViewMenu((HWND)mp2,dcd->flWindowAttr);
1826 WinEnableMenuItem((HWND)mp2,IDM_RESELECT,
1827 (dcd->lastselection != NULL));
1828 if(isalpha(*dcd->directory)) {
1829 if(driveflags[toupper(*dcd->directory) - 'A'] &
1830 DRIVE_NOTWRITEABLE)
1831 WinEnableMenuItem((HWND)mp2,
1832 IDM_MKDIR,
1833 FALSE);
1834 else
1835 WinEnableMenuItem((HWND)mp2,
1836 IDM_MKDIR,
1837 TRUE);
1838 }
1839 WinEnableMenuItem((HWND)mp2,
1840 IDM_SELECTCOMPAREMENU,
1841 (CountDirCnrs(dcd->hwndParent) > 1));
1842 break;
1843
1844 case IDM_DETAILSSETUP:
1845 SetDetailsSwitches((HWND)mp2,dcd);
1846 break;
1847
1848 case IDM_COMMANDSMENU:
1849 SetupCommandMenu((HWND)mp2,hwnd);
1850 break;
1851
1852 case IDM_SORTSUBMENU:
1853 SetSortChecks((HWND)mp2,dcd->sortFlags);
1854 break;
1855
1856 case IDM_WINDOWSMENU:
1857 SetupWinList((HWND)mp2,
1858 (hwndMain) ? hwndMain : (HWND)0,
1859 dcd->hwndFrame);
1860 break;
1861 }
1862 dcd->hwndLastMenu = (HWND)mp2;
1863 }
1864 if(msg == WM_INITMENU)
1865 break;
1866 return 0;
1867
1868 case UM_FILTER:
1869 if(dcd) {
1870
1871 PCNRITEM pci;
1872
1873 if(mp1) {
1874 DosEnterCritSec();
1875 SetMask((CHAR *)mp1,&dcd->mask);
1876 DosExitCritSec();
1877 }
1878 dcd->suspendview = 1;
1879 WinSendMsg(hwnd,CM_FILTER,MPFROMP(Filter),MPFROMP(&dcd->mask));
1880 dcd->suspendview = 0;
1881 if(fAutoView && hwndMain) {
1882 pci = WinSendMsg(hwnd,CM_QUERYRECORDEMPHASIS,
1883 MPFROMLONG(CMA_FIRST),
1884 MPFROMSHORT(CRA_CURSORED));
1885 if(pci && (INT)pci != -1 &&
1886 (!(driveflags[toupper(*pci->szFileName) - 'A'] & DRIVE_SLOW)))
1887 WinSendMsg(hwndMain,
1888 UM_LOADFILE,
1889 MPFROMP(pci->szFileName),
1890 MPVOID);
1891 else
1892 WinSendMsg(hwndMain,
1893 UM_LOADFILE,
1894 MPVOID,
1895 MPVOID);
1896 }
1897 PostMsg(hwnd,
1898 UM_RESCAN,
1899 MPVOID,
1900 MPVOID);
1901 }
1902 return 0;
1903
1904 case UM_COMMAND:
1905 if(mp1) {
1906 if(dcd) {
1907 if(!PostMsg(dcd->hwndObject,
1908 UM_COMMAND,
1909 mp1,
1910 mp2)) {
1911 FreeListInfo((LISTINFO *)mp1);
1912 DosBeep(50,100);
1913 }
1914 else
1915 return (MRESULT)TRUE;
1916 }
1917 else
1918 FreeListInfo((LISTINFO *)mp1);
1919 }
1920 return 0;
1921
1922 case UM_NOTIFY:
1923 if(mp2)
1924 Notify((CHAR *)mp2);
1925 return 0;
1926
1927 case UM_DRIVECMD:
1928 if(mp1)
1929 WinSendMsg(hwnd,
1930 WM_COMMAND,
1931 MPFROM2SHORT(IDM_SWITCH,0),
1932 mp1);
1933 return 0;
1934
1935 case WM_COMMAND:
1936 DosError(FERR_DISABLEHARDERR);
1937 if(dcd) {
1938 switch(SHORT1FROMMP(mp1)) {
1939 case IDM_SETTARGET:
1940 SetTargetDir(hwnd,FALSE);
1941 break;
1942
1943 case IDM_CREATE:
1944 {
1945 STRINGINPARMS sip;
1946 CHAR filename[CCHMAXPATHCOMP];
1947
1948 memset(&sip,0,sizeof(sip));
1949 sip.help = GetPString(IDS_CREATETEXT);
1950 sip.prompt = GetPString(IDS_CREATEPROMPTTEXT);
1951 sip.inputlen = CCHMAXPATHCOMP - (strlen(dcd->directory) - 1);
1952 strcpy(filename,"NEWFILE.TXT");
1953 sip.ret = filename;
1954 sip.title = GetPString(IDS_CREATETITLETEXT);
1955 if (WinDlgBox(HWND_DESKTOP,hwnd,InputDlgProc,FM3ModHandle,
1956 STR_FRAME,&sip))
1957 {
1958 bstrip(sip.ret);
1959 if (*sip.ret)
1960 {
1961
1962 CHAR newfile[CCHMAXPATH];
1963 FILE *fp;
1964 INT test;
1965 PCNRITEM pci;
1966
1967 strcpy(newfile,dcd->directory);
1968 if(newfile[strlen(newfile) - 1] != '\\')
1969 strcat(newfile,"\\");
1970 strcat(newfile,sip.ret);
1971 test = IsFile(newfile);
1972 if(test != 1)
1973 fp = fopen(newfile,"w");
1974 if(test == 1 || fp) {
1975 if(fp) {
1976 WinSendMsg(hwnd,
1977 UM_UPDATERECORD,
1978 MPFROMP(newfile),
1979 MPVOID);
1980 fclose(fp);
1981 }
1982 if(*editor) {
1983
1984 CHAR *dummy[2];
1985
1986 dummy[0] = newfile;
1987 dummy[1] = NULL;
1988 ExecOnList(hwnd,
1989 editor,
1990 WINDOWED | SEPARATE,
1991 NULL,
1992 dummy,
1993 NULL);
1994 }
1995 else
1996 StartMLEEditor(dcd->hwndParent,
1997 4,
1998 newfile,
1999 dcd->hwndFrame);
2000 pci = FindCnrRecord(hwnd,
2001 newfile,
2002 NULL,
2003 TRUE,
2004 FALSE,
2005 TRUE);
2006 if(pci && (INT)pci != -1)
2007 /* make sure that record shows in viewport */
2008 ShowCnrRecord(hwnd,(PMINIRECORDCORE)pci);
2009 }
2010 else
2011 saymsg(MB_ENTER,
2012 hwnd,
2013 GetPString(IDS_ERRORTEXT),
2014 GetPString(IDS_CREATEERRORTEXT),
2015 newfile);
2016 }
2017 }
2018 }
2019 break;
2020
2021 case IDM_CONTEXTMENU:
2022 {
2023 PCNRITEM pci;
2024
2025 pci = (PCNRITEM)CurrentRecord(hwnd);
2026 PostMsg(hwnd,WM_CONTROL,MPFROM2SHORT(DIR_CNR,CN_CONTEXTMENU),
2027 MPFROMP(pci));
2028 }
2029 break;
2030
2031 case IDM_MAXIMIZE:
2032 PostMsg(hwndMain,
2033 UM_MAXIMIZE,
2034 MPFROMLONG(dcd->hwndFrame),
2035 MPVOID);
2036 break;
2037
2038 case IDM_SHOWALLFILESCNR:
2039 StartSeeAll(HWND_DESKTOP,FALSE,dcd->directory);
2040 break;
2041
2042 case IDM_SHOWALLFILES:
2043 {
2044 PCNRITEM pci;
2045
2046 pci = WinSendMsg(hwnd,CM_QUERYRECORDEMPHASIS,
2047 MPFROMLONG(CMA_FIRST),
2048 MPFROMSHORT(CRA_CURSORED));
2049 if(pci && (INT)pci != -1) {
2050
2051 static CHAR dirname[CCHMAXPATH];
2052
2053 strcpy(dirname,pci->szFileName);
2054 MakeValidDir(dirname);
2055 StartSeeAll(HWND_DESKTOP,FALSE,dirname);
2056 }
2057 }
2058 break;
2059
2060 case IDM_FINDINTREE:
2061 if(hwndTree)
2062 WinSendMsg(hwndTree,UM_SHOWME,MPFROMP(dcd->directory),
2063 MPFROMLONG(1L));
2064 break;
2065
2066 case IDM_BEGINEDIT:
2067 OpenEdit(hwnd);
2068 break;
2069
2070 case IDM_ENDEDIT:
2071 WinSendMsg(hwnd,
2072 CM_CLOSEEDIT,
2073 MPVOID,
2074 MPVOID);
2075 break;
2076
2077 case IDM_SHOWSELECT:
2078 QuickPopup(hwnd,
2079 dcd,
2080 CheckMenu(&DirCnrMenu,DIRCNR_POPUP),
2081 IDM_SELECTSUBMENU);
2082 break;
2083
2084 case IDM_SHOWSORT:
2085 QuickPopup(hwnd,dcd,CheckMenu(&DirCnrMenu,DIRCNR_POPUP),
2086 IDM_SORTSUBMENU);
2087 break;
2088
2089 case IDM_VIEWORARC:
2090 {
2091 SWP swp;
2092 PCNRITEM pci;
2093
2094 pci = (PCNRITEM)WinSendMsg(hwnd,CM_QUERYRECORDEMPHASIS,
2095 MPFROMLONG(CMA_FIRST),
2096 MPFROMSHORT(CRA_CURSORED));
2097 if(pci &&
2098 (INT)pci != -1) {
2099 WinQueryWindowPos(dcd->hwndFrame,&swp);
2100 DefaultViewKeys(hwnd,
2101 dcd->hwndFrame,
2102 dcd->hwndParent,
2103 &swp,
2104 pci->szFileName);
2105 }
2106 }
2107 break;
2108
2109 case IDM_NOTEBOOK:
2110 if(!ParentIsDesktop(dcd->hwndParent,dcd->hwndParent))
2111 PostMsg(dcd->hwndParent,msg,mp1,mp2);
2112 else
2113 WinDlgBox(HWND_DESKTOP,hwnd,CfgDlgProc,FM3ModHandle,
2114 CFG_FRAME,(PVOID)"Directory");
2115 break;
2116
2117 case IDM_QTREE:
2118 case IDM_TREE:
2119 {
2120 CHAR newpath[CCHMAXPATH];
2121 APIRET rc;
2122 PCNRITEM pci;
2123
2124 if(SHORT1FROMMP(mp1) == IDM_TREE) {
2125 pci = (PCNRITEM)CurrentRecord(hwnd);
2126 if(pci && (INT)pci != -1)
2127 strcpy(newpath,pci->szFileName);
2128 else
2129 strcpy(newpath,dcd->directory);
2130 }
2131 else
2132 strcpy(newpath,dcd->directory);
2133 MakeValidDir(newpath);
2134 rc = WinDlgBox(HWND_DESKTOP,dcd->hwndClient,ObjCnrDlgProc,
2135 FM3ModHandle,QTREE_FRAME,MPFROMP(newpath));
2136 if(rc)
2137 WinSendMsg(hwnd,UM_SETDIR,MPFROMP(newpath),MPVOID);
2138 }
2139 break;
2140
2141 case IDM_RESELECT:
2142 SelectList(hwnd,TRUE,FALSE,FALSE,NULL,NULL,
2143 dcd->lastselection);
2144 break;
2145
2146 case IDM_HELP:
2147 if(hwndHelp) {
2148 if(!ParentIsDesktop(dcd->hwndFrame,dcd->hwndParent))
2149 PostMsg(dcd->hwndParent,UM_COMMAND,mp1,mp2);
2150 else
2151 WinSendMsg(hwndHelp,HM_HELP_CONTENTS,MPVOID,MPVOID);
2152 }
2153 break;
2154
2155 case IDM_WINDOWDLG:
2156 if(!ParentIsDesktop(dcd->hwndFrame,dcd->hwndParent))
2157 PostMsg(dcd->hwndParent,UM_COMMAND,
2158 MPFROM2SHORT(IDM_WINDOWDLG,0),MPVOID);
2159 break;
2160
2161 case IDM_SORTSMARTNAME:
2162 case IDM_SORTNAME:
2163 case IDM_SORTFILENAME:
2164 case IDM_SORTSIZE:
2165 case IDM_SORTEASIZE:
2166 case IDM_SORTFIRST:
2167 case IDM_SORTLAST:
2168 case IDM_SORTLWDATE:
2169 case IDM_SORTLADATE:
2170 case IDM_SORTCRDATE:
2171 case IDM_SORTSUBJECT:
2172 dcd->sortFlags &= (SORT_REVERSE | SORT_DIRSFIRST | SORT_DIRSLAST);
2173 case IDM_SORTDIRSFIRST:
2174 case IDM_SORTDIRSLAST:
2175 case IDM_SORTREVERSE:
2176 switch(SHORT1FROMMP(mp1)) {
2177 case IDM_SORTSUBJECT:
2178 dcd->sortFlags |= SORT_SUBJECT;
2179 break;
2180 case IDM_SORTSMARTNAME:
2181 case IDM_SORTFILENAME:
2182 dcd->sortFlags |= SORT_FILENAME;
2183 break;
2184 case IDM_SORTSIZE:
2185 dcd->sortFlags |= SORT_SIZE;
2186 break;
2187 case IDM_SORTEASIZE:
2188 dcd->sortFlags |= SORT_EASIZE;
2189 break;
2190 case IDM_SORTFIRST:
2191 dcd->sortFlags |= SORT_FIRSTEXTENSION;
2192 break;
2193 case IDM_SORTLAST:
2194 dcd->sortFlags |= SORT_LASTEXTENSION;
2195 break;
2196 case IDM_SORTLWDATE:
2197 dcd->sortFlags |= SORT_LWDATE;
2198 break;
2199 case IDM_SORTLADATE:
2200 dcd->sortFlags |= SORT_LADATE;
2201 break;
2202 case IDM_SORTCRDATE:
2203 dcd->sortFlags |= SORT_CRDATE;
2204 break;
2205 case IDM_SORTDIRSFIRST:
2206 if(dcd->sortFlags & SORT_DIRSFIRST)
2207 dcd->sortFlags &= (~SORT_DIRSFIRST);
2208 else {
2209 dcd->sortFlags |= SORT_DIRSFIRST;
2210 dcd->sortFlags &= (~SORT_DIRSLAST);
2211 }
2212 break;
2213 case IDM_SORTDIRSLAST:
2214 if(dcd->sortFlags & SORT_DIRSLAST)
2215 dcd->sortFlags &= (~SORT_DIRSLAST);
2216 else {
2217 dcd->sortFlags |= SORT_DIRSLAST;
2218 dcd->sortFlags &= (~SORT_DIRSFIRST);
2219 }
2220 break;
2221 case IDM_SORTREVERSE:
2222 if(dcd->sortFlags & SORT_REVERSE)
2223 dcd->sortFlags &= (~SORT_REVERSE);
2224 else
2225 dcd->sortFlags |= SORT_REVERSE;
2226 break;
2227 }
2228 WinSendMsg(hwnd,CM_SORTRECORD,MPFROMP(SortDirCnr),
2229 MPFROMLONG(dcd->sortFlags));
2230 SaySort(WinWindowFromID(WinQueryWindow(hwnd,QW_PARENT),
2231 DIR_SORT),dcd->sortFlags,FALSE);
2232 break;
2233
2234 case IDM_COLLECT:
2235 if(!Collector) {
2236
2237 HWND hwndC;
2238 SWP swp;
2239
2240 if(!ParentIsDesktop(hwnd,dcd->hwndParent) && !fAutoTile &&
2241 (!fExternalCollector && !strcmp(realappname,FM3Str)))
2242 GetNextWindowPos(dcd->hwndParent,&swp,NULL,NULL);
2243 hwndC = StartCollector((fExternalCollector ||
2244 strcmp(realappname,FM3Str)) ?
2245 HWND_DESKTOP :
2246 dcd->hwndParent,4);
2247 if(hwndC) {
2248 if(!ParentIsDesktop(hwnd,dcd->hwndParent) && !fAutoTile &&
2249 (!fExternalCollector && !strcmp(realappname,FM3Str)))
2250 WinSetWindowPos(hwndC,HWND_TOP,swp.x,swp.y,
2251 swp.cx,swp.cy,SWP_MOVE | SWP_SIZE |
2252 SWP_SHOW | SWP_ZORDER);
2253 else if(!ParentIsDesktop(hwnd,dcd->hwndParent) && fAutoTile &&
2254 !strcmp(realappname,FM3Str))
2255 TileChildren(dcd->hwndParent,TRUE);
2256 WinSetWindowPos(hwndC,HWND_TOP,0,0,0,0,SWP_ACTIVATE);
2257 DosSleep(250L);
2258 }
2259 }
2260 else
2261 StartCollector(dcd->hwndParent,4);
2262 PostMsg(hwnd,WM_COMMAND,MPFROM2SHORT(IDM_COLLECTOR,0),MPVOID);
2263 break;
2264
2265 case IDM_COLLECTOR:
2266 DosSleep(64L);
2267 {
2268 CHAR **list;
2269
2270 list = BuildList(hwnd);
2271 if(list) {
2272 if(Collector) {
2273 if(!PostMsg(Collector,WM_COMMAND,
2274 MPFROM2SHORT(IDM_COLLECTOR,0),
2275 MPFROMP(list)))
2276 FreeList(list);
2277 else if(fUnHilite)
2278 UnHilite(hwnd,TRUE,&dcd->lastselection);
2279 }
2280 else
2281 FreeList(list);
2282 }
2283 }
2284 break;
2285
2286 case IDM_UNDELETE:
2287 {
2288 PCNRITEM pci;
2289 CHAR path[CCHMAXPATH];
2290
2291 pci = (PCNRITEM)CurrentRecord(hwnd);
2292 if(pci && (INT)pci != -1) {
2293 strcpy(path,pci->szFileName);
2294 MakeValidDir(path);
2295 WinDlgBox(HWND_DESKTOP,hwnd,UndeleteDlgProc,FM3ModHandle,
2296 UNDEL_FRAME,MPFROMP(path));
2297 }
2298 }
2299 break;
2300
2301 case IDM_UNDELETESPEC:
2302 WinDlgBox(HWND_DESKTOP,
2303 hwnd,
2304 UndeleteDlgProc,
2305 FM3ModHandle,
2306 UNDEL_FRAME,
2307 MPFROMP(dcd->directory));
2308 break;
2309
2310 case IDM_RESORT:
2311// WinSendMsg(hwnd,
2312// CM_SORTRECORD,
2313// MPFROMP(SortDirCnr),
2314// MPFROMLONG((fSyncUpdates) ? sortFlags : dcd->sortFlags));
2315 WinSendMsg(hwnd,
2316 CM_SORTRECORD,
2317 MPFROMP(SortDirCnr),
2318 MPFROMLONG(dcd->sortFlags));
2319 break;
2320
2321 case IDM_FILTER:
2322 {
2323 BOOL empty = FALSE;
2324 PCNRITEM pci;
2325 CHAR *p;
2326
2327 if(!*dcd->mask.szMask) {
2328 empty = TRUE;
2329 pci = (PCNRITEM)CurrentRecord(hwnd);
2330 if(pci && !(pci->attrFile & FILE_DIRECTORY)) {
2331 p = strrchr(pci->szFileName,'\\');
2332 if(p) {
2333 p++;
2334 strcpy(dcd->mask.szMask,p);
2335 }
2336 }
2337 }
2338 *(dcd->mask.prompt) = 0;
2339
2340 if(WinDlgBox(HWND_DESKTOP,hwnd,PickMaskDlgProc,
2341 FM3ModHandle,MSK_FRAME,MPFROMP(&dcd->mask)))
2342 WinSendMsg(hwnd,UM_FILTER,MPVOID,MPVOID);
2343 else if(empty)
2344 *dcd->mask.szMask = 0;
2345 SayFilter(WinWindowFromID(WinQueryWindow(hwnd,QW_PARENT),
2346 DIR_FILTER),&dcd->mask,FALSE);
2347 }
2348 break;
2349
2350 case IDM_HIDEALL:
2351 if(fAutoView && hwndMain)
2352 PostMsg(hwndMain,
2353 UM_LOADFILE,
2354 MPVOID,
2355 MPVOID);
2356 dcd->suspendview = 1;
2357 HideAll(hwnd);
2358 dcd->suspendview = 0;
2359 PostMsg(hwnd,
2360 UM_RESCAN,
2361 MPVOID,
2362 MPVOID);
2363 break;
2364
2365 case IDM_SELECTBOTH:
2366 case IDM_SELECTONE:
2367 case IDM_SELECTMORE:
2368 case IDM_SELECTNEWER:
2369 case IDM_SELECTOLDER:
2370 case IDM_SELECTBIGGER:
2371 case IDM_SELECTSMALLER:
2372 case IDM_DESELECTBOTH:
2373 case IDM_DESELECTONE:
2374 case IDM_DESELECTMORE:
2375 case IDM_DESELECTNEWER:
2376 case IDM_DESELECTOLDER:
2377 case IDM_DESELECTBIGGER:
2378 case IDM_DESELECTSMALLER:
2379 if(ParentIsDesktop(hwnd,dcd->hwndParent)) {
2380 DosBeep(50,100);
2381 break;
2382 }
2383 case IDM_SELECTLIST:
2384 case IDM_SELECTALL:
2385 case IDM_DESELECTALL:
2386 case IDM_SELECTALLFILES:
2387 case IDM_DESELECTALLFILES:
2388 case IDM_SELECTALLDIRS:
2389 case IDM_DESELECTALLDIRS:
2390 case IDM_SELECTMASK:
2391 case IDM_DESELECTMASK:
2392 case IDM_INVERT:
2393 case IDM_SELECTCLIP:
2394 case IDM_DESELECTCLIP:
2395 {
2396 PCNRITEM pci;
2397
2398 pci = (PCNRITEM)CurrentRecord(hwnd);
2399 if((INT)pci == -1)
2400 pci = NULL;
2401 if(SHORT1FROMMP(mp1) == IDM_HIDEALL) {
2402 if(pci) {
2403 if(!(pci->rc.flRecordAttr & CRA_SELECTED))
2404 pci->rc.flRecordAttr |= CRA_FILTERED;
2405 WinSendMsg(hwnd,CM_INVALIDATERECORD,MPFROMP(&pci),
2406 MPFROM2SHORT(1,CMA_ERASE | CMA_REPOSITION));
2407 break;
2408 }
2409 }
2410 PostMsg(dcd->hwndObject,
2411 UM_SELECT,
2412 mp1,
2413 MPFROMP(pci));
2414 }
2415 break;
2416
2417 case IDM_RESCAN:
2418 DosEnterCritSec();
2419 dcd->stopflag++;
2420 DosExitCritSec();
2421 if(!PostMsg(dcd->hwndObject,
2422 UM_RESCAN,
2423 MPVOID,
2424 MPVOID)) {
2425 DosEnterCritSec();
2426 dcd->stopflag--;
2427 DosExitCritSec();
2428 }
2429 break;
2430
2431 case IDM_SHOWLNAMES:
2432 case IDM_SHOWSUBJECT:
2433 case IDM_SHOWEAS:
2434 case IDM_SHOWSIZE:
2435 case IDM_SHOWICON:
2436 case IDM_SHOWLWDATE:
2437 case IDM_SHOWLWTIME:
2438 case IDM_SHOWLADATE:
2439 case IDM_SHOWLATIME:
2440 case IDM_SHOWCRDATE:
2441 case IDM_SHOWCRTIME:
2442 case IDM_SHOWATTR:
2443 AdjustDetailsSwitches(hwnd,
2444 dcd->hwndLastMenu,
2445 SHORT1FROMMP(mp1),
2446 dcd->directory,
2447 "DirCnr",
2448 dcd,
2449 FALSE);
2450 break;
2451
2452 case IDM_TREEVIEW:
2453 case IDM_ICON:
2454 case IDM_TEXT:
2455 case IDM_DETAILS:
2456 case IDM_NAME:
2457 case IDM_MINIICONS:
2458 case IDM_DETAILSTITLES:
2459 {
2460 CNRINFO cnri;
2461
2462 memset(&cnri,0,sizeof(CNRINFO));
2463 cnri.cb = sizeof(CNRINFO);
2464 WinSendMsg(hwnd,CM_QUERYCNRINFO,MPFROMP(&cnri),
2465 MPFROMLONG(sizeof(CNRINFO)));
2466 switch(SHORT1FROMMP(mp1)) {
2467 case IDM_TREEVIEW:
2468 if(!(cnri.flWindowAttr & CV_TREE))
2469 dcd->lastattr = cnri.flWindowAttr;
2470 cnri.flWindowAttr &= (~(CV_ICON | CV_TREE | CV_TEXT |
2471 CV_DETAIL | CV_NAME | CA_TREELINE));
2472 cnri.flWindowAttr |= CA_TREELINE | CV_TREE | CV_ICON;
2473 if(!dcd->firsttree)
2474 PostMsg(dcd->hwndObject,UM_FLESH,MPVOID,MPVOID);
2475 break;
2476 case IDM_ICON:
2477 cnri.flWindowAttr &= (~(CV_ICON | CV_TREE | CV_TEXT |
2478 CV_DETAIL | CV_NAME | CA_TREELINE));
2479 cnri.flWindowAttr |= CV_ICON;
2480 break;
2481 case IDM_NAME:
2482 cnri.flWindowAttr &= (~(CV_ICON | CV_TREE | CV_TEXT |
2483 CV_DETAIL | CV_NAME | CA_TREELINE));
2484 cnri.flWindowAttr |= CV_NAME;
2485 break;
2486 case IDM_TEXT:
2487 cnri.flWindowAttr &= (~(CV_ICON | CV_TREE | CV_TEXT |
2488 CV_DETAIL | CV_NAME | CA_TREELINE));
2489 cnri.flWindowAttr |= CV_TEXT;
2490 break;
2491 case IDM_DETAILS:
2492 cnri.flWindowAttr &= (~(CV_ICON | CV_TREE | CV_TEXT |
2493 CV_DETAIL | CV_NAME | CA_TREELINE));
2494 cnri.flWindowAttr |= CV_DETAIL;
2495 break;
2496 case IDM_MINIICONS:
2497 if(cnri.flWindowAttr & CV_MINI)
2498 cnri.flWindowAttr &= (~CV_MINI);
2499 else
2500 cnri.flWindowAttr |= CV_MINI;
2501 break;
2502 case IDM_DETAILSTITLES:
2503 if(cnri.flWindowAttr & CA_DETAILSVIEWTITLES)
2504 cnri.flWindowAttr &= (~CA_DETAILSVIEWTITLES);
2505 else
2506 cnri.flWindowAttr |= CA_DETAILSVIEWTITLES;
2507 break;
2508 }
2509 cnri.flWindowAttr &= (~(CA_ORDEREDTARGETEMPH |
2510 CA_MIXEDTARGETEMPH));
2511 cnri.flWindowAttr |= CV_FLOW;
2512 dcd->flWindowAttr = cnri.flWindowAttr;
2513 WinSendMsg(hwnd,CM_SETCNRINFO,MPFROMP(&cnri),
2514 MPFROMLONG(CMA_FLWINDOWATTR));
2515 WinSendMsg(hwnd,CM_INVALIDATERECORD,MPVOID,
2516 MPFROM2SHORT(0,CMA_ERASE | CMA_REPOSITION));
2517 SayView(WinWindowFromID(WinQueryWindow(hwnd,QW_PARENT),
2518 DIR_VIEW),dcd->flWindowAttr);
2519 }
2520 break;
2521
2522 case IDM_SAVETOLIST:
2523 WinDlgBox(HWND_DESKTOP,hwnd,SaveListDlgProc,FM3ModHandle,
2524 SAV_FRAME,MPFROMP(&hwnd));
2525 break;
2526
2527 case IDM_SIZES:
2528 {
2529 PCNRITEM pci;
2530 CHAR path[CCHMAXPATH];
2531
2532 pci = (PCNRITEM)CurrentRecord(hwnd);
2533 if(pci && (INT)pci != -1)
2534 strcpy(path,pci->szFileName);
2535 else
2536 strcpy(path,dcd->directory);
2537 MakeValidDir(path);
2538 WinDlgBox(HWND_DESKTOP,
2539 HWND_DESKTOP,
2540 DirSizeProc,
2541 FM3ModHandle,
2542 DSZ_FRAME,
2543 path);
2544 }
2545 break;
2546
2547 case IDM_MKDIR:
2548 {
2549 PCNRITEM pci;
2550
2551 pci = (PCNRITEM)CurrentRecord(hwnd);
2552 PMMkDir(dcd->hwndParent,
2553 ((pci && (INT)pci != -1) ?
2554 pci->szFileName :
2555 dcd->directory),
2556 FALSE);
2557 }
2558 break;
2559
2560 case IDM_SWITCH:
2561 if(mp2) {
2562 strcpy(dcd->previous,dcd->directory);
2563 strcpy(dcd->directory,(CHAR *)mp2);
2564 DosEnterCritSec();
2565 dcd->stopflag++;
2566 DosExitCritSec();
2567 if(!PostMsg(dcd->hwndObject,
2568 UM_RESCAN,
2569 MPVOID,
2570 MPFROMLONG(1L))) {
2571 strcpy(dcd->directory,
2572 dcd->previous);
2573 DosEnterCritSec();
2574 dcd->stopflag--;
2575 DosExitCritSec();
2576 }
2577 else if(*dcd->directory) {
2578 if(hwndMain)
2579 WinSendMsg(hwndMain,
2580 UM_SETUSERLISTNAME,
2581 MPFROMP(dcd->directory),
2582 MPVOID);
2583 else
2584 add_udir(FALSE,dcd->directory);
2585 }
2586 }
2587 break;
2588
2589 case IDM_PARENT:
2590 {
2591 CHAR tempname1[CCHMAXPATH],
2592 tempname2[CCHMAXPATH];
2593
2594 strcpy(tempname1,dcd->directory);
2595 if(tempname1[strlen(tempname1) - 1] != '\\')
2596 strcat(tempname1,"\\");
2597 strcat(tempname1,"..");
2598 DosError(FERR_DISABLEHARDERR);
2599 if(!DosQueryPathInfo(tempname1,
2600 FIL_QUERYFULLNAME,
2601 tempname2,
2602 sizeof(tempname2))) {
2603 if(stricmp(dcd->directory,tempname2)) {
2604 strcpy(dcd->previous,dcd->directory);
2605 strcpy(dcd->directory,tempname2);
2606 DosEnterCritSec();
2607 dcd->stopflag++;
2608 DosExitCritSec();
2609 if(!PostMsg(dcd->hwndObject,
2610 UM_RESCAN,
2611 MPVOID,
2612 MPFROMLONG(1L))) {
2613 strcpy(dcd->directory,dcd->previous);
2614 DosEnterCritSec();
2615 dcd->stopflag--;
2616 DosExitCritSec();
2617 }
2618 else if(*dcd->directory) {
2619 if(hwndMain)
2620 WinSendMsg(hwndMain,
2621 UM_SETUSERLISTNAME,
2622 MPFROMP(dcd->directory),
2623 MPVOID);
2624 else
2625 add_udir(FALSE,
2626 dcd->directory);
2627 }
2628 }
2629 }
2630 }
2631 break;
2632
2633 case IDM_PREVIOUS:
2634 if(*dcd->previous &&
2635 stricmp(dcd->directory,dcd->previous)) {
2636
2637 CHAR tempname[CCHMAXPATH];
2638
2639 if(IsValidDir(dcd->previous)) {
2640 strcpy(tempname,dcd->directory);
2641 strcpy(dcd->directory,dcd->previous);
2642 strcpy(dcd->previous,tempname);
2643 DosEnterCritSec();
2644 dcd->stopflag++;
2645 DosExitCritSec();
2646 if(!PostMsg(dcd->hwndObject,
2647 UM_RESCAN,
2648 MPVOID,
2649 MPFROMLONG(1L))) {
2650 strcpy(dcd->directory,dcd->previous);
2651 DosEnterCritSec();
2652 dcd->stopflag--;
2653 DosExitCritSec();
2654 }
2655 else if(*dcd->directory) {
2656 if(hwndMain)
2657 WinSendMsg(hwndMain,
2658 UM_SETUSERLISTNAME,
2659 MPFROMP(dcd->directory),
2660 MPVOID);
2661 else
2662 add_udir(FALSE,
2663 dcd->directory);
2664 }
2665 }
2666 else
2667 *dcd->previous = 0;
2668 }
2669 break;
2670
2671 case IDM_WALKDIR:
2672 {
2673 CHAR newdir[CCHMAXPATH];
2674
2675 strcpy(newdir,dcd->directory);
2676 if(!WinDlgBox(HWND_DESKTOP,
2677 dcd->hwndParent,
2678 WalkAllDlgProc,
2679 FM3ModHandle,
2680 WALK_FRAME,
2681 MPFROMP(newdir)) ||
2682 !*newdir)
2683 break;
2684 if(stricmp(newdir,dcd->directory)) {
2685 strcpy(dcd->previous,dcd->directory);
2686 strcpy(dcd->directory,newdir);
2687 DosEnterCritSec();
2688 dcd->stopflag++;
2689 DosExitCritSec();
2690 if(!PostMsg(dcd->hwndObject,
2691 UM_RESCAN,
2692 MPVOID,
2693 MPFROMLONG(1L))) {
2694 strcpy(dcd->directory,dcd->previous);
2695 DosEnterCritSec();
2696 dcd->stopflag--;
2697 DosExitCritSec();
2698 }
2699 else if(*dcd->directory) {
2700 if(hwndMain)
2701 WinSendMsg(hwndMain,
2702 UM_SETUSERLISTNAME,
2703 MPFROMP(dcd->directory),
2704 MPVOID);
2705 else
2706 add_udir(FALSE,
2707 dcd->directory);
2708 }
2709 }
2710 }
2711 break;
2712
2713 case IDM_OPENICONME:
2714 OpenObject(dcd->directory,
2715 "ICON",
2716 dcd->hwndFrame);
2717 break;
2718 case IDM_OPENDETAILSME:
2719 OpenObject(dcd->directory,
2720 "DETAILS",
2721 dcd->hwndFrame);
2722 break;
2723 case IDM_OPENTREEME:
2724 OpenObject(dcd->directory,
2725 "TREE",
2726 dcd->hwndFrame);
2727 break;
2728 case IDM_OPENSETTINGSME:
2729 OpenObject(dcd->directory,
2730 Settings,
2731 dcd->hwndFrame);
2732 break;
2733
2734 case IDM_DOITYOURSELF:
2735 case IDM_UPDATE:
2736 case IDM_OPENWINDOW:
2737 case IDM_OPENSETTINGS:
2738 case IDM_OPENDEFAULT:
2739 case IDM_OPENICON:
2740 case IDM_OPENDETAILS:
2741 case IDM_OPENTREE:
2742 case IDM_OBJECT:
2743 case IDM_SHADOW:
2744 case IDM_SHADOW2:
2745 case IDM_DELETE:
2746 case IDM_PERMDELETE:
2747 case IDM_PRINT:
2748 case IDM_ATTRS:
2749 case IDM_INFO:
2750 case IDM_COPY:
2751 case IDM_MOVE:
2752 case IDM_WPSMOVE:
2753 case IDM_WPSCOPY:
2754 case IDM_WILDCOPY:
2755 case IDM_WILDMOVE:
2756 case IDM_RENAME:
2757 case IDM_COMPARE:
2758 case IDM_EAS:
2759 case IDM_SUBJECT:
2760 case IDM_VIEW:
2761 case IDM_VIEWTEXT:
2762 case IDM_VIEWBINARY:
2763 case IDM_VIEWARCHIVE:
2764 case IDM_EDIT:
2765 case IDM_EDITTEXT:
2766 case IDM_EDITBINARY:
2767 case IDM_SAVETOCLIP:
2768 case IDM_APPENDTOCLIP:
2769 case IDM_ARCHIVE:
2770 case IDM_ARCHIVEM:
2771 case IDM_EXTRACT:
2772 case IDM_MCIPLAY:
2773 case IDM_COLLECTFROMFILE:
2774 case IDM_UUDECODE:
2775 case IDM_MERGE:
2776 {
2777 LISTINFO *li;
2778 ULONG action = UM_ACTION;
2779
2780 li = malloc(sizeof(LISTINFO));
2781 if(li) {
2782 memset(li,0,sizeof(LISTINFO));
2783 li->type = SHORT1FROMMP(mp1);
2784 li->hwnd = hwnd;
2785 li->list = BuildList(hwnd);
2786 switch(SHORT1FROMMP(mp1)) {
2787 case IDM_WILDMOVE:
2788 case IDM_WILDCOPY:
2789 case IDM_MOVE:
2790 case IDM_COPY:
2791 case IDM_WPSMOVE:
2792 case IDM_WPSCOPY:
2793 break;
2794 default:
2795 strcpy(li->targetpath,dcd->directory);
2796 break;
2797 }
2798 if(li->list) {
2799 if(SHORT1FROMMP(mp1) == IDM_COLLECTFROMFILE) {
2800 if(!Collector) {
2801
2802 HWND hwndC;
2803 SWP swp;
2804
2805 if(!ParentIsDesktop(hwnd,dcd->hwndParent) &&
2806 !fAutoTile &&
2807 (!fExternalCollector && !strcmp(realappname,FM3Str)))
2808 GetNextWindowPos(dcd->hwndParent,&swp,NULL,NULL);
2809 hwndC = StartCollector((fExternalCollector ||
2810 strcmp(realappname,FM3Str)) ?
2811 HWND_DESKTOP :
2812 dcd->hwndParent,4);
2813 if(hwndC) {
2814 if(!ParentIsDesktop(hwnd,dcd->hwndParent) &&
2815 !fAutoTile && (!fExternalCollector &&
2816 !strcmp(realappname,FM3Str)))
2817 WinSetWindowPos(hwndC,HWND_TOP,swp.x,swp.y,
2818 swp.cx,swp.cy,SWP_MOVE | SWP_SIZE |
2819 SWP_SHOW | SWP_ZORDER);
2820 else if(!ParentIsDesktop(hwnd,dcd->hwndParent) &&
2821 fAutoTile && !strcmp(realappname,FM3Str))
2822 TileChildren(dcd->hwndParent,TRUE);
2823 WinSetWindowPos(hwndC,HWND_TOP,0,0,0,0,SWP_ACTIVATE);
2824 DosSleep(250L);
2825 }
2826 }
2827 else
2828 StartCollector(dcd->hwndParent,4);
2829 }
2830 switch(SHORT1FROMMP(mp1)) {
2831 case IDM_APPENDTOCLIP:
2832 case IDM_SAVETOCLIP:
2833 case IDM_ARCHIVE:
2834 case IDM_ARCHIVEM:
2835 case IDM_DELETE:
2836 case IDM_PERMDELETE:
2837 case IDM_ATTRS:
2838 case IDM_PRINT:
2839 case IDM_SHADOW:
2840 case IDM_SHADOW2:
2841 case IDM_OBJECT:
2842 case IDM_VIEW:
2843 case IDM_VIEWTEXT:
2844 case IDM_VIEWBINARY:
2845 case IDM_EDIT:
2846 case IDM_EDITTEXT:
2847 case IDM_EDITBINARY:
2848 case IDM_MCIPLAY:
2849 case IDM_UPDATE:
2850 case IDM_DOITYOURSELF:
2851 case IDM_INFO:
2852 case IDM_EAS:
2853 action = UM_MASSACTION;
2854 break;
2855 }
2856 if(SHORT1FROMMP(mp1) == IDM_OBJECT ||
2857 SHORT1FROMMP(mp1) == IDM_SHADOW ||
2858 SHORT1FROMMP(mp1) == IDM_SHADOW2)
2859 *li->targetpath = 0;
2860 if(!PostMsg(dcd->hwndObject,
2861 action,
2862 MPFROMP(li),
2863 MPVOID)) {
2864 FreeListInfo(li);
2865 DosBeep(50,100);
2866 }
2867 else if(fUnHilite)
2868 UnHilite(hwnd,
2869 TRUE,
2870 &dcd->lastselection);
2871 }
2872 else
2873 free(li);
2874 }
2875 }
2876 break;
2877
2878 case IDM_DRIVESMENU:
2879 if(!hwndMain)
2880 PostMsg(hwnd,
2881 WM_COMMAND,
2882 MPFROM2SHORT(IDM_WALKDIR,0),
2883 MPVOID);
2884 break;
2885
2886 default:
2887 if(SwitchCommand(dcd->hwndLastMenu,
2888 SHORT1FROMMP(mp1)))
2889 return 0;
2890 else {
2891 if(SHORT1FROMMP(mp1) >= IDM_COMMANDSTART &&
2892 SHORT1FROMMP(mp1) < IDM_QUICKTOOLSTART) {
2893
2894 register INT x;
2895
2896 if(!cmdloaded)
2897 load_commands();
2898 x = SHORT1FROMMP(mp1) - IDM_COMMANDSTART;
2899 if(x >= 0) {
2900 x++;
2901 RunCommand(hwnd,x);
2902 if(fUnHilite)
2903 UnHilite(hwnd,
2904 TRUE,
2905 &dcd->lastselection);
2906 }
2907 }
2908 }
2909 break;
2910 }
2911 }
2912 return 0;
2913
2914 case UM_FIXCNRMLE:
2915 case UM_FIXEDITNAME:
2916 return CommonCnrProc(hwnd,msg,mp1,mp2);
2917
2918 case UM_FILESMENU:
2919 {
2920 PCNRITEM pci;
2921 HWND menuHwnd = (HWND)0;
2922
2923 pci = (PCNRITEM)CurrentRecord(hwnd);
2924 if(pci && (INT)pci != -1) {
2925 if(pci->attrFile & FILE_DIRECTORY) {
2926 menuHwnd = CheckMenu(&DirMenu,
2927 DIR_POPUP);
2928// WinEnableMenuItem(DirMenu,IDM_TREE,TRUE);
2929 }
2930 else
2931 menuHwnd = CheckMenu(&FileMenu,
2932 FILE_POPUP);
2933 }
2934 return MRFROMLONG(menuHwnd);
2935 }
2936
2937 case WM_CONTROL:
2938 DosError(FERR_DISABLEHARDERR);
2939 if(dcd) {
2940 switch(SHORT2FROMMP(mp1)) {
2941 case CN_COLLAPSETREE:
2942 case CN_EXPANDTREE:
2943 {
2944 PCNRITEM pci = (PCNRITEM)mp2;
2945
2946 if(pci &&
2947 (INT)pci != -1 &&
2948 !(pci->flags & RECFLAGS_ENV)) {
2949 if(driveflags[toupper(*pci->szFileName) - 'A'] &
2950 DRIVE_REMOVABLE) {
2951
2952 struct {
2953 ULONG serial;
2954 CHAR volumelength;
2955 CHAR volumelabel[CCHMAXPATH];
2956 } volser;
2957
2958 memset(&volser,0,sizeof(volser));
2959 DosError(FERR_DISABLEHARDERR);
2960 if(!DosQueryFSInfo(toupper(*pci->szFileName) - '@',
2961 FSIL_VOLSER,
2962 &volser,
2963 (ULONG)sizeof(volser))) {
2964 if(SHORT2FROMMP(mp1) == CN_COLLAPSETREE &&
2965 !volser.serial ||
2966 driveserial[toupper(*pci->szFileName) - 'A'] !=
2967 volser.serial)
2968 UnFlesh(hwnd,pci);
2969 if(SHORT2FROMMP(mp1) != CN_COLLAPSETREE ||
2970 (!volser.serial ||
2971 driveserial[toupper(*pci->szFileName) - 'A'] !=
2972 volser.serial)) {
2973 if(Flesh(hwnd,pci) &&
2974 SHORT2FROMMP(mp1) == CN_EXPANDTREE &&
2975 !dcd->suspendview && fTopDir)
2976 PostMsg(hwnd,UM_TOPDIR,MPFROMP(pci),MPVOID);
2977 }
2978 driveserial[toupper(*pci->szFileName) - 'A'] =
2979 volser.serial;
2980 }
2981 else {
2982 driveserial[toupper(*pci->szFileName) - 'A'] = -1;
2983 UnFlesh(hwnd,pci);
2984 PostMsg(hwnd,
2985 UM_RESCAN,
2986 MPVOID,
2987 MPVOID);
2988 DosBeep(250,100);
2989 }
2990 }
2991 else if(SHORT2FROMMP(mp1) == CN_EXPANDTREE) {
2992 if(Flesh(hwnd,pci) &&
2993 !dcd->suspendview && fTopDir)
2994 PostMsg(hwnd,
2995 UM_TOPDIR,
2996 MPFROMP(pci),
2997 MPVOID);
2998 }
2999 if(SHORT2FROMMP(mp1) == CN_EXPANDTREE &&
3000 !dcd->suspendview)
3001 WinSendMsg(hwnd,
3002 UM_FILTER,
3003 MPVOID,
3004 MPVOID);
3005 }
3006 }
3007 break;
3008
3009/*
3010 case CN_PICKUP:
3011 return PickUp(hwnd,dcd->hwndObject,mp2);
3012*/
3013
3014 case CN_CONTEXTMENU:
3015 {
3016 PCNRITEM pci = (PCNRITEM)mp2;
3017
3018 if(pci) {
3019 WinSendMsg(hwnd,
3020 CM_SETRECORDEMPHASIS,
3021 MPFROMP(pci),
3022 MPFROM2SHORT(TRUE,CRA_CURSORED));
3023 MarkAll(hwnd,
3024 FALSE,
3025 FALSE,
3026 TRUE);
3027 if(pci->attrFile & FILE_DIRECTORY)
3028 dcd->hwndLastMenu = CheckMenu(&DirMenu,DIR_POPUP);
3029 else
3030 dcd->hwndLastMenu = CheckMenu(&FileMenu,FILE_POPUP);
3031 }
3032 else {
3033 dcd->hwndLastMenu = CheckMenu(&DirCnrMenu,DIRCNR_POPUP);
3034 if(dcd->hwndLastMenu && !dcd->cnremphasized) {
3035 WinSendMsg(hwnd,
3036 CM_SETRECORDEMPHASIS,
3037 MPVOID,
3038 MPFROM2SHORT(TRUE,CRA_SOURCE));
3039 dcd->cnremphasized = TRUE;
3040 }
3041 }
3042 if(dcd->hwndLastMenu) {
3043 if(dcd->hwndLastMenu == DirCnrMenu) {
3044 if(dcd->flWindowAttr & CV_MINI)
3045 WinCheckMenuItem(dcd->hwndLastMenu,
3046 IDM_MINIICONS,
3047 TRUE);
3048 }
3049 if(dcd->hwndLastMenu == DirMenu)
3050 WinEnableMenuItem(DirMenu,
3051 IDM_TREE,
3052 TRUE);
3053 if(!PopupMenu(hwnd,hwnd,dcd->hwndLastMenu)) {
3054 if(dcd->cnremphasized) {
3055 WinSendMsg(hwnd,
3056 CM_SETRECORDEMPHASIS,
3057 MPVOID,
3058 MPFROM2SHORT(FALSE,CRA_SOURCE));
3059 dcd->cnremphasized = TRUE;
3060 }
3061 MarkAll(hwnd,TRUE,FALSE,TRUE);
3062 }
3063 }
3064 }
3065 break;
3066
3067 case CN_DROPHELP:
3068 if(mp2) {
3069
3070 PDRAGINFO pDInfo;
3071 PCNRITEM pci;
3072 ULONG numitems;
3073 USHORT usOperation;
3074
3075 pci = (PCNRITEM)((PCNRDRAGINFO)mp2)->pRecord;
3076 pDInfo = (PDRAGINFO)((PCNRDRAGINFO)mp2)->pDragInfo;
3077 if(!DrgAccessDraginfo(pDInfo)) {
3078 Win_Error(hwnd,hwnd,__FILE__,__LINE__,
3079 GetPString(IDS_DROPERRORTEXT));
3080 break;
3081 }
3082 numitems = DrgQueryDragitemCount(pDInfo);
3083 usOperation = pDInfo->usOperation;
3084 DrgDeleteDraginfoStrHandles(pDInfo);
3085 DrgFreeDraginfo(pDInfo);
3086 saymsg(MB_ENTER | MB_ICONASTERISK,
3087 hwnd,
3088 GetPString(IDS_DROPHELPHDRTEXT),
3089 GetPString(IDS_DROPHELPTEXT),
3090 numitems,
3091 &"s"[numitems == 1L],
3092 (pci) ? NullStr : GetPString(IDS_NOTEXT),
3093 (pci) ? NullStr : " ",
3094 (pci) ? pci->szFileName : NullStr,
3095 (pci) ? " " : NullStr,
3096 GetPString((usOperation == DO_COPY) ?
3097 IDS_COPYTEXT :
3098 (usOperation == DO_LINK) ?
3099 IDS_LINKTEXT : IDS_MOVETEXT));
3100 }
3101 return 0;
3102
3103 case CN_DRAGLEAVE:
3104#ifdef NEVER
3105 if(mp2) {
3106
3107 PDRAGINFO pDInfo;
3108
3109 pDInfo = ((PCNRDRAGINFO)mp2)->pDragInfo;
3110 DrgAccessDraginfo(pDInfo); /* Access DRAGINFO */
3111 DrgFreeDraginfo(pDInfo); /* Free DRAGINFO */
3112 }
3113#endif
3114 return 0;
3115
3116 case CN_DRAGAFTER:
3117 case CN_DRAGOVER:
3118 if(mp2) {
3119
3120 PDRAGITEM pDItem; /* Pointer to DRAGITEM */
3121 PDRAGINFO pDInfo; /* Pointer to DRAGINFO */
3122 PCNRITEM pci;
3123 USHORT uso;
3124
3125 pci = (PCNRITEM)((PCNRDRAGINFO)mp2)->pRecord;
3126 pDInfo = ((PCNRDRAGINFO)mp2)->pDragInfo;
3127 DrgAccessDraginfo(pDInfo); /* Access DRAGINFO */
3128 if(*dcd->directory &&
3129 (driveflags[toupper(*dcd->directory) - 'A'] &
3130 DRIVE_NOTWRITEABLE)) {
3131 DrgFreeDraginfo(pDInfo);
3132 return MRFROM2SHORT(DOR_DROP, /* Return okay to link */
3133 DO_LINK); /* (compare) only */
3134 }
3135 if(pci) {
3136 if(pci->rc.flRecordAttr & CRA_SOURCE) {
3137 DrgFreeDraginfo(pDInfo);
3138 return(MRFROM2SHORT(DOR_NODROP,0));
3139 }
3140 uso = pDInfo->usOperation;
3141 if(uso == DO_DEFAULT)
3142 uso = (fCopyDefault) ? DO_COPY : DO_MOVE;
3143 if(!(pci->attrFile & FILE_DIRECTORY)) {
3144 if(uso != DO_LINK && uso != DO_COPY &&
3145 uso != DO_MOVE) {
3146 DrgFreeDraginfo(pDInfo);
3147 return MRFROM2SHORT(DOR_NODROP,0);
3148 }
3149 if(uso != DO_LINK &&
3150 !(driveflags[toupper(*pci->szFileName) - 'A'] &
3151 DRIVE_NOTWRITEABLE)) {
3152
3153 ARC_TYPE *info = NULL;
3154
3155 if(!fQuickArcFind &&
3156 !(driveflags[toupper(*pci->szFileName) - 'A'] &
3157 DRIVE_SLOW))
3158 info = find_type(pci->szFileName,NULL);
3159 else
3160 info = quick_find_type(pci->szFileName,NULL);
3161 if(!info || ((uso == DO_MOVE && !info->move) ||
3162 (uso == DO_COPY && !info->create))) {
3163 DrgFreeDraginfo(pDInfo);
3164 return MRFROM2SHORT(DOR_NODROP,0);
3165 }
3166 }
3167 }
3168 }
3169 pDItem = DrgQueryDragitemPtr(pDInfo, /* Access DRAGITEM */
3170 0); /* Index to DRAGITEM */
3171 if(DrgVerifyRMF(pDItem, /* Check valid rendering */
3172 DRM_OS2FILE, /* mechanisms and data */
3173 NULL) ||
3174 ((!pci || (pci->attrFile & FILE_DIRECTORY)) &&
3175 DrgVerifyRMF(pDItem,
3176 DRM_FM2ARCMEMBER,
3177 DRF_FM2ARCHIVE))) { /* formats */
3178 DrgFreeDraginfo(pDInfo); /* Free DRAGINFO */
3179 if(driveflags[toupper(*dcd->directory) - 'A'] &
3180 DRIVE_NOTWRITEABLE)
3181 return MRFROM2SHORT(DOR_DROP,DO_LINK);
3182 if(toupper(*dcd->directory) < 'C')
3183 return MRFROM2SHORT(DOR_DROP,DO_COPY);
3184 return MRFROM2SHORT(DOR_DROP, /* Return okay to drop */
3185 ((fCopyDefault) ?
3186 DO_COPY :
3187 DO_MOVE));
3188 }
3189 DrgFreeDraginfo(pDInfo); /* Free DRAGINFO */
3190 }
3191 return MRFROM2SHORT(DOR_NODROP,0); /* Drop not valid */
3192
3193 case CN_INITDRAG:
3194 {
3195 BOOL wasemphasized = FALSE;
3196 PCNRDRAGINIT pcd = (PCNRDRAGINIT)mp2;
3197 PCNRITEM pci;
3198
3199 if(pcd) {
3200 pci = (PCNRITEM)pcd->pRecord;
3201 if(pci) {
3202 if((INT)pci == -1)
3203 pci = NULL;
3204 else if(pci->rc.flRecordAttr & CRA_SELECTED)
3205 wasemphasized = TRUE;
3206 }
3207 else if(!*dcd->directory ||
3208 IsRoot(dcd->directory)) {
3209 DosBeep(50,100);
3210 break;
3211 }
3212 if(hwndStatus2) {
3213 if(pci)
3214 WinSetWindowText(hwndStatus2,
3215 GetPString(IDS_DRAGFILEOBJTEXT));
3216 else
3217 WinSetWindowText(hwndStatus2,
3218 GetPString(IDS_DRAGDIRTEXT));
3219 }
3220 if(DoFileDrag(hwnd,
3221 dcd->hwndObject,
3222 mp2,
3223 NULL,
3224 (pci) ? NULL : dcd->directory,
3225 (pci) ? TRUE : FALSE)) {
3226 if(pci && fUnHilite && wasemphasized)
3227 UnHilite(hwnd,
3228 TRUE,
3229 &dcd->lastselection);
3230 }
3231 if(hwndStatus2) {
3232 WinSetFocus(HWND_DESKTOP,hwnd);
3233 PostMsg(hwnd,
3234 UM_RESCAN,
3235 MPVOID,
3236 MPVOID);
3237 }
3238 }
3239 }
3240 return 0;
3241
3242 case CN_DROP:
3243 if(mp2) {
3244
3245 LISTINFO *li;
3246 ULONG action = UM_ACTION;
3247
3248 li = DoFileDrop(hwnd,dcd->directory,TRUE,mp1,mp2);
3249 if(li) {
3250 if(li->list && li->list[0] && IsRoot(li->list[0]))
3251 li->type = DO_LINK;
3252 else if(fDragndropDlg && (!*li->arcname || !li->info)) {
3253
3254 CHECKLIST cl;
3255
3256 memset(&cl,0,sizeof(cl));
3257 cl.size = sizeof(cl);
3258 cl.flags = li->type;
3259 cl.list = li->list;
3260 cl.cmd = li->type;
3261 cl.prompt = li->targetpath;
3262 li->type = WinDlgBox(HWND_DESKTOP,dcd->hwndParent,
3263 DropListProc,FM3ModHandle,
3264 DND_FRAME,MPFROMP(&cl));
3265 if(!li->type) {
3266 FreeListInfo(li);
3267 return 0;
3268 }
3269 li->list = cl.list;
3270 if(!li->list || !li->list[0]) {
3271 FreeListInfo(li);
3272 return 0;
3273 }
3274 }
3275 switch(li->type) {
3276 case DND_LAUNCH:
3277 strcat(li->targetpath," %a");
3278 ExecOnList(dcd->hwndParent,li->targetpath,
3279 PROMPT | WINDOWED,NULL,li->list,NULL);
3280 FreeList(li->list);
3281 li->list = NULL;
3282 break;
3283 case DO_LINK:
3284 if(fLinkSetsIcon) {
3285 li->type = IDM_SETICON;
3286 action = UM_MASSACTION;
3287 }
3288 else
3289 li->type = IDM_COMPARE;
3290 break;
3291 case DND_EXTRACT:
3292 if(*li->targetpath && !IsFile(li->targetpath))
3293 li->type = IDM_EXTRACT;
3294 break;
3295 case DND_MOVE:
3296 li->type = IDM_MOVE;
3297 if(*li->targetpath && IsFile(li->targetpath) == 1) {
3298 action = UM_MASSACTION;
3299 li->type = IDM_ARCHIVEM;
3300 }
3301 break;
3302 case DND_WILDMOVE:
3303 li->type = IDM_WILDMOVE;
3304 if(*li->targetpath && IsFile(li->targetpath) == 1) {
3305 action = UM_MASSACTION;
3306 li->type = IDM_ARCHIVEM;
3307 }
3308 break;
3309 case DND_OBJECT:
3310 li->type = IDM_OBJECT;
3311 action = UM_MASSACTION;
3312 break;
3313 case DND_SHADOW:
3314 li->type = IDM_SHADOW;
3315 action = UM_MASSACTION;
3316 break;
3317 case DND_COMPARE:
3318 li->type = IDM_COMPARE;
3319 break;
3320 case DND_SETICON:
3321 action = UM_MASSACTION;
3322 li->type = IDM_SETICON;
3323 break;
3324 case DND_COPY:
3325 li->type = IDM_COPY;
3326 if(*li->targetpath && IsFile(li->targetpath) == 1) {
3327 action = UM_MASSACTION;
3328 li->type = IDM_ARCHIVE;
3329 }
3330 break;
3331 case DND_WILDCOPY:
3332 li->type = IDM_WILDCOPY;
3333 if(*li->targetpath && IsFile(li->targetpath) == 1) {
3334 action = UM_MASSACTION;
3335 li->type = IDM_ARCHIVE;
3336 }
3337 break;
3338 default:
3339 if(*li->arcname && li->info) {
3340 action = UM_MASSACTION;
3341 li->type = (li->type == DO_MOVE) ? IDM_FAKEEXTRACTM : IDM_FAKEEXTRACT;
3342 }
3343 else if(*li->targetpath && IsFile(li->targetpath) == 1) {
3344 action = UM_MASSACTION;
3345 li->type = (li->type == DO_MOVE) ? IDM_ARCHIVEM : IDM_ARCHIVE;
3346 }
3347 else
3348 li->type = (li->type == DO_MOVE) ? IDM_MOVE : IDM_COPY;
3349 break;
3350 }
3351 if(!li->list || !li->list[0])
3352 FreeListInfo(li);
3353 else if(!PostMsg(dcd->hwndObject,action,MPFROMP(li),MPVOID))
3354 FreeListInfo(li);
3355 else {
3356
3357 USHORT usop = 0;
3358
3359 switch(li->type) {
3360 case IDM_COPY:
3361 case IDM_WILDCOPY:
3362 usop = DO_COPY;
3363 break;
3364 case IDM_MOVE:
3365 case IDM_WILDMOVE:
3366 case IDM_ARCHIVEM:
3367 usop = DO_MOVE;
3368 break;
3369 }
3370 if(usop)
3371 return MRFROM2SHORT(DOR_DROP,usop);
3372 }
3373 }
3374 }
3375 return 0;
3376
3377 case CN_ENDEDIT:
3378 case CN_BEGINEDIT:
3379 {
3380 PFIELDINFO pfi = ((PCNREDITDATA)mp2)->pFieldInfo;
3381 PCNRITEM pci = (PCNRITEM)((PCNREDITDATA)mp2)->pRecord;
3382
3383 if(pfi || pci) {
3384
3385 MRESULT mre;
3386
3387 mre = CnrDirectEdit(hwnd,msg,mp1,mp2);
3388 if(mre != (MRESULT)-1)
3389 return mre;
3390 }
3391 else if(!pfi && !pci)
3392 PostMsg(hwnd,
3393 UM_FIXCNRMLE,
3394 MPFROMLONG(CCHMAXPATH),
3395 MPVOID);
3396 }
3397 return 0;
3398
3399 case CN_REALLOCPSZ:
3400 {
3401 PFIELDINFO pfi = ((PCNREDITDATA)mp2)->pFieldInfo;
3402 PCNRITEM pci = (PCNRITEM)((PCNREDITDATA)mp2)->pRecord;
3403 HWND hwndMLE;
3404 static CHAR szData[CCHMAXPATH];
3405 CHAR testname[CCHMAXPATH],*p;
3406
3407 if(!pci && !pfi) {
3408 hwndMLE = WinWindowFromID(hwnd,CID_MLE);
3409 WinQueryWindowText(hwndMLE,
3410 sizeof(szData),
3411 szData);
3412 p = strchr(szData,'\n');
3413 if(p)
3414 *p = 0;
3415 p = strchr(szData,'\r');
3416 if(p)
3417 *p = 0;
3418 bstrip(szData);
3419 if(*szData) {
3420 if(!DosQueryPathInfo(szData,
3421 FIL_QUERYFULLNAME,
3422 testname,
3423 sizeof(testname))) {
3424 if(!SetDir(dcd->hwndParent,
3425 hwnd,
3426 testname,
3427 1))
3428 PostMsg(hwnd,
3429 UM_SETDIR,
3430 MPFROMP(testname),
3431 MPVOID);
3432 }
3433 }
3434 }
3435 else {
3436
3437 MRESULT mre;
3438
3439 mre = CnrDirectEdit(hwnd,msg,mp1,mp2);
3440 if(mre != (MRESULT)-1)
3441 return mre;
3442 }
3443 }
3444 return 0;
3445
3446 case CN_EMPHASIS:
3447 if(mp2) {
3448
3449 PNOTIFYRECORDEMPHASIS pre = mp2;
3450 PCNRITEM pci;
3451 CHAR s[CCHMAXPATHCOMP + 91],tb[81],tf[81];
3452
3453 pci = (PCNRITEM)((pre) ? pre->pRecord : NULL);
3454 if(!pci) {
3455 if(hwndStatus2)
3456 WinSetWindowText(hwndStatus2,NullStr);
3457 if(fMoreButtons) {
3458 WinSetWindowText(hwndName,NullStr);
3459 WinSetWindowText(hwndDate,NullStr);
3460 WinSetWindowText(hwndAttr,NullStr);
3461 }
3462 if(hwndMain)
3463 WinSendMsg(hwndMain,
3464 UM_LOADFILE,
3465 MPVOID,
3466 MPVOID);
3467 break;
3468 }
3469 if(pre->fEmphasisMask & CRA_SELECTED) {
3470 if(pci->rc.flRecordAttr & CRA_SELECTED) {
3471 dcd->selectedbytes += (pci->cbFile + pci->easize);
3472 dcd->selectedfiles++;
3473 }
3474 else if(dcd->selectedfiles) {
3475 dcd->selectedbytes -= (pci->cbFile + pci->easize);
3476 dcd->selectedfiles--;
3477 }
3478 if(!dcd->suspendview)
3479 {
3480 commafmt(tf,sizeof(tf),dcd->selectedfiles);
3481 CommaFmtULL(tb,sizeof(tb),dcd->selectedbytes,'K');
3482 sprintf(s,"%s / %s",tf,tb);
3483 WinSetDlgItemText(dcd->hwndClient,DIR_SELECTED,s);
3484 }
3485 }
3486 if(!dcd->suspendview && hwndMain &&
3487 (pre->fEmphasisMask & CRA_CURSORED) &&
3488 (pci->rc.flRecordAttr & CRA_CURSORED) &&
3489 WinQueryActiveWindow(dcd->hwndParent) == dcd->hwndFrame) {
3490 if(driveflags[toupper(*pci->szFileName) - 'A'] & DRIVE_SLOW)
3491 WinSendMsg(hwndMain,
3492 UM_LOADFILE,
3493 MPVOID,
3494 MPVOID);
3495 else
3496 WinSendMsg(hwndMain,
3497 UM_LOADFILE,
3498 MPFROMP(pci->szFileName),
3499 MPVOID);
3500 }
3501 if(!dcd->suspendview &&
3502 WinQueryActiveWindow(dcd->hwndParent) == dcd->hwndFrame) {
3503 if(pre->fEmphasisMask & CRA_CURSORED) {
3504 if(pci->rc.flRecordAttr & CRA_CURSORED) {
3505 if(fSplitStatus && hwndStatus2)
3506 {
3507 CommaFmtULL(tb,sizeof(tb),pci->cbFile + pci->easize,' ');
3508 if(!fMoreButtons)
3509 {
3510 sprintf(s," %s %04u/%02u/%02u %02u:%02u:%02u [%s] %s",
3511 tb,pci->date.year,
3512 pci->date.month,pci->date.day,pci->time.hours,
3513 pci->time.minutes,pci->time.seconds,
3514 pci->pszDispAttr,pci->pszFileName);
3515 }
3516 else {
3517 *tf = 0;
3518 if(pci->cbFile + pci->easize > 1024)
3519 {
3520 CommaFmtULL(tf,sizeof(tf),
3521 pci->cbFile + pci->easize,'K');
3522 }
3523 sprintf(s,GetPString(IDS_STATUSSIZETEXT),
3524 tb,
3525 *tf ? " (" : NullStr,
3526 tf,
3527 *tf ? ")" : NullStr);
3528 }
3529 WinSetWindowText(hwndStatus2,s);
3530 }
3531 if(fMoreButtons) {
3532 WinSetWindowText(hwndName,pci->pszFileName);
3533 sprintf(s,"%04u/%02u/%02u %02u:%02u:%02u",
3534 pci->date.year,pci->date.month,
3535 pci->date.day,pci->time.hours,pci->time.minutes,
3536 pci->time.seconds);
3537 WinSetWindowText(hwndDate,s);
3538 WinSetWindowText(hwndAttr,pci->pszDispAttr);
3539 }
3540 }
3541 }
3542 }
3543 }
3544 else
3545 DosBeep(2000,100);
3546 break;
3547
3548 case CN_ENTER:
3549 if(mp2) {
3550
3551 PCNRITEM pci = (PCNRITEM)((PNOTIFYRECORDENTER)mp2)->pRecord;
3552 FILEFINDBUF3 ffb;
3553 HDIR hDir = HDIR_CREATE;
3554 ULONG nm = 1L;
3555 APIRET status = 0;
3556
3557 SetShiftState();
3558 if(pci) {
3559 if(pci->rc.flRecordAttr & CRA_INUSE)
3560 break;
3561 DosError(FERR_DISABLEHARDERR);
3562 status = DosFindFirst(pci->szFileName,
3563 &hDir,
3564 FILE_NORMAL | FILE_DIRECTORY |
3565 FILE_ARCHIVED | FILE_READONLY |
3566 FILE_HIDDEN | FILE_SYSTEM,
3567 &ffb,
3568 sizeof(ffb),
3569 &nm,
3570 FIL_STANDARD);
3571 priority_bumped();
3572 if(!status) {
3573 DosFindClose(hDir);
3574 if(ffb.attrFile & FILE_DIRECTORY) {
3575 if((shiftstate & (KC_CTRL | KC_ALT)) ==
3576 (KC_CTRL | KC_ALT))
3577 PostMsg(hwnd,
3578 WM_COMMAND,
3579 MPFROM2SHORT(IDM_SHOWALLFILES,0),
3580 MPVOID);
3581 else if((shiftstate & (KC_CTRL | KC_SHIFT)) ==
3582 (KC_CTRL | KC_SHIFT))
3583 OpenObject(pci->szFileName,
3584 Settings,
3585 dcd->hwndFrame);
3586 else if(shiftstate & KC_CTRL)
3587 OpenObject(pci->szFileName,
3588 Default,
3589 dcd->hwndFrame);
3590 else if(shiftstate & KC_SHIFT) {
3591
3592 HWND hwndDir;
3593
3594 hwndDir = OpenDirCnr((HWND)0,
3595 dcd->hwndParent,
3596 dcd->hwndFrame,
3597 FALSE,
3598 pci->szFileName);
3599 if(hwndDir) {
3600 if(fMinOnOpen)
3601 WinSetWindowPos(dcd->hwndFrame,
3602 HWND_BOTTOM,
3603 0,
3604 0,
3605 0,
3606 0,
3607 SWP_MINIMIZE | SWP_ZORDER);
3608 if(fAutoTile)
3609 TileChildren(dcd->hwndParent,
3610 TRUE);
3611 WinSetWindowPos(hwndDir,
3612 HWND_TOP,
3613 0,
3614 0,
3615 0,
3616 0,
3617 SWP_ACTIVATE);
3618 }
3619 }
3620 else {
3621 strcpy(dcd->previous,dcd->directory);
3622 strcpy(dcd->directory,pci->szFileName);
3623 DosEnterCritSec();
3624 dcd->stopflag++;
3625 DosExitCritSec();
3626 if(!PostMsg(dcd->hwndObject,
3627 UM_RESCAN,
3628 MPVOID,
3629 MPFROMLONG(1L))) {
3630 DosEnterCritSec();
3631 dcd->stopflag--;
3632 DosExitCritSec();
3633 }
3634 else if(*dcd->directory) {
3635 if(hwndMain)
3636 WinSendMsg(hwndMain,
3637 UM_SETUSERLISTNAME,
3638 MPFROMP(dcd->directory),
3639 MPVOID);
3640 else
3641 add_udir(FALSE,
3642 dcd->directory);
3643 }
3644 }
3645 }
3646 else {
3647
3648 SWP swp;
3649
3650 WinQueryWindowPos(dcd->hwndFrame,&swp);
3651 WinSendMsg(hwnd,
3652 CM_SETRECORDEMPHASIS,
3653 MPFROMP(pci),
3654 MPFROM2SHORT(TRUE,CRA_INUSE));
3655 DefaultViewKeys(hwnd,
3656 dcd->hwndFrame,
3657 dcd->hwndParent,
3658 &swp,
3659 pci->szFileName);
3660 WinSendMsg(hwnd,
3661 CM_SETRECORDEMPHASIS,
3662 MPFROMP(pci),
3663 MPFROM2SHORT(FALSE,
3664 CRA_INUSE |
3665 ((fUnHilite) ?
3666 CRA_SELECTED :
3667 0)));
3668 }
3669 }
3670 else {
3671 if(!*dcd->directory ||
3672 IsValidDir(dcd->directory)) {
3673 NotifyError(pci->szFileName,
3674 status);
3675 WinSendMsg(hwnd,
3676 CM_REMOVERECORD,
3677 MPFROMP(&pci),
3678 MPFROM2SHORT(1,
3679 CMA_FREE | CMA_INVALIDATE |
3680 CMA_ERASE));
3681 if(hwndStatus)
3682 WinSetWindowText(hwndStatus,
3683 GetPString(IDS_RESCANSUGGESTEDTEXT));
3684 }
3685 else {
3686 DosEnterCritSec();
3687 dcd->stopflag++;
3688 DosExitCritSec();
3689 if(!PostMsg(dcd->hwndObject,
3690 UM_RESCAN,
3691 MPVOID,
3692 MPFROMLONG(1L))) {
3693 DosEnterCritSec();
3694 dcd->stopflag--;
3695 DosExitCritSec();
3696 }
3697 else if(*dcd->directory) {
3698 if(hwndMain)
3699 WinSendMsg(hwndMain,
3700 UM_SETUSERLISTNAME,
3701 MPFROMP(dcd->directory),
3702 MPVOID);
3703 else
3704 add_udir(FALSE,
3705 dcd->directory);
3706 }
3707 }
3708 }
3709 }
3710 else if(*dcd->directory)
3711 OpenObject(dcd->directory,
3712 Default,
3713 hwnd);
3714 }
3715 break;
3716 }
3717 break;
3718 }
3719 return 0;
3720
3721 case UM_LOADFILE:
3722 if(dcd && mp2) {
3723
3724 HWND ret;
3725
3726 ret = StartMLEEditor(dcd->hwndParent,
3727 (INT)mp1,
3728 (CHAR *)mp2,
3729 dcd->hwndFrame);
3730 if(mp2)
3731 free((CHAR *)mp2);
3732 return MRFROMLONG(ret);
3733 }
3734 return 0;
3735
3736 case WM_SAVEAPPLICATION:
3737 if(dcd &&
3738 ParentIsDesktop(hwnd,dcd->hwndParent)) {
3739
3740 SWP swp;
3741
3742 WinQueryWindowPos(dcd->hwndFrame,&swp);
3743 if(!(swp.fl & (SWP_HIDE | SWP_MINIMIZE | SWP_MAXIMIZE)))
3744 PrfWriteProfileData(fmprof,
3745 appname,
3746 "VDirSizePos",
3747 &swp,
3748 sizeof(swp));
3749 }
3750 break;
3751
3752 case WM_CLOSE:
3753 WinSendMsg(hwnd,
3754 WM_SAVEAPPLICATION,
3755 MPVOID,
3756 MPVOID);
3757 if(LastDir == hwnd)
3758 LastDir = (HWND)0;
3759 if(dcd) {
3760 dcd->stopflag++;
3761 if(!dcd->dontclose &&
3762 ParentIsDesktop(dcd->hwndFrame,(HWND)0))
3763 PostMsg((HWND)0,
3764 WM_QUIT,
3765 MPVOID,
3766 MPVOID);
3767 if(!dcd->hwndObject ||
3768 !PostMsg(dcd->hwndObject,
3769 WM_CLOSE,
3770 MPVOID,
3771 MPVOID)) {
3772 if(dcd->hwndObject)
3773 WinSetWindowPtr(dcd->hwndObject,
3774 QWL_USER,
3775 NULL);
3776 WinSetWindowPtr(hwnd,
3777 QWL_USER,
3778 NULL);
3779 if(dcd->hwndRestore)
3780 WinSetWindowPos(dcd->hwndRestore,
3781 HWND_TOP,
3782 0,
3783 0,
3784 0,
3785 0,
3786 SWP_RESTORE | SWP_SHOW | SWP_ACTIVATE |
3787 SWP_ZORDER);
3788 FreeList(dcd->lastselection);
3789 free(dcd);
3790 DosPostEventSem(CompactSem);
3791 }
3792 }
3793 WinDestroyWindow(WinQueryWindow(WinQueryWindow(hwnd,QW_PARENT),
3794 QW_PARENT));
3795 return 0;
3796
3797 case WM_DESTROY:
3798 if(DirMenu)
3799 WinDestroyWindow(DirMenu);
3800 if(DirCnrMenu)
3801 WinDestroyWindow(DirCnrMenu);
3802 if(FileMenu)
3803 WinDestroyWindow(FileMenu);
3804 DirMenu = DirCnrMenu = FileMenu = (HWND)0;
3805 EmptyCnr(hwnd);
3806 break;
3807 }
3808 return (dcd && dcd->oldproc) ? dcd->oldproc(hwnd,msg,mp1,mp2) :
3809 PFNWPCnr(hwnd,msg,mp1,mp2);
3810}
3811
3812
3813HWND StartDirCnr (HWND hwndParent,CHAR *directory,HWND hwndRestore,
3814 ULONG flags) {
3815
3816 /* bitmapped flags:
3817 * 0x00000001 = don't close app when window closes
3818 * 0x00000002 = no frame controls
3819 */
3820
3821 HWND hwndFrame = (HWND)0,hwndClient;
3822 ULONG FrameFlags = FCF_TITLEBAR | FCF_SYSMENU |
3823 FCF_SIZEBORDER | FCF_MINMAX |
3824 FCF_ICON | FCF_NOBYTEALIGN |
3825 FCF_ACCELTABLE;
3826 USHORT id;
3827 static USHORT idinc = 0;
3828 DIRCNRDATA *dcd;
3829 static BOOL first = FALSE;
3830
3831 if(flags & 2)
3832 FrameFlags &= (~(FCF_TITLEBAR | FCF_SYSMENU | FCF_SIZEBORDER |
3833 FCF_MINMAX | FCF_ICON));
3834 if(!idinc)
3835 idinc = (rand() % 100);
3836 if(!hwndParent)
3837 hwndParent = HWND_DESKTOP;
3838 if(ParentIsDesktop(hwndParent,hwndParent))
3839 FrameFlags |= (FCF_TASKLIST | FCF_MENU);
3840 if(!hwndMain && !first) {
3841 if(DirCnrMenu) {
3842
3843 MENUITEM mi;
3844
3845 memset(&mi,0,sizeof(mi));
3846 WinSendMsg(DirCnrMenu,
3847 MM_DELETEITEM,
3848 MPFROM2SHORT(IDM_DRIVESMENU,FALSE),
3849 MPVOID);
3850 mi.iPosition = MIT_END;
3851 mi.afStyle = MIS_TEXT;
3852 mi.id = IDM_DRIVESMENU;
3853 WinSendMsg(DirCnrMenu,
3854 MM_INSERTITEM,
3855 MPFROMP(&mi),
3856 MPFROMP(GetPString(IDS_DRIVESMENUTEXT)));
3857 }
3858 first = TRUE;
3859 }
3860 if(directory) {
3861 hwndFrame = WinCreateStdWindow(hwndParent,
3862 WS_VISIBLE,
3863 &FrameFlags,
3864 GetPString(IDS_WCDIRCONTAINER),
3865 NULL,
3866 WS_VISIBLE | fwsAnimate,
3867 FM3ModHandle,
3868 DIR_FRAME,
3869 &hwndClient);
3870 if(hwndFrame && hwndClient) {
3871 id = DIR_FRAME + idinc++;
3872 if(idinc > 99)
3873 idinc = 0;
3874 WinSetWindowUShort(hwndFrame,QWS_ID,id);
3875 dcd = malloc(sizeof(DIRCNRDATA));
3876 if(dcd) {
3877 memset(dcd,0,sizeof(DIRCNRDATA));
3878 dcd->size = sizeof(DIRCNRDATA);
3879 dcd->id = id;
3880 dcd->type = DIR_FRAME;
3881 dcd->hwndParent = (hwndParent) ? hwndParent : HWND_DESKTOP;
3882 dcd->hwndFrame = hwndFrame;
3883 dcd->hwndClient = hwndClient;
3884 dcd->hwndRestore = hwndRestore;
3885 dcd->dontclose = ((flags & 1) != 0);
3886 strcpy(dcd->directory,directory);
3887 add_udir(FALSE,directory);
3888 {
3889 PFNWP oldproc;
3890
3891 oldproc = WinSubclassWindow(hwndFrame,
3892 (PFNWP)DirFrameWndProc);
3893 WinSetWindowPtr(hwndFrame,
3894 QWL_USER,
3895 (PVOID)oldproc);
3896 }
3897 dcd->hwndCnr = WinCreateWindow(hwndClient,
3898 WC_CONTAINER,
3899 NULL,
3900 CCS_AUTOPOSITION | CCS_MINIICONS |
3901 CCS_MINIRECORDCORE | ulCnrType |
3902 WS_VISIBLE,
3903 0,
3904 0,
3905 0,
3906 0,
3907 hwndClient,
3908 HWND_TOP,
3909 (ULONG)DIR_CNR,
3910 NULL,
3911 NULL);
3912 if(dcd->hwndCnr) {
3913 WinSetWindowPtr(dcd->hwndCnr,QWL_USER,(PVOID)dcd);
3914 dcd->oldproc = WinSubclassWindow(dcd->hwndCnr,
3915 (PFNWP)DirCnrWndProc);
3916 {
3917 USHORT ids[] = {DIR_TOTALS,DIR_SELECTED,DIR_VIEW,DIR_SORT,
3918 DIR_FILTER,DIR_FOLDERICON,DIR_MAX,0};
3919
3920 if(!(flags & 2))
3921 ids[6] = 0;
3922 CommonCreateTextChildren(dcd->hwndClient,
3923 GetPString(IDS_WCDIRSTATUS),
3924 ids);
3925 }
3926 if(!PostMsg(dcd->hwndCnr,
3927 UM_SETUP,
3928 MPVOID,
3929 MPVOID))
3930 WinSendMsg(dcd->hwndCnr,
3931 UM_SETUP,
3932 MPVOID,
3933 MPVOID);
3934 if(FrameFlags & FCF_TASKLIST) {
3935
3936 SWP swp,swpD;
3937 ULONG size = sizeof(swp);
3938 LONG cxScreen,cyScreen;
3939
3940 WinQueryTaskSizePos(WinQueryAnchorBlock(hwndFrame),0,&swp);
3941 if(PrfQueryProfileData(fmprof,
3942 appname,
3943 "VDirSizePos",
3944 &swpD,
3945 &size)) {
3946 cxScreen = WinQuerySysValue(HWND_DESKTOP,SV_CXSCREEN);
3947 cyScreen = WinQuerySysValue(HWND_DESKTOP,SV_CYSCREEN);
3948 if(swp.x + swpD.cx > cxScreen)
3949 swp.x = cxScreen - swpD.cx;
3950 if(swp.y + swpD.cy > cyScreen)
3951 swp.y = cyScreen - swpD.cy;
3952 swp.cx = swpD.cx;
3953 swp.cy = swpD.cy;
3954 }
3955 WinSetWindowPos(hwndFrame,
3956 HWND_TOP,
3957 swp.x,
3958 swp.y,
3959 swp.cx,
3960 swp.cy,
3961 SWP_SIZE | SWP_MOVE | SWP_SHOW | SWP_ZORDER |
3962 SWP_ACTIVATE);
3963 }
3964 }
3965 else {
3966 PostMsg(hwndClient,
3967 WM_CLOSE,
3968 MPVOID,
3969 MPVOID);
3970 free(dcd);
3971 hwndFrame = (HWND)0;
3972 }
3973 }
3974 else {
3975 PostMsg(hwndClient,
3976 WM_CLOSE,
3977 MPVOID,
3978 MPVOID);
3979 hwndFrame = (HWND)0;
3980 }
3981 }
3982 }
3983 return hwndFrame;
3984}
3985
Note: See TracBrowser for help on using the repository browser.