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