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

Side by Side Diff: ui/views/controls/textfield/textfield.cc

Issue 2007503002: Views: Replace resource ids with ui::TextEditCommand enum for text editing commands in Textfield. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Added file deleted during rename. Created 4 years, 6 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
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ui/views/controls/textfield/textfield.h" 5 #include "ui/views/controls/textfield/textfield.h"
6 6
7 #include <string> 7 #include <string>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/trace_event/trace_event.h" 10 #include "base/trace_event/trace_event.h"
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
54 #include "ui/events/linux/text_edit_key_bindings_delegate_auralinux.h" 54 #include "ui/events/linux/text_edit_key_bindings_delegate_auralinux.h"
55 #endif 55 #endif
56 56
57 namespace views { 57 namespace views {
58 58
59 namespace { 59 namespace {
60 60
61 // Default placeholder text color. 61 // Default placeholder text color.
62 const SkColor kDefaultPlaceholderTextColor = SK_ColorLTGRAY; 62 const SkColor kDefaultPlaceholderTextColor = SK_ColorLTGRAY;
63 63
64 const int kNoCommand = 0;
65
66 void ConvertRectToScreen(const View* src, gfx::Rect* r) { 64 void ConvertRectToScreen(const View* src, gfx::Rect* r) {
67 DCHECK(src); 65 DCHECK(src);
68 66
69 gfx::Point new_origin = r->origin(); 67 gfx::Point new_origin = r->origin();
70 View::ConvertPointToScreen(src, &new_origin); 68 View::ConvertPointToScreen(src, &new_origin);
71 r->set_origin(new_origin); 69 r->set_origin(new_origin);
72 } 70 }
73 71
74 // Get the drag selection timer delay, respecting animation scaling for testing. 72 // Get the drag selection timer delay, respecting animation scaling for testing.
75 int GetDragSelectionDelay() { 73 int GetDragSelectionDelay() {
76 switch (ui::ScopedAnimationDurationScaleMode::duration_scale_mode()) { 74 switch (ui::ScopedAnimationDurationScaleMode::duration_scale_mode()) {
77 case ui::ScopedAnimationDurationScaleMode::NORMAL_DURATION: return 100; 75 case ui::ScopedAnimationDurationScaleMode::NORMAL_DURATION: return 100;
78 case ui::ScopedAnimationDurationScaleMode::FAST_DURATION: return 25; 76 case ui::ScopedAnimationDurationScaleMode::FAST_DURATION: return 25;
79 case ui::ScopedAnimationDurationScaleMode::SLOW_DURATION: return 400; 77 case ui::ScopedAnimationDurationScaleMode::SLOW_DURATION: return 400;
80 case ui::ScopedAnimationDurationScaleMode::NON_ZERO_DURATION: return 1; 78 case ui::ScopedAnimationDurationScaleMode::NON_ZERO_DURATION: return 1;
81 case ui::ScopedAnimationDurationScaleMode::ZERO_DURATION: return 0; 79 case ui::ScopedAnimationDurationScaleMode::ZERO_DURATION: return 0;
82 } 80 }
83 return 100; 81 return 100;
84 } 82 }
85 83
86 // Get the default command for a given key |event|. 84 // Get the default command for a given key |event|.
87 int GetCommandForKeyEvent(const ui::KeyEvent& event) { 85 ui::TextEditCommand GetCommandForKeyEvent(const ui::KeyEvent& event) {
88 if (event.type() != ui::ET_KEY_PRESSED || event.IsUnicodeKeyCode()) 86 if (event.type() != ui::ET_KEY_PRESSED || event.IsUnicodeKeyCode())
89 return kNoCommand; 87 return ui::TextEditCommand::INVALID_COMMAND;
90 88
91 const bool shift = event.IsShiftDown(); 89 const bool shift = event.IsShiftDown();
92 const bool control = event.IsControlDown(); 90 const bool control = event.IsControlDown();
93 const bool alt = event.IsAltDown() || event.IsAltGrDown(); 91 const bool alt = event.IsAltDown() || event.IsAltGrDown();
94 switch (event.key_code()) { 92 switch (event.key_code()) {
95 case ui::VKEY_Z: 93 case ui::VKEY_Z:
96 if (control && !shift && !alt) 94 if (control && !shift && !alt)
97 return IDS_APP_UNDO; 95 return ui::TextEditCommand::UNDO;
98 return (control && shift && !alt) ? IDS_APP_REDO : kNoCommand; 96 return (control && shift && !alt) ? ui::TextEditCommand::REDO
97 : ui::TextEditCommand::INVALID_COMMAND;
99 case ui::VKEY_Y: 98 case ui::VKEY_Y:
100 return (control && !alt) ? IDS_APP_REDO : kNoCommand; 99 return (control && !alt) ? ui::TextEditCommand::REDO
100 : ui::TextEditCommand::INVALID_COMMAND;
101 case ui::VKEY_A: 101 case ui::VKEY_A:
102 return (control && !alt) ? IDS_APP_SELECT_ALL : kNoCommand; 102 return (control && !alt) ? ui::TextEditCommand::SELECT_ALL
103 : ui::TextEditCommand::INVALID_COMMAND;
103 case ui::VKEY_X: 104 case ui::VKEY_X:
104 return (control && !alt) ? IDS_APP_CUT : kNoCommand; 105 return (control && !alt) ? ui::TextEditCommand::CUT
106 : ui::TextEditCommand::INVALID_COMMAND;
105 case ui::VKEY_C: 107 case ui::VKEY_C:
106 return (control && !alt) ? IDS_APP_COPY : kNoCommand; 108 return (control && !alt) ? ui::TextEditCommand::COPY
109 : ui::TextEditCommand::INVALID_COMMAND;
107 case ui::VKEY_V: 110 case ui::VKEY_V:
108 return (control && !alt) ? IDS_APP_PASTE : kNoCommand; 111 return (control && !alt) ? ui::TextEditCommand::PASTE
112 : ui::TextEditCommand::INVALID_COMMAND;
109 case ui::VKEY_RIGHT: 113 case ui::VKEY_RIGHT:
110 // Ignore alt+right, which may be a browser navigation shortcut. 114 // Ignore alt+right, which may be a browser navigation shortcut.
111 if (alt) 115 if (alt)
112 return kNoCommand; 116 return ui::TextEditCommand::INVALID_COMMAND;
113 if (!shift) 117 if (!shift)
114 return control ? IDS_MOVE_WORD_RIGHT : IDS_MOVE_RIGHT; 118 return control ? ui::TextEditCommand::MOVE_WORD_RIGHT
115 return control ? IDS_MOVE_WORD_RIGHT_AND_MODIFY_SELECTION : 119 : ui::TextEditCommand::MOVE_RIGHT;
116 IDS_MOVE_RIGHT_AND_MODIFY_SELECTION; 120 return control ? ui::TextEditCommand::MOVE_WORD_RIGHT_AND_MODIFY_SELECTION
121 : ui::TextEditCommand::MOVE_RIGHT_AND_MODIFY_SELECTION;
117 case ui::VKEY_LEFT: 122 case ui::VKEY_LEFT:
118 // Ignore alt+left, which may be a browser navigation shortcut. 123 // Ignore alt+left, which may be a browser navigation shortcut.
119 if (alt) 124 if (alt)
120 return kNoCommand; 125 return ui::TextEditCommand::INVALID_COMMAND;
121 if (!shift) 126 if (!shift)
122 return control ? IDS_MOVE_WORD_LEFT : IDS_MOVE_LEFT; 127 return control ? ui::TextEditCommand::MOVE_WORD_LEFT
123 return control ? IDS_MOVE_WORD_LEFT_AND_MODIFY_SELECTION : 128 : ui::TextEditCommand::MOVE_LEFT;
124 IDS_MOVE_LEFT_AND_MODIFY_SELECTION; 129 return control ? ui::TextEditCommand::MOVE_WORD_LEFT_AND_MODIFY_SELECTION
130 : ui::TextEditCommand::MOVE_LEFT_AND_MODIFY_SELECTION;
125 case ui::VKEY_HOME: 131 case ui::VKEY_HOME:
126 return shift ? IDS_MOVE_TO_BEGINNING_OF_LINE_AND_MODIFY_SELECTION : 132 return shift ? ui::TextEditCommand::
127 IDS_MOVE_TO_BEGINNING_OF_LINE; 133 MOVE_TO_BEGINNING_OF_LINE_AND_MODIFY_SELECTION
134 : ui::TextEditCommand::MOVE_TO_BEGINNING_OF_LINE;
128 case ui::VKEY_END: 135 case ui::VKEY_END:
129 return shift ? IDS_MOVE_TO_END_OF_LINE_AND_MODIFY_SELECTION : 136 return shift
130 IDS_MOVE_TO_END_OF_LINE; 137 ? ui::TextEditCommand::MOVE_TO_END_OF_LINE_AND_MODIFY_SELECTION
138 : ui::TextEditCommand::MOVE_TO_END_OF_LINE;
131 case ui::VKEY_BACK: 139 case ui::VKEY_BACK:
132 if (!control) 140 if (!control)
133 return IDS_DELETE_BACKWARD; 141 return ui::TextEditCommand::DELETE_BACKWARD;
134 #if defined(OS_LINUX) 142 #if defined(OS_LINUX)
135 // Only erase by line break on Linux and ChromeOS. 143 // Only erase by line break on Linux and ChromeOS.
136 if (shift) 144 if (shift)
137 return IDS_DELETE_TO_BEGINNING_OF_LINE; 145 return ui::TextEditCommand::DELETE_TO_BEGINNING_OF_LINE;
138 #endif 146 #endif
139 return IDS_DELETE_WORD_BACKWARD; 147 return ui::TextEditCommand::DELETE_WORD_BACKWARD;
140 case ui::VKEY_DELETE: 148 case ui::VKEY_DELETE:
141 #if defined(OS_LINUX) 149 #if defined(OS_LINUX)
142 // Only erase by line break on Linux and ChromeOS. 150 // Only erase by line break on Linux and ChromeOS.
143 if (shift && control) 151 if (shift && control)
144 return IDS_DELETE_TO_END_OF_LINE; 152 return ui::TextEditCommand::DELETE_TO_END_OF_LINE;
145 #endif 153 #endif
146 if (control) 154 if (control)
147 return IDS_DELETE_WORD_FORWARD; 155 return ui::TextEditCommand::DELETE_WORD_FORWARD;
148 return shift ? IDS_APP_CUT : IDS_DELETE_FORWARD; 156 return shift ? ui::TextEditCommand::CUT
157 : ui::TextEditCommand::DELETE_FORWARD;
149 case ui::VKEY_INSERT: 158 case ui::VKEY_INSERT:
150 if (control && !shift) 159 if (control && !shift)
151 return IDS_APP_COPY; 160 return ui::TextEditCommand::COPY;
152 return (shift && !control) ? IDS_APP_PASTE : kNoCommand; 161 return (shift && !control) ? ui::TextEditCommand::PASTE
162 : ui::TextEditCommand::INVALID_COMMAND;
153 default: 163 default:
154 return kNoCommand; 164 return ui::TextEditCommand::INVALID_COMMAND;
155 } 165 }
156 } 166 }
157 167
158 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) 168 #if defined(OS_LINUX) && !defined(OS_CHROMEOS)
159 // Convert a custom text edit |command| to the equivalent views command ID. 169 // Convert a custom text edit |command| to the equivalent views command ID.
160 int GetViewsCommand(const ui::TextEditCommandAuraLinux& command, bool rtl) { 170 ui::TextEditCommand GetViewsCommand(const ui::TextEditCommandAuraLinux& command,
tapted 2016/05/31 04:18:16 Can we delete TextEditCommandAuraLinux::CommandId
karandeepb 2016/05/31 05:12:32 Yeah I thought it might be easier to unify the two
171 bool rtl) {
161 const bool select = command.extend_selection(); 172 const bool select = command.extend_selection();
162 switch (command.command_id()) { 173 switch (command.command_id()) {
163 case ui::TextEditCommandAuraLinux::COPY: 174 case ui::TextEditCommandAuraLinux::COPY:
164 return IDS_APP_COPY; 175 return ui::TextEditCommand::COPY;
165 case ui::TextEditCommandAuraLinux::CUT: 176 case ui::TextEditCommandAuraLinux::CUT:
166 return IDS_APP_CUT; 177 return ui::TextEditCommand::CUT;
167 case ui::TextEditCommandAuraLinux::DELETE_BACKWARD: 178 case ui::TextEditCommandAuraLinux::DELETE_BACKWARD:
168 return IDS_DELETE_BACKWARD; 179 return ui::TextEditCommand::DELETE_BACKWARD;
169 case ui::TextEditCommandAuraLinux::DELETE_FORWARD: 180 case ui::TextEditCommandAuraLinux::DELETE_FORWARD:
170 return IDS_DELETE_FORWARD; 181 return ui::TextEditCommand::DELETE_FORWARD;
171 case ui::TextEditCommandAuraLinux::DELETE_TO_BEGINING_OF_LINE: 182 case ui::TextEditCommandAuraLinux::DELETE_TO_BEGINING_OF_LINE:
172 case ui::TextEditCommandAuraLinux::DELETE_TO_BEGINING_OF_PARAGRAPH: 183 case ui::TextEditCommandAuraLinux::DELETE_TO_BEGINING_OF_PARAGRAPH:
173 return IDS_DELETE_TO_BEGINNING_OF_LINE; 184 return ui::TextEditCommand::DELETE_TO_BEGINNING_OF_LINE;
174 case ui::TextEditCommandAuraLinux::DELETE_TO_END_OF_LINE: 185 case ui::TextEditCommandAuraLinux::DELETE_TO_END_OF_LINE:
175 case ui::TextEditCommandAuraLinux::DELETE_TO_END_OF_PARAGRAPH: 186 case ui::TextEditCommandAuraLinux::DELETE_TO_END_OF_PARAGRAPH:
176 return IDS_DELETE_TO_END_OF_LINE; 187 return ui::TextEditCommand::DELETE_TO_END_OF_LINE;
177 case ui::TextEditCommandAuraLinux::DELETE_WORD_BACKWARD: 188 case ui::TextEditCommandAuraLinux::DELETE_WORD_BACKWARD:
178 return IDS_DELETE_WORD_BACKWARD; 189 return ui::TextEditCommand::DELETE_WORD_BACKWARD;
179 case ui::TextEditCommandAuraLinux::DELETE_WORD_FORWARD: 190 case ui::TextEditCommandAuraLinux::DELETE_WORD_FORWARD:
180 return IDS_DELETE_WORD_FORWARD; 191 return ui::TextEditCommand::DELETE_WORD_FORWARD;
181 case ui::TextEditCommandAuraLinux::INSERT_TEXT: 192 case ui::TextEditCommandAuraLinux::INSERT_TEXT:
182 return kNoCommand; 193 return ui::TextEditCommand::INVALID_COMMAND;
183 case ui::TextEditCommandAuraLinux::MOVE_BACKWARD: 194 case ui::TextEditCommandAuraLinux::MOVE_BACKWARD:
184 if (rtl) 195 if (rtl)
185 return select ? IDS_MOVE_RIGHT_AND_MODIFY_SELECTION : IDS_MOVE_RIGHT; 196 return select ? ui::TextEditCommand::MOVE_RIGHT_AND_MODIFY_SELECTION
186 return select ? IDS_MOVE_LEFT_AND_MODIFY_SELECTION : IDS_MOVE_LEFT; 197 : ui::TextEditCommand::MOVE_RIGHT;
198 return select ? ui::TextEditCommand::MOVE_LEFT_AND_MODIFY_SELECTION
199 : ui::TextEditCommand::MOVE_LEFT;
187 case ui::TextEditCommandAuraLinux::MOVE_DOWN: 200 case ui::TextEditCommandAuraLinux::MOVE_DOWN:
188 return IDS_MOVE_DOWN; 201 return ui::TextEditCommand::MOVE_DOWN;
189 case ui::TextEditCommandAuraLinux::MOVE_FORWARD: 202 case ui::TextEditCommandAuraLinux::MOVE_FORWARD:
190 if (rtl) 203 if (rtl)
191 return select ? IDS_MOVE_LEFT_AND_MODIFY_SELECTION : IDS_MOVE_LEFT; 204 return select ? ui::TextEditCommand::MOVE_LEFT_AND_MODIFY_SELECTION
192 return select ? IDS_MOVE_RIGHT_AND_MODIFY_SELECTION : IDS_MOVE_RIGHT; 205 : ui::TextEditCommand::MOVE_LEFT;
206 return select ? ui::TextEditCommand::MOVE_RIGHT_AND_MODIFY_SELECTION
207 : ui::TextEditCommand::MOVE_RIGHT;
193 case ui::TextEditCommandAuraLinux::MOVE_LEFT: 208 case ui::TextEditCommandAuraLinux::MOVE_LEFT:
194 return select ? IDS_MOVE_LEFT_AND_MODIFY_SELECTION : IDS_MOVE_LEFT; 209 return select ? ui::TextEditCommand::MOVE_LEFT_AND_MODIFY_SELECTION
210 : ui::TextEditCommand::MOVE_LEFT;
195 case ui::TextEditCommandAuraLinux::MOVE_PAGE_DOWN: 211 case ui::TextEditCommandAuraLinux::MOVE_PAGE_DOWN:
196 case ui::TextEditCommandAuraLinux::MOVE_PAGE_UP: 212 case ui::TextEditCommandAuraLinux::MOVE_PAGE_UP:
197 return kNoCommand; 213 return ui::TextEditCommand::INVALID_COMMAND;
198 case ui::TextEditCommandAuraLinux::MOVE_RIGHT: 214 case ui::TextEditCommandAuraLinux::MOVE_RIGHT:
199 return select ? IDS_MOVE_RIGHT_AND_MODIFY_SELECTION : IDS_MOVE_RIGHT; 215 return select ? ui::TextEditCommand::MOVE_RIGHT_AND_MODIFY_SELECTION
216 : ui::TextEditCommand::MOVE_RIGHT;
200 case ui::TextEditCommandAuraLinux::MOVE_TO_BEGINING_OF_DOCUMENT: 217 case ui::TextEditCommandAuraLinux::MOVE_TO_BEGINING_OF_DOCUMENT:
201 case ui::TextEditCommandAuraLinux::MOVE_TO_BEGINING_OF_LINE: 218 case ui::TextEditCommandAuraLinux::MOVE_TO_BEGINING_OF_LINE:
202 case ui::TextEditCommandAuraLinux::MOVE_TO_BEGINING_OF_PARAGRAPH: 219 case ui::TextEditCommandAuraLinux::MOVE_TO_BEGINING_OF_PARAGRAPH:
203 return select ? IDS_MOVE_TO_BEGINNING_OF_LINE_AND_MODIFY_SELECTION : 220 return select ? ui::TextEditCommand::
204 IDS_MOVE_TO_BEGINNING_OF_LINE; 221 MOVE_TO_BEGINNING_OF_LINE_AND_MODIFY_SELECTION
222 : ui::TextEditCommand::MOVE_TO_BEGINNING_OF_LINE;
205 case ui::TextEditCommandAuraLinux::MOVE_TO_END_OF_DOCUMENT: 223 case ui::TextEditCommandAuraLinux::MOVE_TO_END_OF_DOCUMENT:
206 case ui::TextEditCommandAuraLinux::MOVE_TO_END_OF_LINE: 224 case ui::TextEditCommandAuraLinux::MOVE_TO_END_OF_LINE:
207 case ui::TextEditCommandAuraLinux::MOVE_TO_END_OF_PARAGRAPH: 225 case ui::TextEditCommandAuraLinux::MOVE_TO_END_OF_PARAGRAPH:
208 return select ? IDS_MOVE_TO_END_OF_LINE_AND_MODIFY_SELECTION : 226 return select
209 IDS_MOVE_TO_END_OF_LINE; 227 ? ui::TextEditCommand::MOVE_TO_END_OF_LINE_AND_MODIFY_SELECTION
228 : ui::TextEditCommand::MOVE_TO_END_OF_LINE;
210 case ui::TextEditCommandAuraLinux::MOVE_UP: 229 case ui::TextEditCommandAuraLinux::MOVE_UP:
211 return IDS_MOVE_UP; 230 return ui::TextEditCommand::MOVE_UP;
212 case ui::TextEditCommandAuraLinux::MOVE_WORD_BACKWARD: 231 case ui::TextEditCommandAuraLinux::MOVE_WORD_BACKWARD:
213 if (rtl) { 232 if (rtl) {
214 return select ? IDS_MOVE_WORD_RIGHT_AND_MODIFY_SELECTION : 233 return select
215 IDS_MOVE_WORD_RIGHT; 234 ? ui::TextEditCommand::MOVE_WORD_RIGHT_AND_MODIFY_SELECTION
235 : ui::TextEditCommand::MOVE_WORD_RIGHT;
216 } 236 }
217 return select ? IDS_MOVE_WORD_LEFT_AND_MODIFY_SELECTION : 237 return select ? ui::TextEditCommand::MOVE_WORD_LEFT_AND_MODIFY_SELECTION
218 IDS_MOVE_WORD_LEFT; 238 : ui::TextEditCommand::MOVE_WORD_LEFT;
219 case ui::TextEditCommandAuraLinux::MOVE_WORD_FORWARD: 239 case ui::TextEditCommandAuraLinux::MOVE_WORD_FORWARD:
220 if (rtl) { 240 if (rtl) {
221 return select ? IDS_MOVE_WORD_LEFT_AND_MODIFY_SELECTION : 241 return select ? ui::TextEditCommand::MOVE_WORD_LEFT_AND_MODIFY_SELECTION
222 IDS_MOVE_WORD_LEFT; 242 : ui::TextEditCommand::MOVE_WORD_LEFT;
223 } 243 }
224 return select ? IDS_MOVE_WORD_RIGHT_AND_MODIFY_SELECTION : 244 return select ? ui::TextEditCommand::MOVE_WORD_RIGHT_AND_MODIFY_SELECTION
225 IDS_MOVE_WORD_RIGHT; 245 : ui::TextEditCommand::MOVE_WORD_RIGHT;
226 case ui::TextEditCommandAuraLinux::MOVE_WORD_LEFT: 246 case ui::TextEditCommandAuraLinux::MOVE_WORD_LEFT:
227 return select ? IDS_MOVE_WORD_LEFT_AND_MODIFY_SELECTION : 247 return select ? ui::TextEditCommand::MOVE_WORD_LEFT_AND_MODIFY_SELECTION
228 IDS_MOVE_WORD_LEFT; 248 : ui::TextEditCommand::MOVE_WORD_LEFT;
229 case ui::TextEditCommandAuraLinux::MOVE_WORD_RIGHT: 249 case ui::TextEditCommandAuraLinux::MOVE_WORD_RIGHT:
230 return select ? IDS_MOVE_WORD_RIGHT_AND_MODIFY_SELECTION : 250 return select ? ui::TextEditCommand::MOVE_WORD_RIGHT_AND_MODIFY_SELECTION
231 IDS_MOVE_WORD_RIGHT; 251 : ui::TextEditCommand::MOVE_WORD_RIGHT;
232 case ui::TextEditCommandAuraLinux::PASTE: 252 case ui::TextEditCommandAuraLinux::PASTE:
233 return IDS_APP_PASTE; 253 return ui::TextEditCommand::PASTE;
234 case ui::TextEditCommandAuraLinux::SELECT_ALL: 254 case ui::TextEditCommandAuraLinux::SELECT_ALL:
235 return IDS_APP_SELECT_ALL; 255 return ui::TextEditCommand::SELECT_ALL;
236 case ui::TextEditCommandAuraLinux::SET_MARK: 256 case ui::TextEditCommandAuraLinux::SET_MARK:
237 case ui::TextEditCommandAuraLinux::UNSELECT: 257 case ui::TextEditCommandAuraLinux::UNSELECT:
238 case ui::TextEditCommandAuraLinux::INVALID_COMMAND: 258 case ui::TextEditCommandAuraLinux::INVALID_COMMAND:
239 return kNoCommand; 259 return ui::TextEditCommand::INVALID_COMMAND;
240 } 260 }
241 return kNoCommand; 261 return ui::TextEditCommand::INVALID_COMMAND;
242 } 262 }
243 #endif 263 #endif
244 264
245 const gfx::FontList& GetDefaultFontList() { 265 const gfx::FontList& GetDefaultFontList() {
246 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 266 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
247 return rb.GetFontListWithDelta(ui::kLabelFontSizeDelta); 267 return rb.GetFontListWithDelta(ui::kLabelFontSizeDelta);
248 } 268 }
249 269
270 // Returns the equivalent ui::TextEditCommand for the given |command_id|
271 // corresponding to a context menu action.
272 ui::TextEditCommand GetTextEditCommandForMenuCommand(int command_id,
273 bool has_selection) {
274 switch (command_id) {
275 case IDS_APP_UNDO:
276 return ui::TextEditCommand::UNDO;
277 case IDS_APP_CUT:
278 return ui::TextEditCommand::CUT;
279 case IDS_APP_COPY:
280 return ui::TextEditCommand::COPY;
281 case IDS_APP_PASTE:
282 return ui::TextEditCommand::PASTE;
283 case IDS_APP_DELETE:
284 // The menu command IDS_APP_DELETE should only work during an active
285 // selection.
286 if (has_selection)
287 return ui::TextEditCommand::DELETE_FORWARD;
288 break;
289 case IDS_APP_SELECT_ALL:
290 return ui::TextEditCommand::SELECT_ALL;
291 default:
292 break;
293 }
294 return ui::TextEditCommand::INVALID_COMMAND;
295 }
296
250 } // namespace 297 } // namespace
251 298
252 // static 299 // static
253 const char Textfield::kViewClassName[] = "Textfield"; 300 const char Textfield::kViewClassName[] = "Textfield";
254 const int Textfield::kTextPadding = 3; 301 const int Textfield::kTextPadding = 3;
255 302
256 // static 303 // static
257 size_t Textfield::GetCaretBlinkMs() { 304 size_t Textfield::GetCaretBlinkMs() {
258 static const size_t default_value = 500; 305 static const size_t default_value = 500;
259 #if defined(OS_WIN) 306 #if defined(OS_WIN)
260 static const size_t system_value = ::GetCaretBlinkTime(); 307 static const size_t system_value = ::GetCaretBlinkTime();
261 if (system_value != 0) 308 if (system_value != 0)
262 return (system_value == INFINITE) ? 0 : system_value; 309 return (system_value == INFINITE) ? 0 : system_value;
263 #endif 310 #endif
264 return default_value; 311 return default_value;
265 } 312 }
266 313
267 Textfield::Textfield() 314 Textfield::Textfield()
268 : model_(new TextfieldModel(this)), 315 : model_(new TextfieldModel(this)),
269 controller_(NULL), 316 controller_(NULL),
270 scheduled_edit_command_(kNoCommand), 317 scheduled_edit_command_(ui::TextEditCommand::INVALID_COMMAND),
271 read_only_(false), 318 read_only_(false),
272 default_width_in_chars_(0), 319 default_width_in_chars_(0),
273 use_default_text_color_(true), 320 use_default_text_color_(true),
274 use_default_background_color_(true), 321 use_default_background_color_(true),
275 use_default_selection_text_color_(true), 322 use_default_selection_text_color_(true),
276 use_default_selection_background_color_(true), 323 use_default_selection_background_color_(true),
277 text_color_(SK_ColorBLACK), 324 text_color_(SK_ColorBLACK),
278 background_color_(SK_ColorWHITE), 325 background_color_(SK_ColorWHITE),
279 selection_text_color_(SK_ColorWHITE), 326 selection_text_color_(SK_ColorWHITE),
280 selection_background_color_(SK_ColorBLUE), 327 selection_background_color_(SK_ColorBLUE),
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after
562 } 609 }
563 610
564 void Textfield::ClearEditHistory() { 611 void Textfield::ClearEditHistory() {
565 model_->ClearEditHistory(); 612 model_->ClearEditHistory();
566 } 613 }
567 614
568 void Textfield::SetAccessibleName(const base::string16& name) { 615 void Textfield::SetAccessibleName(const base::string16& name) {
569 accessible_name_ = name; 616 accessible_name_ = name;
570 } 617 }
571 618
572 void Textfield::ExecuteCommand(int command_id) {
573 ExecuteCommand(command_id, ui::EF_NONE);
574 }
575
576 bool Textfield::HasTextBeingDragged() { 619 bool Textfield::HasTextBeingDragged() {
577 return initiating_drag_; 620 return initiating_drag_;
578 } 621 }
579 622
580 //////////////////////////////////////////////////////////////////////////////// 623 ////////////////////////////////////////////////////////////////////////////////
581 // Textfield, View overrides: 624 // Textfield, View overrides:
582 625
583 gfx::Insets Textfield::GetInsets() const { 626 gfx::Insets Textfield::GetInsets() const {
584 gfx::Insets insets = View::GetInsets(); 627 gfx::Insets insets = View::GetInsets();
585 insets += gfx::Insets(kTextPadding, kTextPadding, kTextPadding, kTextPadding); 628 insets += gfx::Insets(kTextPadding, kTextPadding, kTextPadding, kTextPadding);
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
689 drag_selection_timer_.Stop(); 732 drag_selection_timer_.Stop();
690 // Cancel suspected drag initiations, the user was clicking in the selection. 733 // Cancel suspected drag initiations, the user was clicking in the selection.
691 if (initiating_drag_) 734 if (initiating_drag_)
692 MoveCursorTo(event.location(), false); 735 MoveCursorTo(event.location(), false);
693 initiating_drag_ = false; 736 initiating_drag_ = false;
694 UpdateSelectionClipboard(); 737 UpdateSelectionClipboard();
695 OnAfterUserAction(); 738 OnAfterUserAction();
696 } 739 }
697 740
698 bool Textfield::OnKeyPressed(const ui::KeyEvent& event) { 741 bool Textfield::OnKeyPressed(const ui::KeyEvent& event) {
699 int edit_command = scheduled_edit_command_; 742 ui::TextEditCommand edit_command = scheduled_edit_command_;
700 scheduled_edit_command_ = kNoCommand; 743 scheduled_edit_command_ = ui::TextEditCommand::INVALID_COMMAND;
701 744
702 // Since HandleKeyEvent() might destroy |this|, get a weak pointer and verify 745 // Since HandleKeyEvent() might destroy |this|, get a weak pointer and verify
703 // it isn't null before proceeding. 746 // it isn't null before proceeding.
704 base::WeakPtr<Textfield> textfield(weak_ptr_factory_.GetWeakPtr()); 747 base::WeakPtr<Textfield> textfield(weak_ptr_factory_.GetWeakPtr());
705 748
706 bool handled = controller_ && controller_->HandleKeyEvent(this, event); 749 bool handled = controller_ && controller_->HandleKeyEvent(this, event);
707 750
708 if (!textfield) 751 if (!textfield)
709 return handled; 752 return handled;
710 753
711 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) 754 #if defined(OS_LINUX) && !defined(OS_CHROMEOS)
712 ui::TextEditKeyBindingsDelegateAuraLinux* delegate = 755 ui::TextEditKeyBindingsDelegateAuraLinux* delegate =
713 ui::GetTextEditKeyBindingsDelegate(); 756 ui::GetTextEditKeyBindingsDelegate();
714 std::vector<ui::TextEditCommandAuraLinux> commands; 757 std::vector<ui::TextEditCommandAuraLinux> commands;
715 if (!handled && delegate && delegate->MatchEvent(event, &commands)) { 758 if (!handled && delegate && delegate->MatchEvent(event, &commands)) {
716 const bool rtl = GetTextDirection() == base::i18n::RIGHT_TO_LEFT; 759 const bool rtl = GetTextDirection() == base::i18n::RIGHT_TO_LEFT;
717 for (size_t i = 0; i < commands.size(); ++i) { 760 for (size_t i = 0; i < commands.size(); ++i) {
718 const int command = GetViewsCommand(commands[i], rtl); 761 ui::TextEditCommand command = GetViewsCommand(commands[i], rtl);
719 if (IsCommandIdEnabled(command)) { 762 // Ask do we want to use a virtual call? (probably not because we are
720 ExecuteCommand(command); 763 // bubbling up.)
764 if (Textfield::IsEditCommandEnabled(command)) {
tapted 2016/05/31 04:18:17 Using the Textfield:: qualifier when not in that m
765 Textfield::ExecuteEditCommand(command);
721 handled = true; 766 handled = true;
722 } 767 }
723 } 768 }
724 return handled; 769 return handled;
725 } 770 }
726 #endif 771 #endif
727 772
728 if (edit_command == kNoCommand) 773 if (edit_command == ui::TextEditCommand::INVALID_COMMAND)
729 edit_command = GetCommandForKeyEvent(event); 774 edit_command = GetCommandForKeyEvent(event);
730 775
731 if (!handled && IsCommandIdEnabled(edit_command)) { 776 if (!handled && Textfield::IsEditCommandEnabled(edit_command)) {
732 ExecuteCommand(edit_command); 777 Textfield::ExecuteEditCommand(edit_command);
733 handled = true; 778 handled = true;
734 } 779 }
735 return handled; 780 return handled;
736 } 781 }
737 782
738 void Textfield::OnGestureEvent(ui::GestureEvent* event) { 783 void Textfield::OnGestureEvent(ui::GestureEvent* event) {
739 switch (event->type()) { 784 switch (event->type()) {
740 case ui::ET_GESTURE_TAP_DOWN: 785 case ui::ET_GESTURE_TAP_DOWN:
741 RequestFocus(); 786 RequestFocus();
742 ShowImeIfNeeded(); 787 ShowImeIfNeeded();
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
823 break; 868 break;
824 default: 869 default:
825 return; 870 return;
826 } 871 }
827 } 872 }
828 873
829 // This function is called by BrowserView to execute clipboard commands. 874 // This function is called by BrowserView to execute clipboard commands.
830 bool Textfield::AcceleratorPressed(const ui::Accelerator& accelerator) { 875 bool Textfield::AcceleratorPressed(const ui::Accelerator& accelerator) {
831 ui::KeyEvent event(accelerator.type(), accelerator.key_code(), 876 ui::KeyEvent event(accelerator.type(), accelerator.key_code(),
832 accelerator.modifiers()); 877 accelerator.modifiers());
833 ExecuteCommand(GetCommandForKeyEvent(event)); 878 ExecuteEditCommand(GetCommandForKeyEvent(event));
834 return true; 879 return true;
835 } 880 }
836 881
837 bool Textfield::CanHandleAccelerators() const { 882 bool Textfield::CanHandleAccelerators() const {
838 return GetRenderText()->focused() && View::CanHandleAccelerators(); 883 return GetRenderText()->focused() && View::CanHandleAccelerators();
839 } 884 }
840 885
841 void Textfield::AboutToRequestFocusFromTabTraversal(bool reverse) { 886 void Textfield::AboutToRequestFocusFromTabTraversal(bool reverse) {
842 SelectAll(false); 887 SelectAll(false);
843 } 888 }
844 889
845 bool Textfield::SkipDefaultKeyEventProcessing(const ui::KeyEvent& event) { 890 bool Textfield::SkipDefaultKeyEventProcessing(const ui::KeyEvent& event) {
846 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) 891 #if defined(OS_LINUX) && !defined(OS_CHROMEOS)
847 // Skip any accelerator handling that conflicts with custom keybindings. 892 // Skip any accelerator handling that conflicts with custom keybindings.
848 ui::TextEditKeyBindingsDelegateAuraLinux* delegate = 893 ui::TextEditKeyBindingsDelegateAuraLinux* delegate =
849 ui::GetTextEditKeyBindingsDelegate(); 894 ui::GetTextEditKeyBindingsDelegate();
850 std::vector<ui::TextEditCommandAuraLinux> commands; 895 std::vector<ui::TextEditCommandAuraLinux> commands;
851 if (delegate && delegate->MatchEvent(event, &commands)) { 896 if (delegate && delegate->MatchEvent(event, &commands)) {
852 const bool rtl = GetTextDirection() == base::i18n::RIGHT_TO_LEFT; 897 const bool rtl = GetTextDirection() == base::i18n::RIGHT_TO_LEFT;
853 for (size_t i = 0; i < commands.size(); ++i) 898 for (size_t i = 0; i < commands.size(); ++i)
854 if (IsCommandIdEnabled(GetViewsCommand(commands[i], rtl))) 899 // Ask virtual, probably yes.
900 // Why the different codepaths for windows and Linux. On Linux, a Ctrl+V
901 // on a omnibox is processed via OnKeyPressed, but on Windows via
902 // Textfield::AcceleratorPressed. -
903 // https://codereview.chromium.org/213673009
904 // Shouldn't we do the same on other platforms.
905 if (IsEditCommandEnabled(GetViewsCommand(commands[i], rtl)))
855 return true; 906 return true;
856 } 907 }
857 #endif 908 #endif
858 909
859 // Skip backspace accelerator handling; editable textfields handle this key. 910 // Skip backspace accelerator handling; editable textfields handle this key.
860 // Also skip processing Windows [Alt]+<num-pad digit> Unicode alt-codes. 911 // Also skip processing Windows [Alt]+<num-pad digit> Unicode alt-codes.
861 const bool is_backspace = event.key_code() == ui::VKEY_BACK; 912 const bool is_backspace = event.key_code() == ui::VKEY_BACK;
862 return (is_backspace && !read_only()) || event.IsUnicodeKeyCode(); 913 return (is_backspace && !read_only()) || event.IsUnicodeKeyCode();
863 } 914 }
864 915
(...skipping 352 matching lines...) Expand 10 before | Expand all | Expand 10 after
1217 } 1268 }
1218 1269
1219 //////////////////////////////////////////////////////////////////////////////// 1270 ////////////////////////////////////////////////////////////////////////////////
1220 // Textfield, ui::SimpleMenuModel::Delegate overrides: 1271 // Textfield, ui::SimpleMenuModel::Delegate overrides:
1221 1272
1222 bool Textfield::IsCommandIdChecked(int command_id) const { 1273 bool Textfield::IsCommandIdChecked(int command_id) const {
1223 return true; 1274 return true;
1224 } 1275 }
1225 1276
1226 bool Textfield::IsCommandIdEnabled(int command_id) const { 1277 bool Textfield::IsCommandIdEnabled(int command_id) const {
1227 base::string16 result; 1278 return IsEditCommandEnabled(
1228 bool editable = !read_only(); 1279 GetTextEditCommandForMenuCommand(command_id, HasSelection()));
1229 bool readable = text_input_type_ != ui::TEXT_INPUT_TYPE_PASSWORD;
1230 switch (command_id) {
1231 case IDS_APP_UNDO:
1232 return editable && model_->CanUndo();
1233 case IDS_APP_REDO:
1234 return editable && model_->CanRedo();
1235 case IDS_APP_CUT:
1236 return editable && readable && model_->HasSelection();
1237 case IDS_APP_COPY:
1238 return readable && model_->HasSelection();
1239 case IDS_APP_PASTE:
1240 ui::Clipboard::GetForCurrentThread()->ReadText(
1241 ui::CLIPBOARD_TYPE_COPY_PASTE, &result);
1242 return editable && !result.empty();
1243 case IDS_APP_DELETE:
1244 return editable && model_->HasSelection();
1245 case IDS_APP_SELECT_ALL:
1246 return !text().empty();
1247 case IDS_DELETE_FORWARD:
1248 case IDS_DELETE_BACKWARD:
1249 case IDS_DELETE_TO_BEGINNING_OF_LINE:
1250 case IDS_DELETE_TO_END_OF_LINE:
1251 case IDS_DELETE_WORD_BACKWARD:
1252 case IDS_DELETE_WORD_FORWARD:
1253 return editable;
1254 case IDS_MOVE_LEFT:
1255 case IDS_MOVE_LEFT_AND_MODIFY_SELECTION:
1256 case IDS_MOVE_RIGHT:
1257 case IDS_MOVE_RIGHT_AND_MODIFY_SELECTION:
1258 case IDS_MOVE_WORD_LEFT:
1259 case IDS_MOVE_WORD_LEFT_AND_MODIFY_SELECTION:
1260 case IDS_MOVE_WORD_RIGHT:
1261 case IDS_MOVE_WORD_RIGHT_AND_MODIFY_SELECTION:
1262 case IDS_MOVE_TO_BEGINNING_OF_LINE:
1263 case IDS_MOVE_TO_BEGINNING_OF_LINE_AND_MODIFY_SELECTION:
1264 case IDS_MOVE_TO_END_OF_LINE:
1265 case IDS_MOVE_TO_END_OF_LINE_AND_MODIFY_SELECTION:
1266 return true;
1267 default:
1268 return false;
1269 }
1270 } 1280 }
1271 1281
1272 bool Textfield::GetAcceleratorForCommandId(int command_id, 1282 bool Textfield::GetAcceleratorForCommandId(int command_id,
1273 ui::Accelerator* accelerator) { 1283 ui::Accelerator* accelerator) {
1274 switch (command_id) { 1284 switch (command_id) {
1275 case IDS_APP_UNDO: 1285 case IDS_APP_UNDO:
1276 *accelerator = ui::Accelerator(ui::VKEY_Z, ui::EF_CONTROL_DOWN); 1286 *accelerator = ui::Accelerator(ui::VKEY_Z, ui::EF_CONTROL_DOWN);
1277 return true; 1287 return true;
1278 1288
1279 case IDS_APP_CUT: 1289 case IDS_APP_CUT:
(...skipping 10 matching lines...) Expand all
1290 1300
1291 case IDS_APP_SELECT_ALL: 1301 case IDS_APP_SELECT_ALL:
1292 *accelerator = ui::Accelerator(ui::VKEY_A, ui::EF_CONTROL_DOWN); 1302 *accelerator = ui::Accelerator(ui::VKEY_A, ui::EF_CONTROL_DOWN);
1293 return true; 1303 return true;
1294 1304
1295 default: 1305 default:
1296 return false; 1306 return false;
1297 } 1307 }
1298 } 1308 }
1299 1309
1300 void Textfield::ExecuteCommand(int command_id, int event_flags) { 1310 void Textfield::ExecuteCommand(int command_id, int event_flags) {
tapted 2016/05/31 04:18:17 What's still calling this? (can it be replaced wit
karandeepb 2016/05/31 05:12:32 IsCommandIdEnabled and ExecuteCommand(command id,
1301 DestroyTouchSelection(); 1311 ExecuteEditCommand(
1302 1312 GetTextEditCommandForMenuCommand(command_id, HasSelection()));
1303 // Some codepaths may bypass GetCommandForKeyEvent, so any selection-dependent
1304 // modifications of the command should happen here.
1305 if (HasSelection()) {
1306 switch (command_id) {
1307 case IDS_DELETE_WORD_BACKWARD:
1308 case IDS_DELETE_TO_BEGINNING_OF_LINE:
1309 command_id = IDS_DELETE_BACKWARD;
1310 break;
1311 case IDS_DELETE_WORD_FORWARD:
1312 case IDS_DELETE_TO_END_OF_LINE:
1313 command_id = IDS_DELETE_FORWARD;
1314 break;
1315 }
1316 }
1317
1318 if (!IsCommandIdEnabled(command_id))
1319 return;
1320
1321 bool text_changed = false;
1322 bool cursor_changed = false;
1323 bool rtl = GetTextDirection() == base::i18n::RIGHT_TO_LEFT;
1324 gfx::VisualCursorDirection begin = rtl ? gfx::CURSOR_RIGHT : gfx::CURSOR_LEFT;
1325 gfx::VisualCursorDirection end = rtl ? gfx::CURSOR_LEFT : gfx::CURSOR_RIGHT;
1326 gfx::SelectionModel selection_model = GetSelectionModel();
1327
1328 OnBeforeUserAction();
1329 switch (command_id) {
1330 case IDS_APP_UNDO:
1331 text_changed = cursor_changed = model_->Undo();
1332 break;
1333 case IDS_APP_REDO:
1334 text_changed = cursor_changed = model_->Redo();
1335 break;
1336 case IDS_APP_CUT:
1337 text_changed = cursor_changed = Cut();
1338 break;
1339 case IDS_APP_COPY:
1340 Copy();
1341 break;
1342 case IDS_APP_PASTE:
1343 text_changed = cursor_changed = Paste();
1344 break;
1345 case IDS_APP_DELETE:
1346 text_changed = cursor_changed = model_->Delete();
1347 break;
1348 case IDS_APP_SELECT_ALL:
1349 SelectAll(false);
1350 break;
1351 case IDS_DELETE_BACKWARD:
1352 text_changed = cursor_changed = model_->Backspace();
1353 break;
1354 case IDS_DELETE_FORWARD:
1355 text_changed = cursor_changed = model_->Delete();
1356 break;
1357 case IDS_DELETE_TO_END_OF_LINE:
1358 model_->MoveCursor(gfx::LINE_BREAK, end, true);
1359 text_changed = cursor_changed = model_->Delete();
1360 break;
1361 case IDS_DELETE_TO_BEGINNING_OF_LINE:
1362 model_->MoveCursor(gfx::LINE_BREAK, begin, true);
1363 text_changed = cursor_changed = model_->Backspace();
1364 break;
1365 case IDS_DELETE_WORD_BACKWARD:
1366 model_->MoveCursor(gfx::WORD_BREAK, begin, true);
1367 text_changed = cursor_changed = model_->Backspace();
1368 break;
1369 case IDS_DELETE_WORD_FORWARD:
1370 model_->MoveCursor(gfx::WORD_BREAK, end, true);
1371 text_changed = cursor_changed = model_->Delete();
1372 break;
1373 case IDS_MOVE_LEFT:
1374 model_->MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_LEFT, false);
1375 break;
1376 case IDS_MOVE_LEFT_AND_MODIFY_SELECTION:
1377 model_->MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_LEFT, true);
1378 break;
1379 case IDS_MOVE_RIGHT:
1380 model_->MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_RIGHT, false);
1381 break;
1382 case IDS_MOVE_RIGHT_AND_MODIFY_SELECTION:
1383 model_->MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_RIGHT, true);
1384 break;
1385 case IDS_MOVE_WORD_LEFT:
1386 model_->MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_LEFT, false);
1387 break;
1388 case IDS_MOVE_WORD_LEFT_AND_MODIFY_SELECTION:
1389 model_->MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_LEFT, true);
1390 break;
1391 case IDS_MOVE_WORD_RIGHT:
1392 model_->MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_RIGHT, false);
1393 break;
1394 case IDS_MOVE_WORD_RIGHT_AND_MODIFY_SELECTION:
1395 model_->MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_RIGHT, true);
1396 break;
1397 case IDS_MOVE_TO_BEGINNING_OF_LINE:
1398 model_->MoveCursor(gfx::LINE_BREAK, begin, false);
1399 break;
1400 case IDS_MOVE_TO_BEGINNING_OF_LINE_AND_MODIFY_SELECTION:
1401 model_->MoveCursor(gfx::LINE_BREAK, begin, true);
1402 break;
1403 case IDS_MOVE_TO_END_OF_LINE:
1404 model_->MoveCursor(gfx::LINE_BREAK, end, false);
1405 break;
1406 case IDS_MOVE_TO_END_OF_LINE_AND_MODIFY_SELECTION:
1407 model_->MoveCursor(gfx::LINE_BREAK, end, true);
1408 break;
1409 default:
1410 NOTREACHED();
1411 break;
1412 }
1413
1414 cursor_changed |= GetSelectionModel() != selection_model;
1415 if (cursor_changed)
1416 UpdateSelectionClipboard();
1417 UpdateAfterChange(text_changed, cursor_changed);
1418 OnAfterUserAction();
1419 } 1313 }
1420 1314
1421 //////////////////////////////////////////////////////////////////////////////// 1315 ////////////////////////////////////////////////////////////////////////////////
1422 // Textfield, ui::TextInputClient overrides: 1316 // Textfield, ui::TextInputClient overrides:
1423 1317
1424 void Textfield::SetCompositionText(const ui::CompositionText& composition) { 1318 void Textfield::SetCompositionText(const ui::CompositionText& composition) {
1425 if (GetTextInputType() == ui::TEXT_INPUT_TYPE_NONE) 1319 if (GetTextInputType() == ui::TEXT_INPUT_TYPE_NONE)
1426 return; 1320 return;
1427 1321
1428 OnBeforeUserAction(); 1322 OnBeforeUserAction();
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after
1630 1524
1631 range.set_start(range.start() - before); 1525 range.set_start(range.start() - before);
1632 range.set_end(range.end() + after); 1526 range.set_end(range.end() + after);
1633 gfx::Range text_range; 1527 gfx::Range text_range;
1634 if (GetTextRange(&text_range) && text_range.Contains(range)) 1528 if (GetTextRange(&text_range) && text_range.Contains(range))
1635 DeleteRange(range); 1529 DeleteRange(range);
1636 } 1530 }
1637 1531
1638 void Textfield::EnsureCaretInRect(const gfx::Rect& rect) {} 1532 void Textfield::EnsureCaretInRect(const gfx::Rect& rect) {}
1639 1533
1640 bool Textfield::IsEditCommandEnabled(int command_id) { 1534 bool Textfield::IsEditCommandEnabled(ui::TextEditCommand command) const {
1641 return IsCommandIdEnabled(command_id); 1535 base::string16 result;
1536 bool editable = !read_only();
1537 bool readable = text_input_type_ != ui::TEXT_INPUT_TYPE_PASSWORD;
1538 switch (command) {
1539 case ui::TextEditCommand::INVALID_COMMAND:
1540 return false;
1541 case ui::TextEditCommand::UNDO:
1542 return editable && model_->CanUndo();
1543 case ui::TextEditCommand::REDO:
1544 return editable && model_->CanRedo();
1545 case ui::TextEditCommand::CUT:
1546 return editable && readable && model_->HasSelection();
1547 case ui::TextEditCommand::COPY:
1548 return readable && model_->HasSelection();
1549 case ui::TextEditCommand::PASTE:
1550 ui::Clipboard::GetForCurrentThread()->ReadText(
1551 ui::CLIPBOARD_TYPE_COPY_PASTE, &result);
1552 return editable && !result.empty();
1553 case ui::TextEditCommand::SELECT_ALL:
1554 return !text().empty();
1555 case ui::TextEditCommand::DELETE_BACKWARD:
1556 case ui::TextEditCommand::DELETE_FORWARD:
1557 case ui::TextEditCommand::DELETE_TO_END_OF_LINE:
1558 case ui::TextEditCommand::DELETE_TO_BEGINNING_OF_LINE:
1559 case ui::TextEditCommand::DELETE_WORD_BACKWARD:
1560 case ui::TextEditCommand::DELETE_WORD_FORWARD:
1561 return editable;
1562 case ui::TextEditCommand::MOVE_LEFT:
1563 case ui::TextEditCommand::MOVE_LEFT_AND_MODIFY_SELECTION:
1564 case ui::TextEditCommand::MOVE_RIGHT:
1565 case ui::TextEditCommand::MOVE_RIGHT_AND_MODIFY_SELECTION:
1566 case ui::TextEditCommand::MOVE_WORD_LEFT:
1567 case ui::TextEditCommand::MOVE_WORD_LEFT_AND_MODIFY_SELECTION:
1568 case ui::TextEditCommand::MOVE_WORD_RIGHT:
1569 case ui::TextEditCommand::MOVE_WORD_RIGHT_AND_MODIFY_SELECTION:
1570 case ui::TextEditCommand::MOVE_TO_BEGINNING_OF_LINE:
1571 case ui::TextEditCommand::MOVE_TO_BEGINNING_OF_LINE_AND_MODIFY_SELECTION:
1572 case ui::TextEditCommand::MOVE_TO_END_OF_LINE:
1573 case ui::TextEditCommand::MOVE_TO_END_OF_LINE_AND_MODIFY_SELECTION:
1574 return true;
1575 // Added code here.
tapted 2016/05/31 04:18:16 Reviewing changes like this is quite tricky - I th
1576 case ui::TextEditCommand::MOVE_UP:
1577 case ui::TextEditCommand::MOVE_DOWN:
1578 case ui::TextEditCommand::MOVE_PAGE_UP:
1579 case ui::TextEditCommand::MOVE_PAGE_DOWN:
1580 #if defined(OS_MACOSX)
1581 return true;
1582 #else
1583 return false;
1584 #endif
1585 }
1586 return false;
1642 } 1587 }
1643 1588
1644 void Textfield::SetEditCommandForNextKeyEvent(int command_id) { 1589 void Textfield::SetEditCommandForNextKeyEvent(ui::TextEditCommand command) {
1645 DCHECK_EQ(kNoCommand, scheduled_edit_command_); 1590 DCHECK(scheduled_edit_command_ == ui::TextEditCommand::INVALID_COMMAND);
1646 scheduled_edit_command_ = command_id; 1591 scheduled_edit_command_ = command;
1647 } 1592 }
1648 1593
1649 //////////////////////////////////////////////////////////////////////////////// 1594 ////////////////////////////////////////////////////////////////////////////////
1650 // Textfield, protected: 1595 // Textfield, protected:
1651 1596
1652 void Textfield::DoInsertChar(base::char16 ch) { 1597 void Textfield::DoInsertChar(base::char16 ch) {
1653 OnBeforeUserAction(); 1598 OnBeforeUserAction();
1654 skip_input_method_cancel_composition_ = true; 1599 skip_input_method_cancel_composition_ = true;
1655 if (GetRenderText()->insert_mode()) 1600 if (GetRenderText()->insert_mode())
1656 model_->InsertChar(ch); 1601 model_->InsertChar(ch);
1657 else 1602 else
1658 model_->ReplaceChar(ch); 1603 model_->ReplaceChar(ch);
1659 skip_input_method_cancel_composition_ = false; 1604 skip_input_method_cancel_composition_ = false;
1660 1605
1661 UpdateAfterChange(true, true); 1606 UpdateAfterChange(true, true);
1662 OnAfterUserAction(); 1607 OnAfterUserAction();
1663 } 1608 }
1664 1609
1665 gfx::RenderText* Textfield::GetRenderText() const { 1610 gfx::RenderText* Textfield::GetRenderText() const {
1666 return model_->render_text(); 1611 return model_->render_text();
1667 } 1612 }
1668 1613
1669 base::string16 Textfield::GetSelectionClipboardText() const { 1614 base::string16 Textfield::GetSelectionClipboardText() const {
1670 base::string16 selection_clipboard_text; 1615 base::string16 selection_clipboard_text;
1671 ui::Clipboard::GetForCurrentThread()->ReadText( 1616 ui::Clipboard::GetForCurrentThread()->ReadText(
1672 ui::CLIPBOARD_TYPE_SELECTION, &selection_clipboard_text); 1617 ui::CLIPBOARD_TYPE_SELECTION, &selection_clipboard_text);
1673 return selection_clipboard_text; 1618 return selection_clipboard_text;
1674 } 1619 }
1675 1620
1621 void Textfield::ExecuteEditCommand(ui::TextEditCommand command) {
1622 if (!Textfield::IsEditCommandEnabled(command))
1623 return;
1624
1625 DestroyTouchSelection();
1626
1627 // Some codepaths may bypass GetCommandForKeyEvent, so any selection-dependent
1628 // modifications of the command should happen here.
1629 if (HasSelection()) {
1630 switch (command) {
1631 case ui::TextEditCommand::DELETE_WORD_BACKWARD:
1632 case ui::TextEditCommand::DELETE_TO_BEGINNING_OF_LINE:
1633 command = ui::TextEditCommand::DELETE_BACKWARD;
1634 break;
1635 case ui::TextEditCommand::DELETE_WORD_FORWARD:
1636 case ui::TextEditCommand::DELETE_TO_END_OF_LINE:
1637 command = ui::TextEditCommand::DELETE_FORWARD;
1638 break;
1639 default:
1640 break;
1641 }
1642 }
1643
1644 // Added code here.
1645 #if defined(OS_MACOSX)
1646 switch (command) {
1647 case ui::TextEditCommand::MOVE_UP:
1648 case ui::TextEditCommand::MOVE_PAGE_UP:
1649 command = ui::TextEditCommand::MOVE_TO_BEGINNING_OF_LINE;
1650 break;
1651 case ui::TextEditCommand::MOVE_DOWN:
1652 case ui::TextEditCommand::MOVE_PAGE_DOWN:
1653 command = ui::TextEditCommand::MOVE_TO_END_OF_LINE;
1654 break;
1655 default:
1656 break;
1657 }
1658 #endif
1659
1660 bool text_changed = false;
1661 bool cursor_changed = false;
1662 bool rtl = GetTextDirection() == base::i18n::RIGHT_TO_LEFT;
1663 gfx::VisualCursorDirection begin = rtl ? gfx::CURSOR_RIGHT : gfx::CURSOR_LEFT;
1664 gfx::VisualCursorDirection end = rtl ? gfx::CURSOR_LEFT : gfx::CURSOR_RIGHT;
1665 gfx::SelectionModel selection_model = GetSelectionModel();
1666
1667 OnBeforeUserAction();
1668 switch (command) {
1669 case ui::TextEditCommand::UNDO:
1670 text_changed = cursor_changed = model_->Undo();
1671 break;
1672 case ui::TextEditCommand::REDO:
1673 text_changed = cursor_changed = model_->Redo();
1674 break;
1675 case ui::TextEditCommand::CUT:
1676 text_changed = cursor_changed = Cut();
1677 break;
1678 case ui::TextEditCommand::COPY:
1679 Copy();
1680 break;
1681 case ui::TextEditCommand::PASTE:
1682 text_changed = cursor_changed = Paste();
1683 break;
1684 case ui::TextEditCommand::SELECT_ALL:
1685 SelectAll(false);
1686 break;
1687 case ui::TextEditCommand::DELETE_BACKWARD:
1688 text_changed = cursor_changed = model_->Backspace();
1689 break;
1690 case ui::TextEditCommand::DELETE_FORWARD:
1691 text_changed = cursor_changed = model_->Delete();
1692 break;
1693 case ui::TextEditCommand::DELETE_TO_END_OF_LINE:
1694 model_->MoveCursor(gfx::LINE_BREAK, end, true);
1695 text_changed = cursor_changed = model_->Delete();
1696 break;
1697 case ui::TextEditCommand::DELETE_TO_BEGINNING_OF_LINE:
1698 model_->MoveCursor(gfx::LINE_BREAK, begin, true);
1699 text_changed = cursor_changed = model_->Backspace();
1700 break;
1701 case ui::TextEditCommand::DELETE_WORD_BACKWARD:
1702 model_->MoveCursor(gfx::WORD_BREAK, begin, true);
1703 text_changed = cursor_changed = model_->Backspace();
1704 break;
1705 case ui::TextEditCommand::DELETE_WORD_FORWARD:
1706 model_->MoveCursor(gfx::WORD_BREAK, end, true);
1707 text_changed = cursor_changed = model_->Delete();
1708 break;
1709 case ui::TextEditCommand::MOVE_LEFT:
1710 model_->MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_LEFT, false);
1711 break;
1712 case ui::TextEditCommand::MOVE_LEFT_AND_MODIFY_SELECTION:
1713 model_->MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_LEFT, true);
1714 break;
1715 case ui::TextEditCommand::MOVE_RIGHT:
1716 model_->MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_RIGHT, false);
1717 break;
1718 case ui::TextEditCommand::MOVE_RIGHT_AND_MODIFY_SELECTION:
1719 model_->MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_RIGHT, true);
1720 break;
1721 case ui::TextEditCommand::MOVE_WORD_LEFT:
1722 model_->MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_LEFT, false);
1723 break;
1724 case ui::TextEditCommand::MOVE_WORD_LEFT_AND_MODIFY_SELECTION:
1725 model_->MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_LEFT, true);
1726 break;
1727 case ui::TextEditCommand::MOVE_WORD_RIGHT:
1728 model_->MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_RIGHT, false);
1729 break;
1730 case ui::TextEditCommand::MOVE_WORD_RIGHT_AND_MODIFY_SELECTION:
1731 model_->MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_RIGHT, true);
1732 break;
1733 case ui::TextEditCommand::MOVE_TO_BEGINNING_OF_LINE:
1734 model_->MoveCursor(gfx::LINE_BREAK, begin, false);
1735 break;
1736 case ui::TextEditCommand::MOVE_TO_BEGINNING_OF_LINE_AND_MODIFY_SELECTION:
1737 model_->MoveCursor(gfx::LINE_BREAK, begin, true);
1738 break;
1739 case ui::TextEditCommand::MOVE_TO_END_OF_LINE:
1740 model_->MoveCursor(gfx::LINE_BREAK, end, false);
1741 break;
1742 case ui::TextEditCommand::MOVE_TO_END_OF_LINE_AND_MODIFY_SELECTION:
1743 model_->MoveCursor(gfx::LINE_BREAK, end, true);
1744 break;
1745 default:
1746 NOTREACHED();
1747 break;
1748 }
1749
1750 cursor_changed |= GetSelectionModel() != selection_model;
1751 if (cursor_changed)
1752 UpdateSelectionClipboard();
1753 UpdateAfterChange(text_changed, cursor_changed);
1754 OnAfterUserAction();
1755 }
1756
1676 //////////////////////////////////////////////////////////////////////////////// 1757 ////////////////////////////////////////////////////////////////////////////////
1677 // Textfield, private: 1758 // Textfield, private:
1678 1759
1679 void Textfield::AccessibilitySetValue(const base::string16& new_value) { 1760 void Textfield::AccessibilitySetValue(const base::string16& new_value) {
1680 if (!read_only()) { 1761 if (!read_only()) {
1681 SetText(new_value); 1762 SetText(new_value);
1682 ClearSelection(); 1763 ClearSelection();
1683 } 1764 }
1684 } 1765 }
1685 1766
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after
1925 RequestFocus(); 2006 RequestFocus();
1926 model_->MoveCursorTo(mouse); 2007 model_->MoveCursorTo(mouse);
1927 if (!selection_clipboard_text.empty()) { 2008 if (!selection_clipboard_text.empty()) {
1928 model_->InsertText(selection_clipboard_text); 2009 model_->InsertText(selection_clipboard_text);
1929 UpdateAfterChange(true, true); 2010 UpdateAfterChange(true, true);
1930 } 2011 }
1931 OnAfterUserAction(); 2012 OnAfterUserAction();
1932 } 2013 }
1933 2014
1934 } // namespace views 2015 } // namespace views
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698