Chromium Code Reviews| Index: chrome/browser/ui/views/autocomplete/autocomplete_result_view.cc |
| =================================================================== |
| --- chrome/browser/ui/views/autocomplete/autocomplete_result_view.cc (revision 117356) |
| +++ chrome/browser/ui/views/autocomplete/autocomplete_result_view.cc (working copy) |
| @@ -14,6 +14,7 @@ |
| #include <algorithm> // NOLINT |
| #include "base/i18n/bidi_line_iterator.h" |
| +#include "chrome/browser/autocomplete/autocomplete_popup_model.h" |
| #include "chrome/browser/ui/views/autocomplete/autocomplete_result_view_model.h" |
| #include "chrome/browser/ui/views/location_bar/location_bar_view.h" |
| #include "grit/generated_resources.h" |
| @@ -111,13 +112,19 @@ |
| normal_font_(font), |
| bold_font_(bold_font), |
| ellipsis_width_(font.GetStringWidth(string16(kEllipsis))), |
| - mirroring_context_(new MirroringContext()) { |
| + mirroring_context_(new MirroringContext()), |
| + ALLOW_THIS_IN_INITIALIZER_LIST(animation_(new ui::SlideAnimation(this))), |
| + ALLOW_THIS_IN_INITIALIZER_LIST(keyword_icon_(new views::ImageView())) { |
| CHECK_GE(model_index, 0); |
| if (default_icon_size_ == 0) { |
| default_icon_size_ = ResourceBundle::GetSharedInstance().GetBitmapNamed( |
| AutocompleteMatch::TypeToIcon(AutocompleteMatch::URL_WHAT_YOU_TYPED))-> |
| width(); |
| } |
| + keyword_icon_->set_parent_owned(false); |
| + keyword_icon_->EnableCanvasFlippingForRTLUI(true); |
| + keyword_icon_->SetImage(GetKeywordIcon()); |
| + keyword_icon_->SizeToPreferredSize(); |
|
Peter Kasting
2012/01/14 02:00:11
Ah, now I understand why you didn't need to do thi
|
| } |
| AutocompleteResultView::~AutocompleteResultView() { |
| @@ -173,9 +180,38 @@ |
| void AutocompleteResultView::SetMatch(const AutocompleteMatch& match) { |
| match_ = match; |
| + animation_->Reset(); |
| + |
| + if (match.associated_keyword.get()) { |
| + keyword_icon_->SetImage(GetKeywordIcon()); |
| + |
| + if (!keyword_icon_->parent()) |
| + AddChildView(keyword_icon_.get()); |
| + } else if (keyword_icon_->parent()) { |
| + RemoveChildView(keyword_icon_.get()); |
| + } |
| + |
| Layout(); |
| } |
| +void AutocompleteResultView::ShowKeyword(bool show_keyword) { |
| + if (show_keyword) |
| + animation_->Show(); |
| + else |
| + animation_->Hide(); |
| +} |
| + |
| +void AutocompleteResultView::Invalidate() { |
| + keyword_icon_->SetImage(GetKeywordIcon()); |
| + SchedulePaint(); |
| +} |
| + |
| +gfx::Size AutocompleteResultView::GetPreferredSize() { |
| + return gfx::Size(0, std::max( |
| + default_icon_size_ + (kMinimumIconVerticalPadding * 2), |
| + GetTextHeight() + (kMinimumTextVerticalPadding * 2))); |
| +} |
| + |
| //////////////////////////////////////////////////////////////////////////////// |
| // AutocompleteResultView, protected: |
| @@ -238,7 +274,7 @@ |
| int icon = match_.starred ? |
| IDR_OMNIBOX_STAR : AutocompleteMatch::TypeToIcon(match_.type); |
| - if (model_->IsSelectedIndex(model_index_)) { |
| + if (GetState() == SELECTED) { |
| switch (icon) { |
| case IDR_OMNIBOX_EXTENSION_APP: |
| icon = IDR_OMNIBOX_EXTENSION_APP_SELECTED; |
| @@ -263,6 +299,11 @@ |
| return ResourceBundle::GetSharedInstance().GetBitmapNamed(icon); |
| } |
| +const SkBitmap* AutocompleteResultView::GetKeywordIcon() const { |
| + return ResourceBundle::GetSharedInstance().GetBitmapNamed( |
| + (GetState() == SELECTED) ? IDR_OMNIBOX_TTS_SELECTED : IDR_OMNIBOX_TTS); |
| +} |
| + |
| int AutocompleteResultView::DrawString( |
| gfx::Canvas* canvas, |
| const string16& text, |
| @@ -493,14 +534,9 @@ |
| runs->clear(); |
| } |
| -gfx::Size AutocompleteResultView::GetPreferredSize() { |
| - return gfx::Size(0, std::max( |
| - default_icon_size_ + (kMinimumIconVerticalPadding * 2), |
| - GetTextHeight() + (kMinimumTextVerticalPadding * 2))); |
| -} |
| - |
| void AutocompleteResultView::Layout() { |
| const SkBitmap* icon = GetIcon(); |
| + |
| icon_bounds_.SetRect(LocationBarView::kEdgeItemPadding + |
| ((icon->width() == default_icon_size_) ? |
| 0 : LocationBarView::kIconInternalPadding), |
| @@ -509,22 +545,64 @@ |
| int text_x = LocationBarView::kEdgeItemPadding + default_icon_size_ + |
| LocationBarView::kItemPadding; |
| int text_height = GetTextHeight(); |
| + int text_width; |
| + |
| + if (match_.associated_keyword.get()) { |
| + const int kw_collapsed_size = keyword_icon_->width() + |
| + LocationBarView::kEdgeItemPadding; |
| + const int max_kw_x = width() - kw_collapsed_size; |
| + const int kw_x = animation_->CurrentValueBetween(max_kw_x, |
| + LocationBarView::kEdgeItemPadding); |
| + const int kw_text_x = kw_x + keyword_icon_->width() + |
| + LocationBarView::kItemPadding; |
| + |
| + text_width = kw_x - text_x - LocationBarView::kItemPadding; |
| + keyword_text_bounds_.SetRect(kw_text_x, 0, std::max( |
| + width() - kw_text_x - LocationBarView::kEdgeItemPadding, 0), |
| + text_height); |
| + keyword_icon_->SetPosition(gfx::Point(kw_x, |
| + (height() - keyword_icon_->height()) / 2)); |
| + } else { |
| + text_width = width() - text_x - LocationBarView::kEdgeItemPadding; |
| + } |
| + |
| text_bounds_.SetRect(text_x, std::max(0, (height() - text_height) / 2), |
| - std::max(bounds().width() - text_x - LocationBarView::kEdgeItemPadding, |
| - 0), text_height); |
| + std::max(text_width, 0), text_height); |
| } |
| +void AutocompleteResultView::OnBoundsChanged( |
| + const gfx::Rect& previous_bounds) { |
| + animation_->SetSlideDuration(width() / 4); |
| +} |
| + |
| void AutocompleteResultView::OnPaint(gfx::Canvas* canvas) { |
| const ResultViewState state = GetState(); |
| if (state != NORMAL) |
| canvas->GetSkCanvas()->drawColor(GetColor(state, BACKGROUND)); |
| - // Paint the icon. |
| - canvas->DrawBitmapInt(*GetIcon(), GetMirroredXForRect(icon_bounds_), |
| - icon_bounds_.y()); |
| + if (!match_.associated_keyword.get() || |
| + keyword_icon_->x() > icon_bounds_.right()) { |
| + // Paint the icon. |
| + canvas->DrawBitmapInt(*GetIcon(), GetMirroredXForRect(icon_bounds_), |
| + icon_bounds_.y()); |
| - // Paint the text. |
| - int x = GetMirroredXForRect(text_bounds_); |
| - mirroring_context_->Initialize(x, text_bounds_.width()); |
| - PaintMatch(canvas, match_, x); |
| + // Paint the text. |
| + int x = GetMirroredXForRect(text_bounds_); |
| + mirroring_context_->Initialize(x, text_bounds_.width()); |
| + PaintMatch(canvas, match_, x); |
| + } |
| + |
| + if (match_.associated_keyword.get()) { |
| + // Paint the keyword text. |
| + int x = GetMirroredXForRect(keyword_text_bounds_); |
| + mirroring_context_->Initialize(x, keyword_text_bounds_.width()); |
| + PaintMatch(canvas, *match_.associated_keyword.get(), x); |
| + } |
| } |
| + |
| +void AutocompleteResultView::AnimationProgressed( |
| + const ui::Animation* animation) { |
| + Layout(); |
| + SchedulePaint(); |
| +} |
| + |