1dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Use of this source code is governed by a BSD-style license that can be
3dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// found in the LICENSE file.
4dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
5dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "touch_autocomplete_popup_contents_view.h"
6dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
7dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/autocomplete/autocomplete_edit_view.h"
8dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/profiles/profile.h"
9dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "ui/gfx/canvas.h"
10dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "ui/gfx/canvas_skia.h"
11dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "ui/gfx/font.h"
12dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "ui/gfx/path.h"
13dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "ui/gfx/rect.h"
14dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "ui/gfx/size.h"
15dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "third_party/skia/include/core/SkPaint.h"
16dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "views/view.h"
17dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
18dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
19dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// TouchAutocompleteResultView ------------------------------------------------
20dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
21dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTouchAutocompleteResultView::TouchAutocompleteResultView(
22dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AutocompleteResultViewModel* model,
23dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    int model_index,
24dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const gfx::Font& font,
25dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const gfx::Font& bold_font)
26dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    : AutocompleteResultView(model, model_index, font, bold_font) {
27dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
28dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
29dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTouchAutocompleteResultView::~TouchAutocompleteResultView() {
30dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
31dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
32dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid TouchAutocompleteResultView::PaintMatch(gfx::Canvas* canvas,
33dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                             const AutocompleteMatch& match,
34dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                             int x) {
35dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  DrawString(canvas, match.contents, match.contents_class, false, x,
36dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen             text_bounds().y());
37dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
38dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (!match.description.empty()) {
39dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DrawString(canvas, match.description, match.description_class, true, x,
40dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        text_bounds().y() + GetFontHeight());
41dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
42dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
43dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
44dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenint TouchAutocompleteResultView::GetFontHeight() const {
45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // In touch version of autocomplete popup, the text is displayed in two lines:
46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // First line is the title of the suggestion and second is the description.
47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Hence, the total text height is 2 times the height of one line.
48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return AutocompleteResultView::GetFontHeight() * 2;
49dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
50dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
51dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
52dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// TouchAutocompletePopupContentsView -----------------------------------------
53dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
54dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTouchAutocompletePopupContentsView::TouchAutocompletePopupContentsView(
55dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const gfx::Font& font,
56dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AutocompleteEditView* edit_view,
57dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AutocompleteEditModel* edit_model,
58dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    Profile* profile,
59dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const views::View* location_bar)
60dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    : AutocompletePopupContentsView(font, edit_view, edit_model, profile,
61dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                    location_bar) {
62dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
63dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
64dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTouchAutocompletePopupContentsView::~TouchAutocompletePopupContentsView() {
65dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
66dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
67dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid TouchAutocompletePopupContentsView::UpdatePopupAppearance() {
68dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  AutocompletePopupContentsView::UpdatePopupAppearance();
69dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  Layout();
70dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
71dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
72dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid TouchAutocompletePopupContentsView::LayoutChildren() {
73dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::vector<View*> visible_children(GetVisibleChildren());
74dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  gfx::Rect bounds(GetContentsBounds());
75dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  double child_width =
76dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      static_cast<double>(bounds.width()) / visible_children.size();
77dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int x = bounds.x();
78dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  for (size_t i = 0; i < visible_children.size(); ++i) {
79dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    int next_x = bounds.x() + static_cast<int>(((i + 1) * child_width) + 0.5);
80dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    visible_children[i]->SetBounds(x, bounds.y(), next_x - x, bounds.height());
81dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    x = next_x;
82dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
83dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
84dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
85dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid TouchAutocompletePopupContentsView::PaintResultViews(
86dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    gfx::CanvasSkia* canvas) {
87dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  AutocompletePopupContentsView::PaintResultViews(canvas);
88dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
89dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Draw divider lines.
90dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::vector<View*> visible_children(GetVisibleChildren());
91dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (visible_children.size() < 2)
92dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return;
93dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  SkColor color = AutocompleteResultView::GetColor(
94dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      AutocompleteResultView::NORMAL, AutocompleteResultView::DIMMED_TEXT);
95dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  gfx::Rect bounds(GetContentsBounds());
96dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  for (std::vector<View*>::const_iterator i(visible_children.begin() + 1);
97dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen       i != visible_children.end(); ++i) {
98dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    canvas->DrawLineInt(color, (*i)->x(), bounds.y(), (*i)->x(),
99dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                        bounds.bottom());
100dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
101dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
102dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
103dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenint TouchAutocompletePopupContentsView::CalculatePopupHeight() {
104dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  DCHECK_GE(static_cast<size_t>(child_count()), model_->result().size());
105dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int popup_height = 0;
106dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  for (size_t i = 0; i < model_->result().size(); ++i) {
107dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    popup_height = std::max(popup_height,
108dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                            GetChildViewAt(i)->GetPreferredSize().height());
109dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
110dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  popup_height = std::max(popup_height, opt_in_view_ ?
111dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      opt_in_view_->GetPreferredSize().height() : 0);
112dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return popup_height;
113dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
114dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
115dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenAutocompleteResultView* TouchAutocompletePopupContentsView::CreateResultView(
116dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AutocompleteResultViewModel* model,
117dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    int model_index,
118dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const gfx::Font& font,
119dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const gfx::Font& bold_font) {
120dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return new TouchAutocompleteResultView(model, model_index, font, bold_font);
121dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
122dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
123dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenstd::vector<views::View*>
124dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    TouchAutocompletePopupContentsView::GetVisibleChildren() {
125dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::vector<View*> visible_children;
126dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  for (int i = 0; i < child_count(); ++i) {
127dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    View* v = GetChildViewAt(i);
128dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (GetChildViewAt(i)->IsVisible())
129dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      visible_children.push_back(v);
130dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
131dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return visible_children;
132dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
133