1 // Copyright (c) 2012 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.
5 #import <Cocoa/Cocoa.h>
7 #include "chrome/browser/ui/cocoa/autofill/autofill_popup_view_bridge.h"
9 #include "base/logging.h"
10 #include "chrome/browser/ui/autofill/autofill_popup_controller.h"
11 #import "chrome/browser/ui/cocoa/autofill/autofill_popup_view_cocoa.h"
12 #include "ui/base/cocoa/window_size_constants.h"
13 #include "ui/gfx/rect.h"
17 AutofillPopupViewBridge::AutofillPopupViewBridge(
18 AutofillPopupController* controller)
19 : controller_(controller) {
21 [[NSWindow alloc] initWithContentRect:ui::kWindowSizeDeterminedLater
22 styleMask:NSBorderlessWindowMask
23 backing:NSBackingStoreBuffered
25 // Telling Cocoa that the window is opaque enables some drawing optimizations.
26 [window_ setOpaque:YES];
28 view_ = [[[AutofillPopupViewCocoa alloc]
29 initWithController:controller_
30 frame:NSZeroRect] autorelease];
31 [window_ setContentView:view_];
34 AutofillPopupViewBridge::~AutofillPopupViewBridge() {
35 [view_ controllerDestroyed];
37 // Remove the child window before closing, otherwise it can mess up
39 [[window_ parentWindow] removeChildWindow:window_];
44 void AutofillPopupViewBridge::Hide() {
48 void AutofillPopupViewBridge::Show() {
49 UpdateBoundsAndRedrawPopup();
50 [[controller_->container_view() window] addChildWindow:window_
51 ordered:NSWindowAbove];
54 void AutofillPopupViewBridge::InvalidateRow(size_t row) {
56 NSRectFromCGRect(controller_->GetRowBounds(row).ToCGRect());
57 [view_ setNeedsDisplayInRect:dirty_rect];
60 void AutofillPopupViewBridge::UpdateBoundsAndRedrawPopup() {
61 NSRect frame = NSRectFromCGRect(controller_->popup_bounds().ToCGRect());
63 // Flip coordinates back into Cocoa-land. The controller's platform-neutral
64 // coordinate space places the origin at the top-left of the first screen,
65 // whereas Cocoa's coordinate space expects the origin to be at the
66 // bottom-left of this same screen.
67 NSScreen* screen = [[NSScreen screens] objectAtIndex:0];
68 frame.origin.y = NSMaxY([screen frame]) - NSMaxY(frame);
70 // TODO(isherman): The view should support scrolling if the popup gets too
71 // big to fit on the screen.
72 [window_ setFrame:frame display:YES];
75 AutofillPopupView* AutofillPopupView::Create(
76 AutofillPopupController* controller) {
77 return new AutofillPopupViewBridge(controller);
80 } // namespace autofill