source: trunk/dll/misc.c@ 1039

Last change on this file since 1039 was 1039, checked in by Gregg Young, 17 years ago

Removed unnecessary xfrees and included fortify.h where needed; moved several misplaced (x)frees;

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