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_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 
     23 namespace message_center {
     24 class MessageCenter;
     25 }
     26 
     27 @class HoverImageButton;
     28 @class MCClipView;
     29 
     30 namespace message_center {
     31 typedef 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.
     37 MESSAGE_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