• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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