source: trunk/dll/misc.c@ 451

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

Comments

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