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