Index: ui/views/controls/textfield/textfield.cc |
diff --git a/ui/views/controls/textfield/textfield.cc b/ui/views/controls/textfield/textfield.cc |
index b31dd2d0737218a3d623dd54b9eb3ba9f2be0594..bf0540a0a5f8b9e1d29fcd9e297ae2f7de25c1b3 100644 |
--- a/ui/views/controls/textfield/textfield.cc |
+++ b/ui/views/controls/textfield/textfield.cc |
@@ -61,8 +61,6 @@ namespace { |
// Default placeholder text color. |
const SkColor kDefaultPlaceholderTextColor = SK_ColorLTGRAY; |
-const int kNoCommand = 0; |
- |
void ConvertRectToScreen(const View* src, gfx::Rect* r) { |
DCHECK(src); |
@@ -84,9 +82,9 @@ int GetDragSelectionDelay() { |
} |
// Get the default command for a given key |event|. |
-int GetCommandForKeyEvent(const ui::KeyEvent& event) { |
+ui::TextEditCommand GetCommandForKeyEvent(const ui::KeyEvent& event) { |
if (event.type() != ui::ET_KEY_PRESSED || event.IsUnicodeKeyCode()) |
- return kNoCommand; |
+ return ui::TextEditCommand::INVALID_COMMAND; |
const bool shift = event.IsShiftDown(); |
const bool control = event.IsControlDown(); |
@@ -94,151 +92,173 @@ int GetCommandForKeyEvent(const ui::KeyEvent& event) { |
switch (event.key_code()) { |
case ui::VKEY_Z: |
if (control && !shift && !alt) |
- return IDS_APP_UNDO; |
- return (control && shift && !alt) ? IDS_APP_REDO : kNoCommand; |
+ return ui::TextEditCommand::UNDO; |
+ return (control && shift && !alt) ? ui::TextEditCommand::REDO |
+ : ui::TextEditCommand::INVALID_COMMAND; |
case ui::VKEY_Y: |
- return (control && !alt) ? IDS_APP_REDO : kNoCommand; |
+ return (control && !alt) ? ui::TextEditCommand::REDO |
+ : ui::TextEditCommand::INVALID_COMMAND; |
case ui::VKEY_A: |
- return (control && !alt) ? IDS_APP_SELECT_ALL : kNoCommand; |
+ return (control && !alt) ? ui::TextEditCommand::SELECT_ALL |
+ : ui::TextEditCommand::INVALID_COMMAND; |
case ui::VKEY_X: |
- return (control && !alt) ? IDS_APP_CUT : kNoCommand; |
+ return (control && !alt) ? ui::TextEditCommand::CUT |
+ : ui::TextEditCommand::INVALID_COMMAND; |
case ui::VKEY_C: |
- return (control && !alt) ? IDS_APP_COPY : kNoCommand; |
+ return (control && !alt) ? ui::TextEditCommand::COPY |
+ : ui::TextEditCommand::INVALID_COMMAND; |
case ui::VKEY_V: |
- return (control && !alt) ? IDS_APP_PASTE : kNoCommand; |
+ return (control && !alt) ? ui::TextEditCommand::PASTE |
+ : ui::TextEditCommand::INVALID_COMMAND; |
case ui::VKEY_RIGHT: |
// Ignore alt+right, which may be a browser navigation shortcut. |
if (alt) |
- return kNoCommand; |
+ return ui::TextEditCommand::INVALID_COMMAND; |
if (!shift) |
- return control ? IDS_MOVE_WORD_RIGHT : IDS_MOVE_RIGHT; |
- return control ? IDS_MOVE_WORD_RIGHT_AND_MODIFY_SELECTION : |
- IDS_MOVE_RIGHT_AND_MODIFY_SELECTION; |
+ return control ? ui::TextEditCommand::MOVE_WORD_RIGHT |
+ : ui::TextEditCommand::MOVE_RIGHT; |
+ return control ? ui::TextEditCommand::MOVE_WORD_RIGHT_AND_MODIFY_SELECTION |
+ : ui::TextEditCommand::MOVE_RIGHT_AND_MODIFY_SELECTION; |
case ui::VKEY_LEFT: |
// Ignore alt+left, which may be a browser navigation shortcut. |
if (alt) |
- return kNoCommand; |
+ return ui::TextEditCommand::INVALID_COMMAND; |
if (!shift) |
- return control ? IDS_MOVE_WORD_LEFT : IDS_MOVE_LEFT; |
- return control ? IDS_MOVE_WORD_LEFT_AND_MODIFY_SELECTION : |
- IDS_MOVE_LEFT_AND_MODIFY_SELECTION; |
+ return control ? ui::TextEditCommand::MOVE_WORD_LEFT |
+ : ui::TextEditCommand::MOVE_LEFT; |
+ return control ? ui::TextEditCommand::MOVE_WORD_LEFT_AND_MODIFY_SELECTION |
+ : ui::TextEditCommand::MOVE_LEFT_AND_MODIFY_SELECTION; |
case ui::VKEY_HOME: |
- return shift ? IDS_MOVE_TO_BEGINNING_OF_LINE_AND_MODIFY_SELECTION : |
- IDS_MOVE_TO_BEGINNING_OF_LINE; |
+ return shift ? ui::TextEditCommand:: |
+ MOVE_TO_BEGINNING_OF_LINE_AND_MODIFY_SELECTION |
+ : ui::TextEditCommand::MOVE_TO_BEGINNING_OF_LINE; |
case ui::VKEY_END: |
- return shift ? IDS_MOVE_TO_END_OF_LINE_AND_MODIFY_SELECTION : |
- IDS_MOVE_TO_END_OF_LINE; |
+ return shift |
+ ? ui::TextEditCommand::MOVE_TO_END_OF_LINE_AND_MODIFY_SELECTION |
+ : ui::TextEditCommand::MOVE_TO_END_OF_LINE; |
case ui::VKEY_BACK: |
if (!control) |
- return IDS_DELETE_BACKWARD; |
+ return ui::TextEditCommand::DELETE_BACKWARD; |
#if defined(OS_LINUX) |
// Only erase by line break on Linux and ChromeOS. |
if (shift) |
- return IDS_DELETE_TO_BEGINNING_OF_LINE; |
+ return ui::TextEditCommand::DELETE_TO_BEGINNING_OF_LINE; |
#endif |
- return IDS_DELETE_WORD_BACKWARD; |
+ return ui::TextEditCommand::DELETE_WORD_BACKWARD; |
case ui::VKEY_DELETE: |
#if defined(OS_LINUX) |
// Only erase by line break on Linux and ChromeOS. |
if (shift && control) |
- return IDS_DELETE_TO_END_OF_LINE; |
+ return ui::TextEditCommand::DELETE_TO_END_OF_LINE; |
#endif |
if (control) |
- return IDS_DELETE_WORD_FORWARD; |
- return shift ? IDS_APP_CUT : IDS_DELETE_FORWARD; |
+ return ui::TextEditCommand::DELETE_WORD_FORWARD; |
+ return shift ? ui::TextEditCommand::CUT |
+ : ui::TextEditCommand::DELETE_FORWARD; |
case ui::VKEY_INSERT: |
if (control && !shift) |
- return IDS_APP_COPY; |
- return (shift && !control) ? IDS_APP_PASTE : kNoCommand; |
+ return ui::TextEditCommand::COPY; |
+ return (shift && !control) ? ui::TextEditCommand::PASTE |
+ : ui::TextEditCommand::INVALID_COMMAND; |
default: |
- return kNoCommand; |
+ return ui::TextEditCommand::INVALID_COMMAND; |
} |
} |
#if defined(OS_LINUX) && !defined(OS_CHROMEOS) |
// Convert a custom text edit |command| to the equivalent views command ID. |
-int GetViewsCommand(const ui::TextEditCommandAuraLinux& command, bool rtl) { |
+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
|
+ bool rtl) { |
const bool select = command.extend_selection(); |
switch (command.command_id()) { |
case ui::TextEditCommandAuraLinux::COPY: |
- return IDS_APP_COPY; |
+ return ui::TextEditCommand::COPY; |
case ui::TextEditCommandAuraLinux::CUT: |
- return IDS_APP_CUT; |
+ return ui::TextEditCommand::CUT; |
case ui::TextEditCommandAuraLinux::DELETE_BACKWARD: |
- return IDS_DELETE_BACKWARD; |
+ return ui::TextEditCommand::DELETE_BACKWARD; |
case ui::TextEditCommandAuraLinux::DELETE_FORWARD: |
- return IDS_DELETE_FORWARD; |
+ return ui::TextEditCommand::DELETE_FORWARD; |
case ui::TextEditCommandAuraLinux::DELETE_TO_BEGINING_OF_LINE: |
case ui::TextEditCommandAuraLinux::DELETE_TO_BEGINING_OF_PARAGRAPH: |
- return IDS_DELETE_TO_BEGINNING_OF_LINE; |
+ return ui::TextEditCommand::DELETE_TO_BEGINNING_OF_LINE; |
case ui::TextEditCommandAuraLinux::DELETE_TO_END_OF_LINE: |
case ui::TextEditCommandAuraLinux::DELETE_TO_END_OF_PARAGRAPH: |
- return IDS_DELETE_TO_END_OF_LINE; |
+ return ui::TextEditCommand::DELETE_TO_END_OF_LINE; |
case ui::TextEditCommandAuraLinux::DELETE_WORD_BACKWARD: |
- return IDS_DELETE_WORD_BACKWARD; |
+ return ui::TextEditCommand::DELETE_WORD_BACKWARD; |
case ui::TextEditCommandAuraLinux::DELETE_WORD_FORWARD: |
- return IDS_DELETE_WORD_FORWARD; |
+ return ui::TextEditCommand::DELETE_WORD_FORWARD; |
case ui::TextEditCommandAuraLinux::INSERT_TEXT: |
- return kNoCommand; |
+ return ui::TextEditCommand::INVALID_COMMAND; |
case ui::TextEditCommandAuraLinux::MOVE_BACKWARD: |
if (rtl) |
- return select ? IDS_MOVE_RIGHT_AND_MODIFY_SELECTION : IDS_MOVE_RIGHT; |
- return select ? IDS_MOVE_LEFT_AND_MODIFY_SELECTION : IDS_MOVE_LEFT; |
+ return select ? ui::TextEditCommand::MOVE_RIGHT_AND_MODIFY_SELECTION |
+ : ui::TextEditCommand::MOVE_RIGHT; |
+ return select ? ui::TextEditCommand::MOVE_LEFT_AND_MODIFY_SELECTION |
+ : ui::TextEditCommand::MOVE_LEFT; |
case ui::TextEditCommandAuraLinux::MOVE_DOWN: |
- return IDS_MOVE_DOWN; |
+ return ui::TextEditCommand::MOVE_DOWN; |
case ui::TextEditCommandAuraLinux::MOVE_FORWARD: |
if (rtl) |
- return select ? IDS_MOVE_LEFT_AND_MODIFY_SELECTION : IDS_MOVE_LEFT; |
- return select ? IDS_MOVE_RIGHT_AND_MODIFY_SELECTION : IDS_MOVE_RIGHT; |
+ return select ? ui::TextEditCommand::MOVE_LEFT_AND_MODIFY_SELECTION |
+ : ui::TextEditCommand::MOVE_LEFT; |
+ return select ? ui::TextEditCommand::MOVE_RIGHT_AND_MODIFY_SELECTION |
+ : ui::TextEditCommand::MOVE_RIGHT; |
case ui::TextEditCommandAuraLinux::MOVE_LEFT: |
- return select ? IDS_MOVE_LEFT_AND_MODIFY_SELECTION : IDS_MOVE_LEFT; |
+ return select ? ui::TextEditCommand::MOVE_LEFT_AND_MODIFY_SELECTION |
+ : ui::TextEditCommand::MOVE_LEFT; |
case ui::TextEditCommandAuraLinux::MOVE_PAGE_DOWN: |
case ui::TextEditCommandAuraLinux::MOVE_PAGE_UP: |
- return kNoCommand; |
+ return ui::TextEditCommand::INVALID_COMMAND; |
case ui::TextEditCommandAuraLinux::MOVE_RIGHT: |
- return select ? IDS_MOVE_RIGHT_AND_MODIFY_SELECTION : IDS_MOVE_RIGHT; |
+ return select ? ui::TextEditCommand::MOVE_RIGHT_AND_MODIFY_SELECTION |
+ : ui::TextEditCommand::MOVE_RIGHT; |
case ui::TextEditCommandAuraLinux::MOVE_TO_BEGINING_OF_DOCUMENT: |
case ui::TextEditCommandAuraLinux::MOVE_TO_BEGINING_OF_LINE: |
case ui::TextEditCommandAuraLinux::MOVE_TO_BEGINING_OF_PARAGRAPH: |
- return select ? IDS_MOVE_TO_BEGINNING_OF_LINE_AND_MODIFY_SELECTION : |
- IDS_MOVE_TO_BEGINNING_OF_LINE; |
+ return select ? ui::TextEditCommand:: |
+ MOVE_TO_BEGINNING_OF_LINE_AND_MODIFY_SELECTION |
+ : ui::TextEditCommand::MOVE_TO_BEGINNING_OF_LINE; |
case ui::TextEditCommandAuraLinux::MOVE_TO_END_OF_DOCUMENT: |
case ui::TextEditCommandAuraLinux::MOVE_TO_END_OF_LINE: |
case ui::TextEditCommandAuraLinux::MOVE_TO_END_OF_PARAGRAPH: |
- return select ? IDS_MOVE_TO_END_OF_LINE_AND_MODIFY_SELECTION : |
- IDS_MOVE_TO_END_OF_LINE; |
+ return select |
+ ? ui::TextEditCommand::MOVE_TO_END_OF_LINE_AND_MODIFY_SELECTION |
+ : ui::TextEditCommand::MOVE_TO_END_OF_LINE; |
case ui::TextEditCommandAuraLinux::MOVE_UP: |
- return IDS_MOVE_UP; |
+ return ui::TextEditCommand::MOVE_UP; |
case ui::TextEditCommandAuraLinux::MOVE_WORD_BACKWARD: |
if (rtl) { |
- return select ? IDS_MOVE_WORD_RIGHT_AND_MODIFY_SELECTION : |
- IDS_MOVE_WORD_RIGHT; |
+ return select |
+ ? ui::TextEditCommand::MOVE_WORD_RIGHT_AND_MODIFY_SELECTION |
+ : ui::TextEditCommand::MOVE_WORD_RIGHT; |
} |
- return select ? IDS_MOVE_WORD_LEFT_AND_MODIFY_SELECTION : |
- IDS_MOVE_WORD_LEFT; |
+ return select ? ui::TextEditCommand::MOVE_WORD_LEFT_AND_MODIFY_SELECTION |
+ : ui::TextEditCommand::MOVE_WORD_LEFT; |
case ui::TextEditCommandAuraLinux::MOVE_WORD_FORWARD: |
if (rtl) { |
- return select ? IDS_MOVE_WORD_LEFT_AND_MODIFY_SELECTION : |
- IDS_MOVE_WORD_LEFT; |
+ return select ? ui::TextEditCommand::MOVE_WORD_LEFT_AND_MODIFY_SELECTION |
+ : ui::TextEditCommand::MOVE_WORD_LEFT; |
} |
- return select ? IDS_MOVE_WORD_RIGHT_AND_MODIFY_SELECTION : |
- IDS_MOVE_WORD_RIGHT; |
+ return select ? ui::TextEditCommand::MOVE_WORD_RIGHT_AND_MODIFY_SELECTION |
+ : ui::TextEditCommand::MOVE_WORD_RIGHT; |
case ui::TextEditCommandAuraLinux::MOVE_WORD_LEFT: |
- return select ? IDS_MOVE_WORD_LEFT_AND_MODIFY_SELECTION : |
- IDS_MOVE_WORD_LEFT; |
+ return select ? ui::TextEditCommand::MOVE_WORD_LEFT_AND_MODIFY_SELECTION |
+ : ui::TextEditCommand::MOVE_WORD_LEFT; |
case ui::TextEditCommandAuraLinux::MOVE_WORD_RIGHT: |
- return select ? IDS_MOVE_WORD_RIGHT_AND_MODIFY_SELECTION : |
- IDS_MOVE_WORD_RIGHT; |
+ return select ? ui::TextEditCommand::MOVE_WORD_RIGHT_AND_MODIFY_SELECTION |
+ : ui::TextEditCommand::MOVE_WORD_RIGHT; |
case ui::TextEditCommandAuraLinux::PASTE: |
- return IDS_APP_PASTE; |
+ return ui::TextEditCommand::PASTE; |
case ui::TextEditCommandAuraLinux::SELECT_ALL: |
- return IDS_APP_SELECT_ALL; |
+ return ui::TextEditCommand::SELECT_ALL; |
case ui::TextEditCommandAuraLinux::SET_MARK: |
case ui::TextEditCommandAuraLinux::UNSELECT: |
case ui::TextEditCommandAuraLinux::INVALID_COMMAND: |
- return kNoCommand; |
+ return ui::TextEditCommand::INVALID_COMMAND; |
} |
- return kNoCommand; |
+ return ui::TextEditCommand::INVALID_COMMAND; |
} |
#endif |
@@ -247,6 +267,33 @@ const gfx::FontList& GetDefaultFontList() { |
return rb.GetFontListWithDelta(ui::kLabelFontSizeDelta); |
} |
+// Returns the equivalent ui::TextEditCommand for the given |command_id| |
+// corresponding to a context menu action. |
+ui::TextEditCommand GetTextEditCommandForMenuCommand(int command_id, |
+ bool has_selection) { |
+ switch (command_id) { |
+ case IDS_APP_UNDO: |
+ return ui::TextEditCommand::UNDO; |
+ case IDS_APP_CUT: |
+ return ui::TextEditCommand::CUT; |
+ case IDS_APP_COPY: |
+ return ui::TextEditCommand::COPY; |
+ case IDS_APP_PASTE: |
+ return ui::TextEditCommand::PASTE; |
+ case IDS_APP_DELETE: |
+ // The menu command IDS_APP_DELETE should only work during an active |
+ // selection. |
+ if (has_selection) |
+ return ui::TextEditCommand::DELETE_FORWARD; |
+ break; |
+ case IDS_APP_SELECT_ALL: |
+ return ui::TextEditCommand::SELECT_ALL; |
+ default: |
+ break; |
+ } |
+ return ui::TextEditCommand::INVALID_COMMAND; |
+} |
+ |
} // namespace |
// static |
@@ -267,7 +314,7 @@ size_t Textfield::GetCaretBlinkMs() { |
Textfield::Textfield() |
: model_(new TextfieldModel(this)), |
controller_(NULL), |
- scheduled_edit_command_(kNoCommand), |
+ scheduled_edit_command_(ui::TextEditCommand::INVALID_COMMAND), |
read_only_(false), |
default_width_in_chars_(0), |
use_default_text_color_(true), |
@@ -569,10 +616,6 @@ void Textfield::SetAccessibleName(const base::string16& name) { |
accessible_name_ = name; |
} |
-void Textfield::ExecuteCommand(int command_id) { |
- ExecuteCommand(command_id, ui::EF_NONE); |
-} |
- |
bool Textfield::HasTextBeingDragged() { |
return initiating_drag_; |
} |
@@ -696,8 +739,8 @@ void Textfield::OnMouseReleased(const ui::MouseEvent& event) { |
} |
bool Textfield::OnKeyPressed(const ui::KeyEvent& event) { |
- int edit_command = scheduled_edit_command_; |
- scheduled_edit_command_ = kNoCommand; |
+ ui::TextEditCommand edit_command = scheduled_edit_command_; |
+ scheduled_edit_command_ = ui::TextEditCommand::INVALID_COMMAND; |
// Since HandleKeyEvent() might destroy |this|, get a weak pointer and verify |
// it isn't null before proceeding. |
@@ -715,9 +758,11 @@ bool Textfield::OnKeyPressed(const ui::KeyEvent& event) { |
if (!handled && delegate && delegate->MatchEvent(event, &commands)) { |
const bool rtl = GetTextDirection() == base::i18n::RIGHT_TO_LEFT; |
for (size_t i = 0; i < commands.size(); ++i) { |
- const int command = GetViewsCommand(commands[i], rtl); |
- if (IsCommandIdEnabled(command)) { |
- ExecuteCommand(command); |
+ ui::TextEditCommand command = GetViewsCommand(commands[i], rtl); |
+ // Ask do we want to use a virtual call? (probably not because we are |
+ // bubbling up.) |
+ if (Textfield::IsEditCommandEnabled(command)) { |
tapted
2016/05/31 04:18:17
Using the Textfield:: qualifier when not in that m
|
+ Textfield::ExecuteEditCommand(command); |
handled = true; |
} |
} |
@@ -725,11 +770,11 @@ bool Textfield::OnKeyPressed(const ui::KeyEvent& event) { |
} |
#endif |
- if (edit_command == kNoCommand) |
+ if (edit_command == ui::TextEditCommand::INVALID_COMMAND) |
edit_command = GetCommandForKeyEvent(event); |
- if (!handled && IsCommandIdEnabled(edit_command)) { |
- ExecuteCommand(edit_command); |
+ if (!handled && Textfield::IsEditCommandEnabled(edit_command)) { |
+ Textfield::ExecuteEditCommand(edit_command); |
handled = true; |
} |
return handled; |
@@ -830,7 +875,7 @@ void Textfield::OnGestureEvent(ui::GestureEvent* event) { |
bool Textfield::AcceleratorPressed(const ui::Accelerator& accelerator) { |
ui::KeyEvent event(accelerator.type(), accelerator.key_code(), |
accelerator.modifiers()); |
- ExecuteCommand(GetCommandForKeyEvent(event)); |
+ ExecuteEditCommand(GetCommandForKeyEvent(event)); |
return true; |
} |
@@ -851,7 +896,13 @@ bool Textfield::SkipDefaultKeyEventProcessing(const ui::KeyEvent& event) { |
if (delegate && delegate->MatchEvent(event, &commands)) { |
const bool rtl = GetTextDirection() == base::i18n::RIGHT_TO_LEFT; |
for (size_t i = 0; i < commands.size(); ++i) |
- if (IsCommandIdEnabled(GetViewsCommand(commands[i], rtl))) |
+ // Ask virtual, probably yes. |
+ // Why the different codepaths for windows and Linux. On Linux, a Ctrl+V |
+ // on a omnibox is processed via OnKeyPressed, but on Windows via |
+ // Textfield::AcceleratorPressed. - |
+ // https://codereview.chromium.org/213673009 |
+ // Shouldn't we do the same on other platforms. |
+ if (IsEditCommandEnabled(GetViewsCommand(commands[i], rtl))) |
return true; |
} |
#endif |
@@ -1224,49 +1275,8 @@ bool Textfield::IsCommandIdChecked(int command_id) const { |
} |
bool Textfield::IsCommandIdEnabled(int command_id) const { |
- base::string16 result; |
- bool editable = !read_only(); |
- bool readable = text_input_type_ != ui::TEXT_INPUT_TYPE_PASSWORD; |
- switch (command_id) { |
- case IDS_APP_UNDO: |
- return editable && model_->CanUndo(); |
- case IDS_APP_REDO: |
- return editable && model_->CanRedo(); |
- case IDS_APP_CUT: |
- return editable && readable && model_->HasSelection(); |
- case IDS_APP_COPY: |
- return readable && model_->HasSelection(); |
- case IDS_APP_PASTE: |
- ui::Clipboard::GetForCurrentThread()->ReadText( |
- ui::CLIPBOARD_TYPE_COPY_PASTE, &result); |
- return editable && !result.empty(); |
- case IDS_APP_DELETE: |
- return editable && model_->HasSelection(); |
- case IDS_APP_SELECT_ALL: |
- return !text().empty(); |
- case IDS_DELETE_FORWARD: |
- case IDS_DELETE_BACKWARD: |
- case IDS_DELETE_TO_BEGINNING_OF_LINE: |
- case IDS_DELETE_TO_END_OF_LINE: |
- case IDS_DELETE_WORD_BACKWARD: |
- case IDS_DELETE_WORD_FORWARD: |
- return editable; |
- case IDS_MOVE_LEFT: |
- case IDS_MOVE_LEFT_AND_MODIFY_SELECTION: |
- case IDS_MOVE_RIGHT: |
- case IDS_MOVE_RIGHT_AND_MODIFY_SELECTION: |
- case IDS_MOVE_WORD_LEFT: |
- case IDS_MOVE_WORD_LEFT_AND_MODIFY_SELECTION: |
- case IDS_MOVE_WORD_RIGHT: |
- case IDS_MOVE_WORD_RIGHT_AND_MODIFY_SELECTION: |
- case IDS_MOVE_TO_BEGINNING_OF_LINE: |
- case IDS_MOVE_TO_BEGINNING_OF_LINE_AND_MODIFY_SELECTION: |
- case IDS_MOVE_TO_END_OF_LINE: |
- case IDS_MOVE_TO_END_OF_LINE_AND_MODIFY_SELECTION: |
- return true; |
- default: |
- return false; |
- } |
+ return IsEditCommandEnabled( |
+ GetTextEditCommandForMenuCommand(command_id, HasSelection())); |
} |
bool Textfield::GetAcceleratorForCommandId(int command_id, |
@@ -1298,124 +1308,8 @@ bool Textfield::GetAcceleratorForCommandId(int command_id, |
} |
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,
|
- DestroyTouchSelection(); |
- |
- // Some codepaths may bypass GetCommandForKeyEvent, so any selection-dependent |
- // modifications of the command should happen here. |
- if (HasSelection()) { |
- switch (command_id) { |
- case IDS_DELETE_WORD_BACKWARD: |
- case IDS_DELETE_TO_BEGINNING_OF_LINE: |
- command_id = IDS_DELETE_BACKWARD; |
- break; |
- case IDS_DELETE_WORD_FORWARD: |
- case IDS_DELETE_TO_END_OF_LINE: |
- command_id = IDS_DELETE_FORWARD; |
- break; |
- } |
- } |
- |
- if (!IsCommandIdEnabled(command_id)) |
- return; |
- |
- bool text_changed = false; |
- bool cursor_changed = false; |
- bool rtl = GetTextDirection() == base::i18n::RIGHT_TO_LEFT; |
- gfx::VisualCursorDirection begin = rtl ? gfx::CURSOR_RIGHT : gfx::CURSOR_LEFT; |
- gfx::VisualCursorDirection end = rtl ? gfx::CURSOR_LEFT : gfx::CURSOR_RIGHT; |
- gfx::SelectionModel selection_model = GetSelectionModel(); |
- |
- OnBeforeUserAction(); |
- switch (command_id) { |
- case IDS_APP_UNDO: |
- text_changed = cursor_changed = model_->Undo(); |
- break; |
- case IDS_APP_REDO: |
- text_changed = cursor_changed = model_->Redo(); |
- break; |
- case IDS_APP_CUT: |
- text_changed = cursor_changed = Cut(); |
- break; |
- case IDS_APP_COPY: |
- Copy(); |
- break; |
- case IDS_APP_PASTE: |
- text_changed = cursor_changed = Paste(); |
- break; |
- case IDS_APP_DELETE: |
- text_changed = cursor_changed = model_->Delete(); |
- break; |
- case IDS_APP_SELECT_ALL: |
- SelectAll(false); |
- break; |
- case IDS_DELETE_BACKWARD: |
- text_changed = cursor_changed = model_->Backspace(); |
- break; |
- case IDS_DELETE_FORWARD: |
- text_changed = cursor_changed = model_->Delete(); |
- break; |
- case IDS_DELETE_TO_END_OF_LINE: |
- model_->MoveCursor(gfx::LINE_BREAK, end, true); |
- text_changed = cursor_changed = model_->Delete(); |
- break; |
- case IDS_DELETE_TO_BEGINNING_OF_LINE: |
- model_->MoveCursor(gfx::LINE_BREAK, begin, true); |
- text_changed = cursor_changed = model_->Backspace(); |
- break; |
- case IDS_DELETE_WORD_BACKWARD: |
- model_->MoveCursor(gfx::WORD_BREAK, begin, true); |
- text_changed = cursor_changed = model_->Backspace(); |
- break; |
- case IDS_DELETE_WORD_FORWARD: |
- model_->MoveCursor(gfx::WORD_BREAK, end, true); |
- text_changed = cursor_changed = model_->Delete(); |
- break; |
- case IDS_MOVE_LEFT: |
- model_->MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_LEFT, false); |
- break; |
- case IDS_MOVE_LEFT_AND_MODIFY_SELECTION: |
- model_->MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_LEFT, true); |
- break; |
- case IDS_MOVE_RIGHT: |
- model_->MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_RIGHT, false); |
- break; |
- case IDS_MOVE_RIGHT_AND_MODIFY_SELECTION: |
- model_->MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_RIGHT, true); |
- break; |
- case IDS_MOVE_WORD_LEFT: |
- model_->MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_LEFT, false); |
- break; |
- case IDS_MOVE_WORD_LEFT_AND_MODIFY_SELECTION: |
- model_->MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_LEFT, true); |
- break; |
- case IDS_MOVE_WORD_RIGHT: |
- model_->MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_RIGHT, false); |
- break; |
- case IDS_MOVE_WORD_RIGHT_AND_MODIFY_SELECTION: |
- model_->MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_RIGHT, true); |
- break; |
- case IDS_MOVE_TO_BEGINNING_OF_LINE: |
- model_->MoveCursor(gfx::LINE_BREAK, begin, false); |
- break; |
- case IDS_MOVE_TO_BEGINNING_OF_LINE_AND_MODIFY_SELECTION: |
- model_->MoveCursor(gfx::LINE_BREAK, begin, true); |
- break; |
- case IDS_MOVE_TO_END_OF_LINE: |
- model_->MoveCursor(gfx::LINE_BREAK, end, false); |
- break; |
- case IDS_MOVE_TO_END_OF_LINE_AND_MODIFY_SELECTION: |
- model_->MoveCursor(gfx::LINE_BREAK, end, true); |
- break; |
- default: |
- NOTREACHED(); |
- break; |
- } |
- |
- cursor_changed |= GetSelectionModel() != selection_model; |
- if (cursor_changed) |
- UpdateSelectionClipboard(); |
- UpdateAfterChange(text_changed, cursor_changed); |
- OnAfterUserAction(); |
+ ExecuteEditCommand( |
+ GetTextEditCommandForMenuCommand(command_id, HasSelection())); |
} |
//////////////////////////////////////////////////////////////////////////////// |
@@ -1637,13 +1531,64 @@ void Textfield::ExtendSelectionAndDelete(size_t before, size_t after) { |
void Textfield::EnsureCaretInRect(const gfx::Rect& rect) {} |
-bool Textfield::IsEditCommandEnabled(int command_id) { |
- return IsCommandIdEnabled(command_id); |
+bool Textfield::IsEditCommandEnabled(ui::TextEditCommand command) const { |
+ base::string16 result; |
+ bool editable = !read_only(); |
+ bool readable = text_input_type_ != ui::TEXT_INPUT_TYPE_PASSWORD; |
+ switch (command) { |
+ case ui::TextEditCommand::INVALID_COMMAND: |
+ return false; |
+ case ui::TextEditCommand::UNDO: |
+ return editable && model_->CanUndo(); |
+ case ui::TextEditCommand::REDO: |
+ return editable && model_->CanRedo(); |
+ case ui::TextEditCommand::CUT: |
+ return editable && readable && model_->HasSelection(); |
+ case ui::TextEditCommand::COPY: |
+ return readable && model_->HasSelection(); |
+ case ui::TextEditCommand::PASTE: |
+ ui::Clipboard::GetForCurrentThread()->ReadText( |
+ ui::CLIPBOARD_TYPE_COPY_PASTE, &result); |
+ return editable && !result.empty(); |
+ case ui::TextEditCommand::SELECT_ALL: |
+ return !text().empty(); |
+ case ui::TextEditCommand::DELETE_BACKWARD: |
+ case ui::TextEditCommand::DELETE_FORWARD: |
+ case ui::TextEditCommand::DELETE_TO_END_OF_LINE: |
+ case ui::TextEditCommand::DELETE_TO_BEGINNING_OF_LINE: |
+ case ui::TextEditCommand::DELETE_WORD_BACKWARD: |
+ case ui::TextEditCommand::DELETE_WORD_FORWARD: |
+ return editable; |
+ case ui::TextEditCommand::MOVE_LEFT: |
+ case ui::TextEditCommand::MOVE_LEFT_AND_MODIFY_SELECTION: |
+ case ui::TextEditCommand::MOVE_RIGHT: |
+ case ui::TextEditCommand::MOVE_RIGHT_AND_MODIFY_SELECTION: |
+ case ui::TextEditCommand::MOVE_WORD_LEFT: |
+ case ui::TextEditCommand::MOVE_WORD_LEFT_AND_MODIFY_SELECTION: |
+ case ui::TextEditCommand::MOVE_WORD_RIGHT: |
+ case ui::TextEditCommand::MOVE_WORD_RIGHT_AND_MODIFY_SELECTION: |
+ case ui::TextEditCommand::MOVE_TO_BEGINNING_OF_LINE: |
+ case ui::TextEditCommand::MOVE_TO_BEGINNING_OF_LINE_AND_MODIFY_SELECTION: |
+ case ui::TextEditCommand::MOVE_TO_END_OF_LINE: |
+ case ui::TextEditCommand::MOVE_TO_END_OF_LINE_AND_MODIFY_SELECTION: |
+ return true; |
+ // Added code here. |
tapted
2016/05/31 04:18:16
Reviewing changes like this is quite tricky - I th
|
+ case ui::TextEditCommand::MOVE_UP: |
+ case ui::TextEditCommand::MOVE_DOWN: |
+ case ui::TextEditCommand::MOVE_PAGE_UP: |
+ case ui::TextEditCommand::MOVE_PAGE_DOWN: |
+#if defined(OS_MACOSX) |
+ return true; |
+#else |
+ return false; |
+#endif |
+ } |
+ return false; |
} |
-void Textfield::SetEditCommandForNextKeyEvent(int command_id) { |
- DCHECK_EQ(kNoCommand, scheduled_edit_command_); |
- scheduled_edit_command_ = command_id; |
+void Textfield::SetEditCommandForNextKeyEvent(ui::TextEditCommand command) { |
+ DCHECK(scheduled_edit_command_ == ui::TextEditCommand::INVALID_COMMAND); |
+ scheduled_edit_command_ = command; |
} |
//////////////////////////////////////////////////////////////////////////////// |
@@ -1673,6 +1618,142 @@ base::string16 Textfield::GetSelectionClipboardText() const { |
return selection_clipboard_text; |
} |
+void Textfield::ExecuteEditCommand(ui::TextEditCommand command) { |
+ if (!Textfield::IsEditCommandEnabled(command)) |
+ return; |
+ |
+ DestroyTouchSelection(); |
+ |
+ // Some codepaths may bypass GetCommandForKeyEvent, so any selection-dependent |
+ // modifications of the command should happen here. |
+ if (HasSelection()) { |
+ switch (command) { |
+ case ui::TextEditCommand::DELETE_WORD_BACKWARD: |
+ case ui::TextEditCommand::DELETE_TO_BEGINNING_OF_LINE: |
+ command = ui::TextEditCommand::DELETE_BACKWARD; |
+ break; |
+ case ui::TextEditCommand::DELETE_WORD_FORWARD: |
+ case ui::TextEditCommand::DELETE_TO_END_OF_LINE: |
+ command = ui::TextEditCommand::DELETE_FORWARD; |
+ break; |
+ default: |
+ break; |
+ } |
+ } |
+ |
+// Added code here. |
+#if defined(OS_MACOSX) |
+ switch (command) { |
+ case ui::TextEditCommand::MOVE_UP: |
+ case ui::TextEditCommand::MOVE_PAGE_UP: |
+ command = ui::TextEditCommand::MOVE_TO_BEGINNING_OF_LINE; |
+ break; |
+ case ui::TextEditCommand::MOVE_DOWN: |
+ case ui::TextEditCommand::MOVE_PAGE_DOWN: |
+ command = ui::TextEditCommand::MOVE_TO_END_OF_LINE; |
+ break; |
+ default: |
+ break; |
+ } |
+#endif |
+ |
+ bool text_changed = false; |
+ bool cursor_changed = false; |
+ bool rtl = GetTextDirection() == base::i18n::RIGHT_TO_LEFT; |
+ gfx::VisualCursorDirection begin = rtl ? gfx::CURSOR_RIGHT : gfx::CURSOR_LEFT; |
+ gfx::VisualCursorDirection end = rtl ? gfx::CURSOR_LEFT : gfx::CURSOR_RIGHT; |
+ gfx::SelectionModel selection_model = GetSelectionModel(); |
+ |
+ OnBeforeUserAction(); |
+ switch (command) { |
+ case ui::TextEditCommand::UNDO: |
+ text_changed = cursor_changed = model_->Undo(); |
+ break; |
+ case ui::TextEditCommand::REDO: |
+ text_changed = cursor_changed = model_->Redo(); |
+ break; |
+ case ui::TextEditCommand::CUT: |
+ text_changed = cursor_changed = Cut(); |
+ break; |
+ case ui::TextEditCommand::COPY: |
+ Copy(); |
+ break; |
+ case ui::TextEditCommand::PASTE: |
+ text_changed = cursor_changed = Paste(); |
+ break; |
+ case ui::TextEditCommand::SELECT_ALL: |
+ SelectAll(false); |
+ break; |
+ case ui::TextEditCommand::DELETE_BACKWARD: |
+ text_changed = cursor_changed = model_->Backspace(); |
+ break; |
+ case ui::TextEditCommand::DELETE_FORWARD: |
+ text_changed = cursor_changed = model_->Delete(); |
+ break; |
+ case ui::TextEditCommand::DELETE_TO_END_OF_LINE: |
+ model_->MoveCursor(gfx::LINE_BREAK, end, true); |
+ text_changed = cursor_changed = model_->Delete(); |
+ break; |
+ case ui::TextEditCommand::DELETE_TO_BEGINNING_OF_LINE: |
+ model_->MoveCursor(gfx::LINE_BREAK, begin, true); |
+ text_changed = cursor_changed = model_->Backspace(); |
+ break; |
+ case ui::TextEditCommand::DELETE_WORD_BACKWARD: |
+ model_->MoveCursor(gfx::WORD_BREAK, begin, true); |
+ text_changed = cursor_changed = model_->Backspace(); |
+ break; |
+ case ui::TextEditCommand::DELETE_WORD_FORWARD: |
+ model_->MoveCursor(gfx::WORD_BREAK, end, true); |
+ text_changed = cursor_changed = model_->Delete(); |
+ break; |
+ case ui::TextEditCommand::MOVE_LEFT: |
+ model_->MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_LEFT, false); |
+ break; |
+ case ui::TextEditCommand::MOVE_LEFT_AND_MODIFY_SELECTION: |
+ model_->MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_LEFT, true); |
+ break; |
+ case ui::TextEditCommand::MOVE_RIGHT: |
+ model_->MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_RIGHT, false); |
+ break; |
+ case ui::TextEditCommand::MOVE_RIGHT_AND_MODIFY_SELECTION: |
+ model_->MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_RIGHT, true); |
+ break; |
+ case ui::TextEditCommand::MOVE_WORD_LEFT: |
+ model_->MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_LEFT, false); |
+ break; |
+ case ui::TextEditCommand::MOVE_WORD_LEFT_AND_MODIFY_SELECTION: |
+ model_->MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_LEFT, true); |
+ break; |
+ case ui::TextEditCommand::MOVE_WORD_RIGHT: |
+ model_->MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_RIGHT, false); |
+ break; |
+ case ui::TextEditCommand::MOVE_WORD_RIGHT_AND_MODIFY_SELECTION: |
+ model_->MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_RIGHT, true); |
+ break; |
+ case ui::TextEditCommand::MOVE_TO_BEGINNING_OF_LINE: |
+ model_->MoveCursor(gfx::LINE_BREAK, begin, false); |
+ break; |
+ case ui::TextEditCommand::MOVE_TO_BEGINNING_OF_LINE_AND_MODIFY_SELECTION: |
+ model_->MoveCursor(gfx::LINE_BREAK, begin, true); |
+ break; |
+ case ui::TextEditCommand::MOVE_TO_END_OF_LINE: |
+ model_->MoveCursor(gfx::LINE_BREAK, end, false); |
+ break; |
+ case ui::TextEditCommand::MOVE_TO_END_OF_LINE_AND_MODIFY_SELECTION: |
+ model_->MoveCursor(gfx::LINE_BREAK, end, true); |
+ break; |
+ default: |
+ NOTREACHED(); |
+ break; |
+ } |
+ |
+ cursor_changed |= GetSelectionModel() != selection_model; |
+ if (cursor_changed) |
+ UpdateSelectionClipboard(); |
+ UpdateAfterChange(text_changed, cursor_changed); |
+ OnAfterUserAction(); |
+} |
+ |
//////////////////////////////////////////////////////////////////////////////// |
// Textfield, private: |