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/base/animation/animation_delegate.h"
11 #include "ui/gfx/native_widget_types.h"
12 #include "ui/gfx/point.h"
13 #include "ui/gfx/rect.h"
14 #include "ui/gfx/size.h"
15 #include "ui/views/widget/widget_delegate.h"
26 namespace message_center
{
29 class MessagePopupCollection
;
34 class ToastContentsView
: public views::WidgetDelegateView
,
35 public ui::AnimationDelegate
{
37 ToastContentsView(const Notification
* notification
,
38 base::WeakPtr
<MessagePopupCollection
> collection
,
39 MessageCenter
* message_center
);
40 virtual ~ToastContentsView();
42 // Initialization and update.
43 views::Widget
* CreateWidget(gfx::NativeView parent
);
44 void SetContents(MessageView
* view
);
46 // Shows the new toast for the first time, animated.
47 // |origin| is the right-bottom corner of the toast.
48 void RevealWithAnimation(gfx::Point origin
);
49 // Disconnectes the toast from the rest of the system immediately and start
50 // an animation. Once animation finishes, closes the widget.
51 void CloseWithAnimation(bool mark_as_shown
);
53 void SetBoundsInstantly(gfx::Rect new_bounds
);
54 void SetBoundsWithAnimation(gfx::Rect new_bounds
);
56 // Origin and bounds are not 'instant', but rather 'current stable values',
57 // there could be animation in progress that targets these values.
58 gfx::Point
origin() { return origin_
; }
59 gfx::Rect
bounds() { return gfx::Rect(origin_
, preferred_size_
); }
61 const std::string
& id() { return id_
; }
63 // Computes the size of the toast assuming it will host the given view.
64 static gfx::Size
GetToastSizeForView(views::View
* view
);
66 // Overridden from views::View:
67 virtual void OnMouseEntered(const ui::MouseEvent
& event
) OVERRIDE
;
68 virtual void OnMouseExited(const ui::MouseEvent
& event
) OVERRIDE
;
69 virtual void Layout() OVERRIDE
;
70 virtual gfx::Size
GetPreferredSize() OVERRIDE
;
71 virtual void GetAccessibleState(ui::AccessibleViewState
* state
) OVERRIDE
;
74 // Overridden from ui::AnimationDelegate:
75 virtual void AnimationProgressed(const ui::Animation
* animation
) OVERRIDE
;
76 virtual void AnimationEnded(const ui::Animation
* animation
) OVERRIDE
;
77 virtual void AnimationCanceled(const ui::Animation
* animation
) OVERRIDE
;
79 // Overridden from views::WidgetDelegate:
80 virtual views::View
* GetContentsView() OVERRIDE
;
81 virtual void WindowClosing() OVERRIDE
;
82 virtual bool CanActivate() const OVERRIDE
;
83 virtual void OnDisplayChanged() OVERRIDE
;
84 virtual void OnWorkAreaChanged() OVERRIDE
;
86 // Given the bounds of a toast on the screen, compute the bouds for that
87 // toast in 'closed' state. The 'closed' state is used as origin/destination
88 // in reveal/closing animations.
89 gfx::Rect
GetClosedToastBounds(gfx::Rect bounds
);
92 void StartFadeOut(); // Will call Widget::Close() when animation ends.
93 void OnBoundsAnimationEndedOrCancelled(const ui::Animation
* animation
);
95 base::WeakPtr
<MessagePopupCollection
> collection_
;
96 MessageCenter
* message_center_
;
98 // Id if the corresponding Notification.
101 scoped_ptr
<ui::SlideAnimation
> bounds_animation_
;
102 scoped_ptr
<ui::SlideAnimation
> fade_animation_
;
104 bool is_animating_bounds_
;
105 gfx::Rect animated_bounds_start_
;
106 gfx::Rect animated_bounds_end_
;
107 // Started closing animation, will close at the end.
109 // Closing animation - when it ends, close the widget. Weak, only used
110 // for referential equality.
111 ui::Animation
* closing_animation_
;
114 gfx::Size preferred_size_
;
116 DISALLOW_COPY_AND_ASSIGN(ToastContentsView
);
119 } // namespace message_center
121 #endif // UI_MESSAGE_CENTER_VIEWS_TOAST_CONTENTS_VIEW_H_