Home | History | Annotate | Download | only in views
      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.
      4 
      5 #ifndef UI_MESSAGE_CENTER_VIEWS_TOAST_CONTENTS_VIEW_H_
      6 #define UI_MESSAGE_CENTER_VIEWS_TOAST_CONTENTS_VIEW_H_
      7 
      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/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/message_center/views/message_center_controller.h"
     16 #include "ui/views/widget/widget_delegate.h"
     17 
     18 namespace gfx {
     19 class Animation;
     20 class SlideAnimation;
     21 }
     22 
     23 namespace views {
     24 class View;
     25 }
     26 
     27 namespace message_center {
     28 
     29 class MessagePopupCollection;
     30 class MessageView;
     31 class Notification;
     32 
     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 {
     40  public:
     41   // Computes the size of a toast assuming it will host the given view.
     42   static gfx::Size GetToastSizeForView(views::View* view);
     43 
     44   ToastContentsView(const std::string& notification_id,
     45                     base::WeakPtr<MessagePopupCollection> collection);
     46   virtual ~ToastContentsView();
     47 
     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);
     52 
     53   // Shows the new toast for the first time, animated.
     54   // |origin| is the right-bottom corner of the toast.
     55   void RevealWithAnimation(gfx::Point origin);
     56 
     57   // Disconnectes the toast from the rest of the system immediately and start
     58   // an animation. Once animation finishes, closes the widget.
     59   void CloseWithAnimation();
     60 
     61   void SetBoundsWithAnimation(gfx::Rect new_bounds);
     62 
     63   // Origin and bounds are not 'instant', but rather 'current stable values',
     64   // there could be animation in progress that targets these values.
     65   gfx::Point origin() { return origin_; }
     66   gfx::Rect bounds() { return gfx::Rect(origin_, preferred_size_); }
     67 
     68   const std::string& id() { return id_; }
     69 
     70   // Overridden from views::View:
     71   virtual void OnMouseEntered(const ui::MouseEvent& event) OVERRIDE;
     72   virtual void OnMouseExited(const ui::MouseEvent& event) OVERRIDE;
     73   virtual void Layout() OVERRIDE;
     74   virtual gfx::Size GetPreferredSize() OVERRIDE;
     75   virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE;
     76 
     77  private:
     78   // Overridden from MessageCenterController:
     79   virtual void ClickOnNotification(const std::string& notification_id) OVERRIDE;
     80   virtual void RemoveNotification(const std::string& notification_id,
     81                                   bool by_user) OVERRIDE;
     82   virtual void DisableNotificationsFromThisSource(
     83       const NotifierId& notifier_id) OVERRIDE;
     84   virtual void ShowNotifierSettingsBubble() OVERRIDE;
     85   virtual bool HasClickedListener(const std::string& notification_id) OVERRIDE;
     86   virtual void ClickOnNotificationButton(const std::string& notification_id,
     87                                          int button_index) OVERRIDE;
     88   virtual void ExpandNotification(const std::string& notification_id) OVERRIDE;
     89   virtual void GroupBodyClicked(const std::string& last_notification_id)
     90       OVERRIDE;
     91   virtual void ExpandGroup(const NotifierId& notifier_id) OVERRIDE;
     92   virtual void RemoveGroup(const NotifierId& notifier_id) OVERRIDE;
     93 
     94   // Overridden from gfx::AnimationDelegate:
     95   virtual void AnimationProgressed(const gfx::Animation* animation) OVERRIDE;
     96   virtual void AnimationEnded(const gfx::Animation* animation) OVERRIDE;
     97   virtual void AnimationCanceled(const gfx::Animation* animation) OVERRIDE;
     98 
     99   // Overridden from views::WidgetDelegate:
    100   virtual views::View* GetContentsView() OVERRIDE;
    101   virtual void WindowClosing() OVERRIDE;
    102   virtual bool CanActivate() const OVERRIDE;
    103   virtual void OnDisplayChanged() OVERRIDE;
    104   virtual void OnWorkAreaChanged() OVERRIDE;
    105 
    106   // Initialization and update.
    107   void CreateWidget(gfx::NativeView parent);
    108 
    109   // Immediately moves the toast without any sort of delay or animation.
    110   void SetBoundsInstantly(gfx::Rect new_bounds);
    111 
    112   // Given the bounds of a toast on the screen, compute the bouds for that
    113   // toast in 'closed' state. The 'closed' state is used as origin/destination
    114   // in reveal/closing animations.
    115   gfx::Rect GetClosedToastBounds(gfx::Rect bounds);
    116 
    117   void StartFadeIn();
    118   void StartFadeOut();  // Will call Widget::Close() when animation ends.
    119   void OnBoundsAnimationEndedOrCancelled(const gfx::Animation* animation);
    120 
    121   base::WeakPtr<MessagePopupCollection> collection_;
    122 
    123   // Id if the corresponding Notification.
    124   std::string id_;
    125 
    126   scoped_ptr<gfx::SlideAnimation> bounds_animation_;
    127   scoped_ptr<gfx::SlideAnimation> fade_animation_;
    128 
    129   bool is_animating_bounds_;
    130   gfx::Rect animated_bounds_start_;
    131   gfx::Rect animated_bounds_end_;
    132   // Started closing animation, will close at the end.
    133   bool is_closing_;
    134   // Closing animation - when it ends, close the widget. Weak, only used
    135   // for referential equality.
    136   gfx::Animation* closing_animation_;
    137 
    138   gfx::Point origin_;
    139   gfx::Size preferred_size_;
    140 
    141   DISALLOW_COPY_AND_ASSIGN(ToastContentsView);
    142 };
    143 
    144 }  // namespace message_center
    145 
    146 #endif // UI_MESSAGE_CENTER_VIEWS_TOAST_CONTENTS_VIEW_H_
    147