1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "content/child/webthemeengine_impl_android.h"
7 #include "base/logging.h"
8 #include "skia/ext/platform_canvas.h"
9 #include "third_party/WebKit/public/platform/WebRect.h"
10 #include "third_party/WebKit/public/platform/WebSize.h"
11 #include "ui/native_theme/native_theme.h"
13 using blink::WebCanvas
;
14 using blink::WebColor
;
16 using blink::WebThemeEngine
;
20 static ui::NativeTheme::Part
NativeThemePart(
21 WebThemeEngine::Part part
) {
23 case WebThemeEngine::PartScrollbarDownArrow
:
24 return ui::NativeTheme::kScrollbarDownArrow
;
25 case WebThemeEngine::PartScrollbarLeftArrow
:
26 return ui::NativeTheme::kScrollbarLeftArrow
;
27 case WebThemeEngine::PartScrollbarRightArrow
:
28 return ui::NativeTheme::kScrollbarRightArrow
;
29 case WebThemeEngine::PartScrollbarUpArrow
:
30 return ui::NativeTheme::kScrollbarUpArrow
;
31 case WebThemeEngine::PartScrollbarHorizontalThumb
:
32 case WebThemeEngine::PartScrollbarVerticalThumb
:
33 case WebThemeEngine::PartScrollbarHorizontalTrack
:
34 case WebThemeEngine::PartScrollbarVerticalTrack
:
35 case WebThemeEngine::PartScrollbarCorner
:
36 // Android doesn't draw scrollbars.
38 return static_cast<ui::NativeTheme::Part
>(0);
39 case WebThemeEngine::PartCheckbox
:
40 return ui::NativeTheme::kCheckbox
;
41 case WebThemeEngine::PartRadio
:
42 return ui::NativeTheme::kRadio
;
43 case WebThemeEngine::PartButton
:
44 return ui::NativeTheme::kPushButton
;
45 case WebThemeEngine::PartTextField
:
46 return ui::NativeTheme::kTextField
;
47 case WebThemeEngine::PartMenuList
:
48 return ui::NativeTheme::kMenuList
;
49 case WebThemeEngine::PartSliderTrack
:
50 return ui::NativeTheme::kSliderTrack
;
51 case WebThemeEngine::PartSliderThumb
:
52 return ui::NativeTheme::kSliderThumb
;
53 case WebThemeEngine::PartInnerSpinButton
:
54 return ui::NativeTheme::kInnerSpinButton
;
55 case WebThemeEngine::PartProgressBar
:
56 return ui::NativeTheme::kProgressBar
;
58 return ui::NativeTheme::kScrollbarDownArrow
;
62 static ui::NativeTheme::State
NativeThemeState(
63 WebThemeEngine::State state
) {
65 case WebThemeEngine::StateDisabled
:
66 return ui::NativeTheme::kDisabled
;
67 case WebThemeEngine::StateHover
:
68 return ui::NativeTheme::kHovered
;
69 case WebThemeEngine::StateNormal
:
70 return ui::NativeTheme::kNormal
;
71 case WebThemeEngine::StatePressed
:
72 return ui::NativeTheme::kPressed
;
74 return ui::NativeTheme::kDisabled
;
78 static void GetNativeThemeExtraParams(
79 WebThemeEngine::Part part
,
80 WebThemeEngine::State state
,
81 const WebThemeEngine::ExtraParams
* extra_params
,
82 ui::NativeTheme::ExtraParams
* native_theme_extra_params
) {
84 case WebThemeEngine::PartScrollbarHorizontalTrack
:
85 case WebThemeEngine::PartScrollbarVerticalTrack
:
86 // Android doesn't draw scrollbars.
89 case WebThemeEngine::PartCheckbox
:
90 native_theme_extra_params
->button
.checked
= extra_params
->button
.checked
;
91 native_theme_extra_params
->button
.indeterminate
=
92 extra_params
->button
.indeterminate
;
94 case WebThemeEngine::PartRadio
:
95 native_theme_extra_params
->button
.checked
= extra_params
->button
.checked
;
97 case WebThemeEngine::PartButton
:
98 native_theme_extra_params
->button
.is_default
=
99 extra_params
->button
.isDefault
;
100 native_theme_extra_params
->button
.has_border
=
101 extra_params
->button
.hasBorder
;
102 // Native buttons have a different focus style.
103 native_theme_extra_params
->button
.is_focused
= false;
104 native_theme_extra_params
->button
.background_color
=
105 extra_params
->button
.backgroundColor
;
107 case WebThemeEngine::PartTextField
:
108 native_theme_extra_params
->text_field
.is_text_area
=
109 extra_params
->textField
.isTextArea
;
110 native_theme_extra_params
->text_field
.is_listbox
=
111 extra_params
->textField
.isListbox
;
112 native_theme_extra_params
->text_field
.background_color
=
113 extra_params
->textField
.backgroundColor
;
115 case WebThemeEngine::PartMenuList
:
116 native_theme_extra_params
->menu_list
.has_border
=
117 extra_params
->menuList
.hasBorder
;
118 native_theme_extra_params
->menu_list
.has_border_radius
=
119 extra_params
->menuList
.hasBorderRadius
;
120 native_theme_extra_params
->menu_list
.arrow_x
=
121 extra_params
->menuList
.arrowX
;
122 native_theme_extra_params
->menu_list
.arrow_y
=
123 extra_params
->menuList
.arrowY
;
124 native_theme_extra_params
->menu_list
.background_color
=
125 extra_params
->menuList
.backgroundColor
;
127 case WebThemeEngine::PartSliderTrack
:
128 case WebThemeEngine::PartSliderThumb
:
129 native_theme_extra_params
->slider
.vertical
=
130 extra_params
->slider
.vertical
;
131 native_theme_extra_params
->slider
.in_drag
= extra_params
->slider
.inDrag
;
133 case WebThemeEngine::PartInnerSpinButton
:
134 native_theme_extra_params
->inner_spin
.spin_up
=
135 extra_params
->innerSpin
.spinUp
;
136 native_theme_extra_params
->inner_spin
.read_only
=
137 extra_params
->innerSpin
.readOnly
;
139 case WebThemeEngine::PartProgressBar
:
140 native_theme_extra_params
->progress_bar
.determinate
=
141 extra_params
->progressBar
.determinate
;
142 native_theme_extra_params
->progress_bar
.value_rect_x
=
143 extra_params
->progressBar
.valueRectX
;
144 native_theme_extra_params
->progress_bar
.value_rect_y
=
145 extra_params
->progressBar
.valueRectY
;
146 native_theme_extra_params
->progress_bar
.value_rect_width
=
147 extra_params
->progressBar
.valueRectWidth
;
148 native_theme_extra_params
->progress_bar
.value_rect_height
=
149 extra_params
->progressBar
.valueRectHeight
;
152 break; // Parts that have no extra params get here.
156 blink::WebSize
WebThemeEngineImpl::getSize(WebThemeEngine::Part part
) {
157 ui::NativeTheme::ExtraParams extra
;
158 return ui::NativeTheme::instance()->GetPartSize(
159 NativeThemePart(part
), ui::NativeTheme::kNormal
, extra
);
162 void WebThemeEngineImpl::paint(
163 blink::WebCanvas
* canvas
,
164 WebThemeEngine::Part part
,
165 WebThemeEngine::State state
,
166 const blink::WebRect
& rect
,
167 const WebThemeEngine::ExtraParams
* extra_params
) {
168 ui::NativeTheme::ExtraParams native_theme_extra_params
;
169 GetNativeThemeExtraParams(
170 part
, state
, extra_params
, &native_theme_extra_params
);
171 ui::NativeTheme::instance()->Paint(
173 NativeThemePart(part
),
174 NativeThemeState(state
),
176 native_theme_extra_params
);
178 } // namespace content