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_LABEL_H_ 6 #define UI_VIEWS_CONTROLS_LABEL_H_ 7 8 #include <string> 9 #include <vector> 10 11 #include "base/compiler_specific.h" 12 #include "base/gtest_prod_util.h" 13 #include "base/strings/string16.h" 14 #include "third_party/skia/include/core/SkColor.h" 15 #include "ui/gfx/font_list.h" 16 #include "ui/gfx/shadow_value.h" 17 #include "ui/gfx/text_constants.h" 18 #include "ui/views/view.h" 19 20 namespace views { 21 22 // A view subclass that can display a string. 23 class VIEWS_EXPORT Label : public View { 24 public: 25 // Internal class name. 26 static const char kViewClassName[]; 27 28 // The padding for the focus border when rendering focused text. 29 static const int kFocusBorderPadding; 30 31 Label(); 32 explicit Label(const base::string16& text); 33 Label(const base::string16& text, const gfx::FontList& font_list); 34 virtual ~Label(); 35 36 // Gets or sets the fonts used by this label. 37 const gfx::FontList& font_list() const { return font_list_; } 38 virtual void SetFontList(const gfx::FontList& font_list); 39 40 // Get or set the label text. 41 const base::string16& text() const { return text_; } 42 virtual void SetText(const base::string16& text); 43 44 // Enables or disables auto-color-readability (enabled by default). If this 45 // is enabled, then calls to set any foreground or background color will 46 // trigger an automatic mapper that uses color_utils::GetReadableColor() to 47 // ensure that the foreground colors are readable over the background color. 48 void SetAutoColorReadabilityEnabled(bool enabled); 49 50 // Sets the color. This will automatically force the color to be readable 51 // over the current background color, if auto color readability is enabled. 52 virtual void SetEnabledColor(SkColor color); 53 void SetDisabledColor(SkColor color); 54 55 SkColor enabled_color() const { return actual_enabled_color_; } 56 57 // Sets the background color. This won't be explicitly drawn, but the label 58 // will force the text color to be readable over it. 59 void SetBackgroundColor(SkColor color); 60 SkColor background_color() const { return background_color_; } 61 62 // Set drop shadows underneath the text. 63 void SetShadows(const gfx::ShadowValues& shadows); 64 const gfx::ShadowValues& shadows() const { return shadows_; } 65 66 // Sets whether subpixel rendering is used; the default is true, but this 67 // feature also requires an opaque background color. 68 void SetSubpixelRenderingEnabled(bool subpixel_rendering_enabled); 69 70 // Sets the horizontal alignment; the argument value is mirrored in RTL UI. 71 void SetHorizontalAlignment(gfx::HorizontalAlignment alignment); 72 gfx::HorizontalAlignment GetHorizontalAlignment() const; 73 74 // Get or set the distance in pixels between baselines of multi-line text. 75 // Default is 0, indicating the distance between lines should be the standard 76 // one for the label's text, font list, and platform. 77 int line_height() const { return line_height_; } 78 void SetLineHeight(int height); 79 80 // Get or set if the label text can wrap on multiple lines; default is false. 81 bool multi_line() const { return multi_line_; } 82 void SetMultiLine(bool multi_line); 83 84 // Get or set if the label text should be obscured before rendering (e.g. 85 // should "Password!" display as "*********"); default is false. 86 bool obscured() const { return obscured_; } 87 void SetObscured(bool obscured); 88 89 // Sets whether multi-line text can wrap mid-word; the default is false. 90 void SetAllowCharacterBreak(bool allow_character_break); 91 92 // Sets the eliding or fading behavior, applied as necessary. The default is 93 // to elide at the end. Eliding is not well supported for multi-line labels. 94 void SetElideBehavior(gfx::ElideBehavior elide_behavior); 95 96 // Sets the tooltip text. Default behavior for a label (single-line) is to 97 // show the full text if it is wider than its bounds. Calling this overrides 98 // the default behavior and lets you set a custom tooltip. To revert to 99 // default behavior, call this with an empty string. 100 void SetTooltipText(const base::string16& tooltip_text); 101 102 // Resizes the label so its width is set to the width of the longest line and 103 // its height deduced accordingly. 104 // This is only intended for multi-line labels and is useful when the label's 105 // text contains several lines separated with \n. 106 // |max_width| is the maximum width that will be used (longer lines will be 107 // wrapped). If 0, no maximum width is enforced. 108 void SizeToFit(int max_width); 109 110 // Sets whether the preferred size is empty when the label is not visible. 111 void set_collapse_when_hidden(bool value) { collapse_when_hidden_ = value; } 112 113 // Get the text as displayed to the user, respecting the obscured flag. 114 const base::string16& GetLayoutTextForTesting() const; 115 116 // View: 117 virtual gfx::Insets GetInsets() const OVERRIDE; 118 virtual int GetBaseline() const OVERRIDE; 119 virtual gfx::Size GetPreferredSize() const OVERRIDE; 120 virtual gfx::Size GetMinimumSize() const OVERRIDE; 121 virtual int GetHeightForWidth(int w) const OVERRIDE; 122 virtual const char* GetClassName() const OVERRIDE; 123 virtual View* GetTooltipHandlerForPoint(const gfx::Point& point) OVERRIDE; 124 virtual bool CanProcessEventsWithinSubtree() const OVERRIDE; 125 virtual void GetAccessibleState(ui::AXViewState* state) OVERRIDE; 126 virtual bool GetTooltipText(const gfx::Point& p, 127 base::string16* tooltip) const OVERRIDE; 128 129 protected: 130 // Called by Paint to paint the text. 131 void PaintText(gfx::Canvas* canvas, 132 const base::string16& text, 133 const gfx::Rect& text_bounds, 134 int flags); 135 136 virtual gfx::Size GetTextSize() const; 137 138 SkColor disabled_color() const { return actual_disabled_color_; } 139 140 // View: 141 virtual void OnBoundsChanged(const gfx::Rect& previous_bounds) OVERRIDE; 142 virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; 143 virtual void OnNativeThemeChanged(const ui::NativeTheme* theme) OVERRIDE; 144 145 private: 146 // These tests call CalculateDrawStringParams in order to verify the 147 // calculations done for drawing text. 148 FRIEND_TEST_ALL_PREFIXES(LabelTest, DrawSingleLineString); 149 FRIEND_TEST_ALL_PREFIXES(LabelTest, DrawMultiLineString); 150 FRIEND_TEST_ALL_PREFIXES(LabelTest, DrawSingleLineStringInRTL); 151 FRIEND_TEST_ALL_PREFIXES(LabelTest, DrawMultiLineStringInRTL); 152 FRIEND_TEST_ALL_PREFIXES(LabelTest, DirectionalityFromText); 153 FRIEND_TEST_ALL_PREFIXES(LabelTest, DisableSubpixelRendering); 154 155 // Sets both |text_| and |layout_text_| to appropriate values, taking 156 // the label's 'obscured' status into account. 157 void SetTextInternal(const base::string16& text); 158 159 void Init(const base::string16& text, const gfx::FontList& font_list); 160 161 void RecalculateColors(); 162 163 // Returns where the text is drawn, in the receivers coordinate system. 164 gfx::Rect GetTextBounds() const; 165 166 int ComputeDrawStringFlags() const; 167 168 gfx::Rect GetAvailableRect() const; 169 170 // Returns parameters to be used for the DrawString call. 171 void CalculateDrawStringParams(base::string16* paint_text, 172 gfx::Rect* text_bounds, 173 int* flags) const; 174 175 // Updates any colors that have not been explicitly set from the theme. 176 void UpdateColorsFromTheme(const ui::NativeTheme* theme); 177 178 // Resets |cached_heights_| and |cached_heights_cursor_| and mark 179 // |text_size_valid_| as false. 180 void ResetCachedSize(); 181 182 bool ShouldShowDefaultTooltip() const; 183 184 base::string16 text_; 185 base::string16 layout_text_; 186 gfx::FontList font_list_; 187 SkColor requested_enabled_color_; 188 SkColor actual_enabled_color_; 189 SkColor requested_disabled_color_; 190 SkColor actual_disabled_color_; 191 SkColor background_color_; 192 193 // Set to true once the corresponding setter is invoked. 194 bool enabled_color_set_; 195 bool disabled_color_set_; 196 bool background_color_set_; 197 198 bool subpixel_rendering_enabled_; 199 bool auto_color_readability_; 200 mutable gfx::Size text_size_; 201 mutable bool text_size_valid_; 202 int line_height_; 203 bool multi_line_; 204 bool obscured_; 205 bool allow_character_break_; 206 gfx::ElideBehavior elide_behavior_; 207 gfx::HorizontalAlignment horizontal_alignment_; 208 base::string16 tooltip_text_; 209 // Whether to collapse the label when it's not visible. 210 bool collapse_when_hidden_; 211 gfx::ShadowValues shadows_; 212 213 // The cached heights to avoid recalculation in GetHeightForWidth(). 214 mutable std::vector<gfx::Size> cached_heights_; 215 mutable int cached_heights_cursor_; 216 217 DISALLOW_COPY_AND_ASSIGN(Label); 218 }; 219 220 } // namespace views 221 222 #endif // UI_VIEWS_CONTROLS_LABEL_H_ 223