| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/ui/views/autocomplete/autocomplete_popup_contents_view.
h" | 5 #include "chrome/browser/ui/views/autocomplete/autocomplete_popup_contents_view.
h" |
| 6 | 6 |
| 7 #include "base/compiler_specific.h" | 7 #include "base/compiler_specific.h" |
| 8 #include "base/utf_string_conversions.h" | 8 #include "base/utf_string_conversions.h" |
| 9 #include "chrome/browser/autocomplete/autocomplete_edit_view.h" | 9 #include "chrome/browser/autocomplete/autocomplete_edit_view.h" |
| 10 #include "chrome/browser/autocomplete/autocomplete_popup_model.h" | 10 #include "chrome/browser/autocomplete/autocomplete_popup_model.h" |
| (...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 259 } | 259 } |
| 260 | 260 |
| 261 //////////////////////////////////////////////////////////////////////////////// | 261 //////////////////////////////////////////////////////////////////////////////// |
| 262 // AutocompletePopupContentsView, AutocompletePopupView overrides: | 262 // AutocompletePopupContentsView, AutocompletePopupView overrides: |
| 263 | 263 |
| 264 bool AutocompletePopupContentsView::IsOpen() const { | 264 bool AutocompletePopupContentsView::IsOpen() const { |
| 265 return (popup_ != NULL); | 265 return (popup_ != NULL); |
| 266 } | 266 } |
| 267 | 267 |
| 268 void AutocompletePopupContentsView::InvalidateLine(size_t line) { | 268 void AutocompletePopupContentsView::InvalidateLine(size_t line) { |
| 269 GetChildViewAt(static_cast<int>(line))->SchedulePaint(); | 269 AutocompleteResultView* result_view = |
| 270 static_cast<AutocompleteResultView*>(GetChildViewAt( |
| 271 static_cast<int>(line))); |
| 272 |
| 273 result_view->SetMatch(GetMatchAtIndex(line)); |
| 274 result_view->SchedulePaint(); |
| 270 } | 275 } |
| 271 | 276 |
| 272 void AutocompletePopupContentsView::UpdatePopupAppearance() { | 277 void AutocompletePopupContentsView::UpdatePopupAppearance() { |
| 273 if (model_->result().empty()) { | 278 if (model_->result().empty()) { |
| 274 // No matches, close any existing popup. | 279 // No matches, close any existing popup. |
| 275 if (popup_ != NULL) { | 280 if (popup_ != NULL) { |
| 276 size_animation_.Stop(); | 281 size_animation_.Stop(); |
| 277 // NOTE: Do NOT use CloseNow() here, as we may be deep in a callstack | 282 // NOTE: Do NOT use CloseNow() here, as we may be deep in a callstack |
| 278 // triggered by the popup receiving a message (e.g. LBUTTONUP), and | 283 // triggered by the popup receiving a message (e.g. LBUTTONUP), and |
| 279 // destroying the popup would cause us to read garbage when we unwind back | 284 // destroying the popup would cause us to read garbage when we unwind back |
| (...skipping 14 matching lines...) Expand all Loading... |
| 294 for (size_t i = 0; i < model_->result().size(); ++i) { | 299 for (size_t i = 0; i < model_->result().size(); ++i) { |
| 295 AutocompleteResultView* result_view; | 300 AutocompleteResultView* result_view; |
| 296 if (i >= child_rv_count) { | 301 if (i >= child_rv_count) { |
| 297 result_view = | 302 result_view = |
| 298 CreateResultView(this, i, result_font_, result_bold_font_); | 303 CreateResultView(this, i, result_font_, result_bold_font_); |
| 299 AddChildViewAt(result_view, static_cast<int>(i)); | 304 AddChildViewAt(result_view, static_cast<int>(i)); |
| 300 } else { | 305 } else { |
| 301 result_view = static_cast<AutocompleteResultView*>(GetChildViewAt(i)); | 306 result_view = static_cast<AutocompleteResultView*>(GetChildViewAt(i)); |
| 302 result_view->SetVisible(true); | 307 result_view->SetVisible(true); |
| 303 } | 308 } |
| 304 result_view->set_match(GetMatchAtIndex(i)); | 309 result_view->SetMatch(GetMatchAtIndex(i)); |
| 305 } | 310 } |
| 306 for (size_t i = model_->result().size(); i < child_rv_count; ++i) | 311 for (size_t i = model_->result().size(); i < child_rv_count; ++i) |
| 307 GetChildViewAt(i)->SetVisible(false); | 312 GetChildViewAt(i)->SetVisible(false); |
| 308 | 313 |
| 309 PromoCounter* counter = model_->profile()->GetInstantPromoCounter(); | 314 PromoCounter* counter = model_->profile()->GetInstantPromoCounter(); |
| 310 if (!opt_in_view_ && counter && counter->ShouldShow(base::Time::Now())) { | 315 if (!opt_in_view_ && counter && counter->ShouldShow(base::Time::Now())) { |
| 311 opt_in_view_ = new InstantOptInView(this, result_bold_font_, result_font_); | 316 opt_in_view_ = new InstantOptInView(this, result_bold_font_, result_font_); |
| 312 AddChildView(opt_in_view_); | 317 AddChildView(opt_in_view_); |
| 313 } else if (opt_in_view_ && (!counter || | 318 } else if (opt_in_view_ && (!counter || |
| 314 !counter->ShouldShow(base::Time::Now()))) { | 319 !counter->ShouldShow(base::Time::Now()))) { |
| (...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 616 void AutocompletePopupContentsView::OpenIndex( | 621 void AutocompletePopupContentsView::OpenIndex( |
| 617 size_t index, | 622 size_t index, |
| 618 WindowOpenDisposition disposition) { | 623 WindowOpenDisposition disposition) { |
| 619 if (!HasMatchAt(index)) | 624 if (!HasMatchAt(index)) |
| 620 return; | 625 return; |
| 621 | 626 |
| 622 const AutocompleteMatch& match = model_->result().match_at(index); | 627 const AutocompleteMatch& match = model_->result().match_at(index); |
| 623 // OpenURL() may close the popup, which will clear the result set and, by | 628 // OpenURL() may close the popup, which will clear the result set and, by |
| 624 // extension, |match| and its contents. So copy the relevant strings out to | 629 // extension, |match| and its contents. So copy the relevant strings out to |
| 625 // make sure they stay alive until the call completes. | 630 // make sure they stay alive until the call completes. |
| 631 string16 keyword; |
| 632 bool is_keyword_hint = false; |
| 633 |
| 634 if (match.keyword.get()) { |
| 635 keyword = match.keyword->text; |
| 636 is_keyword_hint = match.keyword->is_keyword_hint; |
| 637 } |
| 626 const GURL url(match.destination_url); | 638 const GURL url(match.destination_url); |
| 627 string16 keyword; | |
| 628 const bool is_keyword_hint = model_->GetKeywordForMatch(match, &keyword); | |
| 629 edit_view_->OpenURL(url, disposition, match.transition, GURL(), index, | 639 edit_view_->OpenURL(url, disposition, match.transition, GURL(), index, |
| 630 is_keyword_hint ? string16() : keyword); | 640 is_keyword_hint ? string16() : keyword); |
| 631 } | 641 } |
| 632 | 642 |
| 633 size_t AutocompletePopupContentsView::GetIndexForPoint( | 643 size_t AutocompletePopupContentsView::GetIndexForPoint( |
| 634 const gfx::Point& point) { | 644 const gfx::Point& point) { |
| 635 if (!HitTest(point)) | 645 if (!HitTest(point)) |
| 636 return AutocompletePopupModel::kNoMatch; | 646 return AutocompletePopupModel::kNoMatch; |
| 637 | 647 |
| 638 int nb_match = model_->result().size(); | 648 int nb_match = model_->result().size(); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 675 opt_in_view_ = NULL; | 685 opt_in_view_ = NULL; |
| 676 PromoCounter* counter = model_->profile()->GetInstantPromoCounter(); | 686 PromoCounter* counter = model_->profile()->GetInstantPromoCounter(); |
| 677 DCHECK(counter); | 687 DCHECK(counter); |
| 678 counter->Hide(); | 688 counter->Hide(); |
| 679 if (opt_in) { | 689 if (opt_in) { |
| 680 browser::ShowInstantConfirmDialogIfNecessary( | 690 browser::ShowInstantConfirmDialogIfNecessary( |
| 681 location_bar_->GetWindow()->GetNativeWindow(), model_->profile()); | 691 location_bar_->GetWindow()->GetNativeWindow(), model_->profile()); |
| 682 } | 692 } |
| 683 UpdatePopupAppearance(); | 693 UpdatePopupAppearance(); |
| 684 } | 694 } |
| OLD | NEW |