- draw drive dialog static controls
authorJohannes Anderwald <johannes.anderwald@reactos.org>
Tue, 2 Oct 2007 16:03:48 +0000 (16:03 +0000)
committerJohannes Anderwald <johannes.anderwald@reactos.org>
Tue, 2 Oct 2007 16:03:48 +0000 (16:03 +0000)
- use rtl library for calculating [free|used] diskspace
- add german resource strings

svn path=/trunk/; revision=29355

reactos/dll/win32/shell32/drive.c
reactos/dll/win32/shell32/shell32.rbuild
reactos/dll/win32/shell32/shell32_De.rc
reactos/dll/win32/shell32/shresdef.h

index c979612..88bebfb 100644 (file)
 #include "config.h"\r
 #include "wine/port.h"\r
 #define YDEBUG\r
+#define LARGEINT_PROTOS\r
+#define LargeIntegerDivide RtlLargeIntegerDivide\r
+#define ExtendedIntegerMultiply RtlExtendedIntegerMultiply\r
+#define ConvertUlongToLargeInteger RtlConvertUlongToLargeInteger\r
+#define LargeIntegerSubtract RtlLargeIntegerSubtract\r
 #include <string.h>\r
 #include <stdarg.h>\r
 #include <stdio.h>\r
@@ -43,6 +48,7 @@
 #include <initguid.h>\r
 #include <devguid.h>\r
 #include <winioctl.h>\r
+#include <largeint.h>\r
 \r
 WINE_DEFAULT_DEBUG_CHANNEL(shell);\r
 \r
