--- /dev/null
+#include "Unfrag.h"\r
+#include "MainDialog.h"\r
+#include "resource.h"\r
+#include "Fraginator.h"\r
+#include "Defragment.h"\r
+#include "ReportDialog.h"\r
+\r
+\r
+vector<wstring> DrivesList;\r
+LRESULT AnalyzeID;\r
+LRESULT FastID;\r
+LRESULT ExtensiveID;\r
+bool QuitWhenDone;\r
+bool Stopping;\r
+\r
+\r
+LRESULT PriHighID;\r
+LRESULT PriAboveNormID;\r
+LRESULT PriNormalID;\r
+LRESULT PriBelowNormID;\r
+LRESULT PriIdleID;\r
+\r
+\r
+static void InitDialog (HWND Dlg);\r
+void UpdateDefragInfo (HWND Dlg);\r
+void UpdatePriority (HWND Dlg);\r
+wstring GetDefaultTitle (void);\r
+wstring GetDefragTitle (void);\r
+void SetDisables (HWND Dlg);\r
+INT_PTR CALLBACK MainDialogProc (HWND Dlg, UINT Msg, WPARAM WParam, LPARAM LParam);\r
+\r
+\r
+static void InitDialog (HWND Dlg)\r
+{\r
+ // Make internal list\r
+ DWORD DriveMask;\r
+ HWND DlgItem;\r
+ size_t d;\r
+\r
+ // Clear out wisecracks line for now\r
+ SetDlgItemText (Dlg, IDC_WISECRACKS, L"\"Defrag, baby!\"");\r
+\r
+ // Make list of logical drives\r
+ DrivesList.resize (0);\r
+ DriveMask = GetLogicalDrives ();\r
+\r
+ for (d = 0; d < 26; d++)\r
+ {\r
+ if (DriveMask & (1 << d))\r
+ {\r
+ wstring Name;\r
+\r
+ Name = (wchar_t)(L'A' + d);\r
+ Name += L':';\r
+ DrivesList.push_back (Name);\r
+ }\r
+ }\r
+\r
+ // Give list to dropdown list\r
+ DlgItem = GetDlgItem (Dlg, IDC_DRIVES_LIST);\r
+ SendMessage (DlgItem, CB_RESETCONTENT, 0, 0);\r
+ for (d = 0; d < DrivesList.size(); d++)\r
+ {\r
+ SendMessage (DlgItem, CB_ADDSTRING, 0, (LPARAM) DrivesList[d].c_str());\r
+ }\r
+\r
+ // Put in defrag methods\r
+ DlgItem = GetDlgItem (Dlg, IDC_METHODS_LIST);\r
+ SendMessage (DlgItem, CB_RESETCONTENT, 0, 0);\r
+ AnalyzeID = SendMessage (DlgItem, CB_ADDSTRING, 0, (LPARAM) L"Analyze Only");\r
+ FastID = SendMessage (DlgItem, CB_ADDSTRING, 0, (LPARAM) L"Fast Defrag");\r
+ ExtensiveID = SendMessage (DlgItem, CB_ADDSTRING, 0, (LPARAM) L"Extensive Defrag");\r
+\r
+ // Set up process priorities\r
+ DlgItem = GetDlgItem (Dlg, IDC_PRIORITY_LIST);\r
+ SendMessage (Dlg, CB_RESETCONTENT, 0, 0);\r
+ PriHighID = SendMessage (DlgItem, CB_ADDSTRING, 0, (LPARAM) L"High");\r
+ PriAboveNormID = SendMessage (DlgItem, CB_ADDSTRING, 0, (LPARAM) L"Above Normal");\r
+ PriNormalID = SendMessage (DlgItem, CB_ADDSTRING, 0, (LPARAM) L"Normal");\r
+ PriBelowNormID = SendMessage (DlgItem, CB_ADDSTRING, 0, (LPARAM) L"Below Normal");\r
+ PriIdleID = SendMessage (DlgItem, CB_ADDSTRING, 0, (LPARAM) L"Idle");\r
+ UpdatePriority (Dlg);\r
+\r
+ // Reset texts and progress meters\r
+ SendDlgItemMessage (Dlg, IDC_STATUS, WM_SETTEXT, 0, (LPARAM) L"");\r
+ SendDlgItemMessage (Dlg, IDC_PERCENT, WM_SETTEXT, 0, (LPARAM) L"");\r
+ SendDlgItemMessage (Dlg, IDC_PROGRESS, PBM_SETRANGE, 0, MAKELPARAM (0, 10000));\r
+ SendDlgItemMessage (Dlg, IDC_PROGRESS, PBM_SETPOS, 0, 0);\r
+\r
+ return;\r
+}\r
+\r
+\r
+void UpdateDefragInfo (HWND Dlg)\r
+{\r
+ wchar_t PercentText[100];\r
+ static double OldPercent = 200.0f;\r
+ static wstring OldStatus = L"Non";\r
+ wstring NewStatus;\r
+ double NewPercent;\r
+\r
+ if (Defrag == NULL)\r
+ return;\r
+\r
+ NewPercent = Defrag->GetStatusPercent ();\r
+ if (NewPercent > 100.0f)\r
+ NewPercent = 100.0f;\r
+ if (NewPercent < 0.0f)\r
+ NewPercent = 0.0f;\r
+ if (NewPercent != OldPercent)\r
+ {\r
+ swprintf (PercentText, L"%6.2f%%", NewPercent);\r
+ SendDlgItemMessage (Dlg, IDC_PERCENT, WM_SETTEXT, 0, (LPARAM) PercentText);\r
+ SendDlgItemMessage (Dlg, IDC_PROGRESS, PBM_SETPOS,\r
+ (WPARAM) (int)(NewPercent * 100.0f), 0);\r
+ OldPercent = NewPercent;\r
+ }\r
+\r
+ NewStatus = Defrag->GetStatusString ();\r
+ if (NewStatus != OldStatus)\r
+ { // Change & characters to && to avoid underlining\r
+ wstring Status;\r
+ wstring::iterator it;\r
+\r
+ Status = NewStatus;\r
+ it = Status.begin ();\r
+ while (it < Status.end())\r
+ {\r
+ if (*it == L'&')\r
+ {\r
+ Status.insert (it, 1, L'&');\r
+ it++;\r
+ }\r
+\r
+ it++;\r
+ }\r
+\r
+ SendDlgItemMessage (Dlg, IDC_STATUS, WM_SETTEXT, 0,\r
+ (LPARAM) Status.c_str());\r
+\r
+ OldStatus = NewStatus;\r
+ }\r
+\r
+ return;\r
+}\r
+\r
+\r
+wstring GetDefaultTitle (void)\r
+{\r
+ wstring DefaultText;\r
+\r
+ DefaultText = wstring(wstring(APPNAME_GUI) + wstring(L" v") + wstring(APPVER_STR) +\r
+ wstring(L" (C) 2000 by Rick Brewster"));\r
+\r
+ return (DefaultText);\r
+}\r
+\r
+\r
+wstring GetDefragTitle (void)\r
+{\r
+ wstring DefragText;\r
+ wchar_t Percent[10];\r
+\r
+ swprintf (Percent, L"%.2f%%", Defrag->GetStatusPercent());\r
+\r
+ DefragText = GetDefaultTitle ();\r
+ if (Defrag != NULL)\r
+ {\r
+ DefragText = wstring(Percent) + wstring (L" - ") + Defrag->GetVolume().GetRootPath() +\r
+ wstring (L" - ") + DefragText;\r
+ }\r
+\r
+ return (DefragText);\r
+}\r
+\r
+\r
+void SetDisables (HWND Dlg)\r
+{\r
+ // If a defrag is in process, set L'Start' button to say L'Stop' and disable\r
+ // the Select Drive and Select Action controls\r
+ if (Defrag != NULL && !Defrag->IsDoneYet() && !Defrag->HasError())\r
+ {\r
+ SendMessage (GetDlgItem (Dlg, IDC_STARTSTOP), WM_SETTEXT, 0, (LPARAM) L"Stop");\r
+ EnableWindow (GetDlgItem (Dlg, IDC_DRIVES_LIST), FALSE);\r
+ EnableWindow (GetDlgItem (Dlg, IDC_METHODS_LIST), FALSE);\r
+ }\r
+ else\r
+ {\r
+ SendMessage (GetDlgItem (Dlg, IDC_STARTSTOP), WM_SETTEXT, 0, (LPARAM) L"Start");\r
+ EnableWindow (GetDlgItem (Dlg, IDC_STARTSTOP), TRUE);\r
+ EnableWindow (GetDlgItem (Dlg, IDC_QUIT), TRUE);\r
+ EnableWindow (GetDlgItem (Dlg, IDC_DRIVES_LIST), TRUE);\r
+ EnableWindow (GetDlgItem (Dlg, IDC_METHODS_LIST), TRUE);\r
+ }\r
+\r
+ return;\r
+}\r
+\r
+\r
+void UpdatePriority (HWND Dlg)\r
+{\r
+ LRESULT Id;\r
+ DWORD Priority;\r
+\r
+ Id = SendDlgItemMessage (Dlg, IDC_PRIORITY_LIST, CB_GETCURSEL, 0, 0);\r
+\r
+ if (Id == PriHighID)\r
+ Priority = HIGH_PRIORITY_CLASS;\r
+ else\r
+ if (Id == PriAboveNormID)\r
+ Priority = ABOVE_NORMAL_PRIORITY_CLASS;\r
+ else\r
+ if (Id == PriNormalID)\r
+ Priority = NORMAL_PRIORITY_CLASS;\r
+ else\r
+ if (Id == PriBelowNormID)\r
+ Priority = BELOW_NORMAL_PRIORITY_CLASS;\r
+ else\r
+ if (Id == PriIdleID)\r
+ Priority = IDLE_PRIORITY_CLASS;\r
+ else\r
+ return;\r
+\r
+ SetPriorityClass (GetCurrentProcess(), Priority);\r
+ return;\r
+}\r
+\r
+\r
+// Save settings (ie, process priority and defrag type options)\r
+bool GetRegKeys (HKEY *RegKeyResult)\r
+{\r
+ HKEY RegKey;\r
+ LONG Error;\r
+\r
+ Error = RegCreateKeyEx\r
+ (\r
+ HKEY_CURRENT_USER,\r
+ L"Software\\Fraginator",\r
+ 0,\r
+ NULL,\r
+ REG_OPTION_NON_VOLATILE,\r
+ KEY_ALL_ACCESS,\r
+ NULL,\r
+ &RegKey,\r
+ NULL\r
+ );\r
+\r
+ if (Error != ERROR_SUCCESS)\r
+ return (false);\r
+\r
+ *RegKeyResult = RegKey;\r
+ return (true);\r
+}\r
+\r
+\r
+bool DoneRegKey (HKEY RegKey)\r
+{\r
+ RegCloseKey (RegKey);\r
+ return (true);\r
+}\r
+\r
+\r
+void SaveSettings (HWND Dlg)\r
+{\r
+ LRESULT DefragID;\r
+ DWORD DefragVal;\r
+ LRESULT PriID;\r
+ DWORD PriVal;\r
+ HKEY RegKey;\r
+\r
+ DefragID = SendDlgItemMessage (Dlg, IDC_METHODS_LIST, CB_GETCURSEL, 0, 0);\r
+ PriID = SendDlgItemMessage (Dlg, IDC_PRIORITY_LIST, CB_GETCURSEL, 0, 0);\r
+\r
+ // Action\r
+ if (DefragID == AnalyzeID)\r
+ DefragVal = (DWORD) DefragAnalyze;\r
+ else\r
+ if (DefragID == FastID)\r
+ DefragVal = (DWORD) DefragFast;\r
+ else\r
+ if (DefragID == ExtensiveID)\r
+ DefragVal = (DWORD) DefragExtensive;\r
+\r
+ // Process Priority\r
+ if (PriID == PriHighID)\r
+ PriVal = HIGH_PRIORITY_CLASS;\r
+ else\r
+ if (PriID == PriAboveNormID)\r
+ PriVal = ABOVE_NORMAL_PRIORITY_CLASS;\r
+ else\r
+ if (PriID == PriNormalID)\r
+ PriVal = NORMAL_PRIORITY_CLASS;\r
+ else\r
+ if (PriID == PriBelowNormID)\r
+ PriVal = BELOW_NORMAL_PRIORITY_CLASS;\r
+ else\r
+ if (PriID == PriIdleID)\r
+ PriVal = IDLE_PRIORITY_CLASS;\r
+\r
+ if (!GetRegKeys (&RegKey))\r
+ return;\r
+\r
+ RegSetValueEx\r
+ (\r
+ RegKey,\r
+ L"Default Action",\r
+ 0,\r
+ REG_DWORD,\r
+ (CONST BYTE *)&DefragVal,\r
+ sizeof (DefragVal)\r
+ );\r
+\r
+ RegSetValueEx\r
+ (\r
+ RegKey,\r
+ L"Process Priority",\r
+ 0,\r
+ REG_DWORD,\r
+ (CONST BYTE *)&PriVal,\r
+ sizeof (PriVal)\r
+ );\r
+\r
+ DoneRegKey (RegKey);\r
+ return;\r
+}\r
+\r
+\r
+void LoadSettings (HWND Dlg)\r
+{\r
+ DefragType DType;\r
+ DWORD DTypeVal;\r
+ LRESULT DefragID;\r
+ DWORD PriVal;\r
+ LRESULT PriID;\r
+ HKEY RegKey;\r
+ DWORD RegType;\r
+ DWORD RegSize;\r
+ LONG Error;\r
+\r
+ if (!GetRegKeys (&RegKey))\r
+ return;\r
+\r
+ RegSize = sizeof (DTypeVal);\r
+ RegType = REG_DWORD;\r
+\r
+ Error = RegQueryValueEx\r
+ (\r
+ RegKey,\r
+ L"Default Action",\r
+ 0,\r
+ &RegType,\r
+ (BYTE *)&DTypeVal,\r
+ &RegSize\r
+ );\r
+\r
+ if (Error != ERROR_SUCCESS)\r
+ DTypeVal = DefragAnalyze;\r
+\r
+ Error = RegQueryValueEx\r
+ (\r
+ RegKey,\r
+ L"Process Priority",\r
+ 0,\r
+ &RegType,\r
+ (BYTE *)&PriVal,\r
+ &RegSize\r
+ );\r
+\r
+ DoneRegKey (RegKey);\r
+\r
+ if (Error != ERROR_SUCCESS)\r
+ PriVal = NORMAL_PRIORITY_CLASS;\r
+\r
+ DType = (DefragType) DTypeVal;\r
+ switch (DType)\r
+ {\r
+ default:\r
+ case DefragAnalyze:\r
+ DefragID = AnalyzeID;\r
+ break;\r
+\r
+ case DefragFast:\r
+ DefragID = FastID;\r
+ break;\r
+\r
+ case DefragExtensive:\r
+ DefragID = ExtensiveID;\r
+ break;\r
+ }\r
+\r
+ switch (PriVal)\r
+ {\r
+ case HIGH_PRIORITY_CLASS:\r
+ PriID = PriHighID;\r
+ break;\r
+\r
+ case ABOVE_NORMAL_PRIORITY_CLASS:\r
+ PriID = PriAboveNormID;\r
+ break;\r
+\r
+ default:\r
+ case NORMAL_PRIORITY_CLASS:\r
+ PriID = PriNormalID;\r
+ break;\r
+\r
+ case BELOW_NORMAL_PRIORITY_CLASS:\r
+ PriID = PriBelowNormID;\r
+ break;\r
+\r
+ case IDLE_PRIORITY_CLASS:\r
+ PriID = PriIdleID;\r
+ break;\r
+ }\r
+\r
+ SendDlgItemMessage (Dlg, IDC_PRIORITY_LIST, CB_SETCURSEL, PriID, 0);\r
+ SendDlgItemMessage (Dlg, IDC_METHODS_LIST, CB_SETCURSEL, DefragID, 0);\r
+ return;\r
+}\r
+\r
+\r
+#define IDLETIME 25\r
+wstring OldWindowText = L"";\r
+\r
+INT_PTR CALLBACK MainDialogProc (HWND Dlg, UINT Msg, WPARAM WParam, LPARAM LParam)\r
+{\r
+ static bool ReEntrance = false;\r
+\r
+ switch (Msg)\r
+ {\r
+ case WM_INITDIALOG:\r
+ Stopping = false;\r
+ SetWindowText (Dlg, GetDefaultTitle().c_str());\r
+ SetDisables (Dlg);\r
+ InitDialog (Dlg);\r
+ SetTimer (Dlg, 1, IDLETIME, NULL);\r
+ SetClassLong (Dlg, GCL_HICON, (LONG) LoadIcon (GlobalHInstance, MAKEINTRESOURCE(IDI_ICON)));\r
+ QuitWhenDone = false;\r
+ LoadSettings (Dlg);\r
+ UpdatePriority (Dlg);\r
+ return (1);\r
+\r
+\r
+ case WM_TIMER:\r
+ if (Defrag != NULL && !ReEntrance)\r
+ {\r
+ wstring NewTitle;\r
+\r
+ SendMessage (Dlg, WM_UPDATEINFO, 0, 0);\r
+\r
+ NewTitle = GetDefragTitle ();\r
+ if (NewTitle != OldWindowText)\r
+ {\r
+ OldWindowText = NewTitle;\r
+ SetWindowText (Dlg, NewTitle.c_str());\r
+ }\r
+\r
+ if (Defrag->IsDoneYet() || Defrag->HasError())\r
+ { // This is the code executed when defragging is finished (or stopped :)\r
+ if (Defrag->GetDefragType() == DefragAnalyze &&\r
+ !Defrag->HasError() &&\r
+ !Stopping)\r
+ { // Show report\r
+ ReEntrance = true;\r
+\r
+ DialogBoxParam (GlobalHInstance, MAKEINTRESOURCE (IDD_REPORT),\r
+ Dlg, ReportDialogProc, (LPARAM) Defrag);\r
+\r
+ ReEntrance = false;\r
+ }\r
+\r
+ delete Defrag;\r
+ Defrag = NULL;\r
+ SetDisables (Dlg);\r
+ SetWindowText (Dlg, GetDefaultTitle().c_str());\r
+\r
+ Stopping = false;\r
+\r
+ if (QuitWhenDone)\r
+ SendMessage (GetDlgItem (Dlg, IDC_QUIT), BM_CLICK, 0, 0);\r
+ }\r
+ }\r
+\r
+ SetTimer (Dlg, 1, IDLETIME, NULL);\r
+ return (0);\r
+\r
+\r
+ case WM_UPDATEINFO:\r
+ UpdateDefragInfo (Dlg);\r
+ return (1);\r
+\r
+\r
+ case WM_CLOSE:\r
+ SendMessage (GetDlgItem (Dlg, IDC_QUIT), BM_CLICK, 0, 0);\r
+ return (1);\r
+\r
+\r
+ case WM_COMMAND:\r
+ switch (LOWORD(WParam))\r
+ {\r
+ case IDC_PRIORITY_LIST:\r
+ UpdatePriority (Dlg);\r
+ return (1);\r
+\r
+\r
+ case ID_MAIN_HELP:\r
+ ShellExecute (Dlg, L"open", L"Fraginator.chm", L"", L".", SW_SHOW);\r
+ return (1);\r
+\r
+\r
+ case IDC_QUIT:\r
+ if (Defrag == NULL)\r
+ { // This is the code executing when quitting\r
+ SaveSettings (Dlg);\r
+ EndDialog (Dlg, 0);\r
+ }\r
+ else\r
+ { // Tell defragging to finish and disable our button\r
+ QuitWhenDone = true;\r
+ SendMessage (GetDlgItem (Dlg, IDC_STARTSTOP), BM_CLICK, 0, 0);\r
+ EnableWindow (GetDlgItem (Dlg, IDC_QUIT), FALSE);\r
+ }\r
+ return (1);\r
+\r
+\r
+ case IDC_STARTSTOP:\r
+ if (Defrag == NULL)\r
+ { // L"Start"\r
+ wchar_t Drive[10];\r
+ LRESULT ID;\r
+ DefragType Method;\r
+ HANDLE H;\r
+\r
+ if (Defrag != NULL)\r
+ return (1);\r
+\r
+ SendMessage (GetDlgItem (Dlg, IDC_DRIVES_LIST), WM_GETTEXT,\r
+ sizeof (Drive) - 1, (LPARAM) Drive);\r
+\r
+ if (wcslen(Drive) != 2 || Drive[1] != L':')\r
+ return (1);\r
+\r
+ ID = SendMessage (GetDlgItem (Dlg, IDC_METHODS_LIST), CB_GETCURSEL, 0, 0);\r
+ Method = DefragInvalid;\r
+ if (ID == AnalyzeID)\r
+ Method = DefragAnalyze;\r
+ else\r
+ if (ID == FastID)\r
+ Method = DefragFast;\r
+ else\r
+ if (ID == ExtensiveID)\r
+ Method = DefragExtensive;\r
+\r
+ if (Method != DefragInvalid)\r
+ {\r
+ Defrag = StartDefragThread (Drive, Method, H);\r
+ Defrag->SetDoLimitLength (false);\r
+ SetWindowText (Dlg, GetDefragTitle().c_str());\r
+ SetDisables (Dlg);\r
+ }\r
+ }\r
+ else\r
+ { // L"Stop"\r
+ Stopping = true;\r
+ Defrag->Stop ();\r
+ EnableWindow (GetDlgItem (Dlg, IDC_STARTSTOP), FALSE);\r
+ EnableWindow (GetDlgItem (Dlg, IDC_QUIT), FALSE);\r
+ }\r
+ return (1);\r
+ }\r
+ }\r
+\r
+ // Otherwise, return 0 to say we did not process the message.\r
+ return (0);\r
+}\r