dmgrdlg.cpp
Upload User: xhy777
Upload Date: 2007-02-14
Package Size: 24088k
Code Size: 33k
Category:

Windows Kernel

Development Platform:

Visual C++

  1. /*
  2. **------------------------------------------------------------------------------
  3. ** Module:  Disk Cleanup Applet
  4. ** File:    dmgrdlg.cpp
  5. **
  6. ** Purpose: Implements the Disk Space Cleanup Drive dialog
  7. ** Notes:   
  8. ** Mod Log: Created by Jason Cobb (2/97)
  9. **
  10. ** Copyright (c)1997 Microsoft Corporation, All Rights Reserved
  11. **------------------------------------------------------------------------------
  12. */
  13. /*
  14. **------------------------------------------------------------------------------
  15. ** Project include files
  16. **------------------------------------------------------------------------------
  17. */
  18. #include "common.h"
  19. #include "dmgrdlg.h"
  20. #include "dmgrinfo.h"
  21. #include "diskutil.h"
  22. #include "msprintf.h"
  23. #include <help.h>
  24. // To work around a "feature" of listview we need the ability to temporarily ignore certain LVN_ITEMCHANGED messages:
  25. BOOL    g_bIgnoreCheckStateChanges = TRUE;
  26. /*
  27. **------------------------------------------------------------------------------
  28. ** Local defines
  29. **------------------------------------------------------------------------------
  30. */
  31. #define crSliceUsed     RGB( 0, 0, 255 )
  32. #define crSliceFree     RGB( 255, 0, 255)
  33. #define crSliceCleanup  RGB( 255, 255, 0 )
  34. const DWORD aHelpIDs[]=
  35. {
  36.     IDC_INTRO_TEXT,                 IDH_CLEANMGR_INTRO_TEXT,
  37.     IDC_FILES_TO_REMOVE_TEXT,       IDH_CLEANMGR_CLIENT_LIST,
  38.     IDC_CLIENT_LIST,                IDH_CLEANMGR_CLIENT_LIST,
  39.     IDC_TOTAL_SPACE_DESCRIPTION,    IDH_CLEANMGR_TOTAL_SPACE,
  40.     IDC_TOTAL_SPACE_TEXT,           IDH_CLEANMGR_TOTAL_SPACE,
  41.     IDC_DESCRIPTION_GROUP,          IDH_CLEANMGR_DESCRIPTION_GROUP,
  42.     IDC_DESCRIPTION_TEXT,           IDH_CLEANMGR_DESCRIPTION_GROUP,
  43.     IDC_DETAILS_BUTTON,             IDH_CLEANMGR_DETAILS_BUTTON,
  44.     IDC_WINDOWS_SETUP_ICON,         IDH_CLEANMGR_SETUP_GROUP,
  45.     IDC_WINDOWS_SETUP_GROUP,        IDH_CLEANMGR_SETUP_GROUP,
  46.     IDC_WINDOWS_SETUP_TEXT,         IDH_CLEANMGR_SETUP_GROUP,
  47.     IDC_WINDOWS_SETUP_BUTTON,       IDH_CLEANMGR_SETUP_BUTTON,
  48.     IDC_INSTALLED_PROGRAMS_ICON,    IDH_CLEANMGR_PROGRAMS_GROUP,
  49.     IDC_INSTALLED_PROGRAMS_GROUP,   IDH_CLEANMGR_PROGRAMS_GROUP,
  50.     IDC_INSTALLED_PROGRAMS_TEXT,    IDH_CLEANMGR_PROGRAMS_GROUP,
  51.     IDC_INSTALLED_PROGRAMS_BUTTON,  IDH_CLEANMGR_PROGRAMS_BUTTON,
  52.     IDC_FAT32_CONVERSION_ICON,      IDH_CLEANMGR_FAT32_GROUP,
  53.     IDC_FAT32_CONVERSION_GROUP,     IDH_CLEANMGR_FAT32_GROUP,
  54.     IDC_FAT32_CONVERSION_TEXT,      IDH_CLEANMGR_FAT32_GROUP,
  55.     IDC_FAT32_CONVERSION_BUTTON,    IDH_CLEANMGR_FAT32_BUTTON,
  56.     IDC_AUTO_LAUNCH,                IDH_CLEANMGR_AUTO_LAUNCH,
  57.     IDC_DRIVE_ICON_LOCATION,        ((DWORD)-1),
  58.     IDC_SETTINGS_DRIVE_TEXT,        ((DWORD)-1),
  59.     0, 0
  60. };
  61. /*
  62. **------------------------------------------------------------------------------
  63. ** Local function prototypes
  64. **------------------------------------------------------------------------------
  65. */
  66. BOOL CleanupMgrDlgInit     (HWND hDlg, LPARAM lParam);
  67. void CleanupMgrDlgCleanup  (HWND hDlg);
  68. BOOL CleanupMgrDlgCommand  (HWND hDlg, WPARAM wParam, LPARAM lParam);
  69. BOOL CleanupMgrDlgNotify   (HWND hDlg, UINT uiMessage, WPARAM wParam, LPARAM lParam);
  70. BOOL CleanupMgrDlgInitText (HWND hDlg);
  71. BOOL CleanupMgrDlgInitList (HWND hDlg);
  72. VOID UpdateTotalSpaceToBeFreed(HWND hDlg);
  73. INT_PTR CALLBACK MoreOptionsDlgProc(HWND hDlg, UINT Message, WPARAM wParam, LPARAM lParam);
  74. INT_PTR CALLBACK SettingsDlgProc(HWND hDlg, UINT Message, WPARAM wParam, LPARAM lParam);
  75. LPARAM ListView_GetItemData(HWND hwndList, int i)
  76. {
  77.     LVITEM lvi = {0};
  78.     lvi.iItem = i;
  79.     lvi.mask = LVIF_PARAM;
  80.     if ( ListView_GetItem(hwndList, &lvi) )
  81.     {
  82.         return lvi.lParam;
  83.     }
  84.     return NULL;
  85. }
  86. /*
  87. **------------------------------------------------------------------------------
  88. ** DisplayCleanMgrProperties
  89. **
  90. ** Purpose:    Creates the Cleanup Manager property sheet
  91. ** Parameters:
  92. **    hDlg     - Handle to dialog window
  93. **    lParam   - DWORD to pass onto the property pages
  94. ** Return:     1 if user pressed "OK"
  95. **             0 if user pressed "Cancel"
  96. ** Notes;
  97. ** Mod Log:    Created by Jason Cobb (7/97)
  98. **------------------------------------------------------------------------------
  99. */
  100. DWORD 
  101. DisplayCleanMgrProperties(
  102.     HWND    hWnd,
  103.     LPARAM  lParam
  104.     )
  105. {
  106.     DWORD           dwRet;
  107.     TCHAR           *psz;
  108.     PROPSHEETPAGE   psp;
  109.     PROPSHEETHEADER psh;
  110.     HPROPSHEETPAGE  hpsp[2];
  111.     CleanupMgrInfo * pcmi = (CleanupMgrInfo *)lParam;
  112.     if (pcmi == NULL)
  113.     {
  114.         //
  115.         //Error - passed in invalid CleanupMgrInfo info
  116.         //
  117.         return 0;
  118.     }
  119.     memset(&psh, 0, sizeof(PROPSHEETHEADER));
  120.     psp.dwSize = sizeof(PROPSHEETPAGE);
  121.     psp.dwFlags = PSP_DEFAULT | PSP_USETITLE;
  122.     psp.hInstance = g_hInstance;
  123.     psp.lParam = lParam;
  124.     psp.pszTitle = MAKEINTRESOURCE(IDS_DISKCLEANUP);
  125.     psp.pszTemplate = MAKEINTRESOURCE(IDD_DISK_CLEANER);
  126.     psp.pfnDlgProc = DiskCleanupManagerProc;
  127.     hpsp[0] = CreatePropertySheetPage(&psp);
  128.     if (!(pcmi->dwUIFlags & FLAG_SAGESET))
  129.     {
  130.         psp.pszTitle = MAKEINTRESOURCE(IDS_MOREOPTIONS);
  131.         psp.pszTemplate = MAKEINTRESOURCE(IDD_MORE_OPTIONS);
  132.         psp.pfnDlgProc = MoreOptionsDlgProc;
  133.         hpsp[1] = CreatePropertySheetPage(&psp);
  134. // commented out until after BEta 2
  135. //      psp.pszTitle = MAKEINTRESOURCE(IDS_SETTINGS);
  136. //      psp.pszTemplate = MAKEINTRESOURCE(IDD_SETTINGS);
  137. //      psp.pfnDlgProc = SettingsDlgProc;
  138. //      hpsp[2] = CreatePropertySheetPage(&psp);
  139. //      psh.nPages = 3;
  140.         psh.nPages = 2;
  141.         //
  142.         //Create the dialog title
  143.         //
  144.         psz = SHFormatMessage( MSG_APP_TITLE, pcmi->szVolName, pcmi->szRoot[0]); 
  145.     }
  146.     else
  147.     {
  148.         psh.nPages = 1;
  149.         //
  150.         //Create the dialog title
  151.         //
  152.         psz = SHFormatMessage( MSG_APP_SETTINGS_TITLE );
  153.     }
  154.     psh.dwSize = sizeof(PROPSHEETHEADER);
  155.     psh.dwFlags = PSH_NOAPPLYNOW | PSH_USEICONID;
  156.     psh.hInstance = g_hInstance;
  157.     psh.hwndParent = hWnd;
  158.     psh.pszIcon = MAKEINTRESOURCE(ICON_CLEANMGR);
  159.     psh.phpage = hpsp;
  160.     psh.pszCaption = psz;
  161.     dwRet = (DWORD)PropertySheet(&psh);
  162.     LocalFree(psz);
  163.     return dwRet;
  164. }
  165. /*
  166. **------------------------------------------------------------------------------
  167. ** DiskCleanupManagerProc
  168. **
  169. ** Purpose:    Dialog routine for Disk Cleanup Manager Property Sheet
  170. ** Parameters:
  171. **    hDlg     - Handle to dialog window
  172. **    uMessage - behavior type
  173. **    wParam   - depends on message
  174. **    lParam   - depends on message
  175. ** Return:     TRUE on sucess
  176. **             FALSE on failure
  177. ** Notes;
  178. ** Mod Log:    Created by Jason Cobb (2/97)
  179. **------------------------------------------------------------------------------
  180. */
  181. INT_PTR CALLBACK
  182. DiskCleanupManagerProc(
  183.     HWND   hDlg, 
  184.     UINT   uiMessage, 
  185.     WPARAM wParam, 
  186.     LPARAM lParam
  187.     )
  188. {
  189.     switch (uiMessage)
  190.     {
  191.         case WM_INITDIALOG:
  192.             return CleanupMgrDlgInit(hDlg, lParam);
  193.         case WM_DESTROY:
  194.             CleanupMgrDlgCleanup(hDlg);
  195.             break;
  196.         case WM_COMMAND:
  197.             return CleanupMgrDlgCommand(hDlg, wParam, lParam);
  198.         case WM_NOTIFY:
  199.             return CleanupMgrDlgNotify(hDlg, uiMessage, wParam, lParam);
  200.         case WM_HELP:
  201.             WinHelp((HWND)((LPHELPINFO) lParam)->hItemHandle, NULL,
  202.                     HELP_WM_HELP, (DWORD_PTR)(LPTSTR) aHelpIDs);
  203.             return TRUE;
  204.         case WM_CONTEXTMENU:
  205.             WinHelp((HWND) wParam, NULL, HELP_CONTEXTMENU,
  206.                     (DWORD_PTR)(LPVOID) aHelpIDs);
  207.             return TRUE;
  208.         case WM_SYSCOLORCHANGE:
  209.             SendMessage( GetDlgItem(hDlg, IDC_CLIENT_LIST), uiMessage, wParam, lParam);
  210.             break;
  211.     }
  212.     //Non-handled message
  213.     return FALSE;
  214. }
  215. /*
  216. **------------------------------------------------------------------------------
  217. ** CleanupMgrDlgInit
  218. **
  219. ** Purpose:    Handles dialog initialization
  220. ** Parameters:
  221. **    hDlg     - Handle to dialog window
  222. **    lParam   - Property Sheet pointer
  223. ** Return:     TRUE on sucess
  224. **             FALSE on failure
  225. ** Notes;
  226. ** Mod Log:    Created by Jason Cobb (2/97)
  227. **------------------------------------------------------------------------------
  228. */
  229. BOOL 
  230. CleanupMgrDlgInit(
  231.     HWND hDlg, 
  232.     LPARAM lParam
  233.     )
  234. {
  235.     LPPROPSHEETPAGE     lppsp;
  236.     
  237.     g_hDlg = hDlg;
  238.     //
  239.     //Make sure we have an invalid pointer to start out with
  240.     //
  241.     SetWindowLongPtr (hDlg, DWLP_USER, 0L);
  242.     //   
  243.     //Get the CleanupMgrInfo
  244.     //
  245.     lppsp = (LPPROPSHEETPAGE)lParam;
  246.     CleanupMgrInfo * pcmi = (CleanupMgrInfo *)lppsp->lParam;
  247.     if (pcmi == NULL)
  248.     {
  249.         //Error - passed in invalid CleanupMgrInfo info
  250.         return FALSE;
  251.     }
  252.     // now as we are becoming visible, we can dismiss the progress dialog
  253.     if ( pcmi->hAbortScanWnd )
  254.     {
  255.         pcmi->bAbortScan = TRUE;
  256.         //
  257.         //Wait for scan thread to finish
  258.         //  
  259.         WaitForSingleObject(pcmi->hAbortScanThread, INFINITE);
  260.         pcmi->bAbortScan = FALSE;
  261.     }
  262.     //
  263.     //Save pointer to CleanupMgrInfo object
  264.     //
  265.     SetWindowLongPtr(hDlg, DWLP_USER, (LPARAM)pcmi);
  266.     //
  267.     //Initialize all text
  268.     //
  269.     if (!CleanupMgrDlgInitText(hDlg))
  270.         goto HAS_ERROR;
  271.     //
  272.     //Initialize the icon
  273.     //
  274.     SendDlgItemMessage(hDlg,IDC_DRIVE_ICON_LOCATION,STM_SETICON,(WPARAM)pcmi->hDriveIcon,0);
  275.     //
  276.     //If we are in SAGE settings mode then hide the total amount of space text
  277.     //
  278.     if (pcmi->dwUIFlags & FLAG_SAGESET)
  279.     {
  280.         ShowWindow(GetDlgItem(hDlg, IDC_TOTAL_SPACE_DESCRIPTION), SW_HIDE);
  281.         ShowWindow(GetDlgItem(hDlg, IDC_TOTAL_SPACE_TEXT), SW_HIDE);
  282.     }
  283.     //
  284.     //Initialize the list box (all of the cleanup clients)
  285.     //
  286.     if (!CleanupMgrDlgInitList(hDlg))
  287.         goto HAS_ERROR;    
  288.     return TRUE;
  289. HAS_ERROR:
  290.     //  
  291.     //Delete any memory structures still hanging around
  292.     //
  293.     CleanupMgrDlgCleanup (hDlg);
  294.     return FALSE;
  295. }
  296. /*
  297. **------------------------------------------------------------------------------
  298. ** CleanupMgrDlgCleanup
  299. **
  300. ** Purpose:    
  301. ** Parameters:
  302. ** Notes;
  303. ** Mod Log:    Created by Jason Cobb (2/97)
  304. **------------------------------------------------------------------------------
  305. */
  306. void 
  307. CleanupMgrDlgCleanup(
  308.     HWND hDlg
  309.     )
  310. {
  311.     //
  312.     //Make sure we have a valid parameter
  313.     //
  314.     if (!hDlg)
  315.         return;
  316.     //
  317.     //Hide the window right away since we might block waiting for a 
  318.     //COM client to finish.
  319.     //
  320.     ShowWindow(hDlg, SW_HIDE);
  321.     g_hDlg = NULL;
  322. }
  323. /*
  324. **------------------------------------------------------------------------------
  325. ** CleanupMgrWarningPrompt
  326. **
  327. ** Purpose:    Asks the user if they are sure they want to delete the files
  328. ** Parameters:
  329. **    hDlg     - Handle to dialog window
  330. ** Return:     TRUE if user says YES
  331. **             FALSE if user says NO
  332. ** Notes;
  333. ** Mod Log:    Created by Jason Cobb (6/97)
  334. **------------------------------------------------------------------------------
  335. */
  336. BOOL
  337. CleanupMgrWarningPrompt(
  338.     HWND hDlg
  339.     )
  340. {
  341.     TCHAR   szWarning[256];
  342.     TCHAR   *pszWarningTitle;
  343.     int     i;
  344.     BOOL    bItemSelected = FALSE;
  345.     //
  346.     //First verify that at least one item is selected.  If no items are selected then
  347.     //nothing will be deleted so we don't need to bother prompting the user.
  348.     //
  349.     CleanupMgrInfo * pcmi = GetCleanupMgrInfoPointer(hDlg);
  350.     if (pcmi == NULL)
  351.         return TRUE;
  352.     for (i=0; i<pcmi->iNumVolumeCacheClients; i++)
  353.     {
  354.         if (pcmi->pClientInfo[i].bSelected == TRUE)
  355.         {
  356.             bItemSelected = TRUE;
  357.             break;
  358.         }
  359.     }        
  360.     if (bItemSelected)
  361.     {
  362.         LoadString(g_hInstance, IDS_DELETEWARNING, szWarning, sizeof(szWarning));
  363.         pszWarningTitle = SHFormatMessage( MSG_APP_TITLE, pcmi->szVolName, pcmi->szRoot[0]);
  364.         if (MessageBox(hDlg, szWarning, pszWarningTitle, MB_YESNO | MB_ICONQUESTION) == IDYES)
  365.         {
  366.             LocalFree(pszWarningTitle);
  367.             return TRUE;
  368.         }
  369.         else
  370.         {
  371.             LocalFree(pszWarningTitle);
  372.             return FALSE;
  373.         }
  374.     }
  375.     //
  376.     //No items are selected so just return TRUE since nothing will be deleted.
  377.     //
  378.     return TRUE;
  379. }
  380. /*
  381. **------------------------------------------------------------------------------
  382. ** CleanupMgrDlgCommand
  383. **
  384. ** Purpose:    Handles command messages
  385. ** Parameters:
  386. **    hDlg     - Handle to dialog window
  387. **    wParam   - depends on command
  388. **    lParam   - depends on command
  389. ** Return:     TRUE on sucess
  390. **             FALSE on failure
  391. ** Notes;
  392. ** Mod Log:    Created by Jason Cobb (2/97)
  393. **------------------------------------------------------------------------------
  394. */
  395. BOOL CleanupMgrDlgCommand(HWND hDlg, WPARAM wParam, LPARAM lParam)
  396. {
  397.     WORD wID = LOWORD(wParam);
  398.     if ( IDC_DETAILS_BUTTON == wID )
  399.     {
  400.         HWND    hWndList = GetDlgItem(hDlg, IDC_CLIENT_LIST);
  401.         int     wIndex;
  402.         wIndex = ListView_GetNextItem(hWndList, -1, LVNI_SELECTED);
  403.         if (-1 != wIndex)
  404.         {
  405.             PCLIENTINFO pClientInfo = (PCLIENTINFO)ListView_GetItemData(hWndList,wIndex);
  406.             if ( pClientInfo )
  407.             {
  408.                 pClientInfo->pVolumeCache->ShowProperties(hDlg);
  409.             }
  410.         }
  411.     }
  412.     return 0;
  413. }
  414. /*
  415. **------------------------------------------------------------------------------
  416. ** CleanupMgrDlgNotify
  417. **
  418. ** Purpose:    Handles notify messages
  419. ** Parameters:
  420. **    hDlg     - Handle to dialog window
  421. **    wParam   - depends on command
  422. **    lParam   - depends on command
  423. ** Return:     TRUE on sucess
  424. **             FALSE on failure
  425. ** Notes;
  426. ** Mod Log:    Created by Jason Cobb (7/97)
  427. **------------------------------------------------------------------------------
  428. */
  429. BOOL 
  430. CleanupMgrDlgNotify(
  431.     HWND hDlg, 
  432.     UINT uiMessage,
  433.     WPARAM wParam, 
  434.     LPARAM lParam
  435.     )
  436. {
  437.     CleanupMgrInfo  *pcmi;
  438.     LPNMHDR pnmhdr = (LPNMHDR)lParam;
  439.     if (IDC_CLIENT_LIST == pnmhdr->idFrom)
  440.     {
  441.         // a list view notification
  442.         #define pnmlv ((LPNMLISTVIEW)pnmhdr)
  443.         switch (pnmhdr->code)
  444.         {
  445.             case LVN_ITEMCHANGED:
  446.                 if ( pnmlv->uChanged & LVIF_STATE )
  447.                 {
  448.                     LVITEM lvi;
  449.                     lvi.iItem = pnmlv->iItem;
  450.                     lvi.iSubItem = pnmlv->iSubItem;
  451.                     lvi.mask = LVIF_PARAM;
  452.                     ListView_GetItem( pnmhdr->hwndFrom, &lvi );
  453.                     PCLIENTINFO pClientInfo = (PCLIENTINFO)lvi.lParam;
  454.                     // check if an item was selected
  455.                     if ( pnmlv->uNewState & LVIS_SELECTED )
  456.                     {
  457.                         if (pClientInfo->wcsDescription)
  458.                         {
  459.                             TCHAR szDescription[DESCRIPTION_LENGTH];
  460.                             SHUnicodeToTChar(pClientInfo->wcsDescription, szDescription, ARRAYSIZE( szDescription ));
  461.                             SetDlgItemText(hDlg, IDC_DESCRIPTION_TEXT, szDescription);
  462.                         }
  463.                         else
  464.                         {
  465.                             SetDlgItemText(hDlg, IDC_DESCRIPTION_TEXT, TEXT(""));
  466.                         }
  467.                         //
  468.                         //Show or Hide the Settings button
  469.                         //
  470.                         if (pClientInfo->dwInitializeFlags & EVCF_HASSETTINGS)
  471.                         {
  472.                             TCHAR szButton[BUTTONTEXT_LENGTH];
  473.                             SHUnicodeToTChar(pClientInfo->wcsAdvancedButtonText, szButton, ARRAYSIZE( szButton ));
  474.                             SetDlgItemText(hDlg, IDC_DETAILS_BUTTON, szButton);
  475.                             ShowWindow(GetDlgItem(hDlg, IDC_DETAILS_BUTTON), SW_SHOW);
  476.                         }
  477.                         else
  478.                         {
  479.                             ShowWindow(GetDlgItem(hDlg, IDC_DETAILS_BUTTON), SW_HIDE);
  480.                         }
  481.                     }
  482.                     // Check if the state image changed.  This results from checking or unchecking
  483.                     // one of the list view checkboxes.
  484.                     if ((pnmlv->uNewState ^ pnmlv->uOldState) & LVIS_STATEIMAGEMASK)
  485.                     {
  486.                         if ( !g_bIgnoreCheckStateChanges )
  487.                         {
  488.                             pClientInfo->bSelected = ListView_GetCheckState( pnmhdr->hwndFrom, pnmlv->iItem );
  489.                             UpdateTotalSpaceToBeFreed(hDlg);
  490.                         }
  491.                     }
  492.                 }
  493.                 break;
  494.         }
  495.     }
  496.     else
  497.     {
  498.         // must be a property sheet notification
  499.         switch(pnmhdr->code)
  500.         {
  501.             case PSN_RESET:
  502.                 pcmi = GetCleanupMgrInfoPointer(hDlg);
  503.                 pcmi->bPurgeFiles = FALSE;
  504.                 break;
  505.             case PSN_APPLY:
  506.                 pcmi = GetCleanupMgrInfoPointer(hDlg);
  507.                 if (!(pcmi->dwUIFlags & FLAG_SAGESET) && !CleanupMgrWarningPrompt(hDlg))
  508.                     pcmi->bPurgeFiles = FALSE;
  509.                 else
  510.                     pcmi->bPurgeFiles = TRUE;
  511.                 break;
  512.         }
  513.     }
  514.     return FALSE;
  515. }
  516. /*
  517. **------------------------------------------------------------------------------
  518. ** CleanupMgrDlgInitText
  519. **
  520. ** Purpose:    
  521. ** Parameters:
  522. **    hDlg     - Handle to dialog window
  523. ** Return:     TRUE on sucess
  524. **             FALSE on failure
  525. ** Notes;
  526. ** Mod Log:    Created by Jason Cobb (2/97)
  527. **------------------------------------------------------------------------------
  528. */
  529. BOOL 
  530. CleanupMgrDlgInitText(
  531.     HWND hDlg
  532.     )
  533. {
  534.     if (hDlg == NULL)
  535.         return FALSE;
  536.     //
  537.     // Step 1. Get pointers to Info structures
  538.     //
  539.     CleanupMgrInfo * pcmi = GetCleanupMgrInfoPointer(hDlg);
  540.     if (pcmi == NULL)
  541.         return FALSE;
  542.     if (pcmi->dre == Drive_INV)
  543.         return FALSE;
  544.     // 
  545.     // Step 2. Extract useful info
  546.     //
  547.     //
  548.     //get vol name   
  549.     //
  550.     TCHAR * pszVolName = pcmi->szVolName;
  551.     if (pszVolName == NULL)
  552.         pszVolName = TEXT("");
  553.     //  
  554.     //get drive letter
  555.     //
  556.     TCHAR chDrive = pcmi->dre + 'A';
  557.     //
  558.     // Step 3. Initialize text
  559.     //
  560.       
  561.     //
  562.     //Set header
  563.     //
  564.     if (pcmi->dwUIFlags & FLAG_SAGESET)
  565.     {
  566.         TCHAR * psz;
  567.         psz = SHFormatMessage( MSG_INTRO_SETTINGS_TEXT );
  568.         SetDlgItemText (hDlg, IDC_INTRO_TEXT, psz);
  569.         LocalFree(psz);
  570.     }
  571.     else
  572.     {
  573.         TCHAR * psz;
  574.         TCHAR * pszDrive;
  575.         TCHAR szBuffer[50];
  576.         
  577.         pszDrive = SHFormatMessage( MSG_VOL_NAME_DRIVE_LETTER, pszVolName, chDrive);
  578.         StrFormatKBSize(pcmi->cbEstCleanupSpace.QuadPart, szBuffer, ARRAYSIZE( szBuffer ));
  579.         psz = SHFormatMessage( MSG_INTRO_TEXT, pszDrive, szBuffer);
  580.         SetDlgItemText (hDlg, IDC_INTRO_TEXT, psz);
  581.         LocalFree(pszDrive);
  582.         LocalFree(psz);
  583.     }
  584.     return TRUE;
  585. }
  586. /*
  587. **------------------------------------------------------------------------------
  588. ** UpdateTotalSpaceToBeFreed
  589. **
  590. ** Purpose:    
  591. ** Parameters:
  592. **    hDlg     - Handle to dialog window
  593. ** Return:     NONE
  594. ** Notes;
  595. ** Mod Log:    Created by Jason Cobb (7/97)
  596. **------------------------------------------------------------------------------
  597. */
  598. VOID UpdateTotalSpaceToBeFreed(HWND hDlg)
  599. {
  600.     int             i;
  601.     ULARGE_INTEGER  TotalSpaceToFree;
  602.     TotalSpaceToFree.QuadPart = 0;
  603.     
  604.     if (hDlg == NULL)
  605.         return;
  606.     CleanupMgrInfo * pcmi = GetCleanupMgrInfoPointer(hDlg);
  607.     if (pcmi == NULL)
  608.         return;
  609.     if (pcmi->dre == Drive_INV)
  610.         return;
  611.     //
  612.     //Calculate the total space to be freed by adding up the dwUsedSpace value
  613.     //on all of the selected clients
  614.     //
  615.     for (i=0; i<pcmi->iNumVolumeCacheClients; i++)
  616.     {
  617.         if (pcmi->pClientInfo[i].bSelected)
  618.         {
  619.             TotalSpaceToFree.QuadPart += pcmi->pClientInfo[i].dwUsedSpace.QuadPart;
  620.         }
  621.     }        
  622.     //
  623.     //Display the total space to be freed
  624.     //
  625.     TCHAR szBuffer[10];
  626.     StrFormatKBSize(TotalSpaceToFree.QuadPart, szBuffer, ARRAYSIZE( szBuffer ));
  627.     SetDlgItemText(hDlg, IDC_TOTAL_SPACE_TEXT, szBuffer);
  628. }
  629. /*
  630. **------------------------------------------------------------------------------
  631. ** CleanupMgrDlgInitList
  632. **
  633. ** Purpose:    
  634. ** Parameters:
  635. **    hDlg     - Handle to dialog window
  636. ** Return:     TRUE on sucess
  637. **             FALSE on failure
  638. ** Notes;
  639. ** Mod Log:    Created by Jason Cobb (2/97)
  640. **------------------------------------------------------------------------------
  641. */
  642. #define NAME_COL_PERCENT    80
  643. #define SIZE_COL_PERCENT    20
  644. BOOL CleanupMgrDlgInitList(HWND hDlg)
  645. {
  646.     int i;
  647.     
  648.     if (hDlg == NULL)
  649.         return FALSE;
  650.     CleanupMgrInfo * pcmi = GetCleanupMgrInfoPointer(hDlg);
  651.     if (pcmi == NULL)
  652.         return FALSE;
  653.     if (pcmi->dre == Drive_INV)
  654.         return FALSE;
  655.         
  656.     HWND hwndList = GetDlgItem(hDlg, IDC_CLIENT_LIST);
  657.     RECT rc;
  658.     GetClientRect(hwndList, &rc);
  659.     int cxList = rc.right - GetSystemMetrics(SM_CXVSCROLL);
  660.     // I have no idea what all this TUNEUP and SAGESET crap means, but the old code
  661.     // only drew the sizes if the following condition was true.  As such, I'm only
  662.     // showing the size column if the same condition is true:
  663.     BOOL bShowTwoCols = (!(pcmi->dwUIFlags & FLAG_TUNEUP) && !(pcmi->dwUIFlags & FLAG_SAGESET));
  664.     LVCOLUMN lvc;
  665.     lvc.mask = LVCF_SUBITEM | LVCF_WIDTH;
  666.     lvc.iSubItem = 0;
  667.     lvc.cx = bShowTwoCols ? MulDiv(cxList, NAME_COL_PERCENT, 100) : cxList;
  668.     ListView_InsertColumn( hwndList, 0, &lvc );
  669.     if ( bShowTwoCols )
  670.     {
  671.         lvc.mask = LVCF_SUBITEM | LVCF_WIDTH | LVCF_FMT;
  672.         lvc.iSubItem = 1;
  673.         lvc.cx = MulDiv(cxList, SIZE_COL_PERCENT, 100);
  674.         lvc.fmt = LVCFMT_RIGHT;
  675.         ListView_InsertColumn( hwndList, 1, &lvc );
  676.     }
  677.     HIMAGELIST himg = ImageList_Create(16, 16, ILC_COLOR|ILC_MASK, 4, 4);
  678.     ListView_SetImageList(hwndList, himg, LVSIL_SMALL );
  679.     ListView_SetExtendedListViewStyleEx(hwndList, LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT, LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT);
  680.     // When we add an item to the listview the listview code always initializes the item to the unchecked
  681.     // state.  It then fires a WM_NOTIFY telling us the state changed to "off" which causes us to nuke our
  682.     // bSelected value.  As such we need to ignore state image changes during the addition of list view
  683.     // items so that we can preserve our bSelected state.
  684.     g_bIgnoreCheckStateChanges = TRUE;
  685.     for (i=0; i<pcmi->iNumVolumeCacheClients; i++)
  686.     {
  687.         if ((pcmi->pClientInfo[i].pVolumeCache != NULL) &&
  688.             (pcmi->pClientInfo[i].wcsDisplayName != NULL) &&
  689.             (pcmi->pClientInfo[i].bShow == TRUE))
  690.         {
  691.             LPTSTR      lpszDisplayName;
  692.             ULONG cb;
  693.             cb = WideCharToMultiByte(CP_ACP, 0, pcmi->pClientInfo[i].wcsDisplayName, -1, NULL, 0, NULL, NULL);
  694.             if ((lpszDisplayName = (LPTSTR)LocalAlloc(LPTR, (cb + 1) * sizeof( TCHAR ))) != NULL)
  695.             {
  696. #ifdef UNICODE
  697.                 StrCpyN( lpszDisplayName, pcmi->pClientInfo[i].wcsDisplayName, cb );
  698. #else
  699.                 //
  700.                 //Convert UNICODE display name to ANSI and then add it to the list
  701.                 //
  702.                 WideCharToMultiByte(CP_ACP, 0, pcmi->pClientInfo[i].wcsDisplayName, -1, lpszDisplayName, cb, NULL, NULL);
  703. #endif
  704.                 //
  705.                 //Determine where in the list this item should go.
  706.                 //
  707.                 int iSortedPossition;
  708.                 int totalSoFar = ListView_GetItemCount(hwndList);
  709.                 for (iSortedPossition=0; iSortedPossition<totalSoFar; iSortedPossition++)
  710.                 {
  711.                     PCLIENTINFO pClientInfo = (PCLIENTINFO)ListView_GetItemData(hwndList, iSortedPossition);
  712.                     if (!pClientInfo | (pcmi->pClientInfo[i].dwPriority < pClientInfo->dwPriority))
  713.                         break;
  714.                 }
  715.                 //
  716.                 //Insert this item at index j in the list
  717.                 //
  718.                 LVITEM lvi = {0};
  719.                 lvi.mask = LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE;
  720.                 lvi.iItem = iSortedPossition;
  721.                 lvi.iSubItem = 0;
  722.                 lvi.pszText = lpszDisplayName;
  723.                 lvi.lParam = (LPARAM)&(pcmi->pClientInfo[i]);
  724.                 lvi.iImage = ImageList_AddIcon(himg, pcmi->pClientInfo[i].hIcon);
  725.                 
  726.                 iSortedPossition = ListView_InsertItem(hwndList, &lvi);
  727.                 if (bShowTwoCols)
  728.                 {
  729.                     TCHAR szBuffer[10];
  730.                     StrFormatKBSize(pcmi->pClientInfo[i].dwUsedSpace.QuadPart, szBuffer, ARRAYSIZE( szBuffer ));
  731.                     ListView_SetItemText( hwndList, iSortedPossition, 1, szBuffer );
  732.                 }
  733.                 // Set the initial check state.  We can't do this when we add the item because the
  734.                 // list view code specifically ingores your State Image Flags if you have the
  735.                 // LVS_EX_CHECKBOX style set, which we do.
  736.                 ListView_SetCheckState( hwndList, iSortedPossition, pcmi->pClientInfo[i].bSelected );
  737.                 LocalFree( lpszDisplayName );
  738.             }
  739.         }
  740.     }        
  741.     g_bIgnoreCheckStateChanges = FALSE;
  742.     UpdateTotalSpaceToBeFreed(hDlg);
  743.     ListView_SetItemState(hwndList, 0, LVIS_SELECTED, LVIS_SELECTED);
  744.     return TRUE;
  745. }
  746. INT_PTR CALLBACK
  747. MoreOptionsDlgProc(
  748.     HWND hDlg,
  749.     UINT Message,
  750.     WPARAM wParam,
  751.     LPARAM lParam
  752.     )
  753. {
  754.     LPPROPSHEETPAGE     lppsp;
  755.     CleanupMgrInfo      *pcmi;
  756.     TCHAR               szCommandLine[MAX_PATH];
  757.     STARTUPINFO         startupinfo;
  758.     PROCESS_INFORMATION processinformation;
  759.     
  760.     switch(Message)
  761.     {
  762.         case WM_INITDIALOG:
  763.             //
  764.             //Disable FAT32 conversion if this drive is already FAT32
  765.             //
  766.             lppsp = (LPPROPSHEETPAGE)lParam;
  767.             pcmi = (CleanupMgrInfo *)lppsp->lParam;
  768.             if (pcmi == NULL)
  769.             {
  770.                 //Error - passed in invalid CleanupMgrInfo info
  771.                 return FALSE;
  772.             }
  773. #ifndef WINNT
  774.             if (lstrcmpi(pcmi->szFileSystem, TEXT("FAT32")) == 0)
  775.             {
  776.                 EnableWindow(GetDlgItem(hDlg, IDC_FAT32_CONVERSION_GROUP), FALSE);
  777.                 ShowWindow(GetDlgItem(hDlg, IDC_FAT32_CONVERSION_ICON), SW_HIDE);
  778.                 EnableWindow(GetDlgItem(hDlg, IDC_FAT32_CONVERSION_TEXT), FALSE);
  779.                 EnableWindow(GetDlgItem(hDlg, IDC_FAT32_CONVERSION_BUTTON), FALSE);
  780.             }
  781. #endif
  782.             break;
  783.         case WM_COMMAND:
  784.             switch(LOWORD(wParam))
  785.             {
  786.                 case IDC_WINDOWS_SETUP_BUTTON:
  787.                     {
  788.                         TCHAR szSysDir[MAX_PATH];
  789.                         if ( GetSystemDirectory(szSysDir, ARRAYSIZE(szSysDir)) )
  790.                         {
  791.                             TCHAR szParam[MAX_PATH];
  792.                             wsprintf(szParam, SZ_WINDOWS_SETUP, szSysDir );
  793.                             ShellExecute(NULL, NULL, SZ_SYSOCMGR, szParam, NULL, SW_SHOWNORMAL);
  794.                         }
  795.                     }
  796.                     break;
  797.                 case IDC_INSTALLED_PROGRAMS_BUTTON:
  798.                     ShellExecute(NULL, NULL, SZ_RUNDLL32, SZ_INSTALLED_PROGRAMS, NULL, SW_SHOWNORMAL);
  799.                     break;
  800. #ifndef WINNT
  801.                 case IDC_FAT32_CONVERSION_BUTTON:
  802.                     GetWindowsDirectory(szCommandLine, sizeof(szCommandLine));
  803.                     lstrcat(szCommandLine, SZ_CVT1);
  804.                     memset(&startupinfo, 0, sizeof(STARTUPINFO));
  805.                     startupinfo.cb = sizeof(STARTUPINFO);
  806.                     memset(&processinformation, 0, sizeof(PROCESS_INFORMATION));
  807.                     
  808.                     if ( CreateProcess(szCommandLine, NULL, NULL, NULL, FALSE, 0, NULL, NULL,
  809.                         &startupinfo, &processinformation))
  810.                     {
  811.                         CloseHandle( processinformation.hProcess );
  812.                         CloseHandle( processinformation.hThread );
  813.                     }
  814.                     break;
  815. #endif
  816.             }
  817.             break;
  818.         case WM_HELP:
  819.             WinHelp((HWND)((LPHELPINFO) lParam)->hItemHandle, NULL,
  820.                     HELP_WM_HELP, (DWORD_PTR)(LPTSTR) aHelpIDs);
  821.             return TRUE;
  822.         case WM_CONTEXTMENU:
  823.             WinHelp((HWND) wParam, NULL, HELP_CONTEXTMENU,
  824.                     (DWORD_PTR)(LPVOID) aHelpIDs);
  825.             return TRUE;
  826.         default:
  827.             return FALSE;
  828.     }
  829.     return TRUE;
  830. }
  831. INT_PTR CALLBACK
  832. SettingsDlgProc(
  833.     HWND hDlg,
  834.     UINT Message,
  835.     WPARAM wParam,
  836.     LPARAM lParam
  837.     )
  838. {
  839.     LPPROPSHEETPAGE lppsp;
  840.     CleanupMgrInfo *pcmi;
  841.     DWORD dwType, cbBytes;
  842.     DWORD dwLDSDisable;
  843.     HKEY hk;
  844.     
  845.     switch(Message)
  846.     {
  847.         case WM_INITDIALOG:
  848.         {
  849.             TCHAR * psz;
  850.             hardware hwType;
  851.             lppsp = (LPPROPSHEETPAGE)lParam;
  852.             pcmi = (CleanupMgrInfo *)lppsp->lParam;
  853.             if (pcmi == NULL)
  854.             {
  855.                 //Error - passed in invalid CleanupMgrInfo info
  856.                 return FALSE;
  857.             }
  858.             //
  859.             //Save pointer to CleanupMgrInfo object
  860.             //
  861.             SetWindowLongPtr(hDlg, DWLP_USER, (LPARAM)pcmi);
  862.             TCHAR * pszVolName = pcmi->szVolName;
  863.             if (pszVolName == NULL)
  864.                 pszVolName = TEXT("");
  865.             TCHAR chDrive = pcmi->dre + TCHAR('A');
  866.             psz = SHFormatMessage( MSG_INTRO_SETTINGS_TAB, pszVolName, chDrive );
  867.             SetDlgItemText (hDlg, IDC_SETTINGS_DRIVE_TEXT, psz);
  868.             LocalFree(psz);
  869.             //
  870.             //Initialize the icon
  871.             //
  872.             SendDlgItemMessage(hDlg,IDC_DRIVE_ICON_LOCATION,STM_SETICON,(WPARAM)pcmi->hDriveIcon,0);
  873.             //
  874.             //Initialize the auto launch check box
  875.             //
  876.             if (RegOpenKey(HKEY_LOCAL_MACHINE, REGSTR_PATH_FILESYSTEM, &hk) == ERROR_SUCCESS)
  877.             {
  878.                 dwLDSDisable = 0;
  879.                 dwType = REG_DWORD;
  880.                 cbBytes = sizeof(dwLDSDisable);
  881.                 RegQueryValueEx(hk, REGSTR_VAL_DRIVE_LDS_BDCAST_DISABLE, NULL, 
  882.                     &dwType, (LPBYTE)&dwLDSDisable, &cbBytes);
  883.                 if (dwLDSDisable & (0x01 << pcmi->dre))
  884.                     CheckDlgButton(hDlg, IDC_AUTO_LAUNCH, 0);
  885.                 else
  886.                     CheckDlgButton(hDlg, IDC_AUTO_LAUNCH, 1);
  887.                 RegCloseKey(hk);
  888.             }
  889.             //
  890.             //Gray out the auto launch option if this is not a fixed disk
  891.             //
  892.             if (!GetHardwareType(pcmi->dre, hwType) ||
  893.                 (hwType != hwFixed))
  894.             {
  895.                 CheckDlgButton(hDlg, IDC_AUTO_LAUNCH, 0);
  896.                 EnableWindow(GetDlgItem(hDlg, IDC_AUTO_LAUNCH), FALSE);
  897.             }
  898.         }
  899.             break;
  900.         case WM_NOTIFY:
  901.             switch(((NMHDR *)lParam)->code)
  902.             {
  903.                 case PSN_APPLY:
  904.                     pcmi = (CleanupMgrInfo *)GetWindowLongPtr (hDlg, DWLP_USER);
  905.                     if (RegOpenKey(HKEY_LOCAL_MACHINE, REGSTR_PATH_FILESYSTEM, &hk) == ERROR_SUCCESS)
  906.                     {
  907.                         dwLDSDisable = 0;
  908.                         dwType = REG_DWORD;
  909.                         cbBytes = sizeof(dwLDSDisable);
  910.                         RegQueryValueEx(hk, REGSTR_VAL_DRIVE_LDS_BDCAST_DISABLE, NULL, 
  911.                                 &dwType, (LPBYTE)&dwLDSDisable, &cbBytes);
  912.                         if (IsDlgButtonChecked(hDlg, IDC_AUTO_LAUNCH))
  913.                         {
  914.                             dwLDSDisable &= ~(0x01 << pcmi->dre);
  915.                         }
  916.                         else
  917.                         {
  918.                             dwLDSDisable |= (0x01 << pcmi->dre);
  919.                         }
  920.                         
  921.                         RegSetValueEx(hk, REGSTR_VAL_DRIVE_LDS_BDCAST_DISABLE, 0, REG_DWORD,
  922.                             (LPBYTE)&dwLDSDisable, sizeof(dwLDSDisable));
  923.                             
  924.                         RegCloseKey(hk);
  925.                     }
  926.                     break;
  927.                 case PSN_RESET:
  928.                     break;
  929.             }
  930.             break;
  931.         case WM_HELP:
  932.             WinHelp((HWND)((LPHELPINFO) lParam)->hItemHandle, NULL,
  933.                     HELP_WM_HELP, (DWORD_PTR)(LPTSTR) aHelpIDs);
  934.             return TRUE;
  935.         case WM_CONTEXTMENU:
  936.             WinHelp((HWND) wParam, NULL, HELP_CONTEXTMENU,
  937.                     (DWORD_PTR)(LPVOID) aHelpIDs);
  938.             return TRUE;
  939.         default:
  940.             return FALSE;
  941.     }
  942.     return TRUE;
  943. }