• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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