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