1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Use of this source code is governed by a BSD-style license that can be
3731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// found in the LICENSE file.
4731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
5731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "webkit/glue/webthemeengine_impl_linux.h"
6731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
7731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "skia/ext/platform_canvas.h"
872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebRect.h"
972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebSize.h"
10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "ui/gfx/native_theme.h"
11731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
12731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickusing WebKit::WebCanvas;
13731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickusing WebKit::WebColor;
14731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickusing WebKit::WebRect;
15731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
16731df977c0511bca2206b5f333555b1205ff1f43Iain Merricknamespace webkit_glue {
17731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
18731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstatic gfx::Rect WebRectToRect(const WebRect& rect) {
19731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return gfx::Rect(rect.x, rect.y, rect.width, rect.height);
20731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
21731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstatic gfx::NativeTheme::Part NativeThemePart(
23731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    WebKit::WebThemeEngine::Part part) {
24731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  switch (part) {
25731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case WebKit::WebThemeEngine::PartScrollbarDownArrow:
26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return gfx::NativeTheme::kScrollbarDownArrow;
27731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case WebKit::WebThemeEngine::PartScrollbarLeftArrow:
28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return gfx::NativeTheme::kScrollbarLeftArrow;
29731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case WebKit::WebThemeEngine::PartScrollbarRightArrow:
30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return gfx::NativeTheme::kScrollbarRightArrow;
31731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case WebKit::WebThemeEngine::PartScrollbarUpArrow:
32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return gfx::NativeTheme::kScrollbarUpArrow;
33731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case WebKit::WebThemeEngine::PartScrollbarHorizontalThumb:
34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return gfx::NativeTheme::kScrollbarHorizontalThumb;
35731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case WebKit::WebThemeEngine::PartScrollbarVerticalThumb:
36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return gfx::NativeTheme::kScrollbarVerticalThumb;
3772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case WebKit::WebThemeEngine::PartScrollbarHorizontalTrack:
38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return gfx::NativeTheme::kScrollbarHorizontalTrack;
39731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case WebKit::WebThemeEngine::PartScrollbarVerticalTrack:
40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return gfx::NativeTheme::kScrollbarVerticalTrack;
4172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case WebKit::WebThemeEngine::PartCheckbox:
42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return gfx::NativeTheme::kCheckbox;
4372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case WebKit::WebThemeEngine::PartRadio:
44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return gfx::NativeTheme::kRadio;
4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case WebKit::WebThemeEngine::PartButton:
46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return gfx::NativeTheme::kPushButton;
4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case WebKit::WebThemeEngine::PartTextField:
48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return gfx::NativeTheme::kTextField;
4972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case WebKit::WebThemeEngine::PartMenuList:
50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return gfx::NativeTheme::kMenuList;
5172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case WebKit::WebThemeEngine::PartSliderTrack:
52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return gfx::NativeTheme::kSliderTrack;
5372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case WebKit::WebThemeEngine::PartSliderThumb:
54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return gfx::NativeTheme::kSliderThumb;
5572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case WebKit::WebThemeEngine::PartInnerSpinButton:
56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return gfx::NativeTheme::kInnerSpinButton;
5772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case WebKit::WebThemeEngine::PartProgressBar:
58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return gfx::NativeTheme::kProgressBar;
59731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    default:
60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return gfx::NativeTheme::kScrollbarDownArrow;
61731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
62731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
63731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstatic gfx::NativeTheme::State NativeThemeState(
65731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    WebKit::WebThemeEngine::State state) {
66731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  switch (state) {
67731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case WebKit::WebThemeEngine::StateDisabled:
68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return gfx::NativeTheme::kDisabled;
69731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case WebKit::WebThemeEngine::StateHover:
70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return gfx::NativeTheme::kHovered;
71731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case WebKit::WebThemeEngine::StateNormal:
72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return gfx::NativeTheme::kNormal;
73731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case WebKit::WebThemeEngine::StatePressed:
74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return gfx::NativeTheme::kPressed;
75731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    default:
76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return gfx::NativeTheme::kDisabled;
77731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
78731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
79731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
80731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstatic void GetNativeThemeExtraParams(
81731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    WebKit::WebThemeEngine::Part part,
82731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    WebKit::WebThemeEngine::State state,
83731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    const WebKit::WebThemeEngine::ExtraParams* extra_params,
84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    gfx::NativeTheme::ExtraParams* native_theme_extra_params) {
8572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  switch (part) {
8672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case WebKit::WebThemeEngine::PartScrollbarHorizontalTrack:
8772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case WebKit::WebThemeEngine::PartScrollbarVerticalTrack:
8872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      native_theme_extra_params->scrollbar_track.track_x =
8972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          extra_params->scrollbarTrack.trackX;
9072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      native_theme_extra_params->scrollbar_track.track_y =
9172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          extra_params->scrollbarTrack.trackY;
9272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      native_theme_extra_params->scrollbar_track.track_width =
9372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          extra_params->scrollbarTrack.trackWidth;
9472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      native_theme_extra_params->scrollbar_track.track_height =
9572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          extra_params->scrollbarTrack.trackHeight;
9672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      break;
9772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case WebKit::WebThemeEngine::PartCheckbox:
9872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      native_theme_extra_params->button.checked = extra_params->button.checked;
9972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      native_theme_extra_params->button.indeterminate =
10072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          extra_params->button.indeterminate;
10172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      break;
10272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case WebKit::WebThemeEngine::PartRadio:
10372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      native_theme_extra_params->button.checked = extra_params->button.checked;
10472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      break;
10572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case WebKit::WebThemeEngine::PartButton:
10672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      native_theme_extra_params->button.is_default =
10772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          extra_params->button.isDefault;
108dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      native_theme_extra_params->button.has_border =
109dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          extra_params->button.hasBorder;
11072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      native_theme_extra_params->button.background_color =
11172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          extra_params->button.backgroundColor;
11272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      break;
11372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case WebKit::WebThemeEngine::PartTextField:
11472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      native_theme_extra_params->text_field.is_text_area =
11572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          extra_params->textField.isTextArea;
11672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      native_theme_extra_params->text_field.is_listbox =
11772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          extra_params->textField.isListbox;
11872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      native_theme_extra_params->text_field.background_color =
11972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          extra_params->textField.backgroundColor;
12072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      break;
12172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case WebKit::WebThemeEngine::PartMenuList:
122dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      native_theme_extra_params->menu_list.has_border =
123dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          extra_params->menuList.hasBorder;
124dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      native_theme_extra_params->menu_list.has_border_radius =
125dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          extra_params->menuList.hasBorderRadius;
12672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      native_theme_extra_params->menu_list.arrow_x =
12772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          extra_params->menuList.arrowX;
12872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      native_theme_extra_params->menu_list.arrow_y =
12972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          extra_params->menuList.arrowY;
13072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      native_theme_extra_params->menu_list.background_color =
13172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          extra_params->menuList.backgroundColor;
13272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      break;
13372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case WebKit::WebThemeEngine::PartSliderTrack:
13472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case WebKit::WebThemeEngine::PartSliderThumb:
13572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      native_theme_extra_params->slider.vertical =
13672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          extra_params->slider.vertical;
13772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      native_theme_extra_params->slider.in_drag = extra_params->slider.inDrag;
13872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      break;
13972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case WebKit::WebThemeEngine::PartInnerSpinButton:
14072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      native_theme_extra_params->inner_spin.spin_up =
14172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          extra_params->innerSpin.spinUp;
14272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      native_theme_extra_params->inner_spin.read_only =
14372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          extra_params->innerSpin.readOnly;
14472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      break;
14572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case WebKit::WebThemeEngine::PartProgressBar:
14672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      native_theme_extra_params->progress_bar.determinate =
14772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          extra_params->progressBar.determinate;
14872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      native_theme_extra_params->progress_bar.value_rect_x =
14972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          extra_params->progressBar.valueRectX;
15072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      native_theme_extra_params->progress_bar.value_rect_y =
15172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          extra_params->progressBar.valueRectY;
15272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      native_theme_extra_params->progress_bar.value_rect_width =
15372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          extra_params->progressBar.valueRectWidth;
15472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      native_theme_extra_params->progress_bar.value_rect_height =
15572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          extra_params->progressBar.valueRectHeight;
15672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      break;
15772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    default:
15872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      break;  // Parts that have no extra params get here.
159731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
160731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
161731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
162731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickWebKit::WebSize WebThemeEngineImpl::getSize(WebKit::WebThemeEngine::Part part) {
163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return gfx::NativeTheme::instance()->GetPartSize(NativeThemePart(part));
164731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
165731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
166731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid WebThemeEngineImpl::paint(
167731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    WebKit::WebCanvas* canvas,
168731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    WebKit::WebThemeEngine::Part part,
169731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    WebKit::WebThemeEngine::State state,
170731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    const WebKit::WebRect& rect,
171731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    const WebKit::WebThemeEngine::ExtraParams* extra_params) {
172ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  gfx::NativeTheme::ExtraParams native_theme_extra_params;
173731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  GetNativeThemeExtraParams(
174731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      part, state, extra_params, &native_theme_extra_params);
175ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  gfx::NativeTheme::instance()->Paint(
176731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      canvas,
177731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      NativeThemePart(part),
178731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      NativeThemeState(state),
179731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      WebRectToRect(rect),
180731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      native_theme_extra_params);
181731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
182731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}  // namespace webkit_glue
183