@@ -61,19 +67,90 @@ DeviceCreateHardwarePageEx(HWND hWndParent,
 \r
 #define DRIVE_PROPERTY_PAGES (3)\r
 \r
+\r
+static\r
+LARGE_INTEGER\r
+GetFreeBytesShare(LARGE_INTEGER TotalNumberOfFreeBytes, LARGE_INTEGER TotalNumberOfBytes)\r
+{\r
+   LARGE_INTEGER Temp, Result, Remainder;\r
+\r
+   Temp = LargeIntegerDivide(TotalNumberOfBytes, ConvertUlongToLargeInteger(100), &Remainder);\r
+   if (Temp.QuadPart >= TotalNumberOfFreeBytes.QuadPart)\r
+   {\r
+      Result = ConvertUlongToLargeInteger(1);\r
+   }else\r
+   {\r
+      Result = LargeIntegerDivide(TotalNumberOfFreeBytes, Temp, &Remainder);      \r
+   }\r
+\r
+   return Result;\r
+}\r
+\r
+static\r
+void\r
+PaintStaticControls(HWND hwndDlg, LPDRAWITEMSTRUCT drawItem)\r
+{\r
+   HBRUSH hBrush;\r
+\r
+   if (drawItem->CtlID == 14013)\r
+   {\r
+      hBrush = CreateSolidBrush(RGB(0, 0, 255));\r
+      if (hBrush)\r
+      {\r
+         FillRect(drawItem->hDC, &drawItem->rcItem, hBrush);\r
+         DeleteObject((HGDIOBJ)hBrush);\r
+      }\r
+   }else if (drawItem->CtlID == 14014)\r
+   {\r
+      hBrush = CreateSolidBrush(RGB(255, 0, 255));\r
+      if (hBrush)\r
+      {\r
+         FillRect(drawItem->hDC, &drawItem->rcItem, hBrush);\r
+         DeleteObject((HGDIOBJ)hBrush);\r
+      }\r
+   }\r
+   else if (drawItem->CtlID == 14015)\r
+   {\r
+      HBRUSH hBlueBrush;\r
+      HBRUSH hMagBrush;\r
+      RECT rect;\r
+      LONG horzsize;\r
+      LARGE_INTEGER Result;\r
+\r
+      hBlueBrush = CreateSolidBrush(RGB(0, 0, 255));\r
+      hMagBrush = CreateSolidBrush(RGB(255, 0, 255));\r
+      \r
+      Result.QuadPart = GetWindowLongPtr(hwndDlg, DWLP_USER);\r
+\r
+      CopyRect(&rect, &drawItem->rcItem);\r
+      horzsize = rect.right - rect.left;\r
+      Result.QuadPart = (Result.QuadPart * horzsize) / 100;\r
+\r
+      rect.right = rect.left + Result.QuadPart;\r
+      FillRect(drawItem->hDC, &rect, hMagBrush);\r
+      rect.left = rect.right;\r
+      rect.right = drawItem->rcItem.right;\r
+      FillRect(drawItem->hDC, &rect, hBlueBrush);\r
+      DeleteObject(hBlueBrush);\r
+      DeleteObject(hMagBrush);\r
+   }\r
+}\r
+\r
 static\r
 void\r
 InitializeGeneralDriveDialog(HWND hwndDlg, WCHAR * szDrive)\r
 {\r
-    WCHAR szVolumeName[MAX_PATH+1] = {0};\r
+   WCHAR szVolumeName[MAX_PATH+1] = {0};\r
    DWORD MaxComponentLength = 0;\r
    DWORD FileSystemFlags = 0;\r
    WCHAR FileSystemName[MAX_PATH+1] = {0};\r
+   WCHAR szFormat[50];\r
+   WCHAR szBuffer[128];\r
    BOOL ret;\r
    UINT DriveType;\r
    ULARGE_INTEGER FreeBytesAvailable;\r
-   ULARGE_INTEGER TotalNumberOfBytes;\r
-   ULARGE_INTEGER TotalNumberOfFreeBytes;\r
+   LARGE_INTEGER TotalNumberOfFreeBytes;\r
+   LARGE_INTEGER TotalNumberOfBytes;\r
 \r
    ret = GetVolumeInformationW(szDrive, szVolumeName, MAX_PATH+1, NULL, &MaxComponentLength, &FileSystemFlags, FileSystemName, MAX_PATH+1);\r
    if (ret)\r
@@ -89,24 +166,20 @@ InitializeGeneralDriveDialog(HWND hwndDlg, WCHAR * szDrive)
    DriveType = GetDriveTypeW(szDrive);\r
    if (DriveType == DRIVE_FIXED)\r
    {\r
-      if(GetDiskFreeSpaceExW(szDrive, &FreeBytesAvailable, &TotalNumberOfBytes, &TotalNumberOfFreeBytes))\r
+\r
+      if(GetDiskFreeSpaceExW(szDrive, &FreeBytesAvailable, (PULARGE_INTEGER)&TotalNumberOfBytes, (PULARGE_INTEGER)&TotalNumberOfFreeBytes))\r
       {\r
          WCHAR szResult[128];\r
+         LARGE_INTEGER Result;\r
+#ifdef IOCTL_DISK_GET_LENGTH_INFO_IMPLEMENTED\r
          HANDLE hVolume;\r
          DWORD BytesReturned = 0;\r
-         GET_LENGTH_INFORMATION LengthInformation;\r
-         if (StrFormatByteSizeW(TotalNumberOfBytes.QuadPart - FreeBytesAvailable.QuadPart, szResult, sizeof(szResult) / sizeof(WCHAR)))\r
-             SendDlgItemMessageW(hwndDlg, 14004, WM_SETTEXT, (WPARAM)NULL, (LPARAM)szResult);\r
 \r
-         if (StrFormatByteSizeW(FreeBytesAvailable.QuadPart, szResult, sizeof(szResult) / sizeof(WCHAR)))\r
-             SendDlgItemMessageW(hwndDlg, 14006, WM_SETTEXT, (WPARAM)NULL, (LPARAM)szResult);\r
-#if 0\r
          sprintfW(szResult, L"\\\\.\\%c:", towupper(szDrive[0]));\r
          hVolume = CreateFileW(szResult, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);\r
          if (hVolume != INVALID_HANDLE_VALUE)\r
          {\r
-            RtlZeroMemory(&LengthInformation, sizeof(GET_LENGTH_INFORMATION));\r
-            ret = DeviceIoControl(hVolume, IOCTL_DISK_GET_LENGTH_INFO, NULL, 0, (LPVOID)&LengthInformation, sizeof(GET_LENGTH_INFORMATION), &BytesReturned, NULL);\r
+            ret = DeviceIoControl(hVolume, IOCTL_DISK_GET_LENGTH_INFO, NULL, 0, (LPVOID)&TotalNumberOfBytes, sizeof(ULARGE_INTEGER), &BytesReturned, NULL);\r
             if (ret && StrFormatByteSizeW(LengthInformation.Length.QuadPart, szResult, sizeof(szResult) / sizeof(WCHAR)))\r
                SendDlgItemMessageW(hwndDlg, 14008, WM_SETTEXT, (WPARAM)NULL, (LPARAM)szResult);\r
 \r
@@ -117,8 +190,32 @@ InitializeGeneralDriveDialog(HWND hwndDlg, WCHAR * szDrive)
             if (ret && StrFormatByteSizeW(TotalNumberOfBytes.QuadPart, szResult, sizeof(szResult) / sizeof(WCHAR)))\r
                SendDlgItemMessageW(hwndDlg, 14008, WM_SETTEXT, (WPARAM)NULL, (LPARAM)szResult);\r
 #endif\r
+\r
+         if (StrFormatByteSizeW(TotalNumberOfBytes.QuadPart - FreeBytesAvailable.QuadPart, szResult, sizeof(szResult) / sizeof(WCHAR)))\r
+             SendDlgItemMessageW(hwndDlg, 14004, WM_SETTEXT, (WPARAM)NULL, (LPARAM)szResult);\r
+\r
+         if (StrFormatByteSizeW(FreeBytesAvailable.QuadPart, szResult, sizeof(szResult) / sizeof(WCHAR)))\r
+             SendDlgItemMessageW(hwndDlg, 14006, WM_SETTEXT, (WPARAM)NULL, (LPARAM)szResult);\r
+\r
+         Result = GetFreeBytesShare(TotalNumberOfFreeBytes, TotalNumberOfBytes);\r
+         /* set free bytes percentage */\r
+         sprintfW(szResult, L"%02d%%", Result.QuadPart);\r
+         SendDlgItemMessageW(hwndDlg, 14007, WM_SETTEXT, (WPARAM)0, (LPARAM)szResult);\r
+         /* store free share amount */\r
+         SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)Result.QuadPart);\r
+         /* store used share amount */\r
+         Result = LargeIntegerSubtract(ConvertUlongToLargeInteger(100), Result);\r
+         sprintfW(szResult, L"%02d%%", Result.QuadPart);\r
+         SendDlgItemMessageW(hwndDlg, 14005, WM_SETTEXT, (WPARAM)0, (LPARAM)szResult);\r
+         if (LoadStringW(shell32_hInstance, IDS_DRIVE_FIXED, szBuffer, sizeof(szBuffer) / sizeof(WCHAR)))\r
+             SendDlgItemMessageW(hwndDlg, 14002, WM_SETTEXT, (WPARAM)0, (LPARAM)szBuffer);\r
+\r
       }\r
    }\r
+   /* set drive description */\r
+   SendDlgItemMessageW(hwndDlg, 14010, WM_GETTEXT, (WPARAM)50, (LPARAM)szFormat);\r
+   sprintfW(szBuffer, szFormat, szDrive);\r
+   SendDlgItemMessageW(hwndDlg, 14010, WM_SETTEXT, (WPARAM)NULL, (LPARAM)szBuffer);\r
 }\r
 \r
 \r
