diff options
Diffstat (limited to 'ui/base/native_theme/native_theme.h')
-rw-r--r-- | ui/base/native_theme/native_theme.h | 273 |
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_ |