source: trunk/dll/misc.c@ 960

Last change on this file since 960 was 960, checked in by Gregg Young, 18 years ago

One more buffer check.

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