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