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_TEXTFIELD_TEXTFIELD_H_ 6 #define UI_VIEWS_CONTROLS_TEXTFIELD_TEXTFIELD_H_ 7 8 #include <string> 9 10 #include "base/basictypes.h" 11 #include "base/compiler_specific.h" 12 #include "base/memory/weak_ptr.h" 13 #include "base/strings/string16.h" 14 #include "base/time/time.h" 15 #include "build/build_config.h" 16 #include "third_party/skia/include/core/SkColor.h" 17 #include "ui/base/ime/text_input_type.h" 18 #include "ui/base/keycodes/keyboard_codes.h" 19 #include "ui/gfx/font_list.h" 20 #include "ui/gfx/native_widget_types.h" 21 #include "ui/gfx/text_constants.h" 22 #include "ui/views/controls/textfield/native_textfield_wrapper.h" 23 #include "ui/views/view.h" 24 25 #if !defined(OS_LINUX) 26 #include "base/logging.h" 27 #endif 28 29 namespace gfx { 30 class ImageSkia; 31 } 32 33 namespace ui { 34 class Range; 35 class TextInputClient; 36 } // namespace ui 37 38 namespace views { 39 40 class ImageView; 41 42 class TextfieldController; 43 44 // This class implements a View that wraps a native text (edit) field. 45 class VIEWS_EXPORT Textfield : public View { 46 public: 47 // The textfield's class name. 48 static const char kViewClassName[]; 49 50 enum StyleFlags { 51 STYLE_DEFAULT = 0, 52 STYLE_OBSCURED = 1 << 0, 53 STYLE_LOWERCASE = 1 << 1 54 }; 55 56 // Returns true if the build or commandline dictates NativeTextfieldViews use. 57 static bool IsViewsTextfieldEnabled(); 58 59 Textfield(); 60 explicit Textfield(StyleFlags style); 61 virtual ~Textfield(); 62 63 // TextfieldController accessors 64 void SetController(TextfieldController* controller); 65 TextfieldController* GetController() const; 66 67 // Gets/Sets whether or not the Textfield is read-only. 68 bool read_only() const { return read_only_; } 69 void SetReadOnly(bool read_only); 70 71 // Gets/sets the STYLE_OBSCURED bit, controlling whether characters in this 72 // Textfield are displayed as asterisks/bullets. 73 bool IsObscured() const; 74 void SetObscured(bool obscured); 75 76 // Gets/sets the duration to reveal the last typed char when the obscured bit 77 // is set. A duration of zero effectively disables the feature. Other values 78 // cause the last typed char to be shown for the defined duration. Note this 79 // only works with NativeTextfieldViews. 80 const base::TimeDelta& obscured_reveal_duration() const { 81 return obscured_reveal_duration_; 82 } 83 void set_obscured_reveal_duration(const base::TimeDelta& duration) { 84 obscured_reveal_duration_ = duration; 85 } 86 87 // Gets/Sets the input type of this textfield. 88 ui::TextInputType GetTextInputType() const; 89 void SetTextInputType(ui::TextInputType type); 90 91 // Gets/Sets the text currently displayed in the Textfield. 92 const string16& text() const { return text_; } 93 94 // Sets the text currently displayed in the Textfield. This doesn't 95 // change the cursor position if the current cursor is within the 96 // new text's range, or moves the cursor to the end if the cursor is 97 // out of the new text's range. 98 void SetText(const string16& text); 99 100 // Appends the given string to the previously-existing text in the field. 101 void AppendText(const string16& text); 102 103 // Inserts |text| at the current cursor position, replacing any selected text. 104 void InsertOrReplaceText(const string16& text); 105 106 // Returns the text direction. 107 base::i18n::TextDirection GetTextDirection() const; 108 109 // Returns the text that is currently selected. 110 string16 GetSelectedText() const; 111 112 // Select the entire text range. If |reversed| is true, the range will end at 113 // the logical beginning of the text; this generally shows the leading portion 114 // of text that overflows its display area. 115 void SelectAll(bool reversed); 116 117 // Clears the selection within the edit field and sets the caret to the end. 118 void ClearSelection() const; 119 120 // Checks if there is any selected text. 121 bool HasSelection() const; 122 123 // Accessor for |style_|. 124 StyleFlags style() const { return style_; } 125 126 // Gets/Sets the text color to be used when painting the Textfield. 127 // Call |UseDefaultTextColor| to restore the default system color. 128 SkColor GetTextColor() const; 129 void SetTextColor(SkColor color); 130 void UseDefaultTextColor(); 131 132 // Gets/Sets the background color to be used when painting the Textfield. 133 // Call |UseDefaultBackgroundColor| to restore the default system color. 134 SkColor GetBackgroundColor() const; 135 void SetBackgroundColor(SkColor color); 136 void UseDefaultBackgroundColor(); 137 138 // Gets/Sets whether or not the cursor is enabled. 139 bool GetCursorEnabled() const; 140 void SetCursorEnabled(bool enabled); 141 142 // Gets/Sets the fonts used when rendering the text within the Textfield. 143 const gfx::FontList& font_list() const { return font_list_; } 144 void SetFontList(const gfx::FontList& font_list); 145 const gfx::Font& GetPrimaryFont() const; 146 void SetFont(const gfx::Font& font); 147 148 // Sets the left and right margin (in pixels) within the text box. On Windows 149 // this is accomplished by packing the left and right margin into a single 150 // 32 bit number, so the left and right margins are effectively 16 bits. 151 void SetHorizontalMargins(int left, int right); 152 153 // Sets the top and bottom margins (in pixels) within the textfield. 154 // NOTE: in most cases height could be changed instead. 155 void SetVerticalMargins(int top, int bottom); 156 157 // Set the text vertical alignment. Text is vertically centered by default. 158 gfx::VerticalAlignment vertical_alignment() const { 159 return vertical_alignment_; 160 } 161 void SetVerticalAlignment(gfx::VerticalAlignment alignment); 162 163 // Sets the default width of the text control. See default_width_in_chars_. 164 void set_default_width_in_chars(int default_width) { 165 default_width_in_chars_ = default_width; 166 } 167 168 // Removes the border from the edit box, giving it a 2D look. 169 bool draw_border() const { return draw_border_; } 170 void RemoveBorder(); 171 172 // Sets the text to display when empty. 173 void set_placeholder_text(const string16& text) { 174 placeholder_text_ = text; 175 #if !defined(OS_LINUX) 176 NOTIMPLEMENTED(); 177 #endif 178 } 179 const string16& placeholder_text() const { 180 return placeholder_text_; 181 } 182 183 SkColor placeholder_text_color() const { return placeholder_text_color_; } 184 void set_placeholder_text_color(SkColor color) { 185 placeholder_text_color_ = color; 186 } 187 188 // Getter for the horizontal margins that were set. Returns false if 189 // horizontal margins weren't set. 190 bool GetHorizontalMargins(int* left, int* right); 191 192 // Getter for the vertical margins that were set. Returns false if vertical 193 // margins weren't set. 194 bool GetVerticalMargins(int* top, int* bottom); 195 196 // Updates all properties on the textfield. This is invoked internally. 197 // Users of Textfield never need to invoke this directly. 198 void UpdateAllProperties(); 199 200 // Invoked by the edit control when the value changes. This method set 201 // the text_ member variable to the value contained in edit control. 202 // This is important because the edit control can be replaced if it has 203 // been deleted during a window close. 204 void SyncText(); 205 206 // Returns whether or not an IME is composing text. 207 bool IsIMEComposing() const; 208 209 // Gets the selected range. This is views-implementation only and 210 // has to be called after the wrapper is created. 211 // TODO(msw): Return a const reference when NativeTextfieldWin is gone. 212 ui::Range GetSelectedRange() const; 213 214 // Selects the text given by |range|. This is views-implementation only and 215 // has to be called after the wrapper is created. 216 void SelectRange(const ui::Range& range); 217 218 // Gets the selection model. This is views-implementation only and 219 // has to be called after the wrapper is created. 220 // TODO(msw): Return a const reference when NativeTextfieldWin is gone. 221 gfx::SelectionModel GetSelectionModel() const; 222 223 // Selects the text given by |sel|. This is views-implementation only and 224 // has to be called after the wrapper is created. 225 void SelectSelectionModel(const gfx::SelectionModel& sel); 226 227 // Returns the current cursor position. This is views-implementation 228 // only and has to be called after the wrapper is created. 229 size_t GetCursorPosition() const; 230 231 // Set the text color over the entire text or a logical character range. 232 // Empty and invalid ranges are ignored. This is views-implementation only and 233 // has to be called after the wrapper is created. 234 void SetColor(SkColor value); 235 void ApplyColor(SkColor value, const ui::Range& range); 236 237 // Set various text styles over the entire text or a logical character range. 238 // The respective |style| is applied if |value| is true, or removed if false. 239 // Empty and invalid ranges are ignored. This is views-implementation only and 240 // has to be called after the wrapper is created. 241 void SetStyle(gfx::TextStyle style, bool value); 242 void ApplyStyle(gfx::TextStyle style, bool value, const ui::Range& range); 243 244 // Clears Edit history. 245 void ClearEditHistory(); 246 247 // Set the accessible name of the text field. 248 void SetAccessibleName(const string16& name); 249 250 // Performs the action associated with the specified command id. 251 void ExecuteCommand(int command_id); 252 253 // Provided only for testing: 254 gfx::NativeView GetTestingHandle() const { 255 return native_wrapper_ ? native_wrapper_->GetTestingHandle() : NULL; 256 } 257 NativeTextfieldWrapper* GetNativeWrapperForTesting() const { 258 return native_wrapper_; 259 } 260 261 // Returns whether there is a drag operation originating from the textfield. 262 bool HasTextBeingDragged(); 263 264 // Overridden from View: 265 virtual void Layout() OVERRIDE; 266 virtual int GetBaseline() const OVERRIDE; 267 virtual gfx::Size GetPreferredSize() OVERRIDE; 268 virtual void AboutToRequestFocusFromTabTraversal(bool reverse) OVERRIDE; 269 virtual bool SkipDefaultKeyEventProcessing(const ui::KeyEvent& e) OVERRIDE; 270 virtual void OnEnabledChanged() OVERRIDE; 271 virtual void OnPaintFocusBorder(gfx::Canvas* canvas) OVERRIDE; 272 virtual bool OnKeyPressed(const ui::KeyEvent& e) OVERRIDE; 273 virtual bool OnKeyReleased(const ui::KeyEvent& e) OVERRIDE; 274 virtual bool OnMouseDragged(const ui::MouseEvent& e) OVERRIDE; 275 virtual void OnFocus() OVERRIDE; 276 virtual void OnBlur() OVERRIDE; 277 virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE; 278 virtual ui::TextInputClient* GetTextInputClient() OVERRIDE; 279 280 protected: 281 virtual void ViewHierarchyChanged( 282 const ViewHierarchyChangedDetails& details) OVERRIDE; 283 virtual const char* GetClassName() const OVERRIDE; 284 285 // The object that actually implements the native text field. 286 NativeTextfieldWrapper* native_wrapper_; 287 288 private: 289 // Returns the insets to the rectangle where text is actually painted. 290 gfx::Insets GetTextInsets() const; 291 292 // Handles a request to change the value of this text field from software 293 // using an accessibility API (typically automation software, screen readers 294 // don't normally use this). Sets the value and clears the selection. 295 void AccessibilitySetValue(const string16& new_value); 296 297 // This is the current listener for events from this Textfield. 298 TextfieldController* controller_; 299 300 // The mask of style options for this Textfield. 301 StyleFlags style_; 302 303 // The fonts used to render the text in the Textfield. 304 gfx::FontList font_list_; 305 306 // The text displayed in the Textfield. 307 string16 text_; 308 309 // True if this Textfield cannot accept input and is read-only. 310 bool read_only_; 311 312 // The default number of average characters for the width of this text field. 313 // This will be reported as the "desired size". Defaults to 0. 314 int default_width_in_chars_; 315 316 // Whether the border is drawn. 317 bool draw_border_; 318 319 // Text color. Only used if |use_default_text_color_| is false. 320 SkColor text_color_; 321 322 // Should we use the system text color instead of |text_color_|? 323 bool use_default_text_color_; 324 325 // Background color. Only used if |use_default_background_color_| is false. 326 SkColor background_color_; 327 328 // Should we use the system background color instead of |background_color_|? 329 bool use_default_background_color_; 330 331 // Holds inner textfield margins. 332 gfx::Insets margins_; 333 334 // Holds whether margins were set. 335 bool horizontal_margins_were_set_; 336 bool vertical_margins_were_set_; 337 338 // The vertical alignment of text in the Textfield. 339 gfx::VerticalAlignment vertical_alignment_; 340 341 // Text to display when empty. 342 string16 placeholder_text_; 343 344 // Placeholder text color. 345 SkColor placeholder_text_color_; 346 347 // The accessible name of the text field. 348 string16 accessible_name_; 349 350 // The input type of this text field. 351 ui::TextInputType text_input_type_; 352 353 // The duration to reveal the last typed char for obscured textfields. 354 base::TimeDelta obscured_reveal_duration_; 355 356 // Used to bind callback functions to this object. 357 base::WeakPtrFactory<Textfield> weak_ptr_factory_; 358 359 DISALLOW_COPY_AND_ASSIGN(Textfield); 360 }; 361 362 } // namespace views 363 364 #endif // UI_VIEWS_CONTROLS_TEXTFIELD_TEXTFIELD_H_ 365