blob: 616dd22bd24f9773e9d4e1abb9db263e96556a4a [file] [log] [blame]
// Copyright (c) 2012 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.
#include "ui/base/ime/input_method_factory.h"
#include "base/memory/singleton.h"
#include "ui/base/ime/mock_input_method.h"
#if defined(OS_CHROMEOS) && defined(USE_X11)
#include "ui/base/ime/input_method_ibus.h"
#elif defined(OS_WIN)
#include "base/win/metro.h"
#include "ui/base/ime/input_method_imm32.h"
#include "ui/base/ime/input_method_tsf.h"
#include "ui/base/ime/remote_input_method_win.h"
#elif defined(USE_AURA) && defined(USE_X11)
#include "ui/base/ime/input_method_auralinux.h"
#else
#include "ui/base/ime/input_method_minimal.h"
#endif
namespace {
ui::InputMethodFactory* g_input_method_factory = NULL;
#if defined(OS_WIN)
ui::InputMethod* g_shared_input_method = NULL;
#endif
} // namespace
namespace ui {
// static
InputMethodFactory* InputMethodFactory::GetInstance() {
if (!g_input_method_factory)
SetInstance(DefaultInputMethodFactory::GetInstance());
return g_input_method_factory;
}
// static
void InputMethodFactory::SetInstance(InputMethodFactory* instance) {
CHECK(!g_input_method_factory);
CHECK(instance);
g_input_method_factory = instance;
}
// static
void InputMethodFactory::ClearInstance() {
// It's a client's duty to delete the object.
g_input_method_factory = NULL;
}
// DefaultInputMethodFactory
// static
DefaultInputMethodFactory* DefaultInputMethodFactory::GetInstance() {
return Singleton<DefaultInputMethodFactory>::get();
}
scoped_ptr<InputMethod> DefaultInputMethodFactory::CreateInputMethod(
internal::InputMethodDelegate* delegate,
gfx::AcceleratedWidget widget) {
#if defined(OS_CHROMEOS) && defined(USE_X11)
return scoped_ptr<InputMethod>(new InputMethodIBus(delegate));
#elif defined(OS_WIN)
if (base::win::IsTSFAwareRequired())
return scoped_ptr<InputMethod>(new InputMethodTSF(delegate, widget));
if (IsRemoteInputMethodWinRequired(widget))
return CreateRemoteInputMethodWin(delegate);
return scoped_ptr<InputMethod>(new InputMethodIMM32(delegate, widget));
#elif defined(USE_AURA) && defined(USE_X11)
return scoped_ptr<InputMethod>(new InputMethodAuraLinux(delegate));
#else
return scoped_ptr<InputMethod>(new InputMethodMinimal(delegate));
#endif
}
// MockInputMethodFactory
// static
MockInputMethodFactory* MockInputMethodFactory::GetInstance() {
return Singleton<MockInputMethodFactory>::get();
}
scoped_ptr<InputMethod> MockInputMethodFactory::CreateInputMethod(
internal::InputMethodDelegate* delegate,
gfx::AcceleratedWidget /* widget */) {
return scoped_ptr<InputMethod>(new MockInputMethod(delegate));
}
// Shorthands
scoped_ptr<InputMethod> CreateInputMethod(
internal::InputMethodDelegate* delegate,
gfx::AcceleratedWidget widget) {
return InputMethodFactory::GetInstance()->CreateInputMethod(delegate, widget);
}
void SetUpInputMethodFactoryForTesting() {
InputMethodFactory::SetInstance(MockInputMethodFactory::GetInstance());
}
#if defined(OS_WIN)
InputMethod* GetSharedInputMethod() {
if (!g_shared_input_method)
g_shared_input_method = CreateInputMethod(NULL, NULL).release();
return g_shared_input_method;
}
namespace internal {
void DestroySharedInputMethod() {
delete g_shared_input_method;
g_shared_input_method = NULL;
}
} // namespace internal
#endif
} // namespace ui