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