| OLD | NEW |
| (Empty) |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #import "chrome/browser/ui/cocoa/passwords/manage_credential_item_view_controlle
r.h" | |
| 6 | |
| 7 #include <algorithm> | |
| 8 | |
| 9 #include "base/i18n/rtl.h" | |
| 10 #include "chrome/browser/ui/chrome_style.h" | |
| 11 #import "chrome/browser/ui/cocoa/passwords/credential_item_view.h" | |
| 12 #include "chrome/browser/ui/passwords/manage_passwords_bubble_model.h" | |
| 13 #include "components/password_manager/core/common/password_manager_ui.h" | |
| 14 #include "grit/components_strings.h" | |
| 15 #include "grit/generated_resources.h" | |
| 16 #include "skia/ext/skia_utils_mac.h" | |
| 17 #import "ui/base/cocoa/controls/hyperlink_button_cell.h" | |
| 18 #import "ui/base/cocoa/hover_image_button.h" | |
| 19 #include "ui/base/l10n/l10n_util.h" | |
| 20 #include "ui/base/resource/resource_bundle.h" | |
| 21 #include "ui/gfx/image/image.h" | |
| 22 #include "ui/resources/grit/ui_resources.h" | |
| 23 | |
| 24 namespace { | |
| 25 | |
| 26 // Horizontal space betweeen subviews of a credential item. | |
| 27 const CGFloat kItemSubviewsHorizontalSpacing = 20.0f; | |
| 28 | |
| 29 // Lays out |leftSubview| and |rightSubview| within |item| so that they stick | |
| 30 // to the left and right sides of |item|, respectively, and resizes |item| to | |
| 31 // hold them. Flipped in RTL. | |
| 32 void LayOutItem(NSView* item, NSView* leftSubview, NSView* rightSubview) { | |
| 33 const CGFloat width = NSWidth([leftSubview frame]) + | |
| 34 kItemSubviewsHorizontalSpacing + | |
| 35 NSWidth([rightSubview frame]); | |
| 36 const CGFloat height = | |
| 37 std::max(NSHeight([leftSubview frame]), NSHeight([rightSubview frame])); | |
| 38 [item setFrameSize:NSMakeSize(width, height)]; | |
| 39 [leftSubview | |
| 40 setFrameOrigin:NSMakePoint(base::i18n::IsRTL() | |
| 41 ? width - NSWidth([leftSubview frame]) | |
| 42 : 0, | |
| 43 0)]; | |
| 44 [rightSubview | |
| 45 setFrameOrigin:NSMakePoint( | |
| 46 base::i18n::IsRTL() | |
| 47 ? 0 | |
| 48 : width - NSWidth([rightSubview frame]), | |
| 49 (height - NSHeight([rightSubview frame])) / 2.0f)]; | |
| 50 [leftSubview setAutoresizingMask:NSViewWidthSizable | | |
| 51 (base::i18n::IsRTL() ? NSViewMinXMargin | |
| 52 : NSViewMaxXMargin)]; | |
| 53 [rightSubview setAutoresizingMask:(base::i18n::IsRTL() ? NSViewMaxXMargin | |
| 54 : NSViewMinXMargin)]; | |
| 55 } | |
| 56 } // namespace | |
| 57 | |
| 58 @implementation ManageCredentialItemView : NSView | |
| 59 | |
| 60 - (id)initWithPasswordForm:(const autofill::PasswordForm&)passwordForm | |
| 61 delegate:(id<CredentialItemDelegate>)delegate | |
| 62 target:(id)target | |
| 63 action:(SEL)action { | |
| 64 if ((self = [super initWithFrame:NSZeroRect])) { | |
| 65 | |
| 66 // ---------------------------------------------- | |
| 67 // | | John Q. Facebooker | | | |
| 68 // | icon | john@somewhere.com | X | | |
| 69 // | | | | | |
| 70 // ---------------------------------------------- | |
| 71 | |
| 72 // Create the views. | |
| 73 credentialItem_.reset([[CredentialItemView alloc] | |
| 74 initWithPasswordForm:passwordForm | |
| 75 credentialType:password_manager::CredentialType:: | |
| 76 CREDENTIAL_TYPE_PASSWORD | |
| 77 style:password_manager_mac::CredentialItemStyle:: | |
| 78 ACCOUNT_CHOOSER | |
| 79 delegate:delegate]); | |
| 80 [self addSubview:credentialItem_]; | |
| 81 | |
| 82 deleteButton_.reset([[HoverImageButton alloc] | |
| 83 initWithFrame:NSMakeRect(0, 0, chrome_style::GetCloseButtonSize(), | |
| 84 chrome_style::GetCloseButtonSize())]); | |
| 85 [deleteButton_ setBordered:NO]; | |
| 86 [[deleteButton_ cell] setHighlightsBy:NSNoCellMask]; | |
| 87 ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance(); | |
| 88 [deleteButton_ | |
| 89 setDefaultImage:bundle.GetNativeImageNamed(IDR_CLOSE_2).ToNSImage()]; | |
| 90 [deleteButton_ | |
| 91 setHoverImage:bundle.GetNativeImageNamed(IDR_CLOSE_2_H).ToNSImage()]; | |
| 92 [deleteButton_ | |
| 93 setPressedImage:bundle.GetNativeImageNamed(IDR_CLOSE_2_P).ToNSImage()]; | |
| 94 [deleteButton_ setTarget:target]; | |
| 95 [deleteButton_ setAction:action]; | |
| 96 [self addSubview:deleteButton_]; | |
| 97 | |
| 98 LayOutItem(self, credentialItem_, deleteButton_); | |
| 99 } | |
| 100 return self; | |
| 101 } | |
| 102 | |
| 103 @end | |
| 104 | |
| 105 @implementation DeletedCredentialItemView : NSView | |
| 106 - (id)initWithTarget:(id)target action:(SEL)action { | |
| 107 if ((self = [super initWithFrame:NSZeroRect])) { | |
| 108 | |
| 109 // ---------------------------------------------- | |
| 110 // | Such-and-such has been deleted. [Undo] | |
| 111 // ---------------------------------------------- | |
| 112 | |
| 113 // Create the views. | |
| 114 base::scoped_nsobject<NSTextField> explanationLabel( | |
| 115 [[NSTextField alloc] initWithFrame:NSZeroRect]); | |
| 116 [explanationLabel | |
| 117 setStringValue:l10n_util::GetNSString(IDS_MANAGE_PASSWORDS_DELETED)]; | |
| 118 NSFont* font = ResourceBundle::GetSharedInstance() | |
| 119 .GetFontList(ResourceBundle::SmallFont) | |
| 120 .GetPrimaryFont() | |
| 121 .GetNativeFont(); | |
| 122 [explanationLabel setFont:font]; | |
| 123 [explanationLabel setEditable:NO]; | |
| 124 [explanationLabel setSelectable:NO]; | |
| 125 [explanationLabel setDrawsBackground:NO]; | |
| 126 [explanationLabel setBezeled:NO]; | |
| 127 [explanationLabel sizeToFit]; | |
| 128 [self addSubview:explanationLabel]; | |
| 129 | |
| 130 undoButton_.reset([[NSButton alloc] initWithFrame:NSZeroRect]); | |
| 131 base::scoped_nsobject<HyperlinkButtonCell> cell([[HyperlinkButtonCell alloc] | |
| 132 initTextCell:l10n_util::GetNSString(IDS_MANAGE_PASSWORDS_UNDO)]); | |
| 133 [cell setControlSize:NSSmallControlSize]; | |
| 134 [cell setShouldUnderline:NO]; | |
| 135 [cell setUnderlineOnHover:NO]; | |
| 136 [cell setTextColor:gfx::SkColorToCalibratedNSColor( | |
| 137 chrome_style::GetLinkColor())]; | |
| 138 [undoButton_ setCell:cell.get()]; | |
| 139 [undoButton_ sizeToFit]; | |
| 140 [undoButton_ setTarget:target]; | |
| 141 [undoButton_ setAction:action]; | |
| 142 [self addSubview:undoButton_]; | |
| 143 | |
| 144 LayOutItem(self, explanationLabel, undoButton_); | |
| 145 } | |
| 146 return self; | |
| 147 } | |
| 148 | |
| 149 @end | |
| 150 | |
| 151 @interface ManageCredentialItemViewController() | |
| 152 - (void)deleteCredential:(id)sender; | |
| 153 - (void)undoDelete:(id)sender; | |
| 154 @end | |
| 155 | |
| 156 @implementation ManageCredentialItemViewController | |
| 157 - (id)initWithPasswordForm:(const autofill::PasswordForm&)passwordForm | |
| 158 model:(ManagePasswordsBubbleModel*)model | |
| 159 delegate:(id<CredentialItemDelegate>)delegate { | |
| 160 if ((self = [super initWithNibName:nil bundle:nil])) { | |
| 161 passwordForm_ = passwordForm; | |
| 162 model_ = model; | |
| 163 delegate_ = delegate; | |
| 164 [self changeToManageView]; | |
| 165 } | |
| 166 return self; | |
| 167 } | |
| 168 | |
| 169 - (void)performLayout { | |
| 170 [self view].subviews = @[ contentView_ ]; | |
| 171 [[self view] setFrameSize:[contentView_ frame].size]; | |
| 172 [contentView_ setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable]; | |
| 173 } | |
| 174 | |
| 175 - (void)loadView { | |
| 176 [self setView:[[[NSView alloc] initWithFrame:NSZeroRect] autorelease]]; | |
| 177 [self performLayout]; | |
| 178 } | |
| 179 | |
| 180 - (void)deleteCredential:(id)sender { | |
| 181 model_->OnPasswordAction(passwordForm_, | |
| 182 ManagePasswordsBubbleModel::REMOVE_PASSWORD); | |
| 183 [self changeToDeletedView]; | |
| 184 [self performLayout]; | |
| 185 } | |
| 186 | |
| 187 - (void)undoDelete:(id)sender { | |
| 188 model_->OnPasswordAction(passwordForm_, | |
| 189 ManagePasswordsBubbleModel::ADD_PASSWORD); | |
| 190 [self changeToManageView]; | |
| 191 [self performLayout]; | |
| 192 } | |
| 193 | |
| 194 - (void)changeToManageView { | |
| 195 contentView_.reset([[ManageCredentialItemView alloc] | |
| 196 initWithPasswordForm:passwordForm_ | |
| 197 delegate:delegate_ | |
| 198 target:self | |
| 199 action:@selector(deleteCredential:)]); | |
| 200 } | |
| 201 | |
| 202 - (void)changeToDeletedView { | |
| 203 contentView_.reset([[DeletedCredentialItemView alloc] | |
| 204 initWithTarget:self | |
| 205 action:@selector(undoDelete:)]); | |
| 206 } | |
| 207 @end | |
| 208 | |
| 209 @implementation ManageCredentialItemViewController (Testing) | |
| 210 | |
| 211 - (const autofill::PasswordForm&)passwordForm { | |
| 212 return passwordForm_; | |
| 213 } | |
| 214 | |
| 215 - (NSView*)contentView { | |
| 216 return contentView_.get(); | |
| 217 } | |
| 218 | |
| 219 @end | |
| OLD | NEW |