Home | History | Annotate | Download | only in controls
      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