[KSPROXY]
[reactos.git] / reactos / dll / cpl / desk / preview.c
index 7173e9d..1f2cdb2 100644 (file)
@@ -3,7 +3,7 @@
  * LICENSE:     GPL - See COPYING in the top level directory
  * FILE:        lib/cpl/desk/preview.c
  * PURPOSE:     Draws the preview control
- * COPYRIGHT:   Copyright 2006, 2007 Eric Kohl (email?)
+ * COPYRIGHT:   Copyright 2006, 2007 Eric Kohl
  */
 
 #include "desk.h"
@@ -15,19 +15,11 @@ typedef struct _PREVIEW_DATA
 {
     HWND hwndParent;
 
-    DWORD clrDesktop;
-    HBRUSH hbrDesktop;
-
-    DWORD clrWindow;
-    HBRUSH hbrWindow;
+    DWORD clrSysColor[COLOR_MENUBAR];
 
-    DWORD clrScrollbar;
     HBRUSH hbrScrollbar;
-
-    DWORD clrActiveCaptionText;
-    DWORD clrInactiveCaptionText;
-    DWORD clrWindowText;
-    DWORD clrButtonText;
+    HBRUSH hbrDesktop;
+    HBRUSH hbrWindow;
 
     INT cxEdge;
     INT cyEdge;
@@ -35,6 +27,7 @@ typedef struct _PREVIEW_DATA
     INT cySizeFrame;
 
     INT cyCaption;
+    INT cyBorder;
     INT cyMenu;
     INT cxScrollbar;
 
@@ -148,19 +141,16 @@ static VOID
 OnCreate(HWND hwnd, PPREVIEW_DATA pPreviewData)
 {
     NONCLIENTMETRICS NonClientMetrics;
+    INT i;
 
-    pPreviewData->clrScrollbar = GetSysColor(COLOR_SCROLLBAR);
-    pPreviewData->hbrScrollbar = CreateSolidBrush(pPreviewData->clrScrollbar);
-
-    pPreviewData->clrDesktop = GetSysColor(COLOR_DESKTOP);
-    pPreviewData->hbrDesktop = CreateSolidBrush(pPreviewData->clrDesktop);
-    pPreviewData->clrWindow = GetSysColor(COLOR_WINDOW);
-    pPreviewData->hbrWindow = CreateSolidBrush(pPreviewData->clrWindow);
+    for (i = 0; i < COLOR_MENUBAR + 1; i++)
+    {
+        pPreviewData->clrSysColor[i] = GetSysColor(i);
+    }
 
-    pPreviewData->clrActiveCaptionText = GetSysColor(COLOR_CAPTIONTEXT);
-    pPreviewData->clrInactiveCaptionText = GetSysColor(COLOR_INACTIVECAPTIONTEXT);
-    pPreviewData->clrWindowText = GetSysColor(COLOR_WINDOWTEXT);
-    pPreviewData->clrButtonText = GetSysColor(COLOR_BTNTEXT);
+    pPreviewData->hbrScrollbar = CreateSolidBrush(pPreviewData->clrSysColor[COLOR_SCROLLBAR]);
+    pPreviewData->hbrDesktop = CreateSolidBrush(pPreviewData->clrSysColor[COLOR_DESKTOP]);
+    pPreviewData->hbrWindow = CreateSolidBrush(pPreviewData->clrSysColor[COLOR_WINDOW]);
 
     pPreviewData->cxEdge = GetSystemMetrics(SM_CXEDGE) - 2;
     pPreviewData->cyEdge = GetSystemMetrics(SM_CXEDGE) - 2;
@@ -170,6 +160,7 @@ OnCreate(HWND hwnd, PPREVIEW_DATA pPreviewData)
     pPreviewData->cyCaption = GetSystemMetrics(SM_CYCAPTION);
     pPreviewData->cyMenu = GetSystemMetrics(SM_CYMENU);
     pPreviewData->cxScrollbar = GetSystemMetrics(SM_CXVSCROLL);
+    pPreviewData->cyBorder = GetSystemMetrics(SM_CYBORDER);
 
     /* load font info */
     NonClientMetrics.cbSize = sizeof(NONCLIENTMETRICS);
@@ -186,14 +177,13 @@ OnCreate(HWND hwnd, PPREVIEW_DATA pPreviewData)
 
     /* Load and modify the menu */
     pPreviewData->hMenu = LoadMenu(hApplet, MAKEINTRESOURCE(IDR_PREVIEW_MENU));
-    EnableMenuItem(pPreviewData->hMenu, ID_MENU_DISABLED,
-                   MF_BYCOMMAND | MF_DISABLED);
+    EnableMenuItem(pPreviewData->hMenu,
+                   1, MF_BYPOSITION | MF_GRAYED);
     HiliteMenuItem(hwnd, pPreviewData->hMenu,
-                   ID_MENU_SELECTED, MF_BYCOMMAND | MF_HILITE);
+                   2, MF_BYPOSITION | MF_HILITE);
 
 //    GetMenuItemRect(hwnd, pPreviewData->hMenu,
-//                    ID_MENU_SELECTED, &pPreviewData->rcSelectedMenuItem);
-
+//                    2, &pPreviewData->rcSelectedMenuItem);
 
     AllocAndLoadString(&pPreviewData->lpInAct, hApplet, IDS_INACTWIN);
     AllocAndLoadString(&pPreviewData->lpAct, hApplet, IDS_ACTWIN);
@@ -219,7 +209,7 @@ CalculateItemSize(PPREVIEW_DATA pPreviewData)
     pPreviewData->rcInactiveCaption.left = pPreviewData->rcInactiveFrame.left + pPreviewData->cxEdge + pPreviewData->cySizeFrame + 1;
     pPreviewData->rcInactiveCaption.top = pPreviewData->rcInactiveFrame.top + pPreviewData->cyEdge + pPreviewData->cySizeFrame + 1;
     pPreviewData->rcInactiveCaption.right = pPreviewData->rcInactiveFrame.right - pPreviewData->cxEdge - pPreviewData->cySizeFrame - 1;
-    pPreviewData->rcInactiveCaption.bottom = pPreviewData->rcInactiveCaption.top + pPreviewData->cyCaption;
+    pPreviewData->rcInactiveCaption.bottom = pPreviewData->rcInactiveCaption.top + pPreviewData->cyCaption - pPreviewData->cyBorder;
 
     /* Calculate the inactive caption buttons rectangle */
     pPreviewData->rcInactiveCaptionButtons.left = pPreviewData->rcInactiveCaption.right - 2 - 2 - 3 * 16;
@@ -237,7 +227,7 @@ CalculateItemSize(PPREVIEW_DATA pPreviewData)
     pPreviewData->rcActiveCaption.left = pPreviewData->rcActiveFrame.left + pPreviewData->cxEdge + pPreviewData->cySizeFrame + 1;
     pPreviewData->rcActiveCaption.top = pPreviewData->rcActiveFrame.top + pPreviewData->cxEdge + pPreviewData->cySizeFrame + 1;
     pPreviewData->rcActiveCaption.right = pPreviewData->rcActiveFrame.right - pPreviewData->cxEdge - pPreviewData->cySizeFrame - 1;
-    pPreviewData->rcActiveCaption.bottom = pPreviewData->rcActiveCaption.top + pPreviewData->cyCaption;
+    pPreviewData->rcActiveCaption.bottom = pPreviewData->rcActiveCaption.top + pPreviewData->cyCaption - pPreviewData->cyBorder;
 
     /* Calculate the active caption buttons rectangle */
     pPreviewData->rcActiveCaptionButtons.left = pPreviewData->rcActiveCaption.right - 2 - 2 - 3 * 16;
@@ -312,6 +302,20 @@ OnSize(INT cx, INT cy, PPREVIEW_DATA pPreviewData)
     CalculateItemSize(pPreviewData);
 }
 
