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