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