Home | History | Annotate | Download | only in autofill
      1 // Copyright 2013 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 CHROME_BROWSER_UI_VIEWS_AUTOFILL_DECORATED_TEXTFIELD_H_
      6 #define CHROME_BROWSER_UI_VIEWS_AUTOFILL_DECORATED_TEXTFIELD_H_
      7 
      8 #include "base/memory/scoped_ptr.h"
      9 #include "base/strings/string16.h"
     10 #include "ui/gfx/image/image.h"
     11 #include "ui/views/controls/textfield/textfield.h"
     12 #include "ui/views/view_targeter_delegate.h"
     13 
     14 namespace views {
     15 class ImageView;
     16 class TextfieldController;
     17 }
     18 
     19 namespace autofill {
     20 
     21 // A class which holds a textfield and draws extra stuff on top, like
     22 // invalid content indications.
     23 class DecoratedTextfield : public views::Textfield,
     24                            public views::ViewTargeterDelegate {
     25  public:
     26   static const char kViewClassName[];
     27 
     28   DecoratedTextfield(const base::string16& default_value,
     29                      const base::string16& placeholder,
     30                      views::TextfieldController* controller);
     31   virtual ~DecoratedTextfield();
     32 
     33   // Sets whether to indicate the textfield has invalid content.
     34   void SetInvalid(bool invalid);
     35   bool invalid() const { return invalid_; }
     36 
     37   // See docs for |editable_|.
     38   void SetEditable(bool editable);
     39   bool editable() const { return editable_; }
     40 
     41   // Sets the icon to display inside the textfield at the end of the text.
     42   void SetIcon(const gfx::Image& icon);
     43 
     44   // Sets a tooltip for this field. This will override the icon set with
     45   // SetIcon(), if any, and will be overridden by future calls to SetIcon().
     46   void SetTooltipIcon(const base::string16& text);
     47 
     48   // views::Textfield implementation.
     49   virtual base::string16 GetPlaceholderText() const OVERRIDE;
     50 
     51   // views::View implementation.
     52   virtual const char* GetClassName() const OVERRIDE;
     53   virtual gfx::Size GetPreferredSize() const OVERRIDE;
     54   virtual void Layout() OVERRIDE;
     55 
     56  private:
     57   FRIEND_TEST_ALL_PREFIXES(DecoratedTextfieldTest, HeightMatchesButton);
     58 
     59   // views::ViewTargeterDelegate:
     60   virtual views::View* TargetForRect(views::View* root,
     61                                      const gfx::Rect& rect) OVERRIDE;
     62 
     63   // Updates the background after its color may have changed.
     64   void UpdateBackground();
     65 
     66   // Updates the border after its color or insets may have changed.
     67   void UpdateBorder();
     68 
     69   // Called to update the layout after SetIcon or SetTooltipIcon was called.
     70   void IconChanged();
     71 
     72   // The view that holds the icon at the end of the textfield.
     73   scoped_ptr<views::ImageView> icon_view_;
     74 
     75   // Whether the text contents are "invalid" (i.e. should special markers be
     76   // shown to indicate invalidness).
     77   bool invalid_;
     78 
     79   // Whether the user can edit the field. When not editable, many of the
     80   // pieces of the textfield disappear (border, background, icon, placeholder
     81   // text) and it can't receive focus.
     82   bool editable_;
     83 
     84   DISALLOW_COPY_AND_ASSIGN(DecoratedTextfield);
     85 };
     86 
     87 }  // namespace autofill
     88 
     89 #endif  // CHROME_BROWSER_UI_VIEWS_AUTOFILL_DECORATED_TEXTFIELD_H_
     90