--- /dev/null
+#include "ReportDialog.h"\r
+#include "Unfrag.h"\r
+#include "Fraginator.h"\r
+#include "DriveVolume.h"\r
+#include "Defragment.h"\r
+#include "resource.h"\r
+\r
+\r
+void SetReportInfo (HWND Dlg, DefragReport &Report, uint32 BytesDivisor, wchar_t *BytesUnits, bool Fractional)\r
+{\r
+ wchar_t Text[1000];\r
+ wchar_t Text2[1000];\r
+ wchar_t Text3[1000];\r
+\r
+ memset (Text, 0, sizeof (Text));\r
+\r
+ // Volume name\r
+ SetDlgItemText (Dlg, IDC_DRIVELETTER, Report.RootPath.c_str());\r
+\r
+ // Volume label\r
+ SetDlgItemText (Dlg, IDC_VOLUMELABEL, Defrag->GetVolume().GetVolumeInfo().Name.c_str());\r
+\r
+ // Volume Serial\r
+ SetDlgItemText (Dlg, IDC_VOLUMESERIAL, Defrag->GetVolume().GetVolumeInfo().Serial.c_str());\r
+\r
+ // File System\r
+ SetDlgItemText (Dlg, IDC_FILESYSTEM, Defrag->GetVolume().GetVolumeInfo().FileSystem.c_str());\r
+\r
+ // DiskSizeBytes\r
+ if (Fractional)\r
+ {\r
+ swprintf (Text, L"%.2f %s", (double)(signed)(Report.DiskSizeBytes /\r
+ (BytesDivisor / 1024)) / 1024.0, BytesUnits);\r
+ }\r
+ else\r
+ {\r
+ AddCommas (Text, Report.DiskSizeBytes / BytesDivisor);\r
+ wcscat (Text, L" ");\r
+ wcscat (Text, BytesUnits);\r
+ }\r
+\r
+ SetDlgItemText (Dlg, IDC_DISKSIZEBYTES, Text);\r
+\r
+ // DiskFreeBytes\r
+ if (Fractional)\r
+ {\r
+ swprintf (Text, L"%.2f %s", (double)(signed)(Defrag->GetVolume().GetVolumeInfo().FreeBytes /\r
+ (BytesDivisor / 1024)) / 1024.0, BytesUnits);\r
+ }\r
+ else\r
+ {\r
+ AddCommas (Text, Defrag->GetVolume().GetVolumeInfo().FreeBytes / BytesDivisor);\r
+ wcscat (Text, L" ");\r
+ wcscat (Text, BytesUnits);\r
+ }\r
+ SetDlgItemText (Dlg, IDC_DISKFREEBYTES, Text);\r
+\r
+ // DiskSizeClusters\r
+ AddCommas (Text, Defrag->GetVolume().GetVolumeInfo().ClusterCount);\r
+ wcscat (Text, L" clusters");\r
+ SetDlgItemText (Dlg, IDC_DISKSIZECLUSTERS, Text);\r
+\r
+ // DiskClusterSize\r
+ swprintf (Text, L"%u bytes", Defrag->GetVolume().GetVolumeInfo().ClusterSize);\r
+ SetDlgItemText (Dlg, IDC_DISKCLUSTERSIZE, Text);\r
+\r
+ // DirsCount\r
+ AddCommas (Text, Report.DirsCount);\r
+ SetDlgItemText (Dlg, IDC_DIRSCOUNT, Text);\r
+\r
+ // FilesCount\r
+ AddCommas (Text, Report.FilesCount);\r
+ SetDlgItemText (Dlg, IDC_FILESCOUNT, Text);\r
+\r
+ // FilesFragged\r
+ swprintf (Text, L"(%.2f%%)", Report.PercentFragged);\r
+ AddCommas (Text2, Report.FraggedFiles.size());\r
+ swprintf (Text3, L"%s %s", Text, Text2);\r
+ SetDlgItemText (Dlg, IDC_FILESFRAGGED, Text3);\r
+\r
+ // Average Frags\r
+ swprintf (Text, L"%.2f", Report.AverageFragments);\r
+ SetDlgItemText (Dlg, IDC_AVERAGEFRAGS, Text);\r
+\r
+ // FilesSizeBytes\r
+ if (Fractional)\r
+ {\r
+ swprintf (Text, L"%.2f %s", (double)(signed)(Report.FilesSizeBytes /\r
+ (BytesDivisor / 1024)) / 1024.0, BytesUnits);\r
+ }\r
+ else\r
+ {\r
+ AddCommas (Text, Report.FilesSizeBytes / (uint64)BytesDivisor);\r
+ wcscat (Text, L" ");\r
+ wcscat (Text, BytesUnits);\r
+ }\r
+ SetDlgItemText (Dlg, IDC_FILESSIZEBYTES, Text);\r
+\r
+ // Files SizeOnDisk\r
+ if (Fractional)\r
+ {\r
+ swprintf (Text, L"%.2f %s", (double)(signed)((Report.FilesSizeBytes + Report.FilesSlackBytes) /\r
+ (BytesDivisor / 1024)) / 1024.0, BytesUnits);\r
+ }\r
+ else\r
+ {\r
+ AddCommas (Text, (Report.FilesSizeBytes + Report.FilesSlackBytes) / (uint64)BytesDivisor);\r
+ wcscat (Text, L" ");\r
+ wcscat (Text, BytesUnits);\r
+\r
+ }\r
+ SetDlgItemText (Dlg, IDC_FILESSIZEONDISK, Text);\r
+\r
+ // FilesSlackBytes\r
+ if (Fractional)\r
+ {\r
+ swprintf (Text, L"%.2f %s", (double)(signed)(Report.FilesSlackBytes /\r
+ (BytesDivisor / 1024)) / 1024.0, BytesUnits);\r
+ }\r
+ else\r
+ {\r
+ AddCommas (Text, Report.FilesSlackBytes / BytesDivisor);\r
+ wcscat (Text, L" ");\r
+ wcscat (Text, BytesUnits);\r
+ }\r
+ swprintf (Text2, L"(%.2f%%)", Report.PercentSlack);\r
+ swprintf (Text3, L"%s %s", Text2, Text);\r
+ SetDlgItemText (Dlg, IDC_FILESSLACKBYTES, Text3);\r
+\r
+ // Recommendation\r
+ bool PFRec = false; // Recommend based off percent fragged files?\r
+ bool AFRec = false; // Recommend based off average fragments per file?\r
+\r
+ if (Report.PercentFragged >= 5.0f)\r
+ PFRec = true;\r
+\r
+ if (Report.AverageFragments >= 1.1f)\r
+ AFRec = true;\r
+\r
+ wcscpy (Text, L"* ");\r
+\r
+ if (PFRec)\r
+ {\r
+ swprintf\r
+ (\r
+ Text2,\r
+ L"%.2f%% of the files on this volume are fragmented. ",\r
+ Report.PercentFragged\r
+ );\r
+\r
+ wcscat (Text, Text2);\r
+ }\r
+\r
+ if (AFRec)\r
+ {\r
+ swprintf\r
+ (\r
+ Text2,\r
+ L"The average fragments per file (%.2f) indicates a high degree of fragmentation. ",\r
+ Report.AverageFragments\r
+ );\r
+\r
+ wcscat (Text, Text2);\r
+ }\r
+\r
+ if (Report.PercentFragged < 5.0f && Report.AverageFragments < 1.1f)\r
+ swprintf (Text, L"* No defragmentation is necessary at this point.");\r
+ else\r
+ if (Report.PercentFragged < 15.0f && Report.AverageFragments < 1.3f)\r
+ wcscat (Text, L"It is recommended that you perform a Fast Defrag.");\r
+ else\r
+ wcscat (Text, L"It is recommended that you perform an Extensive Defrag.");\r
+\r
+ // Should we recommend a smaller cluster size?\r
+ if (Report.PercentSlack >= 10.0f)\r
+ {\r
+ swprintf\r
+ (\r
+ Text2,\r
+ L"\n* A large amount of disk space (%.2f%%) is being lost "\r
+ L"due to a large (%u bytes) cluster size. It is recommended "\r
+ L"that you use a disk utility such as Partition Magic to "\r
+ L"reduce the cluster size of this volume.",\r
+ Report.PercentSlack,\r
+ Defrag->GetVolume().GetVolumeInfo().ClusterSize\r
+ );\r
+\r
+ wcscat (Text, Text2);\r
+ }\r
+\r
+ SetDlgItemText (Dlg, IDC_RECOMMEND, Text);\r
+\r
+ return;\r
+}\r
+\r
+\r
+INT_PTR CALLBACK ReportDialogProc (HWND Dlg, UINT Msg, WPARAM WParam, LPARAM LParam)\r
+{\r
+ switch (Msg)\r
+ {\r
+ case WM_INITDIALOG:\r
+ SetReportInfo (Dlg, Defrag->GetDefragReport (), 1, L"bytes", false);\r
+ return (1);\r
+\r
+ case WM_COMMAND:\r
+ switch (LOWORD(WParam))\r
+ {\r
+ case IDC_REPORTOK:\r
+ EndDialog (Dlg, 0);\r
+ return (1);\r
+\r
+ case IDC_GIGABYTES:\r
+ SetReportInfo (Dlg, Defrag->GetDefragReport (), 1024*1024*1024, L"GB", true);\r
+ return (1);\r
+\r
+ case IDC_MEGABYTES:\r
+ SetReportInfo (Dlg, Defrag->GetDefragReport (), 1024*1024, L"MB", false);\r
+ return (1);\r
+\r
+ case IDC_KILOBYTES:\r
+ SetReportInfo (Dlg, Defrag->GetDefragReport (), 1024, L"KB", false);\r
+ return (1);\r
+\r
+ case IDC_BYTES:\r
+ SetReportInfo (Dlg, Defrag->GetDefragReport (), 1, L"bytes", false);\r
+ return (1);\r
+ }\r
+ }\r
+\r
+ return (0);\r
+}\r