summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ui/gfx/native_theme.cc26
-rw-r--r--ui/gfx/native_theme.h164
-rw-r--r--ui/gfx/native_theme_win.cc310
-rw-r--r--ui/gfx/native_theme_win.h192
-rw-r--r--ui/ui_gfx.gypi2
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',