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
12class SkCanvas;
13
14namespace gfx {
15class Rect;
16class Size;
17}
18
19namespace 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.
38class 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