source: branches/ticket_150/dll/misc.c

Last change on this file was 869, checked in by John Small, 18 years ago

A "first draft" of code to address ticket 150.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 64.5 KB
RevLine 
[70]1
2/***********************************************************************
3
4 $Id: misc.c 869 2007-11-12 23:25:28Z jbs $
5
[406]6 Misc GUI support functions
[70]7
8 Copyright (c) 1993-98 M. Kimes
[552]9 Copyright (c) 2003, 2007 Steven H. Levine
[70]10
[161]11 11 Jun 03 SHL Add JFS and FAT32 support
12 01 Aug 04 SHL Rework lstrip/rstrip usage
13 01 Aug 04 SHL LoadLibPath: avoid buffer overflow
[198]14 07 Jun 05 SHL Drop obsoletes
[231]15 24 Jul 05 SHL Beautify
[245]16 24 Jul 05 SHL Correct longname display option
[350]17 17 Jul 06 SHL Use Runtime_Error
[369]18 26 Jul 06 SHL Use chop_at_crnl
[397]19 27 Jul 06 SHL Comments, apply indent
[406]20 29 Jul 06 SHL Use xfgets_bstripcr
[451]21 16 Aug 06 SHL Comments
[468]22 31 Aug 06 SHL disable_menuitem: rework args to match name - sheesh
[526]23 10 Oct 06 GKY Add NDFS32 support
[552]24 18 Feb 07 GKY More drive type and drive icon support
[688]25 10 Jun 07 GKY Add IsFm2Window as part of work around PM drag limit
[730]26 05 Jul 07 GKY Fix menu removals for WORKPLACE_PROCESS=YES
[737]27 23 Jul 07 SHL Sync with CNRITEM updates (ticket#24)
[751]28 31 Jul 07 SHL Clean up and report errors (ticket#24)
[756]29 03 Aug 07 GKY Direct editting fixed (ticket#24)
[773]30 06 Aug 07 SHL Use BldQuotedFileName
[775]31 06 Aug 07 GKY Increase Subject EA to 1024
32 06 Aug 07 GKY Reduce DosSleep times (ticket 148)
[787]33 14 Aug 07 SHL Delete obsoletes
34 14 Aug 07 SHL Move #pragma alloc_text to end for OpenWatcom compat
[827]35 01 Sep 07 GKY Use xDosSetPathInfo to fix case where FS3 buffer crosses 64k boundry
[860]36 05 Nov 07 GKY Use commafmtULL to display file sizes for large file support
[70]37
38***********************************************************************/
39
[2]40#define INCL_DOS
41#define INCL_WIN
42#define INCL_GPI
[841]43#define INCL_LONGLONG
[350]44#include <os2.h>
[2]45
46#include <stdarg.h>
47#include <stdio.h>
48#include <stdlib.h>
49#include <string.h>
50#include <ctype.h>
51#include <share.h>
[689]52#include <malloc.h> // headmin
[350]53
[2]54#include "fm3dll.h"
55#include "fm3dlg.h"
56#include "fm3str.h"
57
58#pragma data_seg(DATA1)
[350]59
60static PSZ pszSrcFile = __FILE__;
61
[2]62#ifndef BEGIN_LIBPATH
[231]63#define BEGIN_LIBPATH 1
[2]64#endif
[231]65
[2]66#ifndef END_LIBPATH
[231]67#define END_LIBPATH 2
[2]68#endif
[231]69
[2]70#ifndef ORD_DOS32QUERYEXTLIBPATH
[231]71#define ORD_DOS32QUERYEXTLIBPATH 874
[2]72#endif
73
[687]74BOOL IsFm2Window(HWND hwnd, BOOL chkTid)
75{
76 PIB *ppib;
77 TIB *ptib;
[751]78 BOOL yes;
79 APIRET rc = DosGetInfoBlocks(&ptib, &ppib);
[687]80
[733]81 if (rc) {
[687]82 Dos_Error(MB_CANCEL, rc, HWND_DESKTOP, pszSrcFile, __LINE__,
83 "DosGetInfoBlocks");
[751]84 yes = FALSE;
[733]85 }
[687]86 else {
87 PID pid;
88 TID tid;
89
[751]90 // Check window owned by FM2 process
91 // Check say same thread too, if requested
92 // OK for window to be dead - just return FALSE
93 yes = WinQueryWindowProcess(hwnd, &pid, &tid) &&
94 pid == ppib->pib_ulpid &&
95 (!chkTid || tid == ptib->tib_ptib2->tib2_ultid);
[687]96 }
[751]97 return yes;
[687]98}
99
[231]100VOID SetShiftState(VOID)
101{
[397]102 shiftstate = 0;
103 if (WinGetKeyState(HWND_DESKTOP, VK_CTRL) & 0x8000)
104 shiftstate |= KC_CTRL;
105 if (WinGetKeyState(HWND_DESKTOP, VK_SHIFT) & 0x8000)
106 shiftstate |= KC_SHIFT;
107 if (WinGetKeyState(HWND_DESKTOP, VK_ALT) & 0x8000)
108 shiftstate |= KC_ALT;
[2]109}
110
[231]111void EmphasizeButton(HWND hwnd, BOOL on)
112{
[397]113 HPS hps = DrgGetPS(hwnd);
[2]114
[397]115 // fixme to complain?
116 if (hps) {
117 POINTL ptl;
118 SWP swp;
[2]119
[397]120 WinQueryWindowPos(hwnd, &swp);
121 ptl.x = 1;
122 ptl.y = 1;
123 GpiMove(hps, &ptl);
[787]124 GpiSetColor(hps, on ? CLR_BLACK : CLR_PALEGRAY);
[397]125 ptl.x = swp.cx - 2;
126 ptl.y = swp.cy - 2;
127 GpiBox(hps, DRO_OUTLINE, &ptl, 0, 0);
128 DrgReleasePS(hps);
[551]129 if (remove) //fixme always true
[397]130 WinInvalidateRect(hwnd, NULL, FALSE);
131 }
[2]132}
133
[231]134void DrawTargetEmphasis(HWND hwnd, BOOL on)
135{
[397]136 HPS hps = DrgGetPS(WinQueryWindow(hwnd, QW_PARENT));
[551]137
[397]138 if (hps) {
[787]139 BoxWindow(hwnd, hps, on ? CLR_BLACK : CLR_PALEGRAY);
[397]140 DrgReleasePS(hps);
141 }
[2]142}
143
[231]144void BoxWindow(HWND hwnd, HPS hps, LONG color)
145{
[397]146 POINTL ptl;
147 SWP swp;
148 BOOL releaseme = FALSE;
[2]149
[397]150 if (!hps) {
151 hps = WinGetPS(WinQueryWindow(hwnd, QW_PARENT));
152 releaseme = TRUE;
153 }
154 if (hps && WinQueryWindowPos(hwnd, &swp)) {
155 ptl.x = swp.x - 2;
156 ptl.y = swp.y - 2;
157 GpiMove(hps, &ptl);
158 GpiSetColor(hps, color);
159 ptl.x = swp.x + swp.cx + 1;
160 ptl.y = swp.y + swp.cy + 1;
161 GpiBox(hps, DRO_OUTLINE, &ptl, 0, 0);
162 }
163 if (releaseme && hps)
164 WinReleasePS(hps);
[2]165}
166
[231]167void PaintSTextWindow(HWND hwnd, HPS hps)
168{
[397]169 /*
170 * paint a text window such that the rightmost part of the text is
171 * always visible even if the text length exceeds the length of the
172 * window -- otherwise, paint the window so that it is left-justified
173 * and vertically centered.
174 */
[2]175
[397]176 char *s = NULL;
177 long len;
178 POINTL aptl[TXTBOX_COUNT], ptl;
179 RECTL rcl;
180 char *p;
181 BOOL releaseme = FALSE;
[2]182
[397]183 if (!hps) {
184 releaseme = TRUE;
185 hps = WinGetPS(hwnd);
186 }
187 if (hps) {
188 WinQueryWindowRect(hwnd, &rcl);
189 WinFillRect(hps, &rcl, CLR_PALEGRAY);
190 len = WinQueryWindowTextLength(hwnd);
191 if (len)
192 s = xmalloc(len + 1, pszSrcFile, __LINE__);
193 if (s) {
194 *s = 0;
195 WinQueryWindowText(hwnd, CCHMAXPATH, s);
196 if (*s) {
197 rcl.xRight -= 3;
198 p = s;
199 GpiQueryTextBox(hps, 3, "...", TXTBOX_COUNT, aptl);
200 len = aptl[TXTBOX_TOPRIGHT].x;
201 do {
202 GpiQueryTextBox(hps, strlen(p), p, TXTBOX_COUNT, aptl);
[787]203 if (aptl[TXTBOX_TOPRIGHT].x > (rcl.xRight - (p != s ? len : 0)))
[397]204 p++;
205 else
206 break;
[231]207 }
[397]208 while (*p);
209 if (*p) {
210 GpiSetMix(hps, FM_OVERPAINT);
211 GpiSetColor(hps, CLR_BLACK);
212 ptl.x = 3;
213 ptl.y = ((rcl.yTop / 2) -
214 ((aptl[TXTBOX_TOPRIGHT].y +
215 aptl[TXTBOX_BOTTOMLEFT].y) / 2));
216 GpiMove(hps, &ptl);
217 if (p != s)
218 GpiCharString(hps, 3, "...");
219 GpiCharString(hps, strlen(p), p);
220 }
221 }
222 free(s);
[231]223 }
[397]224 if (releaseme)
225 WinReleasePS(hps);
226 }
[2]227}
228
[231]229VOID PaintRecessedWindow(HWND hwnd, HPS hps, BOOL outtie, BOOL dbl)
230{
[397]231 /*
232 * paint a recessed box around the window
233 * two pixels width required around window for painting...
234 */
235 BOOL releaseme = FALSE;
[2]236
[397]237 if (!hps) {
238 hps = WinGetPS(WinQueryWindow(hwnd, QW_PARENT));
239 releaseme = TRUE;
240 }
241 if (hps) {
[2]242
[397]243 POINTL ptl;
244 SWP swp;
[2]245
[397]246 WinQueryWindowPos(hwnd, &swp);
247 ptl.x = swp.x - 1;
248 ptl.y = swp.y - 1;
249 GpiMove(hps, &ptl);
250 if (!outtie)
251 GpiSetColor(hps, CLR_WHITE);
252 else
253 GpiSetColor(hps, CLR_DARKGRAY);
254 ptl.x = swp.x + swp.cx;
255 GpiLine(hps, &ptl);
256 ptl.y = swp.y + swp.cy;
257 GpiLine(hps, &ptl);
258 if (dbl) {
259 ptl.x = swp.x - 2;
260 ptl.y = swp.y - 2;
261 GpiMove(hps, &ptl);
262 ptl.x = swp.x + swp.cx + 1;
263 GpiLine(hps, &ptl);
264 ptl.y = swp.y + swp.cy + 1;
265 GpiLine(hps, &ptl);
[2]266 }
[397]267 if (!outtie)
268 GpiSetColor(hps, CLR_DARKGRAY);
269 else
270 GpiSetColor(hps, CLR_WHITE);
271 if (dbl) {
272 ptl.x = swp.x - 2;
273 GpiLine(hps, &ptl);
274 ptl.y = swp.y - 2;
275 GpiLine(hps, &ptl);
276 ptl.x = swp.x + swp.cx;
277 ptl.y = swp.y + swp.cy;
278 GpiMove(hps, &ptl);
279 }
280 ptl.x = swp.x - 1;
281 GpiLine(hps, &ptl);
282 ptl.y = swp.y - 1;
283 GpiLine(hps, &ptl);
284 GpiSetColor(hps, CLR_PALEGRAY);
285 ptl.x = swp.x - (2 + (dbl != FALSE));
286 ptl.y = swp.y - (2 + (dbl != FALSE));
287 GpiMove(hps, &ptl);
288 ptl.x = swp.x + swp.cx + (1 + (dbl != FALSE));
289 GpiLine(hps, &ptl);
290 ptl.y = swp.y + swp.cy + (1 + (dbl != FALSE));
291 GpiLine(hps, &ptl);
292 ptl.x = swp.x - (2 + (dbl != FALSE));
293 GpiLine(hps, &ptl);
294 ptl.y = swp.y - (2 + (dbl != FALSE));
295 GpiLine(hps, &ptl);
296 if (releaseme)
297 WinReleasePS(hps);
298 }
[2]299}
300
[231]301BOOL AdjustCnrColVis(HWND hwndCnr, CHAR * title, BOOL visible, BOOL toggle)
302{
[551]303 PFIELDINFO pfi = (PFIELDINFO) WinSendMsg(hwndCnr,
304 CM_QUERYDETAILFIELDINFO,
305 MPVOID, MPFROMSHORT(CMA_FIRST));
306
[397]307 while (pfi) {
308 if (!strcmp(pfi->pTitleData, title)) {
309 if (toggle) {
310 if (pfi->flData & CFA_INVISIBLE)
311 pfi->flData &= (~CFA_INVISIBLE);
312 else
313 pfi->flData |= CFA_INVISIBLE;
314 return !(pfi->flData & CFA_INVISIBLE);
315 }
316 else {
317 if (visible)
318 pfi->flData &= (~CFA_INVISIBLE);
319 else
320 pfi->flData |= CFA_INVISIBLE;
321 }
322 return TRUE;
[2]323 }
[397]324 pfi = pfi->pNextFieldInfo;
325 }
326 return FALSE;
[2]327}
328
[231]329BOOL AdjustCnrColRO(HWND hwndCnr, CHAR * title, BOOL readonly, BOOL toggle)
[70]330{
[551]331 PFIELDINFO pfi = (PFIELDINFO) WinSendMsg(hwndCnr,
332 CM_QUERYDETAILFIELDINFO,
333 MPVOID, MPFROMSHORT(CMA_FIRST));
334
[397]335 while (pfi) {
336 if (!strcmp(pfi->pTitleData, title)) {
337 if (toggle) {
338 if (pfi->flData & CFA_FIREADONLY)
339 pfi->flData &= (~CFA_FIREADONLY);
340 else
341 pfi->flData |= CFA_FIREADONLY;
342 return (pfi->flData & CFA_FIREADONLY);
343 }
344 else {
345 if (!readonly)
346 pfi->flData &= (~CFA_FIREADONLY);
347 else
348 pfi->flData |= CFA_FIREADONLY;
349 }
350 return TRUE;
[2]351 }
[397]352 pfi = pfi->pNextFieldInfo;
353 }
354 return FALSE;
[2]355}
356
[397]357VOID AdjustCnrColsForFSType(HWND hwndCnr, CHAR * directory, DIRCNRDATA * dcd)
[231]358{
[397]359 CHAR FileSystem[CCHMAXPATH];
360 INT x;
361 BOOL hasCreateDT;
362 BOOL hasAccessDT;
363 BOOL hasLongNames;
364 BOOL *pBool;
[2]365
[397]366 if (!directory || !*directory)
367 return;
368 x = CheckDrive(toupper(*directory), FileSystem, NULL);
369 if (x != -1) {
370 if (!stricmp(FileSystem, HPFS) ||
371 !stricmp(FileSystem, JFS) ||
[551]372 !stricmp(FileSystem, FAT32) ||
[751]373 !stricmp(FileSystem, RAMFS) ||
374 !stricmp(FileSystem, NDFS32) ||
375 !stricmp(FileSystem, NTFS) ||
376 !stricmp(FileSystem, HPFS386)) {
[397]377 hasCreateDT = TRUE;
378 hasAccessDT = TRUE;
379 hasLongNames = TRUE;
[2]380 }
[552]381 else if (!strcmp(FileSystem, CDFS) || !strcmp(FileSystem, ISOFS)) {
[397]382 hasCreateDT = TRUE;
383 hasAccessDT = FALSE;
384 hasLongNames = FALSE;
[2]385 }
[397]386 else {
387 // Assume FAT
388 hasCreateDT = FALSE;
389 hasAccessDT = FALSE;
390 hasLongNames = FALSE;
391 }
392 }
393 else {
394 // Assume FAT
395 hasCreateDT = FALSE;
396 hasAccessDT = FALSE;
397 hasLongNames = FALSE;
398 }
[787]399 pBool = dcd ? &dcd->detailsladate : &detailsladate;
400 AdjustCnrColVis(hwndCnr,
401 GetPString(IDS_LADATE),
402 *pBool ? hasAccessDT : FALSE,
403 FALSE);
404 pBool = dcd ? &dcd->detailslatime : &detailslatime;
405 AdjustCnrColVis(hwndCnr,
406 GetPString(IDS_LATIME),
407 *pBool ? hasAccessDT : FALSE,
408 FALSE);
409 pBool = dcd ? &dcd->detailscrdate : &detailscrdate;
410 AdjustCnrColVis(hwndCnr,
411 GetPString(IDS_CRDATE),
412 *pBool ? hasCreateDT : FALSE,
413 FALSE);
414 pBool = dcd ? &dcd->detailscrtime : &detailscrtime;
415 AdjustCnrColVis(hwndCnr,
416 GetPString(IDS_CRTIME),
417 *pBool ? hasCreateDT : FALSE,
418 FALSE);
419 pBool = dcd ? &dcd->detailslongname : &detailslongname;
420 AdjustCnrColVis(hwndCnr,
421 GetPString(IDS_LNAME),
422 *pBool ? hasLongNames : FALSE,
423 FALSE);
[397]424 WinSendMsg(hwndCnr, CM_INVALIDATEDETAILFIELDINFO, MPVOID, MPVOID);
[2]425}
426
[231]427VOID AdjustCnrColsForPref(HWND hwndCnr, CHAR * directory, DIRCNRDATA * dcd,
428 BOOL compare)
429{
[397]430 BOOL *bool;
[2]431
[751]432 bool = dcd ? &dcd->detailssubject : &detailssubject;
433 AdjustCnrColVis(hwndCnr,
434 compare ? GetPString(IDS_STATUS) : GetPString(IDS_SUBJ),
435 *bool,
436 FALSE);
437
438 bool = dcd ? &dcd->detailsattr : &detailsattr;
[397]439 AdjustCnrColVis(hwndCnr, GetPString(IDS_ATTR), *bool, FALSE);
[751]440 bool = dcd ? &dcd->detailsicon : &detailsicon;
[397]441 AdjustCnrColVis(hwndCnr, GetPString(IDS_ICON), *bool, FALSE);
[751]442 bool = dcd ? &dcd->detailslwdate : &detailslwdate;
[397]443 AdjustCnrColVis(hwndCnr, GetPString(IDS_LWDATE), *bool, FALSE);
[751]444 bool = dcd ? &dcd->detailslwtime : &detailslwtime;
[397]445 AdjustCnrColVis(hwndCnr, GetPString(IDS_LWTIME), *bool, FALSE);
[751]446 bool = dcd ? &dcd->detailsea : &detailsea;
[397]447 AdjustCnrColVis(hwndCnr, GetPString(IDS_EA), *bool, FALSE);
[751]448 bool = dcd ? &dcd->detailssize : &detailssize;
[397]449 AdjustCnrColVis(hwndCnr, GetPString(IDS_SIZE), *bool, FALSE);
[751]450
[397]451 if (!directory) {
[751]452 bool = dcd ? &dcd->detailsladate : &detailsladate;
[397]453 AdjustCnrColVis(hwndCnr, GetPString(IDS_LADATE), *bool, FALSE);
[751]454 bool = dcd ? &dcd->detailslatime : &detailslatime;
[397]455 AdjustCnrColVis(hwndCnr, GetPString(IDS_LATIME), *bool, FALSE);
[751]456 bool = dcd ? &dcd->detailscrdate : &detailscrdate;
[397]457 AdjustCnrColVis(hwndCnr, GetPString(IDS_CRDATE), *bool, FALSE);
[751]458 bool = dcd ? &dcd->detailscrtime : &detailscrtime;
[397]459 AdjustCnrColVis(hwndCnr, GetPString(IDS_CRTIME), *bool, FALSE);
[751]460 bool = dcd ? &dcd->detailslongname : &detailslongname;
[397]461 AdjustCnrColVis(hwndCnr, GetPString(IDS_LNAME), *bool, FALSE);
462 WinSendMsg(hwndCnr, CM_INVALIDATEDETAILFIELDINFO, MPVOID, MPVOID);
463 }
464 else
465 AdjustCnrColsForFSType(hwndCnr, directory, dcd);
[2]466}
467
[751]468BOOL SetCnrCols(HWND hwndCnr, BOOL isCompCnr)
[231]469{
[397]470 BOOL fSuccess = TRUE;
471 PFIELDINFO pfi, pfiLastLeftCol, pfiIconCol;
[2]472
[397]473 // Allocate storage for container column data
[2]474
[397]475 pfi = WinSendMsg(hwndCnr, CM_ALLOCDETAILFIELDINFO,
476 MPFROMLONG(CONTAINER_COLUMNS), NULL);
[2]477
[751]478 if (!pfi) {
479 Win_Error(hwndCnr, HWND_DESKTOP, pszSrcFile, __LINE__, "CM_ALLOCDETAILFIELDINFO");
480 fSuccess = FALSE;
481 }
482 else {
[2]483
[397]484 PFIELDINFO pfiFirst;
485 FIELDINFOINSERT fii;
[2]486
[397]487 // Store original value of pfi so we won't lose it when it changes.
488 // This will be needed on the CM_INSERTDETAILFIELDINFO message.
[2]489
[397]490 pfiFirst = pfi;
[2]491
[397]492 // Fill in column information for the icon column
[2]493
[397]494 pfi->flData = CFA_BITMAPORICON | CFA_CENTER | CFA_FIREADONLY;
495 pfi->flTitle = CFA_CENTER | CFA_FITITLEREADONLY;
496 pfi->pTitleData = GetPString(IDS_ICON);
497 pfi->offStruct = FIELDOFFSET(MINIRECORDCORE, hptrIcon);
[2]498
[397]499 pfiIconCol = pfi;
[2]500
[397]501 // Fill in column information for the file name. Note that we are
[737]502 // using the pszDisplayName variable rather than pszFileName. We do this
503 // because the container does not always display the full path file name.
[2]504
[397]505 pfi = pfi->pNextFieldInfo;
[856]506
[397]507 pfi->flData = CFA_STRING | CFA_LEFT | CFA_SEPARATOR;
[792]508 pfi->flTitle = CFA_LEFT;
[397]509 pfi->pTitleData = GetPString(IDS_FILENAME);
[737]510 pfi->offStruct = FIELDOFFSET(CNRITEM, pszDisplayName);
[2]511
[397]512 // Fill in column information for the longname.
[2]513
[397]514 pfi = pfi->pNextFieldInfo;
515 pfi->flData = CFA_STRING | CFA_LEFT;
[792]516 pfi->flTitle = CFA_LEFT | CFA_FITITLEREADONLY;
[397]517 pfi->pTitleData = GetPString(IDS_LNAME);
[762]518 pfi->offStruct = FIELDOFFSET(CNRITEM, pszLongName);
[2]519
[397]520 // Fill in column info for subjects
[2]521
[796]522 if (fSubjectInLeftPane) {
523 pfi = pfi->pNextFieldInfo;
524 pfi->flData = CFA_STRING | CFA_LEFT | CFA_SEPARATOR;
525 if (isCompCnr)
[827]526 pfi->flData |= CFA_FIREADONLY;
[796]527 pfi->flTitle = CFA_LEFT | CFA_FITITLEREADONLY;
528 pfi->pTitleData = isCompCnr ? GetPString(IDS_STATUS) :
[787]529 GetPString(IDS_SUBJ);
[796]530 pfi->offStruct = FIELDOFFSET(CNRITEM, pszSubject);
531 pfi->cxWidth = SubjectDisplayWidth;
[2]532
[796]533 // Store the current pfi value as that will be used to indicate the
534 // last column in the lefthand container window (we have a splitbar)
[792]535
[796]536 pfiLastLeftCol = pfi;
537 }
538 else {
539 // Store the current pfi value as that will be used to indicate the
540 // last column in the lefthand container window (we have a splitbar)
[792]541
[796]542 pfiLastLeftCol = pfi;
543 pfi = pfi->pNextFieldInfo;
544 pfi->flData = CFA_STRING | CFA_LEFT | CFA_SEPARATOR;
545 if (isCompCnr)
[827]546 pfi->flData |= CFA_FIREADONLY;
[796]547 pfi->flTitle = CFA_LEFT | CFA_FITITLEREADONLY;
548 pfi->pTitleData = isCompCnr ? GetPString(IDS_STATUS) :
549 GetPString(IDS_SUBJ);
550 pfi->offStruct = FIELDOFFSET(CNRITEM, pszSubject);
551 pfi->cxWidth = SubjectDisplayWidth;
552 }
553
[397]554 // Fill in column information for the file size
[2]555
556
[859]557 pfi = pfi->pNextFieldInfo;
558 pfi->flData = CFA_STRING | CFA_RIGHT | CFA_SEPARATOR | CFA_FIREADONLY;
559 pfi->flTitle = CFA_CENTER;
560 pfi->pTitleData = GetPString(IDS_SIZE);
561 pfi->offStruct = FIELDOFFSET(CNRITEM, pszFmtFileSize);
562
563
[397]564 // Fill in the column information for the file's ea size
[2]565
[397]566 pfi = pfi->pNextFieldInfo;
567 pfi->flData = CFA_ULONG | CFA_RIGHT | CFA_SEPARATOR | CFA_FIREADONLY;
568 pfi->flTitle = CFA_CENTER;
569 pfi->pTitleData = GetPString(IDS_EA);
570 pfi->offStruct = FIELDOFFSET(CNRITEM, easize);
[2]571
[397]572 // Fill in the column information for the file attribute
[2]573
[397]574 pfi = pfi->pNextFieldInfo;
575 pfi->flData = CFA_STRING | CFA_CENTER | CFA_SEPARATOR | CFA_FIREADONLY;
576 pfi->flTitle = CFA_CENTER | CFA_FITITLEREADONLY;
577 pfi->pTitleData = GetPString(IDS_ATTR);
578 pfi->offStruct = FIELDOFFSET(CNRITEM, pszDispAttr);
[2]579
[397]580 // Fill in column information for last write file date
[2]581
[397]582 pfi = pfi->pNextFieldInfo;
583 pfi->flData = CFA_DATE | CFA_RIGHT | CFA_FIREADONLY;
584 pfi->flTitle = CFA_CENTER;
585 pfi->pTitleData = GetPString(IDS_LWDATE);
586 pfi->offStruct = FIELDOFFSET(CNRITEM, date);
[2]587
[397]588 // Fill in column information for the last write file time
[2]589
[397]590 pfi = pfi->pNextFieldInfo;
591 pfi->flData = CFA_TIME | CFA_RIGHT | CFA_SEPARATOR | CFA_FIREADONLY;
592 pfi->flTitle = CFA_CENTER;
593 pfi->pTitleData = GetPString(IDS_LWTIME);
594 pfi->offStruct = FIELDOFFSET(CNRITEM, time);
[2]595
[397]596 // Fill in column information for last access file date
[2]597
[397]598 pfi = pfi->pNextFieldInfo;
599 pfi->flData = CFA_DATE | CFA_RIGHT | CFA_FIREADONLY;
600 pfi->flTitle = CFA_CENTER;
601 pfi->pTitleData = GetPString(IDS_LADATE);
602 pfi->offStruct = FIELDOFFSET(CNRITEM, ladate);
[2]603
[397]604 // Fill in column information for the last access file time
[2]605
[397]606 pfi = pfi->pNextFieldInfo;
607 pfi->flData = CFA_TIME | CFA_RIGHT | CFA_SEPARATOR | CFA_FIREADONLY;
608 pfi->flTitle = CFA_CENTER;
609 pfi->pTitleData = GetPString(IDS_LATIME);
610 pfi->offStruct = FIELDOFFSET(CNRITEM, latime);
[2]611
[397]612 // Fill in column information for create file date
[2]613
[397]614 pfi = pfi->pNextFieldInfo;
615 pfi->flData = CFA_DATE | CFA_RIGHT | CFA_FIREADONLY;
616 pfi->flTitle = CFA_CENTER;
617 pfi->pTitleData = GetPString(IDS_CRDATE);
618 pfi->offStruct = FIELDOFFSET(CNRITEM, crdate);
[2]619
[397]620 // Fill in column information for the create file time
[2]621
[397]622 pfi = pfi->pNextFieldInfo;
623 pfi->flData = CFA_TIME | CFA_RIGHT | CFA_FIREADONLY;
624 pfi->flTitle = CFA_CENTER;
625 pfi->pTitleData = GetPString(IDS_CRTIME);
626 pfi->offStruct = FIELDOFFSET(CNRITEM, crtime);
[2]627
[397]628 // Use the CM_INSERTDETAILFIELDINFO message to tell the container
629 // all the column information it needs to function properly. Place
630 // this column info first in the column list and update the display
631 // after they are inserted (fInvalidateFieldInfo = TRUE)
[2]632
[397]633 (void)memset(&fii, 0, sizeof(FIELDINFOINSERT));
[2]634
[397]635 fii.cb = sizeof(FIELDINFOINSERT);
636 fii.pFieldInfoOrder = (PFIELDINFO) CMA_FIRST;
637 fii.cFieldInfoInsert = (SHORT) CONTAINER_COLUMNS;
638 fii.fInvalidateFieldInfo = TRUE;
[2]639
[397]640 if (!WinSendMsg(hwndCnr, CM_INSERTDETAILFIELDINFO, MPFROMP(pfiFirst),
[751]641 MPFROMP(&fii))) {
642 Win_Error(hwndCnr, HWND_DESKTOP, pszSrcFile, __LINE__, "CM_INSERTDETAILFIELDINFO");
[397]643 fSuccess = FALSE;
[751]644 }
[397]645 }
[2]646
[397]647 if (fSuccess) {
[2]648
[397]649 CNRINFO cnri;
650 ULONG size;
[2]651
[397]652 // Tell the container about the splitbar and where it goes
[2]653
[397]654 cnri.cb = sizeof(CNRINFO);
655 cnri.pFieldInfoLast = pfiLastLeftCol;
656 cnri.xVertSplitbar = DIR_SPLITBAR_OFFSET - 32;
657 cnri.pFieldInfoObject = pfiIconCol;
658 size = sizeof(LONG);
659 PrfQueryProfileData(fmprof,
660 appname, "CnrSplitBar", &cnri.xVertSplitbar, &size);
661 if (cnri.xVertSplitbar <= 0)
662 cnri.xVertSplitbar = DIR_SPLITBAR_OFFSET - 32;
663 if (!WinSendMsg(hwndCnr, CM_SETCNRINFO, MPFROMP(&cnri),
664 MPFROMLONG(CMA_PFIELDINFOLAST | CMA_PFIELDINFOOBJECT |
[751]665 CMA_XVERTSPLITBAR))) {
666 Win_Error(hwndCnr, HWND_DESKTOP, pszSrcFile, __LINE__, "CM_SETCNRINFO");
[397]667 fSuccess = FALSE;
[751]668 }
[397]669 }
[2]670
[397]671 return fSuccess;
[2]672}
673
[231]674MRESULT CnrDirectEdit(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
[161]675{
[397]676 switch (SHORT2FROMMP(mp1)) {
677 case CN_BEGINEDIT:
678 if (mp2) {
679 PFIELDINFO pfi = ((PCNREDITDATA) mp2)->pFieldInfo;
680 PCNRITEM pci = (PCNRITEM) ((PCNREDITDATA) mp2)->pRecord;
[2]681
[397]682 if (pci &&
[551]683 (INT) pci != -1 &&
[730]684 !IsRoot(pci->pszFileName) &&
[397]685 !(pci->flags & RECFLAGS_ENV) && !(pci->flags & RECFLAGS_UNDERENV)) {
[756]686 if (!pfi || pfi->offStruct == FIELDOFFSET(CNRITEM, pszDisplayName)) {
[730]687 PostMsg(hwnd, UM_FIXEDITNAME, MPFROMP(pci->pszFileName), MPVOID);
[231]688 }
[397]689 else if (pfi->offStruct == FIELDOFFSET(CNRITEM, pszSubject))
690 PostMsg(hwnd, UM_FIXCNRMLE, MPFROMLONG(40), MPVOID);
691 else
692 PostMsg(hwnd, UM_FIXCNRMLE, MPFROMLONG(CCHMAXPATH), MPVOID);
693 }
694 else
695 PostMsg(hwnd, CM_CLOSEEDIT, MPVOID, MPVOID);
696 }
697 break;
[2]698
[397]699 case CN_REALLOCPSZ:
700 if (mp2) {
701 PFIELDINFO pfi = ((PCNREDITDATA) mp2)->pFieldInfo;
702 PCNRITEM pci = (PCNRITEM) ((PCNREDITDATA) mp2)->pRecord;
[689]703 CHAR szData[CCHMAXPATH], testname[CCHMAXPATH];
[397]704 HWND hwndMLE = WinWindowFromID(hwnd, CID_MLE);
[2]705
[730]706 if (pci && (INT) pci != -1 && !IsRoot(pci->pszFileName)) {
[397]707 if (pfi && pfi->offStruct == FIELDOFFSET(CNRITEM, pszSubject)) {
[2]708
[397]709 APIRET rc;
710 EAOP2 eaop;
711 PFEA2LIST pfealist = NULL;
[771]712 CHAR szSubject[1048];
[397]713 ULONG ealen;
714 USHORT len;
[751]715 CHAR *eaval;
716 LONG retlen;
[2]717
[747]718 retlen = WinQueryWindowText(hwndMLE, sizeof(szSubject), szSubject);
719 szSubject[retlen + 1] = 0;
[756]720 //chop_at_crnl(szSubject);
[787]721 bstrip(szSubject);
722 pci->pszSubject = xrealloc(pci->pszSubject, retlen + 1, pszSrcFile, __LINE__);
[397]723 WinSetWindowText(hwndMLE, szSubject);
724 len = strlen(szSubject);
725 if (len)
726 ealen = sizeof(FEA2LIST) + 9 + len + 4;
727 else
728 ealen = sizeof(FEALIST) + 9;
[747]729 rc = DosAllocMem((PPVOID) & pfealist, ealen + 64,
[397]730 OBJ_TILE | PAG_COMMIT | PAG_READ | PAG_WRITE);
731 if (rc)
732 Dos_Error(MB_CANCEL, rc, HWND_DESKTOP, pszSrcFile,
733 __LINE__, GetPString(IDS_OUTOFMEMORY));
734 else {
735 memset(pfealist, 0, ealen + 1);
736 pfealist->cbList = ealen;
[747]737 pfealist->list[0].oNextEntryOffset = 0;
[397]738 pfealist->list[0].fEA = 0;
739 pfealist->list[0].cbName = 8;
740 strcpy(pfealist->list[0].szName, SUBJECT);
741 if (len) {
742 eaval = pfealist->list[0].szName + 9;
743 *(USHORT *) eaval = (USHORT) EAT_ASCII;
744 eaval += sizeof(USHORT);
745 *(USHORT *) eaval = (USHORT) len;
746 eaval += sizeof(USHORT);
747 memcpy(eaval, szSubject, len);
748 pfealist->list[0].cbValue = len + (sizeof(USHORT) * 2);
749 }
750 else
751 pfealist->list[0].cbValue = 0;
752 eaop.fpGEA2List = (PGEA2LIST) 0;
753 eaop.fpFEA2List = pfealist;
754 eaop.oError = 0L;
[827]755 rc = xDosSetPathInfo(pci->pszFileName, FIL_QUERYEASIZE,
756 &eaop, sizeof(eaop), DSPI_WRTTHRU);
[397]757 DosFreeMem(pfealist);
758 if (rc)
759 return FALSE;
760 }
761 return (MRESULT) TRUE;
762 }
[762]763 else if (pfi && pfi->offStruct == FIELDOFFSET(CNRITEM, pszLongName)) {
[2]764
[397]765 CHAR longname[CCHMAXPATHCOMP];
[751]766 LONG retlen;
[2]767
[397]768 *longname = 0;
[747]769 retlen = WinQueryWindowText(hwndMLE, sizeof(longname), longname);
770 longname[retlen + 1] = 0;
[787]771 //chop_at_crnl(longname);
772 pci->pszLongName = xrealloc(pci->pszLongName, retlen + 1, pszSrcFile, __LINE__);
[751]773 WinSetWindowText(hwndMLE, longname);
[756]774 pci->pszFileName = xrealloc(pci->pszFileName, retlen + 1, pszSrcFile, __LINE__);
[730]775 return (MRESULT) WriteLongName(pci->pszFileName, longname);
[397]776 }
[787]777 else {
778 WinQueryWindowText(hwndMLE, sizeof(szData), szData);
[397]779 if (strchr(szData, '?') ||
[730]780 strchr(szData, '*') || IsRoot(pci->pszFileName))
[397]781 return (MRESULT) FALSE;
[751]782 /* If the text changed, rename the file system object. */
[397]783 chop_at_crnl(szData);
[751]784 bstrip(szData);
[397]785 if (!IsFullName(szData))
786 Runtime_Error(pszSrcFile, __LINE__, "bad name");
787 else {
788 if (DosQueryPathInfo(szData,
789 FIL_QUERYFULLNAME,
790 testname, sizeof(testname)))
[751]791 return FALSE;
[730]792 if (DosQueryPathInfo(pci->pszFileName,
[787]793 FIL_QUERYFULLNAME, szData, sizeof(szData))){
794 pci->pszFileName = xrealloc(pci->pszFileName, sizeof(szData), pszSrcFile, __LINE__);
795 strcpy(szData, pci->pszFileName);
796 }
[397]797 WinSetWindowText(hwndMLE, szData);
798 if (strcmp(szData, testname)) {
799 if (stricmp(szData, testname) && IsFile(testname) != -1) {
800 DosBeep(50, 100); /* exists; disallow */
801 return (MRESULT) FALSE;
802 }
803 if (docopyf(MOVE, szData, "%s", testname))
804 Runtime_Error(pszSrcFile, __LINE__, "docopyf");
805 else {
806 CHAR *filename;
[2]807
[397]808 filename = xstrdup(testname, pszSrcFile, __LINE__);
809 if (filename) {
810 if (!PostMsg(hwnd,
811 UM_FIXEDITNAME, MPVOID, MPFROMP(filename)))
812 free(filename);
[231]813 }
[730]814 if (stricmp(testname, pci->pszFileName)) {
[397]815 PostMsg(hwnd, UM_FIXEDITNAME, MPFROMLONG(-1), MPFROMP(pci));
[730]816 filename = xstrdup(pci->pszFileName, pszSrcFile, __LINE__);
[397]817 if (filename) {
818 if (!PostMsg(hwnd,
819 UM_FIXEDITNAME, MPVOID, MPFROMP(filename)))
820 free(filename);
821 }
[231]822 }
[397]823 }
[231]824 }
[397]825 }
[231]826 }
[397]827 }
828 }
829 return FALSE;
[2]830
[397]831 case CN_ENDEDIT:
832 if (mp2) {
833 PFIELDINFO pfi = ((PCNREDITDATA) mp2)->pFieldInfo;
834 PCNRITEM pci = (PCNRITEM) ((PCNREDITDATA) mp2)->pRecord;
[2]835
[730]836 if (pci && (INT) pci != -1 && !IsRoot(pci->pszFileName)) {
[397]837 WinSendMsg(hwnd,
838 CM_INVALIDATERECORD,
839 MPFROMP(&pci),
840 MPFROM2SHORT(1, CMA_ERASE | CMA_TEXTCHANGED));
[756]841 if (pfi && pfi->offStruct == FIELDOFFSET(CNRITEM, pszDisplayName))
[397]842 PostMsg(hwnd, UM_SORTRECORD, MPVOID, MPVOID);
843 }
844 else {
845 USHORT cmd = 0;
[2]846
[756]847 if (!pfi || pfi->offStruct == FIELDOFFSET(CNRITEM, pszDisplayName))
[397]848 cmd = IDM_SORTSMARTNAME;
849 else if (pfi->offStruct == FIELDOFFSET(CNRITEM, cbFile))
850 cmd = IDM_SORTSIZE;
851 else if (pfi->offStruct == FIELDOFFSET(CNRITEM, easize))
852 cmd = IDM_SORTEASIZE;
853 else if (pfi->offStruct == FIELDOFFSET(CNRITEM, date))
854 cmd = IDM_SORTLWDATE;
855 else if (pfi->offStruct == FIELDOFFSET(CNRITEM, time))
856 cmd = IDM_SORTLWDATE;
857 else if (pfi->offStruct == FIELDOFFSET(CNRITEM, ladate))
858 cmd = IDM_SORTLADATE;
859 else if (pfi->offStruct == FIELDOFFSET(CNRITEM, latime))
860 cmd = IDM_SORTLADATE;
861 else if (pfi->offStruct == FIELDOFFSET(CNRITEM, crdate))
862 cmd = IDM_SORTCRDATE;
863 else if (pfi->offStruct == FIELDOFFSET(CNRITEM, crtime))
864 cmd = IDM_SORTCRDATE;
865 if (cmd)
866 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(cmd, 0), MPVOID);
867 }
[231]868 }
[397]869 break;
870 }
871 return (MRESULT) - 1;
[2]872}
873
[231]874BOOL SetMenuCheck(HWND hwndMenu, USHORT id, BOOL * bool, BOOL toggle,
875 CHAR * savename)
876{
[397]877 if (toggle) {
[787]878 *bool = *bool ? FALSE : TRUE;
[397]879 if (savename && *savename)
880 PrfWriteProfileData(fmprof, appname, savename, bool, sizeof(BOOL));
881 }
882 WinSendMsg(hwndMenu, MM_SETITEMATTR,
883 MPFROM2SHORT(id, 1),
[468]884 MPFROM2SHORT(MIA_CHECKED, (*bool ? MIA_CHECKED : 0)));
[397]885 return *bool;
[2]886}
887
[468]888//== disable_menuitem() disable or enable_menuitem ==
889
890VOID disable_menuitem(HWND hwndMenu, USHORT id, BOOL disable)
[231]891{
[397]892 WinSendMsg(hwndMenu, MM_SETITEMATTR,
893 MPFROM2SHORT(id, TRUE),
[468]894 MPFROM2SHORT(MIA_DISABLED, (disable ? MIA_DISABLED : 0)));
[2]895}
896
[451]897//== ViewHelp() invoke view.exe, return TRUE if OK ==
898
[231]899BOOL ViewHelp(CHAR * filename)
900{
[397]901 CHAR s[CCHMAXPATH + 81];
902 FILE *fp;
903 INT ret = -1;
[2]904
[397]905 fp = _fsopen(filename, "rb", SH_DENYNO);
906 if (fp) {
907 *s = 0;
908 fread(s, 1, 3, fp);
909 if (*s != 'H' || s[1] != 'S' || s[2] != 'P') {
910 fclose(fp);
911 return FALSE;
[2]912 }
[397]913 fclose(fp);
914 ret = runemf2(SEPARATE | WINDOWED, HWND_DESKTOP, NULL, NULL,
915 "VIEW.EXE \"%s\"", filename);
916 }
[2]917
[397]918 return (ret != -1);
[2]919}
920
[451]921//== ExecFile() run file, return 1 if OK 0 if skipped -1 if can't run ==
922
[231]923INT ExecFile(HWND hwnd, CHAR * filename)
924{
[397]925 EXECARGS ex;
926 CHAR cl[1001], path[CCHMAXPATH], *p;
927 APIRET ret;
928 static INT lastflags = 0;
[2]929
[397]930 strcpy(path, filename);
931 p = strrchr(path, '\\');
932 if (!p)
933 p = strrchr(path, ':');
934 if (p) {
935 if (*p == ':') {
936 p++;
937 *p = '\\';
938 p++;
[2]939 }
[397]940 *p = 0;
941 }
942 else
943 *path = 0;
944 *cl = 0;
[773]945 BldQuotedFileName(cl, filename);
946 // *cl = 0;
947 // if (needs_quoting(filename))
948 // strcat(cl, "\"");
949 // strcat(cl, filename);
950 // if (needs_quoting(filename))
951 // strcat(cl, "\"");
[397]952 memset(&ex, 0, sizeof(ex));
953 ex.flags = lastflags;
954 ex.commandline = cl;
955 *ex.path = 0;
956 *ex.environment = 0;
957 ret = WinDlgBox(HWND_DESKTOP, hwnd, CmdLineDlgProc, FM3ModHandle,
958 EXEC_FRAME, &ex);
959 if (ret == 1) {
960 lastflags = ex.flags;
[451]961 return runemf2(ex.flags, hwnd, path,
[787]962 *ex.environment ? ex.environment : NULL,
963 "%s", cl) != -1;
[397]964 }
965 else if (ret != 0)
966 return -1;
967 return 0;
[2]968}
969
[231]970VOID SetDetailsSwitches(HWND hwnd, DIRCNRDATA * dcd)
971{
[397]972 WinCheckMenuItem(hwnd, IDM_SHOWLNAMES,
[751]973 dcd ? dcd->detailslongname : detailslongname);
[397]974 WinCheckMenuItem(hwnd, IDM_SHOWSUBJECT,
[751]975 dcd ? dcd->detailssubject : detailssubject);
976 WinCheckMenuItem(hwnd, IDM_SHOWEAS, dcd ? dcd->detailsea : detailsea);
[397]977 WinCheckMenuItem(hwnd, IDM_SHOWSIZE,
[751]978 dcd ? dcd->detailssize : detailssize);
[397]979 WinCheckMenuItem(hwnd, IDM_SHOWICON,
[751]980 dcd ? dcd->detailsicon : detailsicon);
[397]981 WinCheckMenuItem(hwnd, IDM_SHOWLWDATE,
[751]982 dcd ? dcd->detailslwdate : detailslwdate);
[397]983 WinCheckMenuItem(hwnd, IDM_SHOWLWTIME,
[751]984 dcd ? dcd->detailslwtime : detailslwtime);
[397]985 WinCheckMenuItem(hwnd, IDM_SHOWLADATE,
[751]986 dcd ? dcd->detailsladate : detailsladate);
[397]987 WinCheckMenuItem(hwnd, IDM_SHOWLATIME,
[751]988 dcd ? dcd->detailslatime : detailslatime);
[397]989 WinCheckMenuItem(hwnd, IDM_SHOWCRDATE,
[751]990 dcd ? dcd->detailscrdate : detailscrdate);
[397]991 WinCheckMenuItem(hwnd, IDM_SHOWCRTIME,
[751]992 dcd ? dcd->detailscrtime : detailscrtime);
[397]993 WinCheckMenuItem(hwnd, IDM_SHOWATTR,
[751]994 dcd ? dcd->detailsattr : detailsattr);
[2]995}
996
[231]997VOID AdjustDetailsSwitches(HWND hwnd, HWND hwndMenu, USHORT cmd,
998 CHAR * directory, CHAR * keyroot,
999 DIRCNRDATA * dcd, BOOL compare)
1000{
[869]1001// CHAR s[CCHMAXPATH], *eos = s;
1002 BOOL *bool = NULL;
[2]1003
[869]1004// *s = 0;
1005// if (keyroot) {
1006// strcpy(s, keyroot);
1007// strcat(s, ".");
1008// eos = &s[strlen(s)];
1009// }
[397]1010 switch (cmd) {
1011 case IDM_SHOWLNAMES:
[751]1012 bool = dcd ? &dcd->detailslongname : &detailslongname;
[869]1013// strcpy(eos, "DetailsLongname");
[397]1014 break;
1015 case IDM_SHOWSUBJECT:
[751]1016 bool = dcd ? &dcd->detailssubject : &detailssubject;
[869]1017// strcpy(eos, "DetailsSubject");
[397]1018 break;
1019 case IDM_SHOWEAS:
[751]1020 bool = dcd ? &dcd->detailsea : &detailsea;
[869]1021// strcpy(eos, "DetailsEA");
[397]1022 break;
1023 case IDM_SHOWSIZE:
[751]1024 bool = dcd ? &dcd->detailssize : &detailssize;
[869]1025// strcpy(eos, "DetailsSize");
[397]1026 break;
1027 case IDM_SHOWICON:
[751]1028 bool = dcd ? &dcd->detailsicon : &detailsicon;
[869]1029// strcpy(eos, "DetailsIcon");
[397]1030 break;
1031 case IDM_SHOWLWDATE:
[751]1032 bool = dcd ? &dcd->detailslwdate : &detailslwdate;
[869]1033// strcpy(eos, "DetailsLWDate");
[397]1034 break;
1035 case IDM_SHOWLWTIME:
[751]1036 bool = dcd ? &dcd->detailslwtime : &detailslwtime;
[869]1037// strcpy(eos, "DetailsLWTime");
[397]1038 break;
1039 case IDM_SHOWLADATE:
[751]1040 bool = dcd ? &dcd->detailsladate : &detailsladate;
[869]1041// strcpy(eos, "DetailsLADate");
[397]1042 break;
1043 case IDM_SHOWLATIME:
[751]1044 bool = dcd ? &dcd->detailslatime : &detailslatime;
[869]1045// strcpy(eos, "DetailsLATime");
[397]1046 break;
1047 case IDM_SHOWCRDATE:
[751]1048 bool = dcd ? &dcd->detailscrdate : &detailscrdate;
[869]1049// strcpy(eos, "DetailsCRDate");
[397]1050 break;
1051 case IDM_SHOWCRTIME:
[751]1052 bool = dcd ? &dcd->detailscrtime : &detailscrtime;
[869]1053// strcpy(eos, "DetailsCRTime");
[397]1054 break;
1055 case IDM_SHOWATTR:
[751]1056 bool = dcd ? &dcd->detailsattr : &detailsattr;
[869]1057// strcpy(eos, "DetailsAttr");
[397]1058 break;
1059 default:
[231]1060 if (hwndMenu)
[397]1061 SetDetailsSwitches(hwndMenu, dcd);
1062 return;
1063 }
1064 if (bool)
[787]1065 *bool = *bool ? FALSE : TRUE;
[869]1066// if (*s && bool)
1067// PrfWriteProfileData(fmprof, appname, s, bool, sizeof(BOOL));
[397]1068 if (hwnd)
1069 AdjustCnrColsForPref(hwnd, directory, dcd, compare);
1070 if (hwndMenu)
1071 SetDetailsSwitches(hwndMenu, dcd);
[2]1072}
1073
[231]1074VOID SetConditionalCascade(HWND hwndMenu, USHORT id, USHORT def)
1075{
[397]1076 MENUITEM mi;
[2]1077
[397]1078 mi.iPosition = MIT_END;
1079 mi.hItem = 0L;
1080 mi.hwndSubMenu = (HWND) 0;
1081 mi.afAttribute = 0;
1082 mi.afStyle = MIS_TEXT;
1083 if (WinSendMsg
1084 (hwndMenu, MM_QUERYITEM, MPFROM2SHORT(id, TRUE), MPFROMP(&mi))) {
1085 WinSetWindowBits(mi.hwndSubMenu, QWL_STYLE, MS_CONDITIONALCASCADE,
1086 MS_CONDITIONALCASCADE);
1087 WinSendMsg(mi.hwndSubMenu, MM_SETDEFAULTITEMID, MPFROMSHORT(def), MPVOID);
1088 WinCheckMenuItem(mi.hwndSubMenu, def, TRUE);
1089 }
[2]1090}
1091
[231]1092VOID SetSortChecks(HWND hwndMenu, INT sortflags)
1093{
[397]1094 WinCheckMenuItem(hwndMenu, IDM_SORTNONE, FALSE);
1095 WinCheckMenuItem(hwndMenu, IDM_SORTFIRST, FALSE);
1096 WinCheckMenuItem(hwndMenu, IDM_SORTLAST, FALSE);
1097 WinCheckMenuItem(hwndMenu, IDM_SORTSIZE, FALSE);
1098 WinCheckMenuItem(hwndMenu, IDM_SORTEASIZE, FALSE);
1099 WinCheckMenuItem(hwndMenu, IDM_SORTLWDATE, FALSE);
1100 WinCheckMenuItem(hwndMenu, IDM_SORTLADATE, FALSE);
1101 WinCheckMenuItem(hwndMenu, IDM_SORTCRDATE, FALSE);
1102 WinCheckMenuItem(hwndMenu, IDM_SORTFILENAME, FALSE);
1103 WinCheckMenuItem(hwndMenu, IDM_SORTNAME, FALSE);
1104 WinCheckMenuItem(hwndMenu, IDM_SORTSUBJECT, FALSE);
1105 WinCheckMenuItem(hwndMenu, IDM_SORTDIRSFIRST, FALSE);
1106 WinCheckMenuItem(hwndMenu, IDM_SORTDIRSLAST, FALSE);
1107 WinCheckMenuItem(hwndMenu, IDM_SORTREVERSE, FALSE);
1108 if (sortflags & SORT_FIRSTEXTENSION)
1109 WinCheckMenuItem(hwndMenu, IDM_SORTFIRST, TRUE);
1110 else if (sortflags & SORT_LASTEXTENSION)
1111 WinCheckMenuItem(hwndMenu, IDM_SORTLAST, TRUE);
1112 else if (sortflags & SORT_SIZE)
1113 WinCheckMenuItem(hwndMenu, IDM_SORTSIZE, TRUE);
1114 else if (sortflags & SORT_EASIZE)
1115 WinCheckMenuItem(hwndMenu, IDM_SORTEASIZE, TRUE);
1116 else if (sortflags & SORT_LWDATE)
1117 WinCheckMenuItem(hwndMenu, IDM_SORTLWDATE, TRUE);
1118 else if (sortflags & SORT_LADATE)
1119 WinCheckMenuItem(hwndMenu, IDM_SORTLADATE, TRUE);
1120 else if (sortflags & SORT_CRDATE)
1121 WinCheckMenuItem(hwndMenu, IDM_SORTCRDATE, TRUE);
1122 else if (sortflags & SORT_FILENAME)
1123 WinCheckMenuItem(hwndMenu, IDM_SORTFILENAME, TRUE);
1124 else if (sortflags & SORT_NOSORT)
1125 WinCheckMenuItem(hwndMenu, IDM_SORTNONE, TRUE);
1126 else if (sortflags & SORT_SUBJECT)
1127 WinCheckMenuItem(hwndMenu, IDM_SORTSUBJECT, TRUE);
1128 else
1129 WinCheckMenuItem(hwndMenu, IDM_SORTNAME, TRUE);
1130 if (sortflags & SORT_DIRSFIRST)
1131 WinCheckMenuItem(hwndMenu, IDM_SORTDIRSFIRST, TRUE);
1132 else if (sortflags & SORT_DIRSLAST)
1133 WinCheckMenuItem(hwndMenu, IDM_SORTDIRSLAST, TRUE);
1134 if (sortflags & SORT_REVERSE)
1135 WinCheckMenuItem(hwndMenu, IDM_SORTREVERSE, TRUE);
[2]1136}
1137
[231]1138VOID FcloseFile(FILE * fp)
1139{
[397]1140 /* for use by apps that don't use the DLLs runtime library */
1141 fclose(fp);
[2]1142}
1143
[231]1144VOID SetupCommandMenu(HWND hwndMenu, HWND hwndCnr)
1145{
[397]1146 MENUITEM mi, mit;
1147 INT x;
1148 SHORT numitems;
1149 LINKCMDS *info;
[2]1150
[397]1151 if (!cmdloaded)
1152 load_commands();
1153 mi.iPosition = MIT_END;
1154 mi.hwndSubMenu = (HWND) 0;
1155 mi.hItem = 0L;
1156 mi.afAttribute = 0;
1157 mi.afStyle = MIS_TEXT;
1158 memset(&mit, 0, sizeof(MENUITEM));
1159 if (WinQueryWindowUShort(hwndMenu, QWS_ID) == IDM_COMMANDSMENU)
1160 mit.hwndSubMenu = hwndMenu;
1161 else
1162 WinSendMsg(hwndMenu, MM_QUERYITEM,
1163 MPFROM2SHORT(IDM_COMMANDSMENU, TRUE), MPFROMP(&mit));
1164 if (mit.hwndSubMenu) {
1165 numitems = (SHORT) WinSendMsg(mit.hwndSubMenu, MM_QUERYITEMCOUNT,
1166 MPVOID, MPVOID);
1167 WinSendMsg(mit.hwndSubMenu, MM_DELETEITEM, MPFROMSHORT(-1), MPVOID);
1168 for (x = 0; x < numitems; x++)
1169 WinSendMsg(mit.hwndSubMenu, MM_DELETEITEM,
1170 MPFROMSHORT((SHORT) (x + IDM_COMMANDSTART)), MPVOID);
1171 if (hwndCnr && cmdhead) {
1172 x = 0;
1173 info = cmdhead;
1174 while (info) {
[2]1175
[397]1176 CHAR s[CCHMAXPATH + 24];
[2]1177
[397]1178 sprintf(s,
1179 "%s%s%s",
1180 info->title,
[787]1181 x < 20 ? "\tCtrl + " : NullStr,
1182 x < 20 && x > 9 ? "Shift + " : NullStr);
[397]1183 if (x < 20)
1184 sprintf(&s[strlen(s)], "%d",
[787]1185 ((x % 10) + 1) == 10 ? 0 : (x % 10) + 1);
[397]1186 mi.id = IDM_COMMANDSTART + x;
[787]1187 mi.afAttribute = (info->flags & ONCE ? MIA_CHECKED : 0) |
1188 (info->flags & PROMPT ? MIA_FRAMED : 0);
[397]1189 mi.afStyle = MIS_TEXT;
1190 if (!(x % 24) && x && info->next)
1191 mi.afStyle |= MIS_BREAK;
1192 WinSendMsg(mit.hwndSubMenu, MM_INSERTITEM, MPFROMP(&mi), MPFROMP(s));
1193 x++;
1194 info = info->next;
1195 }
[2]1196 }
[397]1197 }
[2]1198}
1199
[231]1200VOID LoadDetailsSwitches(CHAR * keyroot, DIRCNRDATA * dcd)
1201{
[397]1202 ULONG size;
1203 CHAR s[CCHMAXPATH], *eos = s;
1204 BOOL *bool;
[2]1205
[397]1206 *s = 0;
1207 if (keyroot) {
1208 strcpy(s, keyroot);
1209 strcat(s, ".");
1210 eos = &s[strlen(s)];
[869]1211 } else
1212 {
1213 dcd->detailslongname = detailslongname;
1214 dcd->detailssubject = detailssubject;
1215 dcd->detailsea = detailsea;
1216 dcd->detailssize = detailssize;
1217 dcd->detailsicon = detailsicon;
1218 dcd->detailsattr = detailsattr;
1219 dcd->detailscrdate = detailscrdate;
1220 dcd->detailscrtime = detailscrtime;
1221 dcd->detailslwdate = detailslwdate;
1222 dcd->detailslwtime = detailslwtime;
1223 dcd->detailsladate = detailsladate;
1224 dcd->detailslatime = detailslatime;
1225 return;
[397]1226 }
1227 strcpy(eos, "DetailsLongname");
1228 if (dcd)
1229 bool = &dcd->detailslongname;
1230 else
1231 bool = &detailslongname;
1232 *bool = detailslongname;
1233 size = sizeof(BOOL);
1234 PrfQueryProfileData(fmprof, appname, s, (PVOID) bool, &size);
1235 strcpy(eos, "DetailsSubject");
1236 if (dcd)
1237 bool = &dcd->detailssubject;
1238 else
1239 bool = &detailssubject;
1240 *bool = detailssubject;
1241 size = sizeof(BOOL);
1242 PrfQueryProfileData(fmprof, appname, s, (PVOID) bool, &size);
1243 strcpy(eos, "DetailsEA");
1244 if (dcd)
1245 bool = &dcd->detailsea;
1246 else
1247 bool = &detailsea;
1248 *bool = detailsea;
1249 size = sizeof(BOOL);
1250 PrfQueryProfileData(fmprof, appname, s, (PVOID) bool, &size);
1251 strcpy(eos, "DetailsSize");
1252 if (dcd)
1253 bool = &dcd->detailssize;
1254 else
1255 bool = &detailssize;
1256 *bool = detailssize;
1257 size = sizeof(BOOL);
1258 PrfQueryProfileData(fmprof, appname, s, (PVOID) bool, &size);
1259 strcpy(eos, "DetailsIcon");
1260 if (dcd)
1261 bool = &dcd->detailsicon;
1262 else
1263 bool = &detailsicon;
1264 *bool = detailsicon;
1265 size = sizeof(BOOL);
1266 PrfQueryProfileData(fmprof, appname, s, (PVOID) bool, &size);
1267 strcpy(eos, "DetailsAttr");
1268 if (dcd)
1269 bool = &dcd->detailsattr;
1270 else
1271 bool = &detailsattr;
1272 *bool = detailsattr;
1273 size = sizeof(BOOL);
1274 PrfQueryProfileData(fmprof, appname, s, (PVOID) bool, &size);
1275 strcpy(eos, "DetailsCRDate");
1276 if (dcd)
1277 bool = &dcd->detailscrdate;
1278 else
1279 bool = &detailscrdate;
1280 *bool = detailscrdate;
1281 size = sizeof(BOOL);
1282 PrfQueryProfileData(fmprof, appname, s, (PVOID) bool, &size);
1283 strcpy(eos, "DetailsCRTime");
1284 if (dcd)
1285 bool = &dcd->detailscrtime;
1286 else
1287 bool = &detailscrtime;
1288 *bool = detailscrtime;
1289 size = sizeof(BOOL);
1290 PrfQueryProfileData(fmprof, appname, s, (PVOID) bool, &size);
1291 strcpy(eos, "DetailsLWDate");
1292 if (dcd)
1293 bool = &dcd->detailslwdate;
1294 else
1295 bool = &detailslwdate;
1296 *bool = detailslwdate;
1297 size = sizeof(BOOL);
1298 PrfQueryProfileData(fmprof, appname, s, (PVOID) bool, &size);
1299 strcpy(eos, "DetailsLWTime");
1300 if (dcd)
1301 bool = &dcd->detailslwtime;
1302 else
1303 bool = &detailslwtime;
1304 *bool = detailslwtime;
1305 size = sizeof(BOOL);
1306 PrfQueryProfileData(fmprof, appname, s, (PVOID) bool, &size);
1307 strcpy(eos, "DetailsLADate");
1308 if (dcd)
1309 bool = &dcd->detailsladate;
1310 else
1311 bool = &detailsladate;
1312 *bool = detailsladate;
1313 size = sizeof(BOOL);
1314 PrfQueryProfileData(fmprof, appname, s, (PVOID) bool, &size);
1315 strcpy(eos, "DetailsLATime");
1316 if (dcd)
1317 bool = &dcd->detailslatime;
1318 else
1319 bool = &detailslatime;
1320 *bool = detailslatime;
1321 size = sizeof(BOOL);
1322 PrfQueryProfileData(fmprof, appname, s, (PVOID) bool, &size);
[2]1323}
1324
[231]1325HWND FindDirCnr(HWND hwndParent)
1326{
[397]1327 HWND found, hwndDir = (HWND) 0;
1328 HENUM henum;
[2]1329
[397]1330 henum = WinBeginEnumWindows(hwndParent);
1331 while ((found = WinGetNextWindow(henum)) != NULLHANDLE) {
1332 hwndDir = WinWindowFromID(found, FID_CLIENT);
1333 if (hwndDir) {
1334 hwndDir = WinWindowFromID(hwndDir, DIR_CNR);
1335 if (hwndDir)
1336 break;
1337 hwndDir = (HWND) 0;
[2]1338 }
[397]1339 }
1340 WinEndEnumWindows(henum);
[2]1341
[397]1342 return hwndDir;
[2]1343}
1344
[231]1345VOID HeapThread(VOID * dummy)
1346{
[397]1347 ULONG postcount;
1348 APIRET rc;
[2]1349
[397]1350 rc = DosCreateEventSem(NULL, &CompactSem, 0L, FALSE);
1351 if (rc)
1352 Dos_Error(MB_CANCEL, rc, HWND_DESKTOP, pszSrcFile, __LINE__,
1353 "DosCreateEventSem");
1354 else {
1355 priority_normal();
1356 for (;;) {
1357 if (DosWaitEventSem(CompactSem, SEM_INDEFINITE_WAIT))
1358 break;
1359 _heapmin();
1360 DosResetEventSem(CompactSem, &postcount);
[2]1361 }
[397]1362 }
[2]1363}
1364
[231]1365VOID FixSwitchList(HWND hwnd, CHAR * text)
1366{
[397]1367 HSWITCH hswitch;
1368 SWCNTRL swctl;
[2]1369
[397]1370 hswitch = WinQuerySwitchHandle(hwnd, 0);
1371 if (hswitch) {
1372 if (!WinQuerySwitchEntry(hswitch, &swctl)) {
1373 strcpy(swctl.szSwtitle, "FM/2");
1374 WinChangeSwitchEntry(hswitch, &swctl);
[2]1375 }
[397]1376 }
[2]1377}
1378
[231]1379VOID QuickPopup(HWND hwnd, DIRCNRDATA * dcd, HWND hwndMenu, USHORT id)
1380{
[397]1381 dcd->hwndLastMenu = hwndMenu;
1382 if (dcd->hwndLastMenu && !dcd->cnremphasized) {
1383 WinSendMsg(hwnd, CM_SETRECORDEMPHASIS, MPVOID,
1384 MPFROM2SHORT(TRUE, CRA_SOURCE));
1385 dcd->cnremphasized = TRUE;
1386 }
1387 if (dcd->flWindowAttr & CV_MINI)
1388 WinCheckMenuItem(dcd->hwndLastMenu, IDM_MINIICONS, TRUE);
1389 if (!WinPopupMenu(hwnd, hwnd, dcd->hwndLastMenu,
1390 8, 8, 0,
1391 PU_HCONSTRAIN | PU_VCONSTRAIN |
1392 PU_KEYBOARD | PU_MOUSEBUTTON1)) {
1393 if (dcd->cnremphasized) {
1394 WinSendMsg(hwnd, CM_SETRECORDEMPHASIS, MPVOID,
1395 MPFROM2SHORT(FALSE, CRA_SOURCE));
1396 dcd->cnremphasized = FALSE;
[2]1397 }
[397]1398 }
1399 else
1400 WinSendMsg(dcd->hwndLastMenu, MM_SELECTITEM,
1401 MPFROM2SHORT(id, TRUE), MPFROM2SHORT(0, FALSE));
[2]1402}
1403
[231]1404PMINIRECORDCORE CurrentRecord(HWND hwndCnr)
1405{
[787]1406 SHORT attrib = fSelectedAlways ? CRA_SELECTED : CRA_CURSORED;
[397]1407 PMINIRECORDCORE pmi;
[2]1408
[397]1409 for (;;) {
1410 pmi = (PMINIRECORDCORE) WinSendMsg(hwndCnr, CM_QUERYRECORDEMPHASIS,
1411 MPFROMLONG(CMA_FIRST),
1412 MPFROMSHORT(attrib));
1413 if ((!pmi || (INT) pmi == -1) && attrib == CRA_SELECTED) /* punt */
1414 attrib = CRA_CURSORED;
1415 else
1416 break;
1417 }
[787]1418 return ((INT)pmi == -1) ? NULL : pmi;
[2]1419}
1420
[231]1421BOOL PostMsg(HWND h, ULONG msg, MPARAM mp1, MPARAM mp2)
1422{
[397]1423 BOOL rc = WinPostMsg(h, msg, mp1, mp2);
[2]1424
[397]1425 if (!rc) {
[2]1426
[733]1427 // If window owned by some other process or some other thread?
1428 if (!IsFm2Window(h, 1)) {
[751]1429 QMSG qmsg;
[397]1430 for (;;) {
[747]1431 DosSleep(1);
[397]1432 rc = WinPostMsg(h, msg, mp1, mp2);
1433 if (rc)
1434 break; // OK
1435 if (!WinIsWindow((HAB) 0, h))
1436 break; // Window gone
1437 if (WinPeekMsg((HAB) 0, &qmsg, (HWND) 0, 0, 0, PM_NOREMOVE))
1438 break; // Queue has message(s)
1439 } // for
[231]1440 }
[2]1441 }
[397]1442 return rc;
[2]1443}
1444
[231]1445VOID OpenEdit(HWND hwnd)
1446{
[397]1447 CNREDITDATA ced;
1448 PCNRITEM pci;
1449 PFIELDINFO pfi;
[2]1450
[397]1451 pci = (PCNRITEM) WinSendMsg(hwnd,
1452 CM_QUERYRECORDEMPHASIS,
1453 MPFROMLONG(CMA_FIRST),
1454 MPFROMSHORT(CRA_CURSORED));
1455 if (pci && (INT) pci != -1) {
1456 memset(&ced, 0, sizeof(ced));
1457 ced.cb = sizeof(ced);
1458 ced.hwndCnr = hwnd;
1459 ced.id = WinQueryWindowUShort(hwnd, QWS_ID);
1460 ced.pRecord = (PRECORDCORE) pci;
1461 pfi = (PFIELDINFO) WinSendMsg(hwnd,
1462 CM_QUERYDETAILFIELDINFO,
1463 MPVOID, MPFROMSHORT(CMA_FIRST));
1464 if (!pfi)
1465 WinSendMsg(hwnd, CM_OPENEDIT, MPFROMP(&ced), MPVOID);
1466 else {
1467 while (pfi && (INT) pfi != -1 &&
1468 pfi->offStruct != FIELDOFFSET(CNRITEM, pszFileName))
[231]1469 pfi = (PFIELDINFO) WinSendMsg(hwnd,
1470 CM_QUERYDETAILFIELDINFO,
[397]1471 MPFROMP(pfi), MPFROMSHORT(CMA_NEXT));
1472 if (pfi && (INT) pfi != -1) {
1473 ced.pFieldInfo = pfi;
[231]1474 {
[397]1475 CNRINFO cnri;
[2]1476
[397]1477 memset(&cnri, 0, sizeof(CNRINFO));
1478 cnri.cb = sizeof(CNRINFO);
1479 WinSendMsg(hwnd,
1480 CM_QUERYCNRINFO,
1481 MPFROMP(&cnri), MPFROMLONG(sizeof(CNRINFO)));
1482 if (cnri.flWindowAttr & CV_DETAIL)
1483 ced.id = CID_LEFTDVWND;
[231]1484 }
[397]1485 WinSendMsg(hwnd, CM_OPENEDIT, MPFROMP(&ced), MPVOID);
1486 }
[2]1487 }
[397]1488 }
[2]1489}
1490
1491#ifdef NEVER
[231]1492VOID QuickView(HWND hwnd, CHAR * filename)
1493{
[397]1494 if (filename && IsFile(filename) == 1) {
1495 if (TestBinary(filename) && *binview) {
[2]1496
[397]1497 CHAR *list[2];
[2]1498
[397]1499 list[0] = filename;
1500 list[1] = NULL;
1501 ExecOnList(hwnd, binview, WINDOWED | SEPARATE, NULL, list, NULL);
1502 return;
1503 }
1504 else if (*viewer) {
[2]1505
[397]1506 CHAR *list[2];
[2]1507
[397]1508 list[0] = filename;
1509 list[1] = NULL;
[787]1510 ExecOnList(hwnd, viewer,
1511 WINDOWED | SEPARATE | (fViewChild ? CHILD : 0),
1512 NULL, list, NULL);
[397]1513 return;
[2]1514 }
[397]1515 StartMLEEditor(HWND_DESKTOP, 5, filename, (HWND) 0);
1516 }
[2]1517}
1518
[231]1519VOID QuickEdit(HWND hwnd, CHAR * filename)
1520{
[397]1521 if (filename && IsFile(filename) == 1) {
1522 if (TestBinary(filename) && *bined) {
[2]1523
[397]1524 CHAR *list[2];
[2]1525
[397]1526 list[0] = filename;
1527 list[1] = NULL;
1528 ExecOnList(hwnd, bined, WINDOWED | SEPARATE, NULL, list, NULL);
1529 return;
1530 }
1531 else if (*editor) {
[2]1532
[397]1533 CHAR *list[2];
[2]1534
[397]1535 list[0] = filename;
1536 list[1] = NULL;
1537 ExecOnList(hwnd, editor, WINDOWED | SEPARATE, NULL, list, NULL);
1538 return;
[2]1539 }
[397]1540 StartMLEEditor(HWND_DESKTOP, 4, filename, (HWND) 0);
1541 }
[2]1542}
1543#endif
1544
[231]1545VOID PortholeInit(HWND hwndNew, MPARAM mp1, MPARAM mp2)
1546{
[397]1547 static HWND DefMenu = (HWND) 0;
1548 HWND hwndMenu = (HWND) mp2;
[2]1549
[397]1550 {
1551 ULONG style;
1552
1553 style = WinQueryWindowULong(hwndMenu, QWL_STYLE);
1554 if (!(style & MS_ACTIONBAR))
1555 return;
1556 }
1557
1558 switch (SHORT1FROMMP(mp1)) {
1559 case 0:
[231]1560 {
[397]1561 HWND hwndNow;
1562 MENUITEM mi;
1563 ULONG ulStyle;
[2]1564
[397]1565 memset(&mi, 0, sizeof(mi));
1566 mi.iPosition = MIT_END;
1567 mi.afStyle = MIS_TEXT;
1568 WinSendMsg(hwndMenu, MM_QUERYITEM,
1569 MPFROM2SHORT(IDM_FILESMENU, TRUE), MPFROMP(&mi));
1570 if (!DefMenu)
1571 DefMenu = WinLoadMenu(HWND_DESKTOP, FM3ModHandle, DEFMENU);
1572 hwndNow = mi.hwndSubMenu;
1573 mi.hwndSubMenu = hwndNew;
1574 if (!mi.hwndSubMenu)
1575 mi.hwndSubMenu = DefMenu;
1576 WinSetParent(hwndNow, WinQueryObjectWindow(HWND_DESKTOP), FALSE);
1577 WinSetOwner(hwndNow, WinQueryObjectWindow(HWND_DESKTOP));
1578 WinSetOwner(mi.hwndSubMenu, hwndMenu);
1579 WinSetParent(mi.hwndSubMenu, hwndMenu, FALSE);
1580 WinSetWindowUShort(mi.hwndSubMenu, QWS_ID, IDM_FILESMENU);
1581 mi.afStyle = MIS_SUBMENU;
1582 ulStyle = WinQueryWindowULong(mi.hwndSubMenu, QWL_STYLE);
1583 ulStyle &= -WS_SAVEBITS;
1584 ulStyle |= MS_POPUP | WS_CLIPSIBLINGS | WS_SAVEBITS;
1585 WinSetWindowULong(mi.hwndSubMenu, QWL_STYLE, ulStyle);
1586 WinSendMsg(hwndMenu, MM_SETITEM, MPFROM2SHORT(0, TRUE), MPFROMP(&mi));
[231]1587 }
[397]1588 break;
[2]1589
[397]1590 case 1:
[231]1591 {
[397]1592 HWND hwndNow;
1593 MENUITEM mi;
1594 ULONG ulStyle;
[2]1595
[397]1596 memset(&mi, 0, sizeof(mi));
1597 mi.iPosition = MIT_END;
1598 mi.afStyle = MIS_TEXT;
1599 WinSendMsg(hwndMenu, MM_QUERYITEM,
1600 MPFROM2SHORT(IDM_VIEWSMENU, TRUE), MPFROMP(&mi));
1601 if (!DefMenu)
1602 DefMenu = WinLoadMenu(HWND_DESKTOP, FM3ModHandle, DEFMENU);
1603 hwndNow = mi.hwndSubMenu;
1604 mi.hwndSubMenu = hwndNew;
1605 if (!mi.hwndSubMenu)
1606 mi.hwndSubMenu = DefMenu;
1607 WinSetParent(hwndNow, WinQueryObjectWindow(HWND_DESKTOP), FALSE);
1608 WinSetOwner(hwndNow, WinQueryObjectWindow(HWND_DESKTOP));
1609 WinSetOwner(mi.hwndSubMenu, hwndMenu);
1610 WinSetParent(mi.hwndSubMenu, hwndMenu, FALSE);
1611 WinSetWindowUShort(mi.hwndSubMenu, QWS_ID, IDM_VIEWSMENU);
1612 mi.afStyle = MIS_SUBMENU;
1613 ulStyle = WinQueryWindowULong(mi.hwndSubMenu, QWL_STYLE);
1614 ulStyle &= -WS_SAVEBITS;
1615 ulStyle |= MS_POPUP | WS_CLIPSIBLINGS | WS_SAVEBITS;
1616 WinSetWindowULong(mi.hwndSubMenu, QWL_STYLE, ulStyle);
1617 WinSendMsg(hwndMenu, MM_SETITEM, MPFROM2SHORT(0, TRUE), MPFROMP(&mi));
[231]1618 }
[397]1619 break;
1620 }
[2]1621}
1622
[231]1623HWND CheckMenu(HWND * hwndMenu, USHORT id)
1624{
[397]1625 /* load and adjust menus as required */
1626 if (!*hwndMenu || !WinIsWindow((HAB) 0, *hwndMenu)) {
1627 *hwndMenu = WinLoadMenu(HWND_DESKTOP, FM3ModHandle, id);
1628 if (hwndMenu == &DirMenu) {
1629 WinSetWindowUShort(DirMenu, QWS_ID, IDM_FILESMENU);
1630 SetConditionalCascade(DirMenu, IDM_COMMANDSMENU, IDM_DOITYOURSELF);
1631 SetConditionalCascade(DirMenu, IDM_COPYMENU, IDM_COPY);
1632 SetConditionalCascade(DirMenu, IDM_MOVEMENU, IDM_MOVE);
1633 SetConditionalCascade(DirMenu, IDM_SAVESUBMENU, IDM_SAVETOCLIP);
1634 SetConditionalCascade(DirMenu, IDM_VIEWSUBMENU, IDM_INFO);
1635 SetConditionalCascade(DirMenu, IDM_EDITSUBMENU, IDM_ATTRS);
1636 SetConditionalCascade(DirMenu, IDM_DELETESUBMENU,
[787]1637 fDefaultDeletePerm ? IDM_PERMDELETE : IDM_DELETE);
[397]1638 SetConditionalCascade(DirMenu, IDM_MISCSUBMENU, IDM_SIZES);
1639 SetConditionalCascade(DirMenu, IDM_OPENSUBMENU, IDM_OPENWINDOW);
1640 if (fWorkPlace) {
1641 WinSendMsg(DirMenu, MM_DELETEITEM,
1642 MPFROM2SHORT(IDM_OPENSUBMENU, TRUE), MPVOID);
1643 WinSendMsg(DirMenu, MM_DELETEITEM,
1644 MPFROM2SHORT(IDM_OBJECTSUBMENU, TRUE), MPVOID);
1645 }
[2]1646 }
[397]1647 else if (hwndMenu == &TreeMenu) {
1648 WinSetWindowUShort(TreeMenu, QWS_ID, IDM_FILESMENU);
1649 SetConditionalCascade(TreeMenu, IDM_COMMANDSMENU, IDM_DOITYOURSELF);
1650 SetConditionalCascade(TreeMenu, IDM_SAVESUBMENU, IDM_SAVETOCLIP);
1651 SetConditionalCascade(TreeMenu, IDM_EDITSUBMENU, IDM_ATTRS);
1652 SetConditionalCascade(TreeMenu, IDM_EXPANDSUBMENU, IDM_EXPAND);
1653 SetConditionalCascade(TreeMenu, IDM_MISCSUBMENU, IDM_SIZES);
1654 SetConditionalCascade(TreeMenu, IDM_OPENSUBMENU, IDM_OPENWINDOW);
1655 if (fWorkPlace) {
1656 WinSendMsg(TreeMenu, MM_DELETEITEM,
1657 MPFROM2SHORT(IDM_OPENSUBMENU, TRUE), MPVOID);
1658 WinSendMsg(TreeMenu, MM_DELETEITEM,
1659 MPFROM2SHORT(IDM_OBJECTSUBMENU, TRUE), MPVOID);
1660 }
1661 }
1662 else if (hwndMenu == &ArcMenu) {
1663 WinSetWindowUShort(ArcMenu, QWS_ID, IDM_FILESMENU);
1664 SetConditionalCascade(ArcMenu, IDM_EXTRACTSUBMENU, IDM_EXTRACT);
1665 SetConditionalCascade(ArcMenu, IDM_EDITSUBMENU, IDM_EDIT);
1666 SetConditionalCascade(ArcMenu, IDM_VIEWSUBMENU, IDM_VIEW);
1667 if (fWorkPlace)
1668 WinSendMsg(ArcMenu, MM_DELETEITEM,
1669 MPFROM2SHORT(IDM_FOLDERAFTEREXTRACT, TRUE), MPVOID);
1670 }
1671 else if (hwndMenu == &FileMenu) {
1672 WinSetWindowUShort(FileMenu, QWS_ID, IDM_FILESMENU);
1673 SetConditionalCascade(FileMenu, IDM_COMMANDSMENU, IDM_DOITYOURSELF);
1674 SetConditionalCascade(FileMenu, IDM_COPYMENU, IDM_COPY);
1675 SetConditionalCascade(FileMenu, IDM_MOVEMENU, IDM_MOVE);
1676 SetConditionalCascade(FileMenu, IDM_SAVESUBMENU, IDM_SAVETOCLIP);
1677 SetConditionalCascade(FileMenu, IDM_VIEWSUBMENU, IDM_VIEW);
1678 SetConditionalCascade(FileMenu, IDM_EDITSUBMENU, IDM_EDIT);
1679 SetConditionalCascade(FileMenu, IDM_COLLECTMENU, IDM_COLLECT);
1680 SetConditionalCascade(FileMenu, IDM_DELETESUBMENU,
[787]1681 fDefaultDeletePerm ? IDM_PERMDELETE : IDM_DELETE);
[397]1682 SetConditionalCascade(FileMenu, IDM_OPENSUBMENU, IDM_OPENDEFAULT);
1683 SetConditionalCascade(FileMenu, IDM_OBJECTSUBMENU, IDM_SHADOW);
1684 if (fWorkPlace) {
1685 WinSendMsg(FileMenu, MM_DELETEITEM,
1686 MPFROM2SHORT(IDM_OPENSUBMENU, TRUE), MPVOID);
1687 WinSendMsg(FileMenu, MM_DELETEITEM,
1688 MPFROM2SHORT(IDM_OBJECTSUBMENU, TRUE), MPVOID);
1689 }
1690 }
1691 else if (hwndMenu == &DirCnrMenu) {
1692 WinSetWindowUShort(DirCnrMenu, QWS_ID, IDM_VIEWSMENU);
1693 SetConditionalCascade(DirCnrMenu, IDM_MISCSUBMENU, IDM_SIZES);
1694 SetConditionalCascade(DirCnrMenu, IDM_OPENSUBMENU, IDM_OPENSETTINGSME);
1695 if (fWorkPlace)
1696 WinSendMsg(DirCnrMenu, MM_DELETEITEM,
1697 MPFROM2SHORT(IDM_OPENSUBMENU, TRUE), MPVOID);
1698 }
[489]1699 else if (hwndMenu == &TreeCnrMenu) {
[397]1700 WinSetWindowUShort(TreeCnrMenu, QWS_ID, IDM_VIEWSMENU);
[468]1701 SetConditionalCascade(TreeCnrMenu, IDM_PARTITIONSMENU, IDM_PARTITION);
1702 }
[397]1703 else if (hwndMenu == &ArcCnrMenu) {
1704 WinSetWindowUShort(ArcCnrMenu, QWS_ID, IDM_VIEWSMENU);
1705 SetConditionalCascade(ArcCnrMenu, IDM_EXTRACTSUBMENU, IDM_ARCEXTRACT);
1706 if (fWorkPlace)
1707 WinSendMsg(ArcCnrMenu, MM_DELETEITEM,
1708 MPFROM2SHORT(IDM_FOLDERAFTEREXTRACT, TRUE), MPVOID);
1709 }
1710 else if (hwndMenu == &CollectorCnrMenu) {
1711 WinSetWindowUShort(CollectorCnrMenu, QWS_ID, IDM_VIEWSMENU);
1712 SetConditionalCascade(CollectorCnrMenu, IDM_COLLECTMENU,
1713 IDM_COLLECTFROMCLIP);
1714 }
1715 else if (hwndMenu == &CollectorFileMenu) {
1716 WinSetWindowUShort(CollectorFileMenu, QWS_ID, IDM_FILESMENU);
1717 SetConditionalCascade(CollectorFileMenu, IDM_COMMANDSMENU,
1718 IDM_DOITYOURSELF);
1719 SetConditionalCascade(CollectorFileMenu, IDM_COPYMENU, IDM_COPY);
1720 SetConditionalCascade(CollectorFileMenu, IDM_MOVEMENU, IDM_MOVE);
1721 SetConditionalCascade(CollectorFileMenu, IDM_SAVESUBMENU,
1722 IDM_SAVETOCLIP);
1723 SetConditionalCascade(CollectorFileMenu, IDM_VIEWSUBMENU, IDM_VIEW);
1724 SetConditionalCascade(CollectorFileMenu, IDM_EDITSUBMENU, IDM_EDIT);
1725 SetConditionalCascade(CollectorFileMenu, IDM_DELETESUBMENU,
[787]1726 fDefaultDeletePerm ? IDM_PERMDELETE : IDM_DELETE);
[397]1727 SetConditionalCascade(CollectorFileMenu, IDM_OPENSUBMENU,
1728 IDM_OPENDEFAULT);
1729 SetConditionalCascade(CollectorFileMenu, IDM_OBJECTSUBMENU, IDM_SHADOW);
1730 if (fWorkPlace) {
1731 WinSendMsg(CollectorFileMenu, MM_DELETEITEM,
1732 MPFROM2SHORT(IDM_OPENSUBMENU, TRUE), MPVOID);
1733 WinSendMsg(CollectorFileMenu, MM_DELETEITEM,
1734 MPFROM2SHORT(IDM_OBJECTSUBMENU, TRUE), MPVOID);
1735 }
1736 }
1737 else if (hwndMenu == &CollectorDirMenu) {
1738 WinSetWindowUShort(CollectorDirMenu, QWS_ID, IDM_FILESMENU);
1739 SetConditionalCascade(CollectorDirMenu, IDM_COMMANDSMENU,
1740 IDM_DOITYOURSELF);
1741 SetConditionalCascade(CollectorDirMenu, IDM_COPYMENU, IDM_COPY);
1742 SetConditionalCascade(CollectorDirMenu, IDM_MOVEMENU, IDM_MOVE);
1743 SetConditionalCascade(CollectorDirMenu, IDM_SAVESUBMENU,
1744 IDM_SAVETOCLIP);
1745 SetConditionalCascade(CollectorDirMenu, IDM_VIEWSUBMENU, IDM_INFO);
1746 SetConditionalCascade(CollectorDirMenu, IDM_EDITSUBMENU, IDM_ATTRS);
1747 SetConditionalCascade(CollectorDirMenu, IDM_DELETESUBMENU,
[787]1748 fDefaultDeletePerm ? IDM_PERMDELETE : IDM_DELETE);
[397]1749 SetConditionalCascade(CollectorDirMenu, IDM_MISCSUBMENU, IDM_SIZES);
1750 SetConditionalCascade(CollectorDirMenu, IDM_OPENSUBMENU,
1751 IDM_OPENWINDOW);
1752 if (fWorkPlace) {
1753 WinSendMsg(CollectorDirMenu, MM_DELETEITEM,
1754 MPFROM2SHORT(IDM_OPENSUBMENU, TRUE), MPVOID);
1755 WinSendMsg(CollectorDirMenu, MM_DELETEITEM,
1756 MPFROM2SHORT(IDM_OBJECTSUBMENU, TRUE), MPVOID);
1757 }
1758 }
1759 else if (hwndMenu == &MainPopupMenu) {
1760 WinSetWindowUShort(MainPopupMenu, QWS_ID, IDM_MAINPOPUP);
1761 SetConditionalCascade(MainPopupMenu, IDM_TOOLSUBMENU, IDM_TOOLBAR);
1762 SetConditionalCascade(MainPopupMenu, IDM_AUTOVIEWSUBMENU, IDM_AUTOVIEW);
1763 }
1764 }
1765 return *hwndMenu;
[2]1766}
1767
[231]1768SHORT AddToListboxBottom(HWND hwnd, CHAR * str)
1769{
[397]1770 SHORT ln;
[2]1771
[397]1772 ln = (SHORT) WinSendMsg(hwnd, LM_INSERTITEM, MPFROM2SHORT(LIT_END, 0),
1773 MPFROMP(str));
1774 if (ln)
1775 WinSendMsg(hwnd, LM_SELECTITEM, MPFROM2SHORT(ln, 0), MPVOID);
1776 return ln;
[2]1777}
1778
[231]1779VOID SetSysMenu(HWND hwndSysMenu)
1780{
[397]1781 CHAR s[128], *p;
[2]1782
[397]1783 if (WinSendMsg(hwndSysMenu, MM_QUERYITEMTEXT,
1784 MPFROM2SHORT(SC_RESTORE, 128), MPFROMP(s))) {
1785 p = strchr(s, '\t');
1786 if (p) {
1787 p++;
1788 strcpy(p, "Ctrl+Alt+F5");
1789 WinSetMenuItemText(hwndSysMenu, SC_RESTORE, s);
[2]1790 }
[397]1791 }
1792 if (WinSendMsg(hwndSysMenu, MM_QUERYITEMTEXT,
1793 MPFROM2SHORT(SC_CLOSE, 128), MPFROMP(s))) {
1794 p = strchr(s, '\t');
1795 if (p) {
1796 p++;
1797 strcpy(p, "Ctrl+Alt+F4");
1798 WinSetMenuItemText(hwndSysMenu, SC_CLOSE, s);
[2]1799 }
[397]1800 }
1801 if (WinSendMsg(hwndSysMenu, MM_QUERYITEMTEXT,
1802 MPFROM2SHORT(SC_MOVE, 128), MPFROMP(s))) {
1803 p = strchr(s, '\t');
1804 if (p) {
1805 p++;
1806 strcpy(p, "Ctrl+Alt+F7");
1807 WinSetMenuItemText(hwndSysMenu, SC_MOVE, s);
[2]1808 }
[397]1809 }
1810 if (WinSendMsg(hwndSysMenu, MM_QUERYITEMTEXT,
1811 MPFROM2SHORT(SC_SIZE, 128), MPFROMP(s))) {
1812 p = strchr(s, '\t');
1813 if (p) {
1814 p++;
1815 strcpy(p, "Ctrl+Alt+F8");
1816 WinSetMenuItemText(hwndSysMenu, SC_SIZE, s);
[2]1817 }
[397]1818 }
1819 if (WinSendMsg(hwndSysMenu, MM_QUERYITEMTEXT,
1820 MPFROM2SHORT(SC_MINIMIZE, 128), MPFROMP(s))) {
1821 p = strchr(s, '\t');
1822 if (p) {
1823 p++;
1824 strcpy(p, "Ctrl+Alt+F9");
1825 WinSetMenuItemText(hwndSysMenu, SC_MINIMIZE, s);
[2]1826 }
[397]1827 }
1828 if (WinSendMsg(hwndSysMenu,
1829 MM_QUERYITEMTEXT,
1830 MPFROM2SHORT(SC_MAXIMIZE, 128), MPFROMP(s))) {
1831 p = strchr(s, '\t');
1832 if (p) {
1833 p++;
1834 strcpy(p, "Ctrl+Alt+F10");
1835 WinSetMenuItemText(hwndSysMenu, SC_MAXIMIZE, s);
[2]1836 }
[397]1837 }
1838 if (WinSendMsg(hwndSysMenu,
1839 MM_QUERYITEMTEXT, MPFROM2SHORT(SC_HIDE, 128), MPFROMP(s))) {
1840 p = strchr(s, '\t');
1841 if (p) {
1842 p++;
1843 strcpy(p, "Ctrl+Alt+F11");
1844 WinSetMenuItemText(hwndSysMenu, SC_HIDE, s);
[2]1845 }
[397]1846 }
[2]1847}
1848
[231]1849VOID LoadLibPath(CHAR * str, LONG len)
1850{
[397]1851 ULONG ver[2];
1852 CHAR configsys[] = "C:\\CONFIG.SYS";
1853 static CHAR var[8192], beg[16384], end[16384];
1854 BOOL warp;
1855 FILE *fp;
1856 PFN DQELIBPATH = NULL;
1857 HMODULE hmod;
[2]1858
[397]1859 if (str && len) {
1860 *str = 0;
1861 if (DosQuerySysInfo(QSV_BOOT_DRIVE,
1862 QSV_BOOT_DRIVE, (PVOID) ver, (ULONG) sizeof(ULONG)))
1863 ver[0] = 3L;
1864 *configsys = (CHAR) ver[0] + '@';
1865 if (!DosQuerySysInfo(QSV_VERSION_MAJOR,
1866 QSV_VERSION_MINOR,
1867 (PVOID) ver, (ULONG) sizeof(ver)) && ver[1] >= 30)
1868 warp = TRUE;
1869 *var = *beg = *end = 0;
1870 if (warp) {
1871 if (!DosLoadModule(var, sizeof(var), "DOSCALL1.DLL", &hmod)) {
1872 if (!DosQueryProcAddr(hmod,
1873 ORD_DOS32QUERYEXTLIBPATH,
1874 NULL, (PFN *) & DQELIBPATH)) {
1875 DQELIBPATH(beg, BEGIN_LIBPATH);
1876 DQELIBPATH(end, END_LIBPATH);
[231]1877 }
[397]1878 DosFreeModule(hmod);
1879 }
1880 *var = 0;
1881 }
1882 fp = xfopen(configsys, "r", pszSrcFile, __LINE__);
1883 if (fp) {
1884 while (!feof(fp)) {
[551]1885 if (!xfgets_bstripcr(var, sizeof(var), fp, pszSrcFile, __LINE__))
[397]1886 break;
1887 if (!strnicmp(var, "LIBPATH=", 8)) {
1888 memmove(var, var + 8, strlen(var + 8) + 1);
1889 lstrip(var);
1890 break;
[231]1891 }
[397]1892 }
1893 fclose(fp);
[2]1894 }
[397]1895 strncpy(str, beg, len);
1896 strncat(str, var, len - strlen(str));
1897 strncat(str, end, len - strlen(str));
1898 str[len - 1] = 0;
1899 }
[2]1900}
1901
[231]1902void SetViewMenu(HWND hwndMenu, ULONG flWindowAttr)
1903{
[397]1904 WinCheckMenuItem(hwndMenu, IDM_MINIICONS, ((flWindowAttr & CV_MINI)));
1905 WinCheckMenuItem(hwndMenu, IDM_TEXT, ((flWindowAttr & CV_TEXT)));
1906 WinCheckMenuItem(hwndMenu, IDM_ICON, ((flWindowAttr & CV_ICON) &&
1907 !(flWindowAttr & CV_TREE)));
1908 WinCheckMenuItem(hwndMenu, IDM_TREEVIEW, ((flWindowAttr & CV_TREE)));
1909 WinCheckMenuItem(hwndMenu, IDM_DETAILS, ((flWindowAttr & CV_DETAIL)));
1910 WinCheckMenuItem(hwndMenu, IDM_NAME, ((flWindowAttr & CV_NAME)));
[2]1911}
1912
[231]1913void SaySort(HWND hwnd, INT sortflags, BOOL archive)
1914{
[397]1915 char *s = NULL;
[2]1916
[397]1917 s = xmalloc(CCHMAXPATH, pszSrcFile, __LINE__);
1918 if (s) {
1919 sprintf(s, "S:%s%s",
[787]1920 sortflags & SORT_REVERSE ? "^" : NullStr,
1921 (sortflags & SORT_FIRSTEXTENSION) ?
1922 GetPString(IDS_FIRSTX) : (sortflags & SORT_LASTEXTENSION) ?
1923 GetPString(IDS_LASTX) : (sortflags & SORT_SIZE) ?
1924 "Size" : (sortflags & SORT_EASIZE) ?
1925 (archive == 0) ?
1926 GetPString(IDS_EASIZE) : GetPString(IDS_CSIZE) :
1927 (sortflags & SORT_LWDATE) ?
1928 (archive == 0) ?
1929 GetPString(IDS_LWDATE) : GetPString(IDS_DATE) :
1930 (sortflags & SORT_LADATE) ?
1931 GetPString(IDS_LADATE) : (sortflags & SORT_CRDATE) ?
1932 GetPString(IDS_CRDATE) :
1933 (sortflags & SORT_PATHNAME) ?
1934 GetPString(IDS_PATH) : (sortflags & SORT_NOSORT) ?
1935 GetPString(IDS_NONE) : (sortflags & SORT_SUBJECT) ?
1936 GetPString(IDS_SUBJ) : GetPString(IDS_NAME));
[397]1937 WinSetWindowText(hwnd, s);
1938 free(s);
1939 }
[2]1940}
1941
[231]1942void SayView(HWND hwnd, ULONG flWindowAttr)
1943{
[397]1944 char *s = NULL;
[2]1945
[397]1946 s = xmalloc(CCHMAXPATH, pszSrcFile, __LINE__);
1947 if (s) {
1948 sprintf(s, "V:%s%s",
1949 (flWindowAttr & CV_TREE) ? GetPString(IDS_TREE) :
1950 (flWindowAttr & CV_NAME) ? GetPString(IDS_NAME) :
1951 (flWindowAttr & CV_DETAIL) ? GetPString(IDS_DETAIL) :
1952 (flWindowAttr & CV_TEXT) ? GetPString(IDS_TEXT) :
1953 GetPString(IDS_ICON),
1954 ((flWindowAttr & CV_MINI) &&
1955 !(flWindowAttr & CV_TEXT)) ? GetPString(IDS_MINI) : NullStr);
1956 WinSetWindowText(hwnd, s);
1957 free(s);
1958 }
[2]1959}
1960
[231]1961void SayFilter(HWND hwnd, MASK * mask, BOOL archive)
1962{
[397]1963 char *s = NULL;
[2]1964
[397]1965 s = xmalloc(CCHMAXPATH * 2, pszSrcFile, __LINE__);
1966 if (s) {
1967 sprintf(s, "F:%s%s",
1968 mask->szMask,
1969 (!archive && (mask->attrFile != ALLATTRS ||
1970 mask->antiattr != 0)) ? " " : NullStr,
1971 (!archive && (mask->attrFile != ALLATTRS ||
1972 mask->antiattr !=
1973 0)) ? GetPString(IDS_ATTRTEXT) : NullStr);
1974 if (!s[2])
1975 sprintf(s, "F:%s", GetPString(IDS_ALLTEXT));
1976 WinSetWindowText(hwnd, s);
1977 free(s);
1978 }
[2]1979}
1980
[231]1981char *GetCmdSpec(BOOL dos)
1982{
[397]1983 char *cmspec;
[2]1984
[397]1985 if (!dos) {
1986 cmspec = getenv("OS2_SHELL");
1987 if (!cmspec)
1988 cmspec = getenv("COMSPEC");
1989 if (!cmspec)
1990 cmspec = "CMD.EXE";
1991 }
1992 else {
1993 cmspec = getenv("DOS_SHELL");
1994 if (!cmspec)
1995 cmspec = "COMMAND.COM";
1996 }
1997 return cmspec;
[2]1998}
1999
[231]2000void Broadcast(HAB hab, HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
2001{
[397]2002 if (hwndMain)
2003 WinBroadcastMsg(hwndMain, msg, mp1, mp2, BMSG_SEND | BMSG_FRAMEONLY);
2004 if (hwnd &&
2005 hwnd != HWND_DESKTOP &&
2006 hwnd != hwndMain &&
2007 hwnd != WinQueryDesktopWindow(hab, NULLHANDLE) &&
2008 WinIsWindow(hab, hwnd) && (!hwndMain || !WinIsChild(hwnd, hwndMain)))
2009 WinSendMsg(hwnd, msg, mp1, mp2);
[2]2010}
2011
[231]2012void SetupWinList(HWND hwndMenu, HWND hwndTop, HWND hwndFrame)
2013{
[397]2014 /*
2015 * add switchlist entries to end of pulldown menu
2016 */
[2]2017
[397]2018 SHORT sItemCount, x = 0, y = 0;
2019 MENUITEM mi;
[2]2020
[397]2021 sItemCount = (SHORT) WinSendMsg(hwndMenu,
2022 MM_QUERYITEMCOUNT, MPVOID, MPVOID);
[2]2023
[397]2024 /* clean out old additions */
2025 while ((SHORT) WinSendMsg(hwndMenu,
2026 MM_DELETEITEM,
2027 MPFROM2SHORT(IDM_SWITCHSTART + x++,
2028 TRUE), MPVOID) < sItemCount)
2029 sItemCount--;
2030 x = 0;
2031 while ((SHORT) WinSendMsg(hwndMenu,
2032 MM_DELETEITEM,
2033 MPFROM2SHORT(IDM_WINDOWSTART + x++,
2034 TRUE), MPVOID) < sItemCount)
2035 sItemCount--;
[2]2036
[397]2037 x = 0;
2038 if (hwndTop) {
[2]2039
[397]2040 char wtext[CCHMAXPATH + 8];
2041 HENUM henum;
2042 HWND hwndChild;
[2]2043
[397]2044 /* add children of the main FM/2 client */
2045 henum = WinBeginEnumWindows(hwndTop);
2046 memset(&mi, 0, sizeof(mi));
2047 while ((hwndChild = WinGetNextWindow(henum)) != NULLHANDLE) {
2048 if (WinQueryWindowUShort(hwndChild, QWS_ID) && hwndChild != hwndFrame) {
2049 *wtext = 0;
2050 WinQueryWindowText(hwndChild, CCHMAXPATH + 8, wtext);
2051 if (*wtext) {
2052 wtext[CCHMAXPATH + 7] = 0;
2053 mi.afStyle = MIS_TEXT;
2054 if (!((x + sItemCount) % 28))
2055 mi.afStyle |= MIS_BREAK;
2056 mi.id = IDM_WINDOWSTART + x;
2057 mi.iPosition = MIT_END;
2058 if ((SHORT) WinSendMsg(hwndMenu,
2059 MM_INSERTITEM,
2060 MPFROMP(&mi), MPFROMP(wtext)) >= 0)
2061 x++;
[231]2062 }
[397]2063 }
[2]2064 }
[397]2065 WinEndEnumWindows(henum);
2066 }
[2]2067
[397]2068 /* add external FM/2 windows */
2069 {
2070 PSWBLOCK pswb;
2071 ULONG ulSize, ulcEntries;
2072 HWND hwndTopFrame;
2073 register INT i;
[2]2074
[787]2075 hwndTopFrame = hwndTop ? WinQueryWindow(hwndTop, QW_PARENT) : (HWND)0;
[397]2076 /* Get the switch list information */
2077 x = 0;
2078 ulcEntries = WinQuerySwitchList(0, NULL, 0);
2079 ulSize = sizeof(SWBLOCK) + sizeof(HSWITCH) + (ulcEntries + 4L) *
2080 (LONG) sizeof(SWENTRY);
2081 /* Allocate memory for list */
2082 pswb = xmalloc(ulSize, pszSrcFile, __LINE__);
2083 if (pswb) {
2084 /* Put the info in the list */
2085 ulcEntries = WinQuerySwitchList(0, pswb, ulSize - sizeof(SWENTRY));
2086 /* do the dirty deed */
2087 memset(&mi, 0, sizeof(mi));
2088 for (i = 0; i < pswb->cswentry; i++) {
2089 if (pswb->aswentry[i].swctl.uchVisibility == SWL_VISIBLE &&
2090 pswb->aswentry[i].swctl.fbJump == SWL_JUMPABLE &&
2091 (pswb->aswentry[i].swctl.idProcess != mypid ||
2092 !hwndFrame ||
2093 pswb->aswentry[i].swctl.hwnd != hwndFrame) &&
2094 (pswb->aswentry[i].swctl.idProcess != mypid ||
2095 !hwndTopFrame ||
2096 pswb->aswentry[i].swctl.hwnd != hwndTopFrame ||
2097 !WinIsChild(hwndFrame, hwndTop))) {
2098 if (!strnicmp(pswb->aswentry[i].swctl.szSwtitle, "AV/2", 4)
2099 || !stricmp(pswb->aswentry[i].swctl.szSwtitle, "File Manager/2")
2100 || !stricmp(pswb->aswentry[i].swctl.szSwtitle, "Collector")
2101 || !strnicmp(pswb->aswentry[i].swctl.szSwtitle, "VTree", 5)
2102 || !strnicmp(pswb->aswentry[i].swctl.szSwtitle, "VDir", 4)
2103 || !strnicmp(pswb->aswentry[i].swctl.szSwtitle, FM2Str, 4)) {
2104 mi.afStyle = MIS_TEXT;
2105 if (x && !(x % 28))
2106 mi.afStyle |= MIS_BREAK;
2107 mi.id = IDM_SWITCHSTART + y;
2108 mi.iPosition = MIT_END;
2109 switches[y] = pswb->aswentry[i].hswitch;
2110 if ((SHORT) WinSendMsg(hwndMenu,
2111 MM_INSERTITEM,
2112 MPFROMP(&mi),
2113 MPFROMP(pswb->aswentry[i].
2114 swctl.szSwtitle)) >= 0) {
2115 y++;
2116 x++;
[231]2117 }
[397]2118 }
[231]2119 }
[397]2120 }
2121 numswitches = y;
2122 free(pswb);
2123 DosPostEventSem(CompactSem);
[2]2124 }
[397]2125 }
[2]2126}
2127
[231]2128BOOL SwitchCommand(HWND hwndMenu, USHORT cmd)
2129{
[397]2130 BOOL ret = FALSE;
[2]2131
[397]2132 if (hwndMain && hwndMenu && cmd >= IDM_WINDOWSTART && cmd < IDM_SWITCHSTART) {
2133 /*
2134 * select a child window (of client)
2135 */
[2]2136
[397]2137 MENUITEM mi;
2138 HWND hwndSubMenu = (HWND) 0, hwndChild;
2139 CHAR s[CCHMAXPATH + 8];
[2]2140
[397]2141 if (WinQueryWindowUShort(hwndMenu, QWS_ID) != IDM_WINDOWSMENU) {
2142 memset(&mi, 0, sizeof(mi));
2143 mi.iPosition = MIT_END;
2144 mi.afStyle = MIS_TEXT;
2145 if (WinSendMsg(hwndMenu,
2146 MM_QUERYITEM,
2147 MPFROM2SHORT(IDM_WINDOWSMENU, TRUE), MPFROMP(&mi)))
2148 hwndSubMenu = mi.hwndSubMenu;
2149 }
2150 else
2151 hwndSubMenu = hwndMenu;
2152 if (hwndSubMenu) {
2153 *s = 0;
2154 if (WinSendMsg(hwndSubMenu,
2155 MM_QUERYITEMTEXT,
2156 MPFROM2SHORT(cmd, CCHMAXPATH + 8), MPFROMP(s)) && *s) {
[2]2157
[397]2158 HENUM henum;
2159 CHAR checkText[CCHMAXPATH + 8];
2160 SWP swp;
[2]2161
[397]2162 s[CCHMAXPATH + 7] = 0;
2163 henum = WinBeginEnumWindows(hwndMain);
2164 while ((hwndChild = WinGetNextWindow(henum)) != NULLHANDLE) {
2165 if (WinQueryWindowUShort(hwndChild, QWS_ID)) {
2166 *checkText = 0;
2167 WinQueryWindowText(hwndChild, CCHMAXPATH + 8, checkText);
2168 checkText[CCHMAXPATH + 7] = 0;
2169 if (!stricmp(checkText, s)) {
2170 if (WinQueryWindowPos(hwndChild, &swp)) {
2171 if (swp.fl & (SWP_MINIMIZE | SWP_HIDE))
2172 WinSetWindowPos(hwndChild,
2173 HWND_TOP,
2174 0, 0, 0, 0, SWP_RESTORE | SWP_ZORDER);
2175 }
2176 WinSetActiveWindow(HWND_DESKTOP, hwndChild);
2177 ret = TRUE;
2178 break;
[231]2179 }
[397]2180 }
[231]2181 }
[397]2182 WinEndEnumWindows(henum);
2183 }
[2]2184 }
[397]2185 }
2186 else if (cmd >= IDM_SWITCHSTART && cmd < IDM_SWITCHSTART + 499) {
2187 if (cmd - IDM_SWITCHSTART < numswitches) {
2188 WinSwitchToProgram(switches[cmd - IDM_SWITCHSTART]);
2189 ret = TRUE;
[2]2190 }
[397]2191 }
[2]2192
[397]2193 return ret;
[2]2194}
[787]2195
2196#pragma alloc_text(MAINWND5,SetSysMenu)
2197#pragma alloc_text(MISC1,BoxWindow,PaintRecessedWindow,PostMsg,PaintSTextWindow,IsFm2Window)
2198#pragma alloc_text(MISC1,FixSwitchList,FindDirCnr,CurrentRecord,SetShiftState,AddToListboxBottom)
2199#pragma alloc_text(CNR_MISC1,AdjustCnrColVis,AdjustCnrColsForFSType)
2200#pragma alloc_text(CNR_MISC1,AdjustCnrColsForPref,SetCnrCols)
2201#pragma alloc_text(CNR_MISC2,CnrDirectEdit,OpenEdit)
2202#pragma alloc_text(MISC2,SetMenuCheck,disable_menuitem,SetSortChecks)
2203#pragma alloc_text(MISC2,SetDetailsSwitches,SetViewMenu)
2204#pragma alloc_text(MISC3,SetupCommandMenu,AdjustDetailsSwitches)
2205#pragma alloc_text(MISC3,ViewHelp,GetCmdSpec)
2206#pragma alloc_text(MISC3,ExecFile,SetConditionalCascade,LoadDetailsSwitches)
2207#pragma alloc_text(MISC4,PortholeInit,CheckMenu,Broadcast,SetupWinList,SwitchCommand)
2208#pragma alloc_text(MISC6,DrawTargetEmphasis,EmphasizeButton)
2209#pragma alloc_text(MISC_LIBPATH,LoadLibPath)
2210#pragma alloc_text(MISC_SAY,SayView,SaySort,SayFilter)
2211
Note: See TracBrowser for help on using the repository browser.