| /* | 
 |  * Theming - Edit control | 
 |  * | 
 |  * Copyright (c) 2005 by Frank Richter | 
 |  * | 
 |  * This library is free software; you can redistribute it and/or | 
 |  * modify it under the terms of the GNU Lesser General Public | 
 |  * License as published by the Free Software Foundation; either | 
 |  * version 2.1 of the License, or (at your option) any later version. | 
 |  * | 
 |  * This library is distributed in the hope that it will be useful, | 
 |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
 |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
 |  * Lesser General Public License for more details. | 
 |  * | 
 |  * You should have received a copy of the GNU Lesser General Public | 
 |  * License along with this library; if not, write to the Free Software | 
 |  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA | 
 |  * | 
 |  */ | 
 |  | 
 | #include <stdarg.h> | 
 | #include <string.h> | 
 | #include <stdlib.h> | 
 |  | 
 | #include "windef.h" | 
 | #include "winbase.h" | 
 | #include "wingdi.h" | 
 | #include "winuser.h" | 
 | #include "uxtheme.h" | 
 | #include "tmschema.h" | 
 | #include "comctl32.h" | 
 | #include "wine/debug.h" | 
 |  | 
 | WINE_DEFAULT_DEBUG_CHANNEL(themingedit); | 
 |  | 
 | /* Draw themed border */ | 
 | static void nc_paint (HTHEME theme, HWND hwnd, HRGN region) | 
 | { | 
 |     HRGN cliprgn = region; | 
 |     DWORD exStyle = GetWindowLongW (hwnd, GWL_EXSTYLE); | 
 |     if (exStyle & WS_EX_CLIENTEDGE) | 
 |     { | 
 |         HDC dc; | 
 |         RECT r; | 
 |         int cxEdge = GetSystemMetrics (SM_CXEDGE), | 
 |             cyEdge = GetSystemMetrics (SM_CYEDGE); | 
 |         int part = EP_EDITTEXT; | 
 |         int state = ETS_NORMAL; | 
 |         DWORD dwStyle = GetWindowLongW (hwnd, GWL_STYLE); | 
 |      | 
 |         if (!IsWindowEnabled (hwnd)) | 
 |             state = ETS_DISABLED; | 
 |         else if (dwStyle & ES_READONLY) | 
 |             state = ETS_READONLY; | 
 |         else if (GetFocus() == hwnd) | 
 |             state = ETS_FOCUSED; | 
 |      | 
 |         GetWindowRect(hwnd, &r); | 
 |      | 
 |         /* New clipping region passed to default proc to exclude border */ | 
 |         cliprgn = CreateRectRgn (r.left + cxEdge, r.top + cyEdge, | 
 |             r.right - cxEdge, r.bottom - cyEdge); | 
 |         if (region != (HRGN)1) | 
 |             CombineRgn (cliprgn, cliprgn, region, RGN_AND); | 
 |         OffsetRect(&r, -r.left, -r.top); | 
 |      | 
 |         dc = GetDCEx(hwnd, region, DCX_WINDOW|DCX_INTERSECTRGN); | 
 |         OffsetRect(&r, -r.left, -r.top); | 
 |      | 
 |         if (IsThemeBackgroundPartiallyTransparent (theme, part, state)) | 
 |             DrawThemeParentBackground(hwnd, dc, &r); | 
 |         DrawThemeBackground (theme, dc, part, state, &r, 0); | 
 |         ReleaseDC(hwnd, dc); | 
 |     } | 
 |  | 
 |     /* Call default proc to get the scrollbars etc. also painted */ | 
 |     DefWindowProcW (hwnd, WM_NCPAINT, (WPARAM)cliprgn, 0); | 
 | } | 
 |  | 
 | /********************************************************************** | 
 |  * The edit control subclass window proc. | 
 |  */ | 
 | LRESULT CALLBACK THEMING_EditSubclassProc (HWND hwnd, UINT msg,  | 
 |                                            WPARAM wParam, LPARAM lParam,  | 
 |                                            ULONG_PTR dwRefData) | 
 | { | 
 |     const WCHAR* themeClass = WC_EDITW; | 
 |     HTHEME theme; | 
 |     LRESULT result; | 
 |        | 
 |     switch (msg) | 
 |     { | 
 |     case WM_CREATE: | 
 |         result = THEMING_CallOriginalClass  (hwnd, msg, wParam, lParam); | 
 |         OpenThemeData( hwnd, themeClass ); | 
 |         return result; | 
 |      | 
 |     case WM_DESTROY: | 
 |         theme = GetWindowTheme( hwnd ); | 
 |         CloseThemeData ( theme ); | 
 |         return THEMING_CallOriginalClass (hwnd, msg, wParam, lParam); | 
 |  | 
 |     case WM_THEMECHANGED: | 
 |         theme = GetWindowTheme( hwnd ); | 
 |         CloseThemeData ( theme ); | 
 |         OpenThemeData( hwnd, themeClass ); | 
 |         break; | 
 |          | 
 |     case WM_SYSCOLORCHANGE: | 
 |         theme = GetWindowTheme( hwnd ); | 
 | 	if (!theme) return THEMING_CallOriginalClass (hwnd, msg, wParam, lParam); | 
 |         /* Do nothing. When themed, a WM_THEMECHANGED will be received, too, | 
 |    	 * which will do the repaint. */ | 
 |         break; | 
 |          | 
 |     case WM_NCPAINT: | 
 |         theme = GetWindowTheme( hwnd ); | 
 |         if (!theme) return THEMING_CallOriginalClass (hwnd, msg, wParam, lParam); | 
 |         nc_paint (theme, hwnd, (HRGN)wParam); | 
 |         break; | 
 |  | 
 |     case WM_ENABLE: | 
 |         theme = GetWindowTheme( hwnd ); | 
 |         if (theme) RedrawWindow (hwnd, NULL, NULL,  | 
 |             RDW_FRAME | RDW_INVALIDATE | RDW_UPDATENOW); | 
 |         return THEMING_CallOriginalClass (hwnd, msg, wParam, lParam); | 
 |          | 
 |     default:  | 
 | 	/* Call old proc */ | 
 | 	return THEMING_CallOriginalClass (hwnd, msg, wParam, lParam); | 
 |     } | 
 |     return 0; | 
 | } |