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
;
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
{
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();
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
;
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_
; }
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
);
90 class AutocompletePopupWidget
;
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.
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
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_
;
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_