Index: chrome/browser/autofill/autofill_dialog_controller_mac.mm |
diff --git a/chrome/browser/autofill/autofill_dialog_controller_mac.mm b/chrome/browser/autofill/autofill_dialog_controller_mac.mm |
deleted file mode 100644 |
index 483f93685286208044c27ea096a47680769e1981..0000000000000000000000000000000000000000 |
--- a/chrome/browser/autofill/autofill_dialog_controller_mac.mm |
+++ /dev/null |
@@ -1,942 +0,0 @@ |
-// Copyright (c) 2011 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 "base/lazy_instance.h" |
-#include "base/mac/mac_util.h" |
-#include "base/sys_string_conversions.h" |
-#import "chrome/browser/autofill/autofill-inl.h" |
-#import "chrome/browser/autofill/autofill_address_model_mac.h" |
-#import "chrome/browser/autofill/autofill_address_sheet_controller_mac.h" |
-#import "chrome/browser/autofill/autofill_credit_card_model_mac.h" |
-#import "chrome/browser/autofill/autofill_credit_card_sheet_controller_mac.h" |
-#import "chrome/browser/autofill/autofill_dialog_controller_mac.h" |
-#import "chrome/browser/autofill/personal_data_manager.h" |
-#include "chrome/browser/browser_process.h" |
-#include "chrome/browser/prefs/pref_service.h" |
-#include "chrome/browser/profiles/profile.h" |
-#include "chrome/browser/ui/browser.h" |
-#include "chrome/browser/ui/browser_list.h" |
-#import "chrome/browser/ui/cocoa/window_size_autosaver.h" |
-#include "chrome/common/pref_names.h" |
-#include "content/common/notification_details.h" |
-#include "content/common/notification_observer.h" |
-#include "grit/app_resources.h" |
-#include "grit/generated_resources.h" |
-#include "grit/theme_resources.h" |
-#include "ui/base/l10n/l10n_util.h" |
-#include "ui/base/resource/resource_bundle.h" |
-#include "ui/gfx/image.h" |
- |
-namespace { |
- |
-// Type for singleton object that contains the instance of the visible |
-// dialog. |
-typedef std::map<Profile*, AutoFillDialogController*> ProfileControllerMap; |
- |
-static base::LazyInstance<ProfileControllerMap> g_profile_controller_map( |
- base::LINKER_INITIALIZED); |
- |
-} // namespace |
- |
-// Delegate protocol that needs to be in place for the AutoFillTableView's |
-// handling of delete and backspace keys. |
-@protocol DeleteKeyDelegate |
-- (IBAction)deleteSelection:(id)sender; |
-@end |
- |
-// A subclass of NSTableView that allows for deleting selected elements using |
-// the delete or backspace keys. |
-@interface AutoFillTableView : NSTableView { |
-} |
-@end |
- |
-@implementation AutoFillTableView |
- |
-// We override the keyDown method to dispatch the |deleteSelection:| action |
-// when the user presses the delete or backspace keys. Note a delegate must |
-// be present that conforms to the DeleteKeyDelegate protocol. |
-- (void)keyDown:(NSEvent *)event { |
- id object = [self delegate]; |
- unichar c = [[event characters] characterAtIndex: 0]; |
- |
- // If the user pressed delete and the delegate supports deleteSelection: |
- if ((c == NSDeleteFunctionKey || |
- c == NSDeleteCharFunctionKey || |
- c == NSDeleteCharacter) && |
- [object respondsToSelector:@selector(deleteSelection:)]) { |
- id <DeleteKeyDelegate> delegate = (id <DeleteKeyDelegate>) object; |
- |
- [delegate deleteSelection:self]; |
- } else { |
- [super keyDown:event]; |
- } |
-} |
- |
-@end |
- |
-// Private interface. |
-@interface AutoFillDialogController (PrivateMethods) |
-// Save profiles and credit card information after user modification. |
-- (void)save; |
- |
-// Asyncronous handler for when PersonalDataManager data loads. The |
-// personal data manager notifies the dialog with this method when the |
-// data loading is complete and ready to be used. |
-- (void)onPersonalDataLoaded:(const std::vector<AutoFillProfile*>&)profiles |
- creditCards:(const std::vector<CreditCard*>&)creditCards; |
- |
-// Asyncronous handler for when PersonalDataManager data changes. The |
-// personal data manager notifies the dialog with this method when the |
-// data has changed. |
-- (void)onPersonalDataChanged:(const std::vector<AutoFillProfile*>&)profiles |
- creditCards:(const std::vector<CreditCard*>&)creditCards; |
- |
-// Called upon changes to AutoFill preferences that should be reflected in the |
-// UI. |
-- (void)preferenceDidChange:(const std::string&)preferenceName; |
- |
-// Adjust the selected index when underlying data changes. |
-// Selects the previous row if possible, else current row, else deselect all. |
-- (void) adjustSelectionOnDelete:(NSInteger)selectedRow; |
- |
-// Adjust the selected index when underlying data changes. |
-// Selects the current row if possible, else previous row, else deselect all. |
-- (void) adjustSelectionOnReload:(NSInteger)selectedRow; |
- |
-// Returns true if |row| is an index to a valid profile in |tableView_|, and |
-// false otherwise. |
-- (BOOL)isProfileRow:(NSInteger)row; |
- |
-// Returns true if |row| is an index to the profile group row in |tableView_|, |
-// and false otherwise. |
-- (BOOL)isProfileGroupRow:(NSInteger)row; |
- |
-// Returns true if |row| is an index to a valid credit card in |tableView_|, and |
-// false otherwise. |
-- (BOOL)isCreditCardRow:(NSInteger)row; |
- |
-// Returns true if |row| is the index to the credit card group row in |
-// |tableView_|, and false otherwise. |
-- (BOOL)isCreditCardGroupRow:(NSInteger)row; |
- |
-// Returns the index to |profiles_| of the corresponding |row| in |tableView_|. |
-- (size_t)profileIndexFromRow:(NSInteger)row; |
- |
-// Returns the index to |creditCards_| of the corresponding |row| in |
-// |tableView_|. |
-- (size_t)creditCardIndexFromRow:(NSInteger)row; |
- |
-// Returns the |row| in |tableView_| that corresponds to the index |i| into |
-// |profiles_|. |
-- (NSInteger)rowFromProfileIndex:(size_t)i; |
- |
-// Returns the |row| in |tableView_| that corresponds to the index |i| into |
-// |creditCards_|. |
-- (NSInteger)rowFromCreditCardIndex:(size_t)row; |
- |
-@end |
- |
-namespace AutoFillDialogControllerInternal { |
- |
-// PersonalDataManagerObserver facilitates asynchronous loading of |
-// PersonalDataManager data before showing the AutoFill settings data to the |
-// user. It acts as a C++-based delegate for the |AutoFillDialogController|. |
-class PersonalDataManagerObserver : public PersonalDataManager::Observer { |
- public: |
- explicit PersonalDataManagerObserver( |
- AutoFillDialogController* controller, |
- PersonalDataManager* personal_data_manager, |
- Profile* profile) |
- : controller_(controller), |
- personal_data_manager_(personal_data_manager), |
- profile_(profile) { |
- } |
- |
- virtual ~PersonalDataManagerObserver(); |
- |
- // Notifies the observer that the PersonalDataManager has finished loading. |
- virtual void OnPersonalDataLoaded(); |
- |
- // Notifies the observer that the PersonalDataManager data has changed. |
- virtual void OnPersonalDataChanged(); |
- |
- private: |
- // Utility method to remove |this| from |personal_data_manager_| as an |
- // observer. |
- void RemoveObserver(); |
- |
- // The dialog controller to be notified when the data loading completes. |
- // Weak reference. |
- AutoFillDialogController* controller_; |
- |
- // The object in which we are registered as an observer. We hold on to |
- // it to facilitate un-registering ourself in the destructor and in the |
- // |OnPersonalDataLoaded| method. This may be NULL. |
- // Weak reference. |
- PersonalDataManager* personal_data_manager_; |
- |
- // Profile of caller. Held as weak reference. May not be NULL. |
- Profile* profile_; |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN(PersonalDataManagerObserver); |
-}; |
- |
-// During destruction ensure that we are removed from the |
-// |personal_data_manager_| as an observer. |
-PersonalDataManagerObserver::~PersonalDataManagerObserver() { |
- RemoveObserver(); |
-} |
- |
-void PersonalDataManagerObserver::RemoveObserver() { |
- if (personal_data_manager_) { |
- personal_data_manager_->RemoveObserver(this); |
- } |
-} |
- |
-// The data has been loaded, notify the controller. |
-void PersonalDataManagerObserver::OnPersonalDataLoaded() { |
- [controller_ onPersonalDataLoaded:personal_data_manager_->web_profiles() |
- creditCards:personal_data_manager_->credit_cards()]; |
-} |
- |
-// The data has changed, notify the controller. |
-void PersonalDataManagerObserver::OnPersonalDataChanged() { |
- [controller_ onPersonalDataChanged:personal_data_manager_->web_profiles() |
- creditCards:personal_data_manager_->credit_cards()]; |
-} |
- |
-// Bridges preference changed notifications to the dialog controller. |
-class PreferenceObserver : public NotificationObserver { |
- public: |
- explicit PreferenceObserver(AutoFillDialogController* controller) |
- : controller_(controller) {} |
- |
- // Overridden from NotificationObserver: |
- virtual void Observe(NotificationType type, |
- const NotificationSource& source, |
- const NotificationDetails& details) { |
- if (type == NotificationType::PREF_CHANGED) { |
- const std::string* pref = Details<std::string>(details).ptr(); |
- if (pref) { |
- [controller_ preferenceDidChange:*pref]; |
- } |
- } |
- } |
- |
- private: |
- AutoFillDialogController* controller_; |
- |
- DISALLOW_COPY_AND_ASSIGN(PreferenceObserver); |
-}; |
- |
-} // namespace AutoFillDialogControllerInternal |
- |
-@implementation AutoFillDialogController |
- |
-@synthesize autoFillManaged = autoFillManaged_; |
-@synthesize autoFillManagedAndDisabled = autoFillManagedAndDisabled_; |
-@synthesize itemIsSelected = itemIsSelected_; |
-@synthesize multipleSelected = multipleSelected_; |
- |
-+ (void)showAutoFillDialogWithObserver:(AutoFillDialogObserver*)observer |
- profile:(Profile*)profile { |
- AutoFillDialogController* controller = |
- [AutoFillDialogController controllerWithObserver:observer |
- profile:profile]; |
- [controller runModelessDialog]; |
-} |
- |
-- (void)awakeFromNib { |
- PersonalDataManager* personal_data_manager = |
- profile_->GetPersonalDataManager(); |
- DCHECK(personal_data_manager); |
- |
- if (personal_data_manager->IsDataLoaded()) { |
- // |personalDataManager| data is loaded, we can proceed with the contents. |
- [self onPersonalDataLoaded:personal_data_manager->web_profiles() |
- creditCards:personal_data_manager->credit_cards()]; |
- } |
- |
- // Register as listener to listen to subsequent data change notifications. |
- personalDataManagerObserver_.reset( |
- new AutoFillDialogControllerInternal::PersonalDataManagerObserver( |
- self, personal_data_manager, profile_)); |
- personal_data_manager->SetObserver(personalDataManagerObserver_.get()); |
- |
- // Explicitly load the data in the table before window displays to avoid |
- // nasty flicker as tables update. |
- [tableView_ reloadData]; |
- |
- // Set up edit when double-clicking on a table row. |
- [tableView_ setDoubleAction:@selector(editSelection:)]; |
-} |
- |
-// NSWindow Delegate callback. When the window closes the controller can |
-// be released. |
-- (void)windowWillClose:(NSNotification *)notification { |
- [tableView_ setDataSource:nil]; |
- [tableView_ setDelegate:nil]; |
- [self autorelease]; |
- |
- // Remove ourself from the map. |
- ProfileControllerMap* map = g_profile_controller_map.Pointer(); |
- ProfileControllerMap::iterator it = map->find(profile_); |
- if (it != map->end()) { |
- map->erase(it); |
- } |
-} |
- |
-// Invokes the "Add" sheet for address information. If user saves then the new |
-// information is added to |profiles_| in |addressAddDidEnd:| method. |
-- (IBAction)addNewAddress:(id)sender { |
- DCHECK(!addressSheetController.get()); |
- |
- // Create a new default address. |
- AutoFillProfile newAddress; |
- |
- // Create a new address sheet controller in "Add" mode. |
- addressSheetController.reset( |
- [[AutoFillAddressSheetController alloc] |
- initWithProfile:newAddress |
- mode:kAutoFillAddressAddMode]); |
- |
- // Show the sheet. |
- [NSApp beginSheet:[addressSheetController window] |
- modalForWindow:[self window] |
- modalDelegate:self |
- didEndSelector:@selector(addressAddDidEnd:returnCode:contextInfo:) |
- contextInfo:NULL]; |
-} |
- |
-// Invokes the "Add" sheet for credit card information. If user saves then the |
-// new information is added to |creditCards_| in |creditCardAddDidEnd:| method. |
-- (IBAction)addNewCreditCard:(id)sender { |
- DCHECK(!creditCardSheetController.get()); |
- |
- // Create a new default credit card. |
- CreditCard newCreditCard; |
- |
- // Create a new address sheet controller in "Add" mode. |
- creditCardSheetController.reset( |
- [[AutoFillCreditCardSheetController alloc] |
- initWithCreditCard:newCreditCard |
- mode:kAutoFillCreditCardAddMode]); |
- |
- // Show the sheet. |
- [NSApp beginSheet:[creditCardSheetController window] |
- modalForWindow:[self window] |
- modalDelegate:self |
- didEndSelector:@selector(creditCardAddDidEnd:returnCode:contextInfo:) |
- contextInfo:NULL]; |
-} |
- |
-// Add address sheet was dismissed. Non-zero |returnCode| indicates a save. |
-- (void)addressAddDidEnd:(NSWindow*)sheet |
- returnCode:(int)returnCode |
- contextInfo:(void*)contextInfo { |
- DCHECK(!contextInfo); |
- |
- if (returnCode) { |
- // Create a new address and save it to the |profiles_| list. |
- AutoFillProfile newAddress; |
- [addressSheetController copyModelToProfile:&newAddress]; |
- if (!newAddress.IsEmpty() && !FindByContents(profiles_, newAddress)) { |
- profiles_.push_back(newAddress); |
- |
- // Saving will save to the PDM and the table will refresh when PDM sends |
- // notification that the underlying model has changed. |
- [self save]; |
- |
- // Update the selection to the newly added item. |
- NSInteger row = [self rowFromProfileIndex:profiles_.size() - 1]; |
- [tableView_ selectRowIndexes:[NSIndexSet indexSetWithIndex:row] |
- byExtendingSelection:NO]; |
- } |
- } |
- [sheet orderOut:self]; |
- addressSheetController.reset(nil); |
-} |
- |
-// Add credit card sheet was dismissed. Non-zero |returnCode| indicates a save. |
-- (void)creditCardAddDidEnd:(NSWindow*)sheet |
- returnCode:(int)returnCode |
- contextInfo:(void*)contextInfo { |
- DCHECK(!contextInfo); |
- |
- if (returnCode) { |
- // Create a new credit card and save it to the |creditCards_| list. |
- CreditCard newCreditCard; |
- [creditCardSheetController copyModelToCreditCard:&newCreditCard]; |
- if (!newCreditCard.IsEmpty() && |
- !FindByContents(creditCards_, newCreditCard)) { |
- creditCards_.push_back(newCreditCard); |
- |
- // Saving will save to the PDM and the table will refresh when PDM sends |
- // notification that the underlying model has changed. |
- [self save]; |
- |
- // Update the selection to the newly added item. |
- NSInteger row = [self rowFromCreditCardIndex:creditCards_.size() - 1]; |
- [tableView_ selectRowIndexes:[NSIndexSet indexSetWithIndex:row] |
- byExtendingSelection:NO]; |
- } |
- } |
- [sheet orderOut:self]; |
- creditCardSheetController.reset(nil); |
-} |
- |
-// Deletes selected items; either addresses, credit cards, or a mixture of the |
-// two depending on the items selected. |
-- (IBAction)deleteSelection:(id)sender { |
- NSIndexSet* selection = [tableView_ selectedRowIndexes]; |
- NSInteger selectedRow = [tableView_ selectedRow]; |
- |
- // Loop through from last to first deleting selected items as we go. |
- for (NSUInteger i = [selection lastIndex]; |
- i != NSNotFound; |
- i = [selection indexLessThanIndex:i]) { |
- // We keep track of the "top most" selection in the list so we know where |
- // to set new selection below. |
- selectedRow = i; |
- |
- if ([self isProfileRow:i]) { |
- profiles_.erase( |
- profiles_.begin() + [self profileIndexFromRow:i]); |
- } else if ([self isCreditCardRow:i]) { |
- creditCards_.erase( |
- creditCards_.begin() + [self creditCardIndexFromRow:i]); |
- } |
- } |
- |
- // Select the previous row if possible, else current row, else deselect all. |
- [self adjustSelectionOnDelete:selectedRow]; |
- |
- // Saving will save to the PDM and the table will refresh when PDM sends |
- // notification that the underlying model has changed. |
- [self save]; |
-} |
- |
-// Edits the selected item, either address or credit card depending on the item |
-// selected. |
-- (IBAction)editSelection:(id)sender { |
- NSInteger selectedRow = [tableView_ selectedRow]; |
- if ([self isProfileRow:selectedRow]) { |
- if (!addressSheetController.get()) { |
- int i = [self profileIndexFromRow:selectedRow]; |
- |
- // Create a new address sheet controller in "Edit" mode. |
- addressSheetController.reset( |
- [[AutoFillAddressSheetController alloc] |
- initWithProfile:profiles_[i] |
- mode:kAutoFillAddressEditMode]); |
- |
- // Show the sheet. |
- [NSApp beginSheet:[addressSheetController window] |
- modalForWindow:[self window] |
- modalDelegate:self |
- didEndSelector:@selector(addressEditDidEnd:returnCode:contextInfo:) |
- contextInfo:&profiles_[i]]; |
- } |
- } else if ([self isCreditCardRow:selectedRow]) { |
- if (!creditCardSheetController.get()) { |
- int i = [self creditCardIndexFromRow:selectedRow]; |
- |
- // Create a new credit card sheet controller in "Edit" mode. |
- creditCardSheetController.reset( |
- [[AutoFillCreditCardSheetController alloc] |
- initWithCreditCard:creditCards_[i] |
- mode:kAutoFillCreditCardEditMode]); |
- |
- // Show the sheet. |
- [NSApp beginSheet:[creditCardSheetController window] |
- modalForWindow:[self window] |
- modalDelegate:self |
- didEndSelector:@selector(creditCardEditDidEnd:returnCode:contextInfo:) |
- contextInfo:&creditCards_[i]]; |
- } |
- } |
-} |
- |
-// Navigates to the AutoFill help url. |
-- (IBAction)openHelp:(id)sender { |
- Browser* browser = BrowserList::GetLastActive(); |
- |
- if (!browser || !browser->GetSelectedTabContents()) |
- browser = Browser::Create(profile_); |
- browser->OpenAutoFillHelpTabAndActivate(); |
-} |
- |
-// Edit address sheet was dismissed. Non-zero |returnCode| indicates a save. |
-- (void)addressEditDidEnd:(NSWindow *)sheet |
- returnCode:(int)returnCode |
- contextInfo:(void *)contextInfo { |
- DCHECK(contextInfo != NULL); |
- if (returnCode) { |
- AutoFillProfile* profile = static_cast<AutoFillProfile*>(contextInfo); |
- [addressSheetController copyModelToProfile:profile]; |
- |
- if (profile->IsEmpty()) |
- [tableView_ deselectAll:self]; |
- profiles_.erase( |
- std::remove_if(profiles_.begin(), profiles_.end(), |
- std::mem_fun_ref(&AutoFillProfile::IsEmpty)), |
- profiles_.end()); |
- |
- // Saving will save to the PDM and the table will refresh when PDM sends |
- // notification that the underlying model has changed. |
- [self save]; |
- } |
- [sheet orderOut:self]; |
- addressSheetController.reset(nil); |
-} |
- |
-// Edit credit card sheet was dismissed. Non-zero |returnCode| indicates a |
-// save. |
-- (void)creditCardEditDidEnd:(NSWindow *)sheet |
- returnCode:(int)returnCode |
- contextInfo:(void *)contextInfo { |
- DCHECK(contextInfo != NULL); |
- if (returnCode) { |
- CreditCard* creditCard = static_cast<CreditCard*>(contextInfo); |
- [creditCardSheetController copyModelToCreditCard:creditCard]; |
- |
- if (creditCard->IsEmpty()) |
- [tableView_ deselectAll:self]; |
- creditCards_.erase( |
- std::remove_if( |
- creditCards_.begin(), creditCards_.end(), |
- std::mem_fun_ref(&CreditCard::IsEmpty)), |
- creditCards_.end()); |
- |
- // Saving will save to the PDM and the table will refresh when PDM sends |
- // notification that the underlying model has changed. |
- [self save]; |
- } |
- [sheet orderOut:self]; |
- creditCardSheetController.reset(nil); |
-} |
- |
-// NSTableView Delegate method. |
-- (BOOL)tableView:(NSTableView *)tableView isGroupRow:(NSInteger)row { |
- if ([self isProfileGroupRow:row] || [self isCreditCardGroupRow:row]) |
- return YES; |
- return NO; |
-} |
- |
-// NSTableView Delegate method. |
-- (BOOL)tableView:(NSTableView *)tableView shouldSelectRow:(NSInteger)row { |
- return [self isProfileRow:row] || [self isCreditCardRow:row]; |
-} |
- |
-// NSTableView Delegate method. |
-- (id)tableView:(NSTableView *)tableView |
- objectValueForTableColumn:(NSTableColumn *)tableColumn |
- row:(NSInteger)row { |
- if ([[tableColumn identifier] isEqualToString:@"Spacer"]) |
- return @""; |
- |
- // Check that we're initialized before supplying data. |
- if (tableView != tableView_) |
- return @""; |
- |
- // Section label. |
- if ([self isProfileGroupRow:row]) { |
- if ([[tableColumn identifier] isEqualToString:@"Summary"]) |
- return l10n_util::GetNSString(IDS_AUTOFILL_ADDRESSES_GROUP_NAME); |
- else |
- return @""; |
- } |
- |
- if (row < 0) |
- return @""; |
- |
- // Data row. |
- if ([self isProfileRow:row]) { |
- if ([[tableColumn identifier] isEqualToString:@"Summary"]) { |
- return SysUTF16ToNSString( |
- profiles_[[self profileIndexFromRow:row]].Label()); |
- } |
- |
- return @""; |
- } |
- |
- // Section label. |
- if ([self isCreditCardGroupRow:row]) { |
- if ([[tableColumn identifier] isEqualToString:@"Summary"]) |
- return l10n_util::GetNSString(IDS_AUTOFILL_CREDITCARDS_GROUP_NAME); |
- else |
- return @""; |
- } |
- |
- // Data row. |
- if ([self isCreditCardRow:row]) { |
- if ([[tableColumn identifier] isEqualToString:@"Summary"]) { |
- return SysUTF16ToNSString( |
- creditCards_[ |
- [self creditCardIndexFromRow:row]].PreviewSummary()); |
- } |
- |
- return @""; |
- } |
- |
- return @""; |
-} |
- |
-// We implement this delegate method to update our |itemIsSelected| and |
-// |multipleSelected| properties. |
-// The "Edit..." and "Remove" buttons' enabled state depends on having a |
-// valid selection in the table. The "Edit..." button depends on having |
-// exactly one item selected. |
-- (void)tableViewSelectionDidChange:(NSNotification *)aNotification { |
- if ([tableView_ selectedRow] >= 0) |
- [self setItemIsSelected:YES]; |
- else |
- [self setItemIsSelected:NO]; |
- |
- [self setMultipleSelected:([[tableView_ selectedRowIndexes] count] > 1UL)]; |
-} |
- |
-- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView { |
- if (tableView == tableView_) { |
- // 1 section header, the profiles, 1 section header, the credit cards. |
- return 1 + profiles_.size() + 1 + creditCards_.size(); |
- } |
- |
- return 0; |
-} |
- |
-// Accessor for |autoFillEnabled| preference state. Note: a checkbox in Nib |
-// is bound to this via KVO. |
-- (BOOL)autoFillEnabled { |
- return autoFillEnabled_.GetValue(); |
-} |
- |
-// Setter for |autoFillEnabled| preference state. |
-- (void)setAutoFillEnabled:(BOOL)value { |
- autoFillEnabled_.SetValueIfNotManaged(value ? true : false); |
-} |
- |
-// Accessor for |auxiliaryEnabled| preference state. Note: a checkbox in Nib |
-// is bound to this via KVO. |
-- (BOOL)auxiliaryEnabled { |
- return auxiliaryEnabled_.GetValue(); |
-} |
- |
-// Setter for |auxiliaryEnabled| preference state. |
-- (void)setAuxiliaryEnabled:(BOOL)value { |
- if ([self autoFillEnabled]) |
- auxiliaryEnabled_.SetValueIfNotManaged(value ? true : false); |
-} |
- |
-@end |
- |
-@implementation AutoFillDialogController (ExposedForUnitTests) |
- |
-+ (AutoFillDialogController*) |
- controllerWithObserver:(AutoFillDialogObserver*)observer |
- profile:(Profile*)profile { |
- profile = profile->GetOriginalProfile(); |
- |
- ProfileControllerMap* map = g_profile_controller_map.Pointer(); |
- DCHECK(map != NULL); |
- ProfileControllerMap::iterator it = map->find(profile); |
- if (it == map->end()) { |
- // We should have exactly 1 or 0 entry in the map, no more. That is, |
- // only one profile can have the AutoFill dialog up at a time. |
- DCHECK_EQ(map->size(), 0U); |
- |
- // Deallocation is done upon window close. See |windowWillClose:|. |
- AutoFillDialogController* controller = |
- [[self alloc] initWithObserver:observer profile:profile]; |
- it = map->insert(std::make_pair(profile, controller)).first; |
- } |
- |
- return it->second; |
-} |
- |
- |
-// 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 |
- profile:(Profile*)profile { |
- DCHECK(profile); |
- // Use initWithWindowNibPath: instead of initWithWindowNibName: so we |
- // can override it in a unit test. |
- NSString* nibpath = [base::mac::MainAppBundle() |
- pathForResource:@"AutoFillDialog" |
- ofType:@"nib"]; |
- if ((self = [super initWithWindowNibPath:nibpath owner:self])) { |
- // Initialize member variables based on input. |
- observer_ = observer; |
- profile_ = profile; |
- |
- // Initialize the preference observer and watch kAutoFillEnabled. |
- preferenceObserver_.reset( |
- new AutoFillDialogControllerInternal::PreferenceObserver(self)); |
- autoFillEnabled_.Init(prefs::kAutoFillEnabled, profile_->GetPrefs(), |
- preferenceObserver_.get()); |
- |
- // Call |preferenceDidChange| in order to initialize UI state of the |
- // checkbox. |
- [self preferenceDidChange:prefs::kAutoFillEnabled]; |
- |
- // Initialize the preference observer and watch |
- // kAutoFillAuxiliaryProfilesEnabled. |
- auxiliaryEnabled_.Init(prefs::kAutoFillAuxiliaryProfilesEnabled, |
- profile_->GetPrefs(), |
- preferenceObserver_.get()); |
- |
- // Call |preferenceDidChange| in order to initialize UI state of the |
- // checkbox. |
- [self preferenceDidChange:prefs::kAutoFillAuxiliaryProfilesEnabled]; |
- |
- // Do not use [NSMutableArray array] here; we need predictable destruction |
- // which will be prevented by having a reference held by an autorelease |
- // pool. |
- } |
- return self; |
-} |
- |
-// Run modeless. |
-- (void)runModelessDialog { |
- // Use stored window geometry if it exists. |
- if (g_browser_process && g_browser_process->local_state()) { |
- sizeSaver_.reset([[WindowSizeAutosaver alloc] |
- initWithWindow:[self window] |
- prefService:g_browser_process->local_state() |
- path:prefs::kAutoFillDialogPlacement]); |
- } |
- |
- [self showWindow:nil]; |
-} |
- |
-// Close the dialog. |
-- (void)closeDialog { |
- [[self window] performClose:self]; |
-} |
- |
-- (AutoFillAddressSheetController*)addressSheetController { |
- return addressSheetController.get(); |
-} |
- |
-- (AutoFillCreditCardSheetController*)creditCardSheetController { |
- return creditCardSheetController.get(); |
-} |
- |
-- (void)selectAddressAtIndex:(size_t)i { |
- [tableView_ selectRowIndexes:[NSIndexSet indexSetWithIndex: |
- [self rowFromProfileIndex:i]] |
- byExtendingSelection:NO]; |
-} |
- |
-- (void)selectCreditCardAtIndex:(size_t)i { |
- [tableView_ selectRowIndexes:[NSIndexSet indexSetWithIndex: |
- [self rowFromCreditCardIndex:i]] |
- byExtendingSelection:NO]; |
-} |
- |
-- (void)addSelectedAddressAtIndex:(size_t)i { |
- [tableView_ selectRowIndexes:[NSIndexSet indexSetWithIndex: |
- [self rowFromProfileIndex:i]] |
- byExtendingSelection:YES]; |
-} |
- |
-- (void)addSelectedCreditCardAtIndex:(size_t)i { |
- [tableView_ selectRowIndexes:[NSIndexSet indexSetWithIndex: |
- [self rowFromCreditCardIndex:i]] |
- byExtendingSelection:YES]; |
-} |
- |
-- (BOOL)editButtonEnabled { |
- return [editButton_ isEnabled]; |
-} |
- |
-- (std::vector<AutoFillProfile>&)profiles { |
- return profiles_; |
-} |
- |
-- (std::vector<CreditCard>&)creditCards { |
- return creditCards_; |
-} |
- |
-@end |
- |
-@implementation AutoFillDialogController (PrivateMethods) |
- |
-// Called when the user modifies the profiles or credit card information. |
-- (void)save { |
- // If we have an |observer_| then communicate the changes back, unless |
- // AutoFill has been disabled through policy in the mean time. |
- if (observer_ && !autoFillManagedAndDisabled_) { |
- // Make a working copy of profiles. |OnAutoFillDialogApply| can mutate |
- // |profiles_|. |
- std::vector<AutoFillProfile> profiles = profiles_; |
- |
- // Make a working copy of credit cards. |OnAutoFillDialogApply| can mutate |
- // |creditCards_|. |
- std::vector<CreditCard> creditCards = creditCards_; |
- |
- observer_->OnAutoFillDialogApply(&profiles, &creditCards); |
- } |
-} |
- |
-- (void)onPersonalDataLoaded:(const std::vector<AutoFillProfile*>&)profiles |
- creditCards:(const std::vector<CreditCard*>&)creditCards { |
- [self onPersonalDataChanged:profiles creditCards:creditCards]; |
-} |
- |
-- (void)onPersonalDataChanged:(const std::vector<AutoFillProfile*>&)profiles |
- creditCards:(const std::vector<CreditCard*>&)creditCards { |
- // Make local copy of |profiles|. |
- profiles_.clear(); |
- for (std::vector<AutoFillProfile*>::const_iterator iter = profiles.begin(); |
- iter != profiles.end(); ++iter) |
- profiles_.push_back(**iter); |
- |
- // Make local copy of |creditCards|. |
- creditCards_.clear(); |
- for (std::vector<CreditCard*>::const_iterator iter = creditCards.begin(); |
- iter != creditCards.end(); ++iter) |
- creditCards_.push_back(**iter); |
- |
- [self adjustSelectionOnReload:[tableView_ selectedRow]]; |
- [tableView_ reloadData]; |
-} |
- |
-- (void)preferenceDidChange:(const std::string&)preferenceName { |
- if (preferenceName == prefs::kAutoFillEnabled) { |
- [self setAutoFillEnabled:autoFillEnabled_.GetValue()]; |
- [self setAutoFillManaged:autoFillEnabled_.IsManaged()]; |
- [self setAutoFillManagedAndDisabled: |
- autoFillEnabled_.IsManaged() && !autoFillEnabled_.GetValue()]; |
- } else if (preferenceName == prefs::kAutoFillAuxiliaryProfilesEnabled) { |
- [self setAuxiliaryEnabled:auxiliaryEnabled_.GetValue()]; |
- } else { |
- NOTREACHED(); |
- } |
-} |
- |
-- (void) adjustSelectionOnDelete:(NSInteger)selectedRow { |
- if ([self tableView:tableView_ shouldSelectRow:selectedRow-1]) { |
- [tableView_ selectRowIndexes:[NSIndexSet indexSetWithIndex:selectedRow-1] |
- byExtendingSelection:NO]; |
- } else if ([self tableView:tableView_ shouldSelectRow:selectedRow]) { |
- [tableView_ selectRowIndexes:[NSIndexSet indexSetWithIndex:selectedRow] |
- byExtendingSelection:NO]; |
- } else { |
- [tableView_ deselectAll:self]; |
- } |
-} |
- |
-- (void) adjustSelectionOnReload:(NSInteger)selectedRow { |
- if ([self tableView:tableView_ shouldSelectRow:selectedRow]) { |
- [tableView_ selectRowIndexes:[NSIndexSet indexSetWithIndex:selectedRow] |
- byExtendingSelection:NO]; |
- } else if ([self tableView:tableView_ shouldSelectRow:selectedRow-1]) { |
- [tableView_ selectRowIndexes:[NSIndexSet indexSetWithIndex:selectedRow-1] |
- byExtendingSelection:NO]; |
- } else { |
- [tableView_ deselectAll:self]; |
- } |
-} |
- |
-- (BOOL)isProfileRow:(NSInteger)row { |
- if (row > 0 && static_cast<size_t>(row) <= profiles_.size()) |
- return YES; |
- return NO; |
-} |
- |
-- (BOOL)isProfileGroupRow:(NSInteger)row { |
- if (row == 0) |
- return YES; |
- return NO; |
-} |
- |
-- (BOOL)isCreditCardRow:(NSInteger)row { |
- if (row > 0 && |
- static_cast<size_t>(row) >= profiles_.size() + 2 && |
- static_cast<size_t>(row) <= profiles_.size() + creditCards_.size() + 1) |
- return YES; |
- return NO; |
-} |
- |
-- (BOOL)isCreditCardGroupRow:(NSInteger)row { |
- if (row > 0 && static_cast<size_t>(row) == profiles_.size() + 1) |
- return YES; |
- return NO; |
-} |
- |
-- (size_t)profileIndexFromRow:(NSInteger)row { |
- DCHECK([self isProfileRow:row]); |
- return static_cast<size_t>(row) - 1; |
-} |
- |
-- (size_t)creditCardIndexFromRow:(NSInteger)row { |
- DCHECK([self isCreditCardRow:row]); |
- return static_cast<size_t>(row) - (profiles_.size() + 2); |
-} |
- |
-- (NSInteger)rowFromProfileIndex:(size_t)i { |
- return 1 + i; |
-} |
- |
-- (NSInteger)rowFromCreditCardIndex:(size_t)i { |
- return 1 + profiles_.size() + 1 + i; |
-} |
- |
-@end |
- |
-// An NSValueTransformer subclass for use in validation of phone number |
-// fields. Transforms an invalid phone number string into a warning image. |
-// This data transformer is used in the credit card sheet for invalid phone and |
-// fax numbers. |
-@interface InvalidPhoneTransformer : NSValueTransformer { |
-} |
-@end |
- |
-@implementation InvalidPhoneTransformer |
-+ (Class)transformedValueClass { |
- return [NSImage class]; |
-} |
- |
-+ (BOOL)allowsReverseTransformation { |
- return NO; |
-} |
- |
-- (id)transformedValue:(id)string { |
- NSImage* image = nil; |
- ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
- |
- // We display no validation icon when input has not yet been entered. |
- if (string == nil || [string length] == 0) |
- return nil; |
- |
- // If we have input then display alert icon if we have an invalid number. |
- if (string != nil && [string length] != 0) { |
- // TODO(dhollowa): Using SetInfo() call to validate phone number. Should |
- // have explicit validation method. More robust validation is needed as |
- // well eventually. |
- AutoFillProfile profile; |
- profile.SetInfo(AutofillType(PHONE_HOME_WHOLE_NUMBER), |
- base::SysNSStringToUTF16(string)); |
- if (profile.GetFieldText(AutofillType(PHONE_HOME_WHOLE_NUMBER)).empty()) { |
- image = rb.GetNativeImageNamed(IDR_INPUT_ALERT); |
- DCHECK(image); |
- return image; |
- } |
- } |
- |
- // No alert icon, so must be valid input. |
- if (!image) { |
- image = rb.GetNativeImageNamed(IDR_INPUT_GOOD); |
- DCHECK(image); |
- return image; |
- } |
- |
- return nil; |
-} |
- |
-@end |