| Index: chrome/browser/ui/cocoa/profile_signin_confirmation_view_controller.mm
|
| diff --git a/chrome/browser/ui/cocoa/profile_signin_confirmation_view_controller.mm b/chrome/browser/ui/cocoa/profile_signin_confirmation_view_controller.mm
|
| deleted file mode 100644
|
| index 4decf84f208fdafd43c7603ac997ea52c1f52e4c..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/ui/cocoa/profile_signin_confirmation_view_controller.mm
|
| +++ /dev/null
|
| @@ -1,446 +0,0 @@
|
| -// Copyright 2013 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/profile_signin_confirmation_view_controller.h"
|
| -
|
| -#include <algorithm>
|
| -#include <cmath>
|
| -
|
| -#include "base/callback_helpers.h"
|
| -#include "base/mac/bundle_locations.h"
|
| -#include "base/strings/sys_string_conversions.h"
|
| -#include "base/strings/utf_string_conversions.h"
|
| -#include "chrome/browser/ui/browser_finder.h"
|
| -#include "chrome/browser/ui/browser_navigator.h"
|
| -#import "chrome/browser/ui/chrome_style.h"
|
| -#import "chrome/browser/ui/cocoa/constrained_window/constrained_window_control_utils.h"
|
| -#import "chrome/browser/ui/cocoa/hover_close_button.h"
|
| -#import "chrome/browser/ui/cocoa/hyperlink_text_view.h"
|
| -#include "chrome/browser/ui/host_desktop.h"
|
| -#include "chrome/browser/ui/sync/profile_signin_confirmation_helper.h"
|
| -#include "chrome/common/url_constants.h"
|
| -#include "google_apis/gaia/gaia_auth_util.h"
|
| -#include "grit/chromium_strings.h"
|
| -#include "grit/generated_resources.h"
|
| -#include "skia/ext/skia_utils_mac.h"
|
| -#import "third_party/google_toolbox_for_mac/src/AppKit/GTMUILocalizerAndLayoutTweaker.h"
|
| -#import "ui/base/cocoa/controls/hyperlink_button_cell.h"
|
| -#include "ui/base/l10n/l10n_util.h"
|
| -
|
| -namespace {
|
| -
|
| -const CGFloat kWindowMinWidth = 500;
|
| -const CGFloat kButtonGap = 6;
|
| -const CGFloat kDialogAlertBarBorderWidth = 1;
|
| -
|
| -// Determine the frame required to fit the content of a string. Uses the
|
| -// provided height and width as preferred dimensions, where a value of
|
| -// 0.0 indicates no preference.
|
| -NSRect ComputeFrame(NSAttributedString* text, CGFloat width, CGFloat height) {
|
| - NSRect frame =
|
| - [text boundingRectWithSize:NSMakeSize(width, height)
|
| - options:NSStringDrawingUsesLineFragmentOrigin];
|
| - // boundingRectWithSize is known to underestimate the width.
|
| - static const CGFloat kTextViewPadding = 10;
|
| - frame.size.width += kTextViewPadding;
|
| - return frame;
|
| -}
|
| -
|
| -// Make the indicated range of characters in a text view bold.
|
| -void MakeTextBold(NSTextField* textField, int offset, int length) {
|
| - base::scoped_nsobject<NSMutableAttributedString> text(
|
| - [[textField attributedStringValue] mutableCopy]);
|
| - NSFont* currentFont =
|
| - [text attribute:NSFontAttributeName
|
| - atIndex:offset
|
| - effectiveRange:NULL];
|
| - NSFontManager* fontManager = [NSFontManager sharedFontManager];
|
| - NSFont* boldFont = [fontManager convertFont:currentFont
|
| - toHaveTrait:NSBoldFontMask];
|
| - [text beginEditing];
|
| - [text addAttribute:NSFontAttributeName
|
| - value:boldFont
|
| - range:NSMakeRange(offset, length)];
|
| - [text endEditing];
|
| - [textField setAttributedStringValue:text];
|
| -}
|
| -
|
| -// Remove underlining from the specified range of characters in a text view.
|
| -void RemoveUnderlining(NSTextView* textView, int offset, int length) {
|
| - // Clear the default link attributes that were set by the
|
| - // HyperlinkTextView, otherwise removing the underline doesn't matter.
|
| - [textView setLinkTextAttributes:nil];
|
| - NSTextStorage* text = [textView textStorage];
|
| - NSRange range = NSMakeRange(offset, length);
|
| - [text addAttribute:NSUnderlineStyleAttributeName
|
| - value:[NSNumber numberWithInt:NSUnderlineStyleNone]
|
| - range:range];
|
| -}
|
| -
|
| -// Create a new NSTextView and add it to the specified parent.
|
| -NSTextView* AddTextView(
|
| - NSView* parent,
|
| - id<NSTextViewDelegate> delegate,
|
| - const base::string16& message,
|
| - const base::string16& link,
|
| - int offset,
|
| - const ui::ResourceBundle::FontStyle& font_style) {
|
| - base::scoped_nsobject<HyperlinkTextView> textView(
|
| - [[HyperlinkTextView alloc] initWithFrame:NSZeroRect]);
|
| - NSFont* font = ui::ResourceBundle::GetSharedInstance().GetFont(
|
| - font_style).GetNativeFont();
|
| - NSColor* linkColor = gfx::SkColorToCalibratedNSColor(
|
| - chrome_style::GetLinkColor());
|
| - [textView setMessageAndLink:base::SysUTF16ToNSString(message)
|
| - withLink:base::SysUTF16ToNSString(link)
|
| - atOffset:offset
|
| - font:font
|
| - messageColor:[NSColor blackColor]
|
| - linkColor:linkColor];
|
| - RemoveUnderlining(textView, offset, link.size());
|
| - [textView setDelegate:delegate];
|
| - [parent addSubview:textView];
|
| - return textView.autorelease();
|
| -}
|
| -
|
| -// Create a new NSTextField and add it to the specified parent.
|
| -NSTextField* AddTextField(
|
| - NSView* parent,
|
| - const base::string16& message,
|
| - const ui::ResourceBundle::FontStyle& font_style) {
|
| - NSTextField* textField = constrained_window::CreateLabel();
|
| - [textField setAttributedStringValue:
|
| - constrained_window::GetAttributedLabelString(
|
| - SysUTF16ToNSString(message),
|
| - font_style,
|
| - NSNaturalTextAlignment,
|
| - NSLineBreakByWordWrapping)];
|
| - [parent addSubview:textField];
|
| - return textField;
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -@interface ProfileSigninConfirmationViewController ()
|
| -- (void)learnMore;
|
| -- (void)addButton:(NSButton*)button
|
| - withTitle:(int)resourceID
|
| - target:(id)target
|
| - action:(SEL)action
|
| - shouldAutoSize:(BOOL)shouldAutoSize;
|
| -@end
|
| -
|
| -@implementation ProfileSigninConfirmationViewController
|
| -
|
| -- (id)initWithBrowser:(Browser*)browser
|
| - username:(const std::string&)username
|
| - delegate:(ui::ProfileSigninConfirmationDelegate*)delegate
|
| - closeDialogCallback:(const base::Closure&)closeDialogCallback
|
| - offerProfileCreation:(bool)offer {
|
| - if ((self = [super initWithNibName:nil bundle:nil])) {
|
| - browser_ = browser;
|
| - username_ = username;
|
| - delegate_ = delegate;
|
| - closeDialogCallback_ = closeDialogCallback;
|
| - offerProfileCreation_ = offer;
|
| - }
|
| - return self;
|
| -}
|
| -
|
| -- (void)loadView {
|
| - self.view = [[[NSView alloc] initWithFrame:NSZeroRect] autorelease];
|
| - cancelButton_.reset(
|
| - [[ConstrainedWindowButton alloc] initWithFrame:NSZeroRect]);
|
| - okButton_.reset(
|
| - [[ConstrainedWindowButton alloc] initWithFrame:NSZeroRect]);
|
| - if (offerProfileCreation_) {
|
| - createProfileButton_.reset(
|
| - [[ConstrainedWindowButton alloc] initWithFrame:NSZeroRect]);
|
| - }
|
| - promptBox_.reset(
|
| - [[NSBox alloc] initWithFrame:NSZeroRect]);
|
| - closeButton_.reset(
|
| - [[WebUIHoverCloseButton alloc] initWithFrame:NSZeroRect]);
|
| -
|
| - // -------------------------------
|
| - // | Title x |
|
| - // |-----------------------------| (1 px border)
|
| - // | Prompt (box) |
|
| - // |-----------------------------| (1 px border)
|
| - // | Explanation |
|
| - // | |
|
| - // | [create] [cancel] [ok] |
|
| - // -------------------------------
|
| -
|
| - // The width of the dialog should be sufficient to fit the buttons on
|
| - // one line and the title and the close button on one line, but not
|
| - // smaller than kWindowMinWidth. Therefore we first layout the title
|
| - // and the buttons and then compute the necessary width.
|
| -
|
| - // OK button.
|
| - [self addButton:okButton_
|
| - withTitle:IDS_ENTERPRISE_SIGNIN_CONTINUE_NEW_STYLE
|
| - target:self
|
| - action:@selector(ok:)
|
| - shouldAutoSize:YES];
|
| -
|
| - // Cancel button.
|
| - [self addButton:cancelButton_
|
| - withTitle:IDS_ENTERPRISE_SIGNIN_CANCEL
|
| - target:self
|
| - action:@selector(cancel:)
|
| - shouldAutoSize:YES];
|
| -
|
| - // Add the close button.
|
| - [self addButton:closeButton_
|
| - withTitle:0
|
| - target:self
|
| - action:@selector(close:)
|
| - shouldAutoSize:NO];
|
| - NSRect closeButtonFrame = [closeButton_ frame];
|
| - closeButtonFrame.size.width = chrome_style::GetCloseButtonSize();
|
| - closeButtonFrame.size.height = chrome_style::GetCloseButtonSize();
|
| - [closeButton_ setFrame:closeButtonFrame];
|
| -
|
| - // Create Profile link.
|
| - if (offerProfileCreation_) {
|
| - [self addButton:createProfileButton_
|
| - withTitle:IDS_ENTERPRISE_SIGNIN_CREATE_NEW_PROFILE_NEW_STYLE
|
| - target:self
|
| - action:@selector(createProfile:)
|
| - shouldAutoSize:YES];
|
| - }
|
| -
|
| - // Add the title label.
|
| - titleField_.reset(
|
| - [AddTextField([self view],
|
| - l10n_util::GetStringUTF16(
|
| - IDS_ENTERPRISE_SIGNIN_TITLE_NEW_STYLE),
|
| - chrome_style::kTitleFontStyle) retain]);
|
| - [titleField_ setFrame:ComputeFrame(
|
| - [titleField_ attributedStringValue], 0.0, 0.0)];
|
| -
|
| - // Compute the dialog width using the title and buttons.
|
| - const CGFloat buttonsWidth =
|
| - (offerProfileCreation_ ? NSWidth([createProfileButton_ frame]) : 0) +
|
| - kButtonGap + NSWidth([cancelButton_ frame]) +
|
| - kButtonGap + NSWidth([okButton_ frame]);
|
| - const CGFloat titleWidth =
|
| - NSWidth([titleField_ frame]) + NSWidth([closeButton_ frame]);
|
| - // Dialog minimum width must include the padding.
|
| - const CGFloat minWidth =
|
| - kWindowMinWidth - 2 * chrome_style::kHorizontalPadding;
|
| - const CGFloat width = std::max(minWidth,
|
| - std::max(buttonsWidth, titleWidth));
|
| - const CGFloat dialogWidth = width + 2 * chrome_style::kHorizontalPadding;
|
| -
|
| - // Now setup the prompt and explanation text using the computed width.
|
| -
|
| - // Prompt box.
|
| - [promptBox_ setBorderColor:gfx::SkColorToCalibratedNSColor(
|
| - ui::GetSigninConfirmationPromptBarColor(
|
| - ui::kSigninConfirmationPromptBarBorderAlpha))];
|
| - [promptBox_ setBorderWidth:kDialogAlertBarBorderWidth];
|
| - [promptBox_ setFillColor:gfx::SkColorToCalibratedNSColor(
|
| - ui::GetSigninConfirmationPromptBarColor(
|
| - ui::kSigninConfirmationPromptBarBackgroundAlpha))];
|
| - [promptBox_ setBoxType:NSBoxCustom];
|
| - [promptBox_ setTitlePosition:NSNoTitle];
|
| - [[self view] addSubview:promptBox_];
|
| -
|
| - // Prompt text.
|
| - size_t offset;
|
| - const base::string16 domain =
|
| - base::ASCIIToUTF16(gaia::ExtractDomainName(username_));
|
| - const base::string16 username = base::ASCIIToUTF16(username_);
|
| - const base::string16 prompt_text =
|
| - l10n_util::GetStringFUTF16(
|
| - IDS_ENTERPRISE_SIGNIN_ALERT_NEW_STYLE,
|
| - domain, &offset);
|
| - promptField_.reset(
|
| - [AddTextField(promptBox_, prompt_text, chrome_style::kTextFontStyle)
|
| - retain]);
|
| - MakeTextBold(promptField_, offset, domain.size());
|
| - [promptField_ setFrame:ComputeFrame(
|
| - [promptField_ attributedStringValue], width, 0.0)];
|
| -
|
| - // Set the height of the prompt box from the prompt text, padding, and border.
|
| - CGFloat boxHeight =
|
| - kDialogAlertBarBorderWidth +
|
| - chrome_style::kRowPadding +
|
| - NSHeight([promptField_ frame]) +
|
| - chrome_style::kRowPadding +
|
| - kDialogAlertBarBorderWidth;
|
| - [promptBox_ setFrame:NSMakeRect(0, 0, dialogWidth, boxHeight)];
|
| -
|
| - // Explanation text.
|
| - std::vector<size_t> offsets;
|
| - const base::string16 learn_more_text =
|
| - l10n_util::GetStringUTF16(
|
| - IDS_ENTERPRISE_SIGNIN_PROFILE_LINK_LEARN_MORE);
|
| - const base::string16 explanation_text =
|
| - l10n_util::GetStringFUTF16(
|
| - offerProfileCreation_ ?
|
| - IDS_ENTERPRISE_SIGNIN_EXPLANATION_WITH_PROFILE_CREATION_NEW_STYLE :
|
| - IDS_ENTERPRISE_SIGNIN_EXPLANATION_WITHOUT_PROFILE_CREATION_NEW_STYLE,
|
| - username, learn_more_text, &offsets);
|
| - // HyperlinkTextView requires manually inserting the link text
|
| - // into the middle of the message text. To do this we slice out
|
| - // the "learn more" string from the message so that it can be
|
| - // inserted again.
|
| - const base::string16 explanation_message_text =
|
| - explanation_text.substr(0, offsets[1]) +
|
| - explanation_text.substr(offsets[1] + learn_more_text.size());
|
| - explanationField_.reset(
|
| - [AddTextView([self view], self, explanation_message_text, learn_more_text,
|
| - offsets[1], chrome_style::kTextFontStyle) retain]);
|
| -
|
| - [explanationField_ setFrame:ComputeFrame(
|
| - [explanationField_ attributedString], width, 0.0)];
|
| -
|
| - // Layout the elements, starting at the bottom and moving up.
|
| -
|
| - CGFloat curX = dialogWidth - chrome_style::kHorizontalPadding;
|
| - CGFloat curY = chrome_style::kClientBottomPadding;
|
| -
|
| - // Buttons should go |Cancel|Continue|CreateProfile|, unless
|
| - // |CreateProfile| isn't shown.
|
| - if (offerProfileCreation_) {
|
| - curX -= NSWidth([createProfileButton_ frame]);
|
| - [createProfileButton_ setFrameOrigin:NSMakePoint(curX, curY)];
|
| - curX -= kButtonGap;
|
| - }
|
| - curX -= NSWidth([okButton_ frame]);
|
| - [okButton_ setFrameOrigin:NSMakePoint(curX, curY)];
|
| - curX -= (kButtonGap + NSWidth([cancelButton_ frame]));
|
| - [cancelButton_ setFrameOrigin:NSMakePoint(curX, curY)];
|
| -
|
| - curY += NSHeight([cancelButton_ frame]);
|
| -
|
| - // Explanation text.
|
| - curY += chrome_style::kRowPadding;
|
| - [explanationField_
|
| - setFrameOrigin:NSMakePoint(chrome_style::kHorizontalPadding, curY)];
|
| - curY += NSHeight([explanationField_ frame]);
|
| -
|
| - // Prompt box goes all the way to the edges.
|
| - curX = 0;
|
| - curY += chrome_style::kRowPadding;
|
| - [promptBox_ setFrameOrigin:NSMakePoint(curX, curY)];
|
| - curY += NSHeight([promptBox_ frame]);
|
| -
|
| - // Prompt label fits in the middle of the box.
|
| - NSRect boxClientFrame = [[promptBox_ contentView] bounds];
|
| - CGFloat boxHorizontalMargin =
|
| - roundf((dialogWidth - NSWidth(boxClientFrame)) / 2);
|
| - CGFloat boxVerticalMargin =
|
| - roundf((boxHeight - NSHeight(boxClientFrame)) / 2);
|
| - [promptField_ setFrameOrigin:NSMakePoint(
|
| - chrome_style::kHorizontalPadding - boxHorizontalMargin,
|
| - chrome_style::kRowPadding - boxVerticalMargin)];
|
| -
|
| - // Title goes at the top.
|
| - curY += chrome_style::kRowPadding;
|
| - [titleField_
|
| - setFrameOrigin:NSMakePoint(chrome_style::kHorizontalPadding, curY)];
|
| - curY += NSHeight([titleField_ frame]);
|
| -
|
| - // Find the height required to fit everything with the necessary padding.
|
| - CGFloat dialogHeight = curY + chrome_style::kTitleTopPadding;
|
| -
|
| - // Update the dialog frame with the computed dimensions.
|
| - [[self view] setFrame:NSMakeRect(0, 0, dialogWidth, dialogHeight)];
|
| -
|
| - // Close button goes in the top-right corner.
|
| - NSPoint closeOrigin = NSMakePoint(
|
| - dialogWidth - chrome_style::kCloseButtonPadding -
|
| - NSWidth(closeButtonFrame),
|
| - dialogHeight - chrome_style::kCloseButtonPadding -
|
| - NSWidth(closeButtonFrame));
|
| - [closeButton_ setFrameOrigin:closeOrigin];
|
| -}
|
| -
|
| -- (IBAction)cancel:(id)sender {
|
| - if (delegate_) {
|
| - delegate_->OnCancelSignin();
|
| - delegate_ = NULL;
|
| - closeDialogCallback_.Run();
|
| - }
|
| -}
|
| -
|
| -- (IBAction)ok:(id)sender {
|
| - if (delegate_) {
|
| - delegate_->OnContinueSignin();
|
| - delegate_ = NULL;
|
| - closeDialogCallback_.Run();
|
| - }
|
| -}
|
| -
|
| -- (IBAction)close:(id)sender {
|
| - if (delegate_) {
|
| - delegate_->OnCancelSignin();
|
| - delegate_ = NULL;
|
| - }
|
| - closeDialogCallback_.Run();
|
| -}
|
| -
|
| -- (IBAction)createProfile:(id)sender {
|
| - if (delegate_) {
|
| - delegate_->OnSigninWithNewProfile();
|
| - delegate_ = NULL;
|
| - closeDialogCallback_.Run();
|
| - }
|
| -}
|
| -
|
| -- (void)learnMore {
|
| - chrome::NavigateParams params(
|
| - browser_, GURL(chrome::kChromeEnterpriseSignInLearnMoreURL),
|
| - content::PAGE_TRANSITION_AUTO_TOPLEVEL);
|
| - params.disposition = NEW_POPUP;
|
| - params.window_action = chrome::NavigateParams::SHOW_WINDOW;
|
| - chrome::Navigate(¶ms);
|
| -}
|
| -
|
| -- (BOOL)textView:(NSTextView*)textView
|
| - clickedOnLink:(id)link
|
| - atIndex:(NSUInteger)charIndex {
|
| - if (textView == explanationField_.get()) {
|
| - [self learnMore];
|
| - return YES;
|
| - }
|
| - return NO;
|
| -}
|
| -
|
| -- (void)addButton:(NSButton*)button
|
| - withTitle:(int)resourceID
|
| - target:(id)target
|
| - action:(SEL)action
|
| - shouldAutoSize:(BOOL)shouldAutoSize {
|
| - if (resourceID)
|
| - [button setTitle:base::SysUTF16ToNSString(
|
| - l10n_util::GetStringUTF16(resourceID))];
|
| - [button setTarget:target];
|
| - [button setAction:action];
|
| - [[self view] addSubview:button];
|
| - if (shouldAutoSize)
|
| - [GTMUILocalizerAndLayoutTweaker sizeToFitView:button];
|
| -}
|
| -
|
| -@end
|
| -
|
| -@implementation ProfileSigninConfirmationViewController (TestingAPI)
|
| -
|
| -- (ui::ProfileSigninConfirmationDelegate*)delegate {
|
| - return delegate_;
|
| -}
|
| -
|
| -- (NSButton*)createProfileButton {
|
| - return createProfileButton_.get();
|
| -}
|
| -
|
| -- (NSTextView*)explanationField {
|
| - return explanationField_.get();
|
| -}
|
| -
|
| -@end
|
|
|