@@ -132,6 +229,7 @@ DriveGeneralDlg(
 )\r
 {\r
     LPPROPSHEETPAGEW ppsp;\r
+       LPDRAWITEMSTRUCT drawItem;\r
 \r
     WCHAR * lpstr;\r
     switch(uMsg)\r
@@ -144,7 +242,15 @@ DriveGeneralDlg(
 \r
         lpstr = (WCHAR *)ppsp->lParam;\r
         InitializeGeneralDriveDialog(hwndDlg, lpstr);\r
-        return TRUE;       \r
+        return TRUE;     \r
+       case WM_DRAWITEM:\r
+               drawItem = (LPDRAWITEMSTRUCT)lParam;\r
+           if (drawItem->CtlID >= 14013 && drawItem->CtlID <= 14015)\r
+        {\r
+                       PaintStaticControls(hwndDlg, drawItem);\r
+            return TRUE;\r
+        }\r
+\r
    }\r
 \r
 \r
index 7004b3f..49dc9f0 100644 (file)
@@ -22,6 +22,7 @@
        <library>ole32</library>
        <library>version</library>
        <library>devmgr</library>
+       <library>rtl</library>
        <file>authors.c</file>
        <file>autocomplete.c</file>
        <file>brsfolder.c</file>
index 4cd0e97..925053d 100644 (file)
@@ -224,15 +224,18 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x0
   //ICON
   EDITTEXT 14001, 40, 20, 190, 10, ES_LEFT|WS_BORDER|WS_GROUP
   LTEXT "Typ:", -1, 15, 55, 40, 10
-  LTEXT "", 14002, 40, 55, 100, 10
+  LTEXT "", 14002, 110, 55, 100, 10
+
 
   LTEXT "Dateisystem:", -1, 15, 70, 100, 10
   LTEXT "", 14003, 110, 70, 100, 10
 
+  CONTROL "", 14013, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 90, 10, 10
   LTEXT "Belegter Speicher:", -1, 25, 90, 120, 10
   LTEXT "", 14004, 110, 90, 120, 10
   LTEXT "", 14005, 200, 90, 40, 10
 
+  CONTROL "", 14014, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 105, 10, 10
   LTEXT "Freier Speicher:", -1, 25, 105, 70, 10
   LTEXT "", 14006, 110, 105, 120, 10
   LTEXT "", 14007, 200, 105, 40, 10
@@ -241,10 +244,12 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x0
   LTEXT "", 14008, 110, 125, 120, 10
   LTEXT "", 14009, 200, 125, 40, 10
 
-  LTEXT "", 14010, 150, 160, 40, 10
-  PUSHBUTTON "Bereinigen", 14011, 190, 145, 50, 15, WS_DISABLED
+  CONTROL "", 14015, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 20, 140, 200, 20
+
+  LTEXT "Laufwerk %s", 14010, 100, 170, 40, 10
+  PUSHBUTTON "Bereinigen", 14011, 180, 175, 50, 15, WS_DISABLED
   CHECKBOX "Laufwerk komprimieren, um Speicherplatz zu sparen", 14012, 15, 205, 165, 10, WS_DISABLED
-  CHECKBOX "Laufwerk für schnelle Dateisuche indizieren", 14012, 15, 205, 165, 10, WS_DISABLED
+  CHECKBOX "Laufwerk für schnelle Dateisuche indizieren", 14012, 15, 220, 165, 10, WS_DISABLED
 }
 
 DRIVE_EXTRA_DLG DIALOGEX 0, 0, 240, 130
@@ -332,4 +337,7 @@ STRINGTABLE DISCARDABLE
        IDS_COMMON_PICTURES     "Dokumente\\Eigene Bilder"
        IDS_COMMON_VIDEO        "Dokumente\\Eigene Videos"
        IDS_CDBURN_AREA         "Lokale Einstellungen\\Anwendungsdaten\\Microsoft\\CD Burning"
+    IDS_DRIVE_FIXED     "Lokaler Datenträger"
+    IDS_DRIVE_CDROM     "CD-Laufwerk"
+    IDS_DRIVE_NETWORK   "Netzwerklaufwerk"
 }
index 0f5a830..d63ec93 100644 (file)
@@ -86,6 +86,9 @@
 #define IDS_COMMON_PICTURES         69
 #define IDS_COMMON_VIDEO            70
 #define IDS_CDBURN_AREA             71
+#define IDS_DRIVE_FIXED             72
+#define IDS_DRIVE_CDROM             73
+#define IDS_DRIVE_NETWORK           74
 
 /* browse for folder dialog box */
 #define IDD_STATUS             0x3743