|
|
1.1 ! root 1: /******************************Module*Header*******************************\ ! 2: * Module Name: drvproc.c ! 3: * ! 4: * Filer : SDK sample ! 5: * + Simple File Management program with GUI front end. ! 6: * Demonstrates Win32 File I/O API and various User algorithms. ! 7: * ! 8: * DRVPROC.C : Contains procedures relating to child window management. ! 9: * In this sample, the Drive children handle the directory ! 10: * and file enumeration, as well as the file I/O operations. ! 11: * ! 12: * Created: 5/05/92 ! 13: * Author: Colin Stuart[] ! 14: * ! 15: * Copyright (c) 1990 Microsoft Corporation ! 16: * ! 17: * Dependencies: ! 18: * ! 19: * (#defines) ! 20: * (#includes) ! 21: * Drvproc.h ! 22: * ! 23: \**************************************************************************/ ! 24: ! 25: #include <windows.h> ! 26: #include <string.h> ! 27: #include "globals.h" ! 28: #include "filer.h" ! 29: #include "walk.h" ! 30: #include "drvproc.h" ! 31: ! 32: extern HANDLE ghModule; ! 33: extern HANDLE ghHeap; ! 34: extern HANDLE ghDrvThread; ! 35: extern HFONT ghFont; ! 36: ! 37: extern HWND ghwndCommand; ! 38: extern HWND ghwndDrives; ! 39: extern HWND ghActiveChild; ! 40: extern HWND ghwndDrv1; ! 41: extern HWND ghwndDrv2; ! 42: extern HWND ghFocusLB; ! 43: ! 44: extern LPDINFO glpDrives; ! 45: ! 46: extern CRITICAL_SECTION gHeapCS; // Global heap critical section var. ! 47: extern CRITICAL_SECTION gDrvCS; // Drive list critical section var. ! 48: ! 49: extern char gszEditor[DIRECTORY_STRING_SIZE]; ! 50: extern char gszCommandLine[DIRECTORY_STRING_SIZE * 2]; ! 51: ! 52: extern char gszExtensions[NUM_EXTENSION_STRINGS][EXTENSION_LENGTH]; ! 53: ! 54: /***************************************************************************\ ! 55: * DrvWndProc() ! 56: * ! 57: * History: ! 58: * 05-1-92 Created ! 59: \***************************************************************************/ ! 60: ! 61: LRESULT DrvWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) ! 62: { ! 63: ! 64: static DWORD dwDirStyle = WS_BORDER | WS_CHILD | WS_VISIBLE | ! 65: LBS_NOINTEGRALHEIGHT | LBS_NOTIFY | ! 66: LBS_HASSTRINGS | LBS_WANTKEYBOARDINPUT | ! 67: LBS_DISABLENOSCROLL | WS_HSCROLL | ! 68: WS_VSCROLL |LBS_USETABSTOPS; ! 69: ! 70: static DWORD dwFileStyle = WS_BORDER | WS_CHILD | WS_VISIBLE | ! 71: LBS_NOINTEGRALHEIGHT | LBS_NOTIFY | ! 72: LBS_HASSTRINGS | LBS_WANTKEYBOARDINPUT | ! 73: LBS_DISABLENOSCROLL | WS_HSCROLL | ! 74: LBS_EXTENDEDSEL | LBS_MULTIPLESEL | ! 75: LBS_MULTICOLUMN | LBS_SORT; ! 76: ! 77: switch (message) { ! 78: ! 79: // ! 80: // Creates the text and listbox windows for this Drv child and ! 81: // saves its handle in the per Drv child DRVCHILDINFO data structure. ! 82: // ! 83: case WM_CREATE: { ! 84: LPCINFO lpCInfo; ! 85: HWND hTextWnd, ! 86: hwndLL, ! 87: hwndLR; ! 88: ! 89: DWORD dwLoop; ! 90: LPDINFO lpWalk; ! 91: ! 92: LONG lTabs = LISTBOX_TAB_SIZE; ! 93: ! 94: // Create text window ! 95: hTextWnd = CreateWindow("TextClass", NULL, ! 96: SS_LEFT | WS_CHILD | WS_VISIBLE | WS_BORDER, ! 97: 0, 0, 0, 0, ! 98: hwnd, ! 99: (HMENU) TEXT_WINDOW_ID, ! 100: ghModule, ! 101: NULL); ! 102: ! 103: // Create List boxes ! 104: hwndLL = CreateWindow("LISTBOX", NULL, ! 105: dwDirStyle, ! 106: 0, 0, 0, 0, ! 107: hwnd, ! 108: (HMENU) LISTL_ID, ! 109: ghModule, ! 110: NULL); ! 111: ! 112: hwndLR = CreateWindow("LISTBOX", NULL, ! 113: dwFileStyle, ! 114: 0, 0, 0, 0, ! 115: hwnd, ! 116: (HMENU) LISTR_ID, ! 117: ghModule, ! 118: NULL); ! 119: ! 120: // ! 121: // Initialize DRVCHILDINFO structure ! 122: // ! 123: lpCInfo = (LPCINFO) ((LPCREATESTRUCT) lParam)->lpCreateParams; ! 124: ! 125: lpCInfo->hTextWnd = hTextWnd; ! 126: lpCInfo->hwndLL = hwndLL; ! 127: lpCInfo->hwndLR = hwndLR; ! 128: ! 129: // ! 130: // Create Critical Section associated with each list box ! 131: // ! 132: InitializeCriticalSection(&(lpCInfo->CritSecL)); ! 133: InitializeCriticalSection(&(lpCInfo->CritSecR)); ! 134: ! 135: // ! 136: // Associate window with the current directory LPDINFO structure ! 137: // from the Drives linked list ! 138: // ! 139: dwLoop = GetCurrentDirectory( DIRECTORY_STRING_SIZE, ! 140: lpCInfo->CaptionBarText ); ! 141: CharUpper(lpCInfo->CaptionBarText); ! 142: ! 143: WaitForSingleObject(ghDrvThread, 0xFFFFFFFF); ! 144: EnterCriticalSection(&gDrvCS); ! 145: ! 146: lpWalk = glpDrives; ! 147: ! 148: if( dwLoop && dwLoop <= DIRECTORY_STRING_SIZE ){ ! 149: while( lpWalk && lpWalk->DriveName[0] != ! 150: (lpCInfo->CaptionBarText)[0] ) ! 151: lpWalk = lpWalk->next; ! 152: if( !lpWalk ){ ! 153: ErrorMsg("Drive Child Create: Drive list error."); ! 154: LeaveCriticalSection(&gDrvCS); ! 155: return(-1); ! 156: } ! 157: } ! 158: else{ ! 159: ErrorMsg("Drive Child Create: GetCurrentDir error."); ! 160: LeaveCriticalSection(&gDrvCS); ! 161: return(-1); ! 162: } ! 163: ! 164: LeaveCriticalSection(&gDrvCS); ! 165: ! 166: lpCInfo->lpDriveInfo = lpWalk; ! 167: ! 168: // ! 169: // Save the handle to DRVCHILDINFO in our window structure ! 170: // ! 171: SetWindowLong(hwnd, GWL_USERDATA, (LONG) lpCInfo); ! 172: ! 173: // ! 174: // Initialize child windows ! 175: // ! 176: if( !SendMessage(hwndLL, LB_SETTABSTOPS, (WPARAM)1, ! 177: (LPARAM)&lTabs) ) ! 178: ErrorMsg("Drv window Create: Error setting tab stops"); ! 179: ! 180: ! 181: // ! 182: // Set default font. ! 183: // ! 184: SendMessage(hwndLL, WM_SETFONT, (WPARAM)ghFont, (LPARAM)FALSE); ! 185: SendMessage(hwndLR, WM_SETFONT, (WPARAM)ghFont, (LPARAM)FALSE); ! 186: ! 187: SendMessage(hwnd, WM_COMMAND, (WPARAM)MM_REFRESH, (LPARAM)NULL); ! 188: ! 189: return(1); ! 190: } ! 191: ! 192: case WM_COMMAND: { ! 193: static LPCINFO lpCInfo; ! 194: static SELECTINFO Select; ! 195: ! 196: // ! 197: // Retrieving this child window's DRVCHILDINFO data for displaying ! 198: // messages in the text window ! 199: // ! 200: lpCInfo = (LPCINFO) GetWindowLong(hwnd, GWL_USERDATA); ! 201: ! 202: switch (LOWORD(wParam)) { ! 203: ! 204: case MM_TAB:{ ! 205: HWND hFocus; ! 206: ! 207: hFocus = GetFocus(); ! 208: ! 209: if( hFocus == lpCInfo->hwndLL ) ! 210: SetFocus(lpCInfo->hwndLR); ! 211: else ! 212: if( hFocus == lpCInfo->hwndLR ) ! 213: SetFocus(ghwndCommand); ! 214: else ! 215: if( hFocus == ghwndCommand) ! 216: SetFocus(lpCInfo->hwndLL); ! 217: else ! 218: SetFocus(lpCInfo->hwndLL); ! 219: ! 220: return(1); ! 221: } ! 222: ! 223: // ! 224: // Clears the selection in the active window. ! 225: // Sent when user hits escape key. ! 226: // ! 227: case MM_ESCAPE:{ ! 228: // ! 229: // the type of the active window can be determined by querying ! 230: // on unique window style attributes. Only the file listbox ! 231: // has LBS_SORT, only the dir listbox has LBS_USETABSTOPS. ! 232: // ! 233: if( IsFileLB(ghFocusLB) ) ! 234: SendMessage(ghFocusLB, LB_SETSEL, (WPARAM)0, (LPARAM)-1); ! 235: else ! 236: SendMessage(ghFocusLB, LB_SETCURSEL, (WPARAM)-1, (LPARAM)NULL); ! 237: ! 238: return(1); ! 239: } ! 240: ! 241: case MM_OPEN:{ ! 242: OpenListBoxItem(lpCInfo, ghFocusLB); ! 243: ! 244: return(1); ! 245: } ! 246: ! 247: case MM_COPY:{ ! 248: ! 249: Select.hwnd = hwnd; ! 250: Select.dwAction = MM_COPY; ! 251: Select.szAction = "COPYING:"; ! 252: Select.szToFrom = "TO:"; ! 253: ! 254: ExecuteFileAction(&Select); ! 255: ! 256: return(1); ! 257: } ! 258: ! 259: case MM_DELETE:{ ! 260: ! 261: Select.hwnd = hwnd; ! 262: Select.dwAction = MM_DELETE; ! 263: Select.szAction = "DELETING:"; ! 264: Select.szToFrom = "FROM:"; ! 265: ! 266: ExecuteFileAction(&Select); ! 267: ! 268: return(1); ! 269: } ! 270: ! 271: case MM_MOVE:{ ! 272: ! 273: Select.hwnd = hwnd; ! 274: Select.dwAction = MM_MOVE; ! 275: Select.szAction = "MOVING:"; ! 276: Select.szToFrom = "TO:"; ! 277: ! 278: ExecuteFileAction(&Select); ! 279: ! 280: return(1); ! 281: } ! 282: ! 283: case MM_RENAME:{ ! 284: ! 285: if( DialogBoxParam(ghModule, "RenameDlg", hwnd, ! 286: (DLGPROC)RenameProc, (LPARAM)lpCInfo) == -1 ){ ! 287: ErrorMsg("DriveProc: Rename Dialog Creation Error!"); ! 288: return(0); ! 289: } ! 290: ! 291: return(1); ! 292: } ! 293: ! 294: case MM_MKDIR:{ ! 295: ! 296: if( DialogBoxParam(ghModule, "MkDirDlg", hwnd, ! 297: (DLGPROC)MkDirProc, (LPARAM)lpCInfo) == -1 ){ ! 298: ErrorMsg("DriveProc: MkDir Dialog Creation Error!"); ! 299: return(0); ! 300: } ! 301: ! 302: return(1); ! 303: } ! 304: ! 305: // ! 306: // refreshes contents of directory and file ListBoxes. ! 307: // ! 308: case MM_REFRESH:{ ! 309: ! 310: if( IsFileLB(lpCInfo->hwndLL) ){ ! 311: if( !PostMessage(hwnd, WM_COMMAND, MM_FILLFILE, ! 312: (LPARAM)lpCInfo->hwndLL) ) ! 313: ErrorMsg("Refresh Drv window: Left Fillfile failed"); ! 314: if( !PostMessage(hwnd, WM_COMMAND, MM_FILLDIR, ! 315: (LPARAM)lpCInfo->hwndLR) ) ! 316: ErrorMsg("Refresh Drv window: Right Filldir failed"); ! 317: } ! 318: else{ ! 319: if( !PostMessage(hwnd, WM_COMMAND, MM_FILLDIR, ! 320: (LPARAM)lpCInfo->hwndLL) ) ! 321: ErrorMsg("Refresh Drv window: Left Filldir failed"); ! 322: if( !PostMessage(hwnd, WM_COMMAND, MM_FILLFILE, ! 323: (LPARAM)lpCInfo->hwndLR) ) ! 324: ErrorMsg("Refresh Drv window: Right Fillfile failed"); ! 325: } ! 326: ! 327: return(1); ! 328: } ! 329: ! 330: // ! 331: // Fill listbox in lParam with directory from Drv child's drive. ! 332: // Sent by MM_REFRESH. ! 333: // ! 334: case MM_FILLDIR:{ ! 335: ! 336: DWORD dwThreadID; ! 337: ! 338: // ! 339: // If there is currently a directory enumeration thread ! 340: // running for this Drv Child, and no requests to kill it, ! 341: // leave. ! 342: // ! 343: if( WaitForSingleObject( lpCInfo->hDirThread, 0) == WAIT_TIMEOUT ! 344: && lpCInfo->fAlive ) ! 345: return(0); ! 346: ! 347: lpCInfo->hDirThread = CreateThread( NULL, 0, ! 348: (LPTHREAD_START_ROUTINE)FillDirectoryLB, ! 349: (LPVOID)lParam, 0, &dwThreadID); ! 350: ! 351: if( !(lpCInfo->hDirThread) ){ ! 352: ErrorMsg("FILLDIR: CreateThread failed"); ! 353: return(0); ! 354: } ! 355: ! 356: return(1); ! 357: } ! 358: ! 359: // ! 360: // Fill listbox in lParam with files from current directory. ! 361: // Sent by MM_REFRESH & LBN_DBLCLK in DrvWndProc, as well as ! 362: // DoFileIO. and HandleIOError(). ! 363: // ! 364: case MM_FILLFILE:{ ! 365: char szFiles[DIRECTORY_STRING_SIZE + 20]; ! 366: char* lpHold; ! 367: LPCRITICAL_SECTION lpCS; ! 368: ! 369: if( (HWND)lParam == lpCInfo->hwndLL) ! 370: lpCS = &(lpCInfo->CritSecL); ! 371: else ! 372: if( (HWND)lParam == lpCInfo->hwndLR) ! 373: lpCS = &(lpCInfo->CritSecR); ! 374: else{ ! 375: ErrorMsg("MM_FILLFILE: Invalid ListBox handle."); ! 376: return(0); ! 377: } ! 378: ! 379: EnterCriticalSection(lpCS); ! 380: ! 381: // ! 382: // Not checking for errors here, as LB_RESETCONTENT always ! 383: // returns true, and LB_DIR returns an error if the directory ! 384: // is empty. ! 385: // ! 386: SendMessage((HWND)lParam, LB_RESETCONTENT, (WPARAM)NULL, (LPARAM)NULL); ! 387: ! 388: lstrcpy( szFiles, lpCInfo->CaptionBarText ); ! 389: lpHold = strchr(szFiles, '\0'); ! 390: lpHold--; ! 391: if( *lpHold != '\\') ! 392: lstrcat( szFiles, "\\"); ! 393: lstrcat( szFiles, "*.*"); ! 394: ! 395: if( SendMessage( (HWND)lParam, LB_DIR, (WPARAM)0x10, ! 396: (LPARAM)szFiles ) == LB_ERR ){ ! 397: ErrorMsg("MM_FILLFILE: Fill ListBox error."); ! 398: return(0); ! 399: } ! 400: ! 401: SetWindowText(lpCInfo->hTextWnd, lpCInfo->CaptionBarText); ! 402: ! 403: LeaveCriticalSection(lpCS); ! 404: ! 405: return(1); ! 406: } ! 407: ! 408: case MM_TOGGLE:{ ! 409: ! 410: SendMessage(lpCInfo->hTextWnd, WM_SETTEXT, (WPARAM)NULL, ! 411: (LPARAM)lpCInfo->CaptionBarText); ! 412: ! 413: return(1); ! 414: } ! 415: ! 416: // ! 417: // The following WM_COMMAND messages are sent by the listboxes ! 418: // ! 419: case LISTL_ID: ! 420: case LISTR_ID:{ ! 421: switch( HIWORD(wParam) ){ ! 422: // ! 423: // In case of double click on a directory, expand the file ! 424: // Listbox. if on a file, run or edit file. ! 425: // ! 426: case LBN_DBLCLK:{ ! 427: OpenListBoxItem(lpCInfo, (HWND) lParam); ! 428: return(1); ! 429: } ! 430: break; ! 431: ! 432: case LBN_SETFOCUS:{ ! 433: ghFocusLB = (HWND)lParam; ! 434: } ! 435: break; ! 436: ! 437: default: ! 438: return(1); ! 439: } ! 440: } ! 441: break; ! 442: ! 443: default: ! 444: return(1); ! 445: ! 446: } ! 447: ! 448: } ! 449: break; ! 450: ! 451: // ! 452: // Whenever the Drv child window is resized, its children has to be ! 453: // resized accordingly. The GetWindowLong GWL_USERDATA values ! 454: // contain the height of the windows queried, set in their respective ! 455: // WM_CREATE cases. ! 456: // ! 457: case WM_SIZE: { ! 458: LPCINFO lpCInfo; ! 459: ! 460: int nListHeight; ! 461: int nListWidth; ! 462: ! 463: // ! 464: // First, get the text window's handle from the per Drv child ! 465: // DRVCHILDINFO data structure ! 466: // ! 467: lpCInfo = (LPCINFO)GetWindowLong(hwnd, GWL_USERDATA); ! 468: ! 469: nListHeight = HIWORD(lParam) - ! 470: GetWindowLong(lpCInfo->hTextWnd, GWL_USERDATA) ! 471: - LIST_BORDER * 2; ! 472: ! 473: nListWidth = (LOWORD(lParam) - LIST_BORDER) / 2 - LIST_BORDER; ! 474: ! 475: // ! 476: // Always, put the text window at the top of the Drv window. ! 477: // Increasing sides and bottom extents by 1 to overlap border ! 478: // with Drv child border ! 479: // ! 480: MoveWindow(lpCInfo->hTextWnd, ! 481: -1, ! 482: 0, ! 483: LOWORD(lParam) + 2, ! 484: GetWindowLong(lpCInfo->hTextWnd, GWL_USERDATA) + 1, ! 485: TRUE); ! 486: ! 487: MoveWindow(lpCInfo->hwndLL, ! 488: LIST_BORDER, ! 489: GetWindowLong(lpCInfo->hTextWnd, GWL_USERDATA) + 1 ! 490: + LIST_BORDER, ! 491: nListWidth, ! 492: nListHeight, ! 493: TRUE); ! 494: ! 495: MoveWindow(lpCInfo->hwndLR, ! 496: (LOWORD(lParam) + LIST_BORDER) / 2, ! 497: GetWindowLong(lpCInfo->hTextWnd, GWL_USERDATA) + 1 ! 498: + LIST_BORDER, ! 499: nListWidth, ! 500: nListHeight, ! 501: TRUE); ! 502: ! 503: break; ! 504: } ! 505: ! 506: case WM_PARENTNOTIFY:{ ! 507: LPCINFO lpCInfo; ! 508: ! 509: if(wParam == WM_LBUTTONDOWN){ ! 510: lpCInfo = (LPCINFO) GetWindowLong(hwnd, GWL_USERDATA); ! 511: if(lpCInfo == NULL){ ! 512: ErrorMsg("Drv child: Parent notify error"); ! 513: return(1); ! 514: } ! 515: if(HIWORD(wParam) == LISTL_ID) ! 516: SetFocus(lpCInfo->hwndLL); ! 517: else ! 518: if(HIWORD(wParam) == LISTR_ID) ! 519: SetFocus(lpCInfo->hwndLR); ! 520: else ! 521: if(HIWORD(wParam) == TEXT_WINDOW_ID) ! 522: SetFocus(lpCInfo->hTextWnd); ! 523: } ! 524: ! 525: break; ! 526: } ! 527: ! 528: // ! 529: // Same as MainWndProc's MM_ACTIVEDRV case. The initial PostMessage ! 530: // is so the currently active Drv child will not process the message ! 531: // until it is no longer in focus. ! 532: // ! 533: case WM_MOUSEACTIVATE:{ ! 534: LPCINFO lpCInfo; ! 535: ! 536: PostMessage(ghActiveChild, WM_COMMAND, (WPARAM)MM_TOGGLE, ! 537: (LPARAM)NULL); ! 538: ghActiveChild = hwnd; ! 539: SendMessage(ghActiveChild, WM_COMMAND, (WPARAM)MM_TOGGLE, ! 540: (LPARAM)NULL); ! 541: ! 542: lpCInfo = (LPCINFO) GetWindowLong(hwnd, GWL_USERDATA); ! 543: SendMessage(ghwndDrives, WM_COMMAND, MM_ACTIVEDRV, ! 544: (LPARAM)lpCInfo->lpDriveInfo); ! 545: ! 546: break; ! 547: } ! 548: ! 549: // ! 550: // Free the DRVCHILDINFO data that associates with this window ! 551: // also, reset the menu. ! 552: // ! 553: case WM_CLOSE: { ! 554: LPCINFO lpCInfo; ! 555: ! 556: lpCInfo = (LPCINFO)GetWindowLong(hwnd, GWL_USERDATA); ! 557: ! 558: DeleteCriticalSection(&(lpCInfo->CritSecL)); ! 559: DeleteCriticalSection(&(lpCInfo->CritSecR)); ! 560: ! 561: EnterCriticalSection(&gHeapCS); ! 562: HeapFree(ghHeap, (LPSTR)lpCInfo); ! 563: LeaveCriticalSection(&gHeapCS); ! 564: ! 565: break; ! 566: } ! 567: ! 568: default: ! 569: return DefWindowProc(hwnd, message, wParam, lParam); ! 570: ! 571: } //switch ! 572: return DefWindowProc(hwnd, message, wParam, lParam); ! 573: } ! 574: ! 575: ! 576: /***************************************************************************\ ! 577: * ! 578: * IsFileLB() ! 579: * ! 580: * Verifies that the window handle sent in is a File ListBox. Directory LBs ! 581: * are not created with the LBS_SORT class style, while file LBs are. A ! 582: * query for this value determines the type of LB. See dwDirStyle and ! 583: * dwFileStyle at the top of DrvWndProc. ! 584: * ! 585: * History: ! 586: * 6/8/92 ! 587: * Created. ! 588: * ! 589: \***************************************************************************/ ! 590: BOOL IsFileLB( HWND hwnd ) ! 591: { ! 592: ! 593: if( GetWindowLong(hwnd, GWL_STYLE) & LBS_SORT ) ! 594: return(TRUE); ! 595: else ! 596: return(FALSE); ! 597: } ! 598: ! 599: ! 600: /***************************************************************************\ ! 601: * ! 602: * FillDirectoryLB() ! 603: * ! 604: * Calls routines to walk the drive associated with the Drv Child hwnd, ! 605: * enumerating the directories. ! 606: * ! 607: * History: ! 608: * 5/18/92 ! 609: * Created. ! 610: * ! 611: \***************************************************************************/ ! 612: void FillDirectoryLB( HWND hwnd ) ! 613: { ! 614: LPCINFO lpCInfo; ! 615: ! 616: lpCInfo = (LPCINFO) GetWindowLong(GetParent(hwnd), GWL_USERDATA); ! 617: if( !lpCInfo ) ! 618: ExitThread(0); ! 619: ! 620: if( !EnumDir(hwnd, lpCInfo) ){ ! 621: ErrorMsg("FILLDIR: Failed adding directories."); ! 622: ExitThread(0); ! 623: } ! 624: ! 625: ExitThread(1); ! 626: } ! 627: ! 628: ! 629: /***************************************************************************\ ! 630: * ! 631: * OpenListBoxItem() ! 632: * ! 633: * Attempts to expand a selected list box directory entry into an available ! 634: * file listbox, or spawn a selected list box file. ! 635: * ! 636: * input: lpCInfo - pointer to Drv child's LPCINFO structure ! 637: * hActiveLB - handle to active listbox ! 638: * ! 639: * History: ! 640: * 5/27/92 ! 641: * Created. ! 642: * ! 643: \***************************************************************************/ ! 644: BOOL OpenListBoxItem(LPCINFO lpCInfo, HWND hActiveLB) ! 645: { ! 646: HWND hFileLB; ! 647: LONG lIndex; ! 648: char szItemBuff[DIRECTORY_STRING_SIZE]; ! 649: ! 650: // ! 651: // Retrieve selected (careted) item. ! 652: // ! 653: lIndex = SendMessage( hActiveLB, LB_GETCARETINDEX, ! 654: (WPARAM)NULL, (LPARAM)NULL ); ! 655: ! 656: if( SendMessage( hActiveLB, LB_GETTEXT, (WPARAM)lIndex, ! 657: (LPARAM)szItemBuff) == LB_ERR ){ ! 658: ErrorMsg("LBN_DBLCLK: Cannot get string."); ! 659: return(0); ! 660: } ! 661: ! 662: // ! 663: // Determine whether the item is a directory selected from a directory ! 664: // List Box, a directory selected from a file List Box, a file, or ! 665: // an invalid condition (ListBox not active). ! 666: // ! 667: if( hActiveLB == lpCInfo->hwndLL ) ! 668: if( IsFileLB(lpCInfo->hwndLL) ) ! 669: if( !IsDirectory(lpCInfo->CaptionBarText, szItemBuff) ){ ! 670: RunListBoxItem(lpCInfo, hActiveLB); ! 671: return(1); ! 672: } ! 673: else ! 674: hFileLB = hActiveLB; //it's a directory in the file list box ! 675: else ! 676: hFileLB = lpCInfo->hwndLR; ! 677: else ! 678: if( IsFileLB(lpCInfo->hwndLR) ) ! 679: if( !IsDirectory(lpCInfo->CaptionBarText, szItemBuff) ){ ! 680: RunListBoxItem(lpCInfo, hActiveLB); ! 681: return(1); ! 682: } ! 683: else ! 684: hFileLB = hActiveLB; //it's a directory in the file list box ! 685: else ! 686: hFileLB = lpCInfo->hwndLL; ! 687: ! 688: // ! 689: // Expand directory that was opened. ! 690: // ! 691: lstrcpy( lpCInfo->CaptionBarText, szItemBuff); ! 692: ! 693: SendMessage(GetParent(hActiveLB), WM_COMMAND, (WPARAM)MM_FILLFILE, ! 694: (LPARAM)hFileLB); ! 695: return(1); ! 696: } ! 697: ! 698: /***************************************************************************\ ! 699: * ! 700: * RunListBoxItem() ! 701: * ! 702: * Attempts to spawn the selected list box file. If the file is not executable, ! 703: * attempts to spawn an editor to edit the file. ! 704: * ! 705: * input: lpCInfo - pointer to Drv child's LPCINFO structure ! 706: * hActiveLB - handle to active listbox ! 707: * ! 708: * History: ! 709: * 5/27/92 ! 710: * Created. ! 711: * ! 712: \***************************************************************************/ ! 713: BOOL RunListBoxItem(LPCINFO lpCInfo, HWND hActiveLB) ! 714: { ! 715: LONG lIndex; ! 716: char szFileBuff[DIRECTORY_STRING_SIZE]; ! 717: char szCmdLine[DIRECTORY_STRING_SIZE * 2]; ! 718: LPSTR szHold; ! 719: ! 720: STARTUPINFO si; ! 721: PROCESS_INFORMATION pi; ! 722: ! 723: ! 724: lstrcpy(szCmdLine, lpCInfo->CaptionBarText); ! 725: lstrcat(szCmdLine, "\\"); ! 726: ! 727: // ! 728: // Get file that was opened, and attempt to spawn. If fails, attempt to ! 729: // edit it. ! 730: // ! 731: lIndex = SendMessage( hActiveLB, LB_GETCARETINDEX, ! 732: (WPARAM)NULL, (LPARAM)NULL ); ! 733: ! 734: if( SendMessage( hActiveLB, LB_GETTEXT, (WPARAM)lIndex, ! 735: (LPARAM)szFileBuff) == LB_ERR ){ ! 736: ErrorMsg("RunListBoxItem: Cannot get string."); ! 737: return(0); ! 738: } ! 739: ! 740: ! 741: // ! 742: // Don't assume the file has an extension. if no '.', insert one at end of ! 743: // file, so spawned editor will not assume any default extension. ! 744: // (i.e. Notepad assumes a .TXT if no extension is given.) ! 745: // ! 746: szHold = strchr(szFileBuff, '.'); ! 747: if( !szHold ){ ! 748: szHold = strchr(szFileBuff, '\0'); ! 749: *szHold = '.'; ! 750: *(szHold + sizeof(char)) = '\0'; ! 751: } ! 752: ! 753: si.cb = sizeof(STARTUPINFO); ! 754: si.lpReserved = NULL; ! 755: si.lpDesktop = NULL; ! 756: si.lpTitle = NULL; ! 757: si.dwFlags = NULL; ! 758: si.cbReserved2 = 0; ! 759: si.lpReserved2 = NULL; ! 760: ! 761: // ! 762: // Convert file to uppercase for extension comparison. Raise the ! 763: // priority of this thread for the duration of the create process code. ! 764: // This is so the CreateProcess will not be held up by the directory ! 765: // fill threads. ! 766: // If an executable extension, spawn, else edit. ! 767: // ! 768: CharUpper(szFileBuff); ! 769: ! 770: SetThreadPriority( GetCurrentThread(), THREAD_PRIORITY_HIGHEST); ! 771: ! 772: for(lIndex = 0; lIndex < NUM_EXTENSION_STRINGS; lIndex++) ! 773: if( !lstrcmp(szHold, &gszExtensions[lIndex][0]) ){ ! 774: ! 775: lstrcat(szCmdLine, szFileBuff); ! 776: ! 777: if( !CreateProcess(NULL, (LPCTSTR)szCmdLine, NULL, NULL, FALSE, ! 778: CREATE_NEW_CONSOLE | NORMAL_PRIORITY_CLASS, ! 779: NULL, lpCInfo->CaptionBarText, &si, &pi) ){ ! 780: ErrorMsg("Unable to spawn file."); ! 781: return(0); ! 782: } ! 783: return(1); ! 784: } ! 785: ! 786: LoadString(ghModule, STR_DEF_EDITOR, szCmdLine, ! 787: DIRECTORY_STRING_SIZE * 2); ! 788: lstrcat(szCmdLine, " "); ! 789: lstrcat(szCmdLine, szFileBuff); ! 790: ! 791: if( !CreateProcess(NULL, szCmdLine, NULL, NULL, FALSE, ! 792: CREATE_NEW_CONSOLE | NORMAL_PRIORITY_CLASS, ! 793: NULL, lpCInfo->CaptionBarText, &si, &pi) ){ ! 794: ErrorMsg("Unable to edit file."); ! 795: return(0); ! 796: } ! 797: ! 798: SetThreadPriority( GetCurrentThread(), THREAD_PRIORITY_NORMAL); ! 799: ! 800: return(1); ! 801: } ! 802: ! 803: ! 804: /***************************************************************************\ ! 805: * ! 806: * IsDirectory() ! 807: * ! 808: * Given an item from a ListBox filled from an LB_DIR call, IsDirectory ! 809: * verifies whether or not the item is a directory, and if so, returns ! 810: * true, and places the full directory path in lpszFile. ! 811: * ! 812: * input: lpszDir - Holds current directory ! 813: * lpszFile - Holds item of dubious directoryness. ! 814: * ! 815: * History: ! 816: * 5/30/92 ! 817: * Created. ! 818: * ! 819: \***************************************************************************/ ! 820: BOOL IsDirectory(LPSTR lpszDir, LPSTR lpszFile) ! 821: { ! 822: DWORD dwAttrib; ! 823: LPSTR lpszHold; ! 824: char szItem[DIRECTORY_STRING_SIZE * 2]; ! 825: ! 826: // ! 827: // if it's '..', go up one directory ! 828: // ! 829: if( !lstrcmp(lpszFile, "[..]") ){ ! 830: lstrcpy(lpszFile, lpszDir); ! 831: lpszHold = strchr(lpszFile, '\0'); ! 832: while( (lpszHold > lpszFile) && (*lpszHold != '\\') ) ! 833: lpszHold--; ! 834: if(lpszHold <= lpszFile){ ! 835: ErrorMsg("IsDirectory: String parse error."); ! 836: return(0); ! 837: } ! 838: else{ ! 839: if( strchr(lpszFile, '\\') == lpszHold ) ! 840: lpszHold++; ! 841: *lpszHold = '\0'; ! 842: return(1); ! 843: } ! 844: } ! 845: ! 846: // ! 847: // a directory will have [] around it in the listbox. Check for it. ! 848: // ! 849: if( *lpszFile != '[' ) ! 850: return(0); ! 851: ! 852: // ! 853: // a file under some file systems may have [] characters. ! 854: // Prepend path, adding a delimiting backslash unless we're in the root. ! 855: // If the attribute check is successful, it's a file, so leave. ! 856: // ! 857: lstrcpy(szItem, lpszDir); ! 858: lpszHold = strchr(szItem, '\0'); ! 859: lpszHold--; ! 860: if( *lpszHold != '\\' ){ ! 861: lpszHold++; ! 862: *lpszHold = '\\'; ! 863: lpszHold++; ! 864: } ! 865: else ! 866: lpszHold++; ! 867: ! 868: lstrcpy(lpszHold, lpszFile); ! 869: ! 870: dwAttrib = GetFileAttributes(szItem); ! 871: ! 872: if( dwAttrib != 0xFFFFFFFF ) ! 873: return(0); ! 874: ! 875: // ! 876: // remove the [], and check if valid directory. ! 877: // if it fails, or it's not a directory, leave. ! 878: // ! 879: lstrcpy(lpszHold, &lpszFile[1]); ! 880: lpszHold = strchr(lpszHold, '\0'); ! 881: lpszHold--; ! 882: if( *lpszHold != ']' ) ! 883: return(0); ! 884: *lpszHold = '\0'; ! 885: ! 886: dwAttrib = GetFileAttributes(szItem); ! 887: ! 888: if( (dwAttrib == 0xFFFFFFFF) || !(dwAttrib & FILE_ATTRIBUTE_DIRECTORY) ) ! 889: return(0); ! 890: ! 891: // ! 892: // OK, it's a directory, and szItem now holds the fully qualified path. ! 893: // copy this to the filename buffer sent in, and return true. ! 894: // ! 895: CharUpper(szItem); ! 896: lstrcpy(lpszFile, szItem); ! 897: return(1); ! 898: } ! 899: ! 900: ! 901: /***************************************************************************\ ! 902: * ! 903: * ExecuteFileAction() ! 904: * ! 905: * Creates a dialog box verifying a file action, and carries out the action. ! 906: * ! 907: * input: hwnd - handle to Drv child. ! 908: * lpSelect - pointer to SELECTINFO structure, containing ! 909: * info on the file i/o action to be performed. ! 910: * ! 911: * History: ! 912: * 5/28/92 ! 913: * Created. ! 914: * ! 915: \***************************************************************************/ ! 916: BOOL ExecuteFileAction(LPSINFO lpSelect) ! 917: { ! 918: ! 919: if( DialogBoxParam(ghModule, "SelectDlg", lpSelect->hwnd, ! 920: (DLGPROC)SelectProc, (LPARAM)lpSelect) == -1 ){ ! 921: ErrorMsg("ExecuteFileAction: File I/O Dialog Creation Error!"); ! 922: return(0); ! 923: } ! 924: return(1); ! 925: } ! 926: ! 927: ! 928: /***************************************************************************\ ! 929: * SelectProc() ! 930: * ! 931: * File I/O selection dialog proc. ! 932: * ! 933: * History: ! 934: * 5/28/92 ! 935: * Created. ! 936: \***************************************************************************/ ! 937: LRESULT SelectProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) ! 938: { ! 939: static LPSINFO lpSelect; ! 940: ! 941: switch (message) { ! 942: case WM_INITDIALOG:{ ! 943: ! 944: lpSelect = (LPSINFO)lParam; ! 945: ! 946: // ! 947: // Fill source and destination fields of Select dialog. ! 948: // ! 949: if( !FillSelectDlg(hDlg, lpSelect) ){ ! 950: EndDialog(hDlg, wParam); ! 951: return(1); ! 952: } ! 953: ! 954: // ! 955: // Set the 'action' text (i.e. "COPYING:", "MOVING:", etc.) ! 956: // ! 957: if( !SetDlgItemText(hDlg, SB_ACTION, lpSelect->szAction) ){ ! 958: ErrorMsg("SelectProc: Set Action Text Error."); ! 959: EndDialog(hDlg, wParam); ! 960: return(1); ! 961: } ! 962: ! 963: // ! 964: // Set the "TO:" or "FROM:" text. ! 965: // ! 966: if( !SetDlgItemText(hDlg, SB_TOFROM, lpSelect->szToFrom) ){ ! 967: ErrorMsg("SelectProc: Set Action Text Error."); ! 968: EndDialog(hDlg, wParam); ! 969: return(1); ! 970: } ! 971: ! 972: break; ! 973: } ! 974: case WM_COMMAND:{ ! 975: switch(wParam){ ! 976: case SB_OK:{ ! 977: DoFileIO(hDlg, lpSelect); ! 978: EndDialog(hDlg, wParam); ! 979: return(1); ! 980: } ! 981: case SB_CANCEL:{ ! 982: EndDialog(hDlg, wParam); ! 983: return(1); ! 984: } ! 985: } ! 986: return(1); ! 987: } ! 988: } ! 989: ! 990: return(0); ! 991: } ! 992: ! 993: ! 994: /***************************************************************************\ ! 995: * ! 996: * FillSelectDlg() ! 997: * ! 998: * Fills the Select Dialog box with the files selected in the active Drv Child ! 999: * for a file i/o action. Destination defaults to directory selection in ! 1000: * inactive Drv Child. ! 1001: * ! 1002: * input: hDlg - handle to Select dialog box. ! 1003: * hwnd - handle to Drv child. ! 1004: * ! 1005: * History: ! 1006: * 5/28/92 ! 1007: * Created. ! 1008: * ! 1009: \***************************************************************************/ ! 1010: BOOL FillSelectDlg(HWND hDlg, LPSINFO lpSelect) ! 1011: { ! 1012: LONG lCount; // Number of items selected in ListBox ! 1013: LONG lSize; // Holds size of a string ! 1014: LONG lLargest = 0; // Holds largest string encountered. ! 1015: UINT *lpnIndex; // ptr to array of selected ListBox items' indeces ! 1016: int i; // counter ! 1017: ! 1018: LPCINFO lpCInfo; ! 1019: HWND hActiveLB; // handle to Drv child's dir or file list box ! 1020: HWND hDest; // dir of files if delete, else inactive Drv dir. ! 1021: ! 1022: HDC hDC; ! 1023: TEXTMETRIC Metrics; ! 1024: ! 1025: LPSTR lpszHold; // marks end of directory path in szName. ! 1026: char szName[DIRECTORY_STRING_SIZE * 2]; // holds ListBox strings. ! 1027: ! 1028: ! 1029: lpCInfo = (LPCINFO)GetWindowLong(lpSelect->hwnd, GWL_USERDATA); ! 1030: ! 1031: if( IsFileLB(lpCInfo->hwndLR) ) ! 1032: hActiveLB = lpCInfo->hwndLR; ! 1033: else ! 1034: hActiveLB = lpCInfo->hwndLL; ! 1035: ! 1036: lCount = SendMessage( hActiveLB, LB_GETSELCOUNT, ! 1037: (WPARAM)NULL, (LPARAM)NULL ); ! 1038: ! 1039: // ! 1040: // if no items selected, leave. ! 1041: // ! 1042: if( !lCount ) ! 1043: return(0); ! 1044: ! 1045: // ! 1046: // Allocate array of lCount listbox indexes, and fill it. ! 1047: // ! 1048: EnterCriticalSection(&gHeapCS); ! 1049: lpnIndex = (UINT*)HeapAlloc( ghHeap, lCount * sizeof(UINT) ); ! 1050: LeaveCriticalSection(&gHeapCS); ! 1051: if( !lpnIndex ){ ! 1052: ErrorMsg("FillSelectDlg: Item list allocation Error"); ! 1053: return(0); ! 1054: } ! 1055: ! 1056: if( SendMessage( hActiveLB, LB_GETSELITEMS, (WPARAM)lCount, ! 1057: (LPARAM)lpnIndex) != lCount ){ ! 1058: ErrorMsg("FillSelectDlg: Get Selections Error"); ! 1059: return(0); ! 1060: } ! 1061: ! 1062: // ! 1063: // Check if each selected entry is a valid file. ! 1064: // Fill Dlg ListBox with selected strings from Drv child's ListBox, ! 1065: // noting size of largest entry. ! 1066: // ! 1067: ! 1068: lstrcpy(szName, lpCInfo->CaptionBarText); ! 1069: lpszHold = strchr(szName, '\0'); ! 1070: *lpszHold = '\\'; ! 1071: lpszHold++; ! 1072: ! 1073: for( i = 0; i < lCount; i++){ ! 1074: if( SendMessage( hActiveLB, LB_GETTEXT, (WPARAM)lpnIndex[i], ! 1075: (LPARAM)lpszHold) == LB_ERR ){ ! 1076: ErrorMsg("FillSelectDlg: Get source string Error"); ! 1077: return(0); ! 1078: } ! 1079: ! 1080: if( GetFileAttributes(szName) == 0xFFFFFFFF ){ ! 1081: lstrcat(lpszHold, ": Access Denied."); ! 1082: ErrorMsg(lpszHold); ! 1083: } ! 1084: else{ ! 1085: lSize = lstrlen(lpszHold); ! 1086: if( lSize > lLargest ) ! 1087: lLargest = lSize; ! 1088: ! 1089: if( SendDlgItemMessage( hDlg, SB_SOURCE, LB_ADDSTRING, NULL, ! 1090: (LPARAM)lpszHold) == LB_ERR ){ ! 1091: ErrorMsg("FillSelectDlg: Add source string Error"); ! 1092: return(0); ! 1093: } ! 1094: } ! 1095: } ! 1096: ! 1097: // ! 1098: // Get the average char width of current font, ! 1099: // We then set the dialog listbox column width to ! 1100: // (longest string + arbitrary column spacing) * ave width. ! 1101: // ! 1102: hDC = GetDC(lpSelect->hwnd); ! 1103: if( !GetTextMetrics(hDC, &Metrics) ){ ! 1104: ErrorMsg("FillSelectDlg: GetTextMetrics Error"); ! 1105: return(0); ! 1106: } ! 1107: ! 1108: ReleaseDC(lpSelect->hwnd, hDC); ! 1109: ! 1110: SendDlgItemMessage( hDlg, SB_SOURCE, LB_SETCOLUMNWIDTH, ! 1111: (WPARAM)((lLargest + 8) * Metrics.tmAveCharWidth), ! 1112: (LPARAM)NULL ); ! 1113: ! 1114: EnterCriticalSection(&gHeapCS); ! 1115: HeapFree( ghHeap, (LPSTR)lpnIndex); ! 1116: LeaveCriticalSection(&gHeapCS); ! 1117: ! 1118: ! 1119: // ! 1120: // Fill SB_DEST with directory. ! 1121: // If deleteing, default to the directory of the files. ! 1122: // ! 1123: if( lpSelect->dwAction != MM_DELETE ){ ! 1124: // ! 1125: // Not Deleting. Default to selected directory (titlebar) ! 1126: // of the inactive Drive child. ! 1127: // ! 1128: if( lpSelect->hwnd == ghwndDrv1 ) ! 1129: hDest = ghwndDrv2; ! 1130: else ! 1131: hDest = ghwndDrv1; ! 1132: ! 1133: lpCInfo = (LPCINFO)GetWindowLong(hDest, GWL_USERDATA); ! 1134: } ! 1135: ! 1136: SendDlgItemMessage( hDlg, SB_DEST, EM_LIMITTEXT, ! 1137: (WPARAM)DIRECTORY_STRING_SIZE, (LPARAM)0); ! 1138: ! 1139: if( SendDlgItemMessage( hDlg, SB_DEST, WM_SETTEXT, NULL, ! 1140: (LPARAM)lpCInfo->CaptionBarText) == CB_ERR ){ ! 1141: ErrorMsg("FillSelectDlg: Set Destination text Error"); ! 1142: return(0); ! 1143: } ! 1144: ! 1145: return(1); ! 1146: } ! 1147: ! 1148: ! 1149: /***************************************************************************\ ! 1150: * ! 1151: * DoFileIO() ! 1152: * ! 1153: * Called by SelectProc. Carries out the chosed file operations verified ! 1154: * in the Select Dialog Box. ! 1155: * ! 1156: * input: hDlg - handle to Select dialog box. ! 1157: * lpSelect - ptr to SELECTINFO structure. ! 1158: * ! 1159: * returns: 1 if successful ! 1160: * 0 if unsuccessful ! 1161: * History: ! 1162: * 6/3/92 ! 1163: * Created. ! 1164: * ! 1165: \***************************************************************************/ ! 1166: BOOL DoFileIO( HWND hDlg, LPSINFO lpSelect) ! 1167: { ! 1168: LONG lCount; ! 1169: LONG lFile; ! 1170: LPCINFO lpCInfo; ! 1171: LPSTR lpEndDest; ! 1172: LPSTR lpEndSource; ! 1173: BOOL fError = FALSE; ! 1174: ! 1175: char szSource[DIRECTORY_STRING_SIZE]; ! 1176: char szDest[DIRECTORY_STRING_SIZE * 2]; ! 1177: ! 1178: ! 1179: // ! 1180: // Find number of files to copy ! 1181: // ! 1182: lCount = SendDlgItemMessage( hDlg, SB_SOURCE, LB_GETCOUNT, (WPARAM)NULL, ! 1183: (LPARAM)NULL); ! 1184: ! 1185: if( (lCount == LB_ERR) || (lCount == 0) ){ ! 1186: ErrorMsg("Unable to get file selection."); ! 1187: return(0); ! 1188: } ! 1189: ! 1190: // ! 1191: // Get source directory path. Add a \ to the end, set pointer to end. ! 1192: // ! 1193: lpCInfo = (LPCINFO)GetWindowLong( lpSelect->hwnd, GWL_USERDATA); ! 1194: ! 1195: lstrcpy(szSource, lpCInfo->CaptionBarText); ! 1196: ! 1197: lpEndSource = strchr(szSource, '\0'); ! 1198: *lpEndSource++ = '\\'; ! 1199: ! 1200: // ! 1201: // Get destination directory path. Add a \ to the end, set pointer to end. ! 1202: // ! 1203: if( SendDlgItemMessage( hDlg, SB_DEST, WM_GETTEXT, ! 1204: (WPARAM)DIRECTORY_STRING_SIZE * 2, (LPARAM)szDest) == CB_ERR ){ ! 1205: ErrorMsg("Do I/O: Get Destination error."); ! 1206: return(0); ! 1207: } ! 1208: ! 1209: lpEndDest = strchr(szDest, '\0'); ! 1210: *lpEndDest++ = '\\'; ! 1211: ! 1212: // ! 1213: // for each file, do appropriate I/O. ! 1214: // ! 1215: while( lCount ){ ! 1216: ! 1217: lCount--; ! 1218: ! 1219: lFile = SendDlgItemMessage( hDlg, SB_SOURCE, LB_GETTEXT, ! 1220: (WPARAM)0, (LPARAM)lpEndSource); ! 1221: if( lFile == LB_ERR){ ! 1222: ErrorMsg("DoFileIO: Unable to get file item."); ! 1223: fError = TRUE; ! 1224: } ! 1225: ! 1226: SendDlgItemMessage( hDlg, SB_SOURCE, LB_DELETESTRING, ! 1227: (WPARAM)0, (LPARAM)NULL); ! 1228: ! 1229: switch( lpSelect->dwAction ){ ! 1230: case MM_COPY:{ ! 1231: ! 1232: lstrcpy(lpEndDest, lpEndSource); ! 1233: ! 1234: if( !CopyFile( szSource, szDest, TRUE) ) ! 1235: if( !HandleIOError(lpSelect->hwnd, lpSelect->dwAction, ! 1236: szSource, szDest) ) ! 1237: fError = TRUE; ! 1238: break; ! 1239: } ! 1240: ! 1241: case MM_MOVE:{ ! 1242: ! 1243: lstrcpy(lpEndDest, lpEndSource); ! 1244: ! 1245: if( !MoveFile( szSource, szDest) ) ! 1246: if( !HandleIOError(lpSelect->hwnd, lpSelect->dwAction, ! 1247: szSource, szDest) ) ! 1248: fError = TRUE; ! 1249: break; ! 1250: } ! 1251: case MM_DELETE:{ ! 1252: ! 1253: if( !DeleteFile(szSource) ) ! 1254: if( !HandleIOError(lpSelect->hwnd, lpSelect->dwAction, ! 1255: szSource, szDest) ) ! 1256: fError = TRUE; ! 1257: break; ! 1258: } ! 1259: ! 1260: } ! 1261: if( fError ) ! 1262: break; ! 1263: } ! 1264: ! 1265: // ! 1266: // Update appropriate file listboxes. ! 1267: // ! 1268: if( fError ) ! 1269: return(0); ! 1270: else{ ! 1271: UpdateFileLB(ghwndDrv1); ! 1272: UpdateFileLB(ghwndDrv2); ! 1273: } ! 1274: ! 1275: return(1); ! 1276: } ! 1277: ! 1278: ! 1279: /***************************************************************************\ ! 1280: * ! 1281: * UpdateFileLB() ! 1282: * ! 1283: * Updates the file listbox of the drive child given by sending an MM_FILLFILE ! 1284: * message to it. ! 1285: * ! 1286: * input: hwnd - Handle of drive child to update file listbox of. ! 1287: * ! 1288: * History: ! 1289: * 6/3/92 ! 1290: * Created. ! 1291: * ! 1292: \***************************************************************************/ ! 1293: void UpdateFileLB(HWND hwnd) ! 1294: { ! 1295: LPCINFO lpCInfo; ! 1296: HWND hFileLB; ! 1297: ! 1298: lpCInfo = (LPCINFO)GetWindowLong(hwnd, GWL_USERDATA); ! 1299: ! 1300: if( IsFileLB(lpCInfo->hwndLL) ) ! 1301: hFileLB = lpCInfo->hwndLL; ! 1302: else ! 1303: hFileLB = lpCInfo->hwndLR; ! 1304: ! 1305: SendMessage(hwnd, WM_COMMAND, (WPARAM)MM_FILLFILE, ! 1306: (LPARAM)hFileLB); ! 1307: } ! 1308: ! 1309: ! 1310: /***************************************************************************\ ! 1311: * ! 1312: * HandleIOError() ! 1313: * ! 1314: * Called by DoFileIO. Handles errors arising from File IO operations ! 1315: * ! 1316: * input: hwnd - handle to Drv child window ! 1317: * dwAction - File I/O Action. Window message. ! 1318: * szSource - ptr to Source string ! 1319: * szDest - ptr to Destination string ! 1320: * ! 1321: * returns: 1 if successful ! 1322: * 0 if unsuccessful ! 1323: * ! 1324: * History: ! 1325: * 6/3/92 ! 1326: * Created. ! 1327: * ! 1328: \***************************************************************************/ ! 1329: BOOL HandleIOError(HWND hwnd, DWORD dwAction, LPSTR szSource, LPSTR szDest) ! 1330: { ! 1331: DWORD dwError; ! 1332: int nReply; ! 1333: LPCINFO lpCInfo; ! 1334: char buff[50]; ! 1335: ! 1336: dwError = GetLastError(); ! 1337: ! 1338: CharUpper(szDest); ! 1339: ! 1340: switch( dwError ){ ! 1341: case ERROR_ALREADY_EXISTS: ! 1342: case ERROR_FILE_EXISTS:{ ! 1343: // ! 1344: // MoveFile file already exists. We can CopyFile & DeleteFile source. ! 1345: // ! 1346: nReply = MessageBox(hwnd, ! 1347: "File Already Exists! Overwrite file?", ! 1348: szDest, MB_YESNOCANCEL); ! 1349: switch( nReply ){ ! 1350: case IDYES:{ ! 1351: ! 1352: lpCInfo = (LPCINFO)GetWindowLong(hwnd, GWL_USERDATA); ! 1353: ! 1354: if( !CopyFile( szSource, szDest, FALSE) ) ! 1355: if( HandleIOError(hwnd, dwAction, szSource, szDest) ) ! 1356: return(1); ! 1357: else ! 1358: return(0); ! 1359: if( dwAction == MM_MOVE ) ! 1360: if( !DeleteFile( szSource) ) ! 1361: if( HandleIOError(hwnd, dwAction, szSource, szDest) ) ! 1362: return(1); ! 1363: else ! 1364: return(0); ! 1365: ! 1366: UpdateFileLB(ghwndDrv1); ! 1367: UpdateFileLB(ghwndDrv2); ! 1368: ! 1369: return(1); ! 1370: } ! 1371: case IDNO:{ ! 1372: return(1); ! 1373: } ! 1374: case IDCANCEL:{ ! 1375: return(0); ! 1376: } ! 1377: } ! 1378: break; ! 1379: } ! 1380: ! 1381: case ERROR_ACCESS_DENIED: ! 1382: case ERROR_FILE_NOT_FOUND: ! 1383: case ERROR_INVALID_PARAMETER:{ ! 1384: wsprintf(buff, ! 1385: "Access Denied. Check file name or security. Error %ld", ! 1386: dwError); ! 1387: MessageBox( hwnd, buff, szDest, MB_OK); ! 1388: ! 1389: return(1); ! 1390: } ! 1391: ! 1392: case ERROR_DISK_FULL:{ ! 1393: MessageBox( hwnd, ! 1394: "ERROR: The disk is full. Unable to continue.", ! 1395: szDest, MB_OK); ! 1396: return(0); ! 1397: } ! 1398: ! 1399: case ERROR_INVALID_NAME: ! 1400: case ERROR_DIRECTORY: ! 1401: case ERROR_PATH_NOT_FOUND:{ ! 1402: MessageBox( hwnd, ! 1403: "ERROR: The path or file does not exist. Unable to continue.", ! 1404: szDest, MB_OK); ! 1405: return(0); ! 1406: } ! 1407: ! 1408: default:{ ! 1409: wsprintf(buff, "File I/O failed. Error %ld", dwError); ! 1410: ErrorMsg(buff); ! 1411: return(1); ! 1412: } ! 1413: } ! 1414: ! 1415: return(1); ! 1416: } ! 1417: ! 1418: ! 1419: /***************************************************************************\ ! 1420: * RenameProc() ! 1421: * ! 1422: * File I/O rename Dialog Box ! 1423: * ! 1424: * History: ! 1425: * 6/5/92 2am ! 1426: * Created. ! 1427: \***************************************************************************/ ! 1428: LRESULT RenameProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) ! 1429: { ! 1430: static char szName[DIRECTORY_STRING_SIZE]; ! 1431: static LPSTR lpszHold; ! 1432: static HWND hActiveLB; ! 1433: ! 1434: switch (message){ ! 1435: case WM_INITDIALOG:{ ! 1436: ! 1437: LONG lIndex; ! 1438: LPCINFO lpCInfo; ! 1439: ! 1440: ! 1441: lpCInfo = (LPCINFO)lParam; ! 1442: ! 1443: if( IsFileLB(lpCInfo->hwndLR) ) ! 1444: hActiveLB = lpCInfo->hwndLR; ! 1445: else ! 1446: hActiveLB = lpCInfo->hwndLL; ! 1447: ! 1448: lIndex = SendMessage( hActiveLB, LB_GETCARETINDEX, ! 1449: (WPARAM)NULL, (LPARAM)NULL); ! 1450: if( lIndex == LB_ERR ){ ! 1451: ErrorMsg("Rename: Invalid Selection"); ! 1452: return(1); ! 1453: } ! 1454: ! 1455: // ! 1456: // Check if selected entry is a valid file. ! 1457: // ! 1458: lstrcpy(szName, lpCInfo->CaptionBarText); ! 1459: lpszHold = strchr(szName, '\0'); ! 1460: *lpszHold = '\\'; ! 1461: lpszHold++; ! 1462: ! 1463: if( SendMessage( hActiveLB, LB_GETTEXT, (WPARAM)lIndex, ! 1464: (LPARAM)lpszHold) == LB_ERR ){ ! 1465: ErrorMsg("Rename: Get Text Error"); ! 1466: return(1); ! 1467: } ! 1468: ! 1469: // ! 1470: // if not a valid file (i.e. listbox directory entry in []s), fail. ! 1471: // ! 1472: if( GetFileAttributes(szName) == 0xFFFFFFFF ){ ! 1473: lstrcat(lpszHold, ": Access Denied."); ! 1474: ErrorMsg(lpszHold); ! 1475: return(1); ! 1476: } ! 1477: ! 1478: // ! 1479: // Place name in both source and destination edit controls. ! 1480: // ! 1481: CharUpper(szName); ! 1482: ! 1483: SendDlgItemMessage( hDlg, SB_SOURCE, EM_LIMITTEXT, ! 1484: (WPARAM)DIRECTORY_STRING_SIZE, (LPARAM)0); ! 1485: ! 1486: SendDlgItemMessage( hDlg, SB_DEST, EM_LIMITTEXT, ! 1487: (WPARAM)DIRECTORY_STRING_SIZE, (LPARAM)0); ! 1488: ! 1489: if( SendDlgItemMessage( hDlg, SB_SOURCE, WM_SETTEXT, NULL, ! 1490: (LPARAM)lpszHold) == LB_ERR ){ ! 1491: ErrorMsg("Rename: Add Source String Error"); ! 1492: return(1); ! 1493: } ! 1494: if( SendDlgItemMessage( hDlg, SB_DEST, WM_SETTEXT, NULL, ! 1495: (LPARAM)lpszHold) == LB_ERR ){ ! 1496: ErrorMsg("Rename: Add Destination String Error"); ! 1497: return(1); ! 1498: } ! 1499: return(1); ! 1500: } ! 1501: case WM_COMMAND:{ ! 1502: switch(wParam){ ! 1503: case SB_OK:{ ! 1504: char szDest[DIRECTORY_STRING_SIZE]; ! 1505: LPSTR lpszCheck; ! 1506: ! 1507: // ! 1508: // the entire source dir\file is still in static szName. ! 1509: // static lpszHold points to the end of the dir ! 1510: // ! 1511: *lpszHold = '\0'; ! 1512: ! 1513: lstrcpy(szDest, szName); ! 1514: ! 1515: if( SendDlgItemMessage( hDlg, SB_SOURCE, WM_GETTEXT, ! 1516: DIRECTORY_STRING_SIZE, ! 1517: (LPARAM)lpszHold) == LB_ERR ){ ! 1518: ErrorMsg("Rename: Get Source String Error"); ! 1519: EndDialog(hDlg, wParam); ! 1520: return(1); ! 1521: } ! 1522: ! 1523: // ! 1524: // If there are any \s in the new filename, fail. ! 1525: // ! 1526: lpszCheck = strchr(lpszHold, '\\'); ! 1527: ! 1528: if( lpszCheck ){ ! 1529: ErrorMsg("Rename works only in current directory."); ! 1530: return(1); ! 1531: } ! 1532: ! 1533: lpszHold = strchr(szDest, '\0'); ! 1534: ! 1535: if( SendDlgItemMessage( hDlg, SB_DEST, WM_GETTEXT, ! 1536: DIRECTORY_STRING_SIZE, ! 1537: (LPARAM)lpszHold) == LB_ERR ){ ! 1538: ErrorMsg("Rename: Get Destination String Error"); ! 1539: EndDialog(hDlg, wParam); ! 1540: return(1); ! 1541: } ! 1542: ! 1543: // ! 1544: // If there are any \s in the new filename, fail. ! 1545: // ! 1546: lpszCheck = strchr(lpszHold, '\\'); ! 1547: ! 1548: if( lpszCheck ){ ! 1549: ErrorMsg("Rename works only in current directory."); ! 1550: return(1); ! 1551: } ! 1552: ! 1553: // ! 1554: // if strings are identical, leave. ! 1555: // ! 1556: if( !stricmp(szName, szDest) ){ ! 1557: EndDialog(hDlg, wParam); ! 1558: return(1); ! 1559: } ! 1560: ! 1561: if( !MoveFile( szName, szDest) ) ! 1562: if( !HandleIOError(GetParent(hActiveLB), ! 1563: (DWORD)MM_RENAME, szName, szDest) ){ ! 1564: EndDialog(hDlg, wParam); ! 1565: return(1); ! 1566: } ! 1567: ! 1568: // ! 1569: // Update files listbox. ! 1570: // ! 1571: SendMessage(GetParent(hActiveLB), WM_COMMAND, (WPARAM)MM_FILLFILE, ! 1572: (LPARAM)hActiveLB); ! 1573: ! 1574: EndDialog(hDlg, wParam); ! 1575: return(1); ! 1576: } ! 1577: case SB_CANCEL:{ ! 1578: EndDialog(hDlg, wParam); ! 1579: return(1); ! 1580: } ! 1581: } ! 1582: return(1); ! 1583: } // WM_COMMAND ! 1584: } ! 1585: ! 1586: return(0); ! 1587: } ! 1588: ! 1589: ! 1590: /***************************************************************************\ ! 1591: * MkDirProc() ! 1592: * ! 1593: * File I/O Make Directory Dialog Box ! 1594: * ! 1595: * History: ! 1596: * 6/5/92 2am ! 1597: * Created. ! 1598: \***************************************************************************/ ! 1599: LRESULT MkDirProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) ! 1600: { ! 1601: switch (message){ ! 1602: case WM_INITDIALOG:{ ! 1603: LPCINFO lpCInfo; ! 1604: char szDest[DIRECTORY_STRING_SIZE]; ! 1605: ! 1606: ! 1607: lpCInfo = (LPCINFO)lParam; ! 1608: ! 1609: lstrcpy(szDest, lpCInfo->CaptionBarText); ! 1610: lstrcat(szDest, "\\"); ! 1611: ! 1612: SendDlgItemMessage( hDlg, SB_DEST, EM_LIMITTEXT, ! 1613: (WPARAM)DIRECTORY_STRING_SIZE, (LPARAM)0); ! 1614: ! 1615: // ! 1616: // Place name in directory name edit control. ! 1617: // ! 1618: if( SendDlgItemMessage( hDlg, SB_DEST, WM_SETTEXT, NULL, ! 1619: (LPARAM)szDest) == LB_ERR ){ ! 1620: ErrorMsg("Mkdir: Add Directory Name String Error"); ! 1621: return(1); ! 1622: } ! 1623: ! 1624: SendDlgItemMessage( hDlg, SB_DEST, EM_SETSEL, (WPARAM)-1, (LPARAM)0); ! 1625: ! 1626: return(1); ! 1627: } ! 1628: case WM_COMMAND:{ ! 1629: switch(wParam){ ! 1630: case SB_OK:{ ! 1631: char szDest[DIRECTORY_STRING_SIZE]; ! 1632: ! 1633: if( SendDlgItemMessage( hDlg, SB_DEST, WM_GETTEXT, ! 1634: DIRECTORY_STRING_SIZE, ! 1635: (LPARAM)szDest) == LB_ERR ){ ! 1636: ErrorMsg("MkDir: Get Directory Location String Error"); ! 1637: EndDialog(hDlg, wParam); ! 1638: return(1); ! 1639: } ! 1640: ! 1641: // ! 1642: // If loacation of subdir is invalid, leave. ! 1643: // ! 1644: if( !CreateDirectory(szDest, NULL) ){ ! 1645: ErrorMsg("Create Directory Error."); ! 1646: EndDialog(hDlg, wParam); ! 1647: return(1); ! 1648: } ! 1649: } ! 1650: case SB_CANCEL:{ ! 1651: EndDialog(hDlg, wParam); ! 1652: return(1); ! 1653: } ! 1654: } ! 1655: return(1); ! 1656: } ! 1657: } ! 1658: ! 1659: return(0); ! 1660: } ! 1661: ! 1662: ! 1663: /***************************************************************************\ ! 1664: * ! 1665: * TextWndProc() ! 1666: * ! 1667: * Text Window procedure for displaying miscellaneous messages to user. ! 1668: * ! 1669: * History: ! 1670: * 5/25/92 ! 1671: * Created. ! 1672: * ! 1673: \***************************************************************************/ ! 1674: ! 1675: LRESULT TextWndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) ! 1676: { ! 1677: ! 1678: switch (message) ! 1679: { ! 1680: case WM_CREATE: ! 1681: { ! 1682: HDC hDC; ! 1683: HGDIOBJ hOldFont; ! 1684: TEXTMETRIC tm; ! 1685: LONG lHeight; ! 1686: ! 1687: hDC = GetDC(hwnd); ! 1688: ! 1689: hOldFont = SelectObject(hDC, ghFont); ! 1690: GetTextMetrics(hDC, &tm); ! 1691: ! 1692: // ! 1693: // base the height of the window on size of text ! 1694: // ! 1695: lHeight = tm.tmHeight + GetSystemMetrics(SM_CYBORDER) + 6; ! 1696: ! 1697: // ! 1698: // saved the height for later reference ! 1699: // ! 1700: SetWindowLong(hwnd, GWL_USERDATA, lHeight); ! 1701: ! 1702: if(hOldFont) ! 1703: SelectObject(hDC, hOldFont); ! 1704: ReleaseDC(hwnd, hDC); ! 1705: break; ! 1706: } ! 1707: ! 1708: case WM_SETTEXT: ! 1709: DefWindowProc(hwnd, message, wParam, lParam); ! 1710: if( !InvalidateRect(hwnd, NULL, TRUE) ){ ! 1711: ErrorMsg("Textwindow: Set text error."); ! 1712: return(1); ! 1713: } ! 1714: UpdateWindow(hwnd); ! 1715: return(1); ! 1716: ! 1717: case WM_PAINT: ! 1718: { ! 1719: PAINTSTRUCT ps; ! 1720: RECT rc; ! 1721: char ach[128]; ! 1722: int len, nxBorder, nyBorder; ! 1723: HFONT hOldFont = NULL; ! 1724: HBRUSH hBrush; ! 1725: ! 1726: BeginPaint(hwnd, &ps); ! 1727: ! 1728: GetClientRect(hwnd,&rc); ! 1729: ! 1730: len = GetWindowText(hwnd, ach, sizeof(ach)); ! 1731: ! 1732: SetBkMode(ps.hdc, TRANSPARENT); ! 1733: ! 1734: if( GetParent(hwnd) == ghActiveChild ){ ! 1735: hBrush = CreateSolidBrush( GetSysColor(COLOR_ACTIVECAPTION) ); ! 1736: SetTextColor( ps.hdc, GetSysColor(COLOR_CAPTIONTEXT) ); ! 1737: } ! 1738: else{ ! 1739: hBrush = CreateSolidBrush( GetSysColor(COLOR_INACTIVECAPTION) ); ! 1740: SetTextColor( ps.hdc, GetSysColor(COLOR_INACTIVECAPTIONTEXT) ); ! 1741: } ! 1742: ! 1743: hOldFont = SelectObject(ps.hdc, ghFont); ! 1744: ! 1745: FillRect(ps.hdc, &rc, hBrush); ! 1746: ! 1747: nxBorder = GetSystemMetrics(SM_CXBORDER); ! 1748: rc.left += 9*nxBorder; ! 1749: rc.right -= 9*nxBorder; ! 1750: ! 1751: nyBorder = GetSystemMetrics(SM_CYBORDER); ! 1752: rc.top += 3*nyBorder; ! 1753: rc.bottom -= 3*nyBorder; ! 1754: ! 1755: ExtTextOut(ps.hdc, rc.left+2*nxBorder, rc.top, ETO_CLIPPED, ! 1756: &rc, ach, len, NULL); ! 1757: ! 1758: SetBkMode(ps.hdc, OPAQUE); ! 1759: ! 1760: if (hOldFont) ! 1761: SelectObject(ps.hdc, hOldFont); ! 1762: ! 1763: DeleteObject(hBrush); ! 1764: ! 1765: EndPaint(hwnd, &ps); ! 1766: return(1); ! 1767: } ! 1768: } ! 1769: return DefWindowProc(hwnd, message, wParam, lParam); ! 1770: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.