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