source: trunk/dll/dircnrs.c@ 150

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

Comments

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