Merge "Add to set and get Input Panel language" into devel/master
[platform/core/uifw/dali-adaptor.git] / dali / internal / input / windows / input-method-context-impl-win.cpp
1 /*\r
2  * Copyright (c) 2018 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/public-api/events/key-event.h>\r
23 #include <dali/public-api/adaptor-framework/key.h>\r
24 #include <dali/public-api/object/type-registry.h>\r
25 #include <dali/integration-api/debug.h>\r
26 \r
27 // INTERNAL INCLUDES\r
28 #include <dali/integration-api/adaptor.h>\r
29 #include <dali/internal/adaptor/common/adaptor-impl.h>\r
30 #include <dali/internal/system/common/locale-utils.h>\r
31 #include <dali/internal/system/common/singleton-service-impl.h>\r
32 #include <dali/internal/input/common/virtual-keyboard-impl.h>\r
33 #include <dali/internal/input/common/key-impl.h>\r
34 \r
35 namespace Dali\r
36 {\r
37 \r
38 namespace Internal\r
39 {\r
40 \r
41 namespace Adaptor\r
42 {\r
43 \r
44 InputMethodContextPtr InputMethodContextWin::New()\r
45 {\r
46   InputMethodContextPtr manager;\r
47 \r
48   if ( Adaptor::IsAvailable() )\r
49   {\r
50     // Create instance and register singleton only if the adaptor is available\r
51     Adaptor& adaptorImpl( Adaptor::GetImplementation( Adaptor::Get() ) );\r
52     Any nativeWindow = adaptorImpl.GetNativeWindowHandle();\r
53 \r
54     // The Win_Window_Handle needs to use the InputMethodContext.\r
55     // Only when the render surface is window, we can get the Win_Window_Handle.\r
56     WinWindowHandle winWindow( AnyCast<WinWindowHandle>(nativeWindow) );\r
57     if ( winWindow )\r
58     {\r
59       manager = new InputMethodContextWin( winWindow );\r
60     }\r
61     else\r
62     {\r
63       DALI_LOG_ERROR("Failed to get native window handle\n");\r
64     }\r
65   }\r
66 \r
67   return manager;\r
68 }\r
69 \r
70 void InputMethodContextWin::Finalize()\r
71 {\r
72 }\r
73 \r
74 InputMethodContextWin::InputMethodContextWin( WinWindowHandle winWindow )\r
75 : mWin32Window( winWindow ),\r
76   mIMFCursorPosition( 0 ),\r
77   mSurroundingText(),\r
78   mRestoreAfterFocusLost( false ),\r
79   mIdleCallbackConnected( false )\r
80 {\r
81 }\r
82 \r
83 InputMethodContextWin::~InputMethodContextWin()\r
84 {\r
85   Finalize();\r
86 }\r
87 \r
88 void InputMethodContextWin::Initialize()\r
89 {\r
90   CreateContext( mWin32Window );\r
91   ConnectCallbacks();\r
92 }\r
93 \r
94 void InputMethodContextWin::CreateContext( WinWindowHandle winHandle )\r
95 {\r
96   DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextWin::CreateContext\n" );\r
97 }\r
98 \r
99 void InputMethodContextWin::DeleteContext()\r
100 {\r
101   DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextWin::DeleteContext\n" );\r
102 }\r
103 \r
104 // Callbacks for predicitive text support.\r
105 void InputMethodContextWin::ConnectCallbacks()\r
106 {\r
107 }\r
108 \r
109 void InputMethodContextWin::DisconnectCallbacks()\r
110 {\r
111 }\r
112 \r
113 void InputMethodContextWin::Activate()\r
114 {\r
115   // Reset mIdleCallbackConnected\r
116   mIdleCallbackConnected = false;\r
117 }\r
118 \r
119 void InputMethodContextWin::Deactivate()\r
120 {\r
121   mIdleCallbackConnected = false;\r
122 }\r
123 \r
124 void InputMethodContextWin::Reset()\r
125 {\r
126   DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextWin::Reset\n" );\r
127 }\r
128 \r
129 ImfContext* InputMethodContextWin::GetContext()\r
130 {\r
131   DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextWin::GetContext\n" );\r
132 \r
133   return NULL;\r
134 }\r
135 \r
136 bool InputMethodContextWin::RestoreAfterFocusLost() const\r
137 {\r
138   return mRestoreAfterFocusLost;\r
139 }\r
140 \r
141 void InputMethodContextWin::SetRestoreAfterFocusLost( bool toggle )\r
142 {\r
143   mRestoreAfterFocusLost = toggle;\r
144 }\r
145 \r
146 /**\r
147  * Called when an InputMethodContext Pre-Edit changed event is received.\r
148  * We are still predicting what the user is typing.  The latest string is what the InputMethodContext module thinks\r
149  * the user wants to type.\r
150  */\r
151 void InputMethodContextWin::PreEditChanged( void*, ImfContext* imfContext, void* event_info )\r
152 {\r
153   DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextWin::PreEditChanged\n" );\r
154 }\r
155 \r
156 void InputMethodContextWin::CommitReceived( void*, ImfContext* imfContext, void* event_info )\r
157 {\r
158   DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextWin::CommitReceived\n" );\r
159 \r
160   if ( Dali::Adaptor::IsAvailable() )\r
161   {\r
162     const std::string keyString( static_cast<char*>( event_info ) );\r
163 \r
164     Dali::InputMethodContext handle( this );\r
165     Dali::InputMethodContext::EventData eventData( Dali::InputMethodContext::COMMIT, keyString, 0, 0 );\r
166     Dali::InputMethodContext::CallbackData callbackData = mEventSignal.Emit( handle, eventData );\r
167 \r
168     if( callbackData.update )\r
169     {\r
170       mIMFCursorPosition = static_cast<int>( callbackData.cursorPosition );\r
171 \r
172       NotifyCursorPosition();\r
173     }\r
174   }\r
175 }\r
176 \r
177 /**\r
178  * Called when an InputMethodContext retrieve surround event is received.\r
179  * Here the InputMethodContext module wishes to know the string we are working with and where within the string the cursor is\r
180  * We need to signal the application to tell us this information.\r
181  */\r
182 bool InputMethodContextWin::RetrieveSurrounding( void* data, ImfContext* imfContext, char** text, int* cursorPosition )\r
183 {\r
184   DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextWin::RetrieveSurrounding\n" );\r
185 \r
186   Dali::InputMethodContext::EventData imfData( Dali::InputMethodContext::GET_SURROUNDING, std::string(), 0, 0 );\r
187   Dali::InputMethodContext handle( this );\r
188   Dali::InputMethodContext::CallbackData callbackData = mEventSignal.Emit( handle, imfData );\r
189 \r
190   if( callbackData.update )\r
191   {\r
192     if( text )\r
193     {\r
194       *text = strdup( callbackData.currentText.c_str() );\r
195     }\r
196 \r
197     if( cursorPosition )\r
198     {\r
199       mIMFCursorPosition = static_cast<int>( callbackData.cursorPosition );\r
200       *cursorPosition = mIMFCursorPosition;\r
201     }\r
202   }\r
203 \r
204   return true;\r
205 }\r
206 \r
207 /**\r
208  * Called when an InputMethodContext delete surrounding event is received.\r
209  * Here we tell the application that it should delete a certain range.\r
210  */\r
211 void InputMethodContextWin::DeleteSurrounding( void* data, ImfContext* imfContext, void* event_info )\r
212 {\r
213   DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextWin::DeleteSurrounding\n" );\r
214 }\r
215 \r
216 void InputMethodContextWin::NotifyCursorPosition()\r
217 {\r
218   DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextWin::NotifyCursorPosition\n" );\r
219 }\r
220 \r
221 void InputMethodContextWin::SetCursorPosition( unsigned int cursorPosition )\r
222 {\r
223   DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextWin::SetCursorPosition\n" );\r
224 \r
225   mIMFCursorPosition = static_cast<int>( cursorPosition );\r
226 }\r
227 \r
228 unsigned int InputMethodContextWin::GetCursorPosition() const\r
229 {\r
230   DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextWin::GetCursorPosition\n" );\r
231 \r
232   return static_cast<unsigned int>( mIMFCursorPosition );\r
233 }\r
234 \r
235 void InputMethodContextWin::SetSurroundingText( const std::string& text )\r
236 {\r
237   DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextWin::SetSurroundingText\n" );\r
238 \r
239   mSurroundingText = text;\r
240 }\r
241 \r
242 const std::string& InputMethodContextWin::GetSurroundingText() const\r
243 {\r
244   DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextWin::GetSurroundingText\n" );\r
245 \r
246   return mSurroundingText;\r
247 }\r
248 \r
249 void InputMethodContextWin::NotifyTextInputMultiLine( bool multiLine )\r
250 {\r
251 }\r
252 \r
253 Dali::InputMethodContext::TextDirection InputMethodContextWin::GetTextDirection()\r
254 {\r
255   Dali::InputMethodContext::TextDirection direction ( Dali::InputMethodContext::LeftToRight );\r
256 \r
257   return direction;\r
258 }\r
259 \r
260 Rect<int> InputMethodContextWin::GetInputMethodArea()\r
261 {\r
262   int xPos, yPos, width, height;\r
263 \r
264   width = height = xPos = yPos = 0;\r
265 \r
266   return Rect<int>(xPos,yPos,width,height);\r
267 }\r
268 \r
269 void InputMethodContextWin::ApplyOptions( const InputMethodOptions& options )\r
270 {\r
271   using namespace Dali::InputMethod::Category;\r
272 \r
273   int index;\r
274 \r
275   if ( mOptions.CompareAndSet(PANEL_LAYOUT, options, index) )\r
276   {\r
277   }\r
278   if ( mOptions.CompareAndSet(BUTTON_ACTION, options, index) )\r
279   {\r
280   }\r
281   if ( mOptions.CompareAndSet(AUTO_CAPITALIZE, options, index) )\r
282   {\r
283   }\r
284   if ( mOptions.CompareAndSet(VARIATION, options, index) )\r
285   {\r
286   }\r
287 }\r
288 \r
289 void InputMethodContextWin::SetInputPanelData( const std::string& data )\r
290 {\r
291   DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextWin::SetInputPanelData\n" );\r
292 }\r
293 \r
294 void InputMethodContextWin::GetInputPanelData( std::string& data )\r
295 {\r
296   DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextWin::GetInputPanelData\n" );\r
297 }\r
298 \r
299 Dali::InputMethodContext::State InputMethodContextWin::GetInputPanelState()\r
300 {\r
301   DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextWin::GetInputPanelState\n" );\r
302   return Dali::InputMethodContext::DEFAULT;\r
303 }\r
304 \r
305 void InputMethodContextWin::SetReturnKeyState( bool visible )\r
306 {\r
307   DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextWin::SetReturnKeyState\n" );\r
308 }\r
309 \r
310 void InputMethodContextWin::AutoEnableInputPanel( bool enabled )\r
311 {\r
312   DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextWin::AutoEnableInputPanel\n" );\r
313 }\r
314 \r
315 void InputMethodContextWin::ShowInputPanel()\r
316 {\r
317   DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextWin::ShowInputPanel\n" );\r
318 }\r
319 \r
320 void InputMethodContextWin::HideInputPanel()\r
321 {\r
322   DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextWin::HideInputPanel\n" );\r
323 }\r
324 \r
325 Dali::InputMethodContext::KeyboardType InputMethodContextWin::GetKeyboardType()\r
326 {\r
327   return Dali::InputMethodContext::KeyboardType::SOFTWARE_KEYBOARD;\r
328 }\r
329 \r
330 std::string InputMethodContextWin::GetInputPanelLocale()\r
331 {\r
332   DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextWin::GetInputPanelLocale\n" );\r
333 \r
334   std::string locale = "";\r
335   return locale;\r
336 }\r
337 \r
338 bool InputMethodContextWin::FilterEventKey( const Dali::KeyEvent& keyEvent )\r
339 {\r
340   bool eventHandled( false );\r
341 \r
342   if ( ! KeyLookup::IsDeviceButton( keyEvent.keyPressedName.c_str() ))\r
343   {\r
344     //check whether it's key down or key up event\r
345     if ( keyEvent.state == KeyEvent::Down )\r
346     {\r
347       eventHandled = ProcessEventKeyDown( keyEvent );\r
348     }\r
349     else if ( keyEvent.state == KeyEvent::Up )\r
350     {\r
351       eventHandled = ProcessEventKeyUp( keyEvent );\r
352     }\r
353   }\r
354 \r
355   return eventHandled;\r
356 }\r
357 \r
358 void InputMethodContextWin::SetInputPanelLanguage( Dali::InputMethodContext::InputPanelLanguage language )\r
359 {\r
360   DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextWin::SetInputPanelLanguage\n" );\r
361 }\r
362 \r
363 Dali::InputMethodContext::InputPanelLanguage InputMethodContextWin::GetInputPanelLanguage() const\r
364 {\r
365   DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextWin::GetInputPanelLanguage\n" );\r
366   return Dali::InputMethodContext::InputPanelLanguage::AUTOMATIC;\r
367 }\r
368 \r
369 bool InputMethodContextWin::ProcessEventKeyDown( const KeyEvent& keyEvent )\r
370 {\r
371   bool eventHandled( false );\r
372   return eventHandled;\r
373 }\r
374 \r
375 bool InputMethodContextWin::ProcessEventKeyUp( const KeyEvent& keyEvent )\r
376 {\r
377   bool eventHandled( false );\r
378   return eventHandled;\r
379 }\r
380 \r
381 } // Adaptor\r
382 \r
383 } // Internal\r
384 \r
385 } // Dali\r
386 \r