source: trunk/dll/misc.c@ 468

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

disable_menuitem: rework args to match name - sheesh

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