source: trunk/dll/dircnrs.c@ 358

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

Use Runtime_Error

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