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