Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(155)

Side by Side Diff: ui/views/cocoa/widget_owner_nswindow_adapter.mm

Issue 1063933003: MacViews: Allow views::Widgets to be parented off NSWindows (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@20150401-MacViews-AppInfo-Standalone
Patch Set: fix gyp Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(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 "ui/views/cocoa/widget_owner_nswindow_adapter.h"
6
7 #import <Cocoa/Cocoa.h>
8
9 #include "base/logging.h"
10 #include "ui/gfx/geometry/rect.h"
11 #include "ui/gfx/geometry/vector2d.h"
12 #import "ui/gfx/mac/coordinate_conversion.h"
13 #import "ui/views/cocoa/bridged_native_widget.h"
14
15 // Bridges an AppKit observer to observe when the (non-views) NSWindow owning a
16 // views::Widget will close.
17 @interface WidgetOwnerNSWindowAdapterBridge : NSObject {
18 @private
19 views::WidgetOwnerNSWindowAdapter* adapter_; // Weak. Owns us.
20 }
21 - (id)initWithAdapter:(views::WidgetOwnerNSWindowAdapter*)adapter;
Andre 2015/05/07 17:32:37 Use instancetype for the return type.
tapted 2015/05/07 23:43:50 Done.
22 - (void)windowWillClose:(NSNotification*)notification;
23 @end
24
25 @implementation WidgetOwnerNSWindowAdapterBridge
26
27 - (id)initWithAdapter:(views::WidgetOwnerNSWindowAdapter*)adapter {
28 if ((self = [super init]))
29 adapter_ = adapter;
30 return self;
31 }
32
33 - (void)windowWillClose:(NSNotification*)notification {
34 adapter_->OnWindowWillClose();
35 }
36
37 @end
38
39 namespace views {
40
41 WidgetOwnerNSWindowAdapter::WidgetOwnerNSWindowAdapter(
42 BridgedNativeWidget* child,
43 NSView* anchor_view)
44 : child_(child),
45 anchor_view_([anchor_view retain]),
46 observer_bridge_(
47 [[WidgetOwnerNSWindowAdapterBridge alloc] initWithAdapter:this]) {
48 DCHECK([anchor_view_ window]);
49 [[NSNotificationCenter defaultCenter]
50 addObserver:observer_bridge_
51 selector:@selector(windowWillClose:)
52 name:NSWindowWillCloseNotification
53 object:[anchor_view_ window]];
54 }
55
56 void WidgetOwnerNSWindowAdapter::OnWindowWillClose() {
57 [child_->ns_window() close];
58 // Note: |this| will be deleted here.
59 }
60
61 NSWindow* WidgetOwnerNSWindowAdapter::GetNSWindow() {
62 return [anchor_view_ window];
63 }
64
65 gfx::Vector2d WidgetOwnerNSWindowAdapter::ChildWindowOffset() {
66 NSWindow* window = [anchor_view_ window];
67 NSRect rect_in_window =
68 [anchor_view_ convertRect:[anchor_view_ bounds] toView:nil];
69 // Ensure we anchor off the top-left of |anchor_view_| (rect_in_window.origin
70 // is the bottom-left of the view).
71 // TODO(tapted): Use -[NSWindow convertRectToScreen:] when we ditch 10.6.
72 NSRect rect_in_screen = {{0, 0}, {0, 0}};
Andre 2015/05/07 17:32:37 NSZeroRect
tapted 2015/05/07 23:43:50 Done.
73 rect_in_screen.origin =
74 [window convertBaseToScreen:NSMakePoint(NSMinX(rect_in_window),
75 NSMaxY(rect_in_window))];
76 return gfx::ScreenRectFromNSRect(rect_in_screen).OffsetFromOrigin();
77 }
78
79 bool WidgetOwnerNSWindowAdapter::IsVisibleParent() {
80 return [[anchor_view_ window] isVisible];
81 }
82
83 void WidgetOwnerNSWindowAdapter::RemoveChildWindow(BridgedNativeWidget* child) {
84 DCHECK_EQ(child, child_);
85 [GetNSWindow() removeChildWindow:child->ns_window()];
86 delete this;
87 }
88
89 WidgetOwnerNSWindowAdapter::~WidgetOwnerNSWindowAdapter() {
90 [[NSNotificationCenter defaultCenter] removeObserver:observer_bridge_];
91 }
92
93 } // namespace views
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698