+#ifdef _MSC_VER
+
+#if _UNICODE
+typedef BOOL (WINAPI * DCT_PROC)(HWND hwnd, HDC hdc, const RECT *rect, HFONT hFont, HICON hIcon, LPCWSTR str, UINT uFlags);
+#define DCT_ORD 178
+#else
+typedef BOOL (WINAPI * DCT_PROC)(HWND hwnd, HDC hdc, const RECT *rect, HFONT hFont, HICON hIcon, LPCSTR str, UINT uFlags);
+#define DCT_ORD 177
+#endif
+
+typedef DWORD (WINAPI * DMBT_PROC)(HWND hwnd, HDC hDC, LPRECT lprect, HMENU hMenu, HFONT hFont);
+#define DMBT_ORD 186
+
+#endif
 
 static VOID
 OnPaint(HWND hwnd, PPREVIEW_DATA pPreviewData)
@@ -321,6 +325,19 @@ OnPaint(HWND hwnd, PPREVIEW_DATA pPreviewData)
     HDC hdc;
     RECT rc;
 
+#ifdef _MSC_VER
+    DCT_PROC DrawCaptionTemp;
+    DMBT_PROC DrawMenuBarTemp;
+    HMODULE hUser32;
+
+    hUser32 = LoadLibrary(_T("user32.dll"));
+    if(hUser32 == NULL)
+        return;
+
+    DrawCaptionTemp = (DCT_PROC)GetProcAddress(hUser32, (LPCSTR)DCT_ORD);
+    DrawMenuBarTemp = (DMBT_PROC)GetProcAddress(hUser32, (LPCSTR)DMBT_ORD);
+#endif
+
     hdc = BeginPaint(hwnd, &ps);
 
     /* Desktop */
