Index: ui/native_theme/native_theme_win.h |
diff --git a/ui/native_theme/native_theme_win.h b/ui/native_theme/native_theme_win.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..78f47402825804d179aa8f289a8a6e42e682c1be |
--- /dev/null |
+++ b/ui/native_theme/native_theme_win.h |
@@ -0,0 +1,372 @@ |
+// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef UI_NATIVE_THEME_NATIVE_THEME_WIN_H_ |
+#define UI_NATIVE_THEME_NATIVE_THEME_WIN_H_ |
+ |
+// A wrapper class for working with custom XP/Vista themes provided in |
+// uxtheme.dll. This is a singleton class that can be grabbed using |
+// NativeThemeWin::instance(). |
+// For more information on visual style parts and states, see: |
+// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/userex/topics/partsandstates.asp |
+ |
+#include <map> |
+ |
+#include <windows.h> |
+#include <uxtheme.h> |
+ |
+#include "base/basictypes.h" |
+#include "base/compiler_specific.h" |
+#include "third_party/skia/include/core/SkColor.h" |
+#include "ui/gfx/size.h" |
+#include "ui/gfx/sys_color_change_listener.h" |
+#include "ui/native_theme/native_theme.h" |
+ |
+class SkCanvas; |
+ |
+namespace ui { |
+ |
+// Windows implementation of native theme class. |
+// |
+// At the moment, this class in in transition from an older API that consists |
+// of several PaintXXX methods to an API, inherited from the NativeTheme base |
+// class, that consists of a single Paint() method with a argument to indicate |
+// what kind of part to paint. |
+class NATIVE_THEME_EXPORT NativeThemeWin : public NativeTheme, |
+ public gfx::SysColorChangeListener { |
+ public: |
+ enum ThemeName { |
+ BUTTON, |
+ LIST, |
+ MENU, |
+ MENULIST, |
+ SCROLLBAR, |
+ STATUS, |
+ TAB, |
+ TEXTFIELD, |
+ TRACKBAR, |
+ WINDOW, |
+ PROGRESS, |
+ SPIN, |
+ LAST |
+ }; |
+ |
+ bool IsThemingActive() const; |
+ |
+ // Returns true if a high contrast theme is being used. |
+ bool IsUsingHighContrastTheme() const; |
+ |
+ HRESULT GetThemeColor(ThemeName theme, |
+ int part_id, |
+ int state_id, |
+ int prop_id, |
+ SkColor* color) const; |
+ |
+ // Get the theme color if theming is enabled. If theming is unsupported |
+ // for this part, use Win32's GetSysColor to find the color specified |
+ // by default_sys_color. |
+ SkColor GetThemeColorWithDefault(ThemeName theme, |
+ int part_id, |
+ int state_id, |
+ int prop_id, |
+ int default_sys_color) const; |
+ |
+ // Get the thickness of the border associated with the specified theme, |
+ // defaulting to GetSystemMetrics edge size if themes are disabled. |
+ // In Classic Windows, borders are typically 2px; on XP+, they are 1px. |
+ gfx::Size GetThemeBorderSize(ThemeName theme) const; |
+ |
+ // Disables all theming for top-level windows in the entire process, from |
+ // when this method is called until the process exits. All the other |
+ // methods in this class will continue to work, but their output will ignore |
+ // the user's theme. This is meant for use when running tests that require |
+ // consistent visual results. |
+ void DisableTheming() const; |
+ |
+ // Closes cached theme handles so we can unload the DLL or update our UI |
+ // for a theme change. |
+ void CloseHandles() const; |
+ |
+ // Returns true if classic theme is in use. |
+ bool IsClassicTheme(ThemeName name) const; |
+ |
+ // Gets our singleton instance. |
+ static NativeThemeWin* instance(); |
+ |
+ HRESULT PaintTextField(HDC hdc, |
+ int part_id, |
+ int state_id, |
+ int classic_state, |
+ RECT* rect, |
+ COLORREF color, |
+ bool fill_content_area, |
+ bool draw_edges) const; |
+ |
+ // NativeTheme implementation: |
+ virtual gfx::Size GetPartSize(Part part, |
+ State state, |
+ const ExtraParams& extra) const override; |
+ virtual void Paint(SkCanvas* canvas, |
+ Part part, |
+ State state, |
+ const gfx::Rect& rect, |
+ const ExtraParams& extra) const override; |
+ virtual SkColor GetSystemColor(ColorId color_id) const override; |
+ |
+ private: |
+ NativeThemeWin(); |
+ ~NativeThemeWin(); |
+ |
+ // gfx::SysColorChangeListener implementation: |
+ virtual void OnSysColorChange() override; |
+ |
+ // Update the locally cached set of system colors. |
+ void UpdateSystemColors(); |
+ |
+ // Paint directly to canvas' HDC. |
+ void PaintDirect(SkCanvas* canvas, |
+ Part part, |
+ State state, |
+ const gfx::Rect& rect, |
+ const ExtraParams& extra) const; |
+ |
+ // Create a temporary HDC, paint to that, clean up the alpha values in the |
+ // temporary HDC, and then blit the result to canvas. This is to work around |
+ // the fact that Windows XP and some classic themes give bogus alpha values. |
+ void PaintIndirect(SkCanvas* canvas, |
+ Part part, |
+ State state, |
+ const gfx::Rect& rect, |
+ const ExtraParams& extra) const; |
+ |
+ HRESULT GetThemePartSize(ThemeName themeName, |
+ HDC hdc, |
+ int part_id, |
+ int state_id, |
+ RECT* rect, |
+ int ts, |
+ SIZE* size) const; |
+ |
+ HRESULT PaintButton(HDC hdc, |
+ State state, |
+ const ButtonExtraParams& extra, |
+ int part_id, |
+ int state_id, |
+ RECT* rect) const; |
+ |
+ HRESULT PaintMenuSeparator(HDC hdc, |
+ const gfx::Rect& rect) const; |
+ |
+ HRESULT PaintMenuGutter(HDC hdc, const gfx::Rect& rect) const; |
+ |
+ // |arrow_direction| determines whether the arrow is pointing to the left or |
+ // to the right. In RTL locales, sub-menus open from right to left and |
+ // therefore the menu arrow should point to the left and not to the right. |
+ HRESULT PaintMenuArrow(HDC hdc, |
+ State state, |
+ const gfx::Rect& rect, |
+ const MenuArrowExtraParams& extra) const; |
+ |
+ HRESULT PaintMenuBackground(HDC hdc, const gfx::Rect& rect) const; |
+ |
+ HRESULT PaintMenuCheck(HDC hdc, |
+ State state, |
+ const gfx::Rect& rect, |
+ const MenuCheckExtraParams& extra) const; |
+ |
+ HRESULT PaintMenuCheckBackground(HDC hdc, |
+ State state, |
+ const gfx::Rect& rect) const; |
+ |
+ HRESULT PaintMenuItemBackground(HDC hdc, |
+ State state, |
+ const gfx::Rect& rect, |
+ const MenuItemExtraParams& extra) const; |
+ |
+ HRESULT PaintPushButton(HDC hdc, |
+ Part part, |
+ State state, |
+ const gfx::Rect& rect, |
+ const ButtonExtraParams& extra) const; |
+ |
+ HRESULT PaintRadioButton(HDC hdc, |
+ Part part, |
+ State state, |
+ const gfx::Rect& rect, |
+ const ButtonExtraParams& extra) const; |
+ |
+ HRESULT PaintCheckbox(HDC hdc, |
+ Part part, |
+ State state, |
+ const gfx::Rect& rect, |
+ const ButtonExtraParams& extra) const; |
+ |
+ HRESULT PaintMenuList(HDC hdc, |
+ State state, |
+ const gfx::Rect& rect, |
+ const MenuListExtraParams& extra) const; |
+ |
+ // Paints a scrollbar arrow. |classic_state| should have the appropriate |
+ // classic part number ORed in already. |
+ HRESULT PaintScrollbarArrow(HDC hdc, |
+ Part part, |
+ State state, |
+ const gfx::Rect& rect, |
+ const ScrollbarArrowExtraParams& extra) const; |
+ |
+ HRESULT PaintScrollbarThumb(HDC hdc, |
+ Part part, |
+ State state, |
+ const gfx::Rect& rect, |
+ const ScrollbarThumbExtraParams& extra) const; |
+ |
+ // This method is deprecated and will be removed in the near future. |
+ // Paints a scrollbar track section. |align_rect| is only used in classic |
+ // mode, and makes sure the checkerboard pattern in |target_rect| is aligned |
+ // with one presumed to be in |align_rect|. |
+ HRESULT PaintScrollbarTrack(SkCanvas* canvas, |
+ HDC hdc, |
+ Part part, |
+ State state, |
+ const gfx::Rect& rect, |
+ const ScrollbarTrackExtraParams& extra) const; |
+ |
+ HRESULT PaintSpinButton(HDC hdc, |
+ Part part, |
+ State state, |
+ const gfx::Rect& rect, |
+ const InnerSpinButtonExtraParams& extra) const; |
+ |
+ HRESULT PaintTrackbar(SkCanvas* canvas, |
+ HDC hdc, |
+ Part part, |
+ State state, |
+ const gfx::Rect& rect, |
+ const TrackbarExtraParams& extra) const; |
+ |
+ HRESULT PaintProgressBar(HDC hdc, |
+ const gfx::Rect& rect, |
+ const ProgressBarExtraParams& extra) const; |
+ |
+ HRESULT PaintWindowResizeGripper(HDC hdc, const gfx::Rect& rect) const; |
+ |
+ HRESULT PaintTabPanelBackground(HDC hdc, const gfx::Rect& rect) const; |
+ |
+ HRESULT PaintTextField(HDC hdc, |
+ Part part, |
+ State state, |
+ const gfx::Rect& rect, |
+ const TextFieldExtraParams& extra) const; |
+ |
+ // Paints a theme part, with support for scene scaling in high-DPI mode. |
+ // |theme| is the theme handle. |hdc| is the handle for the device context. |
+ // |part_id| is the identifier for the part (e.g. thumb gripper). |state_id| |
+ // is the identifier for the rendering state of the part (e.g. hover). |rect| |
+ // is the bounds for rendering, expressed in logical coordinates. |
+ HRESULT PaintScaledTheme(HANDLE theme, |
+ HDC hdc, |
+ int part_id, |
+ int state_id, |
+ const gfx::Rect& rect) const; |
+ |
+ // Get the windows theme name/part/state. These three helper functions are |
+ // used only by GetPartSize(), as each of the corresponding PaintXXX() |
+ // methods do further validation of the part and state that is required for |
+ // getting the size. |
+ static ThemeName GetThemeName(Part part); |
+ static int GetWindowsPart(Part part, State state, const ExtraParams& extra); |
+ static int GetWindowsState(Part part, State state, const ExtraParams& extra); |
+ |
+ HRESULT GetThemeInt(ThemeName theme, |
+ int part_id, |
+ int state_id, |
+ int prop_id, |
+ int *result) const; |
+ |
+ HRESULT PaintFrameControl(HDC hdc, |
+ const gfx::Rect& rect, |
+ UINT type, |
+ UINT state, |
+ bool is_selected, |
+ State control_state) const; |
+ |
+ // Returns a handle to the theme data. |
+ HANDLE GetThemeHandle(ThemeName theme_name) const; |
+ |
+ typedef HRESULT (WINAPI* DrawThemeBackgroundPtr)(HANDLE theme, |
+ HDC hdc, |
+ int part_id, |
+ int state_id, |
+ const RECT* rect, |
+ const RECT* clip_rect); |
+ typedef HRESULT (WINAPI* DrawThemeBackgroundExPtr)(HANDLE theme, |
+ HDC hdc, |
+ int part_id, |
+ int state_id, |
+ const RECT* rect, |
+ const DTBGOPTS* opts); |
+ typedef HRESULT (WINAPI* GetThemeColorPtr)(HANDLE hTheme, |
+ int part_id, |
+ int state_id, |
+ int prop_id, |
+ COLORREF* color); |
+ typedef HRESULT (WINAPI* GetThemeContentRectPtr)(HANDLE hTheme, |
+ HDC hdc, |
+ int part_id, |
+ int state_id, |
+ const RECT* rect, |
+ RECT* content_rect); |
+ typedef HRESULT (WINAPI* GetThemePartSizePtr)(HANDLE hTheme, |
+ HDC hdc, |
+ int part_id, |
+ int state_id, |
+ RECT* rect, |
+ int ts, |
+ SIZE* size); |
+ typedef HANDLE (WINAPI* OpenThemeDataPtr)(HWND window, |
+ LPCWSTR class_list); |
+ typedef HRESULT (WINAPI* CloseThemeDataPtr)(HANDLE theme); |
+ |
+ typedef void (WINAPI* SetThemeAppPropertiesPtr) (DWORD flags); |
+ typedef BOOL (WINAPI* IsThemeActivePtr)(); |
+ typedef HRESULT (WINAPI* GetThemeIntPtr)(HANDLE hTheme, |
+ int part_id, |
+ int state_id, |
+ int prop_id, |
+ int *value); |
+ |
+ // Function pointers into uxtheme.dll. |
+ DrawThemeBackgroundPtr draw_theme_; |
+ DrawThemeBackgroundExPtr draw_theme_ex_; |
+ GetThemeColorPtr get_theme_color_; |
+ GetThemeContentRectPtr get_theme_content_rect_; |
+ GetThemePartSizePtr get_theme_part_size_; |
+ OpenThemeDataPtr open_theme_; |
+ CloseThemeDataPtr close_theme_; |
+ SetThemeAppPropertiesPtr set_theme_properties_; |
+ IsThemeActivePtr is_theme_active_; |
+ GetThemeIntPtr get_theme_int_; |
+ |
+ // Handle to uxtheme.dll. |
+ HMODULE theme_dll_; |
+ |
+ // A cache of open theme handles. |
+ mutable HANDLE theme_handles_[LAST]; |
+ |
+ // The system color change listener and the updated cache of system colors. |
+ gfx::ScopedSysColorChangeListener color_change_listener_; |
+ mutable std::map<int, SkColor> system_colors_; |
+ |
+ // Is a high contrast theme active? |
+ mutable bool is_using_high_contrast_; |
+ |
+ // Is |is_using_high_contrast_| valid? |
+ mutable bool is_using_high_contrast_valid_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(NativeThemeWin); |
+}; |
+ |
+} // namespace ui |
+ |
+#endif // UI_NATIVE_THEME_NATIVE_THEME_WIN_H_ |