blob: f645b79f4b6198bfe3bdded36bde70cbb5e9b5b6 [file] [log] [blame]
// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_UI_COCOA_INFOBARS_INFOBAR_CONTAINER_CONTROLLER_H_
#define CHROME_BROWSER_UI_COCOA_INFOBARS_INFOBAR_CONTAINER_CONTROLLER_H_
#import <Cocoa/Cocoa.h>
#include "base/mac/scoped_nsobject.h"
#include "base/memory/scoped_ptr.h"
#import "chrome/browser/ui/cocoa/view_resizer.h"
#include "content/public/browser/notification_registrar.h"
@class BrowserWindowController;
@class InfoBarController;
class InfoBar;
class InfoBarDelegate;
class InfoBarNotificationObserver;
class TabStripModel;
namespace content {
class WebContents;
}
// Protocol for basic container methods, as needed by an InfoBarController.
// This protocol exists to make mocking easier in unittests.
@protocol InfoBarContainer
- (void)willRemoveController:(InfoBarController*)controller;
- (void)removeController:(InfoBarController*)controller;
- (BrowserWindowController*)browserWindowController;
@end
namespace infobars {
// The height of an infobar without the tip.
const CGFloat kBaseHeight = 36.0;
// The height of the infobar tip.
const CGFloat kTipHeight = 12.0;
}; // namespace infobars
// Controller for the infobar container view, which is the superview
// of all the infobar views. This class owns zero or more
// InfoBarControllers, which manage the infobar views. This class
// also receives tab strip model notifications and handles
// adding/removing infobars when needed.
@interface InfoBarContainerController : NSViewController <ViewResizer,
InfoBarContainer> {
@private
// Needed to send resize messages when infobars are added or removed.
id<ViewResizer> resizeDelegate_; // weak
// The WebContents we are currently showing infobars for.
content::WebContents* currentWebContents_; // weak
// Holds the InfoBarControllers currently owned by this container.
base::scoped_nsobject<NSMutableArray> infobarControllers_;
// Holds InfoBarControllers when they are in the process of animating out.
base::scoped_nsobject<NSMutableSet> closingInfoBars_;
// Lets us registers for INFOBAR_ADDED/INFOBAR_REMOVED
// notifications. The actual notifications are sent to the
// InfoBarNotificationObserver object, which proxies them back to us.
content::NotificationRegistrar registrar_;
scoped_ptr<InfoBarNotificationObserver> infoBarObserver_;
// If YES then the first info bar doesn't draw a tip.
BOOL shouldSuppressTopInfoBarTip_;
}
@property(nonatomic, assign) BOOL shouldSuppressTopInfoBarTip;
- (id)initWithResizeDelegate:(id<ViewResizer>)resizeDelegate;
// Informs the container that the |controller| is going to close. It adds the
// controller to |closingInfoBars_|. Once the animation is complete, the
// controller calls |-removeController:| to finalize cleanup.
- (void)willRemoveController:(InfoBarController*)controller;
// Removes |controller| from the list of controllers in this container and
// removes its view from the view hierarchy. This method is safe to call while
// |controller| is still on the call stack.
- (void)removeController:(InfoBarController*)controller;
// Modifies this container to display infobars for the given
// |contents|. Registers for INFOBAR_ADDED and INFOBAR_REMOVED
// notifications for |contents|. If we are currently showing any
// infobars, removes them first and deregisters for any
// notifications. |contents| can be NULL, in which case no infobars
// are shown and no notifications are registered for.
- (void)changeWebContents:(content::WebContents*)contents;
// Stripped down version of TabStripModelObserverBridge:tabDetachedWithContents.
// Forwarded by BWC. Removes all infobars and deregisters for any notifications
// if |contents| is the current tab contents.
- (void)tabDetachedWithContents:(content::WebContents*)contents;
// Returns the number of active infobars. This is
// |infobarControllers_ - closingInfoBars_|.
- (NSUInteger)infobarCount;
// Returns the amount of additional height the container view needs to draw the
// anti-spoofing tip. This will return 0 if |-infobarCount| is 0. This is the
// total amount of overlap for all infobars.
- (CGFloat)overlappingTipHeight;
@end
@interface InfoBarContainerController (ForTheObserverAndTesting)
// Adds the given infobar. Takes ownership of |infobar|.
- (void)addInfoBar:(InfoBar*)infobar animate:(BOOL)animate;
// Closes all the infobar views for a given delegate, either immediately or by
// starting a close animation.
- (void)closeInfoBarsForDelegate:(InfoBarDelegate*)delegate
animate:(BOOL)animate;
// Positions the infobar views in the container view and notifies
// |browser_controller_| that it needs to resize the container view.
- (void)positionInfoBarsAndRedraw;
@end
@interface InfoBarContainerController (JustForTesting)
// Removes all infobar views. Infobars which were already closing will be
// completely closed (i.e. the InfoBarDelegate will be deleted and we'll get a
// callback to removeController). Other infobars will simply stop animating and
// disappear. Callers must call positionInfoBarsAndRedraw() after calling this
// method.
- (void)removeAllInfoBars;
@end
#endif // CHROME_BROWSER_UI_COCOA_INFOBARS_INFOBAR_CONTAINER_CONTROLLER_H_