source: trunk/dll/misc.c@ 935

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

Fix direct edit of subjects and longnames.

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