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_VIEWS_CONTROLS_BUTTON_LABEL_BUTTON_H_ 6 #define UI_VIEWS_CONTROLS_BUTTON_LABEL_BUTTON_H_ 7 8 #include "base/compiler_specific.h" 9 #include "base/memory/scoped_ptr.h" 10 #include "third_party/skia/include/core/SkColor.h" 11 #include "ui/gfx/image/image_skia.h" 12 #include "ui/views/controls/button/custom_button.h" 13 #include "ui/views/controls/image_view.h" 14 #include "ui/views/controls/label.h" 15 #include "ui/views/native_theme_delegate.h" 16 17 namespace views { 18 19 class LabelButtonBorder; 20 class Painter; 21 22 // LabelButton is an alternative to TextButton, it's not focusable by default. 23 class VIEWS_EXPORT LabelButton : public CustomButton, 24 public NativeThemeDelegate { 25 public: 26 // The length of the hover fade animation. 27 static const int kHoverAnimationDurationMs; 28 29 static const char kViewClassName[]; 30 31 LabelButton(ButtonListener* listener, const base::string16& text); 32 virtual ~LabelButton(); 33 34 // Get or set the image shown for the specified button state. 35 // GetImage returns the image for STATE_NORMAL if the state's image is empty. 36 virtual const gfx::ImageSkia& GetImage(ButtonState for_state); 37 void SetImage(ButtonState for_state, const gfx::ImageSkia& image); 38 39 // Get or set the text shown on the button. 40 const base::string16& GetText() const; 41 virtual void SetText(const base::string16& text); 42 43 // Set the text color shown for the specified button state. 44 void SetTextColor(ButtonState for_state, SkColor color); 45 46 // Set drop shadows underneath the text. 47 void SetTextShadows(const gfx::ShadowValues& shadows); 48 49 // Sets whether subpixel rendering is used on the label. 50 void SetTextSubpixelRenderingEnabled(bool enabled); 51 52 // Get or set the text's multi-line property to break on '\n', etc. 53 bool GetTextMultiLine() const; 54 void SetTextMultiLine(bool text_multi_line); 55 56 // Get or set the font list used by this button. 57 const gfx::FontList& GetFontList() const; 58 void SetFontList(const gfx::FontList& font_list); 59 60 // Set the elide behavior of this button. 61 void SetElideBehavior(gfx::ElideBehavior elide_behavior); 62 63 // Get or set the horizontal alignment used for the button; reversed in RTL. 64 // The optional image will lead the text, unless the button is right-aligned. 65 gfx::HorizontalAlignment GetHorizontalAlignment() const; 66 void SetHorizontalAlignment(gfx::HorizontalAlignment alignment); 67 68 // Set the directionality mode used for the button text. 69 void SetDirectionalityMode(gfx::DirectionalityMode mode); 70 71 // Call set_min_size(gfx::Size()) to clear the monotonically increasing size. 72 void set_min_size(const gfx::Size& min_size) { min_size_ = min_size; } 73 void set_max_size(const gfx::Size& max_size) { max_size_ = max_size; } 74 75 // Get or set the option to handle the return key; false by default. 76 bool is_default() const { return is_default_; } 77 void SetIsDefault(bool is_default); 78 79 // Get or set the button's overall style; the default is |STYLE_TEXTBUTTON|. 80 ButtonStyle style() const { return style_; } 81 void SetStyle(ButtonStyle style); 82 83 void SetFocusPainter(scoped_ptr<Painter> focus_painter); 84 Painter* focus_painter() { return focus_painter_.get(); } 85 86 // View: 87 virtual void SetBorder(scoped_ptr<Border> border) OVERRIDE; 88 virtual gfx::Size GetPreferredSize() const OVERRIDE; 89 virtual void Layout() OVERRIDE; 90 virtual const char* GetClassName() const OVERRIDE; 91 92 protected: 93 ImageView* image() const { return image_; } 94 Label* label() const { return label_; } 95 96 // Returns the available area for the label and image. Subclasses can change 97 // these bounds if they need room to do manual painting. 98 virtual gfx::Rect GetChildAreaBounds(); 99 100 // View: 101 virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; 102 virtual void OnFocus() OVERRIDE; 103 virtual void OnBlur() OVERRIDE; 104 virtual void OnNativeThemeChanged(const ui::NativeTheme* theme) OVERRIDE; 105 106 // Fill |params| with information about the button. 107 virtual void GetExtraParams(ui::NativeTheme::ExtraParams* params) const; 108 109 // Resets colors from the NativeTheme, explicitly set colors are unchanged. 110 virtual void ResetColorsFromNativeTheme(); 111 112 // Creates the default border for this button. This can be overridden by 113 // subclasses or by LinuxUI. 114 virtual scoped_ptr<LabelButtonBorder> CreateDefaultBorder() const; 115 116 // Updates the image view to contain the appropriate button state image. 117 void UpdateImage(); 118 119 // Updates the border as per the NativeTheme, unless a different border was 120 // set with SetBorder. 121 void UpdateThemedBorder(); 122 123 // NativeThemeDelegate: 124 virtual gfx::Rect GetThemePaintRect() const OVERRIDE; 125 126 private: 127 FRIEND_TEST_ALL_PREFIXES(LabelButtonTest, Init); 128 FRIEND_TEST_ALL_PREFIXES(LabelButtonTest, Label); 129 FRIEND_TEST_ALL_PREFIXES(LabelButtonTest, Image); 130 FRIEND_TEST_ALL_PREFIXES(LabelButtonTest, LabelAndImage); 131 FRIEND_TEST_ALL_PREFIXES(LabelButtonTest, FontList); 132 133 // CustomButton: 134 virtual void StateChanged() OVERRIDE; 135 136 // View: 137 virtual void ChildPreferredSizeChanged(View* child) OVERRIDE; 138 139 // NativeThemeDelegate: 140 virtual ui::NativeTheme::Part GetThemePart() const OVERRIDE; 141 virtual ui::NativeTheme::State GetThemeState( 142 ui::NativeTheme::ExtraParams* params) const OVERRIDE; 143 virtual const gfx::Animation* GetThemeAnimation() const OVERRIDE; 144 virtual ui::NativeTheme::State GetBackgroundThemeState( 145 ui::NativeTheme::ExtraParams* params) const OVERRIDE; 146 virtual ui::NativeTheme::State GetForegroundThemeState( 147 ui::NativeTheme::ExtraParams* params) const OVERRIDE; 148 149 // The image and label shown in the button. 150 ImageView* image_; 151 Label* label_; 152 153 // The cached font lists in the normal and bold style. 154 gfx::FontList cached_normal_font_list_; 155 gfx::FontList cached_bold_font_list_; 156 157 // The images and colors for each button state. 158 gfx::ImageSkia button_state_images_[STATE_COUNT]; 159 SkColor button_state_colors_[STATE_COUNT]; 160 161 // Used to track whether SetTextColor() has been invoked. 162 bool explicitly_set_colors_[STATE_COUNT]; 163 164 // |min_size_| increases monotonically with the preferred size. 165 mutable gfx::Size min_size_; 166 // |max_size_| may be set to clamp the preferred size. 167 gfx::Size max_size_; 168 169 // Flag indicating default handling of the return key via an accelerator. 170 // Whether or not the button appears or behaves as the default button in its 171 // current context; 172 bool is_default_; 173 174 // The button's overall style. 175 ButtonStyle style_; 176 177 // True if current border was set by UpdateThemedBorder. Defaults to true. 178 bool border_is_themed_border_; 179 180 scoped_ptr<Painter> focus_painter_; 181 182 DISALLOW_COPY_AND_ASSIGN(LabelButton); 183 }; 184 185 } // namespace views 186 187 #endif // UI_VIEWS_CONTROLS_BUTTON_LABEL_BUTTON_H_ 188