root/chrome/browser/ui/cocoa/infobars/infobar_controller.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


// Copyright (c) 2012 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.

#import <Cocoa/Cocoa.h>

#include "base/mac/scoped_nsobject.h"
#include "base/memory/weak_ptr.h"

@protocol InfoBarContainerControllerBase;
class InfoBarCocoa;
class InfoBarDelegate;
class InfoBarService;
@class InfoBarGradientView;

// A controller for an infobar in the browser window.  There is one
// controller per infobar view.  The base InfoBarController is able to
// draw an icon, a text message, and a close button.  Subclasses can
// override addAdditionalControls to customize the UI.
@interface InfoBarController : NSViewController<NSTextViewDelegate> {
 @private
  id<InfoBarContainerControllerBase> containerController_;  // weak, owns us
  base::WeakPtr<InfoBarCocoa> infobar_;

 @protected
  IBOutlet InfoBarGradientView* infoBarView_;
  IBOutlet NSImageView* image_;
  IBOutlet NSTextField* labelPlaceholder_;
  IBOutlet NSButton* okButton_;
  IBOutlet NSButton* cancelButton_;
  IBOutlet NSButton* closeButton_;

  // Text fields don't work as well with embedded links as text views, but
  // text views cannot conveniently be created in IB. The xib file contains
  // a text field |labelPlaceholder_| that's replaced by this text view |label_|
  // in -awakeFromNib.
  base::scoped_nsobject<NSTextView> label_;
}

@property(nonatomic, assign)
    id<InfoBarContainerControllerBase> containerController;
@property(nonatomic, readonly) InfoBarDelegate* delegate;
@property(nonatomic, readonly) InfoBarCocoa* infobar;

// Initializes a new InfoBarController and takes a WeakPtr to |infobar|.
- (id)initWithInfoBar:(InfoBarCocoa*)infobar;

// Returns YES if the infobar is owned.  If this is NO, it is not safe to call
// any delegate functions, since they might attempt to access the owner.  Code
// should generally just do nothing at all in this case (once we're closing, all
// controls can safely just go dead).
- (BOOL)isOwned;

// Called when someone clicks on the OK or Cancel buttons.  Subclasses
// must override if they do not hide the buttons.
- (void)ok:(id)sender;
- (void)cancel:(id)sender;

// Called when someone clicks on the close button.  Dismisses the infobar
// without taking any action.
// NOTE: Subclasses should not call this to close the infobar as it will lead to
// errors in stat counting.  Call -removeSelf instead.
- (IBAction)dismiss:(id)sender;

// Asks the container controller to remove the infobar for this delegate.  This
// call will trigger a notification that starts the infobar animating closed.
- (void)removeSelf;

// Subclasses can override this method to add additional controls to
// the infobar view.  This method is called by awakeFromNib.  The
// default implementation does nothing.
- (void)addAdditionalControls;

// Subclasses must override this method to perform cleanup just before the
// infobar hides.
- (void)infobarWillHide;

// Subclasses must override this method to perform cleanup just before the
// infobar closes.
- (void)infobarWillClose;

// Removes the OK and Cancel buttons and resizes the textfield to use the
// space.
- (void)removeButtons;

// Updates the view's arrow position.
- (void)layoutArrow;

@end

@interface InfoBarController (Protected)
// Disables the provided menu.  Subclasses should call this for each popup menu
// in -infobarWillClose.
- (void)disablePopUpMenu:(NSMenu*)menu;
@end

/////////////////////////////////////////////////////////////////////////
// InfoBarController subclasses, one for each InfoBarDelegate
// subclass.  Each of these subclasses overrides addAdditionalControls to
// configure its view as necessary.

/* [<][>][^][v][top][bottom][index][help] */