Chromium Code Reviews| 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 |