summaryrefslogtreecommitdiffstats
path: root/ui/base/native_theme/native_theme.h
diff options
context:
space:
mode:
Diffstat (limited to 'ui/base/native_theme/native_theme.h')
-rw-r--r--ui/base/native_theme/native_theme.h273
1 files changed, 273 insertions, 0 deletions
diff --git a/ui/base/native_theme/native_theme.h b/ui/base/native_theme/native_theme.h
new file mode 100644
index 0000000..b37b1e7
--- /dev/null
+++ b/ui/base/native_theme/native_theme.h
@@ -0,0 +1,273 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_BASE_NATIVE_THEME_NATIVE_THEME_H_
+#define UI_BASE_NATIVE_THEME_NATIVE_THEME_H_
+#pragma once
+
+#include "third_party/skia/include/core/SkColor.h"
+#include "ui/base/ui_export.h"
+#include "ui/gfx/native_widget_types.h"
+
+class SkCanvas;
+
+namespace gfx {
+class Rect;
+class Size;
+}
+
+namespace ui {
+
+// This class supports drawing UI controls (like buttons, text fields, lists,
+// comboboxes, etc) that look like the native UI controls of the underlying
+// platform, such as Windows or Linux. It also supplies default colors for
+// dialog box backgrounds, etc., which are obtained from the system theme where
+// possible.
+//
+// The supported control types are listed in the Part enum. These parts can be
+// in any state given by the State enum, where the actual definition of the
+// state is part-specific. The supported colors are listed in the ColorId enum.
+//
+// Some parts require more information than simply the state in order to be
+// drawn correctly, and this information is given to the Paint() method via the
+// ExtraParams union. Each part that requires more information has its own
+// field in the union.
+//
+// NativeTheme also supports getting the default size of a given part with
+// the GetPartSize() method.
+class UI_EXPORT NativeTheme {
+ public:
+ // The part to be painted / sized.
+ enum Part {
+ kCheckbox,
+ kInnerSpinButton,
+ kMenuList,
+ kMenuCheck,
+ kMenuCheckBackground,
+ kMenuPopupArrow,
+ kMenuPopupBackground,
+ kMenuPopupGutter,
+ kMenuPopupSeparator,
+ kMenuItemBackground,
+ kProgressBar,
+ kPushButton,
+ kRadio,
+
+ // The order of the arrow enums is important, do not change without also
+ // changing the code in platform implementations.
+ kScrollbarDownArrow,
+ kScrollbarLeftArrow,
+ kScrollbarRightArrow,
+ kScrollbarUpArrow,
+
+ kScrollbarHorizontalThumb,
+ kScrollbarVerticalThumb,
+ kScrollbarHorizontalTrack,
+ kScrollbarVerticalTrack,
+ kScrollbarHorizontalGripper,
+ kScrollbarVerticalGripper,
+ kSliderTrack,
+ kSliderThumb,
+ kTabPanelBackground,
+ kTextField,
+ kTrackbarThumb,
+ kTrackbarTrack,
+ kWindowResizeGripper,
+ kMaxPart,
+ };
+
+ // The state of the part.
+ enum State {
+ kDisabled,
+ kHovered,
+ kNormal,
+ kPressed,
+ kMaxState,
+ };
+
+ // Each structure below holds extra information needed when painting a given
+ // part.
+
+ struct ButtonExtraParams {
+ bool checked;
+ bool indeterminate; // Whether the button state is indeterminate.
+ bool is_default; // Whether the button is default button.
+ bool has_border;
+ int classic_state; // Used on Windows when uxtheme is not available.
+ SkColor background_color;
+ };
+
+ struct InnerSpinButtonExtraParams {
+ bool spin_up;
+ bool read_only;
+ int classic_state; // Used on Windows when uxtheme is not available.
+ };
+
+ struct MenuArrowExtraParams {
+ bool pointing_right;
+ // Used for the disabled state to indicate if the item is both disabled and
+ // selected.
+ bool is_selected;
+ };
+
+ struct MenuCheckExtraParams {
+ bool is_radio;
+ // Used for the disabled state to indicate if the item is both disabled and
+ // selected.
+ bool is_selected;
+ };
+
+ struct MenuItemExtraParams {
+ bool is_selected;
+ };
+
+ struct MenuListExtraParams {
+ bool has_border;
+ bool has_border_radius;
+ int arrow_x;
+ int arrow_y;
+ SkColor background_color;
+ int classic_state; // Used on Windows when uxtheme is not available.
+ };
+
+ struct MenuSeparatorExtraParams {
+ bool has_gutter;
+ };
+
+ struct ProgressBarExtraParams {
+ double animated_seconds;
+ bool determinate;
+ int value_rect_x;
+ int value_rect_y;
+ int value_rect_width;
+ int value_rect_height;
+ };
+
+ struct ScrollbarArrowExtraParams {
+ bool is_hovering;
+ };
+
+ struct ScrollbarTrackExtraParams {
+ bool is_upper;
+ int track_x;
+ int track_y;
+ int track_width;
+ int track_height;
+ int classic_state; // Used on Windows when uxtheme is not available.
+ };
+
+ struct ScrollbarThumbExtraParams {
+ bool is_hovering;
+ };
+
+ struct SliderExtraParams {
+ bool vertical;
+ bool in_drag;
+ };
+
+ struct TextFieldExtraParams {
+ bool is_text_area;
+ bool is_listbox;
+ SkColor background_color;
+ bool is_read_only;
+ bool is_focused;
+ bool fill_content_area;
+ bool draw_edges;
+ int classic_state; // Used on Windows when uxtheme is not available.
+ };
+
+ struct TrackbarExtraParams {
+ bool vertical;
+ int classic_state; // Used on Windows when uxtheme is not available.
+ };
+
+ union ExtraParams {
+ ButtonExtraParams button;
+ InnerSpinButtonExtraParams inner_spin;
+ MenuArrowExtraParams menu_arrow;
+ MenuCheckExtraParams menu_check;
+ MenuItemExtraParams menu_item;
+ MenuListExtraParams menu_list;
+ MenuSeparatorExtraParams menu_separator;
+ ProgressBarExtraParams progress_bar;
+ ScrollbarArrowExtraParams scrollbar_arrow;
+ ScrollbarTrackExtraParams scrollbar_track;
+ ScrollbarThumbExtraParams scrollbar_thumb;
+ SliderExtraParams slider;
+ TextFieldExtraParams text_field;
+ TrackbarExtraParams trackbar;
+ };
+
+ // Return the size of the part.
+ virtual gfx::Size GetPartSize(Part part,
+ State state,
+ const ExtraParams& extra) const = 0;
+
+ // Paint the part to the canvas.
+ virtual void Paint(SkCanvas* canvas,
+ Part part,
+ State state,
+ const gfx::Rect& rect,
+ const ExtraParams& extra) const = 0;
+
+ // Supports theme specific colors.
+ void SetScrollbarColors(unsigned inactive_color,
+ unsigned active_color,
+ unsigned track_color) const;
+
+ // Colors for GetSystemColor().
+ enum ColorId {
+ // Dialogs
+ kColorId_DialogBackground,
+ // FocusableBorder
+ kColorId_FocusedBorderColor,
+ kColorId_UnfocusedBorderColor,
+ // TextButton
+ kColorId_TextButtonBackgroundColor,
+ kColorId_TextButtonEnabledColor,
+ kColorId_TextButtonDisabledColor,
+ kColorId_TextButtonHighlightColor,
+ kColorId_TextButtonHoverColor,
+ // MenuItem
+ kColorId_EnabledMenuItemForegroundColor,
+ kColorId_DisabledMenuItemForegroundColor,
+ kColorId_FocusedMenuItemBackgroundColor,
+ kColorId_MenuSeparatorColor,
+ // Label
+ kColorId_LabelEnabledColor,
+ kColorId_LabelDisabledColor,
+ kColorId_LabelBackgroundColor,
+ // Textfield
+ kColorId_TextfieldDefaultColor,
+ kColorId_TextfieldDefaultBackground,
+ kColorId_TextfieldSelectionColor,
+ kColorId_TextfieldSelectionBackgroundFocused,
+ kColorId_TextfieldSelectionBackgroundUnfocused,
+ // TODO(benrg): move other hardcoded colors here.
+ };
+
+ // Return a color from the system theme.
+ virtual SkColor GetSystemColor(ColorId color_id) const = 0;
+
+ // Returns a shared instance of the native theme.
+ // The returned object should not be deleted by the caller. This function
+ // is not thread safe and should only be called from the UI thread.
+ // Each port of NativeTheme should provide its own implementation of this
+ // function, returning the port's subclass.
+ static const NativeTheme* instance();
+
+ protected:
+ NativeTheme() {}
+ virtual ~NativeTheme() {}
+
+ static unsigned int thumb_inactive_color_;
+ static unsigned int thumb_active_color_;
+ static unsigned int track_color_;
+
+ DISALLOW_COPY_AND_ASSIGN(NativeTheme);
+};
+
+} // namespace ui
+
+#endif // UI_BASE_NATIVE_THEME_NATIVE_THEME_H_