Updated all code to new format
[platform/core/uifw/dali-adaptor.git] / dali / internal / input / windows / input-method-context-impl-win.cpp
1 /*\r
2  * Copyright (c) 2021 Samsung Electronics Co., Ltd.\r
3  *\r
4  * Licensed under the Apache License, Version 2.0 (the "License");\r
5  * you may not use this file except in compliance with the License.\r
6  * You may obtain a copy of the License at\r
7  *\r
8  * http://www.apache.org/licenses/LICENSE-2.0\r
9  *\r
10  * Unless required by applicable law or agreed to in writing, software\r
11  * distributed under the License is distributed on an "AS IS" BASIS,\r
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
13  * See the License for the specific language governing permissions and\r
14  * limitations under the License.\r
15  *\r
16  */\r
17 \r
18 // CLASS HEADER\r
19 #include <dali/internal/input/windows/input-method-context-impl-win.h>\r
20 \r
21 // EXTERNAL INCLUDES\r
22 #include <dali/devel-api/common/singleton-service.h>\r
23 #include <dali/integration-api/debug.h>\r
24 #include <dali/public-api/events/key-event.h>\r
25 #include <dali/public-api/object/type-registry.h>\r
26 \r
27 // INTERNAL INCLUDES\r
28 #include <dali/integration-api/adaptor-framework/adaptor.h>\r
29 #include <dali/internal/adaptor/common/adaptor-impl.h>\r
30 #include <dali/internal/input/common/key-impl.h>\r
31 #include <dali/internal/input/common/virtual-keyboard-impl.h>\r
32 #include <dali/internal/system/common/locale-utils.h>\r
33 #include <dali/public-api/adaptor-framework/key.h>\r
34 \r
35 namespace Dali\r
36 {\r
37 namespace Internal\r
38 {\r
39 namespace Adaptor\r
40 {\r
41 namespace\r
42 {\r
43 #if defined(DEBUG_ENABLED)\r
44 Debug::Filter* gLogFilter = Debug::Filter::New(Debug::NoLogging, false, "LOG_INPUT_METHOD_CONTEXT");\r
45 #endif\r
46 } // namespace\r
47 \r
48 InputMethodContextPtr InputMethodContextWin::New(Dali::Actor actor)\r
49 {\r
50   InputMethodContextPtr manager;\r
51 \r
52   if(actor && Adaptor::IsAvailable())\r
53   {\r
54     manager = new InputMethodContextWin(actor);\r
55   }\r
56 \r
57   return manager;\r
58 }\r
59 \r
60 void InputMethodContextWin::Finalize()\r
61 {\r
62 }\r
63 \r
64 InputMethodContextWin::InputMethodContextWin(Dali::Actor actor)\r
65 : mWin32Window(0),\r
66   mIMFCursorPosition(0),\r
67   mSurroundingText(),\r
68   mRestoreAfterFocusLost(false),\r
69   mIdleCallbackConnected(false)\r
70 {\r
71   actor.OnSceneSignal().Connect(this, &InputMethodContextWin::OnStaged);\r
72 }\r
73 \r
74 InputMethodContextWin::~InputMethodContextWin()\r
75 {\r
76   Finalize();\r
77 }\r
78 \r
79 void InputMethodContextWin::Initialize()\r
80 {\r
81   CreateContext(mWin32Window);\r
82   ConnectCallbacks();\r
83 }\r
84 \r
85 void InputMethodContextWin::CreateContext(WinWindowHandle winHandle)\r
86 {\r
87   DALI_LOG_INFO(gLogFilter, Debug::General, "InputMethodContextWin::CreateContext\n");\r
88 }\r
89 \r
90 void InputMethodContextWin::DeleteContext()\r
91 {\r
92   DALI_LOG_INFO(gLogFilter, Debug::General, "InputMethodContextWin::DeleteContext\n");\r
93 }\r
94 \r
95 // Callbacks for predicitive text support.\r
96 void InputMethodContextWin::ConnectCallbacks()\r
97 {\r
98 }\r
99 \r
100 void InputMethodContextWin::DisconnectCallbacks()\r
101 {\r
102 }\r
103 \r
104 void InputMethodContextWin::Activate()\r
105 {\r
106   // Reset mIdleCallbackConnected\r
107   mIdleCallbackConnected = false;\r
108 }\r
109 \r
110 void InputMethodContextWin::Deactivate()\r
111 {\r
112   mIdleCallbackConnected = false;\r
113 }\r
114 \r
115 void InputMethodContextWin::Reset()\r
116 {\r
117   DALI_LOG_INFO(gLogFilter, Debug::General, "InputMethodContextWin::Reset\n");\r
118 }\r
119 \r
120 ImfContext* InputMethodContextWin::GetContext()\r
121 {\r
122   DALI_LOG_INFO(gLogFilter, Debug::General, "InputMethodContextWin::GetContext\n");\r
123 \r
124   return NULL;\r
125 }\r
126 \r
127 bool InputMethodContextWin::RestoreAfterFocusLost() const\r
128 {\r
129   return mRestoreAfterFocusLost;\r
130 }\r
131 \r
132 void InputMethodContextWin::SetRestoreAfterFocusLost(bool toggle)\r
133 {\r
134   mRestoreAfterFocusLost = toggle;\r
135 }\r
136 \r
137 /**\r
138  * Called when an InputMethodContext Pre-Edit changed event is received.\r
139  * We are still predicting what the user is typing.  The latest string is what the InputMethodContext module thinks\r
140  * the user wants to type.\r
141  */\r
142 void InputMethodContextWin::PreEditChanged(void*, ImfContext* imfContext, void* eventInfo)\r
143 {\r
144   DALI_LOG_INFO(gLogFilter, Debug::General, "InputMethodContextWin::PreEditChanged\n");\r
145 }\r
146 \r
147 void InputMethodContextWin::CommitReceived(void*, ImfContext* imfContext, void* eventInfo)\r
148 {\r
149   DALI_LOG_INFO(gLogFilter, Debug::General, "InputMethodContextWin::CommitReceived\n");\r
150 \r
151   if(Dali::Adaptor::IsAvailable())\r
152   {\r
153     const std::string keyString(static_cast<char*>(eventInfo));\r
154 \r
155     Dali::InputMethodContext               handle(this);\r
156     Dali::InputMethodContext::EventData    eventData(Dali::InputMethodContext::COMMIT, keyString, 0, 0);\r
157     Dali::InputMethodContext::CallbackData callbackData = mEventSignal.Emit(handle, eventData);\r
158 \r
159     if(callbackData.update)\r
160     {\r
161       mIMFCursorPosition = static_cast<int>(callbackData.cursorPosition);\r
162 \r
163       NotifyCursorPosition();\r
164     }\r
165   }\r
166 }\r
167 \r
168 /**\r
169  * Called when an InputMethodContext retrieve surround event is received.\r
170  * Here the InputMethodContext module wishes to know the string we are working with and where within the string the cursor is\r
171  * We need to signal the application to tell us this information.\r
172  */\r
173 bool InputMethodContextWin::RetrieveSurrounding(void* data, ImfContext* imfContext, char** text, int* cursorPosition)\r
174 {\r
175   DALI_LOG_INFO(gLogFilter, Debug::General, "InputMethodContextWin::RetrieveSurrounding\n");\r
176 \r
177   Dali::InputMethodContext::EventData    imfData(Dali::InputMethodContext::GET_SURROUNDING, std::string(), 0, 0);\r
178   Dali::InputMethodContext               handle(this);\r
179   Dali::InputMethodContext::CallbackData callbackData = mEventSignal.Emit(handle, imfData);\r
180 \r
181   if(callbackData.update)\r
182   {\r
183     if(text)\r
184     {\r
185       *text = strdup(callbackData.currentText.c_str());\r
186     }\r
187 \r
188     if(cursorPosition)\r
189     {\r
190       mIMFCursorPosition = static_cast<int>(callbackData.cursorPosition);\r
191       *cursorPosition    = mIMFCursorPosition;\r
192     }\r
193   }\r
194 \r
195   return true;\r
196 }\r
197 \r
198 /**\r
199  * Called when an InputMethodContext delete surrounding event is received.\r
200  * Here we tell the application that it should delete a certain range.\r
201  */\r
202 void InputMethodContextWin::DeleteSurrounding(void* data, ImfContext* imfContext, void* eventInfo)\r
203 {\r
204   DALI_LOG_INFO(gLogFilter, Debug::General, "InputMethodContextWin::DeleteSurrounding\n");\r
205 }\r
206 \r
207 void InputMethodContextWin::NotifyCursorPosition()\r
208 {\r
209   DALI_LOG_INFO(gLogFilter, Debug::General, "InputMethodContextWin::NotifyCursorPosition\n");\r
210 }\r
211 \r
212 void InputMethodContextWin::SetCursorPosition(unsigned int cursorPosition)\r
213 {\r
214   DALI_LOG_INFO(gLogFilter, Debug::General, "InputMethodContextWin::SetCursorPosition\n");\r
215 \r
216   mIMFCursorPosition = static_cast<int>(cursorPosition);\r
217 }\r
218 \r
219 unsigned int InputMethodContextWin::GetCursorPosition() const\r
220 {\r
221   DALI_LOG_INFO(gLogFilter, Debug::General, "InputMethodContextWin::GetCursorPosition\n");\r
222 \r
223   return static_cast<unsigned int>(mIMFCursorPosition);\r
224 }\r
225 \r
226 void InputMethodContextWin::SetSurroundingText(const std::string& text)\r
227 {\r
228   DALI_LOG_INFO(gLogFilter, Debug::General, "InputMethodContextWin::SetSurroundingText\n");\r
229 \r
230   mSurroundingText = text;\r
231 }\r
232 \r
233 const std::string& InputMethodContextWin::GetSurroundingText() const\r
234 {\r
235   DALI_LOG_INFO(gLogFilter, Debug::General, "InputMethodContextWin::GetSurroundingText\n");\r
236 \r
237   return mSurroundingText;\r
238 }\r
239 \r
240 void InputMethodContextWin::NotifyTextInputMultiLine(bool multiLine)\r
241 {\r
242 }\r
243 \r
244 Dali::InputMethodContext::TextDirection InputMethodContextWin::GetTextDirection()\r
245 {\r
246   Dali::InputMethodContext::TextDirection direction(Dali::InputMethodContext::LEFT_TO_RIGHT);\r
247 \r
248   return direction;\r
249 }\r
250 \r
251 Rect<int> InputMethodContextWin::GetInputMethodArea()\r
252 {\r
253   int xPos, yPos, width, height;\r
254 \r
255   width = height = xPos = yPos = 0;\r
256 \r
257   return Rect<int>(xPos, yPos, width, height);\r
258 }\r
259 \r
260 void InputMethodContextWin::ApplyOptions(const InputMethodOptions& options)\r
261 {\r
262   using namespace Dali::InputMethod::Category;\r
263 \r
264   int index;\r
265 \r
266   if(mOptions.CompareAndSet(PANEL_LAYOUT, options, index))\r
267   {\r
268   }\r
269   if(mOptions.CompareAndSet(BUTTON_ACTION, options, index))\r
270   {\r
271   }\r
272   if(mOptions.CompareAndSet(AUTO_CAPITALIZE, options, index))\r
273   {\r
274   }\r
275   if(mOptions.CompareAndSet(VARIATION, options, index))\r
276   {\r
277   }\r
278 }\r
279 \r
280 void InputMethodContextWin::SetInputPanelData(const std::string& data)\r
281 {\r
282   DALI_LOG_INFO(gLogFilter, Debug::General, "InputMethodContextWin::SetInputPanelData\n");\r
283 }\r
284 \r
285 void InputMethodContextWin::GetInputPanelData(std::string& data)\r
286 {\r
287   DALI_LOG_INFO(gLogFilter, Debug::General, "InputMethodContextWin::GetInputPanelData\n");\r
288 }\r
289 \r
290 Dali::InputMethodContext::State InputMethodContextWin::GetInputPanelState()\r
291 {\r
292   DALI_LOG_INFO(gLogFilter, Debug::General, "InputMethodContextWin::GetInputPanelState\n");\r
293   return Dali::InputMethodContext::DEFAULT;\r
294 }\r
295 \r
296 void InputMethodContextWin::SetReturnKeyState(bool visible)\r
297 {\r
298   DALI_LOG_INFO(gLogFilter, Debug::General, "InputMethodContextWin::SetReturnKeyState\n");\r
299 }\r
300 \r
301 void InputMethodContextWin::AutoEnableInputPanel(bool enabled)\r
302 {\r
303   DALI_LOG_INFO(gLogFilter, Debug::General, "InputMethodContextWin::AutoEnableInputPanel\n");\r
304 }\r
305 \r
306 void InputMethodContextWin::ShowInputPanel()\r
307 {\r
308   DALI_LOG_INFO(gLogFilter, Debug::General, "InputMethodContextWin::ShowInputPanel\n");\r
309 }\r
310 \r
311 void InputMethodContextWin::HideInputPanel()\r
312 {\r
313   DALI_LOG_INFO(gLogFilter, Debug::General, "InputMethodContextWin::HideInputPanel\n");\r
314 }\r
315 \r
316 Dali::InputMethodContext::KeyboardType InputMethodContextWin::GetKeyboardType()\r
317 {\r
318   return Dali::InputMethodContext::KeyboardType::SOFTWARE_KEYBOARD;\r
319 }\r
320 \r
321 std::string InputMethodContextWin::GetInputPanelLocale()\r
322 {\r
323   DALI_LOG_INFO(gLogFilter, Debug::General, "InputMethodContextWin::GetInputPanelLocale\n");\r
324 \r
325   std::string locale = "";\r
326   return locale;\r
327 }\r
328 \r
329 void InputMethodContextWin::SetContentMIMETypes(const std::string& mimeTypes)\r
330 {\r
331   DALI_LOG_INFO(gLogFilter, Debug::General, "InputMethodContextWin::SetContentMIMETypes\n");\r
332 }\r
333 \r
334 bool InputMethodContextWin::FilterEventKey(const Dali::KeyEvent& keyEvent)\r
335 {\r
336   bool eventHandled(false);\r
337 \r
338   if(!KeyLookup::IsDeviceButton(keyEvent.GetKeyName().c_str()))\r
339   {\r
340     //check whether it's key down or key up event\r
341     if(keyEvent.GetState() == Dali::KeyEvent::DOWN)\r
342     {\r
343       eventHandled = ProcessEventKeyDown(keyEvent);\r
344     }\r
345     else if(keyEvent.GetState() == Dali::KeyEvent::UP)\r
346     {\r
347       eventHandled = ProcessEventKeyUp(keyEvent);\r
348     }\r
349   }\r
350 \r
351   return eventHandled;\r
352 }\r
353 \r
354 void InputMethodContextWin::SetInputPanelLanguage(Dali::InputMethodContext::InputPanelLanguage language)\r
355 {\r
356   DALI_LOG_INFO(gLogFilter, Debug::General, "InputMethodContextWin::SetInputPanelLanguage\n");\r
357 }\r
358 \r
359 Dali::InputMethodContext::InputPanelLanguage InputMethodContextWin::GetInputPanelLanguage() const\r
360 {\r
361   DALI_LOG_INFO(gLogFilter, Debug::General, "InputMethodContextWin::GetInputPanelLanguage\n");\r
362   return Dali::InputMethodContext::InputPanelLanguage::AUTOMATIC;\r
363 }\r
364 \r
365 void InputMethodContextWin::SetInputPanelPosition(unsigned int x, unsigned int y)\r
366 {\r
367   DALI_LOG_INFO(gLogFilter, Debug::General, "InputMethodContextWin::SetInputPanelPosition\n");\r
368 }\r
369 \r
370 void InputMethodContextWin::GetPreeditStyle(Dali::InputMethodContext::PreEditAttributeDataContainer& attrs) const\r
371 {\r
372   DALI_LOG_INFO(gLogFilter, Debug::General, "InputMethodContextWin::GetPreeditStyle\n");\r
373   attrs = mPreeditAttrs;\r
374 }\r
375 \r
376 bool InputMethodContextWin::ProcessEventKeyDown(const Dali::KeyEvent& keyEvent)\r
377 {\r
378   bool eventHandled(false);\r
379   return eventHandled;\r
380 }\r
381 \r
382 bool InputMethodContextWin::ProcessEventKeyUp(const Dali::KeyEvent& keyEvent)\r
383 {\r
384   bool eventHandled(false);\r
385   return eventHandled;\r
386 }\r
387 \r
388 void InputMethodContextWin::OnStaged(Dali::Actor actor)\r
389 {\r
390   WinWindowHandle winWindow(AnyCast<WinWindowHandle>(Dali::Integration::SceneHolder::Get(actor).GetNativeHandle()));\r
391 \r
392   if(mWin32Window != winWindow)\r
393   {\r
394     mWin32Window = winWindow;\r
395 \r
396     // Reset\r
397     Finalize();\r
398     Initialize();\r
399   }\r
400 }\r
401 \r
402 } // namespace Adaptor\r
403 \r
404 } // namespace Internal\r
405 \r
406 } // namespace Dali\r