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