1// Copyright (c) 2011 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#import <Cocoa/Cocoa.h> 6 7#import "base/mac/cocoa_protocols.h" 8#include "base/memory/scoped_nsobject.h" 9 10@class AnimatableView; 11@class HoverCloseButton; 12@protocol InfoBarContainer; 13class InfoBarDelegate; 14@class InfoBarGradientView; 15 16// A controller for an infobar in the browser window. There is one 17// controller per infobar view. The base InfoBarController is able to 18// draw an icon, a text message, and a close button. Subclasses can 19// override addAdditionalControls to customize the UI. 20@interface InfoBarController : NSViewController<NSTextViewDelegate> { 21 @private 22 id<InfoBarContainer> containerController_; // weak, owns us 23 BOOL infoBarClosing_; 24 25 @protected 26 IBOutlet InfoBarGradientView* infoBarView_; 27 IBOutlet NSImageView* image_; 28 IBOutlet NSTextField* labelPlaceholder_; 29 IBOutlet NSButton* okButton_; 30 IBOutlet NSButton* cancelButton_; 31 IBOutlet HoverCloseButton* closeButton_; 32 33 // In rare instances, it can be possible for |delegate_| to delete itself 34 // while this controller is still alive. Always check |delegate_| against 35 // NULL before using it. 36 InfoBarDelegate* delegate_; // weak, can be NULL 37 38 // Text fields don't work as well with embedded links as text views, but 39 // text views cannot conveniently be created in IB. The xib file contains 40 // a text field |labelPlaceholder_| that's replaced by this text view |label_| 41 // in -awakeFromNib. 42 scoped_nsobject<NSTextView> label_; 43}; 44 45// Initializes a new InfoBarController. 46- (id)initWithDelegate:(InfoBarDelegate*)delegate; 47 48// Called when someone clicks on the OK or Cancel buttons. Subclasses 49// must override if they do not hide the buttons. 50- (void)ok:(id)sender; 51- (void)cancel:(id)sender; 52 53// Called when someone clicks on the close button. Dismisses the 54// infobar without taking any action. 55- (IBAction)dismiss:(id)sender; 56 57// Returns a pointer to this controller's view, cast as an AnimatableView. 58- (AnimatableView*)animatableView; 59 60// Open or animate open the infobar. 61- (void)open; 62- (void)animateOpen; 63 64// Close or animate close the infobar. 65- (void)close; 66- (void)animateClosed; 67 68// Subclasses can override this method to add additional controls to 69// the infobar view. This method is called by awakeFromNib. The 70// default implementation does nothing. 71- (void)addAdditionalControls; 72 73// Subclasses must override this method to perform cleanup just before the 74// infobar closes. 75- (void)infobarWillClose; 76 77// Sets the info bar message to the specified |message|. 78- (void)setLabelToMessage:(NSString*)message; 79 80// Removes the OK and Cancel buttons and resizes the textfield to use the 81// space. 82- (void)removeButtons; 83 84@property(nonatomic, assign) id<InfoBarContainer> containerController; 85@property(nonatomic, readonly) InfoBarDelegate* delegate; 86 87@end 88 89///////////////////////////////////////////////////////////////////////// 90// InfoBarController subclasses, one for each InfoBarDelegate 91// subclass. Each of these subclasses overrides addAdditionalControls to 92// configure its view as necessary. 93 94@interface LinkInfoBarController : InfoBarController 95// Called when there is a click on the link in the infobar. 96- (void)linkClicked; 97@end 98 99 100@interface ConfirmInfoBarController : InfoBarController 101// Called when the OK and Cancel buttons are clicked. 102- (IBAction)ok:(id)sender; 103- (IBAction)cancel:(id)sender; 104// Called when there is a click on the link in the infobar. 105- (void)linkClicked; 106@end 107