Home | History | Annotate | Download | only in native_theme
      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