Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / views / omnibox / omnibox_popup_contents_view.h
1 // Copyright (c) 2012 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_OMNIBOX_OMNIBOX_POPUP_CONTENTS_VIEW_H_
6 #define CHROME_BROWSER_UI_VIEWS_OMNIBOX_OMNIBOX_POPUP_CONTENTS_VIEW_H_
7
8 #include "base/memory/weak_ptr.h"
9 #include "chrome/browser/ui/omnibox/omnibox_popup_model.h"
10 #include "chrome/browser/ui/omnibox/omnibox_popup_view.h"
11 #include "ui/base/window_open_disposition.h"
12 #include "ui/gfx/animation/animation_delegate.h"
13 #include "ui/gfx/animation/slide_animation.h"
14 #include "ui/gfx/font_list.h"
15 #include "ui/views/view.h"
16 #include "ui/views/view_targeter_delegate.h"
17
18 struct AutocompleteMatch;
19 class LocationBarView;
20 class OmniboxEditModel;
21 class OmniboxResultView;
22 class OmniboxView;
23 class Profile;
24
25 // A view representing the contents of the autocomplete popup.
26 class OmniboxPopupContentsView : public views::View,
27                                  public OmniboxPopupView,
28                                  public views::ViewTargeterDelegate,
29                                  public gfx::AnimationDelegate {
30  public:
31   // Factory method for creating the AutocompletePopupView.
32   static OmniboxPopupView* Create(const gfx::FontList& font_list,
33                                   OmniboxView* omnibox_view,
34                                   OmniboxEditModel* edit_model,
35                                   LocationBarView* location_bar_view);
36
37   // Returns the bounds the popup should be shown at. This is the display bounds
38   // and includes offsets for the dropshadow which this view's border renders.
39   gfx::Rect GetPopupBounds() const;
40
41   virtual void LayoutChildren();
42
43   // Overridden from OmniboxPopupView:
44   bool IsOpen() const override;
45   void InvalidateLine(size_t line) override;
46   void UpdatePopupAppearance() override;
47   gfx::Rect GetTargetBounds() override;
48   void PaintUpdatesNow() override;
49   void OnDragCanceled() override;
50
51   // Overridden from gfx::AnimationDelegate:
52   void AnimationProgressed(const gfx::Animation* animation) override;
53
54   // Overridden from views::View:
55   void Layout() override;
56   views::View* GetTooltipHandlerForPoint(const gfx::Point& point) override;
57   bool OnMousePressed(const ui::MouseEvent& event) override;
58   bool OnMouseDragged(const ui::MouseEvent& event) override;
59   void OnMouseReleased(const ui::MouseEvent& event) override;
60   void OnMouseCaptureLost() override;
61   void OnMouseMoved(const ui::MouseEvent& event) override;
62   void OnMouseEntered(const ui::MouseEvent& event) override;
63   void OnMouseExited(const ui::MouseEvent& event) override;
64
65   // Overridden from ui::EventHandler:
66   void OnGestureEvent(ui::GestureEvent* event) override;
67
68   bool IsSelectedIndex(size_t index) const;
69   bool IsHoveredIndex(size_t index) const;
70   gfx::Image GetIconIfExtensionMatch(size_t index) const;
71   bool IsStarredMatch(const AutocompleteMatch& match) const;
72
73   int max_match_contents_width() const {
74     return max_match_contents_width_;
75   }
76
77  protected:
78   OmniboxPopupContentsView(const gfx::FontList& font_list,
79                            OmniboxView* omnibox_view,
80                            OmniboxEditModel* edit_model,
81                            LocationBarView* location_bar_view);
82   ~OmniboxPopupContentsView() override;
83
84   LocationBarView* location_bar_view() { return location_bar_view_; }
85
86   virtual void PaintResultViews(gfx::Canvas* canvas);
87
88   // Calculates the height needed to show all the results in the model.
89   virtual int CalculatePopupHeight();
90   virtual OmniboxResultView* CreateResultView(int model_index,
91                                               const gfx::FontList& font_list);
92
93   // Overridden from views::View:
94   void OnPaint(gfx::Canvas* canvas) override;
95   // This method should not be triggered directly as we paint our children
96   // in an un-conventional way inside OnPaint. We use a separate canvas to
97   // paint the children. Hence we override this method to a no-op so that
98   // the view hierarchy does not "accidentally" trigger this.
99   void PaintChildren(gfx::Canvas* canvas,
100                      const views::CullSet& cull_set) override;
101
102   scoped_ptr<OmniboxPopupModel> model_;
103
104  private:
105   class AutocompletePopupWidget;
106
107   // views::ViewTargeterDelegate:
108   views::View* TargetForRect(views::View* root, const gfx::Rect& rect) override;
109
110   // Call immediately after construction.
111   void Init();
112
113   // Returns true if the model has a match at the specified index.
114   bool HasMatchAt(size_t index) const;
115
116   // Returns the match at the specified index within the popup model.
117   const AutocompleteMatch& GetMatchAtIndex(size_t index) const;
118
119   // Fill a path for the contents' roundrect. |bounding_rect| is the rect that
120   // bounds the path.
121   void MakeContentsPath(gfx::Path* path, const gfx::Rect& bounding_rect);
122
123   // Find the index of the match under the given |point|, specified in window
124   // coordinates. Returns OmniboxPopupModel::kNoMatch if there isn't a match at
125   // the specified point.
126   size_t GetIndexForPoint(const gfx::Point& point);
127
128   // Processes a located event (e.g. mouse/gesture) and sets the selection/hover
129   // state of a line in the list.
130   void UpdateLineEvent(const ui::LocatedEvent& event,
131                        bool should_set_selected_line);
132
133   // Opens an entry from the list depending on the event and the selected
134   // disposition.
135   void OpenSelectedLine(const ui::LocatedEvent& event,
136                         WindowOpenDisposition disposition);
137
138   OmniboxResultView* result_view_at(size_t i);
139
140   // The popup that contains this view.  We create this, but it deletes itself
141   // when its window is destroyed.  This is a WeakPtr because it's possible for
142   // the OS to destroy the window and thus delete this object before we're
143   // deleted, or without our knowledge.
144   base::WeakPtr<AutocompletePopupWidget> popup_;
145
146   // The edit view that invokes us.
147   OmniboxView* omnibox_view_;
148
149   LocationBarView* location_bar_view_;
150
151   // The font list used for result rows, based on the omnibox font list.
152   gfx::FontList font_list_;
153
154   // If the user cancels a dragging action (i.e. by pressing ESC), we don't have
155   // a convenient way to release mouse capture. Instead we use this flag to
156   // simply ignore all remaining drag events, and the eventual mouse release
157   // event. Since OnDragCanceled() can be called when we're not dragging, this
158   // flag is reset to false on a mouse pressed event, to make sure we don't
159   // erroneously ignore the next drag.
160   bool ignore_mouse_drag_;
161
162   // The popup sizes vertically using an animation when the popup is getting
163   // shorter (not larger, that makes it look "slow").
164   gfx::SlideAnimation size_animation_;
165   gfx::Rect start_bounds_;
166   gfx::Rect target_bounds_;
167
168   int left_margin_;
169   int right_margin_;
170
171   const gfx::ImageSkia* bottom_shadow_;  // Ptr owned by resource bundle.
172
173   // Amount of extra padding to add to the popup on the top and bottom.
174   int outside_vertical_padding_;
175
176   // When the dropdown is not wide enough while displaying postfix suggestions,
177   // we use the width of widest match contents to shift the suggestions so that
178   // the widest suggestion just reaches the end edge.
179   int max_match_contents_width_;
180
181   DISALLOW_COPY_AND_ASSIGN(OmniboxPopupContentsView);
182 };
183
184 #endif  // CHROME_BROWSER_UI_VIEWS_OMNIBOX_OMNIBOX_POPUP_CONTENTS_VIEW_H_