// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_BROWSER_UI_VIEWS_AUTOCOMPLETE_AUTOCOMPLETE_RESULT_VIEW_H_ #define CHROME_BROWSER_UI_VIEWS_AUTOCOMPLETE_AUTOCOMPLETE_RESULT_VIEW_H_ #pragma once #include "chrome/browser/autocomplete/autocomplete_match.h" #include "third_party/skia/include/core/SkColor.h" #include "ui/gfx/font.h" #include "ui/gfx/rect.h" #include "views/view.h" class AutocompleteResultViewModel; namespace gfx { class Canvas; } class AutocompleteResultView : public views::View { public: enum ResultViewState { NORMAL = 0, SELECTED, HOVERED, NUM_STATES }; enum ColorKind { BACKGROUND = 0, TEXT, DIMMED_TEXT, URL, NUM_KINDS }; AutocompleteResultView(AutocompleteResultViewModel* model, int model_index, const gfx::Font& font, const gfx::Font& bold_font); virtual ~AutocompleteResultView(); static SkColor GetColor(ResultViewState state, ColorKind kind); // Updates the match used to paint the contents of this result view. We copy // the match so that we can continue to paint the last result even after the // model has changed. void SetMatch(const AutocompleteMatch& match); protected: virtual void PaintMatch(gfx::Canvas* canvas, const AutocompleteMatch& match, int x); virtual int GetFontHeight() const; // Draws the specified |text| into the canvas, using highlighting provided by // |classifications|. If |force_dim| is true, ACMatchClassification::DIM is // added to all of the classifications. Returns the x position to the right // of the string. int DrawString(gfx::Canvas* canvas, const string16& text, const ACMatchClassifications& classifications, bool force_dim, int x, int y); const gfx::Rect& text_bounds() const { return text_bounds_; } private: struct ClassificationData; typedef std::vector<ClassificationData> Classifications; struct RunData; typedef std::vector<RunData> Runs; // Predicate functions for use when sorting the runs. static bool SortRunsLogically(const RunData& lhs, const RunData& rhs); static bool SortRunsVisually(const RunData& lhs, const RunData& rhs); ResultViewState GetState() const; const SkBitmap* GetIcon() const; // Elides |runs| to fit in |remaining_width|. The runs in |runs| should be in // logical order. // // When we need to elide a run, the ellipsis will be placed at the end of that // run. This means that if we elide a run whose visual direction is opposite // that of the drawing context, the ellipsis will not be at the "end" of the // drawn string. For example, if in an LTR context we have the LTR run // "LTR_STRING" and the RTL run "RTL_STRING", the unelided text would be drawn // like: // LTR_STRING GNIRTS_LTR // If we need to elide the RTL run, then it will be drawn like: // LTR_STRING ...RTS_LTR // Instead of: // LTR_STRING RTS_LTR... void Elide(Runs* runs, int remaining_width) const; // views::View: virtual gfx::Size GetPreferredSize() OVERRIDE; virtual void Layout() OVERRIDE; virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; static int default_icon_size_; // This row's model and model index. AutocompleteResultViewModel* model_; size_t model_index_; const gfx::Font normal_font_; const gfx::Font bold_font_; // Width of the ellipsis in the normal font. int ellipsis_width_; // A context used for mirroring regions. class MirroringContext; scoped_ptr<MirroringContext> mirroring_context_; AutocompleteMatch match_; gfx::Rect text_bounds_; gfx::Rect icon_bounds_; DISALLOW_COPY_AND_ASSIGN(AutocompleteResultView); }; #endif // CHROME_BROWSER_UI_VIEWS_AUTOCOMPLETE_AUTOCOMPLETE_RESULT_VIEW_H_