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 #ifndef UI_NATIVE_THEME_NATIVE_THEME_H_ 6 #define UI_NATIVE_THEME_NATIVE_THEME_H_ 7 8 #include "base/observer_list.h" 9 #include "third_party/skia/include/core/SkColor.h" 10 #include "ui/gfx/native_widget_types.h" 11 #include "ui/native_theme/native_theme_export.h" 12 13 class SkCanvas; 14 15 namespace gfx { 16 class Rect; 17 class Size; 18 } 19 20 namespace ui { 21 22 class NativeThemeObserver; 23 24 // This class supports drawing UI controls (like buttons, text fields, lists, 25 // comboboxes, etc) that look like the native UI controls of the underlying 26 // platform, such as Windows or Linux. It also supplies default colors for 27 // dialog box backgrounds, etc., which are obtained from the system theme where 28 // possible. 29 // 30 // The supported control types are listed in the Part enum. These parts can be 31 // in any state given by the State enum, where the actual definition of the 32 // state is part-specific. The supported colors are listed in the ColorId enum. 33 // 34 // Some parts require more information than simply the state in order to be 35 // drawn correctly, and this information is given to the Paint() method via the 36 // ExtraParams union. Each part that requires more information has its own 37 // field in the union. 38 // 39 // NativeTheme also supports getting the default size of a given part with 40 // the GetPartSize() method. 41 class NATIVE_THEME_EXPORT NativeTheme { 42 public: 43 // The part to be painted / sized. 44 enum Part { 45 kComboboxArrow, 46 kCheckbox, 47 kInnerSpinButton, 48 kMenuList, 49 kMenuCheck, 50 kMenuCheckBackground, 51 kMenuPopupArrow, 52 kMenuPopupBackground, 53 kMenuPopupGutter, 54 kMenuPopupSeparator, 55 kMenuItemBackground, 56 kProgressBar, 57 kPushButton, 58 kRadio, 59 60 // The order of the arrow enums is important, do not change without also 61 // changing the code in platform implementations. 62 kScrollbarDownArrow, 63 kScrollbarLeftArrow, 64 kScrollbarRightArrow, 65 kScrollbarUpArrow, 66 67 kScrollbarHorizontalThumb, 68 kScrollbarVerticalThumb, 69 kScrollbarHorizontalTrack, 70 kScrollbarVerticalTrack, 71 kScrollbarHorizontalGripper, 72 kScrollbarVerticalGripper, 73 // The corner is drawn when there is both a horizontal and vertical 74 // scrollbar. 75 kScrollbarCorner, 76 kSliderTrack, 77 kSliderThumb, 78 kTabPanelBackground, 79 kTextField, 80 kTrackbarThumb, 81 kTrackbarTrack, 82 kWindowResizeGripper, 83 kMaxPart, 84 }; 85 86 // The state of the part. 87 enum State { 88 // IDs defined as specific values for use in arrays. 89 kDisabled = 0, 90 kHovered = 1, 91 kNormal = 2, 92 kPressed = 3, 93 kNumStates = kPressed + 1, 94 }; 95 96 // Each structure below holds extra information needed when painting a given 97 // part. 98 99 struct ButtonExtraParams { 100 bool checked; 101 bool indeterminate; // Whether the button state is indeterminate. 102 bool is_default; // Whether the button is default button. 103 bool is_focused; 104 bool has_border; 105 int classic_state; // Used on Windows when uxtheme is not available. 106 SkColor background_color; 107 }; 108 109 struct InnerSpinButtonExtraParams { 110 bool spin_up; 111 bool read_only; 112 int classic_state; // Used on Windows when uxtheme is not available. 113 }; 114 115 struct MenuArrowExtraParams { 116 bool pointing_right; 117 // Used for the disabled state to indicate if the item is both disabled and 118 // selected. 119 bool is_selected; 120 }; 121 122 struct MenuCheckExtraParams { 123 bool is_radio; 124 // Used for the disabled state to indicate if the item is both disabled and 125 // selected. 126 bool is_selected; 127 }; 128 129 struct MenuItemExtraParams { 130 bool is_selected; 131 }; 132 133 struct MenuListExtraParams { 134 bool has_border; 135 bool has_border_radius; 136 int arrow_x; 137 int arrow_y; 138 SkColor background_color; 139 int classic_state; // Used on Windows when uxtheme is not available. 140 }; 141 142 struct MenuSeparatorExtraParams { 143 bool has_gutter; 144 }; 145 146 struct MenuBackgroundExtraParams { 147 int corner_radius; 148 }; 149 150 struct ProgressBarExtraParams { 151 double animated_seconds; 152 bool determinate; 153 int value_rect_x; 154 int value_rect_y; 155 int value_rect_width; 156 int value_rect_height; 157 }; 158 159 struct ScrollbarArrowExtraParams { 160 bool is_hovering; 161 }; 162 163 struct ScrollbarTrackExtraParams { 164 bool is_upper; 165 int track_x; 166 int track_y; 167 int track_width; 168 int track_height; 169 int classic_state; // Used on Windows when uxtheme is not available. 170 }; 171 172 struct ScrollbarThumbExtraParams { 173 bool is_hovering; 174 }; 175 176 struct SliderExtraParams { 177 bool vertical; 178 bool in_drag; 179 }; 180 181 struct TextFieldExtraParams { 182 bool is_text_area; 183 bool is_listbox; 184 SkColor background_color; 185 bool is_read_only; 186 bool is_focused; 187 bool fill_content_area; 188 bool draw_edges; 189 int classic_state; // Used on Windows when uxtheme is not available. 190 }; 191 192 struct TrackbarExtraParams { 193 bool vertical; 194 int classic_state; // Used on Windows when uxtheme is not available. 195 }; 196 197 union ExtraParams { 198 ButtonExtraParams button; 199 InnerSpinButtonExtraParams inner_spin; 200 MenuArrowExtraParams menu_arrow; 201 MenuCheckExtraParams menu_check; 202 MenuItemExtraParams menu_item; 203 MenuListExtraParams menu_list; 204 MenuSeparatorExtraParams menu_separator; 205 MenuBackgroundExtraParams menu_background; 206 ProgressBarExtraParams progress_bar; 207 ScrollbarArrowExtraParams scrollbar_arrow; 208 ScrollbarTrackExtraParams scrollbar_track; 209 ScrollbarThumbExtraParams scrollbar_thumb; 210 SliderExtraParams slider; 211 TextFieldExtraParams text_field; 212 TrackbarExtraParams trackbar; 213 }; 214 215 // Return the size of the part. 216 virtual gfx::Size GetPartSize(Part part, 217 State state, 218 const ExtraParams& extra) const = 0; 219 220 // Paint the part to the canvas. 221 virtual void Paint(SkCanvas* canvas, 222 Part part, 223 State state, 224 const gfx::Rect& rect, 225 const ExtraParams& extra) const = 0; 226 227 // Paint part during state transition, used for overlay scrollbar state 228 // transition animation. PaintStateTransition(SkCanvas * canvas,Part part,State startState,State endState,double progress,const gfx::Rect & rect)229 virtual void PaintStateTransition(SkCanvas* canvas, 230 Part part, 231 State startState, 232 State endState, 233 double progress, 234 const gfx::Rect& rect) const { } 235 236 // Supports theme specific colors. 237 void SetScrollbarColors(unsigned inactive_color, 238 unsigned active_color, 239 unsigned track_color); 240 241 // Colors for GetSystemColor(). 242 enum ColorId { 243 // Windows 244 kColorId_WindowBackground, 245 // Dialogs 246 kColorId_DialogBackground, 247 // FocusableBorder 248 kColorId_FocusedBorderColor, 249 kColorId_UnfocusedBorderColor, 250 // Button 251 kColorId_ButtonBackgroundColor, 252 kColorId_ButtonEnabledColor, 253 kColorId_ButtonDisabledColor, 254 kColorId_ButtonHighlightColor, 255 kColorId_ButtonHoverColor, 256 kColorId_ButtonHoverBackgroundColor, 257 kColorId_BlueButtonEnabledColor, 258 kColorId_BlueButtonDisabledColor, 259 kColorId_BlueButtonPressedColor, 260 kColorId_BlueButtonHoverColor, 261 kColorId_BlueButtonShadowColor, 262 // MenuItem 263 kColorId_EnabledMenuItemForegroundColor, 264 kColorId_DisabledMenuItemForegroundColor, 265 kColorId_DisabledEmphasizedMenuItemForegroundColor, 266 kColorId_SelectedMenuItemForegroundColor, 267 kColorId_FocusedMenuItemBackgroundColor, 268 kColorId_HoverMenuItemBackgroundColor, 269 kColorId_MenuSeparatorColor, 270 kColorId_MenuBackgroundColor, 271 kColorId_MenuBorderColor, 272 // MenuButton - buttons in wrench menu 273 kColorId_EnabledMenuButtonBorderColor, 274 kColorId_FocusedMenuButtonBorderColor, 275 kColorId_HoverMenuButtonBorderColor, 276 // Label 277 kColorId_LabelEnabledColor, 278 kColorId_LabelDisabledColor, 279 kColorId_LabelBackgroundColor, 280 // Textfield 281 kColorId_TextfieldDefaultColor, 282 kColorId_TextfieldDefaultBackground, 283 kColorId_TextfieldReadOnlyColor, 284 kColorId_TextfieldReadOnlyBackground, 285 kColorId_TextfieldSelectionColor, 286 kColorId_TextfieldSelectionBackgroundFocused, 287 // Tooltip 288 kColorId_TooltipBackground, 289 kColorId_TooltipText, 290 // Tree 291 kColorId_TreeBackground, 292 kColorId_TreeText, 293 kColorId_TreeSelectedText, 294 kColorId_TreeSelectedTextUnfocused, 295 kColorId_TreeSelectionBackgroundFocused, 296 kColorId_TreeSelectionBackgroundUnfocused, 297 kColorId_TreeArrow, 298 // Table 299 kColorId_TableBackground, 300 kColorId_TableText, 301 kColorId_TableSelectedText, 302 kColorId_TableSelectedTextUnfocused, 303 kColorId_TableSelectionBackgroundFocused, 304 kColorId_TableSelectionBackgroundUnfocused, 305 kColorId_TableGroupingIndicatorColor, 306 // Results Tables, such as the chrome omnibox. 307 kColorId_ResultsTableNormalBackground, 308 kColorId_ResultsTableHoveredBackground, 309 kColorId_ResultsTableSelectedBackground, 310 kColorId_ResultsTableNormalText, 311 kColorId_ResultsTableHoveredText, 312 kColorId_ResultsTableSelectedText, 313 kColorId_ResultsTableNormalDimmedText, 314 kColorId_ResultsTableHoveredDimmedText, 315 kColorId_ResultsTableSelectedDimmedText, 316 kColorId_ResultsTableNormalUrl, 317 kColorId_ResultsTableHoveredUrl, 318 kColorId_ResultsTableSelectedUrl, 319 kColorId_ResultsTableNormalDivider, 320 kColorId_ResultsTableHoveredDivider, 321 kColorId_ResultsTableSelectedDivider, 322 // TODO(benrg): move other hardcoded colors here. 323 324 kColorId_NumColors, 325 }; 326 327 // Return a color from the system theme. 328 virtual SkColor GetSystemColor(ColorId color_id) const = 0; 329 330 // Returns a shared instance of the native theme. 331 // The returned object should not be deleted by the caller. This function 332 // is not thread safe and should only be called from the UI thread. 333 // Each port of NativeTheme should provide its own implementation of this 334 // function, returning the port's subclass. 335 static NativeTheme* instance(); 336 337 // Add or remove observers to be notified when the native theme changes. 338 void AddObserver(NativeThemeObserver* observer); 339 void RemoveObserver(NativeThemeObserver* observer); 340 341 // Notify observers of native theme changes. 342 void NotifyObservers(); 343 344 protected: 345 NativeTheme(); 346 virtual ~NativeTheme(); 347 348 unsigned int thumb_inactive_color_; 349 unsigned int thumb_active_color_; 350 unsigned int track_color_; 351 352 private: 353 // Observers to notify when the native theme changes. 354 ObserverList<NativeThemeObserver> native_theme_observers_; 355 356 DISALLOW_COPY_AND_ASSIGN(NativeTheme); 357 }; 358 359 } // namespace ui 360 361 #endif // UI_NATIVE_THEME_NATIVE_THEME_H_ 362