Skip to content

Commit

Permalink
cocoa/infobars: Split infobar_controller.* into smaller parts.
Browse files Browse the repository at this point in the history
BUG=164772
R=pkasting@chromium.org,sail@chromium.org
TBR=ben@chromium.org # for file additions to gyp files

Review URL: https://codereview.chromium.org/11773025

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@175516 0039d316-1c4b-4281-b951-d872f2087c98
  • Loading branch information
tfarina@chromium.org committed Jan 8, 2013
1 parent 38c524b commit 1e4187b
Show file tree
Hide file tree
Showing 10 changed files with 256 additions and 213 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
// Copyright 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.

#ifndef CHROME_BROWSER_UI_COCOA_INFOBARS_ALTERNATE_NAV_INFOBAR_CONTROLLER_H_
#define CHROME_BROWSER_UI_COCOA_INFOBARS_ALTERNATE_NAV_INFOBAR_CONTROLLER_H_

#import "chrome/browser/ui/cocoa/infobars/infobar_controller.h"

@interface AlternateNavInfoBarController : InfoBarController
// Called when there is a click on the link in the infobar.
- (void)linkClicked;
@end

#endif // CHROME_BROWSER_UI_COCOA_INFOBARS_ALTERNATE_NAV_INFOBAR_CONTROLLER_H_
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
// Copyright 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 "chrome/browser/ui/cocoa/infobars/alternate_nav_infobar_controller.h"

#include "base/logging.h"
#include "base/sys_string_conversions.h"
#include "chrome/browser/infobars/alternate_nav_infobar_delegate.h"
#import "chrome/browser/ui/cocoa/hyperlink_text_view.h"
#include "chrome/browser/ui/cocoa/event_utils.h"
#include "chrome/browser/ui/cocoa/infobars/infobar.h"
#include "webkit/glue/window_open_disposition.h"

@implementation AlternateNavInfoBarController

// Link infobars have a text message, of which part is linkified. We
// use an NSAttributedString to display styled text, and we set a
// NSLink attribute on the hyperlink portion of the message. Infobars
// use a custom NSTextField subclass, which allows us to override
// textView:clickedOnLink:atIndex: and intercept clicks.
//
- (void)addAdditionalControls {
// No buttons.
[self removeButtons];

AlternateNavInfoBarDelegate* delegate =
delegate_->AsAlternateNavInfoBarDelegate();
DCHECK(delegate);
size_t offset = string16::npos;
string16 message = delegate->GetMessageTextWithOffset(&offset);
string16 link = delegate->GetLinkText();
NSFont* font = [NSFont labelFontOfSize:
[NSFont systemFontSizeForControlSize:NSRegularControlSize]];
HyperlinkTextView* view = (HyperlinkTextView*)label_.get();
[view setMessageAndLink:base::SysUTF16ToNSString(message)
withLink:base::SysUTF16ToNSString(link)
atOffset:offset
font:font
messageColor:[NSColor blackColor]
linkColor:[NSColor blueColor]];
}

// Called when someone clicks on the link in the infobar. This method
// is called by the InfobarTextField on its delegate (the
// AlternateNavInfoBarController).
- (void)linkClicked {
if (![self isOwned])
return;
WindowOpenDisposition disposition =
event_utils::WindowOpenDispositionFromNSEvent([NSApp currentEvent]);
if (delegate_->AsAlternateNavInfoBarDelegate()->LinkClicked(disposition))
[self removeSelf];
}

@end

InfoBar* AlternateNavInfoBarDelegate::CreateInfoBar(InfoBarService* owner) {
AlternateNavInfoBarController* controller =
[[AlternateNavInfoBarController alloc] initWithDelegate:this owner:owner];
return new InfoBar(controller, this);
}
18 changes: 18 additions & 0 deletions chrome/browser/ui/cocoa/infobars/confirm_infobar_controller.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
// Copyright 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.

#ifndef CHROME_BROWSER_UI_COCOA_INFOBARS_CONFIRM_INFOBAR_CONTROLLER_H_
#define CHROME_BROWSER_UI_COCOA_INFOBARS_CONFIRM_INFOBAR_CONTROLLER_H_

