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.
4
5#include "content/child/webfallbackthemeengine_impl.h"
6
7#include "skia/ext/platform_canvas.h"
8#include "third_party/WebKit/public/platform/WebRect.h"
9#include "third_party/WebKit/public/platform/WebSize.h"
10#include "ui/native_theme/fallback_theme.h"
11
12using blink::WebCanvas;
13using blink::WebColor;
14using blink::WebRect;
15using blink::WebFallbackThemeEngine;
16
17namespace content {
18
19static ui::NativeTheme::Part NativeThemePart(
20    WebFallbackThemeEngine::Part part) {
21  switch (part) {
22    case WebFallbackThemeEngine::PartScrollbarDownArrow:
23      return ui::NativeTheme::kScrollbarDownArrow;
24    case WebFallbackThemeEngine::PartScrollbarLeftArrow:
25      return ui::NativeTheme::kScrollbarLeftArrow;
26    case WebFallbackThemeEngine::PartScrollbarRightArrow:
27      return ui::NativeTheme::kScrollbarRightArrow;
28    case WebFallbackThemeEngine::PartScrollbarUpArrow:
29      return ui::NativeTheme::kScrollbarUpArrow;
30    case WebFallbackThemeEngine::PartScrollbarHorizontalThumb:
31      return ui::NativeTheme::kScrollbarHorizontalThumb;
32    case WebFallbackThemeEngine::PartScrollbarVerticalThumb:
33      return ui::NativeTheme::kScrollbarVerticalThumb;
34    case WebFallbackThemeEngine::PartScrollbarHorizontalTrack:
35      return ui::NativeTheme::kScrollbarHorizontalTrack;
36    case WebFallbackThemeEngine::PartScrollbarVerticalTrack:
37      return ui::NativeTheme::kScrollbarVerticalTrack;
38    case WebFallbackThemeEngine::PartScrollbarCorner:
39      return ui::NativeTheme::kScrollbarCorner;
40    case WebFallbackThemeEngine::PartCheckbox:
41      return ui::NativeTheme::kCheckbox;
42    case WebFallbackThemeEngine::PartRadio:
43      return ui::NativeTheme::kRadio;
44    case WebFallbackThemeEngine::PartButton:
45      return ui::NativeTheme::kPushButton;
46    case WebFallbackThemeEngine::PartTextField:
47      return ui::NativeTheme::kTextField;
48    case WebFallbackThemeEngine::PartMenuList:
49      return ui::NativeTheme::kMenuList;
50    case WebFallbackThemeEngine::PartSliderTrack:
51      return ui::NativeTheme::kSliderTrack;
52    case WebFallbackThemeEngine::PartSliderThumb:
53      return ui::NativeTheme::kSliderThumb;
54    case WebFallbackThemeEngine::PartInnerSpinButton:
55      return ui::NativeTheme::kInnerSpinButton;
56    case WebFallbackThemeEngine::PartProgressBar:
57      return ui::NativeTheme::kProgressBar;
58    default:
59      return ui::NativeTheme::kScrollbarDownArrow;
60  }
61}
62
63static ui::NativeTheme::State NativeThemeState(
64    WebFallbackThemeEngine::State state) {
65  switch (state) {
66    case WebFallbackThemeEngine::StateDisabled:
67      return ui::NativeTheme::kDisabled;
68    case WebFallbackThemeEngine::StateHover:
69      return ui::NativeTheme::kHovered;
70    case WebFallbackThemeEngine::StateNormal:
71      return ui::NativeTheme::kNormal;
72    case WebFallbackThemeEngine::StatePressed:
73      return ui::NativeTheme::kPressed;
74    default:
75      return ui::NativeTheme::kDisabled;
76  }
77}
78
79static void GetNativeThemeExtraParams(
80    WebFallbackThemeEngine::Part part,
81    WebFallbackThemeEngine::State state,
82    const WebFallbackThemeEngine::ExtraParams* extra_params,
83    ui::NativeTheme::ExtraParams* native_theme_extra_params) {
84  switch (part) {
85    case WebFallbackThemeEngine::PartScrollbarHorizontalTrack:
86    case WebFallbackThemeEngine::PartScrollbarVerticalTrack:
87      native_theme_extra_params->scrollbar_track.track_x =
88          extra_params->scrollbarTrack.trackX;
89      native_theme_extra_params->scrollbar_track.track_y =
90          extra_params->scrollbarTrack.trackY;
91      native_theme_extra_params->scrollbar_track.track_width =
92          extra_params->scrollbarTrack.trackWidth;
93      native_theme_extra_params->scrollbar_track.track_height =
94          extra_params->scrollbarTrack.trackHeight;
95      break;
96    case WebFallbackThemeEngine::PartCheckbox:
97      native_theme_extra_params->button.checked = extra_params->button.checked;
98      native_theme_extra_params->button.indeterminate =
99          extra_params->button.indeterminate;
100      break;
101    case WebFallbackThemeEngine::PartRadio:
102      native_theme_extra_params->button.checked = extra_params->button.checked;
103      break;
104    case WebFallbackThemeEngine::PartButton:
105      native_theme_extra_params->button.is_default =
106          extra_params->button.isDefault;
107      native_theme_extra_params->button.has_border =
108          extra_params->button.hasBorder;
109      // Native buttons have a different focus style.
110      native_theme_extra_params->button.is_focused = false;
111      native_theme_extra_params->button.background_color =
112          extra_params->button.backgroundColor;
113      break;
114    case WebFallbackThemeEngine::PartTextField:
115      native_theme_extra_params->text_field.is_text_area =
116          extra_params->textField.isTextArea;
117      native_theme_extra_params->text_field.is_listbox =
118          extra_params->textField.isListbox;
119      native_theme_extra_params->text_field.background_color =
120          extra_params->textField.backgroundColor;
121      break;
122    case WebFallbackThemeEngine::PartMenuList:
123      native_theme_extra_params->menu_list.has_border =
124          extra_params->menuList.hasBorder;
125      native_theme_extra_params->menu_list.has_border_radius =
126          extra_params->menuList.hasBorderRadius;
127      native_theme_extra_params->menu_list.arrow_x =
128          extra_params->menuList.arrowX;
129      native_theme_extra_params->menu_list.arrow_y =
130          extra_params->menuList.arrowY;
131      native_theme_extra_params->menu_list.background_color =
132          extra_params->menuList.backgroundColor;
133      break;
134    case WebFallbackThemeEngine::PartSliderTrack:
135    case WebFallbackThemeEngine::PartSliderThumb:
136      native_theme_extra_params->slider.vertical =
137          extra_params->slider.vertical;
138      native_theme_extra_params->slider.in_drag = extra_params->slider.inDrag;
139      break;
140    case WebFallbackThemeEngine::PartInnerSpinButton:
141      native_theme_extra_params->inner_spin.spin_up =
142          extra_params->innerSpin.spinUp;
143      native_theme_extra_params->inner_spin.read_only =
144          extra_params->innerSpin.readOnly;
145      break;
146    case WebFallbackThemeEngine::PartProgressBar:
147      native_theme_extra_params->progress_bar.determinate =
148          extra_params->progressBar.determinate;
149      native_theme_extra_params->progress_bar.value_rect_x =
150          extra_params->progressBar.valueRectX;
151      native_theme_extra_params->progress_bar.value_rect_y =
152          extra_params->progressBar.valueRectY;
153      native_theme_extra_params->progress_bar.value_rect_width =
154          extra_params->progressBar.valueRectWidth;
155      native_theme_extra_params->progress_bar.value_rect_height =
156          extra_params->progressBar.valueRectHeight;
157      break;
158    default:
159      break;  // Parts that have no extra params get here.
160  }
161}
162
163WebFallbackThemeEngineImpl::WebFallbackThemeEngineImpl()
164    : theme_(new ui::FallbackTheme()) {
165}
166
167WebFallbackThemeEngineImpl::~WebFallbackThemeEngineImpl() {}
168
169blink::WebSize WebFallbackThemeEngineImpl::getSize(
170    WebFallbackThemeEngine::Part part) {
171  ui::NativeTheme::ExtraParams extra;
172  return theme_->GetPartSize(NativeThemePart(part),
173                             ui::NativeTheme::kNormal,
174                             extra);
175}
176
177void WebFallbackThemeEngineImpl::paint(
178    blink::WebCanvas* canvas,
179    WebFallbackThemeEngine::Part part,
180    WebFallbackThemeEngine::State state,
181    const blink::WebRect& rect,
182    const WebFallbackThemeEngine::ExtraParams* extra_params) {
183  ui::NativeTheme::ExtraParams native_theme_extra_params;
184  GetNativeThemeExtraParams(
185      part, state, extra_params, &native_theme_extra_params);
186  theme_->Paint(canvas,
187                NativeThemePart(part),
188                NativeThemeState(state),
189                gfx::Rect(rect),
190                native_theme_extra_params);
191}
192
193}  // namespace content
194