Chromium Code Reviews| Index: webkit/glue/webthemeengine_impl_android.cc |
| diff --git a/webkit/glue/webthemeengine_impl_android.cc b/webkit/glue/webthemeengine_impl_android.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..c0d97e1861577aa91b685e2bf4c2b8a92f80a955 |
| --- /dev/null |
| +++ b/webkit/glue/webthemeengine_impl_android.cc |
| @@ -0,0 +1,186 @@ |
| +// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "webkit/glue/webthemeengine_impl_android.h" |
| + |
| +#include "base/logging.h" |
| +#include "skia/ext/platform_canvas.h" |
| +#include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebRect.h" |
| +#include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebSize.h" |
| +#include "ui/gfx/native_theme_android.h" |
| + |
| +using WebKit::WebCanvas; |
| +using WebKit::WebColor; |
| +using WebKit::WebRect; |
|
darin (slow to review)
2011/12/14 17:56:36
it seems like adding WebThemeEngine here would be
Peter Beverloo
2011/12/14 18:58:41
Good catch, fixed! The file was based on the webth
|
| + |
| +namespace webkit_glue { |
| + |
| +static gfx::Rect WebRectToRect(const WebRect& rect) { |
|
darin (slow to review)
2011/12/14 17:56:36
Hmm, webthemeengine_impl_linux.cc defines this too
Peter Beverloo
2011/12/14 18:58:41
Avoiding the duplicate function would be ideal, of
|
| + return gfx::Rect(rect.x, rect.y, rect.width, rect.height); |
| +} |
| + |
| +static gfx::NativeThemeAndroid::Part NativeThemePart( |
| + WebKit::WebThemeEngine::Part part) { |
| + switch (part) { |
| + case WebKit::WebThemeEngine::PartScrollbarDownArrow: |
| + return gfx::NativeThemeAndroid::SCROLLBAR_DOWN_ARROW; |
| + case WebKit::WebThemeEngine::PartScrollbarLeftArrow: |
| + return gfx::NativeThemeAndroid::SCROLLBAR_LEFT_ARROW; |
| + case WebKit::WebThemeEngine::PartScrollbarRightArrow: |
| + return gfx::NativeThemeAndroid::SCROLLBAR_RIGHT_ARROW; |
| + case WebKit::WebThemeEngine::PartScrollbarUpArrow: |
| + return gfx::NativeThemeAndroid::SCROLLBAR_UP_ARROW; |
| + case WebKit::WebThemeEngine::PartScrollbarHorizontalThumb: |
| + // Android doesn't draw scrollbars. |
| + NOTREACHED(); |
| + return static_cast<gfx::NativeThemeAndroid::Part>(0); |
| + case WebKit::WebThemeEngine::PartScrollbarVerticalThumb: |
| + // Android doesn't draw scrollbars. |
| + NOTREACHED(); |
| + return static_cast<gfx::NativeThemeAndroid::Part>(0); |
| + case WebKit::WebThemeEngine::PartScrollbarHorizontalTrack: |
| + // Android doesn't draw scrollbars. |
| + NOTREACHED(); |
| + return static_cast<gfx::NativeThemeAndroid::Part>(0); |
| + case WebKit::WebThemeEngine::PartScrollbarVerticalTrack: |
| + // Android doesn't draw scrollbars. |
| + NOTREACHED(); |
| + return static_cast<gfx::NativeThemeAndroid::Part>(0); |
| + case WebKit::WebThemeEngine::PartCheckbox: |
| + return gfx::NativeThemeAndroid::CHECKBOX; |
| + case WebKit::WebThemeEngine::PartRadio: |
| + return gfx::NativeThemeAndroid::RADIO; |
| + case WebKit::WebThemeEngine::PartButton: |
| + return gfx::NativeThemeAndroid::PUSH_BUTTON; |
| + case WebKit::WebThemeEngine::PartTextField: |
| + return gfx::NativeThemeAndroid::TEXTFIELD; |
| + case WebKit::WebThemeEngine::PartMenuList: |
| + return gfx::NativeThemeAndroid::MENU_LIST; |
| + case WebKit::WebThemeEngine::PartSliderTrack: |
| + return gfx::NativeThemeAndroid::SLIDER_TRACK; |
| + case WebKit::WebThemeEngine::PartSliderThumb: |
| + return gfx::NativeThemeAndroid::SLIDER_THUMB; |
| + case WebKit::WebThemeEngine::PartInnerSpinButton: |
| + return gfx::NativeThemeAndroid::INNER_SPIN_BUTTON; |
| + case WebKit::WebThemeEngine::PartProgressBar: |
| + return gfx::NativeThemeAndroid::PROGRESS_BAR; |
| + default: |
| + return gfx::NativeThemeAndroid::SCROLLBAR_DOWN_ARROW; |
| + } |
| +} |
| + |
| +static gfx::NativeThemeAndroid::State NativeThemeState( |
| + WebKit::WebThemeEngine::State state) { |
| + switch (state) { |
| + case WebKit::WebThemeEngine::StateDisabled: |
| + return gfx::NativeThemeAndroid::DISABLED; |
| + case WebKit::WebThemeEngine::StateHover: |
| + return gfx::NativeThemeAndroid::HOVERED; |
| + case WebKit::WebThemeEngine::StateNormal: |
| + return gfx::NativeThemeAndroid::NORMAL; |
| + case WebKit::WebThemeEngine::StatePressed: |
| + return gfx::NativeThemeAndroid::PRESSED; |
| + default: |
| + return gfx::NativeThemeAndroid::DISABLED; |
| + } |
| +} |
| + |
| +static void GetNativeThemeExtraParams( |
| + WebKit::WebThemeEngine::Part part, |
| + WebKit::WebThemeEngine::State state, |
| + const WebKit::WebThemeEngine::ExtraParams* extra_params, |
| + gfx::NativeThemeAndroid::ExtraParams* native_theme_extra_params) { |
| + switch (part) { |
| + case WebKit::WebThemeEngine::PartScrollbarHorizontalTrack: |
| + case WebKit::WebThemeEngine::PartScrollbarVerticalTrack: |
| + // Android doesn't draw scrollbars. |
| + NOTREACHED(); |
| + break; |
| + case WebKit::WebThemeEngine::PartCheckbox: |
| + native_theme_extra_params->button.checked = extra_params->button.checked; |
| + native_theme_extra_params->button.indeterminate = |
| + extra_params->button.indeterminate; |
| + break; |
| + case WebKit::WebThemeEngine::PartRadio: |
| + native_theme_extra_params->button.checked = extra_params->button.checked; |
| + break; |
| + case WebKit::WebThemeEngine::PartButton: |
| + native_theme_extra_params->button.is_default = |
| + extra_params->button.isDefault; |
| + native_theme_extra_params->button.has_border = |
| + extra_params->button.hasBorder; |
| + native_theme_extra_params->button.background_color = |
| + extra_params->button.backgroundColor; |
| + break; |
| + case WebKit::WebThemeEngine::PartTextField: |
| + native_theme_extra_params->text_field.is_text_area = |
| + extra_params->textField.isTextArea; |
| + native_theme_extra_params->text_field.is_listbox = |
| + extra_params->textField.isListbox; |
| + native_theme_extra_params->text_field.background_color = |
| + extra_params->textField.backgroundColor; |
| + break; |
| + case WebKit::WebThemeEngine::PartMenuList: |
| + native_theme_extra_params->menu_list.has_border = |
| + extra_params->menuList.hasBorder; |
| + native_theme_extra_params->menu_list.has_border_radius = |
| + extra_params->menuList.hasBorderRadius; |
| + native_theme_extra_params->menu_list.arrow_x = |
| + extra_params->menuList.arrowX; |
| + native_theme_extra_params->menu_list.arrow_y = |
| + extra_params->menuList.arrowY; |
| + native_theme_extra_params->menu_list.background_color = |
| + extra_params->menuList.backgroundColor; |
| + break; |
| + case WebKit::WebThemeEngine::PartSliderTrack: |
| + case WebKit::WebThemeEngine::PartSliderThumb: |
| + native_theme_extra_params->slider.vertical = |
| + extra_params->slider.vertical; |
| + native_theme_extra_params->slider.in_drag = extra_params->slider.inDrag; |
| + break; |
| + case WebKit::WebThemeEngine::PartInnerSpinButton: |
| + native_theme_extra_params->inner_spin.spin_up = |
| + extra_params->innerSpin.spinUp; |
| + native_theme_extra_params->inner_spin.read_only = |
| + extra_params->innerSpin.readOnly; |
| + break; |
| + case WebKit::WebThemeEngine::PartProgressBar: |
| + native_theme_extra_params->progress_bar.determinate = |
| + extra_params->progressBar.determinate; |
| + native_theme_extra_params->progress_bar.value_rect_x = |
| + extra_params->progressBar.valueRectX; |
| + native_theme_extra_params->progress_bar.value_rect_y = |
| + extra_params->progressBar.valueRectY; |
| + native_theme_extra_params->progress_bar.value_rect_width = |
| + extra_params->progressBar.valueRectWidth; |
| + native_theme_extra_params->progress_bar.value_rect_height = |
| + extra_params->progressBar.valueRectHeight; |
| + break; |
| + default: |
| + break; // Parts that have no extra params get here. |
| + } |
| +} |
| + |
| +WebKit::WebSize WebThemeEngineImpl::getSize(WebKit::WebThemeEngine::Part part) { |
| + return gfx::NativeThemeAndroid::instance()->GetPartSize( |
| + NativeThemePart(part)); |
|
darin (slow to review)
2011/12/14 17:56:36
nit: indentation
Peter Beverloo
2011/12/14 18:58:41
Done.
|
| +} |
| + |
| +void WebThemeEngineImpl::paint( |
| + WebKit::WebCanvas* canvas, |
| + WebKit::WebThemeEngine::Part part, |
| + WebKit::WebThemeEngine::State state, |
| + const WebKit::WebRect& rect, |
| + const WebKit::WebThemeEngine::ExtraParams* extra_params) { |
| + gfx::NativeThemeAndroid::ExtraParams native_theme_extra_params; |
| + GetNativeThemeExtraParams( |
| + part, state, extra_params, &native_theme_extra_params); |
| + gfx::NativeThemeAndroid::instance()->Paint( |
| + canvas, |
| + NativeThemePart(part), |
| + NativeThemeState(state), |
| + WebRectToRect(rect), |
| + native_theme_extra_params); |
| +} |
| +} // namespace webkit_glue |