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)#ifndef UI_NATIVE_THEME_NATIVE_THEME_WIN_H_
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define UI_NATIVE_THEME_NATIVE_THEME_WIN_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A wrapper class for working with custom XP/Vista themes provided in
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// uxtheme.dll.  This is a singleton class that can be grabbed using
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NativeThemeWin::instance().
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// For more information on visual style parts and states, see:
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/userex/topics/partsandstates.asp
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <map>
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <windows.h>
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <uxtheme.h>
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkColor.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/sys_color_change_listener.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/native_theme/native_theme.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SkCanvas;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Windows implementation of native theme class.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// At the moment, this class in in transition from an older API that consists
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of several PaintXXX methods to an API, inherited from the NativeTheme base
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// class, that consists of a single Paint() method with a argument to indicate
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// what kind of part to paint.
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class NATIVE_THEME_EXPORT NativeThemeWin : public NativeTheme,
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           public gfx::SysColorChangeListener {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum ThemeName {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BUTTON,
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LIST,
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MENU,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MENULIST,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCROLLBAR,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STATUS,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TAB,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TEXTFIELD,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TRACKBAR,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WINDOW,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PROGRESS,
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SPIN,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LAST
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsThemingActive() const;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT GetThemeColor(ThemeName theme,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        int part_id,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        int state_id,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        int prop_id,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        SkColor* color) const;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get the theme color if theming is enabled.  If theming is unsupported
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // for this part, use Win32's GetSysColor to find the color specified
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // by default_sys_color.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkColor GetThemeColorWithDefault(ThemeName theme,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   int part_id,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   int state_id,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   int prop_id,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   int default_sys_color) const;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get the thickness of the border associated with the specified theme,
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // defaulting to GetSystemMetrics edge size if themes are disabled.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // In Classic Windows, borders are typically 2px; on XP+, they are 1px.
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size GetThemeBorderSize(ThemeName theme) const;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Disables all theming for top-level windows in the entire process, from
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // when this method is called until the process exits.  All the other
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // methods in this class will continue to work, but their output will ignore
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the user's theme. This is meant for use when running tests that require
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // consistent visual results.
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DisableTheming() const;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Closes cached theme handles so we can unload the DLL or update our UI
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // for a theme change.
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CloseHandles() const;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if classic theme is in use.
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsClassicTheme(ThemeName name) const;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets our singleton instance.
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static NativeThemeWin* instance();
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT PaintTextField(HDC hdc,
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         int part_id,
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         int state_id,
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         int classic_state,
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         RECT* rect,
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         COLORREF color,
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         bool fill_content_area,
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         bool draw_edges) const;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // NativeTheme implementation:
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual gfx::Size GetPartSize(Part part,
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                State state,
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                const ExtraParams& extra) const OVERRIDE;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Paint(SkCanvas* canvas,
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     Part part,
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     State state,
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const gfx::Rect& rect,
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const ExtraParams& extra) const OVERRIDE;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual SkColor GetSystemColor(ColorId color_id) const OVERRIDE;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NativeThemeWin();
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~NativeThemeWin();
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // gfx::SysColorChangeListener implementation:
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnSysColorChange() OVERRIDE;
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Update the locally cached set of system colors.
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void UpdateSystemColors();
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Paint directly to canvas' HDC.
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PaintDirect(SkCanvas* canvas,
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   Part part,
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   State state,
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   const gfx::Rect& rect,
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   const ExtraParams& extra) const;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a temporary HDC, paint to that, clean up the alpha values in the
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // temporary HDC, and then blit the result to canvas.  This is to work around
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the fact that Windows XP and some classic themes give bogus alpha values.
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PaintIndirect(SkCanvas* canvas,
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     Part part,
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     State state,
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const gfx::Rect& rect,
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const ExtraParams& extra) const;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT GetThemePartSize(ThemeName themeName,
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           HDC hdc,
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           int part_id,
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           int state_id,
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           RECT* rect,
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           int ts,
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           SIZE* size) const;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT PaintButton(HDC hdc,
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      State state,
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const ButtonExtraParams& extra,
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      int part_id,
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      int state_id,
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      RECT* rect) const;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT PaintMenuSeparator(HDC hdc,
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const gfx::Rect& rect,
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const MenuSeparatorExtraParams& extra) const;
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT PaintMenuGutter(HDC hdc, const gfx::Rect& rect) const;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |arrow_direction| determines whether the arrow is pointing to the left or
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to the right. In RTL locales, sub-menus open from right to left and
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // therefore the menu arrow should point to the left and not to the right.
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT PaintMenuArrow(HDC hdc,
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         State state,
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const gfx::Rect& rect,
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const MenuArrowExtraParams& extra) const;
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT PaintMenuBackground(HDC hdc, const gfx::Rect& rect) const;
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT PaintMenuCheck(HDC hdc,
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         State state,
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const gfx::Rect& rect,
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const MenuCheckExtraParams& extra) const;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT PaintMenuCheckBackground(HDC hdc,
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   State state,
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const gfx::Rect& rect) const;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT PaintMenuItemBackground(HDC hdc,
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  State state,
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const gfx::Rect& rect,
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const MenuItemExtraParams& extra) const;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT PaintPushButton(HDC hdc,
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          Part part,
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          State state,
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const gfx::Rect& rect,
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const ButtonExtraParams& extra) const;
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT PaintRadioButton(HDC hdc,
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           Part part,
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           State state,
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const gfx::Rect& rect,
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const ButtonExtraParams& extra) const;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT PaintCheckbox(HDC hdc,
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        Part part,
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        State state,
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const gfx::Rect& rect,
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const ButtonExtraParams& extra) const;
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT PaintMenuList(HDC hdc,
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        State state,
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const gfx::Rect& rect,
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const MenuListExtraParams& extra) const;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Paints a scrollbar arrow.  |classic_state| should have the appropriate
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // classic part number ORed in already.
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT PaintScrollbarArrow(HDC hdc,
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              Part part,
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              State state,
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const gfx::Rect& rect,
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const ScrollbarArrowExtraParams& extra) const;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT PaintScrollbarThumb(HDC hdc,
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              Part part,
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              State state,
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const gfx::Rect& rect,
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const ScrollbarThumbExtraParams& extra) const;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This method is deprecated and will be removed in the near future.
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Paints a scrollbar track section.  |align_rect| is only used in classic
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // mode, and makes sure the checkerboard pattern in |target_rect| is aligned
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // with one presumed to be in |align_rect|.
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT PaintScrollbarTrack(SkCanvas* canvas,
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              HDC hdc,
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              Part part,
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              State state,
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const gfx::Rect& rect,
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const ScrollbarTrackExtraParams& extra) const;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT PaintSpinButton(HDC hdc,
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          Part part,
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          State state,
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const gfx::Rect& rect,
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const InnerSpinButtonExtraParams& extra) const;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT PaintTrackbar(SkCanvas* canvas,
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        HDC hdc,
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        Part part,
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        State state,
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const gfx::Rect& rect,
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const TrackbarExtraParams& extra) const;
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT PaintProgressBar(HDC hdc,
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const gfx::Rect& rect,
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const ProgressBarExtraParams& extra) const;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT PaintWindowResizeGripper(HDC hdc, const gfx::Rect& rect) const;
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT PaintTabPanelBackground(HDC hdc, const gfx::Rect& rect) const;
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT PaintTextField(HDC hdc,
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         Part part,
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         State state,
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const gfx::Rect& rect,
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const TextFieldExtraParams& extra) const;
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Paints a theme part, with support for scene scaling in high-DPI mode.
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |theme| is the theme handle. |hdc| is the handle for the device context.
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |part_id| is the identifier for the part (e.g. thumb gripper). |state_id|
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // is the identifier for the rendering state of the part (e.g. hover). |rect|
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // is the bounds for rendering, expressed in logical coordinates.
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HRESULT PaintScaledTheme(HANDLE theme,
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           HDC hdc,
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           int part_id,
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           int state_id,
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           const gfx::Rect& rect) const;
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get the windows theme name/part/state.  These three helper functions are
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // used only by GetPartSize(), as each of the corresponding PaintXXX()
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // methods do further validation of the part and state that is required for
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // getting the size.
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static ThemeName GetThemeName(Part part);
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static int GetWindowsPart(Part part, State state, const ExtraParams& extra);
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static int GetWindowsState(Part part, State state, const ExtraParams& extra);
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT GetThemeInt(ThemeName theme,
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      int part_id,
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      int state_id,
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      int prop_id,
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      int *result) const;
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT PaintFrameControl(HDC hdc,
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const gfx::Rect& rect,
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            UINT type,
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            UINT state,
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            bool is_selected,
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            State control_state) const;
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns a handle to the theme data.
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HANDLE GetThemeHandle(ThemeName theme_name) const;
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef HRESULT (WINAPI* DrawThemeBackgroundPtr)(HANDLE theme,
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   HDC hdc,
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   int part_id,
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   int state_id,
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   const RECT* rect,
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   const RECT* clip_rect);
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef HRESULT (WINAPI* DrawThemeBackgroundExPtr)(HANDLE theme,
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     HDC hdc,
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     int part_id,
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     int state_id,
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     const RECT* rect,
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     const DTBGOPTS* opts);
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef HRESULT (WINAPI* GetThemeColorPtr)(HANDLE hTheme,
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             int part_id,
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             int state_id,
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             int prop_id,
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             COLORREF* color);
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef HRESULT (WINAPI* GetThemeContentRectPtr)(HANDLE hTheme,
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   HDC hdc,
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   int part_id,
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   int state_id,
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   const RECT* rect,
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   RECT* content_rect);
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef HRESULT (WINAPI* GetThemePartSizePtr)(HANDLE hTheme,
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                HDC hdc,
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                int part_id,
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                int state_id,
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                RECT* rect,
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                int ts,
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                SIZE* size);
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef HANDLE (WINAPI* OpenThemeDataPtr)(HWND window,
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            LPCWSTR class_list);
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef HRESULT (WINAPI* CloseThemeDataPtr)(HANDLE theme);
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef void (WINAPI* SetThemeAppPropertiesPtr) (DWORD flags);
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef BOOL (WINAPI* IsThemeActivePtr)();
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef HRESULT (WINAPI* GetThemeIntPtr)(HANDLE hTheme,
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           int part_id,
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           int state_id,
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           int prop_id,
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           int *value);
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Function pointers into uxtheme.dll.
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DrawThemeBackgroundPtr draw_theme_;
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DrawThemeBackgroundExPtr draw_theme_ex_;
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetThemeColorPtr get_theme_color_;
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetThemeContentRectPtr get_theme_content_rect_;
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetThemePartSizePtr get_theme_part_size_;
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OpenThemeDataPtr open_theme_;
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CloseThemeDataPtr close_theme_;
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetThemeAppPropertiesPtr set_theme_properties_;
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IsThemeActivePtr is_theme_active_;
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetThemeIntPtr get_theme_int_;
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handle to uxtheme.dll.
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HMODULE theme_dll_;
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A cache of open theme handles.
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mutable HANDLE theme_handles_[LAST];
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The system color change listener and the updated cache of system colors.
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::ScopedSysColorChangeListener color_change_listener_;
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  mutable std::map<int, SkColor> system_colors_;
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(NativeThemeWin);
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ui
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // UI_NATIVE_THEME_NATIVE_THEME_WIN_H_
365