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