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#ifndef CHROME_BROWSER_UI_VIEWS_AUTOCOMPLETE_AUTOCOMPLETE_RESULT_VIEW_H_ 6dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#define CHROME_BROWSER_UI_VIEWS_AUTOCOMPLETE_AUTOCOMPLETE_RESULT_VIEW_H_ 7dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#pragma once 8dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 9dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/autocomplete/autocomplete_match.h" 10dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "third_party/skia/include/core/SkColor.h" 11dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "ui/gfx/font.h" 12dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "ui/gfx/rect.h" 13dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "views/view.h" 14dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 15dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass AutocompleteResultViewModel; 16dc0f95d653279beabeb9817299e2902918ba123eKristian Monsennamespace gfx { 17dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass Canvas; 18dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 19dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 20dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass AutocompleteResultView : public views::View { 21dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen public: 22dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen enum ResultViewState { 23dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen NORMAL = 0, 24dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen SELECTED, 25dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen HOVERED, 26dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen NUM_STATES 27dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen }; 28dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 29dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen enum ColorKind { 30dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen BACKGROUND = 0, 31dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen TEXT, 32dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DIMMED_TEXT, 33dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen URL, 34dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen NUM_KINDS 35dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen }; 36dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 37dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen AutocompleteResultView(AutocompleteResultViewModel* model, 38dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen int model_index, 39dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const gfx::Font& font, 40dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const gfx::Font& bold_font); 41dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual ~AutocompleteResultView(); 42dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen static SkColor GetColor(ResultViewState state, ColorKind kind); 44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 45dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Updates the match used to paint the contents of this result view. We copy 46dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // the match so that we can continue to paint the last result even after the 47dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // model has changed. 48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void SetMatch(const AutocompleteMatch& match); 49dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 50dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen protected: 51dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual void PaintMatch(gfx::Canvas* canvas, 52dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const AutocompleteMatch& match, 53dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen int x); 54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual int GetFontHeight() const; 55dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 56dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Draws the specified |text| into the canvas, using highlighting provided by 57dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // |classifications|. If |force_dim| is true, ACMatchClassification::DIM is 58dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // added to all of the classifications. Returns the x position to the right 59dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // of the string. 60dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen int DrawString(gfx::Canvas* canvas, 61dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const string16& text, 62dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const ACMatchClassifications& classifications, 63dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen bool force_dim, 64dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen int x, 65dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen int y); 66dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const gfx::Rect& text_bounds() const { return text_bounds_; } 68dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 69dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen private: 70dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen struct ClassificationData; 71dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen typedef std::vector<ClassificationData> Classifications; 72dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 73dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen struct RunData; 74dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen typedef std::vector<RunData> Runs; 75dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 76dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Predicate functions for use when sorting the runs. 77dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen static bool SortRunsLogically(const RunData& lhs, const RunData& rhs); 78dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen static bool SortRunsVisually(const RunData& lhs, const RunData& rhs); 79dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 80dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ResultViewState GetState() const; 81dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const SkBitmap* GetIcon() const; 82dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 83dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Elides |runs| to fit in |remaining_width|. The runs in |runs| should be in 84dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // logical order. 85dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // 86dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // When we need to elide a run, the ellipsis will be placed at the end of that 87dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // run. This means that if we elide a run whose visual direction is opposite 88dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // that of the drawing context, the ellipsis will not be at the "end" of the 89dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // drawn string. For example, if in an LTR context we have the LTR run 90dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // "LTR_STRING" and the RTL run "RTL_STRING", the unelided text would be drawn 91dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // like: 92dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // LTR_STRING GNIRTS_LTR 93dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // If we need to elide the RTL run, then it will be drawn like: 94dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // LTR_STRING ...RTS_LTR 95dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Instead of: 96dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // LTR_STRING RTS_LTR... 97dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen void Elide(Runs* runs, int remaining_width) const; 98dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // views::View: 100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual gfx::Size GetPreferredSize() OVERRIDE; 101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void Layout() OVERRIDE; 102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; 103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen static int default_icon_size_; 105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 106dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // This row's model and model index. 107dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen AutocompleteResultViewModel* model_; 108dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen size_t model_index_; 109dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 110dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const gfx::Font normal_font_; 111dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const gfx::Font bold_font_; 112dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 113dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Width of the ellipsis in the normal font. 114dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen int ellipsis_width_; 115dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 116dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // A context used for mirroring regions. 117dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen class MirroringContext; 118dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen scoped_ptr<MirroringContext> mirroring_context_; 119dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 120dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen AutocompleteMatch match_; 121dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen gfx::Rect text_bounds_; 123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen gfx::Rect icon_bounds_; 124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 125dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DISALLOW_COPY_AND_ASSIGN(AutocompleteResultView); 126dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}; 127dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 128dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#endif // CHROME_BROWSER_UI_VIEWS_AUTOCOMPLETE_AUTOCOMPLETE_RESULT_VIEW_H_ 129