Merge Chromium + Blink git repositories
[chromium-blink-merge.git] / chrome / browser / ui / views / omnibox / omnibox_popup_contents_view.h
blob73d0033993ffa825bbc9732142b2e6f45c73693d
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.
5 #ifndef CHROME_BROWSER_UI_VIEWS_OMNIBOX_OMNIBOX_POPUP_CONTENTS_VIEW_H_
6 #define CHROME_BROWSER_UI_VIEWS_OMNIBOX_OMNIBOX_POPUP_CONTENTS_VIEW_H_
8 #include "base/memory/weak_ptr.h"
9 #include "components/omnibox/browser/omnibox_popup_model.h"
10 #include "components/omnibox/browser/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"
18 struct AutocompleteMatch;
19 class LocationBarView;
20 class OmniboxEditModel;
21 class OmniboxResultView;
22 class OmniboxView;
23 class Profile;
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);
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;
41 virtual void LayoutChildren();
43 // 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;
51 // gfx::AnimationDelegate:
52 void AnimationProgressed(const gfx::Animation* animation) override;
54 // 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 void OnGestureEvent(ui::GestureEvent* event) override;
66 bool IsSelectedIndex(size_t index) const;
67 bool IsHoveredIndex(size_t index) const;
68 gfx::Image GetIconIfExtensionMatch(size_t index) const;
69 bool IsStarredMatch(const AutocompleteMatch& match) const;
71 int max_match_contents_width() const { return max_match_contents_width_; }
72 int start_margin() const { return start_margin_; }
73 int end_margin() const { return end_margin_; }
75 protected:
76 OmniboxPopupContentsView(const gfx::FontList& font_list,
77 OmniboxView* omnibox_view,
78 OmniboxEditModel* edit_model,
79 LocationBarView* location_bar_view);
80 ~OmniboxPopupContentsView() override;
82 LocationBarView* location_bar_view() { return location_bar_view_; }
84 // Calculates the height needed to show all the results in the model.
85 virtual int CalculatePopupHeight();
86 virtual OmniboxResultView* CreateResultView(int model_index,
87 const gfx::FontList& font_list);
89 private:
90 class AutocompletePopupWidget;
92 // views::View:
93 const char* GetClassName() const override;
94 void OnPaint(gfx::Canvas* canvas) override;
95 void PaintChildren(const ui::PaintContext& context) override;
97 // views::ViewTargeterDelegate:
98 views::View* TargetForRect(views::View* root, const gfx::Rect& rect) override;
100 // Call immediately after construction.
101 void Init();
103 // Returns true if the model has a match at the specified index.
104 bool HasMatchAt(size_t index) const;
106 // Returns the match at the specified index within the popup model.
107 const AutocompleteMatch& GetMatchAtIndex(size_t index) const;
109 // Find the index of the match under the given |point|, specified in window
110 // coordinates. Returns OmniboxPopupModel::kNoMatch if there isn't a match at
111 // the specified point.
112 size_t GetIndexForPoint(const gfx::Point& point);
114 // Processes a located event (e.g. mouse/gesture) and sets the selection/hover
115 // state of a line in the list.
116 void UpdateLineEvent(const ui::LocatedEvent& event,
117 bool should_set_selected_line);
119 // Opens an entry from the list depending on the event and the selected
120 // disposition.
121 void OpenSelectedLine(const ui::LocatedEvent& event,
122 WindowOpenDisposition disposition);
124 OmniboxResultView* result_view_at(size_t i);
126 scoped_ptr<OmniboxPopupModel> model_;
128 // The popup that contains this view. We create this, but it deletes itself
129 // when its window is destroyed. This is a WeakPtr because it's possible for
130 // the OS to destroy the window and thus delete this object before we're
131 // deleted, or without our knowledge.
132 base::WeakPtr<AutocompletePopupWidget> popup_;
134 // The edit view that invokes us.
135 OmniboxView* omnibox_view_;
137 LocationBarView* location_bar_view_;
139 // The font list used for result rows, based on the omnibox font list.
140 gfx::FontList font_list_;
142 // If the user cancels a dragging action (i.e. by pressing ESC), we don't have
143 // a convenient way to release mouse capture. Instead we use this flag to
144 // simply ignore all remaining drag events, and the eventual mouse release
145 // event. Since OnDragCanceled() can be called when we're not dragging, this
146 // flag is reset to false on a mouse pressed event, to make sure we don't
147 // erroneously ignore the next drag.
148 bool ignore_mouse_drag_;
150 // The popup sizes vertically using an animation when the popup is getting
151 // shorter (not larger, that makes it look "slow").
152 gfx::SlideAnimation size_animation_;
153 gfx::Rect start_bounds_;
154 gfx::Rect target_bounds_;
156 int start_margin_;
157 int end_margin_;
159 // These pointers are owned by the resource bundle.
160 const gfx::ImageSkia* top_shadow_ = nullptr;
161 const gfx::ImageSkia* bottom_shadow_ = nullptr;
163 // When the dropdown is not wide enough while displaying postfix suggestions,
164 // we use the width of widest match contents to shift the suggestions so that
165 // the widest suggestion just reaches the end edge.
166 int max_match_contents_width_;
168 DISALLOW_COPY_AND_ASSIGN(OmniboxPopupContentsView);
171 #endif // CHROME_BROWSER_UI_VIEWS_OMNIBOX_OMNIBOX_POPUP_CONTENTS_VIEW_H_