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.
5 #import <Cocoa/Cocoa.h>
7 #include "base/mac/scoped_nsobject.h"
8 #include "base/memory/weak_ptr.h"
10 @protocol InfoBarContainerControllerBase
;
13 @
class InfoBarGradientView
;
16 class InfoBarDelegate
;
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
> {
25 id
<InfoBarContainerControllerBase
> containerController_
; // weak, owns us
26 base::WeakPtr
<InfoBarCocoa
> infobar_
;
29 IBOutlet InfoBarGradientView
* infoBarView_
;
30 IBOutlet NSImageView
* image_
;
31 IBOutlet NSTextField
* labelPlaceholder_
;
32 IBOutlet NSButton
* okButton_
;
33 IBOutlet NSButton
* cancelButton_
;
34 IBOutlet NSButton
* closeButton_
;
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_|
40 base::scoped_nsobject
<NSTextView
> label_
;
43 @
property(nonatomic
, assign
)
44 id
<InfoBarContainerControllerBase
> containerController
;
45 @
property(nonatomic
, readonly
) infobars::InfoBarDelegate
* delegate
;
46 @
property(nonatomic
, readonly
) InfoBarCocoa
* infobar
;
48 // Initializes a new InfoBarController and takes a WeakPtr to |infobar|.
49 - (id
)initWithInfoBar
:(InfoBarCocoa
*)infobar
;
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).
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
;
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
;
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.
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
;
77 // Subclasses must override this method to perform cleanup just before the
79 - (void)infobarWillHide
;
81 // Subclasses must override this method to perform cleanup just before the
83 - (void)infobarWillClose
;
85 // Removes the OK and Cancel buttons and resizes the textfield to use the
87 - (void)removeButtons
;
89 // Updates the view's arrow position.
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
;
100 /////////////////////////////////////////////////////////////////////////
101 // InfoBarController subclasses, one for each InfoBarDelegate
102 // subclass. Each of these subclasses overrides addAdditionalControls to
103 // configure its view as necessary.