15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/native_theme/native_theme_win.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <windows.h> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <uxtheme.h> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vsstyle.h> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vssym32.h> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_handle.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/scoped_gdi_object.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/scoped_hdc.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/scoped_select_object.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/windows_version.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "skia/ext/bitmap_platform_device.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "skia/ext/platform_canvas.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "skia/ext/skia_utils_win.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkCanvas.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkColorPriv.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkShader.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/color_utils.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/gdi_util.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h" 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/rect_conversions.h" 30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/gfx/sys_color_change_listener.h" 31d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/gfx/win/dpi.h" 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/native_theme/common_theme.h" 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This was removed from Winvers.h but is still used. 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(COLOR_MENUHIGHLIGHT) 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define COLOR_MENUHIGHLIGHT 29 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO: Obtain the correct colors using GetSysColor. 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Theme colors returned by GetSystemColor(). 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const SkColor kInvalidColorIdColor = SkColorSetRGB(255, 0, 128); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Dialogs: 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const SkColor kDialogBackgroundColor = SkColorSetRGB(251, 251, 251); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// FocusableBorder: 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const SkColor kFocusedBorderColor = SkColorSetRGB(0x4d, 0x90, 0xfe); 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const SkColor kUnfocusedBorderColor = SkColorSetRGB(0xd9, 0xd9, 0xd9); 4990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Button: 5090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const SkColor kButtonBackgroundColor = SkColorSetRGB(0xde, 0xde, 0xde); 5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const SkColor kButtonHighlightColor = SkColorSetARGB(200, 255, 255, 255); 5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const SkColor kButtonHoverColor = SkColorSetRGB(6, 45, 117); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MenuItem: 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const SkColor kEnabledMenuItemForegroundColor = SkColorSetRGB(6, 45, 117); 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const SkColor kDisabledMenuItemForegroundColor = SkColorSetRGB(161, 161, 146); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const SkColor kFocusedMenuItemBackgroundColor = SkColorSetRGB(246, 249, 253); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const SkColor kMenuSeparatorColor = SkColorSetARGB(50, 0, 0, 0); 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Table: 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const SkColor kTreeSelectionBackgroundUnfocused = SkColorSetRGB(240, 240, 240); 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Windows system color IDs cached and updated by the native theme. 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kSystemColors[] = { 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) COLOR_3DFACE, 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) COLOR_BTNTEXT, 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) COLOR_GRAYTEXT, 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) COLOR_HIGHLIGHT, 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) COLOR_HIGHLIGHTTEXT, 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) COLOR_SCROLLBAR, 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) COLOR_WINDOW, 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) COLOR_WINDOWTEXT, 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) COLOR_BTNFACE, 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) COLOR_MENUHIGHLIGHT, 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetCheckerboardShader(SkPaint* paint, const RECT& align_rect) { 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a 2x2 checkerboard pattern using the 3D face and highlight colors. 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const SkColor face = color_utils::GetSysSkColor(COLOR_3DFACE); 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const SkColor highlight = color_utils::GetSysSkColor(COLOR_3DHILIGHT); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkColor buffer[] = { face, highlight, highlight, face }; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Confusing bit: we first create a temporary bitmap with our desired pattern, 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // then copy it to another bitmap. The temporary bitmap doesn't take 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ownership of the pixel data, and so will point to garbage when this 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // function returns. The copy will copy the pixel data into a place owned by 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the bitmap, which is in turn owned by the shader, etc., so it will live 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // until we're done using it. 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkBitmap temp_bitmap; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) temp_bitmap.setConfig(SkBitmap::kARGB_8888_Config, 2, 2); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) temp_bitmap.setPixels(buffer); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkBitmap bitmap; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) temp_bitmap.copyTo(&bitmap, temp_bitmap.config()); 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) skia::RefPtr<SkShader> shader = skia::AdoptRef( 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkShader::CreateBitmapShader( 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bitmap, SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode)); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Align the pattern with the upper corner of |align_rect|. 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkMatrix matrix; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) matrix.setTranslate(SkIntToScalar(align_rect.left), 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkIntToScalar(align_rect.top)); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shader->setLocalMatrix(matrix); 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) paint->setShader(shader.get()); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// <-a-> 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// [ ***** ] 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ____ | | 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// <-a-> <------b-----> 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a: object_width 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// b: frame_width 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// *: animating object 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - the animation goes from "[" to "]" repeatedly. 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - the animation offset is at first "|" 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ComputeAnimationProgress(int frame_width, 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int object_width, 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int pixels_per_second, 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double animated_seconds) { 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int animation_width = frame_width + object_width; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double interval = static_cast<double>(animation_width) / pixels_per_second; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double ratio = fmod(animated_seconds, interval) / interval; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<int>(animation_width * ratio) - object_width; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RECT InsetRect(const RECT* rect, int size) { 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect result(*rect); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.Inset(size, size); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result.ToRECT(); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Returns true if using a high contrast theme. 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool UsingHighContrastTheme() { 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HIGHCONTRAST result; 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result.cbSize = sizeof(HIGHCONTRAST); 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return SystemParametersInfo(SPI_GETHIGHCONTRAST, result.cbSize, &result, 0) && 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (result.dwFlags & HCF_HIGHCONTRASTON) == HCF_HIGHCONTRASTON; 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui { 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool NativeThemeWin::IsThemingActive() const { 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_theme_active_) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !!is_theme_active_(); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT NativeThemeWin::GetThemeColor(ThemeName theme, 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int part_id, 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int state_id, 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int prop_id, 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkColor* color) const { 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HANDLE handle = GetThemeHandle(theme); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (handle && get_theme_color_) { 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) COLORREF color_ref; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (get_theme_color_(handle, part_id, state_id, prop_id, &color_ref) == 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) S_OK) { 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *color = skia::COLORREFToSkColor(color_ref); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOTIMPL; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SkColor NativeThemeWin::GetThemeColorWithDefault(ThemeName theme, 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int part_id, 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int state_id, 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int prop_id, 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int default_sys_color) const { 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkColor color; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetThemeColor(theme, part_id, state_id, prop_id, &color) != S_OK) 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) color = color_utils::GetSysSkColor(default_sys_color); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return color; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Size NativeThemeWin::GetThemeBorderSize(ThemeName theme) const { 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For simplicity use the wildcard state==0, part==0, since it works 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for the cases we currently depend on. 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int border; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetThemeInt(theme, 0, 0, TMT_BORDERSIZE, &border) == S_OK) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Size(border, border); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Size(GetSystemMetrics(SM_CXEDGE), GetSystemMetrics(SM_CYEDGE)); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeThemeWin::DisableTheming() const { 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!set_theme_properties_) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_theme_properties_(0); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeThemeWin::CloseHandles() const { 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!close_theme_) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < LAST; ++i) { 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (theme_handles_[i]) { 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) close_theme_(theme_handles_[i]); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) theme_handles_[i] = NULL; 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool NativeThemeWin::IsClassicTheme(ThemeName name) const { 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!theme_dll_) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !GetThemeHandle(name); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(sky): seems like we should default to NativeThemeWin, but that currently 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// breaks a couple of tests (FocusTraversalTest.NormalTraversal in 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// views_unittests). 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(USE_AURA) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NativeTheme* NativeTheme::instance() { 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NativeThemeWin::instance(); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NativeThemeWin* NativeThemeWin::instance() { 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CR_DEFINE_STATIC_LOCAL(NativeThemeWin, s_native_theme, ()); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &s_native_theme; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Size NativeThemeWin::GetPartSize(Part part, 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) State state, 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ExtraParams& extra) const { 230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Size part_size = CommonThemeGetPartSize(part, state, extra); 231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!part_size.IsEmpty()) 232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return part_size; 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The GetThemePartSize call below returns the default size without 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // accounting for user customization (crbug/218291). 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SIZE size; 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (part) { 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case kScrollbarDownArrow: 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case kScrollbarLeftArrow: 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case kScrollbarRightArrow: 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case kScrollbarUpArrow: 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case kScrollbarHorizontalThumb: 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case kScrollbarVerticalThumb: 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case kScrollbarHorizontalTrack: 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case kScrollbarVerticalTrack: 24658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) size.cx = size.cy = gfx::win::GetSystemMetricsInDIP(SM_CXVSCROLL); 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::Size(size.cx, size.cy); 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int part_id = GetWindowsPart(part, state, extra); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int state_id = GetWindowsState(part, state, extra); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HDC hdc = GetDC(NULL); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HRESULT hr = GetThemePartSize(GetThemeName(part), hdc, part_id, state_id, 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, TS_TRUE, &size); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReleaseDC(NULL, hdc); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (FAILED(hr)) { 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(rogerta): For now, we need to support radio buttons and checkboxes 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // when theming is not enabled. Support for other parts can be added 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if/when needed. 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (part) { 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kCheckbox: 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kRadio: 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(rogerta): I was not able to find any API to get the default 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // size of these controls, so determined these values empirically. 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size.cx = 13; 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size.cy = 13; 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size.cx = 0; 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size.cy = 0; 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Size(size.cx, size.cy); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeThemeWin::Paint(SkCanvas* canvas, 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Part part, 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) State state, 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& rect, 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ExtraParams& extra) const { 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (rect.IsEmpty()) 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (part) { 289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case kMenuPopupGutter: 290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CommonThemePaintMenuGutter(canvas, rect); 291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case kMenuPopupSeparator: 293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CommonThemePaintMenuSeparator(canvas, rect, extra.menu_separator); 294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case kMenuPopupBackground: 296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CommonThemePaintMenuBackground(canvas, rect); 297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case kMenuItemBackground: 299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CommonThemePaintMenuItemBackground(canvas, state, rect); 300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool needs_paint_indirect = false; 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!skia::SupportsPlatformPaint(canvas)) { 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This block will only get hit with --enable-accelerated-drawing flag. 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) needs_paint_indirect = true; 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Scrollbar components on Windows Classic theme (on all Windows versions) 309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // have particularly problematic alpha values, so always draw them 310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // indirectly. In addition, scrollbar thumbs and grippers for the Windows XP 311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // theme (available only on Windows XP) also need their alpha values 312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // fixed. 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (part) { 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kScrollbarDownArrow: 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kScrollbarUpArrow: 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kScrollbarLeftArrow: 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kScrollbarRightArrow: 318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!GetThemeHandle(SCROLLBAR)) 319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) needs_paint_indirect = true; 320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kScrollbarHorizontalThumb: 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kScrollbarVerticalThumb: 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kScrollbarHorizontalGripper: 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kScrollbarVerticalGripper: 325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!GetThemeHandle(SCROLLBAR) || 326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::win::GetVersion() == base::win::VERSION_XP) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) needs_paint_indirect = true; 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (needs_paint_indirect) 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PaintIndirect(canvas, part, state, rect, extra); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PaintDirect(canvas, part, state, rect, extra); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NativeThemeWin::NativeThemeWin() 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : theme_dll_(LoadLibrary(L"uxtheme.dll")), 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) draw_theme_(NULL), 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) draw_theme_ex_(NULL), 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) get_theme_color_(NULL), 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) get_theme_content_rect_(NULL), 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) get_theme_part_size_(NULL), 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) open_theme_(NULL), 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) close_theme_(NULL), 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_theme_properties_(NULL), 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_theme_active_(NULL), 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) get_theme_int_(NULL), 352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) color_change_listener_(this) { 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (theme_dll_) { 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) draw_theme_ = reinterpret_cast<DrawThemeBackgroundPtr>( 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetProcAddress(theme_dll_, "DrawThemeBackground")); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) draw_theme_ex_ = reinterpret_cast<DrawThemeBackgroundExPtr>( 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetProcAddress(theme_dll_, "DrawThemeBackgroundEx")); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) get_theme_color_ = reinterpret_cast<GetThemeColorPtr>( 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetProcAddress(theme_dll_, "GetThemeColor")); 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) get_theme_content_rect_ = reinterpret_cast<GetThemeContentRectPtr>( 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetProcAddress(theme_dll_, "GetThemeBackgroundContentRect")); 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) get_theme_part_size_ = reinterpret_cast<GetThemePartSizePtr>( 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetProcAddress(theme_dll_, "GetThemePartSize")); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) open_theme_ = reinterpret_cast<OpenThemeDataPtr>( 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetProcAddress(theme_dll_, "OpenThemeData")); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) close_theme_ = reinterpret_cast<CloseThemeDataPtr>( 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetProcAddress(theme_dll_, "CloseThemeData")); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_theme_properties_ = reinterpret_cast<SetThemeAppPropertiesPtr>( 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetProcAddress(theme_dll_, "SetThemeAppProperties")); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_theme_active_ = reinterpret_cast<IsThemeActivePtr>( 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetProcAddress(theme_dll_, "IsThemeActive")); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) get_theme_int_ = reinterpret_cast<GetThemeIntPtr>( 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetProcAddress(theme_dll_, "GetThemeInt")); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(theme_handles_, 0, sizeof(theme_handles_)); 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Initialize the cached system colors. 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateSystemColors(); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NativeThemeWin::~NativeThemeWin() { 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (theme_dll_) { 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // todo (cpu): fix this soon. Making a call to CloseHandles() here breaks 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // certain tests and the reliability bots. 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // CloseHandles(); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FreeLibrary(theme_dll_); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NativeThemeWin::OnSysColorChange() { 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateSystemColors(); 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NativeThemeWin::UpdateSystemColors() { 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int i = 0; i < arraysize(kSystemColors); ++i) { 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) system_colors_[kSystemColors[i]] = 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) color_utils::GetSysSkColor(kSystemColors[i]); 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeThemeWin::PaintDirect(SkCanvas* canvas, 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Part part, 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) State state, 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& rect, 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ExtraParams& extra) const { 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) skia::ScopedPlatformPaint scoped_platform_paint(canvas); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HDC hdc = scoped_platform_paint.GetPlatformSurface(); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (part) { 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kCheckbox: 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PaintCheckbox(hdc, part, state, rect, extra.button); 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kRadio: 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PaintRadioButton(hdc, part, state, rect, extra.button); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kPushButton: 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PaintPushButton(hdc, part, state, rect, extra.button); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kMenuPopupArrow: 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PaintMenuArrow(hdc, state, rect, extra.menu_arrow); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kMenuPopupGutter: 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PaintMenuGutter(hdc, rect); 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kMenuPopupSeparator: 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PaintMenuSeparator(hdc, rect, extra.menu_separator); 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kMenuPopupBackground: 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PaintMenuBackground(hdc, rect); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kMenuCheck: 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PaintMenuCheck(hdc, state, rect, extra.menu_check); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kMenuCheckBackground: 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PaintMenuCheckBackground(hdc, state, rect); 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kMenuItemBackground: 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PaintMenuItemBackground(hdc, state, rect, extra.menu_item); 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kMenuList: 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PaintMenuList(hdc, state, rect, extra.menu_list); 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kScrollbarDownArrow: 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kScrollbarUpArrow: 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kScrollbarLeftArrow: 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kScrollbarRightArrow: 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PaintScrollbarArrow(hdc, part, state, rect, extra.scrollbar_arrow); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kScrollbarHorizontalTrack: 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kScrollbarVerticalTrack: 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PaintScrollbarTrack(canvas, hdc, part, state, rect, 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra.scrollbar_track); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kScrollbarHorizontalThumb: 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kScrollbarVerticalThumb: 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kScrollbarHorizontalGripper: 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kScrollbarVerticalGripper: 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PaintScrollbarThumb(hdc, part, state, rect, extra.scrollbar_thumb); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kInnerSpinButton: 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PaintSpinButton(hdc, part, state, rect, extra.inner_spin); 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kTrackbarThumb: 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kTrackbarTrack: 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PaintTrackbar(canvas, hdc, part, state, rect, extra.trackbar); 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kProgressBar: 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PaintProgressBar(hdc, rect, extra.progress_bar); 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kWindowResizeGripper: 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PaintWindowResizeGripper(hdc, rect); 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kTabPanelBackground: 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PaintTabPanelBackground(hdc, rect); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kTextField: 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PaintTextField(hdc, part, state, rect, extra.text_field); 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kSliderTrack: 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kSliderThumb: 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // While transitioning NativeThemeWin to the single Paint() entry point, 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // unsupported parts will DCHECK here. 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SkColor NativeThemeWin::GetSystemColor(ColorId color_id) const { 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkColor color; 491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (CommonThemeGetSystemColor(color_id, &color)) 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return color; 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (color_id) { 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Windows 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case kColorId_WindowBackground: 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return system_colors_[COLOR_WINDOW]; 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Dialogs 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kColorId_DialogBackground: 501eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (gfx::IsInvertedColorScheme()) 502eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return color_utils::InvertColor(kDialogBackgroundColor); 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kDialogBackgroundColor; 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // FocusableBorder 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kColorId_FocusedBorderColor: 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kFocusedBorderColor; 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kColorId_UnfocusedBorderColor: 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kUnfocusedBorderColor; 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Button 51290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case kColorId_ButtonBackgroundColor: 51390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return kButtonBackgroundColor; 51490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case kColorId_ButtonEnabledColor: 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return system_colors_[COLOR_BTNTEXT]; 51690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case kColorId_ButtonDisabledColor: 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return system_colors_[COLOR_GRAYTEXT]; 51890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case kColorId_ButtonHighlightColor: 51990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return kButtonHighlightColor; 52090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case kColorId_ButtonHoverColor: 52190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return kButtonHoverColor; 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // MenuItem 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kColorId_EnabledMenuItemForegroundColor: 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kEnabledMenuItemForegroundColor; 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kColorId_DisabledMenuItemForegroundColor: 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kDisabledMenuItemForegroundColor; 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kColorId_FocusedMenuItemBackgroundColor: 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kFocusedMenuItemBackgroundColor; 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kColorId_MenuSeparatorColor: 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kMenuSeparatorColor; 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Label 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kColorId_LabelEnabledColor: 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return system_colors_[COLOR_BTNTEXT]; 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kColorId_LabelDisabledColor: 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return system_colors_[COLOR_GRAYTEXT]; 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kColorId_LabelBackgroundColor: 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return system_colors_[COLOR_WINDOW]; 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Textfield 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kColorId_TextfieldDefaultColor: 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return system_colors_[COLOR_WINDOWTEXT]; 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kColorId_TextfieldDefaultBackground: 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return system_colors_[COLOR_WINDOW]; 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case kColorId_TextfieldReadOnlyColor: 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return system_colors_[COLOR_GRAYTEXT]; 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case kColorId_TextfieldReadOnlyBackground: 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return system_colors_[COLOR_3DFACE]; 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kColorId_TextfieldSelectionColor: 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return system_colors_[COLOR_HIGHLIGHTTEXT]; 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kColorId_TextfieldSelectionBackgroundFocused: 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return system_colors_[COLOR_HIGHLIGHT]; 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Tree 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // NOTE: these aren't right for all themes, but as close as I could get. 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case kColorId_TreeBackground: 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return system_colors_[COLOR_WINDOW]; 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case kColorId_TreeText: 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return system_colors_[COLOR_WINDOWTEXT]; 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case kColorId_TreeSelectedText: 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return system_colors_[COLOR_HIGHLIGHTTEXT]; 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case kColorId_TreeSelectedTextUnfocused: 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return system_colors_[COLOR_BTNTEXT]; 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case kColorId_TreeSelectionBackgroundFocused: 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return system_colors_[COLOR_HIGHLIGHT]; 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case kColorId_TreeSelectionBackgroundUnfocused: 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return system_colors_[UsingHighContrastTheme() ? 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) COLOR_MENUHIGHLIGHT : COLOR_BTNFACE]; 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case kColorId_TreeArrow: 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return system_colors_[COLOR_WINDOWTEXT]; 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Table 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case kColorId_TableBackground: 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return system_colors_[COLOR_WINDOW]; 5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case kColorId_TableText: 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return system_colors_[COLOR_WINDOWTEXT]; 5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case kColorId_TableSelectedText: 5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return system_colors_[COLOR_HIGHLIGHTTEXT]; 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case kColorId_TableSelectedTextUnfocused: 5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return system_colors_[COLOR_BTNTEXT]; 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case kColorId_TableSelectionBackgroundFocused: 5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return system_colors_[COLOR_HIGHLIGHT]; 5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case kColorId_TableSelectionBackgroundUnfocused: 5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return system_colors_[UsingHighContrastTheme() ? 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) COLOR_MENUHIGHLIGHT : COLOR_BTNFACE]; 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case kColorId_TableGroupingIndicatorColor: 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return system_colors_[COLOR_GRAYTEXT]; 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kInvalidColorIdColor; 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeThemeWin::PaintIndirect(SkCanvas* canvas, 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Part part, 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) State state, 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& rect, 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ExtraParams& extra) const { 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(asvitkine): This path is pretty inefficient - for each paint operation 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it creates a new offscreen bitmap Skia canvas. This can 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be sped up by doing it only once per part/state and 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // keeping a cache of the resulting bitmaps. 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create an offscreen canvas that is backed by an HDC. 6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) skia::RefPtr<skia::BitmapPlatformDevice> device = skia::AdoptRef( 6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) skia::BitmapPlatformDevice::Create( 6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rect.width(), rect.height(), false, NULL)); 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(device); 6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkCanvas offscreen_canvas(device.get()); 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(skia::SupportsPlatformPaint(&offscreen_canvas)); 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Some of the Windows theme drawing operations do not write correct alpha 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // values for fully-opaque pixels; instead the pixels get alpha 0. This is 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // especially a problem on Windows XP or when using the Classic theme. 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // To work-around this, mark all pixels with a placeholder value, to detect 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // which pixels get touched by the paint operation. After paint, set any 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // pixels that have alpha 0 to opaque and placeholders to fully-transparent. 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SkColor placeholder = SkColorSetARGB(1, 0, 0, 0); 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) offscreen_canvas.clear(placeholder); 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Offset destination rects to have origin (0,0). 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect adjusted_rect(rect.size()); 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtraParams adjusted_extra(extra); 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (part) { 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kProgressBar: 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) adjusted_extra.progress_bar.value_rect_x = 0; 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) adjusted_extra.progress_bar.value_rect_y = 0; 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kScrollbarHorizontalTrack: 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kScrollbarVerticalTrack: 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) adjusted_extra.scrollbar_track.track_x = 0; 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) adjusted_extra.scrollbar_track.track_y = 0; 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: break; 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Draw the theme controls using existing HDC-drawing code. 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PaintDirect(&offscreen_canvas, 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) part, 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state, 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) adjusted_rect, 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) adjusted_extra); 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Copy the pixels to a bitmap that has ref-counted pixel storage, which is 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // necessary to have when drawing to a SkPicture. 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SkBitmap& hdc_bitmap = 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) offscreen_canvas.getDevice()->accessBitmap(false); 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkBitmap bitmap; 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hdc_bitmap.copyTo(&bitmap, SkBitmap::kARGB_8888_Config); 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Post-process the pixels to fix up the alpha values (see big comment above). 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SkPMColor placeholder_value = SkPreMultiplyColor(placeholder); 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int pixel_count = rect.width() * rect.height(); 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkPMColor* pixels = bitmap.getAddr32(0, 0); 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < pixel_count; i++) { 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pixels[i] == placeholder_value) { 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pixel wasn't touched - make it fully transparent. 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels[i] = SkPackARGB32(0, 0, 0, 0); 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (SkGetPackedA32(pixels[i]) == 0) { 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pixel was touched but has incorrect alpha of 0, make it fully opaque. 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels[i] = SkPackARGB32(0xFF, 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkGetPackedR32(pixels[i]), 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkGetPackedG32(pixels[i]), 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkGetPackedB32(pixels[i])); 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Draw the offscreen bitmap to the destination canvas. 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canvas->drawBitmap(bitmap, rect.x(), rect.y()); 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT NativeThemeWin::GetThemePartSize(ThemeName theme_name, 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HDC hdc, 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int part_id, 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int state_id, 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RECT* rect, 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ts, 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SIZE* size) const { 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HANDLE handle = GetThemeHandle(theme_name); 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (handle && get_theme_part_size_) 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return get_theme_part_size_(handle, hdc, part_id, state_id, rect, ts, size); 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOTIMPL; 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT NativeThemeWin::PaintButton(HDC hdc, 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) State state, 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ButtonExtraParams& extra, 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int part_id, 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int state_id, 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RECT* rect) const { 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HANDLE handle = GetThemeHandle(BUTTON); 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (handle && draw_theme_) 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return draw_theme_(handle, hdc, part_id, state_id, rect, NULL); 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adjust classic_state based on part, state, and extras. 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int classic_state = extra.classic_state; 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (part_id) { 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case BP_CHECKBOX: 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) classic_state |= DFCS_BUTTONCHECK; 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case BP_RADIOBUTTON: 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) classic_state |= DFCS_BUTTONRADIO; 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case BP_PUSHBUTTON: 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) classic_state |= DFCS_BUTTONPUSH; 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Unknown part_id: " << part_id; 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (state) { 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kDisabled: 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) classic_state |= DFCS_INACTIVE; 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kPressed: 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) classic_state |= DFCS_PUSHED; 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kNormal: 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kHovered: 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Unknown state: " << state; 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extra.checked) 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) classic_state |= DFCS_CHECKED; 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Draw it manually. 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // All pressed states have both low bits set, and no other states do. 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const bool focused = ((state_id & ETS_FOCUSED) == ETS_FOCUSED); 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const bool pressed = ((state_id & PBS_PRESSED) == PBS_PRESSED); 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((BP_PUSHBUTTON == part_id) && (pressed || focused)) { 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BP_PUSHBUTTON has a focus rect drawn around the outer edge, and the 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // button itself is shrunk by 1 pixel. 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HBRUSH brush = GetSysColorBrush(COLOR_3DDKSHADOW); 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (brush) { 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FrameRect(hdc, rect, brush); 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InflateRect(rect, -1, -1); 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DrawFrameControl(hdc, rect, DFC_BUTTON, classic_state); 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Draw the focus rectangle (the dotted line box) only on buttons. For radio 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and checkboxes, we let webkit draw the focus rectangle (orange glow). 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((BP_PUSHBUTTON == part_id) && focused) { 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The focus rect is inside the button. The exact number of pixels depends 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // on whether we're in classic mode or using uxtheme. 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (handle && get_theme_content_rect_) { 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) get_theme_content_rect_(handle, hdc, part_id, state_id, rect, rect); 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InflateRect(rect, -GetSystemMetrics(SM_CXEDGE), 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) -GetSystemMetrics(SM_CYEDGE)); 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DrawFocusRect(hdc, rect); 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 763c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Classic theme doesn't support indeterminate checkboxes. We draw 764c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // a recangle inside a checkbox like IE10 does. 765c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (part_id == BP_CHECKBOX && extra.indeterminate) { 766c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RECT inner_rect = *rect; 767c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // "4 / 13" is same as IE10 in classic theme. 768c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int padding = (inner_rect.right - inner_rect.left) * 4 / 13; 769c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InflateRect(&inner_rect, -padding, -padding); 770c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int color_index = state == kDisabled ? COLOR_GRAYTEXT : COLOR_WINDOWTEXT; 771c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FillRect(hdc, &inner_rect, GetSysColorBrush(color_index)); 772c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 773c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT NativeThemeWin::PaintMenuSeparator( 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HDC hdc, 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& rect, 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MenuSeparatorExtraParams& extra) const { 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RECT rect_win = rect.ToRECT(); 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HANDLE handle = GetThemeHandle(MENU); 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (handle && draw_theme_) { 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delta is needed for non-classic to move separator up slightly. 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --rect_win.top; 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --rect_win.bottom; 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return draw_theme_(handle, hdc, MENU_POPUPSEPARATOR, MPI_NORMAL, &rect_win, 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DrawEdge(hdc, &rect_win, EDGE_ETCHED, BF_TOP); 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT NativeThemeWin::PaintMenuGutter(HDC hdc, 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& rect) const { 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RECT rect_win = rect.ToRECT(); 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HANDLE handle = GetThemeHandle(MENU); 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (handle && draw_theme_) 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return draw_theme_(handle, hdc, MENU_POPUPGUTTER, MPI_NORMAL, &rect_win, 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOTIMPL; 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT NativeThemeWin::PaintMenuArrow(HDC hdc, 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) State state, 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& rect, 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MenuArrowExtraParams& extra) 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const { 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int state_id = MSM_NORMAL; 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (state == kDisabled) 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = MSM_DISABLED; 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HANDLE handle = GetThemeHandle(MENU); 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RECT rect_win = rect.ToRECT(); 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (handle && draw_theme_) { 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extra.pointing_right) { 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return draw_theme_(handle, hdc, MENU_POPUPSUBMENU, state_id, &rect_win, 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There is no way to tell the uxtheme API to draw a left pointing arrow; 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it doesn't have a flag equivalent to DFCS_MENUARROWRIGHT. But they 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // are needed for RTL locales on Vista. So use a memory DC and mirror 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the region with GDI's StretchBlt. 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect r(rect); 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::win::ScopedCreateDC mem_dc(CreateCompatibleDC(hdc)); 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::win::ScopedBitmap mem_bitmap(CreateCompatibleBitmap(hdc, r.width(), 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.height())); 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::win::ScopedSelectObject select_bitmap(mem_dc, mem_bitmap); 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Copy and horizontally mirror the background from hdc into mem_dc. Use 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a negative-width source rect, starting at the rightmost pixel. 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StretchBlt(mem_dc, 0, 0, r.width(), r.height(), 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hdc, r.right()-1, r.y(), -r.width(), r.height(), SRCCOPY); 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Draw the arrow. 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RECT theme_rect = {0, 0, r.width(), r.height()}; 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HRESULT result = draw_theme_(handle, mem_dc, MENU_POPUPSUBMENU, 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id, &theme_rect, NULL); 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Copy and mirror the result back into mem_dc. 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StretchBlt(hdc, r.x(), r.y(), r.width(), r.height(), 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mem_dc, r.width()-1, 0, -r.width(), r.height(), SRCCOPY); 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For some reason, Windows uses the name DFCS_MENUARROWRIGHT to indicate a 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // left pointing arrow. This makes the following 'if' statement slightly 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // counterintuitive. 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UINT pfc_state; 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extra.pointing_right) 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfc_state = DFCS_MENUARROW; 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfc_state = DFCS_MENUARROWRIGHT; 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PaintFrameControl(hdc, rect, DFC_MENU, pfc_state, extra.is_selected, 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state); 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT NativeThemeWin::PaintMenuBackground(HDC hdc, 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& rect) const { 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HANDLE handle = GetThemeHandle(MENU); 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RECT rect_win = rect.ToRECT(); 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (handle && draw_theme_) { 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HRESULT result = draw_theme_(handle, hdc, MENU_POPUPBACKGROUND, 0, 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &rect_win, NULL); 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FrameRect(hdc, &rect_win, GetSysColorBrush(COLOR_3DSHADOW)); 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FillRect(hdc, &rect_win, GetSysColorBrush(COLOR_MENU)); 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DrawEdge(hdc, &rect_win, EDGE_RAISED, BF_RECT); 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT NativeThemeWin::PaintMenuCheck( 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HDC hdc, 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) State state, 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& rect, 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MenuCheckExtraParams& extra) const { 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HANDLE handle = GetThemeHandle(MENU); 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int state_id; 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extra.is_radio) { 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = state == kDisabled ? MC_BULLETDISABLED : MC_BULLETNORMAL; 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = state == kDisabled ? MC_CHECKMARKDISABLED : MC_CHECKMARKNORMAL; 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RECT rect_win = rect.ToRECT(); 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (handle && draw_theme_) 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return draw_theme_(handle, hdc, MENU_POPUPCHECK, state_id, &rect_win, NULL); 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PaintFrameControl(hdc, rect, DFC_MENU, 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra.is_radio ? DFCS_MENUBULLET : DFCS_MENUCHECK, 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra.is_selected, state); 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT NativeThemeWin::PaintMenuCheckBackground(HDC hdc, 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) State state, 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& rect) const { 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HANDLE handle = GetThemeHandle(MENU); 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int state_id = state == kDisabled ? MCB_DISABLED : MCB_NORMAL; 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RECT rect_win = rect.ToRECT(); 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (handle && draw_theme_) 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return draw_theme_(handle, hdc, MENU_POPUPCHECKBACKGROUND, state_id, 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &rect_win, NULL); 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Nothing to do for background. 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT NativeThemeWin::PaintMenuItemBackground( 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HDC hdc, 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) State state, 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& rect, 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MenuItemExtraParams& extra) const { 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HANDLE handle = GetThemeHandle(MENU); 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RECT rect_win = rect.ToRECT(); 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int state_id; 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (state) { 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kNormal: 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = MPI_NORMAL; 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kDisabled: 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = extra.is_selected ? MPI_DISABLEDHOT : MPI_DISABLED; 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kHovered: 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = MPI_HOT; 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Invalid state " << state; 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (handle && draw_theme_) 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return draw_theme_(handle, hdc, MENU_POPUPITEM, state_id, &rect_win, NULL); 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extra.is_selected) 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FillRect(hdc, &rect_win, GetSysColorBrush(COLOR_HIGHLIGHT)); 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT NativeThemeWin::PaintPushButton(HDC hdc, 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Part part, 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) State state, 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& rect, 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ButtonExtraParams& extra) const { 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int state_id; 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (state) { 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kDisabled: 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = PBS_DISABLED; 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kHovered: 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = PBS_HOT; 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kNormal: 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = extra.is_default ? PBS_DEFAULTED : PBS_NORMAL; 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kPressed: 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = PBS_PRESSED; 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Invalid state: " << state; 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RECT rect_win = rect.ToRECT(); 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PaintButton(hdc, state, extra, BP_PUSHBUTTON, state_id, &rect_win); 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT NativeThemeWin::PaintRadioButton(HDC hdc, 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Part part, 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) State state, 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& rect, 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ButtonExtraParams& extra) const { 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int state_id; 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (state) { 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kDisabled: 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = extra.checked ? RBS_CHECKEDDISABLED : RBS_UNCHECKEDDISABLED; 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kHovered: 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = extra.checked ? RBS_CHECKEDHOT : RBS_UNCHECKEDHOT; 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kNormal: 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = extra.checked ? RBS_CHECKEDNORMAL : RBS_UNCHECKEDNORMAL; 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kPressed: 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = extra.checked ? RBS_CHECKEDPRESSED : RBS_UNCHECKEDPRESSED; 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Invalid state: " << state; 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RECT rect_win = rect.ToRECT(); 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PaintButton(hdc, state, extra, BP_RADIOBUTTON, state_id, &rect_win); 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT NativeThemeWin::PaintCheckbox(HDC hdc, 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Part part, 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) State state, 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& rect, 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ButtonExtraParams& extra) const { 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int state_id; 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (state) { 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kDisabled: 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = extra.checked ? CBS_CHECKEDDISABLED : 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra.indeterminate ? CBS_MIXEDDISABLED : 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CBS_UNCHECKEDDISABLED; 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kHovered: 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = extra.checked ? CBS_CHECKEDHOT : 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra.indeterminate ? CBS_MIXEDHOT : 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CBS_UNCHECKEDHOT; 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kNormal: 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = extra.checked ? CBS_CHECKEDNORMAL : 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra.indeterminate ? CBS_MIXEDNORMAL : 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CBS_UNCHECKEDNORMAL; 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kPressed: 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = extra.checked ? CBS_CHECKEDPRESSED : 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra.indeterminate ? CBS_MIXEDPRESSED : 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CBS_UNCHECKEDPRESSED; 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Invalid state: " << state; 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RECT rect_win = rect.ToRECT(); 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PaintButton(hdc, state, extra, BP_CHECKBOX, state_id, &rect_win); 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT NativeThemeWin::PaintMenuList(HDC hdc, 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) State state, 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& rect, 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MenuListExtraParams& extra) const { 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HANDLE handle = GetThemeHandle(MENULIST); 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RECT rect_win = rect.ToRECT(); 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int state_id; 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (state) { 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kNormal: 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = CBXS_NORMAL; 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kDisabled: 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = CBXS_DISABLED; 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kHovered: 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = CBXS_HOT; 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kPressed: 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = CBXS_PRESSED; 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Invalid state " << state; 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (handle && draw_theme_) 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return draw_theme_(handle, hdc, CP_DROPDOWNBUTTON, state_id, &rect_win, 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Draw it manually. 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DrawFrameControl(hdc, &rect_win, DFC_SCROLL, 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DFCS_SCROLLCOMBOBOX | extra.classic_state); 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT NativeThemeWin::PaintScrollbarArrow( 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HDC hdc, 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Part part, 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) State state, 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& rect, 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ScrollbarArrowExtraParams& extra) const { 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int state_id_matrix[4][kMaxState] = { 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ABS_DOWNDISABLED, ABS_DOWNHOT, ABS_DOWNNORMAL, ABS_DOWNPRESSED, 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ABS_LEFTDISABLED, ABS_LEFTHOT, ABS_LEFTNORMAL, ABS_LEFTPRESSED, 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ABS_RIGHTDISABLED, ABS_RIGHTHOT, ABS_RIGHTNORMAL, ABS_RIGHTPRESSED, 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ABS_UPDISABLED, ABS_UPHOT, ABS_UPNORMAL, ABS_UPPRESSED 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HANDLE handle = GetThemeHandle(SCROLLBAR); 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RECT rect_win = rect.ToRECT(); 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (handle && draw_theme_) { 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index = part - kScrollbarDownArrow; 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(index >=0 && index < 4); 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int state_id = state_id_matrix[index][state]; 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Hovering means that the cursor is over the scroolbar, but not over the 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // specific arrow itself. We don't want to show it "hot" mode, but only 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in "hover" mode. 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (state == kHovered && extra.is_hovering) { 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (part) { 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kScrollbarDownArrow: 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = ABS_DOWNHOVER; 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kScrollbarLeftArrow: 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = ABS_LEFTHOVER; 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kScrollbarRightArrow: 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = ABS_RIGHTHOVER; 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kScrollbarUpArrow: 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = ABS_UPHOVER; 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Invalid part: " << part; 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PaintScaledTheme(handle, hdc, SBP_ARROWBTN, state_id, rect); 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int classic_state = DFCS_SCROLLDOWN; 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (part) { 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kScrollbarDownArrow: 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) classic_state = DFCS_SCROLLDOWN; 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kScrollbarLeftArrow: 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) classic_state = DFCS_SCROLLLEFT; 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kScrollbarRightArrow: 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) classic_state = DFCS_SCROLLRIGHT; 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kScrollbarUpArrow: 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) classic_state = DFCS_SCROLLUP; 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Invalid part: " << part; 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (state) { 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kDisabled: 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) classic_state |= DFCS_INACTIVE; 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kHovered: 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) classic_state |= DFCS_HOT; 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kNormal: 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kPressed: 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) classic_state |= DFCS_PUSHED; 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Invalid state: " << state; 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DrawFrameControl(hdc, &rect_win, DFC_SCROLL, classic_state); 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT NativeThemeWin::PaintScrollbarThumb( 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HDC hdc, 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Part part, 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) State state, 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& rect, 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ScrollbarThumbExtraParams& extra) const { 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HANDLE handle = GetThemeHandle(SCROLLBAR); 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RECT rect_win = rect.ToRECT(); 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int part_id; 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int state_id; 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (part) { 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NativeTheme::kScrollbarHorizontalThumb: 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) part_id = SBP_THUMBBTNHORZ; 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NativeTheme::kScrollbarVerticalThumb: 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) part_id = SBP_THUMBBTNVERT; 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NativeTheme::kScrollbarHorizontalGripper: 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) part_id = SBP_GRIPPERHORZ; 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NativeTheme::kScrollbarVerticalGripper: 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) part_id = SBP_GRIPPERVERT; 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Invalid part: " << part; 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (state) { 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kDisabled: 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = SCRBS_DISABLED; 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kHovered: 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = extra.is_hovering ? SCRBS_HOVER : SCRBS_HOT; 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kNormal: 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = SCRBS_NORMAL; 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kPressed: 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = SCRBS_PRESSED; 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Invalid state: " << state; 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (handle && draw_theme_) 11972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PaintScaledTheme(handle, hdc, part_id, state_id, rect); 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Draw it manually. 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((part_id == SBP_THUMBBTNHORZ) || (part_id == SBP_THUMBBTNVERT)) 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DrawEdge(hdc, &rect_win, EDGE_RAISED, BF_RECT | BF_MIDDLE); 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Classic mode doesn't have a gripper. 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT NativeThemeWin::PaintScrollbarTrack( 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkCanvas* canvas, 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HDC hdc, 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Part part, 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) State state, 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& rect, 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ScrollbarTrackExtraParams& extra) const { 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HANDLE handle = GetThemeHandle(SCROLLBAR); 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RECT rect_win = rect.ToRECT(); 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int part_id; 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int state_id; 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (part) { 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NativeTheme::kScrollbarHorizontalTrack: 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) part_id = extra.is_upper ? SBP_UPPERTRACKHORZ : SBP_LOWERTRACKHORZ; 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NativeTheme::kScrollbarVerticalTrack: 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) part_id = extra.is_upper ? SBP_UPPERTRACKVERT : SBP_LOWERTRACKVERT; 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Invalid part: " << part; 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (state) { 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kDisabled: 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = SCRBS_DISABLED; 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kHovered: 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = SCRBS_HOVER; 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kNormal: 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = SCRBS_NORMAL; 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kPressed: 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = SCRBS_PRESSED; 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Invalid state: " << state; 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (handle && draw_theme_) 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return draw_theme_(handle, hdc, part_id, state_id, &rect_win, NULL); 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Draw it manually. 12522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ((system_colors_[COLOR_SCROLLBAR] != system_colors_[COLOR_3DFACE]) && 12532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (system_colors_[COLOR_SCROLLBAR] != system_colors_[COLOR_WINDOW])) { 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FillRect(hdc, &rect_win, reinterpret_cast<HBRUSH>(COLOR_SCROLLBAR + 1)); 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkPaint paint; 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RECT align_rect = gfx::Rect(extra.track_x, extra.track_y, extra.track_width, 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra.track_height).ToRECT(); 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetCheckerboardShader(&paint, align_rect); 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canvas->drawIRect(skia::RECTToSkIRect(rect_win), paint); 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extra.classic_state & DFCS_PUSHED) 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvertRect(hdc, &rect_win); 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT NativeThemeWin::PaintSpinButton( 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HDC hdc, 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Part part, 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) State state, 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& rect, 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const InnerSpinButtonExtraParams& extra) const { 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HANDLE handle = GetThemeHandle(SPIN); 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RECT rect_win = rect.ToRECT(); 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int part_id = extra.spin_up ? SPNP_UP : SPNP_DOWN; 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int state_id; 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (state) { 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kDisabled: 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = extra.spin_up ? UPS_DISABLED : DNS_DISABLED; 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kHovered: 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = extra.spin_up ? UPS_HOT : DNS_HOT; 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kNormal: 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = extra.spin_up ? UPS_NORMAL : DNS_NORMAL; 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kPressed: 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = extra.spin_up ? UPS_PRESSED : DNS_PRESSED; 12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Invalid state " << state; 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (handle && draw_theme_) 12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return draw_theme_(handle, hdc, part_id, state_id, &rect_win, NULL); 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DrawFrameControl(hdc, &rect_win, DFC_SCROLL, extra.classic_state); 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT NativeThemeWin::PaintTrackbar( 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkCanvas* canvas, 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HDC hdc, 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Part part, 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) State state, 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& rect, 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TrackbarExtraParams& extra) const { 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int part_id = part == kTrackbarTrack ? TKP_TRACK : TKP_THUMBBOTTOM; 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extra.vertical) 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) part_id = part == kTrackbarTrack ? TKP_TRACKVERT : TKP_THUMBVERT; 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int state_id = 0; 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (state) { 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kDisabled: 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = TUS_DISABLED; 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kHovered: 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = TUS_HOT; 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kNormal: 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = TUS_NORMAL; 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kPressed: 13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = TUS_PRESSED; 13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Invalid state " << state; 13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make the channel be 4 px thick in the center of the supplied rect. (4 px 13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // matches what XP does in various menus; GetThemePartSize() doesn't seem to 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // return good values here.) 13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RECT rect_win = rect.ToRECT(); 13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RECT channel_rect = rect.ToRECT(); 13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int channel_thickness = 4; 13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (part_id == TKP_TRACK) { 13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel_rect.top += 13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((channel_rect.bottom - channel_rect.top - channel_thickness) / 2); 13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel_rect.bottom = channel_rect.top + channel_thickness; 13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (part_id == TKP_TRACKVERT) { 13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel_rect.left += 13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((channel_rect.right - channel_rect.left - channel_thickness) / 2); 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel_rect.right = channel_rect.left + channel_thickness; 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } // else this isn't actually a channel, so |channel_rect| == |rect|. 13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HANDLE handle = GetThemeHandle(TRACKBAR); 13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (handle && draw_theme_) 13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return draw_theme_(handle, hdc, part_id, state_id, &channel_rect, NULL); 13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Classic mode, draw it manually. 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((part_id == TKP_TRACK) || (part_id == TKP_TRACKVERT)) { 13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DrawEdge(hdc, &channel_rect, EDGE_SUNKEN, BF_RECT); 13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (part_id == TKP_THUMBVERT) { 13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DrawEdge(hdc, &rect_win, EDGE_RAISED, BF_RECT | BF_SOFT | BF_MIDDLE); 13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Split rect into top and bottom pieces. 13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RECT top_section = rect.ToRECT(); 13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RECT bottom_section = rect.ToRECT(); 13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) top_section.bottom -= ((bottom_section.right - bottom_section.left) / 2); 13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bottom_section.top = top_section.bottom; 13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DrawEdge(hdc, &top_section, EDGE_RAISED, 13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BF_LEFT | BF_TOP | BF_RIGHT | BF_SOFT | BF_MIDDLE | BF_ADJUST); 13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Split triangular piece into two diagonals. 13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RECT& left_half = bottom_section; 13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RECT right_half = bottom_section; 13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) right_half.left += ((bottom_section.right - bottom_section.left) / 2); 13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) left_half.right = right_half.left; 13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DrawEdge(hdc, &left_half, EDGE_RAISED, 13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BF_DIAGONAL_ENDTOPLEFT | BF_SOFT | BF_MIDDLE | BF_ADJUST); 13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DrawEdge(hdc, &right_half, EDGE_RAISED, 13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BF_DIAGONAL_ENDBOTTOMLEFT | BF_SOFT | BF_MIDDLE | BF_ADJUST); 13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the button is pressed, draw hatching. 13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extra.classic_state & DFCS_PUSHED) { 13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkPaint paint; 13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetCheckerboardShader(&paint, rect_win); 13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fill all three pieces with the pattern. 13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canvas->drawIRect(skia::RECTToSkIRect(top_section), paint); 13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkScalar left_triangle_top = SkIntToScalar(left_half.top); 13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkScalar left_triangle_right = SkIntToScalar(left_half.right); 13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkPath left_triangle; 13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) left_triangle.moveTo(SkIntToScalar(left_half.left), left_triangle_top); 13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) left_triangle.lineTo(left_triangle_right, left_triangle_top); 13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) left_triangle.lineTo(left_triangle_right, 13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkIntToScalar(left_half.bottom)); 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) left_triangle.close(); 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canvas->drawPath(left_triangle, paint); 13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkScalar right_triangle_left = SkIntToScalar(right_half.left); 13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkScalar right_triangle_top = SkIntToScalar(right_half.top); 13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkPath right_triangle; 13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) right_triangle.moveTo(right_triangle_left, right_triangle_top); 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) right_triangle.lineTo(SkIntToScalar(right_half.right), 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) right_triangle_top); 13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) right_triangle.lineTo(right_triangle_left, 14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkIntToScalar(right_half.bottom)); 14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) right_triangle.close(); 14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canvas->drawPath(right_triangle, paint); 14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT NativeThemeWin::PaintProgressBar( 14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HDC hdc, 14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& rect, 14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ProgressBarExtraParams& extra) const { 14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There is no documentation about the animation speed, frame-rate, nor 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // size of moving overlay of the indeterminate progress bar. 14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // So we just observed real-world programs and guessed following parameters. 14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kDeteminateOverlayPixelsPerSecond = 300; 14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kDeteminateOverlayWidth = 120; 14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kIndeterminateOverlayPixelsPerSecond = 175; 14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kVistaIndeterminateOverlayWidth = 120; 14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kXPIndeterminateOverlayWidth = 55; 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The thickness of the bar frame inside |value_rect| 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kXPBarPadding = 3; 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RECT bar_rect = rect.ToRECT(); 14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RECT value_rect = gfx::Rect(extra.value_rect_x, 14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra.value_rect_y, 14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra.value_rect_width, 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra.value_rect_height).ToRECT(); 14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool pre_vista = base::win::GetVersion() < base::win::VERSION_VISTA; 14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HANDLE handle = GetThemeHandle(PROGRESS); 14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (handle && draw_theme_ && draw_theme_ex_) { 14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) draw_theme_(handle, hdc, PP_BAR, 0, &bar_rect, NULL); 14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int bar_width = bar_rect.right - bar_rect.left; 14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extra.determinate) { 14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(morrita): this RTL guess can be wrong. 14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should pass the direction from WebKit side. 14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_rtl = (bar_rect.right == value_rect.right && 14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bar_rect.left != value_rect.left); 14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should care the direction here because PP_CNUNK painting 14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is asymmetric. 14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DTBGOPTS value_draw_options; 14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value_draw_options.dwSize = sizeof(DTBGOPTS); 14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value_draw_options.dwFlags = is_rtl ? DTBG_MIRRORDC : 0; 14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value_draw_options.rcClip = bar_rect; 14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pre_vista) { 14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On XP, progress bar is chunk-style and has no glossy effect. 14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We need to shrink destination rect to fit the part inside the bar 14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // with an appropriate margin. 14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RECT shrunk_value_rect = InsetRect(&value_rect, kXPBarPadding); 14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) draw_theme_ex_(handle, hdc, PP_CHUNK, 0, 14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &shrunk_value_rect, &value_draw_options); 14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On Vista or later, the progress bar part has a 14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // single-block value part. It also has glossy effect. 14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // And the value part has exactly same height as the bar part 14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so we don't need to shrink the rect. 14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) draw_theme_ex_(handle, hdc, PP_FILL, 0, 14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &value_rect, &value_draw_options); 14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int dx = ComputeAnimationProgress(bar_width, 14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kDeteminateOverlayWidth, 14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kDeteminateOverlayPixelsPerSecond, 14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra.animated_seconds); 14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RECT overlay_rect = value_rect; 14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) overlay_rect.left += dx; 14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) overlay_rect.right = overlay_rect.left + kDeteminateOverlayWidth; 14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) draw_theme_(handle, hdc, PP_MOVEOVERLAY, 0, &overlay_rect, &value_rect); 14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A glossy overlay for indeterminate progress bar has small pause 14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // after each animation. We emulate this by adding an invisible margin 14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the animation has to traverse. 14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int width_with_margin = bar_width + kIndeterminateOverlayPixelsPerSecond; 14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int overlay_width = pre_vista ? 14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kXPIndeterminateOverlayWidth : kVistaIndeterminateOverlayWidth; 14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int dx = ComputeAnimationProgress(width_with_margin, 14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) overlay_width, 14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kIndeterminateOverlayPixelsPerSecond, 14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra.animated_seconds); 14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RECT overlay_rect = bar_rect; 14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) overlay_rect.left += dx; 14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) overlay_rect.right = overlay_rect.left + overlay_width; 14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pre_vista) { 14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RECT shrunk_rect = InsetRect(&overlay_rect, kXPBarPadding); 14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RECT shrunk_bar_rect = InsetRect(&bar_rect, kXPBarPadding); 14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) draw_theme_(handle, hdc, PP_CHUNK, 0, &shrunk_rect, &shrunk_bar_rect); 14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) draw_theme_(handle, hdc, PP_MOVEOVERLAY, 0, &overlay_rect, &bar_rect); 14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HBRUSH bg_brush = GetSysColorBrush(COLOR_BTNFACE); 14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HBRUSH fg_brush = GetSysColorBrush(COLOR_BTNSHADOW); 14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FillRect(hdc, &bar_rect, bg_brush); 15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FillRect(hdc, &value_rect, fg_brush); 15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DrawEdge(hdc, &bar_rect, EDGE_SUNKEN, BF_RECT | BF_ADJUST); 15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT NativeThemeWin::PaintWindowResizeGripper(HDC hdc, 15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& rect) const { 15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HANDLE handle = GetThemeHandle(STATUS); 15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RECT rect_win = rect.ToRECT(); 15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (handle && draw_theme_) { 15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Paint the status bar gripper. There doesn't seem to be a 15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // standard gripper in Windows for the space between 15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // scrollbars. This is pretty close, but it's supposed to be 15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // painted over a status bar. 15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return draw_theme_(handle, hdc, SP_GRIPPER, 0, &rect_win, NULL); 15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Draw a windows classic scrollbar gripper. 15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DrawFrameControl(hdc, &rect_win, DFC_SCROLL, DFCS_SCROLLSIZEGRIP); 15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT NativeThemeWin::PaintTabPanelBackground(HDC hdc, 15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& rect) const { 15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HANDLE handle = GetThemeHandle(TAB); 15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RECT rect_win = rect.ToRECT(); 15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (handle && draw_theme_) 15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return draw_theme_(handle, hdc, TABP_BODY, 0, &rect_win, NULL); 15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Classic just renders a flat color background. 15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FillRect(hdc, &rect_win, reinterpret_cast<HBRUSH>(COLOR_3DFACE + 1)); 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT NativeThemeWin::PaintTextField( 15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HDC hdc, 15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Part part, 15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) State state, 15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& rect, 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TextFieldExtraParams& extra) const { 15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int part_id = EP_EDITTEXT; 15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int state_id = ETS_NORMAL; 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (state) { 15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kNormal: 15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extra.is_read_only) { 15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = ETS_READONLY; 15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (extra.is_focused) { 15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = ETS_FOCUSED; 15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = ETS_NORMAL; 15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kHovered: 15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = ETS_HOT; 15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kPressed: 15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = ETS_SELECTED; 15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kDisabled: 15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = ETS_DISABLED; 15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Invalid state: " << state; 15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RECT rect_win = rect.ToRECT(); 15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PaintTextField(hdc, part_id, state_id, extra.classic_state, 15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &rect_win, 15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) skia::SkColorToCOLORREF(extra.background_color), 15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra.fill_content_area, extra.draw_edges); 15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT NativeThemeWin::PaintTextField(HDC hdc, 15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int part_id, 15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int state_id, 15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int classic_state, 15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RECT* rect, 15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) COLORREF color, 15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool fill_content_area, 15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool draw_edges) const { 15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(ojan): http://b/1210017 Figure out how to give the ability to 15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // exclude individual edges from being drawn. 15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HANDLE handle = GetThemeHandle(TEXTFIELD); 15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(mpcomplete): can we detect if the color is specified by the user, 15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and if not, just use the system color? 15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // CreateSolidBrush() accepts a RGB value but alpha must be 0. 15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HBRUSH bg_brush = CreateSolidBrush(color); 15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HRESULT hr; 15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DrawThemeBackgroundEx was introduced in XP SP2, so that it's possible 15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // draw_theme_ex_ is NULL and draw_theme_ is non-null. 15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (handle && (draw_theme_ex_ || (draw_theme_ && draw_edges))) { 15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (draw_theme_ex_) { 15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const DTBGOPTS omit_border_options = { 15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizeof(DTBGOPTS), 15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DTBG_OMITBORDER, 15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 0, 0, 0 } 15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DTBGOPTS* draw_opts = draw_edges ? NULL : &omit_border_options; 16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = draw_theme_ex_(handle, hdc, part_id, state_id, rect, draw_opts); 16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = draw_theme_(handle, hdc, part_id, state_id, rect, NULL); 16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(maruel): Need to be fixed if get_theme_content_rect_ is NULL. 16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fill_content_area && get_theme_content_rect_) { 16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RECT content_rect; 16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = get_theme_content_rect_(handle, hdc, part_id, state_id, rect, 16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &content_rect); 16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FillRect(hdc, &content_rect, bg_brush); 16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Draw it manually. 16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (draw_edges) 16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DrawEdge(hdc, rect, EDGE_SUNKEN, BF_RECT | BF_ADJUST); 16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fill_content_area) { 16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FillRect(hdc, rect, (classic_state & DFCS_INACTIVE) ? 16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<HBRUSH>(COLOR_BTNFACE + 1) : bg_brush); 16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hr = S_OK; 16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeleteObject(bg_brush); 16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hr; 16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)HRESULT NativeThemeWin::PaintScaledTheme(HANDLE theme, 16282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HDC hdc, 16292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int part_id, 16302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int state_id, 16312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Rect& rect) const { 16322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Correct the scaling and positioning of sub-components such as scrollbar 16332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // arrows and thumb grippers in the event that the world transform applies 16342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // scaling (e.g. in high-DPI mode). 16352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) XFORM save_transform; 16362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (GetWorldTransform(hdc, &save_transform)) { 16372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float scale = save_transform.eM11; 16382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (scale != 1 && save_transform.eM12 == 0) { 16392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ModifyWorldTransform(hdc, NULL, MWT_IDENTITY); 16402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect scaled_rect = gfx::ToEnclosedRect( 16412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::ScaleRect(rect, scale)); 16422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RECT bounds = gfx::Rect(scaled_rect.x() + save_transform.eDx, 16432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scaled_rect.y() + save_transform.eDy, 16442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scaled_rect.width(), 16452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scaled_rect.height()).ToRECT(); 16462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HRESULT result = draw_theme_(theme, hdc, part_id, state_id, &bounds, 16472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL); 16482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetWorldTransform(hdc, &save_transform); 16492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return result; 16502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 16512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 16522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RECT bounds = rect.ToRECT(); 16532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return draw_theme_(theme, hdc, part_id, state_id, &bounds, NULL); 16542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 16552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NativeThemeWin::ThemeName NativeThemeWin::GetThemeName(Part part) { 16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThemeName name; 16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (part) { 16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kCheckbox: 16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kRadio: 16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kPushButton: 16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name = BUTTON; 16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kInnerSpinButton: 16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name = SPIN; 16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kMenuCheck: 16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kMenuPopupGutter: 16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kMenuList: 16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kMenuPopupArrow: 16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kMenuPopupSeparator: 16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name = MENU; 16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kProgressBar: 16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name = PROGRESS; 16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kScrollbarDownArrow: 16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kScrollbarLeftArrow: 16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kScrollbarRightArrow: 16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kScrollbarUpArrow: 16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kScrollbarHorizontalThumb: 16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kScrollbarVerticalThumb: 16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kScrollbarHorizontalTrack: 16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kScrollbarVerticalTrack: 16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name = SCROLLBAR; 16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kSliderTrack: 16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kSliderThumb: 16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name = TRACKBAR; 16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kTextField: 16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name = TEXTFIELD; 16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kWindowResizeGripper: 16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name = STATUS; 16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Invalid part: " << part; 17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return name; 17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int NativeThemeWin::GetWindowsPart(Part part, 17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) State state, 17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ExtraParams& extra) { 17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int part_id; 17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (part) { 17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kCheckbox: 17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) part_id = BP_CHECKBOX; 17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kMenuCheck: 17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) part_id = MENU_POPUPCHECK; 17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kMenuPopupArrow: 17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) part_id = MENU_POPUPSUBMENU; 17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kMenuPopupGutter: 17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) part_id = MENU_POPUPGUTTER; 17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kMenuPopupSeparator: 17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) part_id = MENU_POPUPSEPARATOR; 17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kPushButton: 17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) part_id = BP_PUSHBUTTON; 17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kRadio: 17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) part_id = BP_RADIOBUTTON; 17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kWindowResizeGripper: 17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) part_id = SP_GRIPPER; 17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kScrollbarDownArrow: 17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kScrollbarLeftArrow: 17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kScrollbarRightArrow: 17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kScrollbarUpArrow: 17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) part_id = SBP_ARROWBTN; 17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kScrollbarHorizontalThumb: 17422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) part_id = SBP_THUMBBTNHORZ; 17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kScrollbarVerticalThumb: 17452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) part_id = SBP_THUMBBTNVERT; 17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Invalid part: " << part; 17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return part_id; 17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int NativeThemeWin::GetWindowsState(Part part, 17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) State state, 17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ExtraParams& extra) { 17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int state_id; 17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (part) { 17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kCheckbox: 17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (state) { 17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kNormal: 17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = CBS_UNCHECKEDNORMAL; 17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kHovered: 17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = CBS_UNCHECKEDHOT; 17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kPressed: 17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = CBS_UNCHECKEDPRESSED; 17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kDisabled: 17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = CBS_UNCHECKEDDISABLED; 17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Invalid state: " << state; 17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kMenuCheck: 17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (state) { 17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kNormal: 17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kHovered: 17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kPressed: 17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = extra.menu_check.is_radio ? MC_BULLETNORMAL 17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : MC_CHECKMARKNORMAL; 17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kDisabled: 17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = extra.menu_check.is_radio ? MC_BULLETDISABLED 17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : MC_CHECKMARKDISABLED; 17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Invalid state: " << state; 17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kMenuPopupArrow: 17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kMenuPopupGutter: 17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kMenuPopupSeparator: 17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (state) { 17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kNormal: 18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = MBI_NORMAL; 18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kHovered: 18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = MBI_HOT; 18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kPressed: 18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = MBI_PUSHED; 18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kDisabled: 18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = MBI_DISABLED; 18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Invalid state: " << state; 18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kPushButton: 18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (state) { 18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kNormal: 18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = PBS_NORMAL; 18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kHovered: 18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = PBS_HOT; 18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kPressed: 18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = PBS_PRESSED; 18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kDisabled: 18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = PBS_DISABLED; 18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Invalid state: " << state; 18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kRadio: 18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (state) { 18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kNormal: 18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = RBS_UNCHECKEDNORMAL; 18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kHovered: 18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = RBS_UNCHECKEDHOT; 18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kPressed: 18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = RBS_UNCHECKEDPRESSED; 18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kDisabled: 18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = RBS_UNCHECKEDDISABLED; 18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Invalid state: " << state; 18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kWindowResizeGripper: 18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (state) { 18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kNormal: 18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kHovered: 18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kPressed: 18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kDisabled: 18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = 1; // gripper has no windows state 18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Invalid state: " << state; 18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kScrollbarDownArrow: 18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (state) { 18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kNormal: 18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = ABS_DOWNNORMAL; 18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kHovered: 18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Mimic ScrollbarThemeChromiumWin.cpp in WebKit. 18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = base::win::GetVersion() < base::win::VERSION_VISTA ? 18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ABS_DOWNHOT : ABS_DOWNHOVER; 18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kPressed: 18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = ABS_DOWNPRESSED; 18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kDisabled: 18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = ABS_DOWNDISABLED; 18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Invalid state: " << state; 18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kScrollbarLeftArrow: 18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (state) { 18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kNormal: 18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = ABS_LEFTNORMAL; 18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kHovered: 18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Mimic ScrollbarThemeChromiumWin.cpp in WebKit. 18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = base::win::GetVersion() < base::win::VERSION_VISTA ? 18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ABS_LEFTHOT : ABS_LEFTHOVER; 18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kPressed: 18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = ABS_LEFTPRESSED; 19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kDisabled: 19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = ABS_LEFTDISABLED; 19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Invalid state: " << state; 19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kScrollbarRightArrow: 19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (state) { 19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kNormal: 19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = ABS_RIGHTNORMAL; 19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kHovered: 19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Mimic ScrollbarThemeChromiumWin.cpp in WebKit. 19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = base::win::GetVersion() < base::win::VERSION_VISTA ? 19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ABS_RIGHTHOT : ABS_RIGHTHOVER; 19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kPressed: 19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = ABS_RIGHTPRESSED; 19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kDisabled: 19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = ABS_RIGHTDISABLED; 19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Invalid state: " << state; 19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kScrollbarUpArrow: 19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (state) { 19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kNormal: 19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = ABS_UPNORMAL; 19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kHovered: 19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Mimic ScrollbarThemeChromiumWin.cpp in WebKit. 19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = base::win::GetVersion() < base::win::VERSION_VISTA ? 19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ABS_UPHOT : ABS_UPHOVER; 19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kPressed: 19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = ABS_UPPRESSED; 19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kDisabled: 19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = ABS_UPDISABLED; 19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Invalid state: " << state; 19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kScrollbarHorizontalThumb: 19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kScrollbarVerticalThumb: 19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (state) { 19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kNormal: 19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = SCRBS_NORMAL; 19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kHovered: 19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Mimic WebKit's behaviour in ScrollbarThemeChromiumWin.cpp. 19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = base::win::GetVersion() < base::win::VERSION_VISTA ? 19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SCRBS_HOT : SCRBS_HOVER; 19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kPressed: 19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = SCRBS_PRESSED; 19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kDisabled: 19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_id = SCRBS_DISABLED; 19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Invalid state: " << state; 19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Invalid part: " << part; 19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return state_id; 19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT NativeThemeWin::GetThemeInt(ThemeName theme, 19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int part_id, 19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int state_id, 19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int prop_id, 19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int *value) const { 19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HANDLE handle = GetThemeHandle(theme); 19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (handle && get_theme_int_) 19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return get_theme_int_(handle, part_id, state_id, prop_id, value); 19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOTIMPL; 19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT NativeThemeWin::PaintFrameControl(HDC hdc, 19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& rect, 19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UINT type, 19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UINT state, 19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_selected, 19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) State control_state) const { 19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int width = rect.width(); 19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int height = rect.height(); 19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DrawFrameControl for menu arrow/check wants a monochrome bitmap. 20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::win::ScopedBitmap mask_bitmap(CreateBitmap(width, height, 1, 1, NULL)); 20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mask_bitmap == NULL) 20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_OUTOFMEMORY; 20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::win::ScopedCreateDC bitmap_dc(CreateCompatibleDC(NULL)); 20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::win::ScopedSelectObject select_bitmap(bitmap_dc, mask_bitmap); 20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RECT local_rect = { 0, 0, width, height }; 20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DrawFrameControl(bitmap_dc, &local_rect, type, state); 20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We're going to use BitBlt with a b&w mask. This results in using the dest 20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // dc's text color for the black bits in the mask, and the dest dc's 20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // background color for the white bits in the mask. DrawFrameControl draws the 20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // check in black, and the background in white. 20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int bg_color_key; 20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int text_color_key; 20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (control_state) { 20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NativeTheme::kHovered: 20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bg_color_key = COLOR_HIGHLIGHT; 20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_color_key = COLOR_HIGHLIGHTTEXT; 20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NativeTheme::kNormal: 20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bg_color_key = COLOR_MENU; 20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_color_key = COLOR_MENUTEXT; 20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NativeTheme::kDisabled: 20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bg_color_key = is_selected ? COLOR_HIGHLIGHT : COLOR_MENU; 20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_color_key = COLOR_GRAYTEXT; 20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bg_color_key = COLOR_MENU; 20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_color_key = COLOR_MENUTEXT; 20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) COLORREF old_bg_color = SetBkColor(hdc, GetSysColor(bg_color_key)); 20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) COLORREF old_text_color = SetTextColor(hdc, GetSysColor(text_color_key)); 20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BitBlt(hdc, rect.x(), rect.y(), width, height, bitmap_dc, 0, 0, SRCCOPY); 20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetBkColor(hdc, old_bg_color); 20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetTextColor(hdc, old_text_color); 20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HANDLE NativeThemeWin::GetThemeHandle(ThemeName theme_name) const { 20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!open_theme_ || theme_name < 0 || theme_name >= LAST) 20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (theme_handles_[theme_name]) 20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return theme_handles_[theme_name]; 20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Not found, try to load it. 20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HANDLE handle = 0; 20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (theme_name) { 20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case BUTTON: 20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handle = open_theme_(NULL, L"Button"); 20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case LIST: 20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handle = open_theme_(NULL, L"Listview"); 20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case MENU: 20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handle = open_theme_(NULL, L"Menu"); 20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case MENULIST: 20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handle = open_theme_(NULL, L"Combobox"); 20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SCROLLBAR: 20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handle = open_theme_(NULL, L"Scrollbar"); 20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case STATUS: 20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handle = open_theme_(NULL, L"Status"); 20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TAB: 20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handle = open_theme_(NULL, L"Tab"); 20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TEXTFIELD: 20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handle = open_theme_(NULL, L"Edit"); 20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TRACKBAR: 20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handle = open_theme_(NULL, L"Trackbar"); 20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WINDOW: 20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handle = open_theme_(NULL, L"Window"); 20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PROGRESS: 20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handle = open_theme_(NULL, L"Progress"); 20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SPIN: 20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handle = open_theme_(NULL, L"Spin"); 20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) theme_handles_[theme_name] = handle; 20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return handle; 20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ui 2099