1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/browser/ui/views/omnibox/touch_omnibox_popup_contents_view.h"
7 #include "chrome/browser/ui/omnibox/omnibox_view.h"
8 #include "chrome/browser/ui/views/location_bar/location_bar_view.h"
9 #include "third_party/skia/include/core/SkPaint.h"
10 #include "ui/gfx/canvas.h"
11 #include "ui/gfx/font_list.h"
12 #include "ui/gfx/path.h"
13 #include "ui/gfx/rect.h"
14 #include "ui/gfx/size.h"
15 #include "ui/views/view.h"
17 // TouchOmniboxResultView ------------------------------------------------
19 TouchOmniboxResultView::TouchOmniboxResultView(
20 OmniboxResultViewModel* model,
22 LocationBarView* location_bar_view,
23 const gfx::FontList& font_list)
24 : OmniboxResultView(model, model_index, location_bar_view, font_list) {
25 set_edge_item_padding(8);
27 set_minimum_text_vertical_padding(10);
30 TouchOmniboxResultView::~TouchOmniboxResultView() {
33 void TouchOmniboxResultView::PaintMatch(gfx::Canvas* canvas,
34 const AutocompleteMatch& match,
36 int y = text_bounds().y();
38 if (!match.description.empty()) {
39 // We use our base class's GetTextHeight below because we need the height
40 // of a single line of text.
41 DrawString(canvas, match.description, match.description_class, true, x, y);
42 y += OmniboxResultView::GetTextHeight();
44 // When we have only one line of content (no description), we center the
45 // single line vertically on our two-lines-tall results box.
46 y += OmniboxResultView::GetTextHeight() / 2;
49 DrawString(canvas, match.contents, match.contents_class, false, x, y);
52 int TouchOmniboxResultView::GetTextHeight() const {
53 return OmniboxResultView::GetTextHeight() * 2;
56 // TouchOmniboxPopupContentsView -----------------------------------------
58 TouchOmniboxPopupContentsView::TouchOmniboxPopupContentsView(
59 const gfx::FontList& font_list,
60 OmniboxView* omnibox_view,
61 OmniboxEditModel* edit_model,
62 LocationBarView* location_bar_view)
63 : OmniboxPopupContentsView(font_list, omnibox_view, edit_model,
67 TouchOmniboxPopupContentsView::~TouchOmniboxPopupContentsView() {
70 void TouchOmniboxPopupContentsView::UpdatePopupAppearance() {
71 OmniboxPopupContentsView::UpdatePopupAppearance();
75 void TouchOmniboxPopupContentsView::PaintResultViews(gfx::Canvas* canvas) {
76 OmniboxPopupContentsView::PaintResultViews(canvas);
78 // Draw divider lines.
79 std::vector<View*> visible_children(GetVisibleChildren());
80 if (visible_children.size() < 2)
82 gfx::Rect bounds(GetContentsBounds());
84 // Draw a line at the bottom of each child except the last. The
85 // color of the line is determined to blend appropriately with the
86 // most dominant of the two surrounding cells, in precedence order,
87 // i.e. selected > hovered > normal.
88 for (std::vector<View*>::const_iterator i(visible_children.begin());
89 i + 1 != visible_children.end(); ++i) {
90 TouchOmniboxResultView* child = static_cast<TouchOmniboxResultView*>(*i);
91 TouchOmniboxResultView* next_child =
92 static_cast<TouchOmniboxResultView*>(*(i + 1));
93 SkColor divider_color = child->GetColor(
94 std::max(child->GetState(), next_child->GetState()),
95 OmniboxResultView::DIVIDER);
96 int line_y = child->y() + child->height() - 1;
97 canvas->DrawLine(gfx::Point(bounds.x(), line_y),
98 gfx::Point(bounds.right(), line_y), divider_color);
102 OmniboxResultView* TouchOmniboxPopupContentsView::CreateResultView(
103 OmniboxResultViewModel* model,
105 const gfx::FontList& font_list) {
106 return new TouchOmniboxResultView(model, model_index, location_bar_view(),
110 std::vector<views::View*> TouchOmniboxPopupContentsView::GetVisibleChildren() {
111 std::vector<View*> visible_children;
112 for (int i = 0; i < child_count(); ++i) {
113 View* v = child_at(i);
114 if (child_at(i)->visible())
115 visible_children.push_back(v);
117 return visible_children;