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
13class SkCanvas;
14
15namespace gfx {
16class Rect;
17class Size;
18}
19
20namespace ui {
21
22class 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.
41class 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.
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