172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Use of this source code is governed by a BSD-style license that can be
372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// found in the LICENSE file.
472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/autocomplete/autocomplete_edit_view_views.h"
672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/logging.h"
872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/string_util.h"
972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/utf_string_conversions.h"
1072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/app/chrome_command_ids.h"
1172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/autocomplete/autocomplete_edit.h"
1272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/autocomplete/autocomplete_match.h"
1372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/autocomplete/autocomplete_popup_model.h"
1472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/command_updater.h"
1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/views/autocomplete/autocomplete_popup_contents_view.h"
16dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/views/autocomplete/touch_autocomplete_popup_contents_view.h"
1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/views/location_bar/location_bar_view.h"
18dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h"
19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_service.h"
2072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "googleurl/src/gurl.h"
2172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "grit/generated_resources.h"
2272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "net/base/escape.h"
23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "ui/base/accessibility/accessible_view_state.h"
24dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "ui/base/dragdrop/drag_drop_types.h"
2572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_util.h"
26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "ui/base/resource/resource_bundle.h"
2772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/font.h"
2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "views/border.h"
29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "views/controls/textfield/textfield.h"
3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "views/layout/fill_layout.h"
3172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
3272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsennamespace {
3372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
3472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Textfield for autocomplete that intercepts events that are necessary
3572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// for AutocompleteEditViewViews.
3672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass AutocompleteTextfield : public views::Textfield {
3772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen public:
3872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  explicit AutocompleteTextfield(
3972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      AutocompleteEditViewViews* autocomplete_edit_view)
4072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      : views::Textfield(views::Textfield::STYLE_DEFAULT),
4172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        autocomplete_edit_view_(autocomplete_edit_view) {
4272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DCHECK(autocomplete_edit_view_);
4372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    RemoveBorder();
4472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
4672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // views::View implementation
47dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void OnFocus() OVERRIDE {
48dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    views::Textfield::OnFocus();
4972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    autocomplete_edit_view_->HandleFocusIn();
5072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
5172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
52dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void OnBlur() OVERRIDE {
53dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    views::Textfield::OnBlur();
5472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    autocomplete_edit_view_->HandleFocusOut();
5572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
5672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual bool OnKeyPressed(const views::KeyEvent& event) OVERRIDE {
58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    bool handled = views::Textfield::OnKeyPressed(event);
59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return autocomplete_edit_view_->HandleAfterKeyEvent(event, handled) ||
60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        handled;
6172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
6272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual bool OnKeyReleased(const views::KeyEvent& event) OVERRIDE {
64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return autocomplete_edit_view_->HandleKeyReleaseEvent(event);
6572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
6672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
67dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual bool IsFocusable() const OVERRIDE {
6872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // Bypass Textfield::IsFocusable. The omnibox in popup window requires
6972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // focus in order for text selection to work.
7072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    return views::View::IsFocusable();
7172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
7272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
7372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen private:
7472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  AutocompleteEditViewViews* autocomplete_edit_view_;
7572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
7672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(AutocompleteTextfield);
7772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen};
7872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
7972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Stores omnibox state for each tab.
8072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenstruct ViewState {
81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  explicit ViewState(const ui::Range& selection_range)
8272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      : selection_range(selection_range) {
8372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
8472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
8572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Range of selected text.
86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ui::Range selection_range;
8772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen};
8872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
8972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenstruct AutocompleteEditState {
9072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  AutocompleteEditState(const AutocompleteEditModel::State& model_state,
9172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                        const ViewState& view_state)
9272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      : model_state(model_state),
9372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        view_state(view_state) {
9472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
9572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
9672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  const AutocompleteEditModel::State model_state;
9772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  const ViewState view_state;
9872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen};
9972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
10072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Returns a lazily initialized property bag accessor for saving our state in a
10172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// TabContents.
10272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenPropertyAccessor<AutocompleteEditState>* GetStateAccessor() {
10372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  static PropertyAccessor<AutocompleteEditState> state;
10472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return &state;
10572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
10672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
10772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenconst int kAutocompleteVerticalMargin = 4;
10872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
10972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}  // namespace
11072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
11172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenAutocompleteEditViewViews::AutocompleteEditViewViews(
11272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    AutocompleteEditController* controller,
11372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ToolbarModel* toolbar_model,
11472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    Profile* profile,
11572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    CommandUpdater* command_updater,
11672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    bool popup_window_mode,
11772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const views::View* location_bar)
11872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    : model_(new AutocompleteEditModel(this, controller, profile)),
119dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      popup_view_(CreatePopupView(profile, location_bar)),
12072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      controller_(controller),
12172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      toolbar_model_(toolbar_model),
12272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      command_updater_(command_updater),
12372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      popup_window_mode_(popup_window_mode),
12472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      security_level_(ToolbarModel::NONE),
125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      ime_composing_before_change_(false),
12672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      delete_at_end_pressed_(false) {
12772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  set_border(views::Border::CreateEmptyBorder(kAutocompleteVerticalMargin, 0,
12872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                              kAutocompleteVerticalMargin, 0));
12972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
13072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
13172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenAutocompleteEditViewViews::~AutocompleteEditViewViews() {
13272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  NotificationService::current()->Notify(
13372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      NotificationType::AUTOCOMPLETE_EDIT_DESTROYED,
13472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      Source<AutocompleteEditViewViews>(this),
13572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      NotificationService::NoDetails());
13672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Explicitly teardown members which have a reference to us.  Just to be safe
13772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // we want them to be destroyed before destroying any other internal state.
13872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  popup_view_.reset();
13972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  model_.reset();
14072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
14172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
14272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen////////////////////////////////////////////////////////////////////////////////
14372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// AutocompleteEditViewViews public:
14472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
14572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid AutocompleteEditViewViews::Init() {
14672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // The height of the text view is going to change based on the font used.  We
14772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // don't want to stretch the height, and we want it vertically centered.
14872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // TODO(oshima): make sure the above happens with views.
14972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  textfield_ = new AutocompleteTextfield(this);
15072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  textfield_->SetController(this);
15172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#if defined(TOUCH_UI)
153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  textfield_->SetFont(ui::ResourceBundle::GetSharedInstance().GetFont(
154ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      ResourceBundle::LargeFont));
155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#endif
156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
15772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (popup_window_mode_)
15872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    textfield_->SetReadOnly(true);
15972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
16072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Manually invoke SetBaseColor() because TOOLKIT_VIEWS doesn't observe
16172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // themes.
16272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SetBaseColor();
16372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
16472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
16572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid AutocompleteEditViewViews::SetBaseColor() {
16672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // TODO(oshima): Implment style change.
16772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  NOTIMPLEMENTED();
16872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
16972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
17072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool AutocompleteEditViewViews::HandleAfterKeyEvent(
17172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const views::KeyEvent& event,
17272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    bool handled) {
17372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (event.key_code() == ui::VKEY_RETURN) {
17472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    bool alt_held = event.IsAltDown();
17572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    model_->AcceptInput(alt_held ? NEW_FOREGROUND_TAB : CURRENT_TAB, false);
17672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    handled = true;
17772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  } else if (!handled && event.key_code() == ui::VKEY_ESCAPE) {
17872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // We can handle the Escape key if textfield did not handle it.
17972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // If it's not handled by us, then we need to propagate it up to the parent
18072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // widgets, so that Escape accelerator can still work.
18172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    handled = model_->OnEscapeKeyPressed();
18272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  } else if (event.key_code() == ui::VKEY_CONTROL) {
18372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // Omnibox2 can switch its contents while pressing a control key. To switch
18472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // the contents of omnibox2, we notify the AutocompleteEditModel class when
18572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // the control-key state is changed.
18672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    model_->OnControlKeyChanged(true);
187ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  } else if (!handled && event.key_code() == ui::VKEY_DELETE &&
18872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen             event.IsShiftDown()) {
18972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // If shift+del didn't change the text, we let this delete an entry from
19072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // the popup.  We can't check to see if the IME handled it because even if
19172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // nothing is selected, the IME or the TextView still report handling it.
192dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (model_->popup_model()->IsOpen())
193dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      model_->popup_model()->TryDeletingCurrentItem();
19472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  } else if (!handled && event.key_code() == ui::VKEY_UP) {
19572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    model_->OnUpOrDownKeyPressed(-1);
19672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    handled = true;
19772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  } else if (!handled && event.key_code() == ui::VKEY_DOWN) {
19872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    model_->OnUpOrDownKeyPressed(1);
19972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    handled = true;
20072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  } else if (!handled &&
20172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen             event.key_code() == ui::VKEY_TAB &&
20272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen             !event.IsShiftDown() &&
20372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen             !event.IsControlDown()) {
20472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (model_->is_keyword_hint()) {
20572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      handled = model_->AcceptKeyword();
20672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    } else {
20772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      string16::size_type start = 0;
20872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      string16::size_type end = 0;
20972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      size_t length = GetTextLength();
21072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      GetSelectionBounds(&start, &end);
21172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      if (start != end || start < length) {
21272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        OnBeforePossibleChange();
21372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        SelectRange(length, length);
21472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        OnAfterPossibleChange();
21572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        handled = true;
21672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      }
21772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
21872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      // TODO(Oshima): handle instant
21972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    }
22072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
22172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // TODO(oshima): page up & down
22272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
22372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return handled;
22472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
22572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
22672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool AutocompleteEditViewViews::HandleKeyReleaseEvent(
22772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const views::KeyEvent& event) {
22872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Omnibox2 can switch its contents while pressing a control key. To switch
22972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // the contents of omnibox2, we notify the AutocompleteEditModel class when
23072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // the control-key state is changed.
23172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (event.key_code() == ui::VKEY_CONTROL) {
23272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // TODO(oshima): investigate if we need to support keyboard with two
23372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // controls. See autocomplete_edit_view_gtk.cc.
23472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    model_->OnControlKeyChanged(false);
23572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    return true;
23672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
23772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return false;
23872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
23972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
24072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid AutocompleteEditViewViews::HandleFocusIn() {
24172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // TODO(oshima): Get control key state.
24272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  model_->OnSetFocus(false);
24372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Don't call controller_->OnSetFocus as this view has already
24472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // acquired the focus.
24572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
24672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
24772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid AutocompleteEditViewViews::HandleFocusOut() {
24872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // TODO(oshima): we don't have native view. This requires
24972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // further refactoring.
250dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  model_->OnWillKillFocus(NULL);
25172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Close the popup.
25272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ClosePopup();
25372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Tell the model to reset itself.
25472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  model_->OnKillFocus();
25572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  controller_->OnKillFocus();
25672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
25772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
25872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen////////////////////////////////////////////////////////////////////////////////
25972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// AutocompleteEditViewViews, views::View implementation:
26072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid AutocompleteEditViewViews::Layout() {
26172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  gfx::Insets insets = GetInsets();
26272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  textfield_->SetBounds(insets.left(), insets.top(),
26372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                        width() - insets.width(),
26472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                        height() - insets.height());
26572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
26672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
267ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid AutocompleteEditViewViews::GetAccessibleState(
268ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ui::AccessibleViewState* state) {
269ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  state->name = l10n_util::GetStringUTF16(IDS_ACCNAME_LOCATION);
270ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
271ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
27272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen////////////////////////////////////////////////////////////////////////////////
27372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// AutocompleteEditViewViews, AutocopmleteEditView implementation:
27472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
27572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenAutocompleteEditModel* AutocompleteEditViewViews::model() {
27672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return model_.get();
27772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
27872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
27972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenconst AutocompleteEditModel* AutocompleteEditViewViews::model() const {
28072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return model_.get();
28172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
28272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
28372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid AutocompleteEditViewViews::SaveStateToTab(TabContents* tab) {
28472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DCHECK(tab);
28572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
28672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // NOTE: GetStateForTabSwitch may affect GetSelection, so order is important.
28772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  AutocompleteEditModel::State model_state = model_->GetStateForTabSwitch();
288ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ui::Range selection;
28972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  textfield_->GetSelectedRange(&selection);
29072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  GetStateAccessor()->SetProperty(
29172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      tab->property_bag(),
29272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      AutocompleteEditState(model_state, ViewState(selection)));
29372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
29472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
29572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid AutocompleteEditViewViews::Update(const TabContents* contents) {
29672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // NOTE: We're getting the URL text here from the ToolbarModel.
29772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool visibly_changed_permanent_text =
29872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      model_->UpdatePermanentText(WideToUTF16Hack(toolbar_model_->GetText()));
29972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
30072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ToolbarModel::SecurityLevel security_level =
30172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        toolbar_model_->GetSecurityLevel();
30272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool changed_security_level = (security_level != security_level_);
30372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  security_level_ = security_level;
30472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
30572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // TODO(oshima): Copied from gtk implementation which is
30672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // slightly different from WIN impl. Find out the correct implementation
30772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // for views-implementation.
30872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (contents) {
30972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    RevertAll();
31072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const AutocompleteEditState* state =
31172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        GetStateAccessor()->GetProperty(contents->property_bag());
31272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (state) {
31372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      model_->RestoreState(state->model_state);
31472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
31572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      // Move the marks for the cursor and the other end of the selection to
31672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      // the previously-saved offsets (but preserve PRIMARY).
31772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      textfield_->SelectRange(state->view_state.selection_range);
31872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    }
31972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  } else if (visibly_changed_permanent_text) {
32072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    RevertAll();
32172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  } else if (changed_security_level) {
32272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    EmphasizeURLComponents();
32372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
32472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
32572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
32672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid AutocompleteEditViewViews::OpenURL(const GURL& url,
32772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                        WindowOpenDisposition disposition,
32872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                        PageTransition::Type transition,
32972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                        const GURL& alternate_nav_url,
33072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                        size_t selected_line,
33172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                        const string16& keyword) {
33272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (!url.is_valid())
33372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    return;
33472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
33572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  model_->OpenURL(url, disposition, transition, alternate_nav_url,
33672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                  selected_line, keyword);
33772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
33872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
33972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenstring16 AutocompleteEditViewViews::GetText() const {
34072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // TODO(oshima): IME support
34172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return textfield_->text();
34272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
34372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
34472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool AutocompleteEditViewViews::IsEditingOrEmpty() const {
34572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return model_->user_input_in_progress() || (GetTextLength() == 0);
34672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
34772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
34872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenint AutocompleteEditViewViews::GetIcon() const {
34972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return IsEditingOrEmpty() ?
35072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      AutocompleteMatch::TypeToIcon(model_->CurrentTextType()) :
35172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      toolbar_model_->GetIcon();
35272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
35372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
35472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid AutocompleteEditViewViews::SetUserText(const string16& text) {
35572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SetUserText(text, text, true);
35672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
35772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
35872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid AutocompleteEditViewViews::SetUserText(const string16& text,
35972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                            const string16& display_text,
36072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                            bool update_popup) {
36172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  model_->SetUserText(text);
36272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SetWindowTextAndCaretPos(display_text, display_text.length());
36372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (update_popup)
36472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    UpdatePopup();
36572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TextChanged();
36672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
36772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
36872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid AutocompleteEditViewViews::SetWindowTextAndCaretPos(
36972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const string16& text,
37072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    size_t caret_pos) {
371ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const ui::Range range(caret_pos, caret_pos);
37272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SetTextAndSelectedRange(text, range);
37372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
37472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
37572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid AutocompleteEditViewViews::SetForcedQuery() {
37672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  const string16 current_text(GetText());
37772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  const size_t start = current_text.find_first_not_of(kWhitespaceUTF16);
37872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (start == string16::npos || (current_text[start] != '?')) {
37972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    SetUserText(ASCIIToUTF16("?"));
38072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  } else {
38172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    SelectRange(current_text.size(), start + 1);
38272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
38372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
38472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
38572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool AutocompleteEditViewViews::IsSelectAll() {
38672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // TODO(oshima): IME support.
38772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return textfield_->text() == textfield_->GetSelectedText();
38872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
38972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
39072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool AutocompleteEditViewViews::DeleteAtEndPressed() {
39172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return delete_at_end_pressed_;
39272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
39372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
39472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid AutocompleteEditViewViews::GetSelectionBounds(
39572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    string16::size_type* start,
39672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    string16::size_type* end) {
397ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ui::Range range;
39872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  textfield_->GetSelectedRange(&range);
39972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  *start = static_cast<size_t>(range.end());
40072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  *end = static_cast<size_t>(range.start());
40172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
40272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
40372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid AutocompleteEditViewViews::SelectAll(bool reversed) {
40472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (reversed)
40572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    SelectRange(GetTextLength(), 0);
40672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  else
40772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    SelectRange(0, GetTextLength());
40872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
40972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
41072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid AutocompleteEditViewViews::RevertAll() {
41172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ClosePopup();
41272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  model_->Revert();
41372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TextChanged();
41472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
41572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
41672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid AutocompleteEditViewViews::UpdatePopup() {
41772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  model_->SetInputInProgress(true);
41872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (!model_->has_focus())
41972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    return;
42072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
42172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Don't inline autocomplete when the caret/selection isn't at the end of
42272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // the text, or in the middle of composition.
423ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ui::Range sel;
42472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  textfield_->GetSelectedRange(&sel);
425ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool no_inline_autocomplete =
426ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      sel.GetMax() < GetTextLength() || textfield_->IsIMEComposing();
42772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
42872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  model_->StartAutocomplete(!sel.is_empty(), no_inline_autocomplete);
42972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
43072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
43172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid AutocompleteEditViewViews::ClosePopup() {
432dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  model_->StopAutocomplete();
43372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
43472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
43572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid AutocompleteEditViewViews::SetFocus() {
43672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // In views-implementation, the focus is on textfield rather than
43772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // AutocompleteEditView.
43872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  textfield_->RequestFocus();
43972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
44072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
44172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid AutocompleteEditViewViews::OnTemporaryTextMaybeChanged(
44272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const string16& display_text,
44372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    bool save_original_selection) {
44472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (save_original_selection)
44572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    textfield_->GetSelectedRange(&saved_temporary_selection_);
44672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
44772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SetWindowTextAndCaretPos(display_text, display_text.length());
44872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TextChanged();
44972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
45072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
45172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool AutocompleteEditViewViews::OnInlineAutocompleteTextMaybeChanged(
45272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const string16& display_text,
45372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    size_t user_text_length) {
45472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (display_text == GetText())
45572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    return false;
456ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ui::Range range(display_text.size(), user_text_length);
45772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SetTextAndSelectedRange(display_text, range);
45872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TextChanged();
45972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return true;
46072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
46172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
46272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid AutocompleteEditViewViews::OnRevertTemporaryText() {
46372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  textfield_->SelectRange(saved_temporary_selection_);
46472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TextChanged();
46572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
46672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
46772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid AutocompleteEditViewViews::OnBeforePossibleChange() {
46872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Record our state.
46972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  text_before_change_ = GetText();
47072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  textfield_->GetSelectedRange(&sel_before_change_);
471ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ime_composing_before_change_ = textfield_->IsIMEComposing();
47272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
47372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
47472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool AutocompleteEditViewViews::OnAfterPossibleChange() {
475ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ui::Range new_sel;
47672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  textfield_->GetSelectedRange(&new_sel);
47772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
47872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // See if the text or selection have changed since OnBeforePossibleChange().
479ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const string16 new_text = GetText();
480ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const bool text_changed = (new_text != text_before_change_) ||
481ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      (ime_composing_before_change_ != textfield_->IsIMEComposing());
482ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const bool selection_differs =
48372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      !((sel_before_change_.is_empty() && new_sel.is_empty()) ||
48472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        sel_before_change_.EqualsIgnoringDirection(new_sel));
48572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
48672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // When the user has deleted text, we don't allow inline autocomplete.  Make
48772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // sure to not flag cases like selecting part of the text and then pasting
48872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // (or typing) the prefix of that selection.  (We detect these by making
48972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // sure the caret, which should be after any insertion, hasn't moved
49072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // forward of the old selection start.)
491ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const bool just_deleted_text =
49272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      (text_before_change_.length() > new_text.length()) &&
49372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      (new_sel.start() <= sel_before_change_.GetMin());
49472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
495ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const bool something_changed = model_->OnAfterPossibleChange(
496ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      new_text, new_sel.start(), new_sel.end(), selection_differs,
497ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      text_changed, just_deleted_text, !textfield_->IsIMEComposing());
49872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
499dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // If only selection was changed, we don't need to call |model_|'s
50072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // OnChanged() method, which is called in TextChanged().
50172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // But we still need to call EmphasizeURLComponents() to make sure the text
50272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // attributes are updated correctly.
503ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (something_changed && text_changed)
50472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    TextChanged();
505ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  else if (selection_differs)
50672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    EmphasizeURLComponents();
507ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  else if (delete_at_end_pressed_)
508dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    model_->OnChanged();
50972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
51072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return something_changed;
51172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
51272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
51372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsengfx::NativeView AutocompleteEditViewViews::GetNativeView() const {
51472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return GetWidget()->GetNativeView();
51572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
51672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
51772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenCommandUpdater* AutocompleteEditViewViews::GetCommandUpdater() {
51872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return command_updater_;
51972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
52072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
521ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid AutocompleteEditViewViews::SetInstantSuggestion(const string16& input,
522ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                                     bool animate_to_complete) {
52372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  NOTIMPLEMENTED();
52472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
52572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
52672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenstring16 AutocompleteEditViewViews::GetInstantSuggestion() const {
52772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  NOTIMPLEMENTED();
52872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return string16();
52972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
53072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
53172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenint AutocompleteEditViewViews::TextWidth() const {
53272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // TODO(oshima): add horizontal margin.
53372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return textfield_->font().GetStringWidth(textfield_->text());
53472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
53572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
53672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool AutocompleteEditViewViews::IsImeComposing() const {
53772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return false;
53872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
53972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
54072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenviews::View* AutocompleteEditViewViews::AddToView(views::View* parent) {
54172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  parent->AddChildView(this);
54272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  AddChildView(textfield_);
54372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return this;
54472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
54572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
546dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenint AutocompleteEditViewViews::OnPerformDrop(
547dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const views::DropTargetEvent& event) {
548dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  NOTIMPLEMENTED();
549dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return ui::DragDropTypes::DRAG_NONE;
550dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
551dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
55272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen////////////////////////////////////////////////////////////////////////////////
55372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// AutocompleteEditViewViews, NotificationObserver implementation:
55472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
55572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid AutocompleteEditViewViews::Observe(NotificationType type,
55672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                      const NotificationSource& source,
55772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                      const NotificationDetails& details) {
55872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DCHECK(type == NotificationType::BROWSER_THEME_CHANGED);
55972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SetBaseColor();
56072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
56172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
56272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen////////////////////////////////////////////////////////////////////////////////
563ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// AutocompleteEditViewViews, views::TextfieldController implementation:
56472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
56572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid AutocompleteEditViewViews::ContentsChanged(views::Textfield* sender,
56672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                                const string16& new_contents) {
56772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
56872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
56972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool AutocompleteEditViewViews::HandleKeyEvent(
57072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    views::Textfield* textfield,
57172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const views::KeyEvent& event) {
572ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  delete_at_end_pressed_ = false;
57372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
57472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (event.key_code() == ui::VKEY_BACK) {
57572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // Checks if it's currently in keyword search mode.
57672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (model_->is_keyword_hint() || model_->keyword().empty())
57772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      return false;
57872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // If there is selection, let textfield handle the backspace.
579ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (textfield_->HasSelection())
58072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      return false;
58172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // If not at the begining of the text, let textfield handle the backspace.
58272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (textfield_->GetCursorPosition())
58372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      return false;
58472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    model_->ClearKeyword(GetText());
58572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    return true;
58672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
58772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
588ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (event.key_code() == ui::VKEY_DELETE && !event.IsAltDown()) {
589ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    delete_at_end_pressed_ =
590ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        (!textfield_->HasSelection() &&
591ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen         textfield_->GetCursorPosition() == textfield_->text().length());
592ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
593ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
59472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return false;
59572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
59672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
597ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid AutocompleteEditViewViews::OnBeforeUserAction(views::Textfield* sender) {
598ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  OnBeforePossibleChange();
599ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
600ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
601ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid AutocompleteEditViewViews::OnAfterUserAction(views::Textfield* sender) {
602ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  OnAfterPossibleChange();
603ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
604ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
60572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen////////////////////////////////////////////////////////////////////////////////
60672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// AutocompleteEditViewViews, private:
60772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
60872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsensize_t AutocompleteEditViewViews::GetTextLength() const {
60972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // TODO(oshima): Support instant, IME.
61072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return textfield_->text().length();
61172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
61272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
61372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid AutocompleteEditViewViews::EmphasizeURLComponents() {
61472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // TODO(oshima): Update URL visual style
61572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  NOTIMPLEMENTED();
61672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
61772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
61872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid AutocompleteEditViewViews::TextChanged() {
61972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EmphasizeURLComponents();
620dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  model_->OnChanged();
62172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
62272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
62372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid AutocompleteEditViewViews::SetTextAndSelectedRange(
62472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const string16& text,
625ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const ui::Range& range) {
62672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (text != GetText())
62772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    textfield_->SetText(text);
62872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  textfield_->SelectRange(range);
62972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
63072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
63172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenstring16 AutocompleteEditViewViews::GetSelectedText() const {
63272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // TODO(oshima): Support instant, IME.
63372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return textfield_->GetSelectedText();
63472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
63572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
63672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid AutocompleteEditViewViews::SelectRange(size_t caret, size_t end) {
637ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const ui::Range range(caret, end);
63872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  textfield_->SelectRange(range);
63972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
640dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
641dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenAutocompletePopupView* AutocompleteEditViewViews::CreatePopupView(
642dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    Profile* profile,
643dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const View* location_bar) {
644dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#if defined(TOUCH_UI)
645dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return new TouchAutocompletePopupContentsView(
646dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#else
647dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return new AutocompletePopupContentsView(
648dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#endif
649dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      gfx::Font(), this, model_.get(), profile, location_bar);
650dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
651