Chromium Code Reviews| Index: ui/views/controls/native/native_view_host_mac.mm |
| diff --git a/ui/views/controls/native/native_view_host_mac.mm b/ui/views/controls/native/native_view_host_mac.mm |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..23cd8d568af420a73238cada0a0f2a11d98001e9 |
| --- /dev/null |
| +++ b/ui/views/controls/native/native_view_host_mac.mm |
| @@ -0,0 +1,141 @@ |
| +// Copyright 2014 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 "ui/views/controls/native/native_view_host_mac.h" |
| + |
| +#import <Cocoa/Cocoa.h> |
| + |
| +#include "base/logging.h" |
| +#include "base/mac/foundation_util.h" |
| +#import "ui/views/cocoa/bridged_content_view.h" |
| +#include "ui/views/controls/native/native_view_host.h" |
| +#include "ui/views/widget/widget.h" |
| + |
| +namespace views { |
| +namespace { |
| + |
| +// Reparents |native_view| to be a child of the native content view of |
| +// |new_parent|. |
| +void ReparentNSView(NSView* native_view, Widget* new_parent) { |
| + DCHECK(native_view); |
| + // Mac's NativeViewHost has no support for hosting its own child widgets. |
| + // This check is probably overly restrictive, since the Widget containing the |
| + // NativeViewHost _is_ allowed child Widgets. However, we don't know yet |
| + // whether those child Widgets need to be distinguished from Widgets that code |
| + // might want to associate with the hosted NSView instead. |
| + { |
| + Widget::Widgets child_widgets; |
| + Widget::GetAllChildWidgets(native_view, &child_widgets); |
| + CHECK_GE(1u, child_widgets.size()); // 1 (itself) or 0 if detached. |
| + } |
| + |
| + if (!new_parent) { |
| + [native_view removeFromSuperview]; |
| + return; |
| + } |
| + |
| + BridgedContentView* new_superview = |
| + base::mac::ObjCCastStrict<BridgedContentView>( |
| + new_parent->GetNativeView()); |
| + DCHECK(new_superview); |
| + [new_superview addSubview:native_view]; |
| +} |
| + |
| +} // namespace |
| + |
| +NativeViewHostMac::NativeViewHostMac(NativeViewHost* host) : host_(host) { |
| +} |
| + |
| +NativeViewHostMac::~NativeViewHostMac() { |
| +} |
| + |
| +//////////////////////////////////////////////////////////////////////////////// |
| +// NativeViewHostMac, NativeViewHostWrapper implementation: |
| + |
| +void NativeViewHostMac::AttachNativeView() { |
| + DCHECK(host_->native_view()); |
| + ReparentNSView(host_->native_view(), host_->GetWidget()); |
| + host_->Layout(); |
| +} |
| + |
| +void NativeViewHostMac::NativeViewDetaching(bool destroyed) { |
| + RemovedFromWidget(); |
| +} |
| + |
| +void NativeViewHostMac::AddedToWidget() { |
| + if (!host_->native_view()) |
| + return; |
| + |
| + AttachNativeView(); |
| +} |
| + |
| +void NativeViewHostMac::RemovedFromWidget() { |
| + if (!host_->native_view()) |
| + return; |
| + |
| + ReparentNSView(host_->native_view(), NULL); |
| + [host_->native_view() setHidden:YES]; |
| +} |
| + |
| +void NativeViewHostMac::InstallClip(int x, int y, int w, int h) { |
| + NOTIMPLEMENTED(); |
| +} |
| + |
| +bool NativeViewHostMac::HasInstalledClip() { |
| + return false; |
| +} |
| + |
| +void NativeViewHostMac::UninstallClip() { |
| + NOTIMPLEMENTED(); |
| +} |
| + |
| +void NativeViewHostMac::ShowWidget(int x, int y, int w, int h) { |
| + if (host_->fast_resize()) |
| + NOTIMPLEMENTED(); |
| + |
| + // Coordinates will be from the top left of the parent Widget. The NativeView |
| + // is already in the same NSWindow, so just flip to get Cooca coordinates and |
| + // then convert to the containing view. |
| + NSRect window_rect = NSMakeRect( |
| + x, |
| + host_->GetWidget()->GetClientAreaBoundsInScreen().height() - y - h, |
| + w, |
| + h); |
| + |
| + // Convert window coordinates to the hosted view's superview, since that's how |
| + // coordinates of the hosted view's frame is based. |
| + NSRect container_rect = |
| + [[host_->native_view() superview] convertRect:window_rect fromView:nil]; |
| + [host_->native_view() setFrame:container_rect]; |
| + [host_->native_view() setHidden:NO]; |
| +} |
| + |
| +void NativeViewHostMac::HideWidget() { |
| + [host_->native_view() setHidden:YES]; |
| +} |
| + |
| +void NativeViewHostMac::SetFocus() { |
| + [[host_->native_view() window] makeFirstResponder:host_->native_view()]; |
|
Andre
2014/09/17 20:57:13
From -[NSWindow makeFirstResponder:] documentation
tapted
2014/09/18 08:40:14
Done.
|
| +} |
| + |
| +void NativeViewHostMac::SetNativeViewVisible(bool visible) { |
| + [host_->native_view() setHidden:!visible]; |
| +} |
| + |
| +gfx::NativeViewAccessible NativeViewHostMac::GetNativeViewAccessible() { |
| + return NULL; |
| +} |
| + |
| +gfx::NativeCursor NativeViewHostMac::GetCursor(int x, int y) { |
| + NOTIMPLEMENTED(); |
| + return gfx::kNullCursor; |
| +} |
| + |
| +// static |
| +NativeViewHostWrapper* NativeViewHostWrapper::CreateWrapper( |
| + NativeViewHost* host) { |
| + return new NativeViewHostMac(host); |
| +} |
| + |
| +} // namespace views |