OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 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 UI_VIEWS_CONTROLS_TEXTFIELD_NATIVE_TEXTFIELD_VIEWS_H_ |
| 6 #define UI_VIEWS_CONTROLS_TEXTFIELD_NATIVE_TEXTFIELD_VIEWS_H_ |
| 7 |
| 8 #include "base/memory/weak_ptr.h" |
| 9 #include "base/strings/string16.h" |
| 10 #include "base/timer/timer.h" |
| 11 #include "ui/base/ime/text_input_client.h" |
| 12 #include "ui/base/models/simple_menu_model.h" |
| 13 #include "ui/base/touch/touch_editing_controller.h" |
| 14 #include "ui/events/event_constants.h" |
| 15 #include "ui/gfx/selection_model.h" |
| 16 #include "ui/views/border.h" |
| 17 #include "ui/views/context_menu_controller.h" |
| 18 #include "ui/views/controls/textfield/textfield_views_model.h" |
| 19 #include "ui/views/drag_controller.h" |
| 20 #include "ui/views/view.h" |
| 21 |
| 22 namespace base { |
| 23 class Time; |
| 24 } |
| 25 |
| 26 namespace gfx { |
| 27 class Canvas; |
| 28 } |
| 29 |
| 30 namespace views { |
| 31 |
| 32 class FocusableBorder; |
| 33 class MenuModelAdapter; |
| 34 class MenuRunner; |
| 35 class Textfield; |
| 36 |
| 37 // A views/skia textfield implementation. No platform-specific code is used. |
| 38 // TODO(msw): Merge views::NativeTextfieldViews and views::Textfield classes. |
| 39 class VIEWS_EXPORT NativeTextfieldViews : public View, |
| 40 public ui::TouchEditable, |
| 41 public ContextMenuController, |
| 42 public DragController, |
| 43 public ui::TextInputClient, |
| 44 public TextfieldViewsModel::Delegate { |
| 45 public: |
| 46 explicit NativeTextfieldViews(Textfield* parent); |
| 47 virtual ~NativeTextfieldViews(); |
| 48 |
| 49 // View overrides: |
| 50 virtual gfx::NativeCursor GetCursor(const ui::MouseEvent& event) OVERRIDE; |
| 51 virtual bool OnMousePressed(const ui::MouseEvent& event) OVERRIDE; |
| 52 virtual bool OnMouseDragged(const ui::MouseEvent& event) OVERRIDE; |
| 53 virtual void OnMouseReleased(const ui::MouseEvent& event) OVERRIDE; |
| 54 virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE; |
| 55 virtual bool OnKeyPressed(const ui::KeyEvent& event) OVERRIDE; |
| 56 virtual bool GetDropFormats( |
| 57 int* formats, |
| 58 std::set<ui::OSExchangeData::CustomFormat>* custom_formats) OVERRIDE; |
| 59 virtual bool CanDrop(const ui::OSExchangeData& data) OVERRIDE; |
| 60 virtual int OnDragUpdated(const ui::DropTargetEvent& event) OVERRIDE; |
| 61 virtual void OnDragExited() OVERRIDE; |
| 62 virtual int OnPerformDrop(const ui::DropTargetEvent& event) OVERRIDE; |
| 63 virtual void OnDragDone() OVERRIDE; |
| 64 virtual bool OnKeyReleased(const ui::KeyEvent& event) OVERRIDE; |
| 65 virtual ui::TextInputClient* GetTextInputClient() OVERRIDE; |
| 66 virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; |
| 67 virtual void OnFocus() OVERRIDE; |
| 68 virtual void OnBlur() OVERRIDE; |
| 69 virtual void OnNativeThemeChanged(const ui::NativeTheme* theme) OVERRIDE; |
| 70 |
| 71 // ui::TouchEditable overrides: |
| 72 virtual void SelectRect(const gfx::Point& start, |
| 73 const gfx::Point& end) OVERRIDE; |
| 74 virtual void MoveCaretTo(const gfx::Point& point) OVERRIDE; |
| 75 virtual void GetSelectionEndPoints(gfx::Rect* p1, gfx::Rect* p2) OVERRIDE; |
| 76 virtual gfx::Rect GetBounds() OVERRIDE; |
| 77 virtual gfx::NativeView GetNativeView() OVERRIDE; |
| 78 virtual void ConvertPointToScreen(gfx::Point* point) OVERRIDE; |
| 79 virtual void ConvertPointFromScreen(gfx::Point* point) OVERRIDE; |
| 80 virtual bool DrawsHandles() OVERRIDE; |
| 81 virtual void OpenContextMenu(const gfx::Point& anchor) OVERRIDE; |
| 82 |
| 83 // ContextMenuController overrides: |
| 84 virtual void ShowContextMenuForView(View* source, |
| 85 const gfx::Point& point, |
| 86 ui::MenuSourceType source_type) OVERRIDE; |
| 87 |
| 88 // Overridden from DragController: |
| 89 virtual void WriteDragDataForView(View* sender, |
| 90 const gfx::Point& press_pt, |
| 91 ui::OSExchangeData* data) OVERRIDE; |
| 92 virtual int GetDragOperationsForView(View* sender, |
| 93 const gfx::Point& p) OVERRIDE; |
| 94 virtual bool CanStartDragForView(View* sender, |
| 95 const gfx::Point& press_pt, |
| 96 const gfx::Point& p) OVERRIDE; |
| 97 |
| 98 // Gets the currently displayed text. |
| 99 base::string16 GetText() const; |
| 100 |
| 101 // Updates the text displayed to the text held by the parent Textfield. |
| 102 void UpdateText(); |
| 103 |
| 104 // Adds the specified text to the text already displayed. |
| 105 void AppendText(const base::string16& text); |
| 106 |
| 107 // Inserts |text| at the current cursor position, replacing any selected text. |
| 108 void InsertOrReplaceText(const base::string16& text); |
| 109 |
| 110 // Returns the text direction. |
| 111 base::i18n::TextDirection GetTextDirection() const; |
| 112 |
| 113 // Returns the currently selected text. |
| 114 base::string16 GetSelectedText() const; |
| 115 |
| 116 // Select the entire text range. If |reversed| is true, the range will end at |
| 117 // the logical beginning of the text; this generally shows the leading portion |
| 118 // of text that overflows its display area. |
| 119 void SelectAll(bool reversed); |
| 120 |
| 121 // Clears the selection within the textfield and sets the caret to the end. |
| 122 void ClearSelection(); |
| 123 |
| 124 // Updates whether there is a visible border. |
| 125 void UpdateBorder(); |
| 126 |
| 127 // Updates the painted text color. |
| 128 void UpdateTextColor(); |
| 129 |
| 130 // Updates the painted background color. |
| 131 void UpdateBackgroundColor(); |
| 132 |
| 133 // Updates the read-only state. |
| 134 void UpdateReadOnly(); |
| 135 |
| 136 // Updates the font used to render the text. |
| 137 void UpdateFont(); |
| 138 |
| 139 // Updates the obscured state of the text for passwords, etc. |
| 140 void UpdateIsObscured(); |
| 141 |
| 142 // Updates the enabled state. |
| 143 void UpdateEnabled(); |
| 144 |
| 145 // Updates the horizontal and vertical margins. |
| 146 void UpdateHorizontalMargins(); |
| 147 void UpdateVerticalMargins(); |
| 148 |
| 149 // Returns whether or not an IME is composing text. |
| 150 bool IsIMEComposing() const; |
| 151 |
| 152 // Gets the selected logical text range. |
| 153 const gfx::Range& GetSelectedRange() const; |
| 154 |
| 155 // Selects the specified logical text range. |
| 156 void SelectRange(const gfx::Range& range); |
| 157 |
| 158 // Gets the text selection model. |
| 159 const gfx::SelectionModel& GetSelectionModel() const; |
| 160 |
| 161 // Sets the specified text selection model. |
| 162 void SelectSelectionModel(const gfx::SelectionModel& sel); |
| 163 |
| 164 // Returns the current cursor position. |
| 165 size_t GetCursorPosition() const; |
| 166 |
| 167 // Get or set whether or not the cursor is enabled. |
| 168 bool GetCursorEnabled() const; |
| 169 void SetCursorEnabled(bool enabled); |
| 170 |
| 171 // Invoked when the parent views::Textfield receives key events. |
| 172 // returns true if the event was processed. |
| 173 bool HandleKeyPressed(const ui::KeyEvent& e); |
| 174 bool HandleKeyReleased(const ui::KeyEvent& e); |
| 175 |
| 176 // Invoked when the parent views:Textfield gains or loses focus. |
| 177 void HandleFocus(); |
| 178 void HandleBlur(); |
| 179 |
| 180 // Set the text colors; see views::Textfield for details. |
| 181 void SetColor(SkColor value); |
| 182 void ApplyColor(SkColor value, const gfx::Range& range); |
| 183 |
| 184 // Set the text styles; see the corresponding Textfield functions for details. |
| 185 void SetStyle(gfx::TextStyle style, bool value); |
| 186 void ApplyStyle(gfx::TextStyle style, bool value, const gfx::Range& range); |
| 187 |
| 188 // Clears the Edit history. |
| 189 void ClearEditHistory(); |
| 190 |
| 191 // Get the height in pixels of the fonts used. |
| 192 int GetFontHeight(); |
| 193 |
| 194 // Returns the text baseline; this value does not include any insets. |
| 195 int GetTextfieldBaseline() const; |
| 196 |
| 197 // Returns the width necessary to display the current text, including any |
| 198 // necessary space for the cursor or border/margin. |
| 199 int GetWidthNeededForText() const; |
| 200 |
| 201 // Returns whether this view is the origin of an ongoing drag operation. |
| 202 bool HasTextBeingDragged(); |
| 203 |
| 204 // Returns the location for keyboard-triggered context menus. |
| 205 gfx::Point GetContextMenuLocation(); |
| 206 |
| 207 // ui::SimpleMenuModel::Delegate overrides |
| 208 virtual bool IsCommandIdChecked(int command_id) const OVERRIDE; |
| 209 virtual bool IsCommandIdEnabled(int command_id) const OVERRIDE; |
| 210 virtual bool GetAcceleratorForCommandId( |
| 211 int command_id, |
| 212 ui::Accelerator* accelerator) OVERRIDE; |
| 213 virtual bool IsItemForCommandIdDynamic(int command_id) const OVERRIDE; |
| 214 virtual base::string16 GetLabelForCommandId(int command_id) const OVERRIDE; |
| 215 virtual void ExecuteCommand(int command_id, int event_flags) OVERRIDE; |
| 216 |
| 217 // class name of internal |
| 218 static const char kViewClassName[]; |
| 219 |
| 220 protected: |
| 221 // View override. |
| 222 virtual void OnBoundsChanged(const gfx::Rect& previous_bounds) OVERRIDE; |
| 223 |
| 224 private: |
| 225 friend class NativeTextfieldViewsTest; |
| 226 friend class TouchSelectionControllerImplTest; |
| 227 |
| 228 // Overridden from ui::TextInputClient: |
| 229 virtual void SetCompositionText( |
| 230 const ui::CompositionText& composition) OVERRIDE; |
| 231 virtual void ConfirmCompositionText() OVERRIDE; |
| 232 virtual void ClearCompositionText() OVERRIDE; |
| 233 virtual void InsertText(const base::string16& text) OVERRIDE; |
| 234 virtual void InsertChar(base::char16 ch, int flags) OVERRIDE; |
| 235 virtual gfx::NativeWindow GetAttachedWindow() const OVERRIDE; |
| 236 virtual ui::TextInputType GetTextInputType() const OVERRIDE; |
| 237 virtual ui::TextInputMode GetTextInputMode() const OVERRIDE; |
| 238 virtual bool CanComposeInline() const OVERRIDE; |
| 239 virtual gfx::Rect GetCaretBounds() const OVERRIDE; |
| 240 virtual bool GetCompositionCharacterBounds(uint32 index, |
| 241 gfx::Rect* rect) const OVERRIDE; |
| 242 virtual bool HasCompositionText() const OVERRIDE; |
| 243 virtual bool GetTextRange(gfx::Range* range) const OVERRIDE; |
| 244 virtual bool GetCompositionTextRange(gfx::Range* range) const OVERRIDE; |
| 245 virtual bool GetSelectionRange(gfx::Range* range) const OVERRIDE; |
| 246 virtual bool SetSelectionRange(const gfx::Range& range) OVERRIDE; |
| 247 virtual bool DeleteRange(const gfx::Range& range) OVERRIDE; |
| 248 virtual bool GetTextFromRange(const gfx::Range& range, |
| 249 base::string16* text) const OVERRIDE; |
| 250 virtual void OnInputMethodChanged() OVERRIDE; |
| 251 virtual bool ChangeTextDirectionAndLayoutAlignment( |
| 252 base::i18n::TextDirection direction) OVERRIDE; |
| 253 virtual void ExtendSelectionAndDelete(size_t before, size_t after) OVERRIDE; |
| 254 virtual void EnsureCaretInRect(const gfx::Rect& rect) OVERRIDE; |
| 255 virtual void OnCandidateWindowShown() OVERRIDE; |
| 256 virtual void OnCandidateWindowUpdated() OVERRIDE; |
| 257 virtual void OnCandidateWindowHidden() OVERRIDE; |
| 258 |
| 259 // Overridden from TextfieldViewsModel::Delegate: |
| 260 virtual void OnCompositionTextConfirmedOrCleared() OVERRIDE; |
| 261 |
| 262 // Returns the TextfieldViewsModel's text/cursor/selection rendering model. |
| 263 gfx::RenderText* GetRenderText() const; |
| 264 |
| 265 // Converts |text| according to the current style, e.g. STYLE_LOWERCASE. |
| 266 base::string16 GetTextForDisplay(const base::string16& text); |
| 267 |
| 268 // Updates any colors that have not been explicitly set from the theme. |
| 269 void UpdateColorsFromTheme(const ui::NativeTheme* theme); |
| 270 |
| 271 // A callback function to periodically update the cursor state. |
| 272 void UpdateCursor(); |
| 273 |
| 274 // Repaint the cursor. |
| 275 void RepaintCursor(); |
| 276 |
| 277 // Update the cursor_bounds and text_offset. |
| 278 void UpdateCursorBoundsAndTextOffset(size_t cursor_pos, bool insert_mode); |
| 279 |
| 280 void PaintTextAndCursor(gfx::Canvas* canvas); |
| 281 |
| 282 // Handle the keyevent. |
| 283 bool HandleKeyEvent(const ui::KeyEvent& key_event); |
| 284 |
| 285 // Helper function to call MoveCursorTo on the TextfieldViewsModel. |
| 286 bool MoveCursorTo(const gfx::Point& point, bool select); |
| 287 |
| 288 // Utility function to inform the parent views::Textfield (and any controller) |
| 289 // that the text in the textfield has changed. |
| 290 void PropagateTextChange(); |
| 291 |
| 292 // Does necessary updates when the text and/or cursor position changes. |
| 293 void UpdateAfterChange(bool text_changed, bool cursor_changed); |
| 294 |
| 295 // Utility function to prepare the context menu. |
| 296 void UpdateContextMenu(); |
| 297 |
| 298 // Convenience method to call InputMethod::OnTextInputTypeChanged(); |
| 299 void OnTextInputTypeChanged(); |
| 300 |
| 301 // Convenience method to call InputMethod::OnCaretBoundsChanged(); |
| 302 void OnCaretBoundsChanged(); |
| 303 |
| 304 // Convenience method to call TextfieldController::OnBeforeUserAction(); |
| 305 void OnBeforeUserAction(); |
| 306 |
| 307 // Convenience method to call TextfieldController::OnAfterUserAction(); |
| 308 void OnAfterUserAction(); |
| 309 |
| 310 // Calls |model_->Cut()| and notifies TextfieldController on success. |
| 311 bool Cut(); |
| 312 |
| 313 // Calls |model_->Copy()| and notifies TextfieldController on success. |
| 314 bool Copy(); |
| 315 |
| 316 // Calls |model_->Paste()| and calls TextfieldController::ContentsChanged() |
| 317 // explicitly if paste succeeded. |
| 318 bool Paste(); |
| 319 |
| 320 // Tracks the mouse clicks for single/double/triple clicks. |
| 321 void TrackMouseClicks(const ui::MouseEvent& event); |
| 322 |
| 323 // Handles mouse press events. |
| 324 void HandleMousePressEvent(const ui::MouseEvent& event); |
| 325 |
| 326 // Returns true if the current text input type allows access by the IME. |
| 327 bool ImeEditingAllowed() const; |
| 328 |
| 329 // Returns true if distance between |event| and |last_click_location_| |
| 330 // exceeds the drag threshold. |
| 331 bool ExceededDragThresholdFromLastClickLocation(const ui::MouseEvent& event); |
| 332 |
| 333 // Checks if a char is ok to be inserted into the textfield. The |ch| is a |
| 334 // modified character, i.e., modifiers took effect when generating this char. |
| 335 static bool ShouldInsertChar(base::char16 ch, int flags); |
| 336 |
| 337 void CreateTouchSelectionControllerAndNotifyIt(); |
| 338 |
| 339 // Platform specific gesture event handling. |
| 340 void PlatformGestureEventHandling(const ui::GestureEvent* event); |
| 341 |
| 342 // Reveals the obscured char at |index| for the given |duration|. If |index| |
| 343 // is -1, existing revealed index will be cleared. |
| 344 void RevealObscuredChar(int index, const base::TimeDelta& duration); |
| 345 |
| 346 // The parent views::Textfield, the owner of this object. |
| 347 Textfield* textfield_; |
| 348 |
| 349 // The text model. |
| 350 scoped_ptr<TextfieldViewsModel> model_; |
| 351 |
| 352 // The focusable border. This is always non-NULL, but may not actually be |
| 353 // drawn. If it is not drawn, then by default it's also zero-sized unless the |
| 354 // Textfield has explicitly-set margins. |
| 355 FocusableBorder* text_border_; |
| 356 |
| 357 // The text editing cursor visibility. |
| 358 bool is_cursor_visible_; |
| 359 |
| 360 // The drop cursor is a visual cue for where dragged text will be dropped. |
| 361 bool is_drop_cursor_visible_; |
| 362 // Position of the drop cursor, if it is visible. |
| 363 gfx::SelectionModel drop_cursor_position_; |
| 364 |
| 365 // True if InputMethod::CancelComposition() should not be called. |
| 366 bool skip_input_method_cancel_composition_; |
| 367 |
| 368 // Is the user potentially dragging and dropping from this view? |
| 369 bool initiating_drag_; |
| 370 |
| 371 // A runnable method factory for callback to update the cursor. |
| 372 base::WeakPtrFactory<NativeTextfieldViews> cursor_timer_; |
| 373 |
| 374 // State variables used to track double and triple clicks. |
| 375 size_t aggregated_clicks_; |
| 376 base::TimeDelta last_click_time_; |
| 377 gfx::Point last_click_location_; |
| 378 gfx::Range double_click_word_; |
| 379 |
| 380 // Context menu related members. |
| 381 scoped_ptr<ui::SimpleMenuModel> context_menu_contents_; |
| 382 scoped_ptr<views::MenuModelAdapter> context_menu_delegate_; |
| 383 scoped_ptr<views::MenuRunner> context_menu_runner_; |
| 384 |
| 385 scoped_ptr<ui::TouchSelectionController> touch_selection_controller_; |
| 386 |
| 387 // A timer to control the duration of showing the last typed char in |
| 388 // obscured text. When the timer is running, the last typed char is shown |
| 389 // and when the time expires, the last typed char is obscured. |
| 390 base::OneShotTimer<NativeTextfieldViews> obscured_reveal_timer_; |
| 391 |
| 392 DISALLOW_COPY_AND_ASSIGN(NativeTextfieldViews); |
| 393 }; |
| 394 |
| 395 } // namespace views |
| 396 |
| 397 #endif // UI_VIEWS_CONTROLS_TEXTFIELD_NATIVE_TEXTFIELD_VIEWS_H_ |
OLD | NEW |