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