#import "chrome/browser/ui/cocoa/infobars/infobar_controller.h"

@interface ConfirmInfoBarController : InfoBarController
// Called when the OK and Cancel buttons are clicked.
- (IBAction)ok:(id)sender;
- (IBAction)cancel:(id)sender;
// Called when there is a click on the link in the infobar.
- (void)linkClicked;
@end

#endif // CHROME_BROWSER_UI_COCOA_INFOBARS_CONFIRM_INFOBAR_CONTROLLER_H_
143 changes: 143 additions & 0 deletions chrome/browser/ui/cocoa/infobars/confirm_infobar_controller.mm
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
// Copyright 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.

#include "chrome/browser/ui/cocoa/infobars/confirm_infobar_controller.h"

#include "base/logging.h"
#include "base/sys_string_conversions.h"
#include "chrome/browser/api/infobars/confirm_infobar_delegate.h"
#import "chrome/browser/ui/cocoa/hyperlink_text_view.h"
#include "chrome/browser/ui/cocoa/event_utils.h"
#include "chrome/browser/ui/cocoa/infobars/infobar.h"
#include "third_party/GTM/AppKit/GTMUILocalizerAndLayoutTweaker.h"
#include "webkit/glue/window_open_disposition.h"

@implementation ConfirmInfoBarController

// Called when someone clicks on the "OK" button.
- (IBAction)ok:(id)sender {
if (![self isOwned])
return;
if (delegate_->AsConfirmInfoBarDelegate()->Accept())
[self removeSelf];
}

// Called when someone clicks on the "Cancel" button.
- (IBAction)cancel:(id)sender {
if (![self isOwned])
return;
if (delegate_->AsConfirmInfoBarDelegate()->Cancel())
[self removeSelf];
}

// Confirm infobars can have OK and/or cancel buttons, depending on
// the return value of GetButtons(). We create each button if
// required and position them to the left of the close button.
- (void)addAdditionalControls {
ConfirmInfoBarDelegate* delegate = delegate_->AsConfirmInfoBarDelegate();
DCHECK(delegate);
int visibleButtons = delegate->GetButtons();

NSRect okButtonFrame = [okButton_ frame];
NSRect cancelButtonFrame = [cancelButton_ frame];

DCHECK(NSMaxX(cancelButtonFrame) < NSMinX(okButtonFrame))
<< "Ok button expected to be on the right of the Cancel button in nib";

CGFloat rightEdge = NSMaxX(okButtonFrame);
CGFloat spaceBetweenButtons =
NSMinX(okButtonFrame) - NSMaxX(cancelButtonFrame);
CGFloat spaceBeforeButtons =
NSMinX(cancelButtonFrame) - NSMaxX([label_.get() frame]);

// Update and position the OK button if needed. Otherwise, hide it.
if (visibleButtons & ConfirmInfoBarDelegate::BUTTON_OK) {
[okButton_ setTitle:base::SysUTF16ToNSString(
delegate->GetButtonLabel(ConfirmInfoBarDelegate::BUTTON_OK))];
[GTMUILocalizerAndLayoutTweaker sizeToFitView:okButton_];
okButtonFrame = [okButton_ frame];

// Position the ok button to the left of the Close button.
okButtonFrame.origin.x = rightEdge - okButtonFrame.size.width;
[okButton_ setFrame:okButtonFrame];

// Update the rightEdge
rightEdge = NSMinX(okButtonFrame);
} else {
[okButton_ removeFromSuperview];
okButton_ = nil;
}

// Update and position the Cancel button if needed. Otherwise, hide it.
if (visibleButtons & ConfirmInfoBarDelegate::BUTTON_CANCEL) {
[cancelButton_ setTitle:base::SysUTF16ToNSString(
delegate->GetButtonLabel(ConfirmInfoBarDelegate::BUTTON_CANCEL))];
[GTMUILocalizerAndLayoutTweaker sizeToFitView:cancelButton_];
cancelButtonFrame = [cancelButton_ frame];

// If we had a Ok button, leave space between the buttons.
if (visibleButtons & ConfirmInfoBarDelegate::BUTTON_OK) {
rightEdge -= spaceBetweenButtons;
}

// Position the Cancel button on our current right edge.
cancelButtonFrame.origin.x = rightEdge - cancelButtonFrame.size.width;
[cancelButton_ setFrame:cancelButtonFrame];

// Update the rightEdge.
rightEdge = NSMinX(cancelButtonFrame);
} else {
[cancelButton_ removeFromSuperview];
cancelButton_ = nil;
}

// If we had either button, leave space before the edge of the textfield.
if ((visibleButtons & ConfirmInfoBarDelegate::BUTTON_CANCEL) ||
(visibleButtons & ConfirmInfoBarDelegate::BUTTON_OK)) {
rightEdge -= spaceBeforeButtons;
}

NSRect frame = [label_.get() frame];
DCHECK(rightEdge > NSMinX(frame))
<< "Need to make the xib larger to handle buttons with text this long";
frame.size.width = rightEdge - NSMinX(frame);
[label_.get() setFrame:frame];

// Set the text and link.
NSString* message = base::SysUTF16ToNSString(delegate->GetMessageText());
string16 link = delegate->GetLinkText();
if (!link.empty()) {
// Add spacing between the label and the link.
message = [message stringByAppendingString:@" "];
}
NSFont* font = [NSFont labelFontOfSize:
[NSFont systemFontSizeForControlSize:NSRegularControlSize]];
HyperlinkTextView* view = (HyperlinkTextView*)label_.get();
[view setMessageAndLink:message
withLink:base::SysUTF16ToNSString(link)
atOffset:[message length]
font:font
messageColor:[NSColor blackColor]
linkColor:[NSColor blueColor]];
}

