blob: e6319c345646bcb3e684d20e8fef6999d8acc6be [file] [log] [blame]
// Copyright 2015 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/passwords/credentials_selection_view_cocoa.h"
#include <stddef.h>
#import "chrome/browser/ui/cocoa/bubble_combobox.h"
#include "chrome/browser/ui/cocoa/chrome_style.h"
#import "chrome/browser/ui/cocoa/passwords/passwords_bubble_utils.h"
#include "chrome/browser/ui/passwords/manage_passwords_bubble_model.h"
#include "ui/base/models/simple_combobox_model.h"
namespace {
NSPopUpButton* CreateUsernamesPopUpButton(
const std::vector<autofill::PasswordForm>& forms,
const base::string16& best_matched_username) {
DCHECK(!forms.empty());
std::vector<base::string16> usernames;
size_t best_matched_username_index = forms.size();
size_t preffered_form_index = forms.size();
for (size_t index = 0; index < forms.size(); ++index) {
usernames.push_back(forms[index].username_value);
if (forms[index].username_value == best_matched_username) {
best_matched_username_index = index;
}
if (forms[index].preferred) {
preffered_form_index = index;
}
}
ui::SimpleComboboxModel model(usernames);
base::scoped_nsobject<NSPopUpButton> button([[BubbleCombobox alloc]
initWithFrame:NSZeroRect
pullsDown:NO
model:&model]);
[button setFont:LabelFont()];
if (best_matched_username_index < forms.size()) {
[button selectItemAtIndex:best_matched_username_index];
} else if (preffered_form_index < forms.size()) {
[button selectItemAtIndex:preffered_form_index];
} else {
[button selectItemAtIndex:0];
}
[button sizeToFit];
return button.autorelease();
}
} // namespace
@implementation CredentialsSelectionView
- (id)initWithModel:(ManagePasswordsBubbleModel*)model {
if ((self = [super init])) {
model_ = model;
// Create the pop up button with usernames and the password field.
usernamePopUpButton_.reset([CreateUsernamesPopUpButton(
model_->local_credentials(), model_->pending_password().username_value)
retain]);
passwordField_.reset(
[PasswordLabel(model_->pending_password().password_value) retain]);
// Calculate desired widths of username and password.
CGFloat firstWidth = NSMaxX([usernamePopUpButton_ frame]);
CGFloat secondWidth = NSMaxX([passwordField_ frame]);
std::pair<CGFloat, CGFloat> sizes = GetResizedColumns(
kDesiredRowWidth, std::make_pair(firstWidth, secondWidth));
CGFloat curX = 0;
CGFloat curY = 0;
[usernamePopUpButton_
setFrameSize:NSMakeSize(sizes.first,
NSHeight([usernamePopUpButton_ frame]))];
[self addSubview:usernamePopUpButton_];
[passwordField_ setFrameSize:NSMakeSize(sizes.second,
NSHeight([passwordField_ frame]))];
[self addSubview:passwordField_];
// Calculate username and password positions. The element with bigger height
// will have Y coordinate equal to curY, another one will have Y coordinate
// equals to curY + half of their heights difference.
CGFloat popUpLabelHeightDifference =
NSHeight([usernamePopUpButton_ frame]) -
NSHeight([passwordField_ frame]);
CGFloat usernameY = std::max(curY, curY - popUpLabelHeightDifference / 2);
CGFloat passwordY = std::max(curY, curY + popUpLabelHeightDifference / 2);
[usernamePopUpButton_ setFrameOrigin:NSMakePoint(curX, usernameY)];
// Move to the right of the username and add the password.
curX = NSMaxX([usernamePopUpButton_ frame]) + kItemLabelSpacing;
[passwordField_ setFrameOrigin:NSMakePoint(curX, passwordY)];
// Move to the top-right of the password.
curY = std::max(NSMaxY([passwordField_ frame]),
NSMaxY([usernamePopUpButton_ frame]));
// Update the frame.
[self setFrameSize:NSMakeSize(kDesiredRowWidth, curY)];
}
return self;
}
- (const autofill::PasswordForm*)getSelectedCredentials {
int selected_index = [usernamePopUpButton_ indexOfSelectedItem];
CHECK(selected_index >= 0);
return &model_->local_credentials()[selected_index];
}
@end