omnibox_result_view.h revision d0247b1b59f9c528cb6df88b4f2b9afaf80d181e
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_UI_VIEWS_OMNIBOX_OMNIBOX_RESULT_VIEW_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_UI_VIEWS_OMNIBOX_OMNIBOX_RESULT_VIEW_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector> 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/autocomplete/autocomplete_match.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkColor.h" 12d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/gfx/animation/animation_delegate.h" 13d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/gfx/animation/slide_animation.h" 14a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "ui/gfx/font_list.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/image_view.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/view.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class LocationBarView; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class OmniboxResultViewModel; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Canvas; 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class RenderText; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class OmniboxResultView : public views::View, 28d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) private gfx::AnimationDelegate { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keep these ordered from least dominant (normal) to most dominant 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (selected). 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum ResultViewState { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NORMAL = 0, 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HOVERED, 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SELECTED, 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NUM_STATES 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum ColorKind { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BACKGROUND = 0, 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TEXT, 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DIMMED_TEXT, 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URL, 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DIVIDER, 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NUM_KINDS 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OmniboxResultView(OmniboxResultViewModel* model, 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int model_index, 50868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) LocationBarView* location_bar_view, 51a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const gfx::FontList& font_list); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~OmniboxResultView(); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkColor GetColor(ResultViewState state, ColorKind kind) const; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Updates the match used to paint the contents of this result view. We copy 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the match so that we can continue to paint the last result even after the 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // model has changed. 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetMatch(const AutocompleteMatch& match); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ShowKeyword(bool show_keyword); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Invalidate(); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // views::View: 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual gfx::Size GetPreferredSize() OVERRIDE; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResultViewState GetState() const; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 70868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Returns the height of the text portion of the result view. In the base 71868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // class, this is the height of one line of text. 72868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual int GetTextHeight() const; 73868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void PaintMatch(gfx::Canvas* canvas, 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const AutocompleteMatch& match, 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int x); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Draws the specified |text| into the canvas, using highlighting provided by 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |classifications|. If |force_dim| is true, ACMatchClassification::DIM is 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // added to all of the classifications. Returns the x position to the right 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of the string. 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int DrawString(gfx::Canvas* canvas, 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& text, 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ACMatchClassifications& classifications, 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool force_dim, 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int x, 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int y); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& text_bounds() const { return text_bounds_; } 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_edge_item_padding(int value) { edge_item_padding_ = value; } 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_item_padding(int value) { item_padding_ = value; } 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_minimum_text_vertical_padding(int value) { 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) minimum_text_vertical_padding_ = value; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct RunData; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::vector<RunData> Runs; 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef std::vector<gfx::RenderText*> Classifications; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Common initialization code of the colors returned by GetColors(). 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void CommonInitColors(const ui::NativeTheme* theme, 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkColor colors[][NUM_KINDS]); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Predicate functions for use when sorting the runs. 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool SortRunsLogically(const RunData& lhs, const RunData& rhs); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool SortRunsVisually(const RunData& lhs, const RunData& rhs); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::ImageSkia GetIcon() const; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::ImageSkia* GetKeywordIcon() const; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Elides |runs| to fit in |remaining_width|. The runs in |runs| should be in 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // logical order. 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When we need to elide a run, the ellipsis will be placed at the end of that 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // run. This means that if we elide a run whose visual direction is opposite 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that of the drawing context, the ellipsis will not be at the "end" of the 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // drawn string. For example, if in an LTR context we have the LTR run 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // "LTR_STRING" and the RTL run "RTL_STRING", the unelided text would be drawn 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // like: 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // LTR_STRING GNIRTS_LTR 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we need to elide the RTL run, then it will be drawn like: 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // LTR_STRING ...RTS_LTR 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Instead of: 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // LTR_STRING RTS_LTR... 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Elide(Runs* runs, int remaining_width) const; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // views::View: 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Layout() OVERRIDE; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnBoundsChanged(const gfx::Rect& previous_bounds) OVERRIDE; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // gfx::AnimationDelegate: 136d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual void AnimationProgressed(const gfx::Animation* animation) OVERRIDE; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static int default_icon_size_; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Default values cached here, may be overridden using the setters above. 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int edge_item_padding_; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int item_padding_; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int minimum_text_vertical_padding_; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This row's model and model index. 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OmniboxResultViewModel* model_; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t model_index_; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 149868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) LocationBarView* location_bar_view_; 150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 151a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const gfx::FontList font_list_; 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int font_height_; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Width of the ellipsis in the normal font. 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ellipsis_width_; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A context used for mirroring regions. 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class MirroringContext; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<MirroringContext> mirroring_context_; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutocompleteMatch match_; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect text_bounds_; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect icon_bounds_; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect keyword_text_bounds_; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<views::ImageView> keyword_icon_; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 169d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) scoped_ptr<gfx::SlideAnimation> animation_; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(OmniboxResultView); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_UI_VIEWS_OMNIBOX_OMNIBOX_RESULT_VIEW_H_ 175