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