15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef UI_NATIVE_THEME_NATIVE_THEME_H_
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define UI_NATIVE_THEME_NATIVE_THEME_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/observer_list.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkColor.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/native_widget_types.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/native_theme/native_theme_export.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SkCanvas;
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Rect;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Size;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass NativeThemeObserver;
235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class supports drawing UI controls (like buttons, text fields, lists,
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// comboboxes, etc) that look like the native UI controls of the underlying
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// platform, such as Windows or Linux. It also supplies default colors for
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// dialog box backgrounds, etc., which are obtained from the system theme where
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// possible.
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The supported control types are listed in the Part enum.  These parts can be
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in any state given by the State enum, where the actual definition of the
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// state is part-specific. The supported colors are listed in the ColorId enum.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Some parts require more information than simply the state in order to be
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// drawn correctly, and this information is given to the Paint() method via the
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ExtraParams union.  Each part that requires more information has its own
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// field in the union.
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NativeTheme also supports getting the default size of a given part with
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the GetPartSize() method.
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class NATIVE_THEME_EXPORT NativeTheme {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The part to be painted / sized.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum Part {
45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    kComboboxArrow,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kCheckbox,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kInnerSpinButton,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kMenuList,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kMenuCheck,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kMenuCheckBackground,
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kMenuPopupArrow,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kMenuPopupBackground,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kMenuPopupGutter,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kMenuPopupSeparator,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kMenuItemBackground,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kProgressBar,
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kPushButton,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kRadio,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The order of the arrow enums is important, do not change without also
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // changing the code in platform implementations.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kScrollbarDownArrow,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kScrollbarLeftArrow,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kScrollbarRightArrow,
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kScrollbarUpArrow,
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kScrollbarHorizontalThumb,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kScrollbarVerticalThumb,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kScrollbarHorizontalTrack,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kScrollbarVerticalTrack,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kScrollbarHorizontalGripper,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kScrollbarVerticalGripper,
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // The corner is drawn when there is both a horizontal and vertical
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // scrollbar.
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    kScrollbarCorner,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kSliderTrack,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kSliderThumb,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kTabPanelBackground,
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kTextField,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kTrackbarThumb,
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kTrackbarTrack,
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kWindowResizeGripper,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kMaxPart,
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The state of the part.
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum State {
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // IDs defined as specific values for use in arrays.
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    kDisabled = 0,
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    kHovered  = 1,
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    kNormal   = 2,
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    kPressed  = 3,
93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    kNumStates = kPressed + 1,
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Each structure below holds extra information needed when painting a given
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // part.
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct ButtonExtraParams {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool checked;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool indeterminate;  // Whether the button state is indeterminate.
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_default;  // Whether the button is default button.
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_focused;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool has_border;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int classic_state;  // Used on Windows when uxtheme is not available.
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkColor background_color;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct InnerSpinButtonExtraParams {
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool spin_up;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool read_only;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int classic_state;  // Used on Windows when uxtheme is not available.
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct MenuArrowExtraParams {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool pointing_right;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Used for the disabled state to indicate if the item is both disabled and
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // selected.
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_selected;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct MenuCheckExtraParams {
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_radio;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Used for the disabled state to indicate if the item is both disabled and
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // selected.
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_selected;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct MenuItemExtraParams {
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_selected;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct MenuListExtraParams {
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool has_border;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool has_border_radius;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int arrow_x;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int arrow_y;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkColor background_color;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int classic_state;  // Used on Windows when uxtheme is not available.
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct MenuSeparatorExtraParams {
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool has_gutter;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  struct MenuBackgroundExtraParams {
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int corner_radius;
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct ProgressBarExtraParams {
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    double animated_seconds;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool determinate;
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int value_rect_x;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int value_rect_y;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int value_rect_width;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int value_rect_height;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct ScrollbarArrowExtraParams {
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_hovering;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct ScrollbarTrackExtraParams {
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_upper;
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int track_x;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int track_y;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int track_width;
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int track_height;
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int classic_state;  // Used on Windows when uxtheme is not available.
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct ScrollbarThumbExtraParams {
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_hovering;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct SliderExtraParams {
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool vertical;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool in_drag;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct TextFieldExtraParams {
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_text_area;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_listbox;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkColor background_color;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_read_only;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_focused;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool fill_content_area;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool draw_edges;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int classic_state;  // Used on Windows when uxtheme is not available.
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct TrackbarExtraParams {
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool vertical;
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int classic_state;  // Used on Windows when uxtheme is not available.
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  union ExtraParams {
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ButtonExtraParams button;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InnerSpinButtonExtraParams inner_spin;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MenuArrowExtraParams menu_arrow;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MenuCheckExtraParams menu_check;
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MenuItemExtraParams menu_item;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MenuListExtraParams menu_list;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MenuSeparatorExtraParams menu_separator;
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    MenuBackgroundExtraParams menu_background;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ProgressBarExtraParams progress_bar;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ScrollbarArrowExtraParams scrollbar_arrow;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ScrollbarTrackExtraParams scrollbar_track;
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ScrollbarThumbExtraParams scrollbar_thumb;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SliderExtraParams slider;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TextFieldExtraParams text_field;
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TrackbarExtraParams trackbar;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return the size of the part.
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual gfx::Size GetPartSize(Part part,
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                State state,
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                const ExtraParams& extra) const = 0;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Paint the part to the canvas.
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Paint(SkCanvas* canvas,
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     Part part,
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     State state,
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const gfx::Rect& rect,
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const ExtraParams& extra) const = 0;
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
227f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Paint part during state transition, used for overlay scrollbar state
228f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // transition animation.
229f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void PaintStateTransition(SkCanvas* canvas,
230f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                    Part part,
231f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                    State startState,
232f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                    State endState,
233f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                    double progress,
234f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                    const gfx::Rect& rect) const { }
235f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Supports theme specific colors.
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetScrollbarColors(unsigned inactive_color,
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          unsigned active_color,
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          unsigned track_color);
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Colors for GetSystemColor().
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum ColorId {
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Windows
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    kColorId_WindowBackground,
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Dialogs
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kColorId_DialogBackground,
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // FocusableBorder
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kColorId_FocusedBorderColor,
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kColorId_UnfocusedBorderColor,
25090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Button
25190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    kColorId_ButtonBackgroundColor,
25290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    kColorId_ButtonEnabledColor,
25390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    kColorId_ButtonDisabledColor,
25490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    kColorId_ButtonHighlightColor,
25590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    kColorId_ButtonHoverColor,
2560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    kColorId_ButtonHoverBackgroundColor,
25746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    kColorId_BlueButtonEnabledColor,
25846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    kColorId_BlueButtonDisabledColor,
259116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    kColorId_BlueButtonPressedColor,
26046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    kColorId_BlueButtonHoverColor,
261116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    kColorId_BlueButtonShadowColor,
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // MenuItem
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kColorId_EnabledMenuItemForegroundColor,
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kColorId_DisabledMenuItemForegroundColor,
26523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    kColorId_DisabledEmphasizedMenuItemForegroundColor,
266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    kColorId_SelectedMenuItemForegroundColor,
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kColorId_FocusedMenuItemBackgroundColor,
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    kColorId_HoverMenuItemBackgroundColor,
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kColorId_MenuSeparatorColor,
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    kColorId_MenuBackgroundColor,
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    kColorId_MenuBorderColor,
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // MenuButton - buttons in wrench menu
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    kColorId_EnabledMenuButtonBorderColor,
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    kColorId_FocusedMenuButtonBorderColor,
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    kColorId_HoverMenuButtonBorderColor,
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Label
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kColorId_LabelEnabledColor,
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kColorId_LabelDisabledColor,
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kColorId_LabelBackgroundColor,
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Textfield
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kColorId_TextfieldDefaultColor,
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kColorId_TextfieldDefaultBackground,
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    kColorId_TextfieldReadOnlyColor,
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    kColorId_TextfieldReadOnlyBackground,
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kColorId_TextfieldSelectionColor,
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kColorId_TextfieldSelectionBackgroundFocused,
2875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    // Tooltip
2885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    kColorId_TooltipBackground,
289cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    kColorId_TooltipText,
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Tree
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    kColorId_TreeBackground,
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    kColorId_TreeText,
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    kColorId_TreeSelectedText,
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    kColorId_TreeSelectedTextUnfocused,
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    kColorId_TreeSelectionBackgroundFocused,
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    kColorId_TreeSelectionBackgroundUnfocused,
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    kColorId_TreeArrow,
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Table
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    kColorId_TableBackground,
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    kColorId_TableText,
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    kColorId_TableSelectedText,
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    kColorId_TableSelectedTextUnfocused,
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    kColorId_TableSelectionBackgroundFocused,
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    kColorId_TableSelectionBackgroundUnfocused,
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    kColorId_TableGroupingIndicatorColor,
306c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // Results Tables, such as the chrome omnibox.
307c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    kColorId_ResultsTableNormalBackground,
308c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    kColorId_ResultsTableHoveredBackground,
309c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    kColorId_ResultsTableSelectedBackground,
310c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    kColorId_ResultsTableNormalText,
311c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    kColorId_ResultsTableHoveredText,
312c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    kColorId_ResultsTableSelectedText,
313c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    kColorId_ResultsTableNormalDimmedText,
314c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    kColorId_ResultsTableHoveredDimmedText,
315c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    kColorId_ResultsTableSelectedDimmedText,
316c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    kColorId_ResultsTableNormalUrl,
317c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    kColorId_ResultsTableHoveredUrl,
318c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    kColorId_ResultsTableSelectedUrl,
319c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    kColorId_ResultsTableNormalDivider,
320c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    kColorId_ResultsTableHoveredDivider,
321c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    kColorId_ResultsTableSelectedDivider,
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // TODO(benrg): move other hardcoded colors here.
3235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    kColorId_NumColors,
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return a color from the system theme.
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual SkColor GetSystemColor(ColorId color_id) const = 0;
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns a shared instance of the native theme.
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The returned object should not be deleted by the caller.  This function
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is not thread safe and should only be called from the UI thread.
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Each port of NativeTheme should provide its own implementation of this
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // function, returning the port's subclass.
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static NativeTheme* instance();
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Add or remove observers to be notified when the native theme changes.
3385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void AddObserver(NativeThemeObserver* observer);
3395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void RemoveObserver(NativeThemeObserver* observer);
3405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
3415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Notify observers of native theme changes.
3425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void NotifyObservers();
3435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
344010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) protected:
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NativeTheme();
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~NativeTheme();
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned int thumb_inactive_color_;
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned int thumb_active_color_;
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned int track_color_;
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu private:
3535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Observers to notify when the native theme changes.
3545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ObserverList<NativeThemeObserver> native_theme_observers_;
3555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(NativeTheme);
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ui
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // UI_NATIVE_THEME_NATIVE_THEME_H_
362