@@ -328,14 +345,14 @@ OnPaint(HWND hwnd, PPREVIEW_DATA pPreviewData)
 
     /* Inactive Window */
     DrawEdge(hdc, &pPreviewData->rcInactiveFrame, EDGE_RAISED, BF_RECT | BF_MIDDLE);
-    SetTextColor(hdc, pPreviewData->clrInactiveCaptionText);
+    SetTextColor(hdc, pPreviewData->clrSysColor[COLOR_INACTIVECAPTIONTEXT]);
     DrawCaptionTemp(NULL, hdc, &pPreviewData->rcInactiveCaption,  pPreviewData->hCaptionFont,
                     NULL, pPreviewData->lpInAct, DC_GRADIENT | DC_ICON | DC_TEXT);
     DrawCaptionButtons(hdc, &pPreviewData->rcInactiveCaption, TRUE, pPreviewData->cyCaption - 2);
 
     /* Active Window */
     DrawEdge(hdc, &pPreviewData->rcActiveFrame, EDGE_RAISED, BF_RECT | BF_MIDDLE);
-    SetTextColor(hdc, pPreviewData->clrActiveCaptionText);
+    SetTextColor(hdc, pPreviewData->clrSysColor[COLOR_CAPTIONTEXT]);
     DrawCaptionTemp(NULL, hdc, &pPreviewData->rcActiveCaption, pPreviewData->hCaptionFont,
                     NULL, pPreviewData->lpAct, DC_ACTIVE | DC_GRADIENT | DC_ICON | DC_TEXT);
     DrawCaptionButtons(hdc, &pPreviewData->rcActiveCaption, TRUE, pPreviewData->cyCaption - 2);
@@ -354,8 +371,8 @@ OnPaint(HWND hwnd, PPREVIEW_DATA pPreviewData)
     CopyRect(&rc, &pPreviewData->rcActiveClient);
     rc.left += 4;
     rc.top += 2;
-    SetTextColor(hdc, pPreviewData->clrWindowText);
-    hOldFont = SelectObject(hdc, pPreviewData->hMessageFont);
+    SetTextColor(hdc, pPreviewData->clrSysColor[COLOR_WINDOWTEXT]);
+    hOldFont = SelectObject(hdc, pPreviewData->hCaptionFont);
     DrawText(hdc, pPreviewData->lpWinTxt, lstrlen(pPreviewData->lpWinTxt), &rc, DT_LEFT);
     SelectObject(hdc, hOldFont);
 
