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