Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6093)

Unified Diff: chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc

Issue 15745031: Restyle omnibox popup (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Go back to 3 max search suggestions for now Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc
diff --git a/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc b/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc
index 8474bcf4510524bda98276c35380e89be7feb2fa..3539b80ec0f38fb115012a341828fda4cecc6347 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc
+++ b/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc
@@ -7,28 +7,22 @@
#include "chrome/browser/search/search.h"
#include "chrome/browser/ui/omnibox/omnibox_popup_non_view.h"
#include "chrome/browser/ui/omnibox/omnibox_view.h"
-#include "chrome/browser/ui/views/location_bar/location_bar_view.h"
#include "chrome/browser/ui/views/omnibox/omnibox_result_view.h"
+#include "chrome/browser/ui/views/omnibox/omnibox_view_delegate.h"
#include "chrome/browser/ui/views/omnibox/touch_omnibox_popup_contents_view.h"
+#include "grit/theme_resources.h"
+#include "grit/ui_resources.h"
#include "ui/base/theme_provider.h"
#include "ui/gfx/canvas.h"
#include "ui/gfx/image/image.h"
#include "ui/gfx/path.h"
+#include "ui/views/controls/image_view.h"
#include "ui/views/widget/widget.h"
#if defined(USE_AURA)
#include "ui/views/corewm/window_animations.h"
#endif
-#if defined(OS_WIN)
-#include <dwmapi.h>
-
-#include "base/win/scoped_gdi_object.h"
-#if !defined(USE_AURA)
-#include "ui/base/win/shell.h"
-#endif
-#endif
-
namespace {
const SkAlpha kGlassPopupAlpha = 240;
@@ -43,6 +37,10 @@ const int kEditFontAdjust = 0;
const int kEditFontAdjust = -1;
#endif
+// This is the number of pixels in the border image interior to the actual
+// border.
+const int kBorderInterior = 6;
+
} // namespace
class OmniboxPopupContentsView::AutocompletePopupWidget
@@ -63,17 +61,17 @@ OmniboxPopupView* OmniboxPopupContentsView::Create(
const gfx::Font& font,
OmniboxView* omnibox_view,
OmniboxEditModel* edit_model,
- views::View* location_bar) {
+ OmniboxViewDelegate* view_delegate) {
if (chrome::IsInstantExtendedAPIEnabled())
return new OmniboxPopupNonView(edit_model);
OmniboxPopupContentsView* view = NULL;
if (ui::GetDisplayLayout() == ui::LAYOUT_TOUCH) {
view = new TouchOmniboxPopupContentsView(
- font, omnibox_view, edit_model, location_bar);
+ font, omnibox_view, edit_model, view_delegate);
} else {
view = new OmniboxPopupContentsView(
- font, omnibox_view, edit_model, location_bar);
+ font, omnibox_view, edit_model, view_delegate);
}
view->Init();
@@ -84,18 +82,26 @@ OmniboxPopupContentsView::OmniboxPopupContentsView(
const gfx::Font& font,
OmniboxView* omnibox_view,
OmniboxEditModel* edit_model,
- views::View* location_bar)
+ OmniboxViewDelegate* view_delegate)
: model_(new OmniboxPopupModel(this, edit_model)),
omnibox_view_(omnibox_view),
- location_bar_(location_bar),
+ view_delegate_(view_delegate),
font_(font.DeriveFont(kEditFontAdjust)),
ignore_mouse_drag_(false),
- size_animation_(this) {
- bubble_border_ = new views::BubbleBorder(views::BubbleBorder::NONE,
- views::BubbleBorder::NO_SHADOW, SK_ColorWHITE);
- set_border(const_cast<views::BubbleBorder*>(bubble_border_));
+ size_animation_(this),
+ provider_logo_(new views::ImageView),
+ left_margin_(0),
+ right_margin_(0),
+ outside_vertical_padding_(0) {
// The contents is owned by the LocationBarView.
set_owned_by_client();
+
+ ui::ThemeProvider* theme = view_delegate_->GetThemeProviderForPopup();
+ provider_logo_->set_owned_by_client();
Peter Kasting 2013/06/06 18:52:16 Why use set_owned_by_client() and a scoped_ptr ins
+ provider_logo_->SetImage(theme->GetImageSkiaNamed(IDR_OMNIBOX_GOOGLE_LOGO));
+ provider_logo_->SizeToPreferredSize();
+
+ bottom_shadow_ = theme->GetImageSkiaNamed(IDR_BUBBLE_B);
}
void OmniboxPopupContentsView::Init() {
@@ -107,6 +113,7 @@ void OmniboxPopupContentsView::Init() {
result_view->SetVisible(false);
AddChildViewAt(result_view, static_cast<int>(i));
}
+ AddChildView(provider_logo_.get());
}
OmniboxPopupContentsView::~OmniboxPopupContentsView() {
@@ -133,12 +140,16 @@ gfx::Rect OmniboxPopupContentsView::GetPopupBounds() const {
void OmniboxPopupContentsView::LayoutChildren() {
gfx::Rect contents_rect = GetContentsBounds();
- int top = contents_rect.y();
- for (int i = 0; i < child_count(); ++i) {
+
+ provider_logo_->SetPosition(gfx::Point(5, 5));
Peter Kasting 2013/06/06 18:52:16 These numbers are pretty magic
+
+ int top = contents_rect.y() + outside_vertical_padding_;
+ int left = contents_rect.x() + left_margin_;
+ int width = contents_rect.width() - left_margin_ - right_margin_;
Peter Kasting 2013/06/06 18:52:16 Or just: contents_rect.Inset(left_margin_, outs
+ for (size_t i = 0; i < AutocompleteResult::kMaxMatches; ++i) {
View* v = child_at(i);
if (v->visible()) {
- v->SetBounds(contents_rect.x(), top, contents_rect.width(),
- v->GetPreferredSize().height());
+ v->SetBounds(left, top, width, v->GetPreferredSize().height());
top = v->bounds().bottom();
}
}
@@ -186,7 +197,7 @@ void OmniboxPopupContentsView::UpdatePopupAppearance() {
view->SetMatch(GetMatchAtIndex(i));
view->SetVisible(true);
}
- for (size_t i = result_size; i < child_rv_count; ++i)
+ for (size_t i = result_size; i < AutocompleteResult::kMaxMatches; ++i)
child_at(i)->SetVisible(false);
gfx::Rect new_target_bounds = CalculateTargetBounds(CalculatePopupHeight());
@@ -205,9 +216,9 @@ void OmniboxPopupContentsView::UpdatePopupAppearance() {
views::Widget::InitParams params(views::Widget::InitParams::TYPE_POPUP);
params.can_activate = false;
params.transparent = true;
- params.parent = location_bar_->GetWidget()->GetNativeView();
+ params.parent = view_delegate_->GetPopupParent();
params.bounds = GetPopupBounds();
- params.context = location_bar_->GetWidget()->GetNativeView();
+ params.context = view_delegate_->GetPopupParent();
popup_->Init(params);
#if defined(USE_AURA)
views::corewm::SetWindowVisibilityAnimationType(
@@ -287,8 +298,6 @@ void OmniboxPopupContentsView::AnimationProgressed(
// OmniboxPopupContentsView, views::View overrides:
void OmniboxPopupContentsView::Layout() {
- UpdateBlurRegion();
-
// Size our children to the available content area.
LayoutChildren();
@@ -385,39 +394,54 @@ int OmniboxPopupContentsView::CalculatePopupHeight() {
int popup_height = 0;
for (size_t i = 0; i < model_->result().size(); ++i)
popup_height += child_at(i)->GetPreferredSize().height();
- return popup_height;
+
+ // Add enough space on the top and bottom so it looks like there is the same
+ // amount of space between the text and the popup border as there is in the
+ // interior between each row of text.
+ //
+ // Discovering the exact amount of leading and padding around the font is
+ // a bit tricky and platform-specific, but this computation seems to work in
+ // practice.
+ OmniboxResultView* result_view = result_view_at(0);
+ outside_vertical_padding_ =
+ (result_view->GetPreferredSize().height() -
+ result_view->GetTextHeight());
+
+ return popup_height + outside_vertical_padding_ * 2 +
+ bottom_shadow_->height() - kBorderInterior;
}
OmniboxResultView* OmniboxPopupContentsView::CreateResultView(
OmniboxResultViewModel* model,
int model_index,
const gfx::Font& font) {
- return new OmniboxResultView(model, model_index, location_bar_, font);
+ return new OmniboxResultView(model, model_index, view_delegate_, font);
}
////////////////////////////////////////////////////////////////////////////////
// OmniboxPopupContentsView, views::View overrides, protected:
void OmniboxPopupContentsView::OnPaint(gfx::Canvas* canvas) {
+ gfx::Rect contents_bounds = GetContentsBounds();
+ contents_bounds.set_height(
+ contents_bounds.height() - bottom_shadow_->height() + kBorderInterior);
+
gfx::Path path;
- MakeContentsPath(&path, GetContentsBounds());
+ MakeContentsPath(&path, contents_bounds);
canvas->Save();
canvas->sk_canvas()->clipPath(path,
SkRegion::kIntersect_Op,
true /* doAntialias */);
PaintResultViews(canvas);
-
- // We want the contents background to be slightly transparent so we can see
- // the blurry glass effect on DWM systems behind. We do this _after_ we paint
- // the children since they paint text, and GDI will reset this alpha data if
- // we paint text after this call.
- MakeCanvasTransparent(canvas);
canvas->Restore();
// Now we paint the border, so it will be alpha-blended atop the contents.
// This looks slightly better in the corners than drawing the contents atop
// the border.
- OnPaintBorder(canvas);
+ //OnPaintBorder(canvas);
Peter Kasting 2013/06/06 18:52:16 Remove this
+
+ canvas->TileImageInt(*bottom_shadow_, 0, height() - bottom_shadow_->height(),
+ width(), bottom_shadow_->height());
}
void OmniboxPopupContentsView::PaintChildren(gfx::Canvas* canvas) {
@@ -444,42 +468,7 @@ void OmniboxPopupContentsView::MakeContentsPath(
SkIntToScalar(bounding_rect.y()),
SkIntToScalar(bounding_rect.right()),
SkIntToScalar(bounding_rect.bottom()));
-
- SkScalar radius = SkIntToScalar(views::BubbleBorder::GetCornerRadius());
- path->addRoundRect(rect, radius, radius);
-}
-
-void OmniboxPopupContentsView::UpdateBlurRegion() {
-#if defined(OS_WIN) && !defined(USE_AURA)
- // We only support background blurring on Vista with Aero-Glass enabled.
- if (!ui::win::IsAeroGlassEnabled() || !GetWidget())
- return;
-
- // Provide a blurred background effect within the contents region of the
- // popup.
- DWM_BLURBEHIND bb = {0};
- bb.dwFlags = DWM_BB_ENABLE | DWM_BB_BLURREGION;
- bb.fEnable = true;
-
- // Translate the contents rect into widget coordinates, since that's what
- // DwmEnableBlurBehindWindow expects a region in.
- gfx::Rect contents_rect = ConvertRectToWidget(GetContentsBounds());
- gfx::Path contents_path;
- MakeContentsPath(&contents_path, contents_rect);
- base::win::ScopedGDIObject<HRGN> popup_region;
- popup_region.Set(contents_path.CreateNativeRegion());
- bb.hRgnBlur = popup_region.Get();
- DwmEnableBlurBehindWindow(GetWidget()->GetNativeView(), &bb);
-#endif
-}
-
-void OmniboxPopupContentsView::MakeCanvasTransparent(gfx::Canvas* canvas) {
- // Allow the window blur effect to show through the popup background.
- SkAlpha alpha = GetThemeProvider()->ShouldUseNativeFrame() ?
- kGlassPopupAlpha : kOpaquePopupAlpha;
- canvas->DrawColor(SkColorSetA(
- result_view_at(0)->GetColor(OmniboxResultView::NORMAL,
- OmniboxResultView::BACKGROUND), alpha), SkXfermode::kDstIn_Mode);
+ path->addRect(rect);
}
void OmniboxPopupContentsView::OpenIndex(size_t index,
@@ -512,25 +501,12 @@ size_t OmniboxPopupContentsView::GetIndexForPoint(
}
gfx::Rect OmniboxPopupContentsView::CalculateTargetBounds(int h) {
Peter Kasting 2013/06/06 18:52:16 This can be inlined into its caller too
- gfx::Rect location_bar_bounds(location_bar_->GetContentsBounds());
- const views::Border* border = location_bar_->border();
- if (border) {
- // Adjust for the border so that the bubble and location bar borders are
- // aligned.
- gfx::Insets insets = border->GetInsets();
- location_bar_bounds.Inset(insets.left(), 0, insets.right(), 0);
- } else {
- // The normal location bar is drawn using a background graphic that includes
- // the border, so we inset by enough to make the edges line up, and the
- // bubble appear at the same height as the Star bubble.
- location_bar_bounds.Inset(LocationBarView::kNormalHorizontalEdgeThickness,
- 0);
- }
- gfx::Point location_bar_origin(location_bar_bounds.origin());
- views::View::ConvertPointToScreen(location_bar_, &location_bar_origin);
- location_bar_bounds.set_origin(location_bar_origin);
- return bubble_border_->GetBounds(
- location_bar_bounds, gfx::Size(location_bar_bounds.width(), h));
+ gfx::Point top_left_screen_coord;
+ int width;
+ view_delegate_->GetPopupPositioningInfo(
+ &top_left_screen_coord, &width, &left_margin_, &right_margin_);
+
+ return gfx::Rect(top_left_screen_coord, gfx::Size(width, h));
}
void OmniboxPopupContentsView::UpdateLineEvent(

Powered by Google App Engine
This is Rietveld 408576698