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 12 using blink::WebCanvas; 13 using blink::WebColor; 14 using blink::WebRect; 15 using blink::WebThemeEngine; 16 17 namespace webkit_glue { 18 19 static 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 61 static 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 77 static 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 161 blink::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 168 void WebThemeEngineImpl::paint( 169 blink::WebCanvas* canvas, 170 WebThemeEngine::Part part, 171 WebThemeEngine::State state, 172 const blink::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