source: trunk/dll/misc.c@ 544

Last change on this file since 544 was 526, checked in by root, 19 years ago

Add NDFS32 support

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