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