Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1062)

Side by Side Diff: ui/views/controls/textfield/native_textfield_views.h

Issue 135863002: Reland Merge NativeTextfieldViews into views::Textfield. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Handle Ctrl-Shift-Delete and Backspace on Linux, like on ChromeOS. Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright 2014 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_
OLDNEW
« no previous file with comments | « ui/base/touch/touch_editing_controller.h ('k') | ui/views/controls/textfield/native_textfield_views.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698