@@ -364,7 +381,7 @@ OnPaint(HWND hwnd, PPREVIEW_DATA pPreviewData)
 
     /* Dialog Window */
     DrawEdge(hdc, &pPreviewData->rcDialogFrame, EDGE_RAISED, BF_RECT | BF_MIDDLE);
-    SetTextColor(hdc, pPreviewData->clrActiveCaptionText);
+    SetTextColor(hdc, pPreviewData->clrSysColor[COLOR_WINDOW]);
     DrawCaptionTemp(NULL, hdc, &pPreviewData->rcDialogCaption, pPreviewData->hCaptionFont,
                     NULL, pPreviewData->lpMessBox, DC_ACTIVE | DC_GRADIENT | DC_ICON | DC_TEXT);
     DrawCaptionButtons(hdc, &pPreviewData->rcDialogCaption, FALSE, pPreviewData->cyCaption - 2);
@@ -381,7 +398,7 @@ OnPaint(HWND hwnd, PPREVIEW_DATA pPreviewData)
     /* Draw Button */
     DrawFrameControl(hdc, &pPreviewData->rcDialogButton, DFC_BUTTON, DFCS_BUTTONPUSH);
     CopyRect(&rc, &pPreviewData->rcDialogButton);
-    SetTextColor(hdc, pPreviewData->clrButtonText);
+    SetTextColor(hdc, pPreviewData->clrSysColor[COLOR_BTNTEXT]);
     hOldFont = SelectObject(hdc, pPreviewData->hMessageFont);
     DrawText(hdc, pPreviewData->lpButText, lstrlen(pPreviewData->lpButText), &rc, DT_VCENTER | DT_CENTER | DT_SINGLELINE);
     SelectObject(hdc, hOldFont);
@@ -417,12 +434,12 @@ OnLButtonDown(HWND hwnd, int xPos, int yPos, PPREVIEW_DATA pPreviewData)
     if (PtInRect(&pPreviewData->rcActiveCaptionButtons, pt))
         type = IDX_CAPTION_BUTTON;
 
-    if (PtInRect(&pPreviewData->rcActiveMenuBar, pt))
-        type = IDX_MENU;
-
 //    if (PtInRect(&pPreviewData->rcSelectedMenuItem, pt))
 //        type = IDX_SELECTION;
 
+    if (PtInRect(&pPreviewData->rcActiveMenuBar, pt))
+        type = IDX_MENU;
+
     if (PtInRect(&pPreviewData->rcActiveClient, pt))
         type = IDX_WINDOW;
 
@@ -582,6 +599,28 @@ PreviewWndProc(HWND hwnd,
             InvalidateRect(hwnd, NULL, FALSE);
             break;
 
+        case PVM_SETCOLOR:
+            pPreviewData->clrSysColor[(INT)wParam] = (DWORD)lParam;
+            switch((INT)wParam)
+            {
+                case COLOR_SCROLLBAR:
+                    DeleteObject(pPreviewData->hbrScrollbar);
+                    pPreviewData->hbrScrollbar = CreateSolidBrush(pPreviewData->clrSysColor[COLOR_SCROLLBAR]);
+                    break;
+
+                case COLOR_DESKTOP:
+                    DeleteObject(pPreviewData->hbrDesktop);
+                    pPreviewData->hbrDesktop = CreateSolidBrush(pPreviewData->clrSysColor[COLOR_DESKTOP]);
+                    break;
+
+                case COLOR_WINDOW:
+                    DeleteObject(pPreviewData->hbrWindow);
+                    pPreviewData->hbrWindow = CreateSolidBrush(pPreviewData->clrSysColor[COLOR_WINDOW]);
+                    break;
+            }
+            InvalidateRect(hwnd, NULL, FALSE);
+            break;
+
         default:
             DefWindowProc(hwnd,
                           uMsg,