diff options
-rw-r--r-- | ui/gfx/native_theme.cc | 26 | ||||
-rw-r--r-- | ui/gfx/native_theme.h | 164 | ||||
-rw-r--r-- | ui/gfx/native_theme_win.cc | 310 | ||||
-rw-r--r-- | ui/gfx/native_theme_win.h | 192 | ||||
-rw-r--r-- | ui/ui_gfx.gypi | 2 |
5 files changed, 624 insertions, 70 deletions
diff --git a/ui/gfx/native_theme.cc b/ui/gfx/native_theme.cc new file mode 100644 index 0000000..331d429 --- /dev/null +++ b/ui/gfx/native_theme.cc @@ -0,0 +1,26 @@ +// Copyright (c) 2011 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. + +#include "ui/gfx/native_theme.h" + +#include "ui/gfx/size.h" + +namespace gfx { + +unsigned int NativeTheme::thumb_inactive_color_ = 0xeaeaea; +unsigned int NativeTheme::thumb_active_color_ = 0xf4f4f4; +unsigned int NativeTheme::track_color_ = 0xd3d3d3; + +void NativeTheme::SetScrollbarColors(unsigned inactive_color, + unsigned active_color, + unsigned track_color) const { + thumb_inactive_color_ = inactive_color; + thumb_active_color_ = active_color; + track_color_ = track_color; +} + +// NativeTheme::instance() is implemented in the platform specific source files, +// such as native_theme_win.cc or native_theme_linux.cc + +} // namespace gfx diff --git a/ui/gfx/native_theme.h b/ui/gfx/native_theme.h new file mode 100644 index 0000000..807427d --- /dev/null +++ b/ui/gfx/native_theme.h @@ -0,0 +1,164 @@ +// Copyright (c) 2011 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_GFX_NATIVE_THEME_H_ +#define UI_GFX_NATIVE_THEME_H_ +#pragma once + +#include "skia/ext/platform_canvas.h" +#include "ui/gfx/native_widget_types.h" + +namespace skia { +class PlatformCanvas; +} + +namespace gfx { + +class Rect; +class Size; + +// This class supports drawing UI controls (like buttons, text fields, lists, +// comboboxes, etc) that look like the native UI controls of the underlying +// platform, such as Windows or Linux. +// +// The supported control types are listed in the Part enum. These parts can be +// in any state given by the State enum, where the actual definititon of the +// state is part-specific. +// +// Some parts require more information than simply the state in order to be +// drawn correctly, and this information is given to the Paint() method via the +// ExtraParams union. Each part that requires more information has its own +// field in the union. +// +// NativeTheme also supports getting the default size of a given part with +// the GetPartSize() method. +class NativeTheme { + public: + // The part to be painted / sized. + enum Part { + kScrollbarDownArrow, + kScrollbarLeftArrow, + kScrollbarRightArrow, + kScrollbarUpArrow, + kScrollbarHorizontalThumb, + kScrollbarVerticalThumb, + kScrollbarHorizontalTrack, + kScrollbarVerticalTrack, + kCheckbox, + kRadio, + kPushButton, + kTextField, + kMenuList, + kSliderTrack, + kSliderThumb, + kInnerSpinButton, + kProgressBar, + kMaxPart, + }; + + // The state of the part. + enum State { + kDisabled, + kHovered, + kNormal, + kPressed, + kMaxState, + }; + + // Each structure below hold extra information needed when painting a given + // part. + + struct ScrollbarTrackExtraParams { + int track_x; + int track_y; + int track_width; + int track_height; + }; + + struct ButtonExtraParams { + bool checked; + bool indeterminate; // Whether the button state is indeterminate. + bool is_default; // Whether the button is default button. + bool has_border; + int classic_state; // Used on Windows when uxtheme is not available. + SkColor background_color; + }; + + struct TextFieldExtraParams { + bool is_text_area; + bool is_listbox; + SkColor background_color; + }; + + struct MenuListExtraParams { + bool has_border; + bool has_border_radius; + int arrow_x; + int arrow_y; + SkColor background_color; + }; + + struct SliderExtraParams { + bool vertical; + bool in_drag; + }; + + struct InnerSpinButtonExtraParams { + bool spin_up; + bool read_only; + }; + + struct ProgressBarExtraParams { + bool determinate; + int value_rect_x; + int value_rect_y; + int value_rect_width; + int value_rect_height; + }; + + union ExtraParams { + ScrollbarTrackExtraParams scrollbar_track; + ButtonExtraParams button; + MenuListExtraParams menu_list; + SliderExtraParams slider; + TextFieldExtraParams text_field; + InnerSpinButtonExtraParams inner_spin; + ProgressBarExtraParams progress_bar; + }; + + // Return the size of the part. + virtual Size GetPartSize(Part part) const = 0; + + // Paint the part to the canvas. + virtual void Paint(skia::PlatformCanvas* canvas, + Part part, + State state, + const gfx::Rect& rect, + const ExtraParams& extra) const = 0; + + // Supports theme specific colors. + void SetScrollbarColors(unsigned inactive_color, + unsigned active_color, + unsigned track_color) const; + + // Returns a shared instance of the native theme. + // The retuned object should not be deleted by the caller. This function + // is not thread safe and should only be called from the UI thread. + static const NativeTheme* instance(); + + protected: + NativeTheme() {} + virtual ~NativeTheme() {} + + private: + static unsigned int thumb_inactive_color_; + static unsigned int thumb_active_color_; + static unsigned int track_color_; + + DISALLOW_COPY_AND_ASSIGN(NativeTheme); +}; + +} // namespace gfx + +#endif // UI_GFX_NATIVE_THEME_H_ diff --git a/ui/gfx/native_theme_win.cc b/ui/gfx/native_theme_win.cc index b22973c..83f339f 100644 --- a/ui/gfx/native_theme_win.cc +++ b/ui/gfx/native_theme_win.cc @@ -54,7 +54,12 @@ void SetCheckerboardShader(SkPaint* paint, const RECT& align_rect) { namespace gfx { -/* static */ +// static +const NativeTheme* NativeTheme::instance() { + return NativeThemeWin::instance(); +} + +// static const NativeThemeWin* NativeThemeWin::instance() { // The global NativeThemeWin instance. static const NativeThemeWin s_native_theme; @@ -100,10 +105,222 @@ NativeThemeWin::NativeThemeWin() NativeThemeWin::~NativeThemeWin() { if (theme_dll_) { - // todo (cpu): fix this soon. - // CloseHandles(); + CloseHandles(); + + draw_theme_ = NULL; + draw_theme_ex_ = NULL; + get_theme_color_ = NULL; + get_theme_content_rect_ = NULL; + get_theme_part_size_ = NULL; + open_theme_ = NULL; + close_theme_ = NULL; + set_theme_properties_ = NULL; + is_theme_active_ = NULL; + get_theme_int_ = NULL; FreeLibrary(theme_dll_); + theme_dll_ = NULL; + } +} + +gfx::Size NativeThemeWin::GetPartSize(Part part) const { + HDC hdc = GetDC(NULL); + SIZE size; + HANDLE handle = GetThemeHandle(GetThemeName(part)); + int part_win = GetWindowsPart(part); + HRESULT hr = get_theme_part_size_(handle, hdc, part_win, 0, NULL, TS_TRUE, + &size); + ReleaseDC(NULL, hdc); + return SUCCEEDED(hr) ? Size(size.cx, size.cy) : Size(); +} + +void NativeThemeWin::Paint(skia::PlatformCanvas* canvas, + Part part, + State state, + const gfx::Rect& rect, + const ExtraParams& extra) const { + HDC hdc = canvas->beginPlatformPaint(); + + switch (part) { + case kCheckbox: + PaintCheckbox(hdc, part, state, rect, extra.button); + break; + case kRadio: + PaintRadioButton(hdc, part, state, rect, extra.button); + break; + case kPushButton: + PaintPushButton(hdc, part, state, rect, extra.button); + break; + case kScrollbarDownArrow: + case kScrollbarUpArrow: + case kScrollbarLeftArrow: + case kScrollbarRightArrow: + case kScrollbarHorizontalThumb: + case kScrollbarVerticalThumb: + case kScrollbarHorizontalTrack: + case kScrollbarVerticalTrack: + case kTextField: + case kMenuList: + case kSliderTrack: + case kSliderThumb: + case kInnerSpinButton: + case kProgressBar: + default: + // While transitioning NativeThemeWin to the single Paint() entry point, + // unsupported parts will DCHECK here. + DCHECK(false); + } + + canvas->endPlatformPaint(); +} + +HRESULT NativeThemeWin::PaintScrollbarArrow(HDC hdc, + Part direction, + State state, + const gfx::Rect& rect) const { + static int state_id[4][kMaxState] = { + ABS_DOWNDISABLED, ABS_DOWNHOT, ABS_DOWNNORMAL, ABS_DOWNPRESSED, + ABS_LEFTDISABLED, ABS_LEFTHOT, ABS_LEFTNORMAL, ABS_LEFTPRESSED, + ABS_RIGHTDISABLED, ABS_RIGHTHOT, ABS_RIGHTNORMAL, ABS_RIGHTPRESSED, + ABS_UPDISABLED, ABS_UPHOT, ABS_UPNORMAL, ABS_UPPRESSED + }; + + HANDLE handle = GetThemeHandle(SCROLLBAR); + if (handle && draw_theme_) { + int index = direction - kScrollbarDownArrow; + DCHECK(index >=0 && index < 4); + return draw_theme_(handle, hdc, SBP_ARROWBTN, state_id[index][state], + &rect.ToRECT(), NULL); + } + + // TODO: Draw it manually. + RECT rect_win = rect.ToRECT(); + DrawFrameControl(hdc, &rect_win, DFC_SCROLL, 0); + return S_OK; +} + +HRESULT NativeThemeWin::PaintScrollbarThumb(HDC hdc, + Part part, + State state, + const gfx::Rect& rect) const { + int part_id; + if (part == kScrollbarHorizontalThumb) { + part_id = SBP_THUMBBTNHORZ; + } else if (part == kScrollbarHorizontalThumb) { + part_id = SBP_THUMBBTNVERT; + } else { + DCHECK(false); + } + + static int state_id[kMaxState] = { + SCRBS_DISABLED, SCRBS_HOT, SCRBS_NORMAL, SCRBS_PRESSED + }; + + HANDLE handle = GetThemeHandle(SCROLLBAR); + if (handle && draw_theme_) { + return draw_theme_(handle, hdc, part_id, state_id[state], + &rect.ToRECT(), NULL); + } + + + // TODO: Draw it manually. + if ((part_id == SBP_THUMBBTNHORZ) || (part_id == SBP_THUMBBTNVERT)) { + RECT rect_win = rect.ToRECT(); + DrawEdge(hdc, &rect_win, EDGE_RAISED, BF_RECT | BF_MIDDLE); + // Classic mode doesn't have a gripper. + } + return S_OK; +} + +HRESULT NativeThemeWin::PaintPushButton(HDC hdc, + Part part, + State state, + const gfx::Rect& rect, + const ButtonExtraParams& extra) const { + int state_id; + switch(state) { + case kDisabled: + state_id = PBS_DISABLED; + break; + case kHovered: + state_id = PBS_HOT; + break; + case kNormal: + state_id = extra.is_default ? PBS_DEFAULTED : PBS_NORMAL; + break; + case kPressed: + state_id = PBS_PRESSED; + break; + default: + DCHECK(false); + } + + RECT rect_win = rect.ToRECT(); + return PaintButton(hdc, BP_PUSHBUTTON, state_id, extra.classic_state, + &rect_win); +} + +HRESULT NativeThemeWin::PaintRadioButton(HDC hdc, + Part part, + State state, + const gfx::Rect& rect, + const ButtonExtraParams& extra) const { + int state_id; + switch(state) { + case kDisabled: + state_id = extra.checked ? RBS_CHECKEDDISABLED : RBS_UNCHECKEDDISABLED; + break; + case kHovered: + state_id = extra.checked ? RBS_CHECKEDHOT : RBS_UNCHECKEDHOT; + break; + case kNormal: + state_id = extra.checked ? RBS_CHECKEDNORMAL : RBS_UNCHECKEDNORMAL; + break; + case kPressed: + state_id = extra.checked ? RBS_CHECKEDPRESSED : RBS_UNCHECKEDPRESSED; + break; + default: + DCHECK(false); } + + RECT rect_win = rect.ToRECT(); + return PaintButton(hdc, BP_RADIOBUTTON, state_id, extra.classic_state, + &rect_win); +} + +HRESULT NativeThemeWin::PaintCheckbox(HDC hdc, + Part part, + State state, + const gfx::Rect& rect, + const ButtonExtraParams& extra) const { + int state_id; + switch(state) { + case kDisabled: + state_id = extra.checked ? CBS_CHECKEDDISABLED : + extra.indeterminate ? CBS_MIXEDDISABLED : + CBS_UNCHECKEDDISABLED; + break; + case kHovered: + state_id = extra.checked ? CBS_CHECKEDHOT : + extra.indeterminate ? CBS_MIXEDHOT : + CBS_UNCHECKEDHOT; + break; + case kNormal: + state_id = extra.checked ? CBS_CHECKEDNORMAL : + extra.indeterminate ? CBS_MIXEDNORMAL : + CBS_UNCHECKEDNORMAL; + break; + case kPressed: + state_id = extra.checked ? CBS_CHECKEDPRESSED : + extra.indeterminate ? CBS_MIXEDPRESSED : + CBS_UNCHECKEDPRESSED; + break; + default: + DCHECK(false); + } + + RECT rect_win = rect.ToRECT(); + return PaintButton(hdc, BP_CHECKBOX, state_id, extra.classic_state, + &rect_win); } HRESULT NativeThemeWin::PaintButton(HDC hdc, @@ -798,15 +1015,15 @@ HRESULT NativeThemeWin::PaintFrameControl(HDC hdc, return S_OK; } -void NativeThemeWin::CloseHandles() const -{ +void NativeThemeWin::CloseHandles() const { if (!close_theme_) return; for (int i = 0; i < LAST; ++i) { - if (theme_handles_[i]) + if (theme_handles_[i]) { close_theme_(theme_handles_[i]); theme_handles_[i] = NULL; + } } } @@ -817,8 +1034,7 @@ bool NativeThemeWin::IsClassicTheme(ThemeName name) const { return !GetThemeHandle(name); } -HANDLE NativeThemeWin::GetThemeHandle(ThemeName theme_name) const -{ +HANDLE NativeThemeWin::GetThemeHandle(ThemeName theme_name) const { if (!open_theme_ || theme_name < 0 || theme_name >= LAST) return 0; @@ -871,4 +1087,82 @@ HANDLE NativeThemeWin::GetThemeHandle(ThemeName theme_name) const return handle; } +// static +NativeThemeWin::ThemeName NativeThemeWin::GetThemeName(Part part) { + ThemeName name; + switch(part) { + case kScrollbarDownArrow: + case kScrollbarLeftArrow: + case kScrollbarRightArrow: + case kScrollbarUpArrow: + case kScrollbarHorizontalThumb: + case kScrollbarVerticalThumb: + case kScrollbarHorizontalTrack: + case kScrollbarVerticalTrack: + name = SCROLLBAR; + break; + case kCheckbox: + case kRadio: + case kPushButton: + name = BUTTON; + break; + case kTextField: + name = TEXTFIELD; + break; + case kMenuList: + name = MENU; + break; + case kSliderTrack: + case kSliderThumb: + name = TRACKBAR; + break; + case kInnerSpinButton: + name = SPIN; + break; + case kProgressBar: + name = PROGRESS; + break; + default: + DCHECK(false); + break; + } + return name; +} + +// static +int NativeThemeWin::GetWindowsPart(Part part) { + int part_id; + switch(part) { + case kCheckbox: + part_id = BP_CHECKBOX; + break; + case kRadio: + part_id = BP_RADIOBUTTON; + break; + case kPushButton: + part_id = BP_PUSHBUTTON; + break; + case kTextField: + case kMenuList: + case kSliderTrack: + case kSliderThumb: + case kInnerSpinButton: + case kProgressBar: + case kScrollbarDownArrow: + case kScrollbarLeftArrow: + case kScrollbarRightArrow: + case kScrollbarUpArrow: + case kScrollbarHorizontalThumb: + case kScrollbarVerticalThumb: + case kScrollbarHorizontalTrack: + case kScrollbarVerticalTrack: + default: + // While transitioning NativeThemeWin to the single Paint() entry point, + // unsupported parts will DCHECK here. + DCHECK(false); + break; + } + return part_id; +} + } // namespace gfx diff --git a/ui/gfx/native_theme_win.h b/ui/gfx/native_theme_win.h index e1749c0..364e29c 100644 --- a/ui/gfx/native_theme_win.h +++ b/ui/gfx/native_theme_win.h @@ -1,4 +1,4 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Copyright (c) 2011 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. // @@ -12,6 +12,7 @@ #define UI_GFX_NATIVE_THEME_WIN_H_ #pragma once +#include "ui/gfx/native_theme.h" #include "ui/gfx/size.h" #include <windows.h> #include <uxtheme.h> @@ -24,14 +25,13 @@ class PlatformCanvas; namespace gfx { -// TODO: Define class member enums to replace part_id and state_id parameters -// that are currently defined in <vssym32.h>. Afterward, classic_state should -// be removed and class users wouldn't need to include <vssym32.h> anymore. -// This would enable HOT state on non-themed UI (like when RDP'ing) and would -// simplify usage. -// TODO: This class should probably be changed to be platform independent at -// the same time. -class NativeThemeWin { +// 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 NativeThemeWin : public NativeTheme { public: enum ThemeName { BUTTON, @@ -49,6 +49,63 @@ class NativeThemeWin { LAST }; + bool IsThemingActive() const; + + HRESULT GetThemePartSize(ThemeName themeName, + HDC hdc, + int part_id, + int state_id, + RECT* rect, + int ts, + SIZE* size) 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; + + HRESULT GetThemeInt(ThemeName theme, + int part_id, + int state_id, + int prop_id, + int *result) 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. + 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 const NativeThemeWin* instance(); + + // The PaintXXX methods below this point should be private or be deleted, + // but remain public while NativeThemeWin is transitioned over to use the + // single Paint() entry point. Do not make new calls to these methods. + // This enumeration is used within PaintMenuArrow in order to indicate the // direction the menu arrow should point to. enum MenuArrowDirection { @@ -104,16 +161,20 @@ class NativeThemeWin { int prop_id, int *value); + // This method is deprecated and will be removed in the near future. HRESULT PaintButton(HDC hdc, int part_id, int state_id, int classic_state, RECT* rect) const; + // This method is deprecated and will be removed in the near future. HRESULT PaintDialogBackground(HDC dc, bool active, RECT* rect) const; + // This method is deprecated and will be removed in the near future. HRESULT PaintListBackground(HDC dc, bool enabled, RECT* rect) const; + // This method is deprecated and will be removed in the near future. // |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. @@ -125,12 +186,14 @@ class NativeThemeWin { MenuArrowDirection arrow_direction, ControlState state) const; + // This method is deprecated and will be removed in the near future. HRESULT PaintMenuBackground(ThemeName theme, HDC hdc, int part_id, int state_id, RECT* rect) const; + // This method is deprecated and will be removed in the near future. HRESULT PaintMenuCheck(ThemeName theme, HDC hdc, int part_id, @@ -138,17 +201,20 @@ class NativeThemeWin { RECT* rect, ControlState state) const; + // This method is deprecated and will be removed in the near future. HRESULT PaintMenuCheckBackground(ThemeName theme, HDC hdc, int part_id, int state_id, RECT* rect) const; + // This method is deprecated and will be removed in the near future. HRESULT PaintMenuGutter(HDC hdc, int part_id, int state_id, RECT* rect) const; + // This method is deprecated and will be removed in the near future. HRESULT PaintMenuItemBackground(ThemeName theme, HDC hdc, int part_id, @@ -156,17 +222,20 @@ class NativeThemeWin { bool selected, RECT* rect) const; + // This method is deprecated and will be removed in the near future. HRESULT PaintMenuList(HDC hdc, int part_id, int state_id, int classic_state, RECT* rect) const; + // This method is deprecated and will be removed in the near future. HRESULT PaintMenuSeparator(HDC hdc, int part_id, int state_id, RECT* rect) const; + // This method is deprecated and will be removed in the near future. // Paints a scrollbar arrow. |classic_state| should have the appropriate // classic part number ORed in already. HRESULT PaintScrollbarArrow(HDC hdc, @@ -174,6 +243,7 @@ class NativeThemeWin { int classic_state, RECT* rect) 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|. @@ -185,6 +255,7 @@ class NativeThemeWin { RECT* align_rect, skia::PlatformCanvas* canvas) const; + // This method is deprecated and will be removed in the near future. // Paints a scrollbar thumb or gripper. HRESULT PaintScrollbarThumb(HDC hdc, int part_id, @@ -192,20 +263,24 @@ class NativeThemeWin { int classic_state, RECT* rect) const; + // This method is deprecated and will be removed in the near future. HRESULT PaintSpinButton(HDC hdc, int part_id, int state_id, int classic_state, RECT* rect) const; + // This method is deprecated and will be removed in the near future. HRESULT PaintStatusGripper(HDC hdc, int part_id, int state_id, int classic_state, RECT* rect) const; + // This method is deprecated and will be removed in the near future. HRESULT PaintTabPanelBackground(HDC dc, RECT* rect) const; + // This method is deprecated and will be removed in the near future. HRESULT PaintTextField(HDC hdc, int part_id, int state_id, @@ -215,6 +290,7 @@ class NativeThemeWin { bool fill_content_area, bool draw_edges) const; + // This method is deprecated and will be removed in the near future. HRESULT PaintTrackbar(HDC hdc, int part_id, int state_id, @@ -222,6 +298,7 @@ class NativeThemeWin { RECT* rect, skia::PlatformCanvas* canvas) const; + // This method is deprecated and will be removed in the near future. HRESULT PaintProgressBar(HDC hdc, RECT* bar_rect, RECT* value_rect, @@ -229,63 +306,54 @@ class NativeThemeWin { double animated_seconds, skia::PlatformCanvas* canvas) const; - bool IsThemingActive() const; - - HRESULT GetThemePartSize(ThemeName themeName, - HDC hdc, - int part_id, - int state_id, - RECT* rect, - int ts, - SIZE* size) 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; - - HRESULT GetThemeInt(ThemeName theme, - int part_id, - int state_id, - int prop_id, - int *result) 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. - 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 const NativeThemeWin* instance(); - private: NativeThemeWin(); ~NativeThemeWin(); + // NativeTheme Implementation: + virtual gfx::Size GetPartSize(Part part) const; + virtual void Paint(skia::PlatformCanvas* canvas, + Part part, + State state, + const gfx::Rect& rect, + const ExtraParams& extra) const; + + // Paints a scrollbar arrow. |classic_state| should have the appropriate + // classic part number ORed in already. + HRESULT PaintScrollbarArrow(HDC hdc, + Part direction, + State state, + const gfx::Rect& rect) const; + + HRESULT PaintScrollbarThumb(HDC hdc, + Part direction, + State state, + const gfx::Rect& rect) 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; + + // Get the windows theme name that goes with the part. + static ThemeName GetThemeName(Part part); + + // Get the windows theme part id that goes with the part. + static int GetWindowsPart(Part part); + HRESULT PaintFrameControl(HDC hdc, RECT* rect, UINT type, diff --git a/ui/ui_gfx.gypi b/ui/ui_gfx.gypi index 0fffbec..c01420a 100644 --- a/ui/ui_gfx.gypi +++ b/ui/ui_gfx.gypi @@ -81,6 +81,8 @@ 'gfx/image_mac.mm', 'gfx/insets.cc', 'gfx/insets.h', + 'gfx/native_theme.cc', + 'gfx/native_theme.h', 'gfx/native_widget_types.h', 'gfx/path.cc', 'gfx/path.h', |