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_TRAY_VIEW_CONTROLLER_H_
6#define UI_MESSAGE_CENTER_COCOA_TRAY_VIEW_CONTROLLER_H_
7
8#import <Cocoa/Cocoa.h>
9
10#include <list>
11#include <map>
12#include <string>
13
14#include "base/mac/scoped_block.h"
15#import "base/mac/scoped_nsobject.h"
16#include "base/strings/string16.h"
17#include "ui/message_center/message_center_export.h"
18
19@class HoverImageButton;
20@class MCNotificationController;
21@class MCSettingsController;
22
23namespace message_center {
24class MessageCenter;
25}
26
27@class HoverImageButton;
28@class MCClipView;
29
30namespace message_center {
31typedef void(^TrayAnimationEndedCallback)();
32}
33
34// The view controller responsible for the content of the message center tray
35// UI. This hosts a scroll view of all the notifications, as well as buttons
36// to enter quiet mode and the settings panel.
37MESSAGE_CENTER_EXPORT
38@interface MCTrayViewController : NSViewController<NSAnimationDelegate> {
39 @private
40  // Controller of the notifications, where action messages are forwarded. Weak.
41  message_center::MessageCenter* messageCenter_;
42
43  // The back button shown while the settings are open.
44  base::scoped_nsobject<HoverImageButton> backButton_;
45
46  // The "Notifications" label at the top.
47  base::scoped_nsobject<NSTextField> title_;
48
49  // The 1px horizontal divider between the scroll view and the title bar.
50  base::scoped_nsobject<NSBox> divider_;
51
52  // The "Nothing to see here" label in an empty message center.
53  base::scoped_nsobject<NSTextField> emptyDescription_;
54
55  // The scroll view that contains all the notifications in its documentView.
56  base::scoped_nsobject<NSScrollView> scrollView_;
57
58  // The clip view that manages how scrollView_'s documentView is clipped.
59  base::scoped_nsobject<MCClipView> clipView_;
60
61  // Array of MCNotificationController objects, which the array owns.
62  base::scoped_nsobject<NSMutableArray> notifications_;
63
64  // Map of notification IDs to weak pointers of the view controllers in
65  // |notifications_|.
66  std::map<std::string, MCNotificationController*> notificationsMap_;
67
68  // The pause button that enters quiet mode.
69  base::scoped_nsobject<HoverImageButton> pauseButton_;
70
71  // The clear all notifications button. Hidden when there are no notifications.
72  base::scoped_nsobject<HoverImageButton> clearAllButton_;
73
74  // The settings button that shows the settings UI.
75  base::scoped_nsobject<HoverImageButton> settingsButton_;
76
77  // Array of MCNotificationController objects pending removal by the user.
78  // The object is owned by the array.
79  base::scoped_nsobject<NSMutableArray> notificationsPendingRemoval_;
80
81  // Used to animate multiple notifications simultaneously when they're being
82  // removed or repositioned.
83  base::scoped_nsobject<NSViewAnimation> animation_;
84
85  // The controller of the settings view. Only set while the view is open.
86  base::scoped_nsobject<MCSettingsController> settingsController_;
87
88  // The flag which is set when the notification removal animation is still
89  // in progress and the user clicks "Clear All" button. The clear-all animation
90  // will be delayed till the existing animation completes.
91  BOOL clearAllDelayed_;
92
93  // The flag which is set when the clear-all animation is in progress.
94  BOOL clearAllInProgress_;
95
96  // List of weak pointers of the view controllers that are visible in the
97  // scroll view and waiting to slide off one by one when the user clicks
98  // "Clear All" button.
99  std::list<MCNotificationController*> visibleNotificationsPendingClear_;
100
101  // Array of NSViewAnimation objects, which the array owns.
102  base::scoped_nsobject<NSMutableArray> clearAllAnimations_;
103
104  // The duration of the bounds animation, in the number of seconds.
105  NSTimeInterval animationDuration_;
106
107  // The delay to start animating clearing next notification, in the number of
108  // seconds.
109  NSTimeInterval animateClearingNextNotificationDelay_;
110
111  // For testing only. If set, the callback will be called when the animation
112  // ends.
113  base::mac::ScopedBlock<message_center::TrayAnimationEndedCallback>
114      testingAnimationEndedCallback_;
115}
116
117// The title that is displayed at the top of the message center tray.
118@property(copy, nonatomic) NSString* trayTitle;
119
120// Designated initializer.
121- (id)initWithMessageCenter:(message_center::MessageCenter*)messageCenter;
122
123// Called when the window is being closed.
124- (void)onWindowClosing;
125
126// Callback for when the MessageCenter model changes.
127- (void)onMessageCenterTrayChanged;
128
129// Action for the quiet mode button.
130- (void)toggleQuietMode:(id)sender;
131
132// Action for the clear all button.
133- (void)clearAllNotifications:(id)sender;
134
135// Action for the settings button.
136- (void)showSettings:(id)sender;
137
138// Updates the settings dialog in response to contents change due to something
139// like selecting a different profile.
140- (void)updateSettings;
141
142// Hides the settings dialog if it's open.
143- (void)showMessages:(id)sender;
144
145// Cleans up settings data structures.  Called when messages are shown and when
146// closing the center directly from the settings.
147- (void)cleanupSettings;
148
149// Scroll to the topmost notification in the tray.
150- (void)scrollToTop;
151
152// Returns true if an animation is being played.
153- (BOOL)isAnimating;
154
155// Returns the maximum height of the client area of the notifications tray.
156+ (CGFloat)maxTrayClientHeight;
157
158// Returns the width of the notifications tray.
159+ (CGFloat)trayWidth;
160
161@end
162
163// Testing API /////////////////////////////////////////////////////////////////
164
165@interface MCTrayViewController (TestingAPI)
166- (NSBox*)divider;
167- (NSTextField*)emptyDescription;
168- (NSScrollView*)scrollView;
169- (HoverImageButton*)pauseButton;
170- (HoverImageButton*)clearAllButton;
171
172// Setter for changing the animation duration. The testing code could set it
173// to a very small value to expedite the test running.
174- (void)setAnimationDuration:(NSTimeInterval)duration;
175
176// Setter for changing the clear-all animation delay. The testing code could set
177// it to a very small value to expedite the test running.
178- (void)setAnimateClearingNextNotificationDelay:(NSTimeInterval)delay;
179
180// Setter for testingAnimationEndedCallback_. The testing code could set it
181// to get called back when the animation ends.
182- (void)setAnimationEndedCallback:
183    (message_center::TrayAnimationEndedCallback)callback;
184@end
185
186#endif  // UI_MESSAGE_CENTER_COCOA_TRAY_VIEW_CONTROLLER_H_
187