source: trunk/dll/dircnrs.c@ 433

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

Validate WinCreateWindow

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