Index: chrome/browser/ui/cocoa/autofill/autofill_dialog_window_controller.mm |
diff --git a/chrome/browser/ui/cocoa/autofill/autofill_dialog_window_controller.mm b/chrome/browser/ui/cocoa/autofill/autofill_dialog_window_controller.mm |
deleted file mode 100644 |
index f81fce4857321318a9159d3070250c096367eace..0000000000000000000000000000000000000000 |
--- a/chrome/browser/ui/cocoa/autofill/autofill_dialog_window_controller.mm |
+++ /dev/null |
@@ -1,330 +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/autofill/autofill_dialog_window_controller.h" |
- |
-#include "base/mac/foundation_util.h" |
-#include "base/mac/scoped_nsobject.h" |
-#include "base/strings/sys_string_conversions.h" |
-#include "chrome/browser/ui/autofill/autofill_dialog_view_delegate.h" |
-#include "chrome/browser/ui/cocoa/autofill/autofill_dialog_cocoa.h" |
-#include "chrome/browser/ui/cocoa/autofill/autofill_dialog_constants.h" |
-#import "chrome/browser/ui/cocoa/autofill/autofill_header.h" |
-#import "chrome/browser/ui/cocoa/autofill/autofill_input_field.h" |
-#import "chrome/browser/ui/cocoa/autofill/autofill_main_container.h" |
-#import "chrome/browser/ui/cocoa/autofill/autofill_section_container.h" |
-#import "chrome/browser/ui/cocoa/autofill/autofill_textfield.h" |
-#import "chrome/browser/ui/cocoa/constrained_window/constrained_window_custom_window.h" |
-#include "content/public/browser/web_contents.h" |
-#import "ui/base/cocoa/flipped_view.h" |
-#include "ui/base/cocoa/window_size_constants.h" |
- |
-// The minimum useful height of the contents area of the dialog. |
-const CGFloat kMinimumContentsHeight = 101; |
- |
-#pragma mark AutofillDialogWindow |
- |
-// Window class for the AutofillDialog. Its main purpose is the proper handling |
-// of layout requests - i.e. ensuring that layout is fully done before any |
-// updates of the display happen. |
-@interface AutofillDialogWindow : ConstrainedWindowCustomWindow { |
- @private |
- BOOL needsLayout_; // Indicates that the subviews need to be laid out. |
-} |
- |
-// Request a new layout for all subviews. Layout occurs right before -display |
-// or -displayIfNeeded are invoked. |
-- (void)requestRelayout; |
- |
-// Layout the window's subviews. Delegates to the controller. |
-- (void)performLayout; |
- |
-@end |
- |
- |
-@implementation AutofillDialogWindow |
- |
-- (void)requestRelayout { |
- needsLayout_ = YES; |
- |
- // Ensure displayIfNeeded: is sent on the next pass through the event loop. |
- [self setViewsNeedDisplay:YES]; |
-} |
- |
-- (void)performLayout { |
- if (needsLayout_) { |
- needsLayout_ = NO; |
- AutofillDialogWindowController* controller = |
- base::mac::ObjCCastStrict<AutofillDialogWindowController>( |
- [self windowController]); |
- [controller performLayout]; |
- } |
-} |
- |
-- (void)display { |
- [self performLayout]; |
- [super display]; |
-} |
- |
-- (void)displayIfNeeded { |
- [self performLayout]; |
- [super displayIfNeeded]; |
-} |
- |
-@end |
- |
-#pragma mark Field Editor |
- |
-@interface AutofillDialogFieldEditor : NSTextView |
-@end |
- |
- |
-@implementation AutofillDialogFieldEditor |
- |
-- (void)mouseDown:(NSEvent*)event { |
- // Delegate _must_ be notified before mouseDown is complete, since it needs |
- // to distinguish between mouseDown for already focused fields, and fields |
- // that will receive focus as part of the mouseDown. |
- AutofillTextField* textfield = |
- base::mac::ObjCCastStrict<AutofillTextField>([self delegate]); |
- [textfield onEditorMouseDown:self]; |
- [super mouseDown:event]; |
-} |
- |
-// Intercept key down messages and forward them to the text fields delegate. |
-// This needs to happen in the field editor, since it handles all keyDown |
-// messages for NSTextField. |
-- (void)keyDown:(NSEvent*)event { |
- AutofillTextField* textfield = |
- base::mac::ObjCCastStrict<AutofillTextField>([self delegate]); |
- if ([[textfield inputDelegate] keyEvent:event |
- forInput:textfield] != kKeyEventHandled) { |
- [super keyDown:event]; |
- } |
-} |
- |
-@end |
- |
- |
-#pragma mark Window Controller |
- |
-@interface AutofillDialogWindowController () |
- |
-// Compute maximum allowed height for the dialog. |
-- (CGFloat)maxHeight; |
- |
-// Notification that the WebContent's view frame has changed. |
-- (void)onContentViewFrameDidChange:(NSNotification*)notification; |
- |
-- (AutofillDialogWindow*)autofillWindow; |
- |
-@end |
- |
- |
-@implementation AutofillDialogWindowController (NSWindowDelegate) |
- |
-- (id)windowWillReturnFieldEditor:(NSWindow*)window toObject:(id)client { |
- AutofillTextField* textfield = base::mac::ObjCCast<AutofillTextField>(client); |
- if (!textfield) |
- return nil; |
- |
- if (!fieldEditor_) { |
- fieldEditor_.reset([[AutofillDialogFieldEditor alloc] init]); |
- [fieldEditor_ setFieldEditor:YES]; |
- } |
- return fieldEditor_.get(); |
-} |
- |
-@end |
- |
- |
-@implementation AutofillDialogWindowController |
- |
-- (id)initWithWebContents:(content::WebContents*)webContents |
- dialog:(autofill::AutofillDialogCocoa*)dialog { |
- DCHECK(webContents); |
- |
- base::scoped_nsobject<ConstrainedWindowCustomWindow> window( |
- [[AutofillDialogWindow alloc] |
- initWithContentRect:ui::kWindowSizeDeterminedLater]); |
- |
- if ((self = [super initWithWindow:window])) { |
- [window setDelegate:self]; |
- webContents_ = webContents; |
- dialog_ = dialog; |
- |
- header_.reset([[AutofillHeader alloc] initWithDelegate:dialog->delegate()]); |
- |
- mainContainer_.reset([[AutofillMainContainer alloc] |
- initWithDelegate:dialog->delegate()]); |
- [mainContainer_ setTarget:self]; |
- |
- // This needs a flipped content view because otherwise the size |
- // animation looks odd. However, replacing the contentView for constrained |
- // windows does not work - it does custom rendering. |
- base::scoped_nsobject<NSView> flippedContentView( |
- [[FlippedView alloc] initWithFrame: |
- [[[self window] contentView] frame]]); |
- [flippedContentView setSubviews:@[ [header_ view], [mainContainer_ view] ]]; |
- [flippedContentView setAutoresizingMask: |
- (NSViewWidthSizable | NSViewHeightSizable)]; |
- [[[self window] contentView] addSubview:flippedContentView]; |
- } |
- return self; |
-} |
- |
-- (void)dealloc { |
- [[NSNotificationCenter defaultCenter] removeObserver:self]; |
- [super dealloc]; |
-} |
- |
-- (CGFloat)maxHeight { |
- NSRect dialogFrameRect = [[self window] frame]; |
- NSRect browserFrameRect = [webContents_->GetTopLevelNativeWindow() frame]; |
- dialogFrameRect.size.height = |
- NSMaxY(dialogFrameRect) - NSMinY(browserFrameRect); |
- dialogFrameRect = [[self window] contentRectForFrameRect:dialogFrameRect]; |
- return NSHeight(dialogFrameRect); |
-} |
- |
-- (void)onContentViewFrameDidChange:(NSNotification*)notification { |
- [self requestRelayout]; |
-} |
- |
-- (AutofillDialogWindow*)autofillWindow { |
- return base::mac::ObjCCastStrict<AutofillDialogWindow>([self window]); |
-} |
- |
-- (void)requestRelayout { |
- [[self autofillWindow] requestRelayout]; |
-} |
- |
-- (NSSize)preferredSize { |
- NSSize size; |
- |
- size = [mainContainer_ preferredSize]; |
- |
- // Always make room for the header. |
- CGFloat headerHeight = [header_ preferredSize].height; |
- size.height += headerHeight; |
- |
- // For the minimum height, account for both the header and the footer. Even |
- // though the footer will not be visible when the sign-in view is showing, |
- // this prevents the dialog's size from bouncing around. |
- CGFloat minHeight = kMinimumContentsHeight; |
- minHeight += [mainContainer_ decorationSizeForWidth:size.width].height; |
- minHeight += headerHeight; |
- |
- // Show as much of the main view as is possible without going past the |
- // bottom of the browser window, unless this would cause the dialog to be |
- // less tall than the minimum height. |
- size.height = std::min(size.height, [self maxHeight]); |
- size.height = std::max(size.height, minHeight); |
- |
- return size; |
-} |
- |
-- (void)performLayout { |
- NSRect contentRect = NSZeroRect; |
- contentRect.size = [self preferredSize]; |
- |
- CGFloat headerHeight = [header_ preferredSize].height; |
- NSRect headerRect, mainRect; |
- NSDivideRect(contentRect, &headerRect, &mainRect, headerHeight, NSMinYEdge); |
- |
- [[header_ view] setFrame:headerRect]; |
- [header_ performLayout]; |
- |
- [[mainContainer_ view] setFrame:mainRect]; |
- [mainContainer_ performLayout]; |
- |
- NSRect frameRect = [[self window] frameRectForContentRect:contentRect]; |
- [[self window] setFrame:frameRect display:YES]; |
- |
- [[self window] recalculateKeyViewLoop]; |
- |
- if (mainContainerBecameVisible_) { |
- [mainContainer_ scrollInitialEditorIntoViewAndMakeFirstResponder]; |
- mainContainerBecameVisible_ = NO; |
- } |
-} |
- |
-- (IBAction)accept:(id)sender { |
- if ([mainContainer_ validate]) |
- dialog_->delegate()->OnAccept(); |
- else |
- [mainContainer_ makeFirstInvalidInputFirstResponder]; |
-} |
- |
-- (IBAction)cancel:(id)sender { |
- dialog_->delegate()->OnCancel(); |
- dialog_->PerformClose(); |
-} |
- |
-- (void)show { |
- // Resizing the browser causes the ConstrainedWindow to move. |
- // Observe that to allow resizes based on browser size. |
- // NOTE: This MUST come last after all initial setup is done, because there |
- // is an immediate notification post registration. |
- DCHECK([self window]); |
- [[NSNotificationCenter defaultCenter] |
- addObserver:self |
- selector:@selector(onContentViewFrameDidChange:) |
- name:NSWindowDidMoveNotification |
- object:[self window]]; |
- |
- [self updateNotificationArea]; |
- [self requestRelayout]; |
-} |
- |
-- (void)hide { |
- dialog_->delegate()->OnCancel(); |
- dialog_->PerformClose(); |
-} |
- |
-- (void)updateNotificationArea { |
- [mainContainer_ updateNotificationArea]; |
-} |
- |
-- (void)updateSection:(autofill::DialogSection)section { |
- [[mainContainer_ sectionForId:section] update]; |
- [mainContainer_ updateSaveInChrome]; |
-} |
- |
-- (void)fillSection:(autofill::DialogSection)section |
- forType:(autofill::ServerFieldType)type { |
- [[mainContainer_ sectionForId:section] fillForType:type]; |
- [mainContainer_ updateSaveInChrome]; |
-} |
- |
-- (void)updateForErrors { |
- [mainContainer_ validate]; |
-} |
- |
-- (void)getInputs:(autofill::FieldValueMap*)output |
- forSection:(autofill::DialogSection)section { |
- [[mainContainer_ sectionForId:section] getInputs:output]; |
-} |
- |
-- (NSString*)getCvc { |
- return [[mainContainer_ sectionForId:autofill::SECTION_CC] suggestionText]; |
-} |
- |
-- (BOOL)saveDetailsLocally { |
- return [mainContainer_ saveDetailsLocally]; |
-} |
- |
-- (void)modelChanged { |
- [mainContainer_ modelChanged]; |
-} |
- |
-- (void)updateErrorBubble { |
- [mainContainer_ updateErrorBubble]; |
-} |
- |
-- (void)validateSection:(autofill::DialogSection)section { |
- [[mainContainer_ sectionForId:section] validateFor:autofill::VALIDATE_EDIT]; |
-} |
- |
-@end |