| 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" |
| 11 #include "build/build_config.h" | 11 #include "build/build_config.h" |
| 12 #include "ui/accessibility/ax_view_state.h" | 12 #include "ui/accessibility/ax_view_state.h" |
| 13 #include "ui/base/clipboard/scoped_clipboard_writer.h" | 13 #include "ui/base/clipboard/scoped_clipboard_writer.h" |
| 14 #include "ui/base/cursor/cursor.h" | 14 #include "ui/base/cursor/cursor.h" |
| 15 #include "ui/base/default_style.h" | 15 #include "ui/base/default_style.h" |
| 16 #include "ui/base/dragdrop/drag_drop_types.h" | 16 #include "ui/base/dragdrop/drag_drop_types.h" |
| 17 #include "ui/base/dragdrop/drag_utils.h" | 17 #include "ui/base/dragdrop/drag_utils.h" |
| 18 #include "ui/base/ime/input_method.h" | 18 #include "ui/base/ime/input_method.h" |
| 19 #include "ui/base/ime/text_edit_commands.h" |
| 19 #include "ui/base/resource/resource_bundle.h" | 20 #include "ui/base/resource/resource_bundle.h" |
| 20 #include "ui/base/ui_base_switches_util.h" | 21 #include "ui/base/ui_base_switches_util.h" |
| 21 #include "ui/compositor/canvas_painter.h" | 22 #include "ui/compositor/canvas_painter.h" |
| 22 #include "ui/compositor/scoped_animation_duration_scale_mode.h" | 23 #include "ui/compositor/scoped_animation_duration_scale_mode.h" |
| 23 #include "ui/display/display.h" | 24 #include "ui/display/display.h" |
| 24 #include "ui/display/screen.h" | 25 #include "ui/display/screen.h" |
| 25 #include "ui/events/base_event_utils.h" | 26 #include "ui/events/base_event_utils.h" |
| 26 #include "ui/events/event.h" | 27 #include "ui/events/event.h" |
| 27 #include "ui/events/keycodes/keyboard_codes.h" | 28 #include "ui/events/keycodes/keyboard_codes.h" |
| 28 #include "ui/gfx/canvas.h" | 29 #include "ui/gfx/canvas.h" |
| (...skipping 26 matching lines...) Expand all Loading... |
| 55 #include "ui/events/linux/text_edit_key_bindings_delegate_auralinux.h" | 56 #include "ui/events/linux/text_edit_key_bindings_delegate_auralinux.h" |
| 56 #endif | 57 #endif |
| 57 | 58 |
| 58 namespace views { | 59 namespace views { |
| 59 | 60 |
| 60 namespace { | 61 namespace { |
| 61 | 62 |
| 62 // Default placeholder text color. | 63 // Default placeholder text color. |
| 63 const SkColor kDefaultPlaceholderTextColor = SK_ColorLTGRAY; | 64 const SkColor kDefaultPlaceholderTextColor = SK_ColorLTGRAY; |
| 64 | 65 |
| 65 const int kNoCommand = 0; | |
| 66 | |
| 67 void ConvertRectToScreen(const View* src, gfx::Rect* r) { | 66 void ConvertRectToScreen(const View* src, gfx::Rect* r) { |
| 68 DCHECK(src); | 67 DCHECK(src); |
| 69 | 68 |
| 70 gfx::Point new_origin = r->origin(); | 69 gfx::Point new_origin = r->origin(); |
| 71 View::ConvertPointToScreen(src, &new_origin); | 70 View::ConvertPointToScreen(src, &new_origin); |
| 72 r->set_origin(new_origin); | 71 r->set_origin(new_origin); |
| 73 } | 72 } |
| 74 | 73 |
| 75 // Get the drag selection timer delay, respecting animation scaling for testing. | 74 // Get the drag selection timer delay, respecting animation scaling for testing. |
| 76 int GetDragSelectionDelay() { | 75 int GetDragSelectionDelay() { |
| 77 switch (ui::ScopedAnimationDurationScaleMode::duration_scale_mode()) { | 76 switch (ui::ScopedAnimationDurationScaleMode::duration_scale_mode()) { |
| 78 case ui::ScopedAnimationDurationScaleMode::NORMAL_DURATION: return 100; | 77 case ui::ScopedAnimationDurationScaleMode::NORMAL_DURATION: return 100; |
| 79 case ui::ScopedAnimationDurationScaleMode::FAST_DURATION: return 25; | 78 case ui::ScopedAnimationDurationScaleMode::FAST_DURATION: return 25; |
| 80 case ui::ScopedAnimationDurationScaleMode::SLOW_DURATION: return 400; | 79 case ui::ScopedAnimationDurationScaleMode::SLOW_DURATION: return 400; |
| 81 case ui::ScopedAnimationDurationScaleMode::NON_ZERO_DURATION: return 1; | 80 case ui::ScopedAnimationDurationScaleMode::NON_ZERO_DURATION: return 1; |
| 82 case ui::ScopedAnimationDurationScaleMode::ZERO_DURATION: return 0; | 81 case ui::ScopedAnimationDurationScaleMode::ZERO_DURATION: return 0; |
| 83 } | 82 } |
| 84 return 100; | 83 return 100; |
| 85 } | 84 } |
| 86 | 85 |
| 87 // Get the default command for a given key |event|. | 86 // Get the default command for a given key |event|. |
| 88 int GetCommandForKeyEvent(const ui::KeyEvent& event) { | 87 ui::TextEditCommand GetCommandForKeyEvent(const ui::KeyEvent& event) { |
| 89 if (event.type() != ui::ET_KEY_PRESSED || event.IsUnicodeKeyCode()) | 88 if (event.type() != ui::ET_KEY_PRESSED || event.IsUnicodeKeyCode()) |
| 90 return kNoCommand; | 89 return ui::TextEditCommand::INVALID_COMMAND; |
| 91 | 90 |
| 92 const bool shift = event.IsShiftDown(); | 91 const bool shift = event.IsShiftDown(); |
| 93 const bool control = event.IsControlDown(); | 92 const bool control = event.IsControlDown(); |
| 94 const bool alt = event.IsAltDown() || event.IsAltGrDown(); | 93 const bool alt = event.IsAltDown() || event.IsAltGrDown(); |
| 95 switch (event.key_code()) { | 94 switch (event.key_code()) { |
| 96 case ui::VKEY_Z: | 95 case ui::VKEY_Z: |
| 97 if (control && !shift && !alt) | 96 if (control && !shift && !alt) |
| 98 return IDS_APP_UNDO; | 97 return ui::TextEditCommand::UNDO; |
| 99 return (control && shift && !alt) ? IDS_APP_REDO : kNoCommand; | 98 return (control && shift && !alt) ? ui::TextEditCommand::REDO |
| 99 : ui::TextEditCommand::INVALID_COMMAND; |
| 100 case ui::VKEY_Y: | 100 case ui::VKEY_Y: |
| 101 return (control && !alt) ? IDS_APP_REDO : kNoCommand; | 101 return (control && !alt) ? ui::TextEditCommand::REDO |
| 102 : ui::TextEditCommand::INVALID_COMMAND; |
| 102 case ui::VKEY_A: | 103 case ui::VKEY_A: |
| 103 return (control && !alt) ? IDS_APP_SELECT_ALL : kNoCommand; | 104 return (control && !alt) ? ui::TextEditCommand::SELECT_ALL |
| 105 : ui::TextEditCommand::INVALID_COMMAND; |
| 104 case ui::VKEY_X: | 106 case ui::VKEY_X: |
| 105 return (control && !alt) ? IDS_APP_CUT : kNoCommand; | 107 return (control && !alt) ? ui::TextEditCommand::CUT |
| 108 : ui::TextEditCommand::INVALID_COMMAND; |
| 106 case ui::VKEY_C: | 109 case ui::VKEY_C: |
| 107 return (control && !alt) ? IDS_APP_COPY : kNoCommand; | 110 return (control && !alt) ? ui::TextEditCommand::COPY |
| 111 : ui::TextEditCommand::INVALID_COMMAND; |
| 108 case ui::VKEY_V: | 112 case ui::VKEY_V: |
| 109 return (control && !alt) ? IDS_APP_PASTE : kNoCommand; | 113 return (control && !alt) ? ui::TextEditCommand::PASTE |
| 114 : ui::TextEditCommand::INVALID_COMMAND; |
| 110 case ui::VKEY_RIGHT: | 115 case ui::VKEY_RIGHT: |
| 111 // Ignore alt+right, which may be a browser navigation shortcut. | 116 // Ignore alt+right, which may be a browser navigation shortcut. |
| 112 if (alt) | 117 if (alt) |
| 113 return kNoCommand; | 118 return ui::TextEditCommand::INVALID_COMMAND; |
| 114 if (!shift) | 119 if (!shift) { |
| 115 return control ? IDS_MOVE_WORD_RIGHT : IDS_MOVE_RIGHT; | 120 return control ? ui::TextEditCommand::MOVE_WORD_RIGHT |
| 116 return control ? IDS_MOVE_WORD_RIGHT_AND_MODIFY_SELECTION : | 121 : ui::TextEditCommand::MOVE_RIGHT; |
| 117 IDS_MOVE_RIGHT_AND_MODIFY_SELECTION; | 122 } |
| 123 return control ? ui::TextEditCommand::MOVE_WORD_RIGHT_AND_MODIFY_SELECTION |
| 124 : ui::TextEditCommand::MOVE_RIGHT_AND_MODIFY_SELECTION; |
| 118 case ui::VKEY_LEFT: | 125 case ui::VKEY_LEFT: |
| 119 // Ignore alt+left, which may be a browser navigation shortcut. | 126 // Ignore alt+left, which may be a browser navigation shortcut. |
| 120 if (alt) | 127 if (alt) |
| 121 return kNoCommand; | 128 return ui::TextEditCommand::INVALID_COMMAND; |
| 122 if (!shift) | 129 if (!shift) { |
| 123 return control ? IDS_MOVE_WORD_LEFT : IDS_MOVE_LEFT; | 130 return control ? ui::TextEditCommand::MOVE_WORD_LEFT |
| 124 return control ? IDS_MOVE_WORD_LEFT_AND_MODIFY_SELECTION : | 131 : ui::TextEditCommand::MOVE_LEFT; |
| 125 IDS_MOVE_LEFT_AND_MODIFY_SELECTION; | 132 } |
| 133 return control ? ui::TextEditCommand::MOVE_WORD_LEFT_AND_MODIFY_SELECTION |
| 134 : ui::TextEditCommand::MOVE_LEFT_AND_MODIFY_SELECTION; |
| 126 case ui::VKEY_HOME: | 135 case ui::VKEY_HOME: |
| 127 return shift ? IDS_MOVE_TO_BEGINNING_OF_LINE_AND_MODIFY_SELECTION : | 136 return shift ? ui::TextEditCommand:: |
| 128 IDS_MOVE_TO_BEGINNING_OF_LINE; | 137 MOVE_TO_BEGINNING_OF_LINE_AND_MODIFY_SELECTION |
| 138 : ui::TextEditCommand::MOVE_TO_BEGINNING_OF_LINE; |
| 129 case ui::VKEY_END: | 139 case ui::VKEY_END: |
| 130 return shift ? IDS_MOVE_TO_END_OF_LINE_AND_MODIFY_SELECTION : | 140 return shift |
| 131 IDS_MOVE_TO_END_OF_LINE; | 141 ? ui::TextEditCommand::MOVE_TO_END_OF_LINE_AND_MODIFY_SELECTION |
| 142 : ui::TextEditCommand::MOVE_TO_END_OF_LINE; |
| 132 case ui::VKEY_BACK: | 143 case ui::VKEY_BACK: |
| 133 if (!control) | 144 if (!control) |
| 134 return IDS_DELETE_BACKWARD; | 145 return ui::TextEditCommand::DELETE_BACKWARD; |
| 135 #if defined(OS_LINUX) | 146 #if defined(OS_LINUX) |
| 136 // Only erase by line break on Linux and ChromeOS. | 147 // Only erase by line break on Linux and ChromeOS. |
| 137 if (shift) | 148 if (shift) |
| 138 return IDS_DELETE_TO_BEGINNING_OF_LINE; | 149 return ui::TextEditCommand::DELETE_TO_BEGINNING_OF_LINE; |
| 139 #endif | 150 #endif |
| 140 return IDS_DELETE_WORD_BACKWARD; | 151 return ui::TextEditCommand::DELETE_WORD_BACKWARD; |
| 141 case ui::VKEY_DELETE: | 152 case ui::VKEY_DELETE: |
| 142 #if defined(OS_LINUX) | 153 #if defined(OS_LINUX) |
| 143 // Only erase by line break on Linux and ChromeOS. | 154 // Only erase by line break on Linux and ChromeOS. |
| 144 if (shift && control) | 155 if (shift && control) |
| 145 return IDS_DELETE_TO_END_OF_LINE; | 156 return ui::TextEditCommand::DELETE_TO_END_OF_LINE; |
| 146 #endif | 157 #endif |
| 147 if (control) | 158 if (control) |
| 148 return IDS_DELETE_WORD_FORWARD; | 159 return ui::TextEditCommand::DELETE_WORD_FORWARD; |
| 149 return shift ? IDS_APP_CUT : IDS_DELETE_FORWARD; | 160 return shift ? ui::TextEditCommand::CUT |
| 161 : ui::TextEditCommand::DELETE_FORWARD; |
| 150 case ui::VKEY_INSERT: | 162 case ui::VKEY_INSERT: |
| 151 if (control && !shift) | 163 if (control && !shift) |
| 152 return IDS_APP_COPY; | 164 return ui::TextEditCommand::COPY; |
| 153 return (shift && !control) ? IDS_APP_PASTE : kNoCommand; | 165 return (shift && !control) ? ui::TextEditCommand::PASTE |
| 166 : ui::TextEditCommand::INVALID_COMMAND; |
| 154 default: | 167 default: |
| 155 return kNoCommand; | 168 return ui::TextEditCommand::INVALID_COMMAND; |
| 156 } | 169 } |
| 157 } | 170 } |
| 158 | 171 |
| 159 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) | 172 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) |
| 160 // Convert a custom text edit |command| to the equivalent views command ID. | 173 // Convert a custom text edit |command| to the equivalent views command ID. |
| 161 int GetViewsCommand(const ui::TextEditCommandAuraLinux& command, bool rtl) { | 174 ui::TextEditCommand GetViewsCommand(const ui::TextEditCommandAuraLinux& command, |
| 175 bool rtl) { |
| 162 const bool select = command.extend_selection(); | 176 const bool select = command.extend_selection(); |
| 163 switch (command.command_id()) { | 177 switch (command.command_id()) { |
| 164 case ui::TextEditCommandAuraLinux::COPY: | 178 case ui::TextEditCommandAuraLinux::COPY: |
| 165 return IDS_APP_COPY; | 179 return ui::TextEditCommand::COPY; |
| 166 case ui::TextEditCommandAuraLinux::CUT: | 180 case ui::TextEditCommandAuraLinux::CUT: |
| 167 return IDS_APP_CUT; | 181 return ui::TextEditCommand::CUT; |
| 168 case ui::TextEditCommandAuraLinux::DELETE_BACKWARD: | 182 case ui::TextEditCommandAuraLinux::DELETE_BACKWARD: |
| 169 return IDS_DELETE_BACKWARD; | 183 return ui::TextEditCommand::DELETE_BACKWARD; |
| 170 case ui::TextEditCommandAuraLinux::DELETE_FORWARD: | 184 case ui::TextEditCommandAuraLinux::DELETE_FORWARD: |
| 171 return IDS_DELETE_FORWARD; | 185 return ui::TextEditCommand::DELETE_FORWARD; |
| 172 case ui::TextEditCommandAuraLinux::DELETE_TO_BEGINING_OF_LINE: | 186 case ui::TextEditCommandAuraLinux::DELETE_TO_BEGINING_OF_LINE: |
| 173 case ui::TextEditCommandAuraLinux::DELETE_TO_BEGINING_OF_PARAGRAPH: | 187 case ui::TextEditCommandAuraLinux::DELETE_TO_BEGINING_OF_PARAGRAPH: |
| 174 return IDS_DELETE_TO_BEGINNING_OF_LINE; | 188 return ui::TextEditCommand::DELETE_TO_BEGINNING_OF_LINE; |
| 175 case ui::TextEditCommandAuraLinux::DELETE_TO_END_OF_LINE: | 189 case ui::TextEditCommandAuraLinux::DELETE_TO_END_OF_LINE: |
| 176 case ui::TextEditCommandAuraLinux::DELETE_TO_END_OF_PARAGRAPH: | 190 case ui::TextEditCommandAuraLinux::DELETE_TO_END_OF_PARAGRAPH: |
| 177 return IDS_DELETE_TO_END_OF_LINE; | 191 return ui::TextEditCommand::DELETE_TO_END_OF_LINE; |
| 178 case ui::TextEditCommandAuraLinux::DELETE_WORD_BACKWARD: | 192 case ui::TextEditCommandAuraLinux::DELETE_WORD_BACKWARD: |
| 179 return IDS_DELETE_WORD_BACKWARD; | 193 return ui::TextEditCommand::DELETE_WORD_BACKWARD; |
| 180 case ui::TextEditCommandAuraLinux::DELETE_WORD_FORWARD: | 194 case ui::TextEditCommandAuraLinux::DELETE_WORD_FORWARD: |
| 181 return IDS_DELETE_WORD_FORWARD; | 195 return ui::TextEditCommand::DELETE_WORD_FORWARD; |
| 182 case ui::TextEditCommandAuraLinux::INSERT_TEXT: | 196 case ui::TextEditCommandAuraLinux::INSERT_TEXT: |
| 183 return kNoCommand; | 197 return ui::TextEditCommand::INVALID_COMMAND; |
| 184 case ui::TextEditCommandAuraLinux::MOVE_BACKWARD: | 198 case ui::TextEditCommandAuraLinux::MOVE_BACKWARD: |
| 185 if (rtl) | 199 if (rtl) { |
| 186 return select ? IDS_MOVE_RIGHT_AND_MODIFY_SELECTION : IDS_MOVE_RIGHT; | 200 return select ? ui::TextEditCommand::MOVE_RIGHT_AND_MODIFY_SELECTION |
| 187 return select ? IDS_MOVE_LEFT_AND_MODIFY_SELECTION : IDS_MOVE_LEFT; | 201 : ui::TextEditCommand::MOVE_RIGHT; |
| 202 } |
| 203 return select ? ui::TextEditCommand::MOVE_LEFT_AND_MODIFY_SELECTION |
| 204 : ui::TextEditCommand::MOVE_LEFT; |
| 188 case ui::TextEditCommandAuraLinux::MOVE_DOWN: | 205 case ui::TextEditCommandAuraLinux::MOVE_DOWN: |
| 189 return IDS_MOVE_DOWN; | 206 return ui::TextEditCommand::MOVE_DOWN; |
| 190 case ui::TextEditCommandAuraLinux::MOVE_FORWARD: | 207 case ui::TextEditCommandAuraLinux::MOVE_FORWARD: |
| 191 if (rtl) | 208 if (rtl) { |
| 192 return select ? IDS_MOVE_LEFT_AND_MODIFY_SELECTION : IDS_MOVE_LEFT; | 209 return select ? ui::TextEditCommand::MOVE_LEFT_AND_MODIFY_SELECTION |
| 193 return select ? IDS_MOVE_RIGHT_AND_MODIFY_SELECTION : IDS_MOVE_RIGHT; | 210 : ui::TextEditCommand::MOVE_LEFT; |
| 211 } |
| 212 return select ? ui::TextEditCommand::MOVE_RIGHT_AND_MODIFY_SELECTION |
| 213 : ui::TextEditCommand::MOVE_RIGHT; |
| 194 case ui::TextEditCommandAuraLinux::MOVE_LEFT: | 214 case ui::TextEditCommandAuraLinux::MOVE_LEFT: |
| 195 return select ? IDS_MOVE_LEFT_AND_MODIFY_SELECTION : IDS_MOVE_LEFT; | 215 return select ? ui::TextEditCommand::MOVE_LEFT_AND_MODIFY_SELECTION |
| 216 : ui::TextEditCommand::MOVE_LEFT; |
| 196 case ui::TextEditCommandAuraLinux::MOVE_PAGE_DOWN: | 217 case ui::TextEditCommandAuraLinux::MOVE_PAGE_DOWN: |
| 197 case ui::TextEditCommandAuraLinux::MOVE_PAGE_UP: | 218 case ui::TextEditCommandAuraLinux::MOVE_PAGE_UP: |
| 198 return kNoCommand; | 219 return ui::TextEditCommand::INVALID_COMMAND; |
| 199 case ui::TextEditCommandAuraLinux::MOVE_RIGHT: | 220 case ui::TextEditCommandAuraLinux::MOVE_RIGHT: |
| 200 return select ? IDS_MOVE_RIGHT_AND_MODIFY_SELECTION : IDS_MOVE_RIGHT; | 221 return select ? ui::TextEditCommand::MOVE_RIGHT_AND_MODIFY_SELECTION |
| 222 : ui::TextEditCommand::MOVE_RIGHT; |
| 201 case ui::TextEditCommandAuraLinux::MOVE_TO_BEGINING_OF_DOCUMENT: | 223 case ui::TextEditCommandAuraLinux::MOVE_TO_BEGINING_OF_DOCUMENT: |
| 202 case ui::TextEditCommandAuraLinux::MOVE_TO_BEGINING_OF_LINE: | 224 case ui::TextEditCommandAuraLinux::MOVE_TO_BEGINING_OF_LINE: |
| 203 case ui::TextEditCommandAuraLinux::MOVE_TO_BEGINING_OF_PARAGRAPH: | 225 case ui::TextEditCommandAuraLinux::MOVE_TO_BEGINING_OF_PARAGRAPH: |
| 204 return select ? IDS_MOVE_TO_BEGINNING_OF_LINE_AND_MODIFY_SELECTION : | 226 return select ? ui::TextEditCommand:: |
| 205 IDS_MOVE_TO_BEGINNING_OF_LINE; | 227 MOVE_TO_BEGINNING_OF_LINE_AND_MODIFY_SELECTION |
| 228 : ui::TextEditCommand::MOVE_TO_BEGINNING_OF_LINE; |
| 206 case ui::TextEditCommandAuraLinux::MOVE_TO_END_OF_DOCUMENT: | 229 case ui::TextEditCommandAuraLinux::MOVE_TO_END_OF_DOCUMENT: |
| 207 case ui::TextEditCommandAuraLinux::MOVE_TO_END_OF_LINE: | 230 case ui::TextEditCommandAuraLinux::MOVE_TO_END_OF_LINE: |
| 208 case ui::TextEditCommandAuraLinux::MOVE_TO_END_OF_PARAGRAPH: | 231 case ui::TextEditCommandAuraLinux::MOVE_TO_END_OF_PARAGRAPH: |
| 209 return select ? IDS_MOVE_TO_END_OF_LINE_AND_MODIFY_SELECTION : | 232 return select |
| 210 IDS_MOVE_TO_END_OF_LINE; | 233 ? ui::TextEditCommand::MOVE_TO_END_OF_LINE_AND_MODIFY_SELECTION |
| 234 : ui::TextEditCommand::MOVE_TO_END_OF_LINE; |
| 211 case ui::TextEditCommandAuraLinux::MOVE_UP: | 235 case ui::TextEditCommandAuraLinux::MOVE_UP: |
| 212 return IDS_MOVE_UP; | 236 return ui::TextEditCommand::MOVE_UP; |
| 213 case ui::TextEditCommandAuraLinux::MOVE_WORD_BACKWARD: | 237 case ui::TextEditCommandAuraLinux::MOVE_WORD_BACKWARD: |
| 214 if (rtl) { | 238 if (rtl) { |
| 215 return select ? IDS_MOVE_WORD_RIGHT_AND_MODIFY_SELECTION : | 239 return select |
| 216 IDS_MOVE_WORD_RIGHT; | 240 ? ui::TextEditCommand::MOVE_WORD_RIGHT_AND_MODIFY_SELECTION |
| 241 : ui::TextEditCommand::MOVE_WORD_RIGHT; |
| 217 } | 242 } |
| 218 return select ? IDS_MOVE_WORD_LEFT_AND_MODIFY_SELECTION : | 243 return select ? ui::TextEditCommand::MOVE_WORD_LEFT_AND_MODIFY_SELECTION |
| 219 IDS_MOVE_WORD_LEFT; | 244 : ui::TextEditCommand::MOVE_WORD_LEFT; |
| 220 case ui::TextEditCommandAuraLinux::MOVE_WORD_FORWARD: | 245 case ui::TextEditCommandAuraLinux::MOVE_WORD_FORWARD: |
| 221 if (rtl) { | 246 if (rtl) { |
| 222 return select ? IDS_MOVE_WORD_LEFT_AND_MODIFY_SELECTION : | 247 return select ? ui::TextEditCommand::MOVE_WORD_LEFT_AND_MODIFY_SELECTION |
| 223 IDS_MOVE_WORD_LEFT; | 248 : ui::TextEditCommand::MOVE_WORD_LEFT; |
| 224 } | 249 } |
| 225 return select ? IDS_MOVE_WORD_RIGHT_AND_MODIFY_SELECTION : | 250 return select ? ui::TextEditCommand::MOVE_WORD_RIGHT_AND_MODIFY_SELECTION |
| 226 IDS_MOVE_WORD_RIGHT; | 251 : ui::TextEditCommand::MOVE_WORD_RIGHT; |
| 227 case ui::TextEditCommandAuraLinux::MOVE_WORD_LEFT: | 252 case ui::TextEditCommandAuraLinux::MOVE_WORD_LEFT: |
| 228 return select ? IDS_MOVE_WORD_LEFT_AND_MODIFY_SELECTION : | 253 return select ? ui::TextEditCommand::MOVE_WORD_LEFT_AND_MODIFY_SELECTION |
| 229 IDS_MOVE_WORD_LEFT; | 254 : ui::TextEditCommand::MOVE_WORD_LEFT; |
| 230 case ui::TextEditCommandAuraLinux::MOVE_WORD_RIGHT: | 255 case ui::TextEditCommandAuraLinux::MOVE_WORD_RIGHT: |
| 231 return select ? IDS_MOVE_WORD_RIGHT_AND_MODIFY_SELECTION : | 256 return select ? ui::TextEditCommand::MOVE_WORD_RIGHT_AND_MODIFY_SELECTION |
| 232 IDS_MOVE_WORD_RIGHT; | 257 : ui::TextEditCommand::MOVE_WORD_RIGHT; |
| 233 case ui::TextEditCommandAuraLinux::PASTE: | 258 case ui::TextEditCommandAuraLinux::PASTE: |
| 234 return IDS_APP_PASTE; | 259 return ui::TextEditCommand::PASTE; |
| 235 case ui::TextEditCommandAuraLinux::SELECT_ALL: | 260 case ui::TextEditCommandAuraLinux::SELECT_ALL: |
| 236 return IDS_APP_SELECT_ALL; | 261 return ui::TextEditCommand::SELECT_ALL; |
| 237 case ui::TextEditCommandAuraLinux::SET_MARK: | 262 case ui::TextEditCommandAuraLinux::SET_MARK: |
| 238 case ui::TextEditCommandAuraLinux::UNSELECT: | 263 case ui::TextEditCommandAuraLinux::UNSELECT: |
| 239 case ui::TextEditCommandAuraLinux::INVALID_COMMAND: | 264 case ui::TextEditCommandAuraLinux::INVALID_COMMAND: |
| 240 return kNoCommand; | 265 return ui::TextEditCommand::INVALID_COMMAND; |
| 241 } | 266 } |
| 242 return kNoCommand; | 267 NOTREACHED(); |
| 268 return ui::TextEditCommand::INVALID_COMMAND; |
| 243 } | 269 } |
| 244 #endif | 270 #endif |
| 245 | 271 |
| 246 const gfx::FontList& GetDefaultFontList() { | 272 const gfx::FontList& GetDefaultFontList() { |
| 247 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); | 273 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); |
| 248 return rb.GetFontListWithDelta(ui::kLabelFontSizeDelta); | 274 return rb.GetFontListWithDelta(ui::kLabelFontSizeDelta); |
| 249 } | 275 } |
| 250 | 276 |
| 251 // Returns true if |command_id| is a menu action installed by this textfield. | 277 // Returns the ui::TextEditCommand corresponding to the |command_id| menu |
| 252 // Keep in sync with UpdateContextMenu. | 278 // action. Keep in sync with UpdateContextMenu. |
| 253 bool IsMenuCommand(int command_id) { | 279 ui::TextEditCommand GetTextEditCommandFromMenuCommand(int command_id) { |
| 254 switch (command_id) { | 280 switch (command_id) { |
| 255 case IDS_APP_UNDO: | 281 case IDS_APP_UNDO: |
| 282 return ui::TextEditCommand::UNDO; |
| 256 case IDS_APP_CUT: | 283 case IDS_APP_CUT: |
| 284 return ui::TextEditCommand::CUT; |
| 257 case IDS_APP_COPY: | 285 case IDS_APP_COPY: |
| 286 return ui::TextEditCommand::COPY; |
| 258 case IDS_APP_PASTE: | 287 case IDS_APP_PASTE: |
| 288 return ui::TextEditCommand::PASTE; |
| 259 case IDS_APP_DELETE: | 289 case IDS_APP_DELETE: |
| 290 return ui::TextEditCommand::DELETE_SELECTION; |
| 260 case IDS_APP_SELECT_ALL: | 291 case IDS_APP_SELECT_ALL: |
| 261 return true; | 292 return ui::TextEditCommand::SELECT_ALL; |
| 293 default: |
| 294 return ui::TextEditCommand::INVALID_COMMAND; |
| 262 } | 295 } |
| 263 return false; | |
| 264 } | 296 } |
| 265 | 297 |
| 266 } // namespace | 298 } // namespace |
| 267 | 299 |
| 268 // static | 300 // static |
| 269 const char Textfield::kViewClassName[] = "Textfield"; | 301 const char Textfield::kViewClassName[] = "Textfield"; |
| 270 const int Textfield::kTextPadding = 3; | 302 const int Textfield::kTextPadding = 3; |
| 271 | 303 |
| 272 // static | 304 // static |
| 273 size_t Textfield::GetCaretBlinkMs() { | 305 size_t Textfield::GetCaretBlinkMs() { |
| 274 static const size_t default_value = 500; | 306 static const size_t default_value = 500; |
| 275 #if defined(OS_WIN) | 307 #if defined(OS_WIN) |
| 276 static const size_t system_value = ::GetCaretBlinkTime(); | 308 static const size_t system_value = ::GetCaretBlinkTime(); |
| 277 if (system_value != 0) | 309 if (system_value != 0) |
| 278 return (system_value == INFINITE) ? 0 : system_value; | 310 return (system_value == INFINITE) ? 0 : system_value; |
| 279 #endif | 311 #endif |
| 280 return default_value; | 312 return default_value; |
| 281 } | 313 } |
| 282 | 314 |
| 283 Textfield::Textfield() | 315 Textfield::Textfield() |
| 284 : model_(new TextfieldModel(this)), | 316 : model_(new TextfieldModel(this)), |
| 285 controller_(NULL), | 317 controller_(NULL), |
| 286 scheduled_edit_command_(kNoCommand), | 318 scheduled_text_edit_command_(ui::TextEditCommand::INVALID_COMMAND), |
| 287 read_only_(false), | 319 read_only_(false), |
| 288 default_width_in_chars_(0), | 320 default_width_in_chars_(0), |
| 289 use_default_text_color_(true), | 321 use_default_text_color_(true), |
| 290 use_default_background_color_(true), | 322 use_default_background_color_(true), |
| 291 use_default_selection_text_color_(true), | 323 use_default_selection_text_color_(true), |
| 292 use_default_selection_background_color_(true), | 324 use_default_selection_background_color_(true), |
| 293 text_color_(SK_ColorBLACK), | 325 text_color_(SK_ColorBLACK), |
| 294 background_color_(SK_ColorWHITE), | 326 background_color_(SK_ColorWHITE), |
| 295 selection_text_color_(SK_ColorWHITE), | 327 selection_text_color_(SK_ColorWHITE), |
| 296 selection_background_color_(SK_ColorBLUE), | 328 selection_background_color_(SK_ColorBLUE), |
| (...skipping 404 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 701 drag_selection_timer_.Stop(); | 733 drag_selection_timer_.Stop(); |
| 702 // Cancel suspected drag initiations, the user was clicking in the selection. | 734 // Cancel suspected drag initiations, the user was clicking in the selection. |
| 703 if (initiating_drag_) | 735 if (initiating_drag_) |
| 704 MoveCursorTo(event.location(), false); | 736 MoveCursorTo(event.location(), false); |
| 705 initiating_drag_ = false; | 737 initiating_drag_ = false; |
| 706 UpdateSelectionClipboard(); | 738 UpdateSelectionClipboard(); |
| 707 OnAfterUserAction(); | 739 OnAfterUserAction(); |
| 708 } | 740 } |
| 709 | 741 |
| 710 bool Textfield::OnKeyPressed(const ui::KeyEvent& event) { | 742 bool Textfield::OnKeyPressed(const ui::KeyEvent& event) { |
| 711 int edit_command = scheduled_edit_command_; | 743 ui::TextEditCommand edit_command = scheduled_text_edit_command_; |
| 712 scheduled_edit_command_ = kNoCommand; | 744 scheduled_text_edit_command_ = ui::TextEditCommand::INVALID_COMMAND; |
| 713 | 745 |
| 714 // Since HandleKeyEvent() might destroy |this|, get a weak pointer and verify | 746 // Since HandleKeyEvent() might destroy |this|, get a weak pointer and verify |
| 715 // it isn't null before proceeding. | 747 // it isn't null before proceeding. |
| 716 base::WeakPtr<Textfield> textfield(weak_ptr_factory_.GetWeakPtr()); | 748 base::WeakPtr<Textfield> textfield(weak_ptr_factory_.GetWeakPtr()); |
| 717 | 749 |
| 718 bool handled = controller_ && controller_->HandleKeyEvent(this, event); | 750 bool handled = controller_ && controller_->HandleKeyEvent(this, event); |
| 719 | 751 |
| 720 if (!textfield) | 752 if (!textfield) |
| 721 return handled; | 753 return handled; |
| 722 | 754 |
| 723 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) | 755 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) |
| 724 ui::TextEditKeyBindingsDelegateAuraLinux* delegate = | 756 ui::TextEditKeyBindingsDelegateAuraLinux* delegate = |
| 725 ui::GetTextEditKeyBindingsDelegate(); | 757 ui::GetTextEditKeyBindingsDelegate(); |
| 726 std::vector<ui::TextEditCommandAuraLinux> commands; | 758 std::vector<ui::TextEditCommandAuraLinux> commands; |
| 727 if (!handled && delegate && delegate->MatchEvent(event, &commands)) { | 759 if (!handled && delegate && delegate->MatchEvent(event, &commands)) { |
| 728 const bool rtl = GetTextDirection() == base::i18n::RIGHT_TO_LEFT; | 760 const bool rtl = GetTextDirection() == base::i18n::RIGHT_TO_LEFT; |
| 729 for (size_t i = 0; i < commands.size(); ++i) { | 761 for (size_t i = 0; i < commands.size(); ++i) { |
| 730 const int command = GetViewsCommand(commands[i], rtl); | 762 const ui::TextEditCommand command = GetViewsCommand(commands[i], rtl); |
| 731 if (IsEditCommandEnabled(command)) { | 763 if (IsTextEditCommandEnabled(command)) { |
| 732 ExecuteEditCommand(command); | 764 ExecuteTextEditCommand(command); |
| 733 handled = true; | 765 handled = true; |
| 734 } | 766 } |
| 735 } | 767 } |
| 736 return handled; | 768 return handled; |
| 737 } | 769 } |
| 738 #endif | 770 #endif |
| 739 | 771 |
| 740 if (edit_command == kNoCommand) | 772 if (edit_command == ui::TextEditCommand::INVALID_COMMAND) |
| 741 edit_command = GetCommandForKeyEvent(event); | 773 edit_command = GetCommandForKeyEvent(event); |
| 742 | 774 |
| 743 if (!handled && IsEditCommandEnabled(edit_command)) { | 775 if (!handled && IsTextEditCommandEnabled(edit_command)) { |
| 744 ExecuteEditCommand(edit_command); | 776 ExecuteTextEditCommand(edit_command); |
| 745 handled = true; | 777 handled = true; |
| 746 } | 778 } |
| 747 return handled; | 779 return handled; |
| 748 } | 780 } |
| 749 | 781 |
| 750 void Textfield::OnGestureEvent(ui::GestureEvent* event) { | 782 void Textfield::OnGestureEvent(ui::GestureEvent* event) { |
| 751 switch (event->type()) { | 783 switch (event->type()) { |
| 752 case ui::ET_GESTURE_TAP_DOWN: | 784 case ui::ET_GESTURE_TAP_DOWN: |
| 753 RequestFocus(); | 785 RequestFocus(); |
| 754 ShowImeIfNeeded(); | 786 ShowImeIfNeeded(); |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 838 break; | 870 break; |
| 839 default: | 871 default: |
| 840 return; | 872 return; |
| 841 } | 873 } |
| 842 } | 874 } |
| 843 | 875 |
| 844 // This function is called by BrowserView to execute clipboard commands. | 876 // This function is called by BrowserView to execute clipboard commands. |
| 845 bool Textfield::AcceleratorPressed(const ui::Accelerator& accelerator) { | 877 bool Textfield::AcceleratorPressed(const ui::Accelerator& accelerator) { |
| 846 ui::KeyEvent event(accelerator.type(), accelerator.key_code(), | 878 ui::KeyEvent event(accelerator.type(), accelerator.key_code(), |
| 847 accelerator.modifiers()); | 879 accelerator.modifiers()); |
| 848 ExecuteEditCommand(GetCommandForKeyEvent(event)); | 880 ExecuteTextEditCommand(GetCommandForKeyEvent(event)); |
| 849 return true; | 881 return true; |
| 850 } | 882 } |
| 851 | 883 |
| 852 bool Textfield::CanHandleAccelerators() const { | 884 bool Textfield::CanHandleAccelerators() const { |
| 853 return GetRenderText()->focused() && View::CanHandleAccelerators(); | 885 return GetRenderText()->focused() && View::CanHandleAccelerators(); |
| 854 } | 886 } |
| 855 | 887 |
| 856 void Textfield::AboutToRequestFocusFromTabTraversal(bool reverse) { | 888 void Textfield::AboutToRequestFocusFromTabTraversal(bool reverse) { |
| 857 SelectAll(false); | 889 SelectAll(false); |
| 858 } | 890 } |
| 859 | 891 |
| 860 bool Textfield::SkipDefaultKeyEventProcessing(const ui::KeyEvent& event) { | 892 bool Textfield::SkipDefaultKeyEventProcessing(const ui::KeyEvent& event) { |
| 861 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) | 893 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) |
| 862 // Skip any accelerator handling that conflicts with custom keybindings. | 894 // Skip any accelerator handling that conflicts with custom keybindings. |
| 863 ui::TextEditKeyBindingsDelegateAuraLinux* delegate = | 895 ui::TextEditKeyBindingsDelegateAuraLinux* delegate = |
| 864 ui::GetTextEditKeyBindingsDelegate(); | 896 ui::GetTextEditKeyBindingsDelegate(); |
| 865 std::vector<ui::TextEditCommandAuraLinux> commands; | 897 std::vector<ui::TextEditCommandAuraLinux> commands; |
| 866 if (delegate && delegate->MatchEvent(event, &commands)) { | 898 if (delegate && delegate->MatchEvent(event, &commands)) { |
| 867 const bool rtl = GetTextDirection() == base::i18n::RIGHT_TO_LEFT; | 899 const bool rtl = GetTextDirection() == base::i18n::RIGHT_TO_LEFT; |
| 868 for (size_t i = 0; i < commands.size(); ++i) | 900 for (size_t i = 0; i < commands.size(); ++i) |
| 869 if (IsEditCommandEnabled(GetViewsCommand(commands[i], rtl))) | 901 if (IsTextEditCommandEnabled(GetViewsCommand(commands[i], rtl))) |
| 870 return true; | 902 return true; |
| 871 } | 903 } |
| 872 #endif | 904 #endif |
| 873 | 905 |
| 874 // Skip backspace accelerator handling; editable textfields handle this key. | 906 // Skip backspace accelerator handling; editable textfields handle this key. |
| 875 // Also skip processing Windows [Alt]+<num-pad digit> Unicode alt-codes. | 907 // Also skip processing Windows [Alt]+<num-pad digit> Unicode alt-codes. |
| 876 const bool is_backspace = event.key_code() == ui::VKEY_BACK; | 908 const bool is_backspace = event.key_code() == ui::VKEY_BACK; |
| 877 return (is_backspace && !read_only()) || event.IsUnicodeKeyCode(); | 909 return (is_backspace && !read_only()) || event.IsUnicodeKeyCode(); |
| 878 } | 910 } |
| 879 | 911 |
| (...skipping 352 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1232 } | 1264 } |
| 1233 | 1265 |
| 1234 //////////////////////////////////////////////////////////////////////////////// | 1266 //////////////////////////////////////////////////////////////////////////////// |
| 1235 // Textfield, ui::SimpleMenuModel::Delegate overrides: | 1267 // Textfield, ui::SimpleMenuModel::Delegate overrides: |
| 1236 | 1268 |
| 1237 bool Textfield::IsCommandIdChecked(int command_id) const { | 1269 bool Textfield::IsCommandIdChecked(int command_id) const { |
| 1238 return true; | 1270 return true; |
| 1239 } | 1271 } |
| 1240 | 1272 |
| 1241 bool Textfield::IsCommandIdEnabled(int command_id) const { | 1273 bool Textfield::IsCommandIdEnabled(int command_id) const { |
| 1242 return IsMenuCommand(command_id) && | 1274 return Textfield::IsTextEditCommandEnabled( |
| 1243 Textfield::IsEditCommandEnabled(command_id); | 1275 GetTextEditCommandFromMenuCommand(command_id)); |
| 1244 } | 1276 } |
| 1245 | 1277 |
| 1246 bool Textfield::GetAcceleratorForCommandId(int command_id, | 1278 bool Textfield::GetAcceleratorForCommandId(int command_id, |
| 1247 ui::Accelerator* accelerator) { | 1279 ui::Accelerator* accelerator) { |
| 1248 switch (command_id) { | 1280 switch (command_id) { |
| 1249 case IDS_APP_UNDO: | 1281 case IDS_APP_UNDO: |
| 1250 *accelerator = ui::Accelerator(ui::VKEY_Z, ui::EF_CONTROL_DOWN); | 1282 *accelerator = ui::Accelerator(ui::VKEY_Z, ui::EF_CONTROL_DOWN); |
| 1251 return true; | 1283 return true; |
| 1252 | 1284 |
| 1253 case IDS_APP_CUT: | 1285 case IDS_APP_CUT: |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1265 case IDS_APP_SELECT_ALL: | 1297 case IDS_APP_SELECT_ALL: |
| 1266 *accelerator = ui::Accelerator(ui::VKEY_A, ui::EF_CONTROL_DOWN); | 1298 *accelerator = ui::Accelerator(ui::VKEY_A, ui::EF_CONTROL_DOWN); |
| 1267 return true; | 1299 return true; |
| 1268 | 1300 |
| 1269 default: | 1301 default: |
| 1270 return false; | 1302 return false; |
| 1271 } | 1303 } |
| 1272 } | 1304 } |
| 1273 | 1305 |
| 1274 void Textfield::ExecuteCommand(int command_id, int event_flags) { | 1306 void Textfield::ExecuteCommand(int command_id, int event_flags) { |
| 1275 DestroyTouchSelection(); | 1307 Textfield::ExecuteTextEditCommand( |
| 1276 if (Textfield::IsCommandIdEnabled(command_id)) | 1308 GetTextEditCommandFromMenuCommand(command_id)); |
| 1277 Textfield::ExecuteEditCommand(command_id); | |
| 1278 } | 1309 } |
| 1279 | 1310 |
| 1280 //////////////////////////////////////////////////////////////////////////////// | 1311 //////////////////////////////////////////////////////////////////////////////// |
| 1281 // Textfield, ui::TextInputClient overrides: | 1312 // Textfield, ui::TextInputClient overrides: |
| 1282 | 1313 |
| 1283 void Textfield::SetCompositionText(const ui::CompositionText& composition) { | 1314 void Textfield::SetCompositionText(const ui::CompositionText& composition) { |
| 1284 if (GetTextInputType() == ui::TEXT_INPUT_TYPE_NONE) | 1315 if (GetTextInputType() == ui::TEXT_INPUT_TYPE_NONE) |
| 1285 return; | 1316 return; |
| 1286 | 1317 |
| 1287 OnBeforeUserAction(); | 1318 OnBeforeUserAction(); |
| (...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1489 | 1520 |
| 1490 range.set_start(range.start() - before); | 1521 range.set_start(range.start() - before); |
| 1491 range.set_end(range.end() + after); | 1522 range.set_end(range.end() + after); |
| 1492 gfx::Range text_range; | 1523 gfx::Range text_range; |
| 1493 if (GetTextRange(&text_range) && text_range.Contains(range)) | 1524 if (GetTextRange(&text_range) && text_range.Contains(range)) |
| 1494 DeleteRange(range); | 1525 DeleteRange(range); |
| 1495 } | 1526 } |
| 1496 | 1527 |
| 1497 void Textfield::EnsureCaretInRect(const gfx::Rect& rect) {} | 1528 void Textfield::EnsureCaretInRect(const gfx::Rect& rect) {} |
| 1498 | 1529 |
| 1499 bool Textfield::IsEditCommandEnabled(int command_id) const { | 1530 bool Textfield::IsTextEditCommandEnabled(ui::TextEditCommand command) const { |
| 1500 base::string16 result; | 1531 base::string16 result; |
| 1501 bool editable = !read_only(); | 1532 bool editable = !read_only(); |
| 1502 bool readable = text_input_type_ != ui::TEXT_INPUT_TYPE_PASSWORD; | 1533 bool readable = text_input_type_ != ui::TEXT_INPUT_TYPE_PASSWORD; |
| 1503 switch (command_id) { | 1534 switch (command) { |
| 1504 case IDS_APP_UNDO: | 1535 case ui::TextEditCommand::INVALID_COMMAND: |
| 1536 return false; |
| 1537 case ui::TextEditCommand::UNDO: |
| 1505 return editable && model_->CanUndo(); | 1538 return editable && model_->CanUndo(); |
| 1506 case IDS_APP_REDO: | 1539 case ui::TextEditCommand::REDO: |
| 1507 return editable && model_->CanRedo(); | 1540 return editable && model_->CanRedo(); |
| 1508 case IDS_APP_CUT: | 1541 case ui::TextEditCommand::CUT: |
| 1509 return editable && readable && model_->HasSelection(); | 1542 return editable && readable && model_->HasSelection(); |
| 1510 case IDS_APP_COPY: | 1543 case ui::TextEditCommand::COPY: |
| 1511 return readable && model_->HasSelection(); | 1544 return readable && model_->HasSelection(); |
| 1512 case IDS_APP_PASTE: | 1545 case ui::TextEditCommand::PASTE: |
| 1513 ui::Clipboard::GetForCurrentThread()->ReadText( | 1546 ui::Clipboard::GetForCurrentThread()->ReadText( |
| 1514 ui::CLIPBOARD_TYPE_COPY_PASTE, &result); | 1547 ui::CLIPBOARD_TYPE_COPY_PASTE, &result); |
| 1515 return editable && !result.empty(); | 1548 return editable && !result.empty(); |
| 1516 case IDS_APP_DELETE: | 1549 case ui::TextEditCommand::DELETE_SELECTION: |
| 1517 return editable && model_->HasSelection(); | 1550 return editable && model_->HasSelection(); |
| 1518 case IDS_APP_SELECT_ALL: | 1551 case ui::TextEditCommand::SELECT_ALL: |
| 1519 return !text().empty(); | 1552 return !text().empty(); |
| 1520 case IDS_DELETE_FORWARD: | 1553 case ui::TextEditCommand::DELETE_FORWARD: |
| 1521 case IDS_DELETE_BACKWARD: | 1554 case ui::TextEditCommand::DELETE_BACKWARD: |
| 1522 case IDS_DELETE_TO_BEGINNING_OF_LINE: | 1555 case ui::TextEditCommand::DELETE_TO_BEGINNING_OF_LINE: |
| 1523 case IDS_DELETE_TO_END_OF_LINE: | 1556 case ui::TextEditCommand::DELETE_TO_END_OF_LINE: |
| 1524 case IDS_DELETE_WORD_BACKWARD: | 1557 case ui::TextEditCommand::DELETE_WORD_BACKWARD: |
| 1525 case IDS_DELETE_WORD_FORWARD: | 1558 case ui::TextEditCommand::DELETE_WORD_FORWARD: |
| 1526 return editable; | 1559 return editable; |
| 1527 case IDS_MOVE_LEFT: | 1560 case ui::TextEditCommand::MOVE_LEFT: |
| 1528 case IDS_MOVE_LEFT_AND_MODIFY_SELECTION: | 1561 case ui::TextEditCommand::MOVE_LEFT_AND_MODIFY_SELECTION: |
| 1529 case IDS_MOVE_RIGHT: | 1562 case ui::TextEditCommand::MOVE_RIGHT: |
| 1530 case IDS_MOVE_RIGHT_AND_MODIFY_SELECTION: | 1563 case ui::TextEditCommand::MOVE_RIGHT_AND_MODIFY_SELECTION: |
| 1531 case IDS_MOVE_WORD_LEFT: | 1564 case ui::TextEditCommand::MOVE_WORD_LEFT: |
| 1532 case IDS_MOVE_WORD_LEFT_AND_MODIFY_SELECTION: | 1565 case ui::TextEditCommand::MOVE_WORD_LEFT_AND_MODIFY_SELECTION: |
| 1533 case IDS_MOVE_WORD_RIGHT: | 1566 case ui::TextEditCommand::MOVE_WORD_RIGHT: |
| 1534 case IDS_MOVE_WORD_RIGHT_AND_MODIFY_SELECTION: | 1567 case ui::TextEditCommand::MOVE_WORD_RIGHT_AND_MODIFY_SELECTION: |
| 1535 case IDS_MOVE_TO_BEGINNING_OF_LINE: | 1568 case ui::TextEditCommand::MOVE_TO_BEGINNING_OF_LINE: |
| 1536 case IDS_MOVE_TO_BEGINNING_OF_LINE_AND_MODIFY_SELECTION: | 1569 case ui::TextEditCommand::MOVE_TO_BEGINNING_OF_LINE_AND_MODIFY_SELECTION: |
| 1537 case IDS_MOVE_TO_END_OF_LINE: | 1570 case ui::TextEditCommand::MOVE_TO_END_OF_LINE: |
| 1538 case IDS_MOVE_TO_END_OF_LINE_AND_MODIFY_SELECTION: | 1571 case ui::TextEditCommand::MOVE_TO_END_OF_LINE_AND_MODIFY_SELECTION: |
| 1539 return true; | 1572 return true; |
| 1540 default: | 1573 case ui::TextEditCommand::MOVE_UP: |
| 1574 case ui::TextEditCommand::MOVE_DOWN: |
| 1541 return false; | 1575 return false; |
| 1542 } | 1576 } |
| 1577 NOTREACHED(); |
| 1578 return false; |
| 1543 } | 1579 } |
| 1544 | 1580 |
| 1545 void Textfield::SetEditCommandForNextKeyEvent(int command_id) { | 1581 void Textfield::SetTextEditCommandForNextKeyEvent(ui::TextEditCommand command) { |
| 1546 DCHECK_EQ(kNoCommand, scheduled_edit_command_); | 1582 DCHECK_EQ(ui::TextEditCommand::INVALID_COMMAND, scheduled_text_edit_command_); |
| 1547 scheduled_edit_command_ = command_id; | 1583 scheduled_text_edit_command_ = command; |
| 1548 } | 1584 } |
| 1549 | 1585 |
| 1550 //////////////////////////////////////////////////////////////////////////////// | 1586 //////////////////////////////////////////////////////////////////////////////// |
| 1551 // Textfield, protected: | 1587 // Textfield, protected: |
| 1552 | 1588 |
| 1553 void Textfield::DoInsertChar(base::char16 ch) { | 1589 void Textfield::DoInsertChar(base::char16 ch) { |
| 1554 OnBeforeUserAction(); | 1590 OnBeforeUserAction(); |
| 1555 skip_input_method_cancel_composition_ = true; | 1591 skip_input_method_cancel_composition_ = true; |
| 1556 if (GetRenderText()->insert_mode()) | 1592 if (GetRenderText()->insert_mode()) |
| 1557 model_->InsertChar(ch); | 1593 model_->InsertChar(ch); |
| 1558 else | 1594 else |
| 1559 model_->ReplaceChar(ch); | 1595 model_->ReplaceChar(ch); |
| 1560 skip_input_method_cancel_composition_ = false; | 1596 skip_input_method_cancel_composition_ = false; |
| 1561 | 1597 |
| 1562 UpdateAfterChange(true, true); | 1598 UpdateAfterChange(true, true); |
| 1563 OnAfterUserAction(); | 1599 OnAfterUserAction(); |
| 1564 } | 1600 } |
| 1565 | 1601 |
| 1566 gfx::RenderText* Textfield::GetRenderText() const { | 1602 gfx::RenderText* Textfield::GetRenderText() const { |
| 1567 return model_->render_text(); | 1603 return model_->render_text(); |
| 1568 } | 1604 } |
| 1569 | 1605 |
| 1570 base::string16 Textfield::GetSelectionClipboardText() const { | 1606 base::string16 Textfield::GetSelectionClipboardText() const { |
| 1571 base::string16 selection_clipboard_text; | 1607 base::string16 selection_clipboard_text; |
| 1572 ui::Clipboard::GetForCurrentThread()->ReadText( | 1608 ui::Clipboard::GetForCurrentThread()->ReadText( |
| 1573 ui::CLIPBOARD_TYPE_SELECTION, &selection_clipboard_text); | 1609 ui::CLIPBOARD_TYPE_SELECTION, &selection_clipboard_text); |
| 1574 return selection_clipboard_text; | 1610 return selection_clipboard_text; |
| 1575 } | 1611 } |
| 1576 | 1612 |
| 1577 void Textfield::ExecuteEditCommand(int command_id) { | 1613 void Textfield::ExecuteTextEditCommand(ui::TextEditCommand command) { |
| 1578 DestroyTouchSelection(); | 1614 DestroyTouchSelection(); |
| 1579 | 1615 |
| 1580 // Some codepaths may bypass GetCommandForKeyEvent, so any selection-dependent | 1616 // Some codepaths may bypass GetCommandForKeyEvent, so any selection-dependent |
| 1581 // modifications of the command should happen here. | 1617 // modifications of the command should happen here. |
| 1582 if (HasSelection()) { | 1618 if (HasSelection()) { |
| 1583 switch (command_id) { | 1619 switch (command) { |
| 1584 case IDS_DELETE_WORD_BACKWARD: | 1620 case ui::TextEditCommand::DELETE_WORD_BACKWARD: |
| 1585 case IDS_DELETE_TO_BEGINNING_OF_LINE: | 1621 case ui::TextEditCommand::DELETE_TO_BEGINNING_OF_LINE: |
| 1586 command_id = IDS_DELETE_BACKWARD; | 1622 command = ui::TextEditCommand::DELETE_BACKWARD; |
| 1587 break; | 1623 break; |
| 1588 case IDS_DELETE_WORD_FORWARD: | 1624 case ui::TextEditCommand::DELETE_WORD_FORWARD: |
| 1589 case IDS_DELETE_TO_END_OF_LINE: | 1625 case ui::TextEditCommand::DELETE_TO_END_OF_LINE: |
| 1590 command_id = IDS_DELETE_FORWARD; | 1626 command = ui::TextEditCommand::DELETE_FORWARD; |
| 1627 break; |
| 1628 default: |
| 1591 break; | 1629 break; |
| 1592 } | 1630 } |
| 1593 } | 1631 } |
| 1594 | 1632 |
| 1595 // We only execute the commands enabled in Textfield::IsEditCommandEnabled | 1633 // We only execute the commands enabled in Textfield::IsTextEditCommandEnabled |
| 1596 // below. Hence don't do a virtual IsEditCommandEnabled call. | 1634 // below. Hence don't do a virtual IsTextEditCommandEnabled call. |
| 1597 if (!Textfield::IsEditCommandEnabled(command_id)) | 1635 if (!Textfield::IsTextEditCommandEnabled(command)) |
| 1598 return; | 1636 return; |
| 1599 | 1637 |
| 1600 bool text_changed = false; | 1638 bool text_changed = false; |
| 1601 bool cursor_changed = false; | 1639 bool cursor_changed = false; |
| 1602 bool rtl = GetTextDirection() == base::i18n::RIGHT_TO_LEFT; | 1640 bool rtl = GetTextDirection() == base::i18n::RIGHT_TO_LEFT; |
| 1603 gfx::VisualCursorDirection begin = rtl ? gfx::CURSOR_RIGHT : gfx::CURSOR_LEFT; | 1641 gfx::VisualCursorDirection begin = rtl ? gfx::CURSOR_RIGHT : gfx::CURSOR_LEFT; |
| 1604 gfx::VisualCursorDirection end = rtl ? gfx::CURSOR_LEFT : gfx::CURSOR_RIGHT; | 1642 gfx::VisualCursorDirection end = rtl ? gfx::CURSOR_LEFT : gfx::CURSOR_RIGHT; |
| 1605 gfx::SelectionModel selection_model = GetSelectionModel(); | 1643 gfx::SelectionModel selection_model = GetSelectionModel(); |
| 1606 | 1644 |
| 1607 OnBeforeUserAction(); | 1645 OnBeforeUserAction(); |
| 1608 switch (command_id) { | 1646 switch (command) { |
| 1609 case IDS_APP_UNDO: | 1647 case ui::TextEditCommand::UNDO: |
| 1610 text_changed = cursor_changed = model_->Undo(); | 1648 text_changed = cursor_changed = model_->Undo(); |
| 1611 break; | 1649 break; |
| 1612 case IDS_APP_REDO: | 1650 case ui::TextEditCommand::REDO: |
| 1613 text_changed = cursor_changed = model_->Redo(); | 1651 text_changed = cursor_changed = model_->Redo(); |
| 1614 break; | 1652 break; |
| 1615 case IDS_APP_CUT: | 1653 case ui::TextEditCommand::CUT: |
| 1616 text_changed = cursor_changed = Cut(); | 1654 text_changed = cursor_changed = Cut(); |
| 1617 break; | 1655 break; |
| 1618 case IDS_APP_COPY: | 1656 case ui::TextEditCommand::COPY: |
| 1619 Copy(); | 1657 Copy(); |
| 1620 break; | 1658 break; |
| 1621 case IDS_APP_PASTE: | 1659 case ui::TextEditCommand::PASTE: |
| 1622 text_changed = cursor_changed = Paste(); | 1660 text_changed = cursor_changed = Paste(); |
| 1623 break; | 1661 break; |
| 1624 case IDS_APP_DELETE: | 1662 case ui::TextEditCommand::DELETE_SELECTION: |
| 1625 text_changed = cursor_changed = model_->Delete(); | 1663 text_changed = cursor_changed = model_->Delete(); |
| 1626 break; | 1664 break; |
| 1627 case IDS_APP_SELECT_ALL: | 1665 case ui::TextEditCommand::SELECT_ALL: |
| 1628 SelectAll(false); | 1666 SelectAll(false); |
| 1629 break; | 1667 break; |
| 1630 case IDS_DELETE_BACKWARD: | 1668 case ui::TextEditCommand::DELETE_BACKWARD: |
| 1631 text_changed = cursor_changed = model_->Backspace(); | 1669 text_changed = cursor_changed = model_->Backspace(); |
| 1632 break; | 1670 break; |
| 1633 case IDS_DELETE_FORWARD: | 1671 case ui::TextEditCommand::DELETE_FORWARD: |
| 1634 text_changed = cursor_changed = model_->Delete(); | 1672 text_changed = cursor_changed = model_->Delete(); |
| 1635 break; | 1673 break; |
| 1636 case IDS_DELETE_TO_END_OF_LINE: | 1674 case ui::TextEditCommand::DELETE_TO_END_OF_LINE: |
| 1637 model_->MoveCursor(gfx::LINE_BREAK, end, true); | 1675 model_->MoveCursor(gfx::LINE_BREAK, end, true); |
| 1638 text_changed = cursor_changed = model_->Delete(); | 1676 text_changed = cursor_changed = model_->Delete(); |
| 1639 break; | 1677 break; |
| 1640 case IDS_DELETE_TO_BEGINNING_OF_LINE: | 1678 case ui::TextEditCommand::DELETE_TO_BEGINNING_OF_LINE: |
| 1641 model_->MoveCursor(gfx::LINE_BREAK, begin, true); | 1679 model_->MoveCursor(gfx::LINE_BREAK, begin, true); |
| 1642 text_changed = cursor_changed = model_->Backspace(); | 1680 text_changed = cursor_changed = model_->Backspace(); |
| 1643 break; | 1681 break; |
| 1644 case IDS_DELETE_WORD_BACKWARD: | 1682 case ui::TextEditCommand::DELETE_WORD_BACKWARD: |
| 1645 model_->MoveCursor(gfx::WORD_BREAK, begin, true); | 1683 model_->MoveCursor(gfx::WORD_BREAK, begin, true); |
| 1646 text_changed = cursor_changed = model_->Backspace(); | 1684 text_changed = cursor_changed = model_->Backspace(); |
| 1647 break; | 1685 break; |
| 1648 case IDS_DELETE_WORD_FORWARD: | 1686 case ui::TextEditCommand::DELETE_WORD_FORWARD: |
| 1649 model_->MoveCursor(gfx::WORD_BREAK, end, true); | 1687 model_->MoveCursor(gfx::WORD_BREAK, end, true); |
| 1650 text_changed = cursor_changed = model_->Delete(); | 1688 text_changed = cursor_changed = model_->Delete(); |
| 1651 break; | 1689 break; |
| 1652 case IDS_MOVE_LEFT: | 1690 case ui::TextEditCommand::MOVE_LEFT: |
| 1653 model_->MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_LEFT, false); | 1691 model_->MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_LEFT, false); |
| 1654 break; | 1692 break; |
| 1655 case IDS_MOVE_LEFT_AND_MODIFY_SELECTION: | 1693 case ui::TextEditCommand::MOVE_LEFT_AND_MODIFY_SELECTION: |
| 1656 model_->MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_LEFT, true); | 1694 model_->MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_LEFT, true); |
| 1657 break; | 1695 break; |
| 1658 case IDS_MOVE_RIGHT: | 1696 case ui::TextEditCommand::MOVE_RIGHT: |
| 1659 model_->MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_RIGHT, false); | 1697 model_->MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_RIGHT, false); |
| 1660 break; | 1698 break; |
| 1661 case IDS_MOVE_RIGHT_AND_MODIFY_SELECTION: | 1699 case ui::TextEditCommand::MOVE_RIGHT_AND_MODIFY_SELECTION: |
| 1662 model_->MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_RIGHT, true); | 1700 model_->MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_RIGHT, true); |
| 1663 break; | 1701 break; |
| 1664 case IDS_MOVE_WORD_LEFT: | 1702 case ui::TextEditCommand::MOVE_WORD_LEFT: |
| 1665 model_->MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_LEFT, false); | 1703 model_->MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_LEFT, false); |
| 1666 break; | 1704 break; |
| 1667 case IDS_MOVE_WORD_LEFT_AND_MODIFY_SELECTION: | 1705 case ui::TextEditCommand::MOVE_WORD_LEFT_AND_MODIFY_SELECTION: |
| 1668 model_->MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_LEFT, true); | 1706 model_->MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_LEFT, true); |
| 1669 break; | 1707 break; |
| 1670 case IDS_MOVE_WORD_RIGHT: | 1708 case ui::TextEditCommand::MOVE_WORD_RIGHT: |
| 1671 model_->MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_RIGHT, false); | 1709 model_->MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_RIGHT, false); |
| 1672 break; | 1710 break; |
| 1673 case IDS_MOVE_WORD_RIGHT_AND_MODIFY_SELECTION: | 1711 case ui::TextEditCommand::MOVE_WORD_RIGHT_AND_MODIFY_SELECTION: |
| 1674 model_->MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_RIGHT, true); | 1712 model_->MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_RIGHT, true); |
| 1675 break; | 1713 break; |
| 1676 case IDS_MOVE_TO_BEGINNING_OF_LINE: | 1714 case ui::TextEditCommand::MOVE_TO_BEGINNING_OF_LINE: |
| 1677 model_->MoveCursor(gfx::LINE_BREAK, begin, false); | 1715 model_->MoveCursor(gfx::LINE_BREAK, begin, false); |
| 1678 break; | 1716 break; |
| 1679 case IDS_MOVE_TO_BEGINNING_OF_LINE_AND_MODIFY_SELECTION: | 1717 case ui::TextEditCommand::MOVE_TO_BEGINNING_OF_LINE_AND_MODIFY_SELECTION: |
| 1680 model_->MoveCursor(gfx::LINE_BREAK, begin, true); | 1718 model_->MoveCursor(gfx::LINE_BREAK, begin, true); |
| 1681 break; | 1719 break; |
| 1682 case IDS_MOVE_TO_END_OF_LINE: | 1720 case ui::TextEditCommand::MOVE_TO_END_OF_LINE: |
| 1683 model_->MoveCursor(gfx::LINE_BREAK, end, false); | 1721 model_->MoveCursor(gfx::LINE_BREAK, end, false); |
| 1684 break; | 1722 break; |
| 1685 case IDS_MOVE_TO_END_OF_LINE_AND_MODIFY_SELECTION: | 1723 case ui::TextEditCommand::MOVE_TO_END_OF_LINE_AND_MODIFY_SELECTION: |
| 1686 model_->MoveCursor(gfx::LINE_BREAK, end, true); | 1724 model_->MoveCursor(gfx::LINE_BREAK, end, true); |
| 1687 break; | 1725 break; |
| 1688 default: | 1726 case ui::TextEditCommand::MOVE_UP: |
| 1727 case ui::TextEditCommand::MOVE_DOWN: |
| 1728 case ui::TextEditCommand::INVALID_COMMAND: |
| 1689 NOTREACHED(); | 1729 NOTREACHED(); |
| 1690 break; | 1730 break; |
| 1691 } | 1731 } |
| 1692 | 1732 |
| 1693 cursor_changed |= GetSelectionModel() != selection_model; | 1733 cursor_changed |= GetSelectionModel() != selection_model; |
| 1694 if (cursor_changed) | 1734 if (cursor_changed) |
| 1695 UpdateSelectionClipboard(); | 1735 UpdateSelectionClipboard(); |
| 1696 UpdateAfterChange(text_changed, cursor_changed); | 1736 UpdateAfterChange(text_changed, cursor_changed); |
| 1697 OnAfterUserAction(); | 1737 OnAfterUserAction(); |
| 1698 } | 1738 } |
| (...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1952 RequestFocus(); | 1992 RequestFocus(); |
| 1953 model_->MoveCursorTo(mouse); | 1993 model_->MoveCursorTo(mouse); |
| 1954 if (!selection_clipboard_text.empty()) { | 1994 if (!selection_clipboard_text.empty()) { |
| 1955 model_->InsertText(selection_clipboard_text); | 1995 model_->InsertText(selection_clipboard_text); |
| 1956 UpdateAfterChange(true, true); | 1996 UpdateAfterChange(true, true); |
| 1957 } | 1997 } |
| 1958 OnAfterUserAction(); | 1998 OnAfterUserAction(); |
| 1959 } | 1999 } |
| 1960 | 2000 |
| 1961 } // namespace views | 2001 } // namespace views |
| OLD | NEW |