Home | History | Annotate | Download | only in ime
      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.
      4 
      5 #include "ui/base/ime/input_method_factory.h"
      6 
      7 #include "base/memory/singleton.h"
      8 #include "ui/base/ime/mock_input_method.h"
      9 
     10 #if defined(OS_CHROMEOS) && defined(USE_X11)
     11 #include "ui/base/ime/input_method_ibus.h"
     12 #elif defined(OS_WIN)
     13 #include "base/win/metro.h"
     14 #include "ui/base/ime/input_method_imm32.h"
     15 #include "ui/base/ime/input_method_tsf.h"
     16 #include "ui/base/ime/remote_input_method_win.h"
     17 #elif defined(USE_AURA) && defined(USE_X11)
     18 #include "ui/base/ime/input_method_auralinux.h"
     19 #else
     20 #include "ui/base/ime/input_method_minimal.h"
     21 #endif
     22 
     23 namespace {
     24 
     25 ui::InputMethodFactory* g_input_method_factory = NULL;
     26 
     27 #if defined(OS_WIN)
     28 ui::InputMethod* g_shared_input_method = NULL;
     29 #endif
     30 
     31 }  // namespace
     32 
     33 namespace ui {
     34 
     35 // static
     36 InputMethodFactory* InputMethodFactory::GetInstance() {
     37   if (!g_input_method_factory)
     38     SetInstance(DefaultInputMethodFactory::GetInstance());
     39 
     40   return g_input_method_factory;
     41 }
     42 
     43 // static
     44 void InputMethodFactory::SetInstance(InputMethodFactory* instance) {
     45   CHECK(!g_input_method_factory);
     46   CHECK(instance);
     47 
     48   g_input_method_factory = instance;
     49 }
     50 
     51 // static
     52 void InputMethodFactory::ClearInstance() {
     53   // It's a client's duty to delete the object.
     54   g_input_method_factory = NULL;
     55 }
     56 
     57 // DefaultInputMethodFactory
     58 
     59 // static
     60 DefaultInputMethodFactory* DefaultInputMethodFactory::GetInstance() {
     61   return Singleton<DefaultInputMethodFactory>::get();
     62 }
     63 
     64 scoped_ptr<InputMethod> DefaultInputMethodFactory::CreateInputMethod(
     65     internal::InputMethodDelegate* delegate,
     66     gfx::AcceleratedWidget widget) {
     67 #if defined(OS_CHROMEOS) && defined(USE_X11)
     68   return scoped_ptr<InputMethod>(new InputMethodIBus(delegate));
     69 #elif defined(OS_WIN)
     70   if (base::win::IsTSFAwareRequired())
     71     return scoped_ptr<InputMethod>(new InputMethodTSF(delegate, widget));
     72   if (IsRemoteInputMethodWinRequired(widget))
     73     return CreateRemoteInputMethodWin(delegate);
     74   return scoped_ptr<InputMethod>(new InputMethodIMM32(delegate, widget));
     75 #elif defined(USE_AURA) && defined(USE_X11)
     76   return scoped_ptr<InputMethod>(new InputMethodAuraLinux(delegate));
     77 #else
     78   return scoped_ptr<InputMethod>(new InputMethodMinimal(delegate));
     79 #endif
     80 }
     81 
     82 // MockInputMethodFactory
     83 
     84 // static
     85 MockInputMethodFactory* MockInputMethodFactory::GetInstance() {
     86   return Singleton<MockInputMethodFactory>::get();
     87 }
     88 
     89 scoped_ptr<InputMethod> MockInputMethodFactory::CreateInputMethod(
     90     internal::InputMethodDelegate* delegate,
     91     gfx::AcceleratedWidget /* widget */) {
     92   return scoped_ptr<InputMethod>(new MockInputMethod(delegate));
     93 }
     94 
     95 // Shorthands
     96 
     97 scoped_ptr<InputMethod> CreateInputMethod(
     98     internal::InputMethodDelegate* delegate,
     99     gfx::AcceleratedWidget widget) {
    100   return InputMethodFactory::GetInstance()->CreateInputMethod(delegate, widget);
    101 }
    102 
    103 void SetUpInputMethodFactoryForTesting() {
    104   InputMethodFactory::SetInstance(MockInputMethodFactory::GetInstance());
    105 }
    106 
    107 #if defined(OS_WIN)
    108 InputMethod* GetSharedInputMethod() {
    109   if (!g_shared_input_method)
    110     g_shared_input_method = CreateInputMethod(NULL, NULL).release();
    111   return g_shared_input_method;
    112 }
    113 
    114 namespace internal {
    115 
    116 void DestroySharedInputMethod() {
    117   delete g_shared_input_method;
    118   g_shared_input_method = NULL;
    119 }
    120 
    121 }  // namespace internal
    122 #endif
    123 
    124 }  // namespace ui
    125