Home | History | Annotate | Download | only in cocoa
      1 // Copyright 2014 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/bridged_native_widget.h"
      6 
      7 #include "base/logging.h"
      8 #include "ui/base/ime/input_method.h"
      9 #include "ui/base/ime/input_method_factory.h"
     10 #include "ui/base/ui_base_switches_util.h"
     11 #import "ui/views/cocoa/bridged_content_view.h"
     12 #include "ui/views/ime/input_method_bridge.h"
     13 #include "ui/views/ime/null_input_method.h"
     14 #include "ui/views/view.h"
     15 #include "ui/views/widget/widget.h"
     16 
     17 namespace views {
     18 
     19 BridgedNativeWidget::BridgedNativeWidget() {
     20 }
     21 
     22 BridgedNativeWidget::~BridgedNativeWidget() {
     23   SetRootView(NULL);
     24 }
     25 
     26 void BridgedNativeWidget::Init(base::scoped_nsobject<NSWindow> window) {
     27   DCHECK(!window_);
     28   window_.swap(window);
     29 }
     30 
     31 void BridgedNativeWidget::SetRootView(views::View* view) {
     32   if (view == [bridged_view_ hostedView])
     33     return;
     34 
     35   [bridged_view_ clearView];
     36   bridged_view_.reset();
     37   // Note that there can still be references to the old |bridged_view_|
     38   // floating around in Cocoa libraries at this point. However, references to
     39   // the old views::View will be gone, so any method calls will become no-ops.
     40 
     41   if (view) {
     42     bridged_view_.reset([[BridgedContentView alloc] initWithView:view]);
     43     // Objective C initializers can return nil. However, if |view| is non-NULL
     44     // this should be treated as an error and caught early.
     45     CHECK(bridged_view_);
     46   }
     47   [window_ setContentView:bridged_view_];
     48 }
     49 
     50 InputMethod* BridgedNativeWidget::CreateInputMethod() {
     51   if (switches::IsTextInputFocusManagerEnabled())
     52     return new NullInputMethod();
     53 
     54   return new InputMethodBridge(this, GetHostInputMethod(), true);
     55 }
     56 
     57 ui::InputMethod* BridgedNativeWidget::GetHostInputMethod() {
     58   if (!input_method_) {
     59     // Delegate is NULL because Mac IME does not need DispatchKeyEventPostIME
     60     // callbacks.
     61     input_method_ = ui::CreateInputMethod(NULL, nil);
     62   }
     63   return input_method_.get();
     64 }
     65 
     66 ////////////////////////////////////////////////////////////////////////////////
     67 // BridgedNativeWidget, internal::InputMethodDelegate:
     68 
     69 void BridgedNativeWidget::DispatchKeyEventPostIME(const ui::KeyEvent& key) {
     70   // Mac key events don't go through this, but some unit tests that use
     71   // MockInputMethod do.
     72   Widget* widget = [bridged_view_ hostedView]->GetWidget();
     73   widget->OnKeyEvent(const_cast<ui::KeyEvent*>(&key));
     74   if (!key.handled() && widget->GetFocusManager())
     75     widget->GetFocusManager()->OnKeyEvent(key);
     76 }
     77 
     78 }  // namespace views
     79