1// Copyright (c) 2012 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#include "base/mac/scoped_nsobject.h"
8#include "base/memory/weak_ptr.h"
9
10@protocol InfoBarContainerControllerBase;
11class InfoBarCocoa;
12class InfoBarService;
13@class InfoBarGradientView;
14
15namespace infobars {
16class InfoBarDelegate;
17}
18
19// A controller for an infobar in the browser window.  There is one
20// controller per infobar view.  The base InfoBarController is able to
21// draw an icon, a text message, and a close button.  Subclasses can
22// override addAdditionalControls to customize the UI.
23@interface InfoBarController : NSViewController<NSTextViewDelegate> {
24 @private
25  id<InfoBarContainerControllerBase> containerController_;  // weak, owns us
26  base::WeakPtr<InfoBarCocoa> infobar_;
27
28 @protected
29  IBOutlet InfoBarGradientView* infoBarView_;
30  IBOutlet NSImageView* image_;
31  IBOutlet NSTextField* labelPlaceholder_;
32  IBOutlet NSButton* okButton_;
33  IBOutlet NSButton* cancelButton_;
34  IBOutlet NSButton* closeButton_;
35
36  // Text fields don't work as well with embedded links as text views, but
37  // text views cannot conveniently be created in IB. The xib file contains
38  // a text field |labelPlaceholder_| that's replaced by this text view |label_|
39  // in -awakeFromNib.
40  base::scoped_nsobject<NSTextView> label_;
41}
42
43@property(nonatomic, assign)
44    id<InfoBarContainerControllerBase> containerController;
45@property(nonatomic, readonly) infobars::InfoBarDelegate* delegate;
46@property(nonatomic, readonly) InfoBarCocoa* infobar;
47
48// Initializes a new InfoBarController and takes a WeakPtr to |infobar|.
49- (id)initWithInfoBar:(InfoBarCocoa*)infobar;
50
51// Returns YES if the infobar is owned.  If this is NO, it is not safe to call
52// any delegate functions, since they might attempt to access the owner.  Code
53// should generally just do nothing at all in this case (once we're closing, all
54// controls can safely just go dead).
55- (BOOL)isOwned;
56
57// Called when someone clicks on the OK or Cancel buttons.  Subclasses
58// must override if they do not hide the buttons.
59- (void)ok:(id)sender;
60- (void)cancel:(id)sender;
61
62// Called when someone clicks on the close button.  Dismisses the infobar
63// without taking any action.
64// NOTE: Subclasses should not call this to close the infobar as it will lead to
65// errors in stat counting.  Call -removeSelf instead.
66- (IBAction)dismiss:(id)sender;
67
68// Asks the container controller to remove the infobar for this delegate.  This
69// call will trigger a notification that starts the infobar animating closed.
70- (void)removeSelf;
71
72// Subclasses can override this method to add additional controls to
73// the infobar view.  This method is called by awakeFromNib.  The
74// default implementation does nothing.
75- (void)addAdditionalControls;
76
77// Subclasses must override this method to perform cleanup just before the
78// infobar hides.
79- (void)infobarWillHide;
80
81// Subclasses must override this method to perform cleanup just before the
82// infobar closes.
83- (void)infobarWillClose;
84
85// Removes the OK and Cancel buttons and resizes the textfield to use the
86// space.
87- (void)removeButtons;
88
89// Updates the view's arrow position.
90- (void)layoutArrow;
91
92@end
93
94@interface InfoBarController (Protected)
95// Disables the provided menu.  Subclasses should call this for each popup menu
96// in -infobarWillClose.
97- (void)disablePopUpMenu:(NSMenu*)menu;
98@end
99
100/////////////////////////////////////////////////////////////////////////
101// InfoBarController subclasses, one for each InfoBarDelegate
102// subclass.  Each of these subclasses overrides addAdditionalControls to
103// configure its view as necessary.
104