| Index: chrome/browser/autofill/autofill_dialog_controller_mac.mm
|
| ===================================================================
|
| --- chrome/browser/autofill/autofill_dialog_controller_mac.mm (revision 0)
|
| +++ chrome/browser/autofill/autofill_dialog_controller_mac.mm (revision 0)
|
| @@ -0,0 +1,162 @@
|
| +// Copyright (c) 2010 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/autofill/autofill_dialog_controller_mac.h"
|
| +#include "base/mac_util.h"
|
| +#import "chrome/browser/autofill/autofill_address_model_mac.h"
|
| +#import "chrome/browser/autofill/autofill_address_view_controller_mac.h"
|
| +#import "chrome/browser/autofill/autofill_credit_card_model_mac.h"
|
| +#import "chrome/browser/autofill/autofill_credit_card_view_controller_mac.h"
|
| +#import "chrome/browser/cocoa/disclosure_view_controller.h"
|
| +#import "chrome/browser/cocoa/section_separator_view.h"
|
| +#include "chrome/browser/profile.h"
|
| +
|
| +@interface AutoFillDialogController (PrivateMethods)
|
| +- (void)runModalDialog;
|
| +- (void)installChildViews;
|
| +@end
|
| +
|
| +@implementation AutoFillDialogController
|
| +
|
| ++ (void)showAutoFillDialogWithObserver:(AutoFillDialogObserver*)observer
|
| + autoFillProfiles:(const std::vector<AutoFillProfile*>&)profiles
|
| + creditCards:(const std::vector<CreditCard*>&)creditCards {
|
| + AutoFillDialogController* controller =
|
| + [AutoFillDialogController controllerWithObserver:observer
|
| + autoFillProfiles:profiles
|
| + creditCards:creditCards];
|
| +
|
| + // Only run modal dialog if it is not already being shown.
|
| + if (![controller isWindowLoaded]) {
|
| + [controller runModalDialog];
|
| + }
|
| +}
|
| +
|
| +- (void)awakeFromNib {
|
| + [addressSectionBox_ setShowTopLine:FALSE];
|
| + [self installChildViews];
|
| +}
|
| +
|
| +// NSWindow Delegate callback. When the window closes the controller can
|
| +// be released.
|
| +- (void)windowWillClose:(NSNotification *)notification {
|
| + [self autorelease];
|
| +}
|
| +
|
| +
|
| +// Called when the user clicks the save button.
|
| +- (IBAction)save:(id)sender {
|
| + if (observer_) {
|
| + [addressFormViewController_ copyModelToProfile:&profiles_[0]];
|
| + [creditCardFormViewController_ copyModelToCreditCard:&creditCards_[0]];
|
| + observer_->OnAutoFillDialogApply(&profiles_, &creditCards_);
|
| + }
|
| + [self closeDialog];
|
| +}
|
| +
|
| +// Called when the user clicks the cancel button. All we need to do is stop
|
| +// the modal session.
|
| +- (IBAction)cancel:(id)sender {
|
| + [self closeDialog];
|
| +}
|
| +
|
| +@end
|
| +
|
| +@implementation AutoFillDialogController (ExposedForUnitTests)
|
| +
|
| ++ (AutoFillDialogController*)controllerWithObserver:
|
| + (AutoFillDialogObserver*)observer
|
| + autoFillProfiles:(const std::vector<AutoFillProfile*>&)profiles
|
| + creditCards:(const std::vector<CreditCard*>&)creditCards {
|
| +
|
| + // Deallocation is done upon window close. See |windowWillClose:|.
|
| + AutoFillDialogController* controller =
|
| + [[self alloc] initWithObserver:observer
|
| + autoFillProfiles:profiles
|
| + creditCards:creditCards];
|
| + return controller;
|
| +}
|
| +
|
| +
|
| +// This is the designated initializer for this class.
|
| +// |profiles| are non-retained immutable list of autofill profiles.
|
| +// |creditCards| are non-retained immutable list of credit card info.
|
| +- (id)initWithObserver:(AutoFillDialogObserver*)observer
|
| + autoFillProfiles:(const std::vector<AutoFillProfile*>&)profiles
|
| + creditCards:(const std::vector<CreditCard*>&)creditCards {
|
| + // Use initWithWindowNibPath: instead of initWithWindowNibName: so we
|
| + // can override it in a unit test.
|
| + NSString* nibpath = [mac_util::MainAppBundle()
|
| + pathForResource:@"AutoFillDialog"
|
| + ofType:@"nib"];
|
| + if ((self = [super initWithWindowNibPath:nibpath owner:self])) {
|
| + observer_ = observer;
|
| +
|
| + // Make local copy of |profiles|.
|
| + std::vector<AutoFillProfile*>::const_iterator i;
|
| + for (i = profiles.begin(); i != profiles.end(); ++i)
|
| + profiles_.push_back(**i);
|
| +
|
| + // Make local copy of |creditCards|.
|
| + std::vector<CreditCard*>::const_iterator j;
|
| + for (j = creditCards.begin(); j != creditCards.end(); ++j)
|
| + creditCards_.push_back(**j);
|
| + }
|
| + return self;
|
| +}
|
| +
|
| +// Close the dialog.
|
| +- (void)closeDialog {
|
| + [[self window] close];
|
| + [NSApp stopModal];
|
| +}
|
| +
|
| +- (AutoFillAddressViewController*)addressFormViewController {
|
| + return addressFormViewController_.get();
|
| +}
|
| +
|
| +- (AutoFillCreditCardViewController*)creditCardFormViewController {
|
| + return creditCardFormViewController_.get();
|
| +}
|
| +
|
| +@end
|
| +
|
| +@implementation AutoFillDialogController (PrivateMethods)
|
| +
|
| +// Run application modal.
|
| +- (void)runModalDialog {
|
| + [NSApp runModalForWindow:[self window]];
|
| +}
|
| +
|
| +// Install controller and views for the address form and the credit card form.
|
| +// They are installed into the appropriate sibling order so that they can be
|
| +// arranged vertically by the VerticalLayoutView class. We insert the views
|
| +// into the |childView_| but we hold onto the controllers and release them in
|
| +// our dealloc once the dialog closes.
|
| +- (void)installChildViews {
|
| + if (profiles_.size() > 0) {
|
| + AutoFillAddressViewController* autoFillAddressViewController =
|
| + [[AutoFillAddressViewController alloc] initWithProfile:profiles_[0]];
|
| + addressFormViewController_.reset(autoFillAddressViewController);
|
| +
|
| + // Embed the child view into our (owned by us) target view.
|
| + [childView_ addSubview:[addressFormViewController_ view]
|
| + positioned:NSWindowBelow relativeTo:addressSection_];
|
| + [[addressFormViewController_ view] setFrameOrigin:NSMakePoint(0, 0)];
|
| + }
|
| +
|
| + if (creditCards_.size() > 0) {
|
| + AutoFillCreditCardViewController* autoFillCreditCardViewController =
|
| + [[AutoFillCreditCardViewController alloc]
|
| + initWithCreditCard:creditCards_[0]];
|
| + creditCardFormViewController_.reset(autoFillCreditCardViewController);
|
| +
|
| + // Embed the child view into our (owned by us) target view.
|
| + [childView_ addSubview:[creditCardFormViewController_ view]
|
| + positioned:NSWindowBelow relativeTo:creditCardSection_];
|
| + [[creditCardFormViewController_ view] setFrameOrigin:NSMakePoint(0, 0)];
|
| + }
|
| +}
|
| +
|
| +@end
|
|
|