| OLD | NEW |
| (Empty) |
| 1 // Copyright 2014 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 "sky/viewer/platform/webthemeengine_impl.h" | |
| 6 | |
| 7 #include "skia/ext/platform_canvas.h" | |
| 8 #include "sky/engine/public/platform/WebRect.h" | |
| 9 #include "sky/engine/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 sky { | |
| 18 | |
| 19 #if !defined(OS_ANDROID) | |
| 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 return ui::NativeTheme::kScrollbarHorizontalThumb; | |
| 33 case WebThemeEngine::PartScrollbarVerticalThumb: | |
| 34 return ui::NativeTheme::kScrollbarVerticalThumb; | |
| 35 case WebThemeEngine::PartScrollbarHorizontalTrack: | |
| 36 return ui::NativeTheme::kScrollbarHorizontalTrack; | |
| 37 case WebThemeEngine::PartScrollbarVerticalTrack: | |
| 38 return ui::NativeTheme::kScrollbarVerticalTrack; | |
| 39 case WebThemeEngine::PartCheckbox: | |
| 40 return ui::NativeTheme::kCheckbox; | |
| 41 case WebThemeEngine::PartRadio: | |
| 42 return ui::NativeTheme::kRadio; | |
| 43 case WebThemeEngine::PartButton: | |
| 44 return ui::NativeTheme::kPushButton; | |
| 45 case WebThemeEngine::PartMenuList: | |
| 46 return ui::NativeTheme::kMenuList; | |
| 47 case WebThemeEngine::PartSliderTrack: | |
| 48 return ui::NativeTheme::kSliderTrack; | |
| 49 case WebThemeEngine::PartSliderThumb: | |
| 50 return ui::NativeTheme::kSliderThumb; | |
| 51 case WebThemeEngine::PartInnerSpinButton: | |
| 52 return ui::NativeTheme::kInnerSpinButton; | |
| 53 case WebThemeEngine::PartProgressBar: | |
| 54 return ui::NativeTheme::kProgressBar; | |
| 55 default: | |
| 56 return ui::NativeTheme::kScrollbarDownArrow; | |
| 57 } | |
| 58 } | |
| 59 | |
| 60 static ui::NativeTheme::State NativeThemeState( | |
| 61 WebThemeEngine::State state) { | |
| 62 switch (state) { | |
| 63 case WebThemeEngine::StateDisabled: | |
| 64 return ui::NativeTheme::kDisabled; | |
| 65 case WebThemeEngine::StateHover: | |
| 66 return ui::NativeTheme::kHovered; | |
| 67 case WebThemeEngine::StateNormal: | |
| 68 return ui::NativeTheme::kNormal; | |
| 69 case WebThemeEngine::StatePressed: | |
| 70 return ui::NativeTheme::kPressed; | |
| 71 default: | |
| 72 return ui::NativeTheme::kDisabled; | |
| 73 } | |
| 74 } | |
| 75 #endif | |
| 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::PartMenuList: | |
| 113 native_theme_extra_params->menu_list.has_border = | |
| 114 extra_params->menuList.hasBorder; | |
| 115 native_theme_extra_params->menu_list.has_border_radius = | |
| 116 extra_params->menuList.hasBorderRadius; | |
| 117 native_theme_extra_params->menu_list.arrow_x = | |
| 118 extra_params->menuList.arrowX; | |
| 119 native_theme_extra_params->menu_list.arrow_y = | |
| 120 extra_params->menuList.arrowY; | |
| 121 native_theme_extra_params->menu_list.background_color = | |
| 122 extra_params->menuList.backgroundColor; | |
| 123 break; | |
| 124 case WebThemeEngine::PartSliderTrack: | |
| 125 case WebThemeEngine::PartSliderThumb: | |
| 126 native_theme_extra_params->slider.vertical = | |
| 127 extra_params->slider.vertical; | |
| 128 native_theme_extra_params->slider.in_drag = extra_params->slider.inDrag; | |
| 129 break; | |
| 130 case WebThemeEngine::PartInnerSpinButton: | |
| 131 native_theme_extra_params->inner_spin.spin_up = | |
| 132 extra_params->innerSpin.spinUp; | |
| 133 native_theme_extra_params->inner_spin.read_only = | |
| 134 extra_params->innerSpin.readOnly; | |
| 135 break; | |
| 136 case WebThemeEngine::PartProgressBar: | |
| 137 native_theme_extra_params->progress_bar.determinate = | |
| 138 extra_params->progressBar.determinate; | |
| 139 native_theme_extra_params->progress_bar.value_rect_x = | |
| 140 extra_params->progressBar.valueRectX; | |
| 141 native_theme_extra_params->progress_bar.value_rect_y = | |
| 142 extra_params->progressBar.valueRectY; | |
| 143 native_theme_extra_params->progress_bar.value_rect_width = | |
| 144 extra_params->progressBar.valueRectWidth; | |
| 145 native_theme_extra_params->progress_bar.value_rect_height = | |
| 146 extra_params->progressBar.valueRectHeight; | |
| 147 break; | |
| 148 default: | |
| 149 break; // Parts that have no extra params get here. | |
| 150 } | |
| 151 } | |
| 152 | |
| 153 blink::WebSize WebThemeEngineImpl::getSize(WebThemeEngine::Part part) { | |
| 154 #if defined(OS_ANDROID) | |
| 155 return blink::WebSize(); | |
| 156 #else | |
| 157 ui::NativeTheme::ExtraParams extra; | |
| 158 return ui::NativeTheme::instance()->GetPartSize(NativeThemePart(part), | |
| 159 ui::NativeTheme::kNormal, | |
| 160 extra); | |
| 161 #endif | |
| 162 } | |
| 163 | |
| 164 void WebThemeEngineImpl::paint( | |
| 165 blink::WebCanvas* canvas, | |
| 166 WebThemeEngine::Part part, | |
| 167 WebThemeEngine::State state, | |
| 168 const blink::WebRect& rect, | |
| 169 const WebThemeEngine::ExtraParams* extra_params) { | |
| 170 ui::NativeTheme::ExtraParams native_theme_extra_params; | |
| 171 GetNativeThemeExtraParams( | |
| 172 part, state, extra_params, &native_theme_extra_params); | |
| 173 #if !defined(OS_ANDROID) | |
| 174 ui::NativeTheme::instance()->Paint( | |
| 175 canvas, | |
| 176 NativeThemePart(part), | |
| 177 NativeThemeState(state), | |
| 178 gfx::Rect(rect), | |
| 179 native_theme_extra_params); | |
| 180 #endif | |
| 181 } | |
| 182 | |
| 183 void WebThemeEngineImpl::paintStateTransition(blink::WebCanvas* canvas, | |
| 184 WebThemeEngine::Part part, | |
| 185 WebThemeEngine::State startState, | |
| 186 WebThemeEngine::State endState, | |
| 187 double progress, | |
| 188 const blink::WebRect& rect) { | |
| 189 #if !defined(OS_ANDROID) | |
| 190 ui::NativeTheme::instance()->PaintStateTransition( | |
| 191 canvas, | |
| 192 NativeThemePart(part), | |
| 193 NativeThemeState(startState), | |
| 194 NativeThemeState(endState), | |
| 195 progress, | |
| 196 gfx::Rect(rect)); | |
| 197 #endif | |
| 198 } | |
| 199 | |
| 200 } // namespace sky | |
| OLD | NEW |