Chromium Code Reviews| Index: chrome/browser/ui/views/omnibox/omnibox_view_views.cc |
| diff --git a/chrome/browser/ui/views/omnibox/omnibox_view_views.cc b/chrome/browser/ui/views/omnibox/omnibox_view_views.cc |
| index 2a8b73ffdd58bc9dff75de8c5970948449d6de99..70463e4538bcbe112eb321e7d3498cb1990aaf59 100644 |
| --- a/chrome/browser/ui/views/omnibox/omnibox_view_views.cc |
| +++ b/chrome/browser/ui/views/omnibox/omnibox_view_views.cc |
| @@ -102,13 +102,6 @@ int GetEditFontPixelSize(bool popup_window_mode) { |
| kAutocompleteEditFontPixelSize; |
| } |
| -// Copies |selected_text| as text to the primary clipboard. |
| -void DoCopyText(const string16& selected_text) { |
| - ui::ScopedClipboardWriter scw(ui::Clipboard::GetForCurrentThread(), |
| - ui::Clipboard::BUFFER_STANDARD); |
| - scw.WriteText(selected_text); |
| -} |
| - |
| // This will write |url| and |text| to the clipboard as a well-formed URL. |
| void DoCopyURL(const GURL& url, const string16& text) { |
| BookmarkNodeData data; |
| @@ -118,79 +111,6 @@ void DoCopyURL(const GURL& url, const string16& text) { |
| } // namespace |
| -// Textfield for autocomplete that intercepts events that are necessary |
| -// for OmniboxViewViews. |
| -class OmniboxViewViews::AutocompleteTextfield : public views::Textfield { |
| - public: |
| - AutocompleteTextfield(OmniboxViewViews* omnibox_view, |
| - LocationBarView* location_bar_view) |
| - : views::Textfield(views::Textfield::STYLE_DEFAULT), |
| - omnibox_view_(omnibox_view), |
| - location_bar_view_(location_bar_view) { |
| - DCHECK(omnibox_view_); |
| - RemoveBorder(); |
| - set_id(VIEW_ID_OMNIBOX); |
| - } |
| - |
| - // views::View implementation |
| - virtual void OnFocus() OVERRIDE { |
| - views::Textfield::OnFocus(); |
| - omnibox_view_->HandleFocusIn(); |
| - } |
| - |
| - virtual void OnBlur() OVERRIDE { |
| - views::Textfield::OnBlur(); |
| - omnibox_view_->HandleFocusOut(); |
| - } |
| - |
| - virtual bool OnKeyPressed(const ui::KeyEvent& event) OVERRIDE { |
| - // Use our own implementation of paste. See OnPaste() for details. |
| - if (!read_only() && event.IsControlDown() && |
| - event.key_code() == ui::VKEY_V) { |
| - omnibox_view_->OnBeforePossibleChange(); |
| - omnibox_view_->OnPaste(); |
| - omnibox_view_->OnAfterPossibleChange(); |
| - return true; |
| - } |
| - bool handled = views::Textfield::OnKeyPressed(event); |
| - return omnibox_view_->HandleAfterKeyEvent(event, handled) || handled; |
| - } |
| - |
| - virtual bool OnKeyReleased(const ui::KeyEvent& event) OVERRIDE { |
| - return omnibox_view_->HandleKeyReleaseEvent(event); |
| - } |
| - |
| - virtual bool OnMousePressed(const ui::MouseEvent& event) OVERRIDE { |
| - // Pass through the views::Textfield's return value; we don't need to |
| - // override its behavior. |
| - bool result = views::Textfield::OnMousePressed(event); |
| - omnibox_view_->HandleMousePressEvent(event); |
| - return result; |
| - } |
| - |
| - virtual bool OnMouseDragged(const ui::MouseEvent& event) OVERRIDE { |
| - bool result = views::Textfield::OnMouseDragged(event); |
| - omnibox_view_->HandleMouseDragEvent(event); |
| - return result; |
| - } |
| - |
| - virtual void OnMouseReleased(const ui::MouseEvent& event) OVERRIDE { |
| - views::Textfield::OnMouseReleased(event); |
| - omnibox_view_->HandleMouseReleaseEvent(event); |
| - } |
| - |
| - virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE { |
| - views::Textfield::OnGestureEvent(event); |
| - omnibox_view_->HandleGestureEvent(*event); |
| - } |
| - |
| - private: |
| - OmniboxViewViews* omnibox_view_; |
| - LocationBarView* location_bar_view_; |
| - |
| - DISALLOW_COPY_AND_ASSIGN(AutocompleteTextfield); |
| -}; |
| - |
| // static |
| const char OmniboxViewViews::kViewClassName[] = "BrowserOmniboxViewViews"; |
| @@ -201,7 +121,6 @@ OmniboxViewViews::OmniboxViewViews(OmniboxEditController* controller, |
| bool popup_window_mode, |
| LocationBarView* location_bar) |
| : OmniboxView(profile, controller, toolbar_model, command_updater), |
| - textfield_(NULL), |
| popup_window_mode_(popup_window_mode), |
| security_level_(ToolbarModel::NONE), |
| ime_composing_before_change_(false), |
| @@ -210,6 +129,8 @@ OmniboxViewViews::OmniboxViewViews(OmniboxEditController* controller, |
| ime_candidate_window_open_(false), |
| select_all_on_mouse_release_(false), |
| select_all_on_gesture_tap_(false) { |
| + RemoveBorder(); |
| + set_id(VIEW_ID_OMNIBOX); |
| } |
| OmniboxViewViews::~OmniboxViewViews() { |
| @@ -230,24 +151,21 @@ void OmniboxViewViews::Init() { |
| // The height of the text view is going to change based on the font used. We |
| // don't want to stretch the height, and we want it vertically centered. |
| // TODO(oshima): make sure the above happens with views. |
| - textfield_ = new AutocompleteTextfield(this, location_bar_view_); |
| - textfield_->SetController(this); |
| - textfield_->SetTextInputType(ui::TEXT_INPUT_TYPE_URL); |
| - textfield_->SetBackgroundColor(location_bar_view_->GetColor( |
| + SetController(this); |
| + SetTextInputType(ui::TEXT_INPUT_TYPE_URL); |
| + SetBackgroundColor(location_bar_view_->GetColor( |
| ToolbarModel::NONE, LocationBarView::BACKGROUND)); |
| if (popup_window_mode_) |
| - textfield_->SetReadOnly(true); |
| + SetReadOnly(true); |
| const int font_size = GetEditFontPixelSize(popup_window_mode_); |
| - const int old_size = textfield_->font().GetFontSize(); |
| - if (font_size != old_size) |
| - textfield_->SetFont(textfield_->font().DeriveFont(font_size - old_size)); |
| + if (font_size != font().GetFontSize()) |
| + SetFont(font().DeriveFont(font_size - font().GetFontSize())); |
| - // Create popup view using the same font as |textfield_|'s. |
| - popup_view_.reset( |
| - OmniboxPopupContentsView::Create( |
| - textfield_->font(), this, model(), location_bar_view_)); |
| + // Initialize the popup view using the same font. |
| + popup_view_.reset(OmniboxPopupContentsView::Create( |
| + font(), this, model(), location_bar_view_)); |
| // A null-border to zero out the focused border on textfield. |
| const int vertical_margin = !popup_window_mode_ ? |
| @@ -261,28 +179,92 @@ void OmniboxViewViews::Init() { |
| } |
| gfx::Font OmniboxViewViews::GetFont() { |
| - return textfield_->font(); |
| + return font(); |
| } |
| int OmniboxViewViews::WidthOfTextAfterCursor() { |
| ui::Range sel; |
| - textfield_->GetSelectedRange(&sel); |
| + GetSelectedRange(&sel); |
| // See comments in LocationBarView::Layout as to why this uses -1. |
| const int start = std::max(0, static_cast<int>(sel.end()) - 1); |
| // TODO: add horizontal margin. |
| - return textfield_->font().GetStringWidth(GetText().substr(start)); |
| + return font().GetStringWidth(text().substr(start)); |
| +} |
| + |
| +//////////////////////////////////////////////////////////////////////////////// |
| +// OmniboxViewViews, views::View implementation: |
|
Peter Kasting
2013/02/18 18:57:47
Nit: Again, we don't directly override View.
Pers
msw
2013/02/18 20:58:21
I'm not a big fan either, but I fixed it rather th
|
| + |
| +std::string OmniboxViewViews::GetClassName() const { |
| + return kViewClassName; |
| +} |
| + |
| +void OmniboxViewViews::OnGestureEvent(ui::GestureEvent* event) { |
| + views::Textfield::OnGestureEvent(event); |
| + if (!HasFocus() && event->type() == ui::ET_GESTURE_TAP_DOWN) { |
| + select_all_on_gesture_tap_ = true; |
| + return; |
| + } |
| + if (select_all_on_gesture_tap_ && event->type() == ui::ET_GESTURE_TAP) |
| + SelectAll(false); |
| + select_all_on_gesture_tap_ = false; |
| +} |
| + |
| +void OmniboxViewViews::GetAccessibleState(ui::AccessibleViewState* state) { |
| + state->name = l10n_util::GetStringUTF16(IDS_ACCNAME_LOCATION); |
| +} |
| + |
| +void OmniboxViewViews::OnBoundsChanged(const gfx::Rect& previous_bounds) { |
| + if (popup_view_->IsOpen()) |
| + popup_view_->UpdatePopupAppearance(); |
| +} |
| + |
| +bool OmniboxViewViews::OnMousePressed(const ui::MouseEvent& event) { |
| + const bool result = views::Textfield::OnMousePressed(event); |
| + select_all_on_mouse_release_ = |
| + (event.IsOnlyLeftMouseButton() || event.IsOnlyRightMouseButton()) && |
| + (!HasFocus() || (model()->focus_state() == OMNIBOX_FOCUS_INVISIBLE)); |
| + // Restore caret visibility whenever the user clicks in the omnibox in a way |
| + // that would give it focus. We must handle this case separately here because |
| + // if the omnibox currently has invisible focus, the mouse event won't trigger |
| + // either SetFocus() or OmniboxEditModel::OnSetFocus(). |
| + if (select_all_on_mouse_release_) |
| + model()->SetCaretVisibility(true); |
| + return result; |
| +} |
| + |
| +bool OmniboxViewViews::OnMouseDragged(const ui::MouseEvent& event) { |
| + select_all_on_mouse_release_ = false; |
| + return views::Textfield::OnMouseDragged(event); |
| +} |
| + |
| +void OmniboxViewViews::OnMouseReleased(const ui::MouseEvent& event) { |
| + views::Textfield::OnMouseReleased(event); |
| + if ((event.IsOnlyLeftMouseButton() || event.IsOnlyRightMouseButton()) && |
| + select_all_on_mouse_release_) { |
| + // Select all in the reverse direction so as not to scroll the caret |
| + // into view and shift the contents jarringly. |
| + SelectAll(true); |
| + } |
| + select_all_on_mouse_release_ = false; |
| } |
| -bool OmniboxViewViews::HandleAfterKeyEvent(const ui::KeyEvent& event, |
| - bool handled) { |
| +bool OmniboxViewViews::OnKeyPressed(const ui::KeyEvent& event) { |
| + // Use our own implementation of paste. See OnPaste() for details. |
| + if (!read_only() && event.IsControlDown() && |
| + event.key_code() == ui::VKEY_V) { |
| + OnBeforePossibleChange(); |
| + OnPaste(); |
| + OnAfterPossibleChange(); |
| + return true; |
| + } |
| + bool handled = views::Textfield::OnKeyPressed(event); |
| + |
| if (event.key_code() == ui::VKEY_RETURN) { |
| bool alt_held = event.IsAltDown(); |
| model()->AcceptInput(alt_held ? NEW_FOREGROUND_TAB : CURRENT_TAB, false); |
| handled = true; |
| } else if (!handled && event.key_code() == ui::VKEY_ESCAPE) { |
| - // We can handle the Escape key if textfield did not handle it. |
| - // If it's not handled by us, then we need to propagate it up to the parent |
| - // widgets, so that Escape accelerator can still work. |
| + // Let the model handle the Escape key or continue its propagation. |
| handled = model()->OnEscapeKeyPressed(); |
| } else if (event.key_code() == ui::VKEY_CONTROL) { |
| // Omnibox2 can switch its contents while pressing a control key. To switch |
| @@ -311,7 +293,7 @@ bool OmniboxViewViews::HandleAfterKeyEvent(const ui::KeyEvent& event, |
| if (event.IsShiftDown() && |
| model()->popup_model()->selected_line_state() == |
| OmniboxPopupModel::KEYWORD) { |
| - model()->ClearKeyword(GetText()); |
| + model()->ClearKeyword(text()); |
| } else { |
| model()->OnUpOrDownKeyPressed(event.IsShiftDown() ? -1 : 1); |
| } |
| @@ -319,24 +301,24 @@ bool OmniboxViewViews::HandleAfterKeyEvent(const ui::KeyEvent& event, |
| } else { |
| string16::size_type start = 0; |
| string16::size_type end = 0; |
| - size_t length = GetTextLength(); |
| + const size_t length = text().length(); |
| GetSelectionBounds(&start, &end); |
| if (start != end || start < length) { |
| OnBeforePossibleChange(); |
| - textfield_->SelectRange(ui::Range(length, length)); |
| + SelectRange(ui::Range(length, length)); |
| OnAfterPossibleChange(); |
| handled = true; |
| } |
| - // TODO(Oshima): handle instant |
| + // TODO(msw|oshima): Handle Instant. |
| } |
| } |
| - // TODO(oshima): page up & down |
| + // TODO(msw|oshima): Handle page up and page down. |
| return handled; |
| } |
| -bool OmniboxViewViews::HandleKeyReleaseEvent(const ui::KeyEvent& event) { |
| +bool OmniboxViewViews::OnKeyReleased(const ui::KeyEvent& event) { |
| // Omnibox2 can switch its contents while pressing a control key. To switch |
| // the contents of omnibox2, we notify the OmniboxEditModel class when the |
| // control-key state is changed. |
| @@ -349,51 +331,16 @@ bool OmniboxViewViews::HandleKeyReleaseEvent(const ui::KeyEvent& event) { |
| return false; |
| } |
| -void OmniboxViewViews::HandleMousePressEvent(const ui::MouseEvent& event) { |
| - select_all_on_mouse_release_ = |
| - (event.IsOnlyLeftMouseButton() || event.IsOnlyRightMouseButton()) && |
| - (!textfield_->HasFocus() || |
| - (model()->focus_state() == OMNIBOX_FOCUS_INVISIBLE)); |
| - // Restore caret visibility whenever the user clicks in the omnibox in a way |
| - // that would give it focus. We must handle this case separately here because |
| - // if the omnibox currently has invisible focus, the mouse event won't trigger |
| - // either SetFocus() or OmniboxEditModel::OnSetFocus(). |
| - if (select_all_on_mouse_release_) |
| - model()->SetCaretVisibility(true); |
| -} |
| - |
| -void OmniboxViewViews::HandleMouseDragEvent(const ui::MouseEvent& event) { |
| - select_all_on_mouse_release_ = false; |
| -} |
| - |
| -void OmniboxViewViews::HandleMouseReleaseEvent(const ui::MouseEvent& event) { |
| - if ((event.IsOnlyLeftMouseButton() || event.IsOnlyRightMouseButton()) && |
| - select_all_on_mouse_release_) { |
| - // Select all in the reverse direction so as not to scroll the caret |
| - // into view and shift the contents jarringly. |
| - SelectAll(true); |
| - } |
| - select_all_on_mouse_release_ = false; |
| -} |
| - |
| -void OmniboxViewViews::HandleGestureEvent(const ui::GestureEvent& event) { |
| - if (!textfield_->HasFocus() && event.type() == ui::ET_GESTURE_TAP_DOWN) { |
| - select_all_on_gesture_tap_ = true; |
| - return; |
| - } |
| - if (select_all_on_gesture_tap_ && event.type() == ui::ET_GESTURE_TAP) |
| - SelectAll(false); |
| - select_all_on_gesture_tap_ = false; |
| -} |
| - |
| -void OmniboxViewViews::HandleFocusIn() { |
| +void OmniboxViewViews::OnFocus() { |
| + views::Textfield::OnFocus(); |
| // TODO(oshima): Get control key state. |
| model()->OnSetFocus(false); |
| // Don't call controller()->OnSetFocus as this view has already |
| // acquired the focus. |
| } |
| -void OmniboxViewViews::HandleFocusOut() { |
| +void OmniboxViewViews::OnBlur() { |
| + views::Textfield::OnBlur(); |
| gfx::NativeView native_view = NULL; |
| #if defined(USE_AURA) |
| views::Widget* widget = GetWidget(); |
| @@ -412,36 +359,6 @@ void OmniboxViewViews::HandleFocusOut() { |
| controller()->OnKillFocus(); |
| } |
| -void OmniboxViewViews::SetLocationEntryFocusable(bool focusable) { |
| - textfield_->set_focusable(focusable); |
| -} |
| - |
| -bool OmniboxViewViews::IsLocationEntryFocusableInRootView() const { |
| - return textfield_->IsFocusable(); |
| -} |
| - |
| -//////////////////////////////////////////////////////////////////////////////// |
| -// OmniboxViewViews, views::View implementation: |
| -void OmniboxViewViews::Layout() { |
| - gfx::Insets insets = GetInsets(); |
| - textfield_->SetBounds(insets.left(), insets.top(), |
| - width() - insets.width(), |
| - height() - insets.height()); |
| -} |
| - |
| -void OmniboxViewViews::GetAccessibleState(ui::AccessibleViewState* state) { |
| - state->name = l10n_util::GetStringUTF16(IDS_ACCNAME_LOCATION); |
| -} |
| - |
| -std::string OmniboxViewViews::GetClassName() const { |
| - return kViewClassName; |
| -} |
| - |
| -void OmniboxViewViews::OnBoundsChanged(const gfx::Rect& previous_bounds) { |
| - if (popup_view_->IsOpen()) |
| - popup_view_->UpdatePopupAppearance(); |
| -} |
| - |
| //////////////////////////////////////////////////////////////////////////////// |
| // OmniboxViewViews, OmniboxView implementation: |
| @@ -451,15 +368,15 @@ void OmniboxViewViews::SaveStateToTab(WebContents* tab) { |
| // We don't want to keep the IME status, so force quit the current |
| // session here. It may affect the selection status, so order is |
| // also important. |
| - if (textfield_->IsIMEComposing()) { |
| - textfield_->GetTextInputClient()->ConfirmCompositionText(); |
| - textfield_->GetInputMethod()->CancelComposition(textfield_); |
| + if (IsIMEComposing()) { |
| + GetTextInputClient()->ConfirmCompositionText(); |
| + GetInputMethod()->CancelComposition(this); |
| } |
| // NOTE: GetStateForTabSwitch may affect GetSelection, so order is important. |
| OmniboxEditModel::State model_state = model()->GetStateForTabSwitch(); |
| gfx::SelectionModel selection; |
| - textfield_->GetSelectionModel(&selection); |
| + GetSelectionModel(&selection); |
| tab->SetUserData( |
| kAutocompleteEditStateKey, |
| new AutocompleteEditState(model_state, ViewState(selection))); |
| @@ -486,10 +403,10 @@ void OmniboxViewViews::Update(const WebContents* contents) { |
| // Move the marks for the cursor and the other end of the selection to |
| // the previously-saved offsets (but preserve PRIMARY). |
| - textfield_->SelectSelectionModel(state->view_state.selection_model); |
| + SelectSelectionModel(state->view_state.selection_model); |
| // We do not carry over the current edit history to another tab. |
| // TODO(oshima): consider saving/restoring edit history. |
| - textfield_->ClearEditHistory(); |
| + ClearEditHistory(); |
| } |
| } else if (visibly_changed_permanent_text) { |
| RevertAll(); |
| @@ -500,7 +417,7 @@ void OmniboxViewViews::Update(const WebContents* contents) { |
| string16 OmniboxViewViews::GetText() const { |
| // TODO(oshima): IME support |
| - return textfield_->text(); |
| + return text(); |
| } |
| void OmniboxViewViews::SetWindowTextAndCaretPos(const string16& text, |
| @@ -518,17 +435,17 @@ void OmniboxViewViews::SetWindowTextAndCaretPos(const string16& text, |
| } |
| void OmniboxViewViews::SetForcedQuery() { |
| - const string16 current_text(GetText()); |
| + const string16 current_text(text()); |
| const size_t start = current_text.find_first_not_of(kWhitespaceUTF16); |
| if (start == string16::npos || (current_text[start] != '?')) |
| SetUserText(ASCIIToUTF16("?")); |
| else |
| - textfield_->SelectRange(ui::Range(current_text.size(), start + 1)); |
| + SelectRange(ui::Range(current_text.size(), start + 1)); |
| } |
| bool OmniboxViewViews::IsSelectAll() const { |
| // TODO(oshima): IME support. |
| - return textfield_->text() == textfield_->GetSelectedText(); |
| + return text() == GetSelectedText(); |
| } |
| bool OmniboxViewViews::DeleteAtEndPressed() { |
| @@ -538,12 +455,12 @@ bool OmniboxViewViews::DeleteAtEndPressed() { |
| void OmniboxViewViews::GetSelectionBounds(string16::size_type* start, |
| string16::size_type* end) const { |
| ui::Range range; |
| - textfield_->GetSelectedRange(&range); |
| + GetSelectedRange(&range); |
| if (range.is_empty()) { |
| // Omnibox API expects that selection bounds is at cursor position |
| // if there is no selection. |
| - *start = textfield_->GetCursorPosition(); |
| - *end = textfield_->GetCursorPosition(); |
| + *start = GetCursorPosition(); |
| + *end = GetCursorPosition(); |
| } else { |
| *start = static_cast<size_t>(range.end()); |
| *end = static_cast<size_t>(range.start()); |
| @@ -551,7 +468,7 @@ void OmniboxViewViews::GetSelectionBounds(string16::size_type* start, |
| } |
| void OmniboxViewViews::SelectAll(bool reversed) { |
| - textfield_->SelectAll(reversed); |
| + views::Textfield::SelectAll(reversed); |
| } |
| void OmniboxViewViews::UpdatePopup() { |
| @@ -561,19 +478,16 @@ void OmniboxViewViews::UpdatePopup() { |
| if (!model()->has_focus()) |
| return; |
| - // Don't inline autocomplete when the caret/selection isn't at the end of |
| - // the text, or in the middle of composition. |
| + // Prevent inline autocomplete when the caret isn't at the end of the text, |
| + // and during IME composition editing. |
| ui::Range sel; |
| - textfield_->GetSelectedRange(&sel); |
| - bool no_inline_autocomplete = |
| - sel.GetMax() < GetTextLength() || textfield_->IsIMEComposing(); |
| - |
| - model()->StartAutocomplete(!sel.is_empty(), no_inline_autocomplete); |
| + GetSelectedRange(&sel); |
| + model()->StartAutocomplete(!sel.is_empty(), |
|
Peter Kasting
2013/02/18 18:57:47
Nit: Each line with arguments should have the argu
msw
2013/02/18 20:58:21
Done.
|
| + sel.GetMax() < text().length() || IsIMEComposing()); |
| } |
| void OmniboxViewViews::SetFocus() { |
| - // In views-implementation, the focus is on textfield rather than OmniboxView. |
| - textfield_->RequestFocus(); |
| + RequestFocus(); |
| // Restore caret visibility if focus is explicitly requested. This is |
| // necessary because if we already have invisible focus, the RequestFocus() |
| // call above will short-circuit, preventing us from reaching |
| @@ -583,7 +497,7 @@ void OmniboxViewViews::SetFocus() { |
| } |
| void OmniboxViewViews::ApplyCaretVisibility() { |
| - textfield_->SetCursorEnabled(model()->is_caret_visible()); |
| + SetCursorEnabled(model()->is_caret_visible()); |
| } |
| void OmniboxViewViews::OnTemporaryTextMaybeChanged( |
| @@ -591,7 +505,7 @@ void OmniboxViewViews::OnTemporaryTextMaybeChanged( |
| bool save_original_selection, |
| bool notify_text_changed) { |
| if (save_original_selection) |
| - textfield_->GetSelectedRange(&saved_temporary_selection_); |
| + GetSelectedRange(&saved_temporary_selection_); |
| SetWindowTextAndCaretPos(display_text, display_text.length(), false, |
| notify_text_changed); |
| @@ -600,7 +514,7 @@ void OmniboxViewViews::OnTemporaryTextMaybeChanged( |
| bool OmniboxViewViews::OnInlineAutocompleteTextMaybeChanged( |
| const string16& display_text, |
| size_t user_text_length) { |
| - if (display_text == GetText()) |
| + if (display_text == text()) |
| return false; |
| ui::Range range(display_text.size(), user_text_length); |
| SetTextAndSelectedRange(display_text, range); |
| @@ -609,24 +523,25 @@ bool OmniboxViewViews::OnInlineAutocompleteTextMaybeChanged( |
| } |
| void OmniboxViewViews::OnRevertTemporaryText() { |
| - textfield_->SelectRange(saved_temporary_selection_); |
| + SelectRange(saved_temporary_selection_); |
| + TextChanged(); |
| } |
| void OmniboxViewViews::OnBeforePossibleChange() { |
| // Record our state. |
| - text_before_change_ = GetText(); |
| - textfield_->GetSelectedRange(&sel_before_change_); |
| - ime_composing_before_change_ = textfield_->IsIMEComposing(); |
| + text_before_change_ = text(); |
| + GetSelectedRange(&sel_before_change_); |
| + ime_composing_before_change_ = IsIMEComposing(); |
| } |
| bool OmniboxViewViews::OnAfterPossibleChange() { |
| ui::Range new_sel; |
| - textfield_->GetSelectedRange(&new_sel); |
| + GetSelectedRange(&new_sel); |
| // See if the text or selection have changed since OnBeforePossibleChange(). |
| - const string16 new_text = GetText(); |
| + const string16 new_text = text(); |
| const bool text_changed = (new_text != text_before_change_) || |
| - (ime_composing_before_change_ != textfield_->IsIMEComposing()); |
| + (ime_composing_before_change_ != IsIMEComposing()); |
| const bool selection_differs = |
| !((sel_before_change_.is_empty() && new_sel.is_empty()) || |
| sel_before_change_.EqualsIgnoringDirection(new_sel)); |
| @@ -642,8 +557,7 @@ bool OmniboxViewViews::OnAfterPossibleChange() { |
| const bool something_changed = model()->OnAfterPossibleChange( |
| text_before_change_, new_text, new_sel.start(), new_sel.end(), |
| - selection_differs, text_changed, just_deleted_text, |
| - !textfield_->IsIMEComposing()); |
| + selection_differs, text_changed, just_deleted_text, !IsIMEComposing()); |
| // If only selection was changed, we don't need to call model()'s |
| // OnChanged() method, which is called in TextChanged(). |
| @@ -683,7 +597,7 @@ string16 OmniboxViewViews::GetInstantSuggestion() const { |
| int OmniboxViewViews::TextWidth() const { |
| // TODO(oshima): add horizontal margin. |
| - return textfield_->font().GetStringWidth(textfield_->text()); |
| + return font().GetStringWidth(text()); |
| } |
| bool OmniboxViewViews::IsImeComposing() const { |
| @@ -696,7 +610,6 @@ int OmniboxViewViews::GetMaxEditWidth(int entry_width) const { |
| views::View* OmniboxViewViews::AddToView(views::View* parent) { |
| parent->AddChildView(this); |
|
Peter Kasting
2013/02/18 18:57:47
Can we nuke this function entirely now? Seems lik
msw
2013/02/18 20:58:21
I'll try this in a followup, OmniboxViewWin::AddTo
|
| - AddChildView(textfield_); |
| return this; |
| } |
| @@ -720,27 +633,25 @@ bool OmniboxViewViews::HandleKeyEvent(views::Textfield* textfield, |
| // Checks if it's currently in keyword search mode. |
| if (model()->is_keyword_hint() || model()->keyword().empty()) |
|
Peter Kasting
2013/02/18 18:57:47
Nit: I wouldn't mind just combining these three co
msw
2013/02/18 20:58:21
Done.
|
| return false; |
| - // If there is selection, let textfield handle the backspace. |
| - if (textfield_->HasSelection()) |
| + // No extra handling is needed if there is a selection. |
| + if (HasSelection()) |
| return false; |
| - // If not at the begining of the text, let textfield handle the backspace. |
| - if (textfield_->GetCursorPosition()) |
| + // No extra handling is needed if the cursor is not leading the text. |
| + if (GetCursorPosition()) |
| return false; |
| - model()->ClearKeyword(GetText()); |
| + model()->ClearKeyword(text()); |
| return true; |
| } |
| if (event.key_code() == ui::VKEY_DELETE && !event.IsAltDown()) { |
| delete_at_end_pressed_ = |
| - (!textfield_->HasSelection() && |
| - textfield_->GetCursorPosition() == textfield_->text().length()); |
| + (!HasSelection() && GetCursorPosition() == text().length()); |
| } |
| - // Though the Textfield usually handles the right-arrow key for LTR text or |
| - // left-arrow key for RTL text, we need to handle it if we have gray text |
| - // (Instant suggestion) that needs to be committed. |
| - if (textfield_->GetCursorPosition() == textfield_->text().length()) { |
| - base::i18n::TextDirection direction = textfield_->GetTextDirection(); |
| + // Handle the right-arrow key for LTR text and the left-arrow key for RTL text |
| + // if there is an Instant suggestion (gray text) that needs to be committed. |
| + if (GetCursorPosition() == text().length()) { |
| + base::i18n::TextDirection direction = GetTextDirection(); |
| if ((direction == base::i18n::LEFT_TO_RIGHT && |
| event.key_code() == ui::VKEY_RIGHT) || |
| (direction == base::i18n::RIGHT_TO_LEFT && |
| @@ -762,29 +673,30 @@ void OmniboxViewViews::OnAfterUserAction(views::Textfield* sender) { |
| void OmniboxViewViews::OnAfterCutOrCopy() { |
| ui::Range selection_range; |
| - textfield_->GetSelectedRange(&selection_range); |
| + GetSelectedRange(&selection_range); |
| ui::Clipboard* cb = ui::Clipboard::GetForCurrentThread(); |
| string16 selected_text; |
| cb->ReadText(ui::Clipboard::BUFFER_STANDARD, &selected_text); |
| - const string16 text = textfield_->text(); |
| GURL url; |
| bool write_url; |
| - model()->AdjustTextForCopy(selection_range.GetMin(), selected_text == text, |
| + model()->AdjustTextForCopy(selection_range.GetMin(), selected_text == text(), |
| &selected_text, &url, &write_url); |
| - if (write_url) |
| + if (write_url) { |
| DoCopyURL(url, selected_text); |
| - else |
| - DoCopyText(selected_text); |
| + } else { |
| + ui::ScopedClipboardWriter scoped_clipboard_writer( |
| + ui::Clipboard::GetForCurrentThread(), ui::Clipboard::BUFFER_STANDARD); |
| + scoped_clipboard_writer.WriteText(selected_text); |
| + } |
| } |
| void OmniboxViewViews::OnWriteDragData(ui::OSExchangeData* data) { |
| ui::Range selection_range; |
| - textfield_->GetSelectedRange(&selection_range); |
| - string16 selected_text = textfield_->GetSelectedText(); |
| - const string16 text = textfield_->text(); |
| + GetSelectedRange(&selection_range); |
| + string16 selected_text = GetSelectedText(); |
| GURL url; |
| bool write_url; |
| - model()->AdjustTextForCopy(selection_range.start(), selected_text == text, |
| + model()->AdjustTextForCopy(selection_range.start(), selected_text == text(), |
| &selected_text, &url, &write_url); |
| data->SetString(selected_text); |
| if (write_url) |
| @@ -895,13 +807,9 @@ void OmniboxViewViews::CandidateWindowClosed( |
| //////////////////////////////////////////////////////////////////////////////// |
| // OmniboxViewViews, private: |
| -size_t OmniboxViewViews::GetTextLength() const { |
| - // TODO(oshima): Support instant, IME. |
| - return textfield_->text().length(); |
| -} |
| - |
| int OmniboxViewViews::GetOmniboxTextLength() const { |
| - return static_cast<int>(GetTextLength()); |
| + // TODO(oshima): Support instant, IME. |
| + return static_cast<int>(text().length()); |
| } |
| void OmniboxViewViews::EmphasizeURLComponents() { |
| @@ -911,15 +819,14 @@ void OmniboxViewViews::EmphasizeURLComponents() { |
| // this input. This can tell us whether an UNKNOWN input string is going to |
| // be treated as a search or a navigation, and is the same method the Paste |
| // And Go system uses. |
| - string16 text = GetText(); |
| url_parse::Component scheme, host; |
| - AutocompleteInput::ParseForEmphasizeComponents(text, model()->GetDesiredTLD(), |
| - &scheme, &host); |
| + AutocompleteInput::ParseForEmphasizeComponents( |
| + text(), model()->GetDesiredTLD(), &scheme, &host); |
| const bool emphasize = model()->CurrentTextIsURL() && (host.len > 0); |
| - textfield_->SetColor(location_bar_view_->GetColor(security_level_, |
| + SetColor(location_bar_view_->GetColor(security_level_, |
| emphasize ? LocationBarView::DEEMPHASIZED_TEXT : LocationBarView::TEXT)); |
| if (emphasize) { |
| - textfield_->ApplyColor( |
| + ApplyColor( |
| location_bar_view_->GetColor(security_level_, LocationBarView::TEXT), |
| ui::Range(host.begin, host.end())); |
| } |
| @@ -935,21 +842,20 @@ void OmniboxViewViews::EmphasizeURLComponents() { |
| security_level_, LocationBarView::SECURITY_TEXT); |
| const bool strike = (security_level_ == ToolbarModel::SECURITY_ERROR); |
| const ui::Range scheme_range(scheme.begin, scheme.end()); |
| - textfield_->ApplyColor(security_color, scheme_range); |
| - textfield_->ApplyStyle(gfx::DIAGONAL_STRIKE, strike, scheme_range); |
| + ApplyColor(security_color, scheme_range); |
| + ApplyStyle(gfx::DIAGONAL_STRIKE, strike, scheme_range); |
| } |
| } |
| void OmniboxViewViews::SetTextAndSelectedRange(const string16& text, |
| const ui::Range& range) { |
| - if (text != GetText()) |
| - textfield_->SetText(text); |
| - textfield_->SelectRange(range); |
| + SetText(text); |
| + SelectRange(range); |
| } |
| string16 OmniboxViewViews::GetSelectedText() const { |
| // TODO(oshima): Support instant, IME. |
| - return textfield_->GetSelectedText(); |
| + return views::Textfield::GetSelectedText(); |
| } |
| void OmniboxViewViews::CopyURL() { |
| @@ -963,9 +869,8 @@ void OmniboxViewViews::OnPaste() { |
| // Record this paste, so we can do different behavior. |
| model()->on_paste(); |
| // Force a Paste operation to trigger the text_changed code in |
| - // OnAfterPossibleChange(), even if identical contents are pasted into the |
| - // text box. |
| + // OnAfterPossibleChange(), even if identical contents are pasted. |
| text_before_change_.clear(); |
| - textfield_->ReplaceSelection(text); |
| + ReplaceSelection(text); |
| } |
| } |