| // 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/cocoa/bridged_native_widget.h" |
| |
| #include "base/logging.h" |
| #include "ui/base/ime/input_method.h" |
| #include "ui/base/ime/input_method_factory.h" |
| #include "ui/base/ui_base_switches_util.h" |
| #import "ui/views/cocoa/bridged_content_view.h" |
| #include "ui/views/ime/input_method_bridge.h" |
| #include "ui/views/ime/null_input_method.h" |
| #include "ui/views/view.h" |
| #include "ui/views/widget/widget.h" |
| |
| namespace views { |
| |
| BridgedNativeWidget::BridgedNativeWidget() { |
| } |
| |
| BridgedNativeWidget::~BridgedNativeWidget() { |
| SetRootView(NULL); |
| } |
| |
| void BridgedNativeWidget::Init(base::scoped_nsobject<NSWindow> window) { |
| DCHECK(!window_); |
| window_.swap(window); |
| } |
| |
| void BridgedNativeWidget::SetRootView(views::View* view) { |
| if (view == [bridged_view_ hostedView]) |
| return; |
| |
| [bridged_view_ clearView]; |
| bridged_view_.reset(); |
| // Note that there can still be references to the old |bridged_view_| |
| // floating around in Cocoa libraries at this point. However, references to |
| // the old views::View will be gone, so any method calls will become no-ops. |
| |
| if (view) { |
| bridged_view_.reset([[BridgedContentView alloc] initWithView:view]); |
| // Objective C initializers can return nil. However, if |view| is non-NULL |
| // this should be treated as an error and caught early. |
| CHECK(bridged_view_); |
| } |
| [window_ setContentView:bridged_view_]; |
| } |
| |
| InputMethod* BridgedNativeWidget::CreateInputMethod() { |
| if (switches::IsTextInputFocusManagerEnabled()) |
| return new NullInputMethod(); |
| |
| return new InputMethodBridge(this, GetHostInputMethod(), true); |
| } |
| |
| ui::InputMethod* BridgedNativeWidget::GetHostInputMethod() { |
| if (!input_method_) { |
| // Delegate is NULL because Mac IME does not need DispatchKeyEventPostIME |
| // callbacks. |
| input_method_ = ui::CreateInputMethod(NULL, nil); |
| } |
| return input_method_.get(); |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| // BridgedNativeWidget, internal::InputMethodDelegate: |
| |
| void BridgedNativeWidget::DispatchKeyEventPostIME(const ui::KeyEvent& key) { |
| // Mac key events don't go through this, but some unit tests that use |
| // MockInputMethod do. |
| Widget* widget = [bridged_view_ hostedView]->GetWidget(); |
| widget->OnKeyEvent(const_cast<ui::KeyEvent*>(&key)); |
| if (!key.handled() && widget->GetFocusManager()) |
| widget->GetFocusManager()->OnKeyEvent(key); |
| } |
| |
| } // namespace views |