// Called when someone clicks on the link in the infobar. This method
// is called by the InfobarTextField on its delegate (the
// AlternateNavInfoBarController).
- (void)linkClicked {
if (![self isOwned])
return;
WindowOpenDisposition disposition =
event_utils::WindowOpenDispositionFromNSEvent([NSApp currentEvent]);
if (delegate_->AsConfirmInfoBarDelegate()->LinkClicked(disposition))
[self removeSelf];
}

@end

InfoBar* ConfirmInfoBarDelegate::CreateInfoBar(InfoBarService* owner) {
ConfirmInfoBarController* controller =
[[ConfirmInfoBarController alloc] initWithDelegate:this owner:owner];
return new InfoBar(controller, this);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#import <Cocoa/Cocoa.h>
#import "chrome/browser/ui/cocoa/infobars/confirm_infobar_controller.h"

#include "base/memory/scoped_nsobject.h"
#include "base/string_util.h"
Expand All @@ -11,7 +11,6 @@
#include "chrome/browser/api/infobars/infobar_service.h"
#include "chrome/browser/ui/cocoa/cocoa_profile_test.h"
#import "chrome/browser/ui/cocoa/infobars/infobar_container_controller.h"
#import "chrome/browser/ui/cocoa/infobars/infobar_controller.h"
#include "chrome/browser/ui/cocoa/infobars/mock_confirm_infobar_delegate.h"
#include "chrome/browser/ui/cocoa/run_loop_testing.h"
#import "content/public/browser/web_contents.h"
Expand Down
11 changes: 0 additions & 11 deletions chrome/browser/ui/cocoa/infobars/infobar_controller.h
Original file line number Diff line number Diff line change
Expand Up @@ -107,16 +107,5 @@ class InfoBarService;
// subclass. Each of these subclasses overrides addAdditionalControls to
// configure its view as necessary.

@interface AlternateNavInfoBarController : InfoBarController
// Called when there is a click on the link in the infobar.
- (void)linkClicked;
@end


@interface ConfirmInfoBarController : InfoBarController
// Called when the OK and Cancel buttons are clicked.
- (IBAction)ok:(id)sender;
- (IBAction)cancel:(id)sender;
// Called when there is a click on the link in the infobar.
- (void)linkClicked;
@end
Loading

0 comments on commit 1e4187b

Please sign in to comment.