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