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  // Each structure below holds extra information needed when painting a given
89  // part.
90
91  struct ButtonExtraParams {
92    bool checked;
93    bool indeterminate;  // Whether the button state is indeterminate.
94    bool is_default;  // Whether the button is default button.
95    bool is_focused;
96    bool has_border;
97    int classic_state;  // Used on Windows when uxtheme is not available.
98    SkColor background_color;
99  };
100
101  struct InnerSpinButtonExtraParams {
102    bool spin_up;
103    bool read_only;
104    int classic_state;  // Used on Windows when uxtheme is not available.
105  };
106
107  struct MenuArrowExtraParams {
108    bool pointing_right;
109    // Used for the disabled state to indicate if the item is both disabled and
110    // selected.
111    bool is_selected;
112  };
113
114  struct MenuCheckExtraParams {
115    bool is_radio;
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 MenuItemExtraParams {
122    bool is_selected;
123  };
124
125  struct MenuListExtraParams {
126    bool has_border;
127    bool has_border_radius;
128    int arrow_x;
129    int arrow_y;
130    SkColor background_color;
131    int classic_state;  // Used on Windows when uxtheme is not available.
132  };
133
134  struct MenuSeparatorExtraParams {
135    bool has_gutter;
136  };
137
138  struct MenuBackgroundExtraParams {
139    int corner_radius;
140  };
141
142  struct ProgressBarExtraParams {
143    double animated_seconds;
144    bool determinate;
145    int value_rect_x;
146    int value_rect_y;
147    int value_rect_width;
148    int value_rect_height;
149  };
150
151  struct ScrollbarArrowExtraParams {
152    bool is_hovering;
153  };
154
155  struct ScrollbarTrackExtraParams {
156    bool is_upper;
157    int track_x;
158    int track_y;
159    int track_width;
160    int track_height;
161    int classic_state;  // Used on Windows when uxtheme is not available.
162  };
163
164  struct ScrollbarThumbExtraParams {
165    bool is_hovering;
166  };
167
168  struct SliderExtraParams {
169    bool vertical;
170    bool in_drag;
171  };
172
173  struct TextFieldExtraParams {
174    bool is_text_area;
175    bool is_listbox;
176    SkColor background_color;
177    bool is_read_only;
178    bool is_focused;
179    bool fill_content_area;
180    bool draw_edges;
181    int classic_state;  // Used on Windows when uxtheme is not available.
182  };
183
184  struct TrackbarExtraParams {
185    bool vertical;
186    int classic_state;  // Used on Windows when uxtheme is not available.
187  };
188
189  union ExtraParams {
190    ButtonExtraParams button;
191    InnerSpinButtonExtraParams inner_spin;
192    MenuArrowExtraParams menu_arrow;
193    MenuCheckExtraParams menu_check;
194    MenuItemExtraParams menu_item;
195    MenuListExtraParams menu_list;
196    MenuSeparatorExtraParams menu_separator;
197    MenuBackgroundExtraParams menu_background;
198    ProgressBarExtraParams progress_bar;
199    ScrollbarArrowExtraParams scrollbar_arrow;
200    ScrollbarTrackExtraParams scrollbar_track;
201    ScrollbarThumbExtraParams scrollbar_thumb;
202    SliderExtraParams slider;
203    TextFieldExtraParams text_field;
204    TrackbarExtraParams trackbar;
205  };
206
207  // Return the size of the part.
208  virtual gfx::Size GetPartSize(Part part,
209                                State state,
210                                const ExtraParams& extra) const = 0;
211
212  // Paint the part to the canvas.
213  virtual void Paint(SkCanvas* canvas,
214                     Part part,
215                     State state,
216                     const gfx::Rect& rect,
217                     const ExtraParams& extra) const = 0;
218
219  // Supports theme specific colors.
220  void SetScrollbarColors(unsigned inactive_color,
221                          unsigned active_color,
222                          unsigned track_color);
223
224  // Colors for GetSystemColor().
225  enum ColorId {
226    // Windows
227    kColorId_WindowBackground,
228    // Dialogs
229    kColorId_DialogBackground,
230    // FocusableBorder
231    kColorId_FocusedBorderColor,
232    kColorId_UnfocusedBorderColor,
233    // Button
234    kColorId_ButtonBackgroundColor,
235    kColorId_ButtonEnabledColor,
236    kColorId_ButtonDisabledColor,
237    kColorId_ButtonHighlightColor,
238    kColorId_ButtonHoverColor,
239    // MenuItem
240    kColorId_EnabledMenuItemForegroundColor,
241    kColorId_DisabledMenuItemForegroundColor,
242    kColorId_SelectedMenuItemForegroundColor,
243    kColorId_FocusedMenuItemBackgroundColor,
244    kColorId_HoverMenuItemBackgroundColor,
245    kColorId_MenuSeparatorColor,
246    kColorId_MenuBackgroundColor,
247    kColorId_MenuBorderColor,
248    // MenuButton - buttons in wrench menu
249    kColorId_EnabledMenuButtonBorderColor,
250    kColorId_FocusedMenuButtonBorderColor,
251    kColorId_HoverMenuButtonBorderColor,
252    // Label
253    kColorId_LabelEnabledColor,
254    kColorId_LabelDisabledColor,
255    kColorId_LabelBackgroundColor,
256    // Textfield
257    kColorId_TextfieldDefaultColor,
258    kColorId_TextfieldDefaultBackground,
259    kColorId_TextfieldReadOnlyColor,
260    kColorId_TextfieldReadOnlyBackground,
261    kColorId_TextfieldSelectionColor,
262    kColorId_TextfieldSelectionBackgroundFocused,
263    // Tree
264    kColorId_TreeBackground,
265    kColorId_TreeText,
266    kColorId_TreeSelectedText,
267    kColorId_TreeSelectedTextUnfocused,
268    kColorId_TreeSelectionBackgroundFocused,
269    kColorId_TreeSelectionBackgroundUnfocused,
270    kColorId_TreeArrow,
271    // Table
272    kColorId_TableBackground,
273    kColorId_TableText,
274    kColorId_TableSelectedText,
275    kColorId_TableSelectedTextUnfocused,
276    kColorId_TableSelectionBackgroundFocused,
277    kColorId_TableSelectionBackgroundUnfocused,
278    kColorId_TableGroupingIndicatorColor,
279    // TODO(benrg): move other hardcoded colors here.
280  };
281
282  // Return a color from the system theme.
283  virtual SkColor GetSystemColor(ColorId color_id) const = 0;
284
285  // Returns a shared instance of the native theme.
286  // The returned object should not be deleted by the caller.  This function
287  // is not thread safe and should only be called from the UI thread.
288  // Each port of NativeTheme should provide its own implementation of this
289  // function, returning the port's subclass.
290  static NativeTheme* instance();
291
292 protected:
293  NativeTheme();
294  virtual ~NativeTheme();
295
296  unsigned int thumb_inactive_color_;
297  unsigned int thumb_active_color_;
298  unsigned int track_color_;
299
300  DISALLOW_COPY_AND_ASSIGN(NativeTheme);
301};
302
303}  // namespace ui
304
305#endif  // UI_NATIVE_THEME_NATIVE_THEME_H_
306