2 * Copyright (c) 2021 Samsung Electronics Co., Ltd.
\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
8 * http://www.apache.org/licenses/LICENSE-2.0
\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
19 #include <dali/internal/input/windows/input-method-context-impl-win.h>
\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
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
43 #if defined(DEBUG_ENABLED)
\r
44 Debug::Filter* gLogFilter = Debug::Filter::New(Debug::NoLogging, false, "LOG_INPUT_METHOD_CONTEXT");
\r
48 InputMethodContextPtr InputMethodContextWin::New(Dali::Actor actor)
\r
50 InputMethodContextPtr manager;
\r
52 if(actor && Adaptor::IsAvailable())
\r
54 manager = new InputMethodContextWin(actor);
\r
60 void InputMethodContextWin::Finalize()
\r
64 InputMethodContextWin::InputMethodContextWin(Dali::Actor actor)
\r
66 mIMFCursorPosition(0),
\r
68 mRestoreAfterFocusLost(false),
\r
69 mIdleCallbackConnected(false)
\r
71 actor.OnSceneSignal().Connect(this, &InputMethodContextWin::OnStaged);
\r
74 InputMethodContextWin::~InputMethodContextWin()
\r
79 void InputMethodContextWin::Initialize()
\r
81 CreateContext(mWin32Window);
\r
85 void InputMethodContextWin::CreateContext(WinWindowHandle winHandle)
\r
87 DALI_LOG_INFO(gLogFilter, Debug::General, "InputMethodContextWin::CreateContext\n");
\r
90 void InputMethodContextWin::DeleteContext()
\r
92 DALI_LOG_INFO(gLogFilter, Debug::General, "InputMethodContextWin::DeleteContext\n");
\r
95 // Callbacks for predicitive text support.
\r
96 void InputMethodContextWin::ConnectCallbacks()
\r
100 void InputMethodContextWin::DisconnectCallbacks()
\r
104 void InputMethodContextWin::Activate()
\r
106 // Reset mIdleCallbackConnected
\r
107 mIdleCallbackConnected = false;
\r
110 void InputMethodContextWin::Deactivate()
\r
112 mIdleCallbackConnected = false;
\r
115 void InputMethodContextWin::Reset()
\r
117 DALI_LOG_INFO(gLogFilter, Debug::General, "InputMethodContextWin::Reset\n");
\r
120 ImfContext* InputMethodContextWin::GetContext()
\r
122 DALI_LOG_INFO(gLogFilter, Debug::General, "InputMethodContextWin::GetContext\n");
\r
127 bool InputMethodContextWin::RestoreAfterFocusLost() const
\r
129 return mRestoreAfterFocusLost;
\r
132 void InputMethodContextWin::SetRestoreAfterFocusLost(bool toggle)
\r
134 mRestoreAfterFocusLost = toggle;
\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
142 void InputMethodContextWin::PreEditChanged(void*, ImfContext* imfContext, void* eventInfo)
\r
144 DALI_LOG_INFO(gLogFilter, Debug::General, "InputMethodContextWin::PreEditChanged\n");
\r
147 void InputMethodContextWin::CommitReceived(void*, ImfContext* imfContext, void* eventInfo)
\r
149 DALI_LOG_INFO(gLogFilter, Debug::General, "InputMethodContextWin::CommitReceived\n");
\r
151 if(Dali::Adaptor::IsAvailable())
\r
153 const std::string keyString(static_cast<char*>(eventInfo));
\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
159 if(callbackData.update)
\r
161 mIMFCursorPosition = static_cast<int>(callbackData.cursorPosition);
\r
163 NotifyCursorPosition();
\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
173 bool InputMethodContextWin::RetrieveSurrounding(void* data, ImfContext* imfContext, char** text, int* cursorPosition)
\r
175 DALI_LOG_INFO(gLogFilter, Debug::General, "InputMethodContextWin::RetrieveSurrounding\n");
\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
181 if(callbackData.update)
\r
185 *text = strdup(callbackData.currentText.c_str());
\r
190 mIMFCursorPosition = static_cast<int>(callbackData.cursorPosition);
\r
191 *cursorPosition = mIMFCursorPosition;
\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
202 void InputMethodContextWin::DeleteSurrounding(void* data, ImfContext* imfContext, void* eventInfo)
\r
204 DALI_LOG_INFO(gLogFilter, Debug::General, "InputMethodContextWin::DeleteSurrounding\n");
\r
207 void InputMethodContextWin::NotifyCursorPosition()
\r
209 DALI_LOG_INFO(gLogFilter, Debug::General, "InputMethodContextWin::NotifyCursorPosition\n");
\r
212 void InputMethodContextWin::SetCursorPosition(unsigned int cursorPosition)
\r
214 DALI_LOG_INFO(gLogFilter, Debug::General, "InputMethodContextWin::SetCursorPosition\n");
\r
216 mIMFCursorPosition = static_cast<int>(cursorPosition);
\r
219 unsigned int InputMethodContextWin::GetCursorPosition() const
\r
221 DALI_LOG_INFO(gLogFilter, Debug::General, "InputMethodContextWin::GetCursorPosition\n");
\r
223 return static_cast<unsigned int>(mIMFCursorPosition);
\r
226 void InputMethodContextWin::SetSurroundingText(const std::string& text)
\r
228 DALI_LOG_INFO(gLogFilter, Debug::General, "InputMethodContextWin::SetSurroundingText\n");
\r
230 mSurroundingText = text;
\r
233 const std::string& InputMethodContextWin::GetSurroundingText() const
\r
235 DALI_LOG_INFO(gLogFilter, Debug::General, "InputMethodContextWin::GetSurroundingText\n");
\r
237 return mSurroundingText;
\r
240 void InputMethodContextWin::NotifyTextInputMultiLine(bool multiLine)
\r
244 Dali::InputMethodContext::TextDirection InputMethodContextWin::GetTextDirection()
\r
246 Dali::InputMethodContext::TextDirection direction(Dali::InputMethodContext::LEFT_TO_RIGHT);
\r
251 Rect<int> InputMethodContextWin::GetInputMethodArea()
\r
253 int xPos, yPos, width, height;
\r
255 width = height = xPos = yPos = 0;
\r
257 return Rect<int>(xPos, yPos, width, height);
\r
260 void InputMethodContextWin::ApplyOptions(const InputMethodOptions& options)
\r
262 using namespace Dali::InputMethod::Category;
\r
266 if(mOptions.CompareAndSet(PANEL_LAYOUT, options, index))
\r
269 if(mOptions.CompareAndSet(BUTTON_ACTION, options, index))
\r
272 if(mOptions.CompareAndSet(AUTO_CAPITALIZE, options, index))
\r
275 if(mOptions.CompareAndSet(VARIATION, options, index))
\r
280 void InputMethodContextWin::SetInputPanelData(const std::string& data)
\r
282 DALI_LOG_INFO(gLogFilter, Debug::General, "InputMethodContextWin::SetInputPanelData\n");
\r
285 void InputMethodContextWin::GetInputPanelData(std::string& data)
\r
287 DALI_LOG_INFO(gLogFilter, Debug::General, "InputMethodContextWin::GetInputPanelData\n");
\r
290 Dali::InputMethodContext::State InputMethodContextWin::GetInputPanelState()
\r
292 DALI_LOG_INFO(gLogFilter, Debug::General, "InputMethodContextWin::GetInputPanelState\n");
\r
293 return Dali::InputMethodContext::DEFAULT;
\r
296 void InputMethodContextWin::SetReturnKeyState(bool visible)
\r
298 DALI_LOG_INFO(gLogFilter, Debug::General, "InputMethodContextWin::SetReturnKeyState\n");
\r
301 void InputMethodContextWin::AutoEnableInputPanel(bool enabled)
\r
303 DALI_LOG_INFO(gLogFilter, Debug::General, "InputMethodContextWin::AutoEnableInputPanel\n");
\r
306 void InputMethodContextWin::ShowInputPanel()
\r
308 DALI_LOG_INFO(gLogFilter, Debug::General, "InputMethodContextWin::ShowInputPanel\n");
\r
311 void InputMethodContextWin::HideInputPanel()
\r
313 DALI_LOG_INFO(gLogFilter, Debug::General, "InputMethodContextWin::HideInputPanel\n");
\r
316 Dali::InputMethodContext::KeyboardType InputMethodContextWin::GetKeyboardType()
\r
318 return Dali::InputMethodContext::KeyboardType::SOFTWARE_KEYBOARD;
\r
321 std::string InputMethodContextWin::GetInputPanelLocale()
\r
323 DALI_LOG_INFO(gLogFilter, Debug::General, "InputMethodContextWin::GetInputPanelLocale\n");
\r
325 std::string locale = "";
\r
329 void InputMethodContextWin::SetContentMIMETypes(const std::string& mimeTypes)
\r
331 DALI_LOG_INFO(gLogFilter, Debug::General, "InputMethodContextWin::SetContentMIMETypes\n");
\r
334 bool InputMethodContextWin::FilterEventKey(const Dali::KeyEvent& keyEvent)
\r
336 bool eventHandled(false);
\r
338 if(!KeyLookup::IsDeviceButton(keyEvent.GetKeyName().c_str()))
\r
340 //check whether it's key down or key up event
\r
341 if(keyEvent.GetState() == Dali::KeyEvent::DOWN)
\r
343 eventHandled = ProcessEventKeyDown(keyEvent);
\r
345 else if(keyEvent.GetState() == Dali::KeyEvent::UP)
\r
347 eventHandled = ProcessEventKeyUp(keyEvent);
\r
351 return eventHandled;
\r
354 void InputMethodContextWin::SetInputPanelLanguage(Dali::InputMethodContext::InputPanelLanguage language)
\r
356 DALI_LOG_INFO(gLogFilter, Debug::General, "InputMethodContextWin::SetInputPanelLanguage\n");
\r
359 Dali::InputMethodContext::InputPanelLanguage InputMethodContextWin::GetInputPanelLanguage() const
\r
361 DALI_LOG_INFO(gLogFilter, Debug::General, "InputMethodContextWin::GetInputPanelLanguage\n");
\r
362 return Dali::InputMethodContext::InputPanelLanguage::AUTOMATIC;
\r
365 void InputMethodContextWin::SetInputPanelPosition(unsigned int x, unsigned int y)
\r
367 DALI_LOG_INFO(gLogFilter, Debug::General, "InputMethodContextWin::SetInputPanelPosition\n");
\r
370 void InputMethodContextWin::GetPreeditStyle(Dali::InputMethodContext::PreEditAttributeDataContainer& attrs) const
\r
372 DALI_LOG_INFO(gLogFilter, Debug::General, "InputMethodContextWin::GetPreeditStyle\n");
\r
373 attrs = mPreeditAttrs;
\r
376 bool InputMethodContextWin::ProcessEventKeyDown(const Dali::KeyEvent& keyEvent)
\r
378 bool eventHandled(false);
\r
379 return eventHandled;
\r
382 bool InputMethodContextWin::ProcessEventKeyUp(const Dali::KeyEvent& keyEvent)
\r
384 bool eventHandled(false);
\r
385 return eventHandled;
\r
388 void InputMethodContextWin::OnStaged(Dali::Actor actor)
\r
390 WinWindowHandle winWindow(AnyCast<WinWindowHandle>(Dali::Integration::SceneHolder::Get(actor).GetNativeHandle()));
\r
392 if(mWin32Window != winWindow)
\r
394 mWin32Window = winWindow;
\r
402 } // namespace Adaptor
\r
404 } // namespace Internal
\r
406 } // namespace Dali
\r