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