Home | History | Annotate | Download | only in cocoa
      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_COCOA_POPUP_COLLECTION_H_
      6 #define UI_MESSAGE_CENTER_COCOA_POPUP_COLLECTION_H_
      7 
      8 #import <Cocoa/Cocoa.h>
      9 
     10 #include <set>
     11 
     12 #include "base/mac/scoped_block.h"
     13 #import "base/mac/scoped_nsobject.h"
     14 #import "base/memory/scoped_ptr.h"
     15 #include "ui/message_center/message_center_export.h"
     16 
     17 namespace message_center {
     18 class MessageCenter;
     19 class MessageCenterObserver;
     20 }
     21 
     22 namespace message_center {
     23 typedef void(^AnimationEndedCallback)();
     24 }
     25 
     26 // A popup collection interfaces with the MessageCenter as an observer. It will
     27 // arrange notifications on the screen as popups, starting in the upper-right
     28 // corner, going to the bottom of the screen. This class maintains ownership of
     29 // the Cocoa controllers and windows of the notifications.
     30 MESSAGE_CENTER_EXPORT
     31 @interface MCPopupCollection : NSObject {
     32  @private
     33   // The message center that is responsible for the notifications. Weak, global.
     34   message_center::MessageCenter* messageCenter_;
     35 
     36   // MessageCenterObserver implementation.
     37   scoped_ptr<message_center::MessageCenterObserver> observer_;
     38 
     39   // Array of all on-screen popup notifications.
     40   base::scoped_nsobject<NSMutableArray> popups_;
     41 
     42   // Array of all on-screen popup notifications that are being faded out
     43   // for removal.
     44   base::scoped_nsobject<NSMutableArray> popupsBeingRemoved_;
     45 
     46   // For testing only. If not a zero rect, this is the screen size to use
     47   // for laying out popups.
     48   NSRect testingScreenFrame_;
     49 
     50   // The duration of the popup animation, in the number of seconds.
     51   NSTimeInterval popupAnimationDuration_;
     52 
     53   // Set of notification IDs for those popups to be updated when all existing
     54   // animations end.
     55   std::set<std::string> pendingUpdateNotificationIDs_;
     56 
     57   // Set of notification IDs for those popups to be closed when all existing
     58   // animations end.
     59   std::set<std::string> pendingRemoveNotificationIDs_;
     60 
     61   // Set of notification IDs for those popups that are being animated due to
     62   // showing, bounds change or closing.
     63   std::set<std::string> animatingNotificationIDs_;
     64 
     65   // For testing only. If set, the callback will be called when the animation
     66   // ends.
     67   base::mac::ScopedBlock<message_center::AnimationEndedCallback>
     68       testingAnimationEndedCallback_;
     69 }
     70 
     71 // Designated initializer that construct an instance to observe |messageCenter|.
     72 - (id)initWithMessageCenter:(message_center::MessageCenter*)messageCenter;
     73 
     74 // Returns true if an animation is being played.
     75 - (BOOL)isAnimating;
     76 
     77 // Returns the duration of the popup animation.
     78 - (NSTimeInterval)popupAnimationDuration;
     79 
     80 // Called when the animation of a popup ends.
     81 - (void)onPopupAnimationEnded:(const std::string&)notificationID;
     82 
     83 @end
     84 
     85 @interface MCPopupCollection (ExposedForTesting)
     86 - (NSArray*)popups;
     87 
     88 // Setter for the testingScreenFrame_.
     89 - (void)setScreenFrame:(NSRect)frame;
     90 
     91 // Setter for changing the animation duration. The testing code could set it
     92 // to a very small value to expedite the test running.
     93 - (void)setAnimationDuration:(NSTimeInterval)duration;
     94 
     95 // Setter for testingAnimationEndedCallback_. The testing code could set it
     96 // to get called back when the animation ends.
     97 - (void)setAnimationEndedCallback:
     98     (message_center::AnimationEndedCallback)callback;
     99 @end
    100 
    101 #endif  // UI_MESSAGE_CENTER_COCOA_POPUP_COLLECTION_H_
    102