OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |