summaryrefslogtreecommitdiff
path: root/chromium/ui/base/ime/input_method_factory.h
blob: b7386205521644e04e8627cff154a11a77bef5d4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
// Copyright (c) 2011 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.

#ifndef UI_BASE_IME_INPUT_METHOD_FACTORY_H_
#define UI_BASE_IME_INPUT_METHOD_FACTORY_H_

#include "base/basictypes.h"
#include "base/compiler_specific.h"
#include "base/memory/scoped_ptr.h"
#include "ui/base/ime/input_method_initializer.h"
#include "ui/base/ui_export.h"
#include "ui/gfx/native_widget_types.h"

template <typename T> struct DefaultSingletonTraits;

namespace ui {
namespace internal {
class InputMethodDelegate;
}  // namespace internal

class InputMethod;

class UI_EXPORT InputMethodFactory {
 public:
  // Returns the current active factory.
  // If no factory was set, sets the DefaultInputMethodFactory by default.  Once
  // a factory was set, you cannot change the factory, and always the same
  // factory is returned.
  static InputMethodFactory* GetInstance();

  // Sets an InputMethodFactory to be used.
  // This function must be called at most once.  |instance| is not owned by this
  // class or marked automatically as a leaky object.  It's a caller's duty to
  // destroy the object or mark it as leaky.
  static void SetInstance(InputMethodFactory* instance);

  virtual ~InputMethodFactory() {}

  // Creates and returns an input method implementation.
  virtual scoped_ptr<InputMethod> CreateInputMethod(
      internal::InputMethodDelegate* delegate,
      gfx::AcceleratedWidget widget) = 0;

 private:
  static void ClearInstance();

  friend UI_EXPORT void ShutdownInputMethod();
  friend UI_EXPORT void ShutdownInputMethodForTesting();
};

class DefaultInputMethodFactory : public InputMethodFactory {
 public:
  // For Singleton
  static DefaultInputMethodFactory* GetInstance();

  // Overridden from InputMethodFactory.
  virtual scoped_ptr<InputMethod> CreateInputMethod(
      internal::InputMethodDelegate* delegate,
      gfx::AcceleratedWidget widget) OVERRIDE;

 private:
  DefaultInputMethodFactory() {}

  friend struct DefaultSingletonTraits<DefaultInputMethodFactory>;

  DISALLOW_COPY_AND_ASSIGN(DefaultInputMethodFactory);
};

class MockInputMethodFactory : public InputMethodFactory {
 public:
  // For Singleton
  static MockInputMethodFactory* GetInstance();

  // Overridden from InputMethodFactory.
  virtual scoped_ptr<InputMethod> CreateInputMethod(
      internal::InputMethodDelegate* delegate,
      gfx::AcceleratedWidget widget) OVERRIDE;

 private:
  MockInputMethodFactory() {}

  friend struct DefaultSingletonTraits<MockInputMethodFactory>;

  DISALLOW_COPY_AND_ASSIGN(MockInputMethodFactory);
};

// Shorthand for
// InputMethodFactory::GetInstance()->CreateInputMethod(delegate, widget).
UI_EXPORT scoped_ptr<InputMethod> CreateInputMethod(
    internal::InputMethodDelegate* delegate,
    gfx::AcceleratedWidget widget);

// Shorthand for InputMethodFactory::SetInstance(new MockInputMethodFactory()).
// TODO(yukishiino): Retires this shorthand, and makes ui::InitializeInputMethod
// and ui::InitializeInputMethodForTesting set the appropriate factory.
UI_EXPORT void SetUpInputMethodFactoryForTesting();

#if defined(OS_WIN)
// Returns a shared input method object for the platform. Caller must not
// delete the object. Currently supported only on Windows. This method is
// for non-Aura environment, where only one input method object is created for
// the browser process.
UI_EXPORT InputMethod* GetSharedInputMethod();

namespace internal {
// Destroys the shared input method object returned by GetSharedInputMethod().
// This function must be called only from input_method_initializer.cc.
void DestroySharedInputMethod();
}  // namespace internal
#endif

}  // namespace ui;

#endif  // UI_BASE_IME_INPUT_METHOD_FACTORY_H_