textfield.h revision 868fa2fe829687343ffae624259930155e16dbd8
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef UI_VIEWS_CONTROLS_TEXTFIELD_TEXTFIELD_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define UI_VIEWS_CONTROLS_TEXTFIELD_TEXTFIELD_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/string16.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/time.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkColor.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/ime/text_input_type.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/keycodes/keyboard_codes.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/font.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/native_widget_types.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/text_constants.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/textfield/native_textfield_wrapper.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/view.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_LINUX)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx {
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ImageSkia;
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Range;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TextInputClient;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ui
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ImageView;
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TextfieldController;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class implements a View that wraps a native text (edit) field.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class VIEWS_EXPORT Textfield : public View {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
46868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // The textfield's class name.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char kViewClassName[];
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum StyleFlags {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STYLE_DEFAULT   = 0,
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STYLE_OBSCURED  = 1 << 0,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STYLE_LOWERCASE = 1 << 1
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the build or commandline dictates NativeTextfieldViews use.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool IsViewsTextfieldEnabled();
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Textfield();
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit Textfield(StyleFlags style);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~Textfield();
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TextfieldController accessors
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetController(TextfieldController* controller);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TextfieldController* GetController() const;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets/Sets whether or not the Textfield is read-only.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool read_only() const { return read_only_; }
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetReadOnly(bool read_only);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets/sets the STYLE_OBSCURED bit, controlling whether characters in this
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Textfield are displayed as asterisks/bullets.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsObscured() const;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetObscured(bool obscured);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Gets/sets the duration to reveal the last typed char when the obscured bit
76868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // is set. A duration of zero effectively disables the feature. Other values
77868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // cause the last typed char to be shown for the defined duration. Note this
78868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // only works with NativeTextfieldViews.
79868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const base::TimeDelta& obscured_reveal_duration() const {
80868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return obscured_reveal_duration_;
81868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
82868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void set_obscured_reveal_duration(const base::TimeDelta& duration) {
83868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    obscured_reveal_duration_ = duration;
84868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
85868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets/Sets the input type of this textfield.
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::TextInputType GetTextInputType() const;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetTextInputType(ui::TextInputType type);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets/Sets the text currently displayed in the Textfield.
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const string16& text() const { return text_; }
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the text currently displayed in the Textfield.  This doesn't
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // change the cursor position if the current cursor is within the
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // new text's range, or moves the cursor to the end if the cursor is
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // out of the new text's range.
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetText(const string16& text);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Appends the given string to the previously-existing text in the field.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AppendText(const string16& text);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Replaces the selected text with |text|.
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ReplaceSelection(const string16& text);
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the text direction.
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::i18n::TextDirection GetTextDirection() const;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the text that is currently selected.
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 GetSelectedText() const;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Select the entire text range. If |reversed| is true, the range will end at
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the logical beginning of the text; this generally shows the leading portion
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // of text that overflows its display area.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SelectAll(bool reversed);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clears the selection within the edit field and sets the caret to the end.
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ClearSelection() const;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Checks if there is any selected text.
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HasSelection() const;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Accessor for |style_|.
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StyleFlags style() const { return style_; }
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets/Sets the text color to be used when painting the Textfield.
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Call |UseDefaultTextColor| to restore the default system color.
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SkColor GetTextColor() const;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetTextColor(SkColor color);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UseDefaultTextColor();
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets/Sets the background color to be used when painting the Textfield.
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Call |UseDefaultBackgroundColor| to restore the default system color.
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SkColor GetBackgroundColor() const;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetBackgroundColor(SkColor color);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UseDefaultBackgroundColor();
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Gets/Sets whether or not the cursor is enabled.
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool GetCursorEnabled() const;
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetCursorEnabled(bool enabled);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets/Sets the font used when rendering the text within the Textfield.
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Font& font() const { return font_; }
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetFont(const gfx::Font& font);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the left and right margin (in pixels) within the text box. On Windows
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this is accomplished by packing the left and right margin into a single
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 32 bit number, so the left and right margins are effectively 16 bits.
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetHorizontalMargins(int left, int right);
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the top and bottom margins (in pixels) within the textfield.
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NOTE: in most cases height could be changed instead.
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetVerticalMargins(int top, int bottom);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Set the text vertical alignment.  Text is vertically centered by default.
15590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  gfx::VerticalAlignment vertical_alignment() const {
15690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return vertical_alignment_;
15790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
15890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void SetVerticalAlignment(gfx::VerticalAlignment alignment);
15990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the default width of the text control. See default_width_in_chars_.
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_default_width_in_chars(int default_width) {
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_width_in_chars_ = default_width;
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Removes the border from the edit box, giving it a 2D look.
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool draw_border() const { return draw_border_; }
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveBorder();
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Sets the border color (if one is in use).
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetBorderColor(SkColor color);
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Reverts the textfield to the system default border color.
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void UseDefaultBorderColor();
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SkColor border_color() const { return border_color_; }
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool use_default_border_color() const { return use_default_border_color_; }
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the text to display when empty.
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_placeholder_text(const string16& text) {
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    placeholder_text_ = text;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_LINUX)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTIMPLEMENTED();
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const string16& placeholder_text() const {
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return placeholder_text_;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkColor placeholder_text_color() const { return placeholder_text_color_; }
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_placeholder_text_color(SkColor color) {
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    placeholder_text_color_ = color;
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Adds an icon which displays inside the border on the right side of the view
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // (left in RTL).
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetIcon(const gfx::ImageSkia& icon);
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Getter for the horizontal margins that were set. Returns false if
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // horizontal margins weren't set.
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetHorizontalMargins(int* left, int* right);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Getter for the vertical margins that were set. Returns false if vertical
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // margins weren't set.
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetVerticalMargins(int* top, int* bottom);
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Updates all properties on the textfield. This is invoked internally.
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Users of Textfield never need to invoke this directly.
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateAllProperties();
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Invoked by the edit control when the value changes. This method set
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the text_ member variable to the value contained in edit control.
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is important because the edit control can be replaced if it has
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // been deleted during a window close.
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SyncText();
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns whether or not an IME is composing text.
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsIMEComposing() const;
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets the selected range. This is views-implementation only and
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // has to be called after the wrapper is created.
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(msw): Return a const reference when NativeTextfieldWin is gone.
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::Range GetSelectedRange() const;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Selects the text given by |range|. This is views-implementation only and
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // has to be called after the wrapper is created.
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SelectRange(const ui::Range& range);
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets the selection model. This is views-implementation only and
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // has to be called after the wrapper is created.
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(msw): Return a const reference when NativeTextfieldWin is gone.
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::SelectionModel GetSelectionModel() const;
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Selects the text given by |sel|. This is views-implementation only and
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // has to be called after the wrapper is created.
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SelectSelectionModel(const gfx::SelectionModel& sel);
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the current cursor position. This is views-implementation
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // only and has to be called after the wrapper is created.
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t GetCursorPosition() const;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the text color over the entire text or a logical character range.
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Empty and invalid ranges are ignored. This is views-implementation only and
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // has to be called after the wrapper is created.
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetColor(SkColor value);
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ApplyColor(SkColor value, const ui::Range& range);
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set various text styles over the entire text or a logical character range.
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The respective |style| is applied if |value| is true, or removed if false.
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Empty and invalid ranges are ignored. This is views-implementation only and
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // has to be called after the wrapper is created.
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetStyle(gfx::TextStyle style, bool value);
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ApplyStyle(gfx::TextStyle style, bool value, const ui::Range& range);
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clears Edit history.
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ClearEditHistory();
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the accessible name of the text field.
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetAccessibleName(const string16& name);
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Performs the action associated with the specified command id.
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ExecuteCommand(int command_id);
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Provided only for testing:
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::NativeView GetTestingHandle() const {
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return native_wrapper_ ? native_wrapper_->GetTestingHandle() : NULL;
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NativeTextfieldWrapper* GetNativeWrapperForTesting() const {
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return native_wrapper_;
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Returns whether there is a drag operation originating from the textfield.
270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool HasTextBeingDragged();
271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from View:
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Layout() OVERRIDE;
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual int GetBaseline() const OVERRIDE;
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual gfx::Size GetPreferredSize() OVERRIDE;
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AboutToRequestFocusFromTabTraversal(bool reverse) OVERRIDE;
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool SkipDefaultKeyEventProcessing(const ui::KeyEvent& e) OVERRIDE;
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnEnabledChanged() OVERRIDE;
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnPaintFocusBorder(gfx::Canvas* canvas) OVERRIDE;
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool OnKeyPressed(const ui::KeyEvent& e) OVERRIDE;
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool OnKeyReleased(const ui::KeyEvent& e) OVERRIDE;
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool OnMouseDragged(const ui::MouseEvent& e) OVERRIDE;
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnFocus() OVERRIDE;
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnBlur() OVERRIDE;
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE;
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ui::TextInputClient* GetTextInputClient() OVERRIDE;
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
289a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  virtual void ViewHierarchyChanged(
290a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      const ViewHierarchyChangedDetails& details) OVERRIDE;
291b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual const char* GetClassName() const OVERRIDE;
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The object that actually implements the native text field.
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NativeTextfieldWrapper* native_wrapper_;
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is the current listener for events from this Textfield.
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TextfieldController* controller_;
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The mask of style options for this Textfield.
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StyleFlags style_;
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The font used to render the text in the Textfield.
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Font font_;
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The text displayed in the Textfield.
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 text_;
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True if this Textfield cannot accept input and is read-only.
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool read_only_;
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The default number of average characters for the width of this text field.
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This will be reported as the "desired size". Defaults to 0.
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int default_width_in_chars_;
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Whether the border is drawn.
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool draw_border_;
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Text color.  Only used if |use_default_text_color_| is false.
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkColor text_color_;
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should we use the system text color instead of |text_color_|?
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool use_default_text_color_;
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Background color.  Only used if |use_default_background_color_| is false.
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkColor background_color_;
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should we use the system background color instead of |background_color_|?
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool use_default_background_color_;
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Border color.  Only used if |use_default_border_color_| is false.
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SkColor border_color_;
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Should we use the system border color instead of |border_color_|?
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool use_default_border_color_;
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(beng): remove this once NativeTextfieldWin subclasses
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //             NativeControlWin.
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool initialized_;
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Holds inner textfield margins.
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Insets margins_;
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Holds whether margins were set.
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool horizontal_margins_were_set_;
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool vertical_margins_were_set_;
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // The vertical alignment of text in the Textfield.
34990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  gfx::VerticalAlignment vertical_alignment_;
35090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Text to display when empty.
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 placeholder_text_;
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Placeholder text color.
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkColor placeholder_text_color_;
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // When non-NULL, an icon to display inside the border of the textfield.
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::ImageView* icon_view_;
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The accessible name of the text field.
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 accessible_name_;
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The input type of this text field.
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::TextInputType text_input_type_;
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
366868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // The duration to reveal the last typed char for obscured textfields.
367868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::TimeDelta obscured_reveal_duration_;
368868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(Textfield);
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace views
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // UI_VIEWS_CONTROLS_TEXTFIELD_TEXTFIELD_H_
375