| OLD | NEW |
| (Empty) |
| 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 UI_VIEWS_BUBBLE_TRAY_BUBBLE_VIEW_H_ | |
| 6 #define UI_VIEWS_BUBBLE_TRAY_BUBBLE_VIEW_H_ | |
| 7 | |
| 8 #include "base/memory/scoped_ptr.h" | |
| 9 #include "ui/views/bubble/bubble_delegate.h" | |
| 10 #include "ui/views/mouse_watcher.h" | |
| 11 #include "ui/views/views_export.h" | |
| 12 | |
| 13 // Specialized bubble view for bubbles associated with a tray icon (e.g. the | |
| 14 // Ash status area). Mostly this handles custom anchor location and arrow and | |
| 15 // border rendering. This also has its own delegate for handling mouse events | |
| 16 // and other implementation specific details. | |
| 17 | |
| 18 namespace ui { | |
| 19 class LocatedEvent; | |
| 20 } | |
| 21 | |
| 22 namespace views { | |
| 23 class View; | |
| 24 class Widget; | |
| 25 } | |
| 26 | |
| 27 namespace views { | |
| 28 | |
| 29 namespace internal { | |
| 30 class TrayBubbleBorder; | |
| 31 class TrayBubbleContentMask; | |
| 32 } | |
| 33 | |
| 34 class VIEWS_EXPORT TrayBubbleView : public views::BubbleDelegateView, | |
| 35 public views::MouseWatcherListener { | |
| 36 public: | |
| 37 // AnchorType differentiates between bubbles that are anchored on a tray | |
| 38 // element (ANCHOR_TYPE_TRAY) and display an arrow, or that are floating on | |
| 39 // the screen away from the tray (ANCHOR_TYPE_BUBBLE). | |
| 40 enum AnchorType { | |
| 41 ANCHOR_TYPE_TRAY, | |
| 42 ANCHOR_TYPE_BUBBLE, | |
| 43 }; | |
| 44 | |
| 45 // AnchorAlignment determines to which side of the anchor the bubble will | |
| 46 // align itself. | |
| 47 enum AnchorAlignment { | |
| 48 ANCHOR_ALIGNMENT_BOTTOM, | |
| 49 ANCHOR_ALIGNMENT_LEFT, | |
| 50 ANCHOR_ALIGNMENT_RIGHT, | |
| 51 ANCHOR_ALIGNMENT_TOP | |
| 52 }; | |
| 53 | |
| 54 class VIEWS_EXPORT Delegate { | |
| 55 public: | |
| 56 typedef TrayBubbleView::AnchorType AnchorType; | |
| 57 typedef TrayBubbleView::AnchorAlignment AnchorAlignment; | |
| 58 | |
| 59 Delegate() {} | |
| 60 virtual ~Delegate() {} | |
| 61 | |
| 62 // Called when the view is destroyed. Any pointers to the view should be | |
| 63 // cleared when this gets called. | |
| 64 virtual void BubbleViewDestroyed() = 0; | |
| 65 | |
| 66 // Called when the mouse enters/exits the view. | |
| 67 // Note: This event will only be called if the mouse gets actively moved by | |
| 68 // the user to enter the view. | |
| 69 virtual void OnMouseEnteredView() = 0; | |
| 70 virtual void OnMouseExitedView() = 0; | |
| 71 | |
| 72 // Called from GetAccessibleState(); should return the appropriate | |
| 73 // accessible name for the bubble. | |
| 74 virtual base::string16 GetAccessibleNameForBubble() = 0; | |
| 75 | |
| 76 // Passes responsibility for BubbleDelegateView::GetAnchorRect to the | |
| 77 // delegate. | |
| 78 virtual gfx::Rect GetAnchorRect( | |
| 79 views::Widget* anchor_widget, | |
| 80 AnchorType anchor_type, | |
| 81 AnchorAlignment anchor_alignment) const = 0; | |
| 82 | |
| 83 // Called when a bubble wants to hide/destroy itself (e.g. last visible | |
| 84 // child view was closed). | |
| 85 virtual void HideBubble(const TrayBubbleView* bubble_view) = 0; | |
| 86 | |
| 87 private: | |
| 88 DISALLOW_COPY_AND_ASSIGN(Delegate); | |
| 89 }; | |
| 90 | |
| 91 struct VIEWS_EXPORT InitParams { | |
| 92 static const int kArrowDefaultOffset; | |
| 93 | |
| 94 InitParams(AnchorType anchor_type, | |
| 95 AnchorAlignment anchor_alignment, | |
| 96 int min_width, | |
| 97 int max_width); | |
| 98 AnchorType anchor_type; | |
| 99 AnchorAlignment anchor_alignment; | |
| 100 int min_width; | |
| 101 int max_width; | |
| 102 int max_height; | |
| 103 bool can_activate; | |
| 104 bool close_on_deactivate; | |
| 105 SkColor arrow_color; | |
| 106 bool first_item_has_no_margin; | |
| 107 views::BubbleBorder::Arrow arrow; | |
| 108 int arrow_offset; | |
| 109 views::BubbleBorder::ArrowPaintType arrow_paint_type; | |
| 110 views::BubbleBorder::Shadow shadow; | |
| 111 views::BubbleBorder::BubbleAlignment arrow_alignment; | |
| 112 }; | |
| 113 | |
| 114 // Constructs and returns a TrayBubbleView. init_params may be modified. | |
| 115 static TrayBubbleView* Create(gfx::NativeView parent_window, | |
| 116 views::View* anchor, | |
| 117 Delegate* delegate, | |
| 118 InitParams* init_params); | |
| 119 | |
| 120 virtual ~TrayBubbleView(); | |
| 121 | |
| 122 // Sets up animations, and show the bubble. Must occur after CreateBubble() | |
| 123 // is called. | |
| 124 void InitializeAndShowBubble(); | |
| 125 | |
| 126 // Called whenever the bubble size or location may have changed. | |
| 127 void UpdateBubble(); | |
| 128 | |
| 129 // Sets the maximum bubble height and resizes the bubble. | |
| 130 void SetMaxHeight(int height); | |
| 131 | |
| 132 // Sets the bubble width. | |
| 133 void SetWidth(int width); | |
| 134 | |
| 135 // Sets whether or not to paint the bubble border arrow. | |
| 136 void SetArrowPaintType(views::BubbleBorder::ArrowPaintType arrow_paint_type); | |
| 137 | |
| 138 // Returns the border insets. Called by TrayEventFilter. | |
| 139 gfx::Insets GetBorderInsets() const; | |
| 140 | |
| 141 // Called when the delegate is destroyed. | |
| 142 void reset_delegate() { delegate_ = NULL; } | |
| 143 | |
| 144 Delegate* delegate() { return delegate_; } | |
| 145 | |
| 146 void set_gesture_dragging(bool dragging) { is_gesture_dragging_ = dragging; } | |
| 147 bool is_gesture_dragging() const { return is_gesture_dragging_; } | |
| 148 | |
| 149 // Overridden from views::WidgetDelegate. | |
| 150 virtual bool CanActivate() const override; | |
| 151 virtual views::NonClientFrameView* CreateNonClientFrameView( | |
| 152 views::Widget* widget) override; | |
| 153 virtual bool WidgetHasHitTestMask() const override; | |
| 154 virtual void GetWidgetHitTestMask(gfx::Path* mask) const override; | |
| 155 | |
| 156 // Overridden from views::BubbleDelegateView. | |
| 157 virtual gfx::Rect GetAnchorRect() const override; | |
| 158 | |
| 159 // Overridden from views::View. | |
| 160 virtual gfx::Size GetPreferredSize() const override; | |
| 161 virtual gfx::Size GetMaximumSize() const override; | |
| 162 virtual int GetHeightForWidth(int width) const override; | |
| 163 virtual void OnMouseEntered(const ui::MouseEvent& event) override; | |
| 164 virtual void OnMouseExited(const ui::MouseEvent& event) override; | |
| 165 virtual void GetAccessibleState(ui::AXViewState* state) override; | |
| 166 | |
| 167 // Overridden from MouseWatcherListener | |
| 168 virtual void MouseMovedOutOfHost() override; | |
| 169 | |
| 170 protected: | |
| 171 TrayBubbleView(gfx::NativeView parent_window, | |
| 172 views::View* anchor, | |
| 173 Delegate* delegate, | |
| 174 const InitParams& init_params); | |
| 175 | |
| 176 // Overridden from views::BubbleDelegateView. | |
| 177 virtual void Init() override; | |
| 178 | |
| 179 // Overridden from views::View. | |
| 180 virtual void ChildPreferredSizeChanged(View* child) override; | |
| 181 virtual void ViewHierarchyChanged( | |
| 182 const ViewHierarchyChangedDetails& details) override; | |
| 183 | |
| 184 private: | |
| 185 InitParams params_; | |
| 186 Delegate* delegate_; | |
| 187 int preferred_width_; | |
| 188 internal::TrayBubbleBorder* bubble_border_; | |
| 189 scoped_ptr<internal::TrayBubbleContentMask> bubble_content_mask_; | |
| 190 bool is_gesture_dragging_; | |
| 191 | |
| 192 // True once the mouse cursor was actively moved by the user over the bubble. | |
| 193 // Only then the OnMouseExitedView() event will get passed on to listeners. | |
| 194 bool mouse_actively_entered_; | |
| 195 | |
| 196 // Used to find any mouse movements. | |
| 197 scoped_ptr<MouseWatcher> mouse_watcher_; | |
| 198 | |
| 199 DISALLOW_COPY_AND_ASSIGN(TrayBubbleView); | |
| 200 }; | |
| 201 | |
| 202 } // namespace views | |
| 203 | |
| 204 #endif // UI_VIEWS_BUBBLE_TRAY_BUBBLE_VIEW_H_ | |
| OLD | NEW |