source: trunk/dll/dircnrs.c@ 449

Last change on this file since 449 was 449, checked in by root, 19 years ago

Rework warning message text

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