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