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