15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/textfield/textfield.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/debug/trace_event.h" 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "grit/ui_strings.h" 11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/accessibility/ax_view_state.h" 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/base/clipboard/scoped_clipboard_writer.h" 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/base/cursor/cursor.h" 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/base/dragdrop/drag_drop_types.h" 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/base/dragdrop/drag_utils.h" 16a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/base/ui_base_switches_util.h" 18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/compositor/scoped_animation_duration_scale_mode.h" 19d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h" 20d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/keycodes/keyboard_codes.h" 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/gfx/canvas.h" 22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/gfx/display.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/insets.h" 24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/gfx/screen.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/native_theme/native_theme.h" 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/views/background.h" 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/views/controls/focusable_border.h" 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/views/controls/label.h" 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/views/controls/menu/menu_runner.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/native/native_view_host.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/textfield/textfield_controller.h" 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/views/drag_utils.h" 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/views/ime/input_method.h" 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/views/metrics.h" 355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ui/views/native_cursor.h" 36a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ui/views/painter.h" 37868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ui/views/views_delegate.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(OS_WIN) 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/win/win_util.h" 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 44e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#if defined(OS_LINUX) && !defined(OS_CHROMEOS) 45e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "base/strings/utf_string_conversions.h" 46c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ui/events/linux/text_edit_command_auralinux.h" 47c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ui/events/linux/text_edit_key_bindings_delegate_auralinux.h" 48e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#endif 49e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace views { 51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Default placeholder text color. 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const SkColor kDefaultPlaceholderTextColor = SK_ColorLTGRAY; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochconst int kNoCommand = 0; 58effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void ConvertRectToScreen(const View* src, gfx::Rect* r) { 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(src); 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Point new_origin = r->origin(); 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) View::ConvertPointToScreen(src, &new_origin); 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) r->set_origin(new_origin); 65a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 66a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Get the drag selection timer delay, respecting animation scaling for testing. 68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)int GetDragSelectionDelay() { 69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) switch (ui::ScopedAnimationDurationScaleMode::duration_scale_mode()) { 70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case ui::ScopedAnimationDurationScaleMode::NORMAL_DURATION: return 100; 71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case ui::ScopedAnimationDurationScaleMode::FAST_DURATION: return 25; 72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case ui::ScopedAnimationDurationScaleMode::SLOW_DURATION: return 400; 73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case ui::ScopedAnimationDurationScaleMode::ZERO_DURATION: return 0; 74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return 100; 76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Get the default command for a given key |event| and selection state. 79effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochint GetCommandForKeyEvent(const ui::KeyEvent& event, bool has_selection) { 80effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (event.type() != ui::ET_KEY_PRESSED || event.IsUnicodeKeyCode()) 81effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return kNoCommand; 82effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 83effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const bool shift = event.IsShiftDown(); 84effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const bool control = event.IsControlDown(); 85effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const bool alt = event.IsAltDown() || event.IsAltGrDown(); 86effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch switch (event.key_code()) { 87effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case ui::VKEY_Z: 88effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (control && !shift && !alt) 89effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return IDS_APP_UNDO; 90effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return (control && shift && !alt) ? IDS_APP_REDO : kNoCommand; 91effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case ui::VKEY_Y: 92effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return (control && !alt) ? IDS_APP_REDO : kNoCommand; 93effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case ui::VKEY_A: 94effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return (control && !alt) ? IDS_APP_SELECT_ALL : kNoCommand; 95effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case ui::VKEY_X: 96effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return (control && !alt) ? IDS_APP_CUT : kNoCommand; 97effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case ui::VKEY_C: 98effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return (control && !alt) ? IDS_APP_COPY : kNoCommand; 99effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case ui::VKEY_V: 100effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return (control && !alt) ? IDS_APP_PASTE : kNoCommand; 101effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case ui::VKEY_RIGHT: 102effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Ignore alt+right, which may be a browser navigation shortcut. 103effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (alt) 104effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return kNoCommand; 105effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (!shift) 106effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return control ? IDS_MOVE_WORD_RIGHT : IDS_MOVE_RIGHT; 107effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return control ? IDS_MOVE_WORD_RIGHT_AND_MODIFY_SELECTION : 108effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch IDS_MOVE_RIGHT_AND_MODIFY_SELECTION; 109effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case ui::VKEY_LEFT: 110effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Ignore alt+left, which may be a browser navigation shortcut. 111effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (alt) 112effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return kNoCommand; 113effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (!shift) 114effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return control ? IDS_MOVE_WORD_LEFT : IDS_MOVE_LEFT; 115effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return control ? IDS_MOVE_WORD_LEFT_AND_MODIFY_SELECTION : 116effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch IDS_MOVE_LEFT_AND_MODIFY_SELECTION; 117effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case ui::VKEY_HOME: 118effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return shift ? IDS_MOVE_TO_BEGINNING_OF_LINE_AND_MODIFY_SELECTION : 119effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch IDS_MOVE_TO_BEGINNING_OF_LINE; 120effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case ui::VKEY_END: 121effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return shift ? IDS_MOVE_TO_END_OF_LINE_AND_MODIFY_SELECTION : 122effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch IDS_MOVE_TO_END_OF_LINE; 123effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case ui::VKEY_BACK: 124effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (!control || has_selection) 125effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return IDS_DELETE_BACKWARD; 126effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if defined(OS_LINUX) 127effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Only erase by line break on Linux and ChromeOS. 128effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (shift) 129effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return IDS_DELETE_TO_BEGINNING_OF_LINE; 130effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif 131effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return IDS_DELETE_WORD_BACKWARD; 132effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case ui::VKEY_DELETE: 133effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (!control || has_selection) 134effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return (shift && has_selection) ? IDS_APP_CUT : IDS_DELETE_FORWARD; 135effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if defined(OS_LINUX) 136effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Only erase by line break on Linux and ChromeOS. 137effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (shift) 138effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return IDS_DELETE_TO_END_OF_LINE; 139effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif 140effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return IDS_DELETE_WORD_FORWARD; 141effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case ui::VKEY_INSERT: 142effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (control && !shift) 143effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return IDS_APP_COPY; 144effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return (shift && !control) ? IDS_APP_PASTE : kNoCommand; 145effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch default: 146effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return kNoCommand; 147effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 148effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 149effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 150e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#if defined(OS_LINUX) && !defined(OS_CHROMEOS) 151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Convert a custom text edit |command| to the equivalent views command ID. 152c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint GetViewsCommand(const ui::TextEditCommandAuraLinux& command, bool rtl) { 153e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const bool select = command.extend_selection(); 154e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch switch (command.command_id()) { 155c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case ui::TextEditCommandAuraLinux::COPY: 156e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return IDS_APP_COPY; 157c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case ui::TextEditCommandAuraLinux::CUT: 158e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return IDS_APP_CUT; 159c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case ui::TextEditCommandAuraLinux::DELETE_BACKWARD: 160e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return IDS_DELETE_BACKWARD; 161c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case ui::TextEditCommandAuraLinux::DELETE_FORWARD: 162e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return IDS_DELETE_FORWARD; 163c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case ui::TextEditCommandAuraLinux::DELETE_TO_BEGINING_OF_LINE: 164c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case ui::TextEditCommandAuraLinux::DELETE_TO_BEGINING_OF_PARAGRAPH: 165e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return IDS_DELETE_TO_BEGINNING_OF_LINE; 166c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case ui::TextEditCommandAuraLinux::DELETE_TO_END_OF_LINE: 167c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case ui::TextEditCommandAuraLinux::DELETE_TO_END_OF_PARAGRAPH: 168e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return IDS_DELETE_TO_END_OF_LINE; 169c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case ui::TextEditCommandAuraLinux::DELETE_WORD_BACKWARD: 170e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return IDS_DELETE_WORD_BACKWARD; 171c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case ui::TextEditCommandAuraLinux::DELETE_WORD_FORWARD: 172e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return IDS_DELETE_WORD_FORWARD; 173c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case ui::TextEditCommandAuraLinux::INSERT_TEXT: 174e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return kNoCommand; 175c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case ui::TextEditCommandAuraLinux::MOVE_BACKWARD: 176e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (rtl) 177e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return select ? IDS_MOVE_RIGHT_AND_MODIFY_SELECTION : IDS_MOVE_RIGHT; 178e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return select ? IDS_MOVE_LEFT_AND_MODIFY_SELECTION : IDS_MOVE_LEFT; 179c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case ui::TextEditCommandAuraLinux::MOVE_DOWN: 180e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return IDS_MOVE_DOWN; 181c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case ui::TextEditCommandAuraLinux::MOVE_FORWARD: 182e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (rtl) 183e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return select ? IDS_MOVE_LEFT_AND_MODIFY_SELECTION : IDS_MOVE_LEFT; 184e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return select ? IDS_MOVE_RIGHT_AND_MODIFY_SELECTION : IDS_MOVE_RIGHT; 185c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case ui::TextEditCommandAuraLinux::MOVE_LEFT: 186e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return select ? IDS_MOVE_LEFT_AND_MODIFY_SELECTION : IDS_MOVE_LEFT; 187c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case ui::TextEditCommandAuraLinux::MOVE_PAGE_DOWN: 188c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case ui::TextEditCommandAuraLinux::MOVE_PAGE_UP: 189e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return kNoCommand; 190c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case ui::TextEditCommandAuraLinux::MOVE_RIGHT: 191e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return select ? IDS_MOVE_RIGHT_AND_MODIFY_SELECTION : IDS_MOVE_RIGHT; 192c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case ui::TextEditCommandAuraLinux::MOVE_TO_BEGINING_OF_DOCUMENT: 193c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case ui::TextEditCommandAuraLinux::MOVE_TO_BEGINING_OF_LINE: 194c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case ui::TextEditCommandAuraLinux::MOVE_TO_BEGINING_OF_PARAGRAPH: 195e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return select ? IDS_MOVE_TO_BEGINNING_OF_LINE_AND_MODIFY_SELECTION : 196e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch IDS_MOVE_TO_BEGINNING_OF_LINE; 197c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case ui::TextEditCommandAuraLinux::MOVE_TO_END_OF_DOCUMENT: 198c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case ui::TextEditCommandAuraLinux::MOVE_TO_END_OF_LINE: 199c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case ui::TextEditCommandAuraLinux::MOVE_TO_END_OF_PARAGRAPH: 200e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return select ? IDS_MOVE_TO_END_OF_LINE_AND_MODIFY_SELECTION : 201e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch IDS_MOVE_TO_END_OF_LINE; 202c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case ui::TextEditCommandAuraLinux::MOVE_UP: 203e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return IDS_MOVE_UP; 204c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case ui::TextEditCommandAuraLinux::MOVE_WORD_BACKWARD: 205e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (rtl) { 206e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return select ? IDS_MOVE_WORD_RIGHT_AND_MODIFY_SELECTION : 207e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch IDS_MOVE_WORD_RIGHT; 208e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 209e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return select ? IDS_MOVE_WORD_LEFT_AND_MODIFY_SELECTION : 210e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch IDS_MOVE_WORD_LEFT; 211c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case ui::TextEditCommandAuraLinux::MOVE_WORD_FORWARD: 212e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (rtl) { 213e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return select ? IDS_MOVE_WORD_LEFT_AND_MODIFY_SELECTION : 214e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch IDS_MOVE_WORD_LEFT; 215e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 216e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return select ? IDS_MOVE_WORD_RIGHT_AND_MODIFY_SELECTION : 217e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch IDS_MOVE_WORD_RIGHT; 218c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case ui::TextEditCommandAuraLinux::MOVE_WORD_LEFT: 219e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return select ? IDS_MOVE_WORD_LEFT_AND_MODIFY_SELECTION : 220e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch IDS_MOVE_WORD_LEFT; 221c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case ui::TextEditCommandAuraLinux::MOVE_WORD_RIGHT: 222e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return select ? IDS_MOVE_WORD_RIGHT_AND_MODIFY_SELECTION : 223e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch IDS_MOVE_WORD_RIGHT; 224c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case ui::TextEditCommandAuraLinux::PASTE: 225e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return IDS_APP_PASTE; 226c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case ui::TextEditCommandAuraLinux::SELECT_ALL: 227e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return IDS_APP_SELECT_ALL; 228c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case ui::TextEditCommandAuraLinux::SET_MARK: 229c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case ui::TextEditCommandAuraLinux::UNSELECT: 230c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case ui::TextEditCommandAuraLinux::INVALID_COMMAND: 231e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return kNoCommand; 232e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 233e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return kNoCommand; 234e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 235e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#endif 236e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 24090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const char Textfield::kViewClassName[] = "Textfield"; 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 24368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)size_t Textfield::GetCaretBlinkMs() { 24468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) static const size_t default_value = 500; 24568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(OS_WIN) 24668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) static const size_t system_value = ::GetCaretBlinkTime(); 24768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (system_value != 0) 24868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return (system_value == INFINITE) ? 0 : system_value; 24968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif 25068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return default_value; 25168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 25268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Textfield::Textfield() 2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : model_(new TextfieldModel(this)), 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_(NULL), 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_only_(false), 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_width_in_chars_(0), 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) use_default_text_color_(true), 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) use_default_background_color_(true), 26046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) use_default_selection_text_color_(true), 26146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) use_default_selection_background_color_(true), 26246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) text_color_(SK_ColorBLACK), 26346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) background_color_(SK_ColorWHITE), 26446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) selection_text_color_(SK_ColorWHITE), 26546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) selection_background_color_(SK_ColorBLUE), 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) placeholder_text_color_(kDefaultPlaceholderTextColor), 26758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) text_input_type_(ui::TEXT_INPUT_TYPE_TEXT), 268c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch performing_user_action_(false), 2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) skip_input_method_cancel_composition_(false), 2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) cursor_visible_(false), 2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) drop_cursor_visible_(false), 2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) initiating_drag_(false), 2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) aggregated_clicks_(0), 27458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) weak_ptr_factory_(this) { 2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) set_context_menu_controller(this); 2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) set_drag_controller(this); 2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetBorder(scoped_ptr<Border>(new FocusableBorder())); 2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetFocusable(true); 279868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 280868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (ViewsDelegate::views_delegate) { 2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) password_reveal_duration_ = ViewsDelegate::views_delegate-> 282868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GetDefaultTextfieldObscuredRevealDuration(); 283868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)Textfield::~Textfield() {} 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Textfield::SetReadOnly(bool read_only) { 28990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Update read-only without changing the focusable state (or active, etc.). 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_only_ = read_only; 2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (GetInputMethod()) 2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetInputMethod()->OnTextInputTypeChanged(this); 2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetColor(GetTextColor()); 2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UpdateBackgroundColor(); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Textfield::SetTextInputType(ui::TextInputType type) { 2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetRenderText()->SetObscured(type == ui::TEXT_INPUT_TYPE_PASSWORD); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_input_type_ = type; 3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnCaretBoundsChanged(); 3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (GetInputMethod()) 3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetInputMethod()->OnTextInputTypeChanged(this); 3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SchedulePaint(); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Textfield::SetText(const base::string16& new_text) { 3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) model_->SetText(new_text); 3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnCaretBoundsChanged(); 3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SchedulePaint(); 310a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NotifyAccessibilityEvent(ui::AX_EVENT_TEXT_CHANGED, true); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Textfield::AppendText(const base::string16& new_text) { 3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (new_text.empty()) 3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) model_->Append(new_text); 3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnCaretBoundsChanged(); 3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SchedulePaint(); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Textfield::InsertOrReplaceText(const base::string16& new_text) { 3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (new_text.empty()) 3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) model_->InsertText(new_text); 3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnCaretBoundsChanged(); 3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SchedulePaint(); 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::i18n::TextDirection Textfield::GetTextDirection() const { 3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return GetRenderText()->GetTextDirection(); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 333cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)base::string16 Textfield::GetSelectedText() const { 334cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return model_->GetSelectedText(); 335cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 336cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Textfield::SelectAll(bool reversed) { 3385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) model_->SelectAll(reversed); 3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UpdateSelectionClipboard(); 3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UpdateAfterChange(false, true); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Textfield::ClearSelection() { 3445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) model_->ClearSelection(); 3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UpdateAfterChange(false, true); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Textfield::HasSelection() const { 3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return !GetSelectedRange().is_empty(); 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SkColor Textfield::GetTextColor() const { 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!use_default_text_color_) 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return text_color_; 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GetNativeTheme()->GetSystemColor(read_only() ? 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::NativeTheme::kColorId_TextfieldReadOnlyColor : 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::NativeTheme::kColorId_TextfieldDefaultColor); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Textfield::SetTextColor(SkColor color) { 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_color_ = color; 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) use_default_text_color_ = false; 3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetColor(color); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Textfield::UseDefaultTextColor() { 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) use_default_text_color_ = true; 3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetColor(GetTextColor()); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SkColor Textfield::GetBackgroundColor() const { 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!use_default_background_color_) 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return background_color_; 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GetNativeTheme()->GetSystemColor(read_only() ? 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::NativeTheme::kColorId_TextfieldReadOnlyBackground : 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::NativeTheme::kColorId_TextfieldDefaultBackground); 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Textfield::SetBackgroundColor(SkColor color) { 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) background_color_ = color; 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) use_default_background_color_ = false; 3845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UpdateBackgroundColor(); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Textfield::UseDefaultBackgroundColor() { 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) use_default_background_color_ = true; 3895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UpdateBackgroundColor(); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)SkColor Textfield::GetSelectionTextColor() const { 39346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return use_default_selection_text_color_ ? 39446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GetNativeTheme()->GetSystemColor( 39546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ui::NativeTheme::kColorId_TextfieldSelectionColor) : 39646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) selection_text_color_; 39746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 39846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 39946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void Textfield::SetSelectionTextColor(SkColor color) { 40046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) selection_text_color_ = color; 40146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) use_default_selection_text_color_ = false; 40246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GetRenderText()->set_selection_color(GetSelectionTextColor()); 40346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SchedulePaint(); 40446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 40546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 40646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void Textfield::UseDefaultSelectionTextColor() { 40746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) use_default_selection_text_color_ = true; 40846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GetRenderText()->set_selection_color(GetSelectionTextColor()); 40946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SchedulePaint(); 41046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 41146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 41246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)SkColor Textfield::GetSelectionBackgroundColor() const { 41346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return use_default_selection_background_color_ ? 41446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GetNativeTheme()->GetSystemColor( 41546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ui::NativeTheme::kColorId_TextfieldSelectionBackgroundFocused) : 41646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) selection_background_color_; 41746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 41846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 41946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void Textfield::SetSelectionBackgroundColor(SkColor color) { 42046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) selection_background_color_ = color; 42146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) use_default_selection_background_color_ = false; 42246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GetRenderText()->set_selection_background_focused_color( 42346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GetSelectionBackgroundColor()); 42446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SchedulePaint(); 42546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 42646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 42746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void Textfield::UseDefaultSelectionBackgroundColor() { 42846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) use_default_selection_background_color_ = true; 42946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GetRenderText()->set_selection_background_focused_color( 43046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GetSelectionBackgroundColor()); 43146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SchedulePaint(); 43246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 43346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Textfield::GetCursorEnabled() const { 4355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return GetRenderText()->cursor_enabled(); 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Textfield::SetCursorEnabled(bool enabled) { 4395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetRenderText()->SetCursorEnabled(enabled); 440a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 441a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const gfx::FontList& Textfield::GetFontList() const { 4435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return GetRenderText()->font_list(); 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Textfield::SetFontList(const gfx::FontList& font_list) { 4475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetRenderText()->SetFontList(font_list); 4485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnCaretBoundsChanged(); 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PreferredSizeChanged(); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)base::string16 Textfield::GetPlaceholderText() const { 4538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return placeholder_text_; 4548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 4558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 4565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liugfx::HorizontalAlignment Textfield::GetHorizontalAlignment() const { 4575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return GetRenderText()->horizontal_alignment(); 4585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 4595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 4605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid Textfield::SetHorizontalAlignment(gfx::HorizontalAlignment alignment) { 4615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetRenderText()->SetHorizontalAlignment(alignment); 4625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 4635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 4645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Textfield::ShowImeIfNeeded() { 465c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (enabled() && !read_only()) 466c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GetInputMethod()->ShowImeIfNeeded(); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Textfield::IsIMEComposing() const { 4705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return model_->HasCompositionText(); 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const gfx::Range& Textfield::GetSelectedRange() const { 4745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return GetRenderText()->selection(); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void Textfield::SelectRange(const gfx::Range& range) { 4785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) model_->SelectRange(range); 4795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UpdateAfterChange(false, true); 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const gfx::SelectionModel& Textfield::GetSelectionModel() const { 4835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return GetRenderText()->selection_model(); 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Textfield::SelectSelectionModel(const gfx::SelectionModel& sel) { 4875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) model_->SelectSelectionModel(sel); 4885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UpdateAfterChange(false, true); 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)size_t Textfield::GetCursorPosition() const { 4925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return model_->GetCursorPosition(); 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Textfield::SetColor(SkColor value) { 4965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetRenderText()->SetColor(value); 4975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SchedulePaint(); 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 50058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void Textfield::ApplyColor(SkColor value, const gfx::Range& range) { 5015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetRenderText()->ApplyColor(value, range); 5025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SchedulePaint(); 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Textfield::SetStyle(gfx::TextStyle style, bool value) { 5065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetRenderText()->SetStyle(style, value); 5075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SchedulePaint(); 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Textfield::ApplyStyle(gfx::TextStyle style, 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool value, 51258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const gfx::Range& range) { 5135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetRenderText()->ApplyStyle(style, value, range); 5145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SchedulePaint(); 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Textfield::ClearEditHistory() { 5185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) model_->ClearEditHistory(); 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Textfield::SetAccessibleName(const base::string16& name) { 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accessible_name_ = name; 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Textfield::ExecuteCommand(int command_id) { 5265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ExecuteCommand(command_id, ui::EF_NONE); 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 529a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void Textfield::SetFocusPainter(scoped_ptr<Painter> focus_painter) { 530a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) focus_painter_ = focus_painter.Pass(); 531a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 532a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 533c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool Textfield::HasTextBeingDragged() { 5345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return initiating_drag_; 535c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 536c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Textfield, View overrides: 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int Textfield::GetBaseline() const { 5415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return GetInsets().top() + GetRenderText()->GetBaseline(); 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 544cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)gfx::Size Textfield::GetPreferredSize() const { 5455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Insets& insets = GetInsets(); 5465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return gfx::Size(GetFontList().GetExpectedTextWidth(default_width_in_chars_) + 5475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) insets.width(), GetFontList().GetHeight() + insets.height()); 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 550a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const char* Textfield::GetClassName() const { 551a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return kViewClassName; 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 554a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)gfx::NativeCursor Textfield::GetCursor(const ui::MouseEvent& event) { 555a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool in_selection = GetRenderText()->IsPointInSelection(event.location()); 556a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool drag_event = event.type() == ui::ET_MOUSE_DRAGGED; 557a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool text_cursor = !initiating_drag_ && (drag_event || !in_selection); 5585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return text_cursor ? GetNativeIBeamCursor() : gfx::kNullCursor; 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 561a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool Textfield::OnMousePressed(const ui::MouseEvent& event) { 562a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) TrackMouseClicks(event); 563a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 564a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!controller_ || !controller_->HandleMouseEvent(this, event)) { 565a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (event.IsOnlyLeftMouseButton() || event.IsOnlyRightMouseButton()) { 566a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RequestFocus(); 567a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ShowImeIfNeeded(); 568a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 569a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 570a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (event.IsOnlyLeftMouseButton()) { 571a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) OnBeforeUserAction(); 572a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) initiating_drag_ = false; 573a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) switch (aggregated_clicks_) { 574a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) case 0: 575a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (GetRenderText()->IsPointInSelection(event.location())) 576a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) initiating_drag_ = true; 577a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) else 578a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MoveCursorTo(event.location(), event.IsShiftDown()); 579a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) break; 580a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) case 1: 581a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) model_->MoveCursorTo(event.location(), false); 582a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) model_->SelectWord(); 583a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) UpdateAfterChange(false, true); 584a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) double_click_word_ = GetRenderText()->selection(); 585a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) break; 586a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) case 2: 587a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SelectAll(false); 588a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) break; 589a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) default: 590a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NOTREACHED(); 591a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 592a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) OnAfterUserAction(); 593a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 594a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 595a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(OS_LINUX) && !defined(OS_CHROMEOS) 596a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (event.IsOnlyMiddleMouseButton()) { 597a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (GetRenderText()->IsPointInSelection(event.location())) { 598a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) OnBeforeUserAction(); 599a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ClearSelection(); 600a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ui::ScopedClipboardWriter( 601a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ui::Clipboard::GetForCurrentThread(), 602a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ui::CLIPBOARD_TYPE_SELECTION).WriteText(base::string16()); 603a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) OnAfterUserAction(); 604a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } else if(!read_only()) { 605a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PasteSelectionClipboard(event); 606a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 607a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 608a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif 609a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 610a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 611a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return true; 612a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 613a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 614a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool Textfield::OnMouseDragged(const ui::MouseEvent& event) { 615cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) last_drag_location_ = event.location(); 616cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 617a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Don't adjust the cursor on a potential drag and drop, or if the mouse 618a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // movement from the last mouse click does not exceed the drag threshold. 619a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (initiating_drag_ || !event.IsOnlyLeftMouseButton() || 620cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) !ExceededDragThreshold(last_drag_location_ - last_click_location_)) { 621a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return true; 622a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 623a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 624cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // A timer is used to continuously scroll while selecting beyond side edges. 625cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if ((event.location().x() > 0 && event.location().x() < size().width()) || 626cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetDragSelectionDelay() == 0) { 627cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) drag_selection_timer_.Stop(); 628cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SelectThroughLastDragLocation(); 629cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else if (!drag_selection_timer_.IsRunning()) { 630cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) drag_selection_timer_.Start( 631cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FROM_HERE, base::TimeDelta::FromMilliseconds(GetDragSelectionDelay()), 632cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) this, &Textfield::SelectThroughLastDragLocation); 633a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 634cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 635a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return true; 636a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 637a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 638a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void Textfield::OnMouseReleased(const ui::MouseEvent& event) { 639a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) OnBeforeUserAction(); 640cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) drag_selection_timer_.Stop(); 641a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Cancel suspected drag initiations, the user was clicking in the selection. 642a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (initiating_drag_) 643a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MoveCursorTo(event.location(), false); 644a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) initiating_drag_ = false; 645a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) UpdateSelectionClipboard(); 646a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) OnAfterUserAction(); 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool Textfield::OnKeyPressed(const ui::KeyEvent& event) { 650e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch bool handled = controller_ && controller_->HandleKeyEvent(this, event); 6515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 652e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#if defined(OS_LINUX) && !defined(OS_CHROMEOS) 653c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ui::TextEditKeyBindingsDelegateAuraLinux* delegate = 654e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch ui::GetTextEditKeyBindingsDelegate(); 655c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch std::vector<ui::TextEditCommandAuraLinux> commands; 656cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!handled && delegate && delegate->MatchEvent(event, &commands)) { 657e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const bool rtl = GetTextDirection() == base::i18n::RIGHT_TO_LEFT; 658e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch for (size_t i = 0; i < commands.size(); ++i) { 659cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const int command = GetViewsCommand(commands[i], rtl); 660e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (IsCommandIdEnabled(command)) { 661e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch ExecuteCommand(command); 662e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch handled = true; 663e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 664e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 665e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return handled; 666e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 667e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#endif 668e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 669effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const int command = GetCommandForKeyEvent(event, HasSelection()); 670cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!handled && IsCommandIdEnabled(command)) { 671effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ExecuteCommand(command); 672cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) handled = true; 6735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 674cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return handled; 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::TextInputClient* Textfield::GetTextInputClient() { 6785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return read_only_ ? NULL : this; 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Textfield::OnGestureEvent(ui::GestureEvent* event) { 6825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switch (event->type()) { 6835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::ET_GESTURE_TAP_DOWN: 6845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnBeforeUserAction(); 6855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RequestFocus(); 6865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ShowImeIfNeeded(); 6875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // We don't deselect if the point is in the selection 6895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // because TAP_DOWN may turn into a LONG_PRESS. 6905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GetRenderText()->IsPointInSelection(event->location())) 6915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MoveCursorTo(event->location(), false); 6925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnAfterUserAction(); 6935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) event->SetHandled(); 6945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 6955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::ET_GESTURE_SCROLL_UPDATE: 6965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnBeforeUserAction(); 6975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MoveCursorTo(event->location(), true); 6985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnAfterUserAction(); 6995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) event->SetHandled(); 7005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 7015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::ET_GESTURE_SCROLL_END: 7025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::ET_SCROLL_FLING_START: 7035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CreateTouchSelectionControllerAndNotifyIt(); 7045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) event->SetHandled(); 7055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 7065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::ET_GESTURE_TAP: 7075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (event->details().tap_count() == 1) { 7085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CreateTouchSelectionControllerAndNotifyIt(); 7095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 710bee9932bab44713b74b422b4b759b49f5a222977Bo Liu DestroyTouchSelection(); 7115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnBeforeUserAction(); 7125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SelectAll(false); 7135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnAfterUserAction(); 7145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) event->SetHandled(); 7155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 7165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN) 7175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!read_only()) 7185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::win::DisplayVirtualKeyboard(); 7195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 7205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 7215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::ET_GESTURE_LONG_PRESS: 7225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If long press happens outside selection, select word and show context 7235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // menu (If touch selection is enabled, context menu is shown by the 7245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // |touch_selection_controller_|, hence we mark the event handled. 7255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Otherwise, the regular context menu will be shown by views). 7265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If long press happens in selected text and touch drag drop is enabled, 7275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // we will turn off touch selection (if one exists) and let views do drag 7285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // drop. 7295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GetRenderText()->IsPointInSelection(event->location())) { 7305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnBeforeUserAction(); 7315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) model_->SelectWord(); 7325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) touch_selection_controller_.reset( 7335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::TouchSelectionController::create(this)); 7345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UpdateAfterChange(false, true); 7355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnAfterUserAction(); 7365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (touch_selection_controller_) 7375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) event->SetHandled(); 7385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else if (switches::IsTouchDragDropEnabled()) { 7395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) initiating_drag_ = true; 740010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DestroyTouchSelection(); 7415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 7425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!touch_selection_controller_) 7435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CreateTouchSelectionControllerAndNotifyIt(); 7445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (touch_selection_controller_) 7455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) event->SetHandled(); 7465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 7475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 7485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::ET_GESTURE_LONG_TAP: 7495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!touch_selection_controller_) 7505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CreateTouchSelectionControllerAndNotifyIt(); 7515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If touch selection is enabled, the context menu on long tap will be 7535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // shown by the |touch_selection_controller_|, hence we mark the event 7545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // handled so views does not try to show context menu on it. 7555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (touch_selection_controller_) 7565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) event->SetHandled(); 7575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 7585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) default: 7595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 7605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 7615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 7625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 763a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void Textfield::AboutToRequestFocusFromTabTraversal(bool reverse) { 764a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SelectAll(false); 765a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 766a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 767e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochbool Textfield::SkipDefaultKeyEventProcessing(const ui::KeyEvent& event) { 768e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#if defined(OS_LINUX) && !defined(OS_CHROMEOS) 769e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Skip any accelerator handling that conflicts with custom keybindings. 770c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ui::TextEditKeyBindingsDelegateAuraLinux* delegate = 771e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch ui::GetTextEditKeyBindingsDelegate(); 772c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch std::vector<ui::TextEditCommandAuraLinux> commands; 773e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (delegate && delegate->MatchEvent(event, &commands)) { 774e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const bool rtl = GetTextDirection() == base::i18n::RIGHT_TO_LEFT; 775e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch for (size_t i = 0; i < commands.size(); ++i) 776e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (IsCommandIdEnabled(GetViewsCommand(commands[i], rtl))) 777e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return true; 778e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 779e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#endif 780e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 781cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Skip backspace accelerator handling; editable textfields handle this key. 782a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Also skip processing Windows [Alt]+<num-pad digit> Unicode alt-codes. 783cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const bool is_backspace = event.key_code() == ui::VKEY_BACK; 784cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return (is_backspace && !read_only()) || event.IsUnicodeKeyCode(); 785a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 786a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 7875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool Textfield::GetDropFormats( 7885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int* formats, 7895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::set<OSExchangeData::CustomFormat>* custom_formats) { 7905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!enabled() || read_only()) 7915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 7925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(msw): Can we support URL, FILENAME, etc.? 7935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *formats = ui::OSExchangeData::STRING; 7945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (controller_) 7955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) controller_->AppendDropFormats(formats, custom_formats); 7965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 7975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 7985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool Textfield::CanDrop(const OSExchangeData& data) { 8005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int formats; 8015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::set<OSExchangeData::CustomFormat> custom_formats; 8025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetDropFormats(&formats, &custom_formats); 8035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return enabled() && !read_only() && 8045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) data.HasAnyFormat(formats, custom_formats); 8055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 8065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int Textfield::OnDragUpdated(const ui::DropTargetEvent& event) { 8085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(CanDrop(event.data())); 8095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::RenderText* render_text = GetRenderText(); 8105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Range& selection = render_text->selection(); 8115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) drop_cursor_position_ = render_text->FindCursorPosition(event.location()); 8125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool in_selection = !selection.is_empty() && 8135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) selection.Contains(gfx::Range(drop_cursor_position_.caret_pos())); 8145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) drop_cursor_visible_ = !in_selection; 8155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(msw): Pan over text when the user drags to the visible text edge. 8165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnCaretBoundsChanged(); 8175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SchedulePaint(); 8185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (initiating_drag_) { 8205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (in_selection) 8215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ui::DragDropTypes::DRAG_NONE; 8225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return event.IsControlDown() ? ui::DragDropTypes::DRAG_COPY : 8235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::DragDropTypes::DRAG_MOVE; 8245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ui::DragDropTypes::DRAG_COPY | ui::DragDropTypes::DRAG_MOVE; 8265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 8275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Textfield::OnDragExited() { 8295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) drop_cursor_visible_ = false; 8305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SchedulePaint(); 8315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 8325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int Textfield::OnPerformDrop(const ui::DropTargetEvent& event) { 8345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(CanDrop(event.data())); 8355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) drop_cursor_visible_ = false; 8365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (controller_) { 8385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int drag_operation = controller_->OnDrop(event.data()); 8395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (drag_operation != ui::DragDropTypes::DRAG_NONE) 8405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return drag_operation; 8415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::RenderText* render_text = GetRenderText(); 8445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!initiating_drag_ || 8455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) !render_text->IsPointInSelection(event.location())); 8465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnBeforeUserAction(); 8475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) skip_input_method_cancel_composition_ = true; 8485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::SelectionModel drop_destination_model = 8505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_text->FindCursorPosition(event.location()); 8515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 new_text; 8525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) event.data().GetString(&new_text); 8535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Delete the current selection for a drag and drop within this view. 8555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const bool move = initiating_drag_ && !event.IsControlDown() && 8565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) event.source_operations() & ui::DragDropTypes::DRAG_MOVE; 8575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (move) { 8585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Adjust the drop destination if it is on or after the current selection. 8595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t pos = drop_destination_model.caret_pos(); 8605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pos -= render_text->selection().Intersect(gfx::Range(0, pos)).length(); 8615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) model_->DeleteSelectionAndInsertTextAt(new_text, pos); 8625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 8635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) model_->MoveCursorTo(drop_destination_model); 8645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Drop always inserts text even if the textfield is not in insert mode. 8655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) model_->InsertText(new_text); 8665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) skip_input_method_cancel_composition_ = false; 8685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UpdateAfterChange(true, true); 8695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnAfterUserAction(); 8705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return move ? ui::DragDropTypes::DRAG_MOVE : ui::DragDropTypes::DRAG_COPY; 8715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 8725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Textfield::OnDragDone() { 8745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) initiating_drag_ = false; 8755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) drop_cursor_visible_ = false; 8765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 8775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 878a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void Textfield::GetAccessibleState(ui::AXViewState* state) { 879a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) state->role = ui::AX_ROLE_TEXT_FIELD; 880a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) state->name = accessible_name_; 881a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (read_only()) 882effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch state->AddStateFlag(ui::AX_STATE_READ_ONLY); 883a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (text_input_type_ == ui::TEXT_INPUT_TYPE_PASSWORD) 884effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch state->AddStateFlag(ui::AX_STATE_PROTECTED); 885a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) state->value = text(); 886a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 887a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const gfx::Range range = GetSelectedRange(); 888a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) state->selection_start = range.start(); 889a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) state->selection_end = range.end(); 890a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 891a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!read_only()) { 892a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) state->set_value_callback = 893a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&Textfield::AccessibilitySetValue, 894a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr()); 895a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 896a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 897a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 8985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Textfield::OnBoundsChanged(const gfx::Rect& previous_bounds) { 8995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetRenderText()->SetDisplayRect(GetContentsBounds()); 9005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnCaretBoundsChanged(); 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 903a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void Textfield::OnEnabledChanged() { 904a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) View::OnEnabledChanged(); 905a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (GetInputMethod()) 906a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GetInputMethod()->OnTextInputTypeChanged(this); 907a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SchedulePaint(); 908a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 909a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 910a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void Textfield::OnPaint(gfx::Canvas* canvas) { 911a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) OnPaintBackground(canvas); 912a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PaintTextAndCursor(canvas); 913a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) OnPaintBorder(canvas); 914a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 915a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 916a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void Textfield::OnFocus() { 917a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GetRenderText()->set_focused(true); 918a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) cursor_visible_ = true; 919a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SchedulePaint(); 92046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GetInputMethod()->OnFocus(); 921a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) OnCaretBoundsChanged(); 922a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 923a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const size_t caret_blink_ms = Textfield::GetCaretBlinkMs(); 924a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (caret_blink_ms != 0) { 925a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) cursor_repaint_timer_.Start(FROM_HERE, 926a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::TimeDelta::FromMilliseconds(caret_blink_ms), this, 927a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &Textfield::UpdateCursor); 928a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 929a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 930a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) View::OnFocus(); 931a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SchedulePaint(); 932a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 933a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 934a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void Textfield::OnBlur() { 935a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GetRenderText()->set_focused(false); 93646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GetInputMethod()->OnBlur(); 937a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) cursor_repaint_timer_.Stop(); 938a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (cursor_visible_) { 939a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) cursor_visible_ = false; 940a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RepaintCursor(); 941a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 942a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 943010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DestroyTouchSelection(); 944a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 945a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Border typically draws focus indicator. 946a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SchedulePaint(); 947a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 948a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 949a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)gfx::Point Textfield::GetKeyboardContextMenuLocation() { 950a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return GetCaretBounds().bottom_right(); 951a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 952a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 953a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void Textfield::OnNativeThemeChanged(const ui::NativeTheme* theme) { 9545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu gfx::RenderText* render_text = GetRenderText(); 9555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu render_text->SetColor(GetTextColor()); 9565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu UpdateBackgroundColor(); 9575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu render_text->set_cursor_color(GetTextColor()); 95846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) render_text->set_selection_color(GetSelectionTextColor()); 95946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) render_text->set_selection_background_focused_color( 96046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GetSelectionBackgroundColor()); 961a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 962a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 9635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 9645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Textfield, TextfieldModel::Delegate overrides: 9655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Textfield::OnCompositionTextConfirmedOrCleared() { 9675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!skip_input_method_cancel_composition_) 9685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetInputMethod()->CancelComposition(this); 9695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 9705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 9725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Textfield, ContextMenuController overrides: 9735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 974a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void Textfield::ShowContextMenuForView(View* source, 975a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const gfx::Point& point, 976a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ui::MenuSourceType source_type) { 9775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UpdateContextMenu(); 9785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ignore_result(context_menu_runner_->RunMenuAt( 9795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetWidget(), 9805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu NULL, 9815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu gfx::Rect(point, gfx::Size()), 9825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu MENU_ANCHOR_TOPLEFT, 9835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu source_type, 984a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MenuRunner::HAS_MNEMONICS | MenuRunner::CONTEXT_MENU)); 9855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 9865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 988a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Textfield, DragController overrides: 9895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 990a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void Textfield::WriteDragDataForView(View* sender, 9915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Point& press_pt, 9925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OSExchangeData* data) { 993a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::string16& selected_text(GetSelectedText()); 994a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) data->SetString(selected_text); 995a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Label label(selected_text, GetFontList()); 9966d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) label.SetBackgroundColor(GetBackgroundColor()); 9976d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) label.set_subpixel_rendering_enabled(false); 998a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::Size size(label.GetPreferredSize()); 999a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::NativeView native_view = GetWidget()->GetNativeView(); 1000a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::Display display = gfx::Screen::GetScreenFor(native_view)-> 1001a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GetDisplayNearestWindow(native_view); 1002a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size.SetToMin(gfx::Size(display.size().width(), height())); 1003a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) label.SetBoundsRect(gfx::Rect(size)); 10045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<gfx::Canvas> canvas( 1005a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GetCanvasForDragImage(GetWidget(), label.size())); 1006a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) label.SetEnabledColor(GetTextColor()); 1007a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(OS_LINUX) && !defined(OS_CHROMEOS) 1008a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Desktop Linux Aura does not yet support transparency in drag images. 10096d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) canvas->DrawColor(GetBackgroundColor()); 1010a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif 1011cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) label.Paint(canvas.get(), views::CullSet()); 1012a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const gfx::Vector2d kOffset(-15, 0); 1013f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) drag_utils::SetDragImageOnDataObject(*canvas, kOffset, data); 10145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (controller_) 10155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) controller_->OnWriteDragData(data); 10165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 10175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1018a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)int Textfield::GetDragOperationsForView(View* sender, const gfx::Point& p) { 10195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int drag_operations = ui::DragDropTypes::DRAG_COPY; 10205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!enabled() || text_input_type_ == ui::TEXT_INPUT_TYPE_PASSWORD || 10215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) !GetRenderText()->IsPointInSelection(p)) { 10225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) drag_operations = ui::DragDropTypes::DRAG_NONE; 10235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else if (sender == this && !read_only()) { 10245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) drag_operations = 10255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::DragDropTypes::DRAG_MOVE | ui::DragDropTypes::DRAG_COPY; 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (controller_) 10285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) controller_->OnGetDragOperationsForTextfield(&drag_operations); 10295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return drag_operations; 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool Textfield::CanStartDragForView(View* sender, 10335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Point& press_pt, 10345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Point& p) { 10355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return initiating_drag_ && GetRenderText()->IsPointInSelection(press_pt); 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 103858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 10395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Textfield, ui::TouchEditable overrides: 10405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 10415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Textfield::SelectRect(const gfx::Point& start, const gfx::Point& end) { 10425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (GetTextInputType() == ui::TEXT_INPUT_TYPE_NONE) 10435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 10445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 10455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::SelectionModel start_caret = GetRenderText()->FindCursorPosition(start); 10465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::SelectionModel end_caret = GetRenderText()->FindCursorPosition(end); 10475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::SelectionModel selection( 10485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Range(start_caret.caret_pos(), end_caret.caret_pos()), 10495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) end_caret.caret_affinity()); 10505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 10515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnBeforeUserAction(); 10525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SelectSelectionModel(selection); 10535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnAfterUserAction(); 10545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 10555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 10565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Textfield::MoveCaretTo(const gfx::Point& point) { 10575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SelectRect(point, point); 10585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 10595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 10605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Textfield::GetSelectionEndPoints(gfx::Rect* p1, gfx::Rect* p2) { 10615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::RenderText* render_text = GetRenderText(); 10625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::SelectionModel& sel = render_text->selection_model(); 10635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::SelectionModel start_sel = 10645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_text->GetSelectionModelForSelectionStart(); 10655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *p1 = render_text->GetCursorBounds(start_sel, true); 10665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *p2 = render_text->GetCursorBounds(sel, true); 10675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 10685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 10695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)gfx::Rect Textfield::GetBounds() { 10705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return GetLocalBounds(); 10715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 10725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 10735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)gfx::NativeView Textfield::GetNativeView() const { 10745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return GetWidget()->GetNativeView(); 10755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 10765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 10775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Textfield::ConvertPointToScreen(gfx::Point* point) { 10785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) View::ConvertPointToScreen(this, point); 10795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 10805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 10815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Textfield::ConvertPointFromScreen(gfx::Point* point) { 10825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) View::ConvertPointFromScreen(this, point); 10835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 10845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 10855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool Textfield::DrawsHandles() { 10865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 10875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 10885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 10895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Textfield::OpenContextMenu(const gfx::Point& anchor) { 1090010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DestroyTouchSelection(); 10915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ShowContextMenu(anchor, ui::MENU_SOURCE_TOUCH_EDIT_MENU); 10925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 10935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1094010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void Textfield::DestroyTouchSelection() { 1095010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) touch_selection_controller_.reset(); 1096010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 1097010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 10985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 10995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Textfield, ui::SimpleMenuModel::Delegate overrides: 110058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 11015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool Textfield::IsCommandIdChecked(int command_id) const { 11025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 1103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 1104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 11055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool Textfield::IsCommandIdEnabled(int command_id) const { 11065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 result; 11075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool editable = !read_only(); 11085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool readable = text_input_type_ != ui::TEXT_INPUT_TYPE_PASSWORD; 11095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switch (command_id) { 11105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case IDS_APP_UNDO: 11115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return editable && model_->CanUndo(); 1112effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case IDS_APP_REDO: 1113effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return editable && model_->CanRedo(); 11145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case IDS_APP_CUT: 11155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return editable && readable && model_->HasSelection(); 11165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case IDS_APP_COPY: 11175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return readable && model_->HasSelection(); 11185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case IDS_APP_PASTE: 11195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::Clipboard::GetForCurrentThread()->ReadText( 11205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::CLIPBOARD_TYPE_COPY_PASTE, &result); 11215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return editable && !result.empty(); 11225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case IDS_APP_DELETE: 11235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return editable && model_->HasSelection(); 11245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case IDS_APP_SELECT_ALL: 11255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return !text().empty(); 1126effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case IDS_DELETE_FORWARD: 1127effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case IDS_DELETE_BACKWARD: 1128effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case IDS_DELETE_TO_BEGINNING_OF_LINE: 1129effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case IDS_DELETE_TO_END_OF_LINE: 1130effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case IDS_DELETE_WORD_BACKWARD: 1131effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case IDS_DELETE_WORD_FORWARD: 1132effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return editable; 1133effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case IDS_MOVE_LEFT: 1134effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case IDS_MOVE_LEFT_AND_MODIFY_SELECTION: 1135effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case IDS_MOVE_RIGHT: 1136effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case IDS_MOVE_RIGHT_AND_MODIFY_SELECTION: 1137effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case IDS_MOVE_WORD_LEFT: 1138effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case IDS_MOVE_WORD_LEFT_AND_MODIFY_SELECTION: 1139effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case IDS_MOVE_WORD_RIGHT: 1140effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case IDS_MOVE_WORD_RIGHT_AND_MODIFY_SELECTION: 1141effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case IDS_MOVE_TO_BEGINNING_OF_LINE: 1142effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case IDS_MOVE_TO_BEGINNING_OF_LINE_AND_MODIFY_SELECTION: 1143effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case IDS_MOVE_TO_END_OF_LINE: 1144effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case IDS_MOVE_TO_END_OF_LINE_AND_MODIFY_SELECTION: 1145effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return true; 11465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) default: 11475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 11485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 11495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 11505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool Textfield::GetAcceleratorForCommandId(int command_id, 11525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::Accelerator* accelerator) { 11535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 11545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 11555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Textfield::ExecuteCommand(int command_id, int event_flags) { 1157010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DestroyTouchSelection(); 11585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!IsCommandIdEnabled(command_id)) 11595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 11605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool text_changed = false; 1162effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool cursor_changed = false; 1163effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool rtl = GetTextDirection() == base::i18n::RIGHT_TO_LEFT; 1164effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch gfx::VisualCursorDirection begin = rtl ? gfx::CURSOR_RIGHT : gfx::CURSOR_LEFT; 1165effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch gfx::VisualCursorDirection end = rtl ? gfx::CURSOR_LEFT : gfx::CURSOR_RIGHT; 1166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) gfx::SelectionModel selection_model = GetSelectionModel(); 1167effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 11685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnBeforeUserAction(); 11695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switch (command_id) { 11705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case IDS_APP_UNDO: 1171effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch text_changed = cursor_changed = model_->Undo(); 1172effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch break; 1173effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case IDS_APP_REDO: 1174effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch text_changed = cursor_changed = model_->Redo(); 11755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 11765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case IDS_APP_CUT: 1177effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch text_changed = cursor_changed = Cut(); 11785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 11795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case IDS_APP_COPY: 11805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Copy(); 11815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 11825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case IDS_APP_PASTE: 1183effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch text_changed = cursor_changed = Paste(); 11845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 11855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case IDS_APP_DELETE: 1186effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch text_changed = cursor_changed = model_->Delete(); 11875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 11885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case IDS_APP_SELECT_ALL: 11895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SelectAll(false); 11905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 1191effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case IDS_DELETE_BACKWARD: 1192effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch text_changed = cursor_changed = model_->Backspace(); 1193effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch break; 1194effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case IDS_DELETE_FORWARD: 1195effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch text_changed = cursor_changed = model_->Delete(); 1196effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch break; 1197effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case IDS_DELETE_TO_END_OF_LINE: 1198effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch model_->MoveCursor(gfx::LINE_BREAK, end, true); 1199effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch text_changed = cursor_changed = model_->Delete(); 1200effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch break; 1201effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case IDS_DELETE_TO_BEGINNING_OF_LINE: 1202effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch model_->MoveCursor(gfx::LINE_BREAK, begin, true); 1203effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch text_changed = cursor_changed = model_->Backspace(); 1204effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch break; 1205effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case IDS_DELETE_WORD_BACKWARD: 1206effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch model_->MoveCursor(gfx::WORD_BREAK, begin, true); 1207effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch text_changed = cursor_changed = model_->Backspace(); 1208effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch break; 1209effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case IDS_DELETE_WORD_FORWARD: 1210effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch model_->MoveCursor(gfx::WORD_BREAK, end, true); 1211effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch text_changed = cursor_changed = model_->Delete(); 1212effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch break; 1213effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case IDS_MOVE_LEFT: 1214effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch model_->MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_LEFT, false); 1215effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch break; 1216effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case IDS_MOVE_LEFT_AND_MODIFY_SELECTION: 1217effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch model_->MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_LEFT, true); 1218effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch break; 1219effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case IDS_MOVE_RIGHT: 1220effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch model_->MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_RIGHT, false); 1221effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch break; 1222effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case IDS_MOVE_RIGHT_AND_MODIFY_SELECTION: 1223effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch model_->MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_RIGHT, true); 1224effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch break; 1225effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case IDS_MOVE_WORD_LEFT: 1226effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch model_->MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_LEFT, false); 1227effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch break; 1228effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case IDS_MOVE_WORD_LEFT_AND_MODIFY_SELECTION: 1229effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch model_->MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_LEFT, true); 1230effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch break; 1231effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case IDS_MOVE_WORD_RIGHT: 1232effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch model_->MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_RIGHT, false); 1233effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch break; 1234effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case IDS_MOVE_WORD_RIGHT_AND_MODIFY_SELECTION: 1235effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch model_->MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_RIGHT, true); 1236effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch break; 1237effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case IDS_MOVE_TO_BEGINNING_OF_LINE: 1238effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch model_->MoveCursor(gfx::LINE_BREAK, begin, false); 1239effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch break; 1240effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case IDS_MOVE_TO_BEGINNING_OF_LINE_AND_MODIFY_SELECTION: 1241effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch model_->MoveCursor(gfx::LINE_BREAK, begin, true); 1242effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch break; 1243effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case IDS_MOVE_TO_END_OF_LINE: 1244effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch model_->MoveCursor(gfx::LINE_BREAK, end, false); 1245effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch break; 1246effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case IDS_MOVE_TO_END_OF_LINE_AND_MODIFY_SELECTION: 1247effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch model_->MoveCursor(gfx::LINE_BREAK, end, true); 1248effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch break; 12495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) default: 12505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NOTREACHED(); 12515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 12525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1253effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1254cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) cursor_changed |= GetSelectionModel() != selection_model; 1255effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (cursor_changed) 1256effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch UpdateSelectionClipboard(); 1257effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch UpdateAfterChange(text_changed, cursor_changed); 12585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnAfterUserAction(); 12595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 12605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 12615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 12625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Textfield, ui::TextInputClient overrides: 12635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 12645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Textfield::SetCompositionText(const ui::CompositionText& composition) { 12655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (GetTextInputType() == ui::TEXT_INPUT_TYPE_NONE) 12665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 12675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 12685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnBeforeUserAction(); 12695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) skip_input_method_cancel_composition_ = true; 12705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) model_->SetCompositionText(composition); 12715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) skip_input_method_cancel_composition_ = false; 12725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UpdateAfterChange(true, true); 12735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnAfterUserAction(); 12745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 12755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 12765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Textfield::ConfirmCompositionText() { 12775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!model_->HasCompositionText()) 12785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 12795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 12805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnBeforeUserAction(); 12815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) skip_input_method_cancel_composition_ = true; 12825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) model_->ConfirmCompositionText(); 12835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) skip_input_method_cancel_composition_ = false; 12845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UpdateAfterChange(true, true); 12855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnAfterUserAction(); 12865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 12875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 12885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Textfield::ClearCompositionText() { 12895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!model_->HasCompositionText()) 12905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 12915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 12925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnBeforeUserAction(); 12935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) skip_input_method_cancel_composition_ = true; 12945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) model_->CancelCompositionText(); 12955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) skip_input_method_cancel_composition_ = false; 12965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UpdateAfterChange(true, true); 12975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnAfterUserAction(); 12985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 12995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 13005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Textfield::InsertText(const base::string16& new_text) { 13015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(suzhe): Filter invalid characters. 13025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (GetTextInputType() == ui::TEXT_INPUT_TYPE_NONE || new_text.empty()) 13035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 13045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 13055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnBeforeUserAction(); 13065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) skip_input_method_cancel_composition_ = true; 13075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (GetRenderText()->insert_mode()) 13085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) model_->InsertText(new_text); 13095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) else 13105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) model_->ReplaceText(new_text); 13115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) skip_input_method_cancel_composition_ = false; 13125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UpdateAfterChange(true, true); 13135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnAfterUserAction(); 13145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 13155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 13165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Textfield::InsertChar(base::char16 ch, int flags) { 131708fd22434aed8d58d4e04bbbc0df2a942440bcc5Bo Liu const int kControlModifierMask = ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | 131808fd22434aed8d58d4e04bbbc0df2a942440bcc5Bo Liu ui::EF_COMMAND_DOWN | ui::EF_ALTGR_DOWN | 131908fd22434aed8d58d4e04bbbc0df2a942440bcc5Bo Liu ui::EF_MOD3_DOWN; 132008fd22434aed8d58d4e04bbbc0df2a942440bcc5Bo Liu 13215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Filter out all control characters, including tab and new line characters, 13225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // and all characters with Alt modifier. But allow characters with the AltGr 13235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // modifier. On Windows AltGr is represented by Alt+Ctrl, and on Linux it's a 13245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // different flag that we don't care about. 132508fd22434aed8d58d4e04bbbc0df2a942440bcc5Bo Liu const bool should_insert_char = 132608fd22434aed8d58d4e04bbbc0df2a942440bcc5Bo Liu ((ch >= 0x20 && ch < 0x7F) || ch > 0x9F) && 132708fd22434aed8d58d4e04bbbc0df2a942440bcc5Bo Liu (flags & kControlModifierMask) != ui::EF_ALT_DOWN; 13285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (GetTextInputType() == ui::TEXT_INPUT_TYPE_NONE || !should_insert_char) 13295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 13305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 13315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnBeforeUserAction(); 13325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) skip_input_method_cancel_composition_ = true; 13335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (GetRenderText()->insert_mode()) 13345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) model_->InsertChar(ch); 13355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) else 13365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) model_->ReplaceChar(ch); 13375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) skip_input_method_cancel_composition_ = false; 13385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 13395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UpdateAfterChange(true, true); 13405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnAfterUserAction(); 13415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 13425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (text_input_type_ == ui::TEXT_INPUT_TYPE_PASSWORD && 13435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) password_reveal_duration_ != base::TimeDelta()) { 13445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const size_t change_offset = model_->GetCursorPosition(); 13455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK_GT(change_offset, 0u); 13465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RevealPasswordChar(change_offset - 1); 13475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 13485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 13495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 13505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)gfx::NativeWindow Textfield::GetAttachedWindow() const { 13515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Imagine the following hierarchy. 13525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // [NativeWidget A] - FocusManager 13535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // [View] 13545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // [NativeWidget B] 13555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // [View] 13565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // [View X] 13575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // An important thing is that [NativeWidget A] owns Win32 input focus even 13585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // when [View X] is logically focused by FocusManager. As a result, an Win32 13595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // IME may want to interact with the native view of [NativeWidget A] rather 13605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // than that of [NativeWidget B]. This is why we need to call 13615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // GetTopLevelWidget() here. 13625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return GetWidget()->GetTopLevelWidget()->GetNativeWindow(); 13635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 13645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 13655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ui::TextInputType Textfield::GetTextInputType() const { 13665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (read_only() || !enabled()) 13675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ui::TEXT_INPUT_TYPE_NONE; 13685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return text_input_type_; 13695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 13705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 13715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ui::TextInputMode Textfield::GetTextInputMode() const { 13725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ui::TEXT_INPUT_MODE_DEFAULT; 13735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 13745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 13755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool Textfield::CanComposeInline() const { 13765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 13775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 13785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 13795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)gfx::Rect Textfield::GetCaretBounds() const { 13805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Rect rect = GetRenderText()->GetUpdatedCursorBounds(); 13815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ConvertRectToScreen(this, &rect); 13825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return rect; 13835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 13845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 13855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool Textfield::GetCompositionCharacterBounds(uint32 index, 13865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Rect* rect) const { 13875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(rect); 13885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!HasCompositionText()) 13895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 13905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::RenderText* render_text = GetRenderText(); 13915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Range& composition_range = render_text->GetCompositionRange(); 13925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!composition_range.is_empty()); 13935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 13945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t text_index = composition_range.start() + index; 13955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (composition_range.end() <= text_index) 13965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 1397010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!render_text->IsValidCursorIndex(text_index)) { 13985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) text_index = render_text->IndexOfAdjacentGrapheme( 13995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) text_index, gfx::CURSOR_BACKWARD); 14005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 14015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (text_index < composition_range.start()) 14025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 14035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::SelectionModel caret(text_index, gfx::CURSOR_BACKWARD); 14045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *rect = render_text->GetCursorBounds(caret, false); 14055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ConvertRectToScreen(this, rect); 14065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 14075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 14085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 14095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool Textfield::HasCompositionText() const { 14105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return model_->HasCompositionText(); 14115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 14125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 14135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool Textfield::GetTextRange(gfx::Range* range) const { 14145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!ImeEditingAllowed()) 14155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 14165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 14175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) model_->GetTextRange(range); 14185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 14195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 14205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 14215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool Textfield::GetCompositionTextRange(gfx::Range* range) const { 14225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!ImeEditingAllowed()) 14235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 14245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 14255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) model_->GetCompositionTextRange(range); 14265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 14275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 14285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 14295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool Textfield::GetSelectionRange(gfx::Range* range) const { 14305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!ImeEditingAllowed()) 14315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 14325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *range = GetRenderText()->selection(); 14335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 14345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 14355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 14365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool Textfield::SetSelectionRange(const gfx::Range& range) { 14375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!ImeEditingAllowed() || !range.IsValid()) 14385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 14395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnBeforeUserAction(); 14405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SelectRange(range); 14415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnAfterUserAction(); 14425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 14435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 14445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 14455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool Textfield::DeleteRange(const gfx::Range& range) { 14465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!ImeEditingAllowed() || range.is_empty()) 14475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 14485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 14495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnBeforeUserAction(); 14505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) model_->SelectRange(range); 14515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (model_->HasSelection()) { 14525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) model_->DeleteSelection(); 14535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UpdateAfterChange(true, true); 14545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 14555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnAfterUserAction(); 14565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 14575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 14585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 14595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool Textfield::GetTextFromRange(const gfx::Range& range, 14605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16* range_text) const { 14615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!ImeEditingAllowed() || !range.IsValid()) 14625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 14635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 14645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Range text_range; 14655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GetTextRange(&text_range) || !text_range.Contains(range)) 14665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 14675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 14685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *range_text = model_->GetTextFromRange(range); 14695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 14705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 14715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 14725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Textfield::OnInputMethodChanged() {} 14735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 14745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool Textfield::ChangeTextDirectionAndLayoutAlignment( 14755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::i18n::TextDirection direction) { 14765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Restore text directionality mode when the indicated direction matches the 14775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // current forced mode; otherwise, force the mode indicated. This helps users 14785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // manage BiDi text layout without getting stuck in forced LTR or RTL modes. 14795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::DirectionalityMode mode = direction == base::i18n::RIGHT_TO_LEFT ? 14805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::DIRECTIONALITY_FORCE_RTL : gfx::DIRECTIONALITY_FORCE_LTR; 14815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (mode == GetRenderText()->directionality_mode()) 14825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetRenderText()->SetDirectionalityMode(gfx::DIRECTIONALITY_FROM_TEXT); 14835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) else 14845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetRenderText()->SetDirectionalityMode(mode); 14855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SchedulePaint(); 14865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 14875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 14885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 14895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Textfield::ExtendSelectionAndDelete(size_t before, size_t after) { 14905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Range range = GetRenderText()->selection(); 14915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK_GE(range.start(), before); 14925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 14935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) range.set_start(range.start() - before); 14945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) range.set_end(range.end() + after); 14955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Range text_range; 14965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (GetTextRange(&text_range) && text_range.Contains(range)) 14975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DeleteRange(range); 14985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 14995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 15005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Textfield::EnsureCaretInRect(const gfx::Rect& rect) {} 15015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 15025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Textfield::OnCandidateWindowShown() {} 15035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 15045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Textfield::OnCandidateWindowUpdated() {} 15055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 15065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Textfield::OnCandidateWindowHidden() {} 15075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 150846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)bool Textfield::IsEditingCommandEnabled(int command_id) { 150946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return IsCommandIdEnabled(command_id); 151046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 151146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 151246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void Textfield::ExecuteEditingCommand(int command_id) { 151346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ExecuteCommand(command_id); 151446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 151546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 15165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 15175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Textfield, protected: 15185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 15195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)gfx::RenderText* Textfield::GetRenderText() const { 15205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return model_->render_text(); 15215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 15225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 15235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 Textfield::GetSelectionClipboardText() const { 15245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 selection_clipboard_text; 15255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::Clipboard::GetForCurrentThread()->ReadText( 15265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::CLIPBOARD_TYPE_SELECTION, &selection_clipboard_text); 15275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return selection_clipboard_text; 15285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 15295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 15305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 15315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Textfield, private: 15325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 15335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Textfield::AccessibilitySetValue(const base::string16& new_value) { 153458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!read_only()) { 153558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) SetText(new_value); 153658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ClearSelection(); 153758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 153858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 153958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 15405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Textfield::UpdateBackgroundColor() { 15415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const SkColor color = GetBackgroundColor(); 15425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) set_background(Background::CreateSolidBackground(color)); 15435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetRenderText()->set_background_is_transparent(SkColorGetA(color) != 0xFF); 15445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SchedulePaint(); 15455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Textfield::UpdateAfterChange(bool text_changed, bool cursor_changed) { 15485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (text_changed) { 15495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (controller_) 15505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) controller_->ContentsChanged(this, text()); 1551a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NotifyAccessibilityEvent(ui::AX_EVENT_TEXT_CHANGED, true); 15525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 15535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (cursor_changed) { 15545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) cursor_visible_ = true; 15555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RepaintCursor(); 15565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (cursor_repaint_timer_.IsRunning()) 1557010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cursor_repaint_timer_.Reset(); 15585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!text_changed) { 15595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TEXT_CHANGED implies SELECTION_CHANGED, so we only need to fire 15605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // this if only the selection changed. 1561a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NotifyAccessibilityEvent(ui::AX_EVENT_SELECTION_CHANGED, true); 15625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 15635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 15645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (text_changed || cursor_changed) { 15655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnCaretBoundsChanged(); 15665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SchedulePaint(); 15675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 15685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 15695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 15705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Textfield::UpdateCursor() { 15715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const size_t caret_blink_ms = Textfield::GetCaretBlinkMs(); 15725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) cursor_visible_ = !cursor_visible_ || (caret_blink_ms == 0); 15735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RepaintCursor(); 15745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 15755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 15765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Textfield::RepaintCursor() { 15775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Rect r(GetRenderText()->GetUpdatedCursorBounds()); 15785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) r.Inset(-1, -1, -1, -1); 15795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SchedulePaintInRect(r); 15805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 15815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 15825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Textfield::PaintTextAndCursor(gfx::Canvas* canvas) { 15835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TRACE_EVENT0("views", "Textfield::PaintTextAndCursor"); 15845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) canvas->Save(); 15855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 15865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Draw placeholder text if needed. 15875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::RenderText* render_text = GetRenderText(); 15885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (text().empty() && !GetPlaceholderText().empty()) { 15895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) canvas->DrawStringRect(GetPlaceholderText(), GetFontList(), 15905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) placeholder_text_color(), render_text->display_rect()); 15915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 15925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 15935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Draw the text, cursor, and selection. 15945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_text->set_cursor_visible(cursor_visible_ && !drop_cursor_visible_ && 15955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) !HasSelection()); 15965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_text->Draw(canvas); 15975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 15985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Draw the detached drop cursor that marks where the text will be dropped. 15995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (drop_cursor_visible_) 16005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_text->DrawCursor(canvas, drop_cursor_position_); 16015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 16025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) canvas->Restore(); 16035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 16045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 16055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Textfield::MoveCursorTo(const gfx::Point& point, bool select) { 16065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (model_->MoveCursorTo(point, select)) 16075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UpdateAfterChange(false, true); 16085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 16095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1610cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Textfield::SelectThroughLastDragLocation() { 1611cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) OnBeforeUserAction(); 1612cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) model_->MoveCursorTo(last_drag_location_, true); 1613cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (aggregated_clicks_ == 1) { 1614cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) model_->SelectWord(); 1615cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Expand the selection so the initially selected word remains selected. 1616cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) gfx::Range selection = GetRenderText()->selection(); 1617cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const size_t min = std::min(selection.GetMin(), 1618cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) double_click_word_.GetMin()); 1619cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const size_t max = std::max(selection.GetMax(), 1620cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) double_click_word_.GetMax()); 1621cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const bool reversed = selection.is_reversed(); 1622cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) selection.set_start(reversed ? max : min); 1623cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) selection.set_end(reversed ? min : max); 1624cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) model_->SelectRange(selection); 1625cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1626cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) UpdateAfterChange(false, true); 1627cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) OnAfterUserAction(); 1628cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1629cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 16305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Textfield::OnCaretBoundsChanged() { 16315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (GetInputMethod()) 16325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetInputMethod()->OnCaretBoundsChanged(this); 16335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (touch_selection_controller_) 16345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) touch_selection_controller_->SelectionChanged(); 16355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 16365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 16375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Textfield::OnBeforeUserAction() { 1638c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DCHECK(!performing_user_action_); 1639c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch performing_user_action_ = true; 16405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (controller_) 16415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) controller_->OnBeforeUserAction(this); 16425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 16435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 16445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Textfield::OnAfterUserAction() { 16455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (controller_) 16465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) controller_->OnAfterUserAction(this); 1647c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DCHECK(performing_user_action_); 1648c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch performing_user_action_ = false; 16495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 16505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 16515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool Textfield::Cut() { 16525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!read_only() && text_input_type_ != ui::TEXT_INPUT_TYPE_PASSWORD && 16535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) model_->Cut()) { 16545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (controller_) 1655c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch controller_->OnAfterCutOrCopy(ui::CLIPBOARD_TYPE_COPY_PASTE); 16565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 16575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 16585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 16595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 16605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 16615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool Textfield::Copy() { 16625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (text_input_type_ != ui::TEXT_INPUT_TYPE_PASSWORD && model_->Copy()) { 16635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (controller_) 1664c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch controller_->OnAfterCutOrCopy(ui::CLIPBOARD_TYPE_COPY_PASTE); 16655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 16665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 16675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 16685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 16695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 16705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool Textfield::Paste() { 16715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!read_only() && model_->Paste()) { 16725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (controller_) 16735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) controller_->OnAfterPaste(); 16745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 16755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 16765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 16775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 16785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 16795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Textfield::UpdateContextMenu() { 16805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!context_menu_contents_.get()) { 16815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) context_menu_contents_.reset(new ui::SimpleMenuModel(this)); 16825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) context_menu_contents_->AddItemWithStringId(IDS_APP_UNDO, IDS_APP_UNDO); 16835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) context_menu_contents_->AddSeparator(ui::NORMAL_SEPARATOR); 16845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) context_menu_contents_->AddItemWithStringId(IDS_APP_CUT, IDS_APP_CUT); 16855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) context_menu_contents_->AddItemWithStringId(IDS_APP_COPY, IDS_APP_COPY); 16865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) context_menu_contents_->AddItemWithStringId(IDS_APP_PASTE, IDS_APP_PASTE); 16875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) context_menu_contents_->AddItemWithStringId(IDS_APP_DELETE, IDS_APP_DELETE); 16885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) context_menu_contents_->AddSeparator(ui::NORMAL_SEPARATOR); 16895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) context_menu_contents_->AddItemWithStringId(IDS_APP_SELECT_ALL, 16905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IDS_APP_SELECT_ALL); 16915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (controller_) 16925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) controller_->UpdateContextMenu(context_menu_contents_.get()); 16935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 16945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) context_menu_runner_.reset(new MenuRunner(context_menu_contents_.get())); 16955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 16965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 16975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Textfield::TrackMouseClicks(const ui::MouseEvent& event) { 16985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (event.IsOnlyLeftMouseButton()) { 16995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::TimeDelta time_delta = event.time_stamp() - last_click_time_; 17005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (time_delta.InMilliseconds() <= GetDoubleClickInterval() && 17015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) !ExceededDragThreshold(event.location() - last_click_location_)) { 17025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Upon clicking after a triple click, the count should go back to double 17035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // click and alternate between double and triple. This assignment maps 17045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // 0 to 1, 1 to 2, 2 to 1. 17055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) aggregated_clicks_ = (aggregated_clicks_ % 2) + 1; 17065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 17075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) aggregated_clicks_ = 0; 17085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 17095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) last_click_time_ = event.time_stamp(); 17105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) last_click_location_ = event.location(); 17115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 17125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 17135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 17145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool Textfield::ImeEditingAllowed() const { 17155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Disallow input method editing of password fields. 17165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::TextInputType t = GetTextInputType(); 17175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return (t != ui::TEXT_INPUT_TYPE_NONE && t != ui::TEXT_INPUT_TYPE_PASSWORD); 17185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 17195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 17205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Textfield::RevealPasswordChar(int index) { 17215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetRenderText()->SetObscuredRevealIndex(index); 17225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SchedulePaint(); 17235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 17245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (index != -1) { 17255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) password_reveal_timer_.Start(FROM_HERE, password_reveal_duration_, 17265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&Textfield::RevealPasswordChar, 17275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr(), -1)); 17285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 17295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 17305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 17315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Textfield::CreateTouchSelectionControllerAndNotifyIt() { 17325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!touch_selection_controller_) { 17335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) touch_selection_controller_.reset( 17345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::TouchSelectionController::create(this)); 17355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 17365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (touch_selection_controller_) 17375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) touch_selection_controller_->SelectionChanged(); 17385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 17395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 17405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Textfield::UpdateSelectionClipboard() const { 17415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_LINUX) && !defined(OS_CHROMEOS) 1742c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (performing_user_action_ && HasSelection()) { 17435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::ScopedClipboardWriter( 17445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::Clipboard::GetForCurrentThread(), 17455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::CLIPBOARD_TYPE_SELECTION).WriteText(GetSelectedText()); 1746c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (controller_) 1747c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch controller_->OnAfterCutOrCopy(ui::CLIPBOARD_TYPE_SELECTION); 17485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 17495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 17505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 17515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 17525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Textfield::PasteSelectionClipboard(const ui::MouseEvent& event) { 17535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(event.IsOnlyMiddleMouseButton()); 17545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!read_only()); 17555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 selection_clipboard_text = GetSelectionClipboardText(); 17565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!selection_clipboard_text.empty()) { 17575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnBeforeUserAction(); 17585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Range range = GetSelectionModel().selection(); 17595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::LogicalCursorDirection affinity = GetSelectionModel().caret_affinity(); 17605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::SelectionModel mouse = 17615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetRenderText()->FindCursorPosition(event.location()); 17625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) model_->MoveCursorTo(mouse); 17635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) model_->InsertText(selection_clipboard_text); 17645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Update the new selection range as needed. 17655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (range.GetMin() >= mouse.caret_pos()) { 17665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const size_t length = selection_clipboard_text.length(); 17675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) range = gfx::Range(range.start() + length, range.end() + length); 17685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 17695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) model_->MoveCursorTo(gfx::SelectionModel(range, affinity)); 17705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UpdateAfterChange(true, true); 17715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnAfterUserAction(); 17725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace views 1776