Index: chrome/browser/ui/views/autocomplete/autocomplete_result_view.cc |
=================================================================== |
--- chrome/browser/ui/views/autocomplete/autocomplete_result_view.cc (revision 119905) |
+++ 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" |
@@ -112,13 +113,20 @@ |
normal_font_(font), |
bold_font_(bold_font), |
ellipsis_width_(font.GetStringWidth(string16(kEllipsis))), |
- mirroring_context_(new MirroringContext()) { |
+ mirroring_context_(new MirroringContext()), |
+ keyword_icon_(new views::ImageView()), |
+ ALLOW_THIS_IN_INITIALIZER_LIST( |
+ animation_(new ui::SlideAnimation(this))) { |
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(); |
} |
AutocompleteResultView::~AutocompleteResultView() { |
@@ -178,9 +186,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: |
@@ -243,7 +280,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; |
@@ -268,6 +305,13 @@ |
return ResourceBundle::GetSharedInstance().GetBitmapNamed(icon); |
} |
+const SkBitmap* AutocompleteResultView::GetKeywordIcon() const { |
+ // NOTE: If we ever begin returning icons of varying size, then callers need |
+ // to ensure that |keyword_icon_| is resized each time its image is reset. |
+ return ResourceBundle::GetSharedInstance().GetBitmapNamed( |
+ (GetState() == SELECTED) ? IDR_OMNIBOX_TTS_SELECTED : IDR_OMNIBOX_TTS); |
+} |
+ |
int AutocompleteResultView::DrawString( |
gfx::Canvas* canvas, |
const string16& text, |
@@ -498,14 +542,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), |
@@ -514,22 +553,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(); |
+} |
+ |