source: trunk/dll/dircnrs.c@ 275

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