1 // Copyright (c) 2013 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 UI_MESSAGE_CENTER_VIEWS_TOAST_CONTENTS_VIEW_H_
6 #define UI_MESSAGE_CENTER_VIEWS_TOAST_CONTENTS_VIEW_H_
8 #include "base/compiler_specific.h"
9 #include "base/memory/weak_ptr.h"
10 #include "ui/gfx/animation/animation_delegate.h"
11 #include "ui/gfx/geometry/point.h"
12 #include "ui/gfx/geometry/rect.h"
13 #include "ui/gfx/geometry/size.h"
14 #include "ui/gfx/native_widget_types.h"
15 #include "ui/message_center/views/message_center_controller.h"
16 #include "ui/views/widget/widget_delegate.h"
27 namespace message_center
{
29 class MessagePopupCollection
;
33 // The widget host for a popup. Also implements MessageCenterController
34 // which delegates over to MessagePopupCollection, but takes care about
35 // checking the weakref since MessagePopupCollection may disappear before
36 // widget/views are closed/destructed.
37 class ToastContentsView
: public views::WidgetDelegateView
,
38 public MessageCenterController
,
39 public gfx::AnimationDelegate
{
41 // Computes the size of a toast assuming it will host the given view.
42 static gfx::Size
GetToastSizeForView(const views::View
* view
);
44 ToastContentsView(const std::string
& notification_id
,
45 base::WeakPtr
<MessagePopupCollection
> collection
);
46 ~ToastContentsView() override
;
48 // Sets the inner view of the toast. If it has contents already,
49 // |a11y_feedback_for_updates| causes the view to notify that the
50 // accessibility message should be read after this update.
51 void SetContents(MessageView
* view
, bool a11y_feedback_for_updates
);
53 void UpdateContents(const Notification
& notification
,
54 bool a11y_feedback_for_updates
);
56 // Shows the new toast for the first time, animated.
57 // |origin| is the right-bottom corner of the toast.
58 void RevealWithAnimation(gfx::Point origin
);
60 // Disconnectes the toast from the rest of the system immediately and start
61 // an animation. Once animation finishes, closes the widget.
62 void CloseWithAnimation();
64 void SetBoundsWithAnimation(gfx::Rect new_bounds
);
66 // Origin and bounds are not 'instant', but rather 'current stable values',
67 // there could be animation in progress that targets these values.
68 gfx::Point
origin() { return origin_
; }
69 gfx::Rect
bounds() { return gfx::Rect(origin_
, preferred_size_
); }
71 const std::string
& id() { return id_
; }
73 // Overridden from views::View:
74 void OnMouseEntered(const ui::MouseEvent
& event
) override
;
75 void OnMouseExited(const ui::MouseEvent
& event
) override
;
76 void Layout() override
;
77 gfx::Size
GetPreferredSize() const override
;
78 void GetAccessibleState(ui::AXViewState
* state
) override
;
81 // Overridden from MessageCenterController:
82 void ClickOnNotification(const std::string
& notification_id
) override
;
83 void RemoveNotification(const std::string
& notification_id
,
84 bool by_user
) override
;
85 scoped_ptr
<ui::MenuModel
> CreateMenuModel(
86 const NotifierId
& notifier_id
,
87 const base::string16
& display_source
) override
;
88 bool HasClickedListener(const std::string
& notification_id
) override
;
89 void ClickOnNotificationButton(const std::string
& notification_id
,
90 int button_index
) override
;
92 // Overridden from gfx::AnimationDelegate:
93 void AnimationProgressed(const gfx::Animation
* animation
) override
;
94 void AnimationEnded(const gfx::Animation
* animation
) override
;
95 void AnimationCanceled(const gfx::Animation
* animation
) override
;
97 // Overridden from views::WidgetDelegate:
98 views::View
* GetContentsView() override
;
99 void WindowClosing() override
;
100 void OnDisplayChanged() override
;
101 void OnWorkAreaChanged() override
;
103 // Initialization and update.
104 void CreateWidget(gfx::NativeView parent
);
106 // Immediately moves the toast without any sort of delay or animation.
107 void SetBoundsInstantly(gfx::Rect new_bounds
);
109 // Given the bounds of a toast on the screen, compute the bouds for that
110 // toast in 'closed' state. The 'closed' state is used as origin/destination
111 // in reveal/closing animations.
112 gfx::Rect
GetClosedToastBounds(gfx::Rect bounds
);
115 void StartFadeOut(); // Will call Widget::Close() when animation ends.
116 void OnBoundsAnimationEndedOrCancelled(const gfx::Animation
* animation
);
118 base::WeakPtr
<MessagePopupCollection
> collection_
;
120 // Id if the corresponding Notification.
123 scoped_ptr
<gfx::SlideAnimation
> bounds_animation_
;
124 scoped_ptr
<gfx::SlideAnimation
> fade_animation_
;
126 gfx::Rect animated_bounds_start_
;
127 gfx::Rect animated_bounds_end_
;
128 // Started closing animation, will close at the end.
130 // Closing animation - when it ends, close the widget. Weak, only used
131 // for referential equality.
132 gfx::Animation
* closing_animation_
;
135 gfx::Size preferred_size_
;
137 DISALLOW_COPY_AND_ASSIGN(ToastContentsView
);
140 } // namespace message_center
142 #endif // UI_MESSAGE_CENTER_VIEWS_TOAST_CONTENTS_VIEW_H_