da87701adb7444d01532d45f6b9a535d1f3574aa
[platform/framework/web/crosswalk.git] / src / ui / base / ime / chromeos / ime_bridge.cc
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 #include "ui/base/ime/chromeos/ime_bridge.h"
6
7 #include <map>
8 #include "base/logging.h"
9 #include "base/memory/singleton.h"
10
11 namespace chromeos {
12
13 static IMEBridge* g_ime_bridge = NULL;
14
15 // An implementation of IMEBridge.
16 class IMEBridgeImpl : public IMEBridge {
17  public:
18   IMEBridgeImpl()
19     : input_context_handler_(NULL),
20       engine_handler_(NULL),
21       candidate_window_handler_(NULL) {
22   }
23
24   virtual ~IMEBridgeImpl() {
25   }
26
27   // IMEBridge override.
28   virtual IBusInputContextHandlerInterface*
29       GetInputContextHandler() const OVERRIDE {
30     return input_context_handler_;
31   }
32
33   // IMEBridge override.
34   virtual void SetInputContextHandler(
35       IBusInputContextHandlerInterface* handler) OVERRIDE {
36     input_context_handler_ = handler;
37   }
38
39   // IMEBridge override.
40   virtual void SetEngineHandler(
41       const std::string& engine_id,
42       IMEEngineHandlerInterface* handler) OVERRIDE {
43     DCHECK(!engine_id.empty());
44     DCHECK(handler);
45     engine_handler_map_[engine_id] = handler;
46   }
47
48   // IMEBridge override.
49   virtual IMEEngineHandlerInterface* GetEngineHandler(
50       const std::string& engine_id) OVERRIDE {
51     if (engine_id.empty() ||
52         engine_handler_map_.find(engine_id) == engine_handler_map_.end()) {
53       return NULL;
54     }
55     return engine_handler_map_[engine_id];
56   }
57
58   // IMEBridge override.
59   virtual void SetCurrentEngineHandler(
60       IMEEngineHandlerInterface* handler) OVERRIDE {
61     engine_handler_ = handler;
62   }
63
64   // IMEBridge override.
65   virtual IMEEngineHandlerInterface* SetCurrentEngineHandlerById(
66       const std::string& engine_id) OVERRIDE {
67     std::map<std::string, IMEEngineHandlerInterface*>::const_iterator itor =
68         engine_handler_map_.find(engine_id);
69     // |engine_id| must be found unless it's empty, but if it's not found, fall
70     // back to NULL when non-debug build.
71     DCHECK(itor != engine_handler_map_.end() || engine_id.empty());
72     if (itor == engine_handler_map_.end()) {
73       engine_handler_ = NULL;
74       return NULL;
75     }
76
77     engine_handler_ = engine_handler_map_[engine_id];
78     return engine_handler_;
79   }
80
81   // IMEBridge override.
82   virtual IMEEngineHandlerInterface* GetCurrentEngineHandler() const OVERRIDE {
83     return engine_handler_;
84   }
85
86   // IMEBridge override.
87   virtual IBusPanelCandidateWindowHandlerInterface*
88   GetCandidateWindowHandler() const OVERRIDE {
89     return candidate_window_handler_;
90   }
91
92   // IMEBridge override.
93   virtual void SetCandidateWindowHandler(
94       IBusPanelCandidateWindowHandlerInterface* handler) OVERRIDE {
95     candidate_window_handler_ = handler;
96   }
97
98  private:
99   IBusInputContextHandlerInterface* input_context_handler_;
100   IMEEngineHandlerInterface* engine_handler_;
101   IBusPanelCandidateWindowHandlerInterface* candidate_window_handler_;
102   std::map<std::string, IMEEngineHandlerInterface*> engine_handler_map_;
103
104   DISALLOW_COPY_AND_ASSIGN(IMEBridgeImpl);
105 };
106
107 ///////////////////////////////////////////////////////////////////////////////
108 // IMEBridge
109 IMEBridge::IMEBridge() {
110 }
111
112 IMEBridge::~IMEBridge() {
113 }
114
115 // static.
116 void IMEBridge::Initialize() {
117   if (!g_ime_bridge)
118     g_ime_bridge = new IMEBridgeImpl();
119 }
120
121 // static.
122 void IMEBridge::Shutdown() {
123   delete g_ime_bridge;
124   g_ime_bridge = NULL;
125 }
126
127 // static.
128 IMEBridge* IMEBridge::Get() {
129   return g_ime_bridge;
130 }
131
132 }  // namespace chromeos