2 // Open Service Platform
3 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://www.apache.org/licenses/LICENSE-2.0
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
19 * @file FUiIme_InputMethodImpl.cpp
20 * @brief This is the implementation file for the %_InputMethodImpl class.
22 * This implementation file contains definition of the %_InputMethodImpl class.
27 #include <Ecore_IMF.h>
28 #include <Ecore_X.h> // ecore_x_icccm_hints_get
29 #include <Elementary.h> // elm_win_keyboard_win_set
31 #include <FBaseSysLog.h>
32 #include <FBase_StringConverter.h>
34 #include "FUi_EcoreEvas.h"
35 #include "FUi_EcoreEvasMgr.h"
37 #include "FUiIme_EcoreFdHandler.h"
38 #include "FUiIme_ImeInfo.h"
39 #include "FUiIme_InputMethodImpl.h"
40 #include "FUiIme_InputServiceSignalListener.h"
41 #include "FUiIme_ScimDataConverter.h"
43 using namespace Tizen::Base;
44 using namespace Tizen::Graphics;
45 using namespace Tizen::Locales;
46 using namespace Tizen::Ui;
48 namespace Tizen { namespace Ui { namespace Ime {
50 _InputMethodImpl* _InputMethodImpl::__pInputMethodImpl = null;
52 _InputMethodImpl::_InputMethodImpl(void)
55 ,__pEcoreFdHandler(null)
56 ,__pInputServiceBinder(null)
57 ,__pInputServiceSignalListener(null)
58 ,__pScimDataConverter(null)
62 _InputMethodImpl::~_InputMethodImpl(void)
64 __pInputMethodImpl = null;
65 __pHelperAgent = null;
66 __pInputMethod = null;
68 if (__pEcoreFdHandler)
70 __pEcoreFdHandler->Deactivate();
71 __pEcoreFdHandler = null;
74 if (__pInputServiceBinder)
76 __pInputServiceBinder->Unbind();
77 __pInputServiceBinder = null;
80 delete __pInputServiceSignalListener;
81 __pInputServiceSignalListener = null;
83 delete __pScimDataConverter;
84 __pScimDataConverter = null;
88 _InputMethodImpl::Construct(InputMethod& inputMethod)
92 __pInputServiceBinder = _InputServiceBinder::GetInstance();
94 SysTryReturnResult(NID_UI_IME, __pInputServiceBinder, r, "Propagating.");
96 BindingId bindingId = -1;
97 bindingId = __pInputServiceBinder->Bind();
99 SysTryCatch(NID_UI_IME, bindingId > -1, , r, "[%s] Propagating.", GetErrorMessage(r));
101 __pHelperAgent = __pInputServiceBinder->GetHelperAgent();
102 __pInputMethod = &inputMethod;
104 __pInputServiceSignalListener = new(std::nothrow) _InputServiceSignalListener();
105 SysTryCatch(NID_UI_IME, __pInputServiceSignalListener, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
107 __pScimDataConverter = new(std::nothrow) _ScimDataConverter();
108 SysTryCatch(NID_UI_IME, __pScimDataConverter, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
110 SetInputServiceSignalCallback();
112 r = SetEcoreEvasAttribute();
113 SysTryCatch(NID_UI_IME, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
115 __pEcoreFdHandler = _EcoreFdHandler::GetInstance(bindingId, *__pHelperAgent);
117 SysTryCatch(NID_UI_IME, __pEcoreFdHandler, , r, "[%s] Propagating.", GetErrorMessage(r));
119 r = __pEcoreFdHandler->Activate();
120 SysTryCatch(NID_UI_IME, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
125 __pInputServiceBinder->Unbind();
126 __pInputServiceBinder = null;
128 __pHelperAgent = null;
129 __pInputMethod = null;
131 delete __pInputServiceSignalListener;
132 __pInputServiceSignalListener = null;
134 delete __pScimDataConverter;
135 __pScimDataConverter = null;
137 if (__pEcoreFdHandler)
139 __pEcoreFdHandler->Deactivate();
140 __pEcoreFdHandler = null;
147 _InputMethodImpl::GetInstance(InputMethod& inputMethod)
149 result r = E_SUCCESS;
151 if (!__pInputMethodImpl)
153 __pInputMethodImpl = new(std::nothrow) _InputMethodImpl();
154 SysTryReturn(NID_UI_IME, __pInputMethodImpl, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
156 r = __pInputMethodImpl->Construct(inputMethod);
157 SysTryCatch(NID_UI_IME, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
160 return __pInputMethodImpl;
163 delete __pInputMethodImpl;
164 __pInputMethodImpl = null;
170 _InputMethodImpl::SetInputMethodProvider(IInputMethodProvider* pProvider)
172 __pInputServiceSignalListener->SetInputMethodProvider(pProvider);
178 _InputMethodImpl::SetInputMethodListener(IInputMethodListener* pListener)
180 __pInputServiceSignalListener->SetInputMethodListener(pListener);
186 _InputMethodImpl::DeleteText(int cursorOffset, int length)
188 SysTryReturnResult(NID_UI_IME, length > 0, E_INVALID_ARG, "Invalid argument(s) is used. The length is not greater than 0.");
190 result r = E_SUCCESS;
192 __pHelperAgent->delete_surrounding_text(cursorOffset, length);
198 _InputMethodImpl::NotifyInputPanelState(InputPanelShowState state)
200 SysTryReturnResult(NID_UI_IME, (state == INPUT_PANEL_SHOW_STATE_SHOW) || (state == INPUT_PANEL_SHOW_STATE_HIDE), E_INVALID_ARG,
201 "Invalid argument(s) is used. The state is beyond the scope.");
203 result r = E_SUCCESS;
205 Ecore_IMF_Input_Panel_State inputPanelState;
209 case INPUT_PANEL_SHOW_STATE_SHOW:
210 inputPanelState = ECORE_IMF_INPUT_PANEL_STATE_SHOW;
212 case INPUT_PANEL_SHOW_STATE_HIDE:
213 inputPanelState = ECORE_IMF_INPUT_PANEL_STATE_HIDE;
219 __pHelperAgent->update_input_context(ECORE_IMF_INPUT_PANEL_STATE_EVENT, inputPanelState);
225 _InputMethodImpl::RequestSurroundingText(int lengthBeforeCursor, int lengthAfterCursor)
227 SysTryReturnResult(NID_UI_IME, (lengthBeforeCursor >= 0) && (lengthAfterCursor >= 0), E_INVALID_ARG,
228 "[E_INVALID_ARG] Invalid argument(s) is used. The length is not greater than or equal to 0.");
230 result r = E_SUCCESS;
232 _ImeInfo* pImeInfo = _ImeInfo::GetInstance();
233 scim::String uuid = pImeInfo->GetUuid();
235 __pHelperAgent->get_surrounding_text(uuid, lengthBeforeCursor, lengthAfterCursor);
241 _InputMethodImpl::SendCompositeText(const Tizen::Base::String& text)
243 result r = E_SUCCESS;
245 scim::WideString compositeText;
246 r = __pScimDataConverter->ConvertString(text, compositeText);
247 SysTryReturnResult(NID_UI_IME, r == E_SUCCESS, r, "Propagating.");
249 scim::AttributeList attributeList;
250 __pHelperAgent->update_preedit_string(-1, "", compositeText, attributeList);
256 _InputMethodImpl::SendKeyEvent(Tizen::Ui::KeyCode code, Tizen::Ui::KeyState state)
258 SysTryReturnResult(NID_UI_IME, (code > KEY_INVALID) && (code < KEY_HARDWARE_MAX), E_INVALID_ARG,
259 "Invalid argument(s) is used. The key code is beyond the scope.");
260 SysTryReturnResult(NID_UI_IME, (state >= KEY_PRESSED) && (state <= KEY_LONGPRESSED), E_INVALID_ARG,
261 "Invalid argument(s) is used. The key state is beyond the scope.");
263 result r = E_SUCCESS;
265 scim::KeyEvent keyEvent;
266 __pScimDataConverter->ConvertKey(code, state, keyEvent);
267 __pHelperAgent->forward_key_event(-1, "", keyEvent);
273 _InputMethodImpl::SendText(const Tizen::Base::String& text)
275 result r = E_SUCCESS;
277 scim::String scimText;
278 r = __pScimDataConverter->ConvertString(text, scimText);
279 SysTryReturnResult(NID_UI_IME, r == E_SUCCESS, r, "Propagating.");
281 scim::WideString wideString = scim::utf8_mbstowcs(scimText);
283 __pHelperAgent->commit_string(-1, "", wideString);
289 _InputMethodImpl::HasPendingEvent(void) const
291 return __pHelperAgent->has_pending_event();
295 _InputMethodImpl::ProcessPendingEvent(void)
297 result r = E_SUCCESS;
301 bound = __pHelperAgent->filter_event();
302 SysTryReturnResult(NID_UI_IME, bound == true, E_HOST_NOT_FOUND, "The destination host is not found.");
308 _InputMethodImpl::SetEcoreEvasAttribute(void)
310 result r = E_SUCCESS;
312 _EcoreEvasMgr* pEcoreEvasMgr = null;
313 pEcoreEvasMgr = GetEcoreEvasMgr();
315 SysTryReturnResult(NID_UI_IME, pEcoreEvasMgr, r, "Propagating.");
317 _EcoreEvas* pEcoreEvas = null;
318 pEcoreEvas = pEcoreEvasMgr->GetEcoreEvas();
320 SysTryReturnResult(NID_UI_IME, pEcoreEvas, r, "Propagating.");
322 elm_win_keyboard_win_set(pEcoreEvas->GetWindowObject(), EINA_TRUE);
324 Eina_Bool accepts_focus = EINA_TRUE;
325 Ecore_X_Window_State_Hint initial_state = ECORE_X_WINDOW_STATE_HINT_NONE;
326 Ecore_X_Pixmap icon_pixmap = 0;
327 Ecore_X_Pixmap icon_mask = 0;
328 Ecore_X_Window icon_window = 0;
329 Ecore_X_Window window_group = 0;
330 Eina_Bool is_urgent = EINA_FALSE;
332 Eina_Bool result = EINA_FALSE;
333 result = ecore_x_icccm_hints_get(pEcoreEvas->GetXWindow(), &accepts_focus, &initial_state, &icon_pixmap, &icon_mask, &icon_window, &window_group, &is_urgent);
334 SysTryReturnResult(NID_UI_IME, result == EINA_TRUE, E_SYSTEM, "A failure occurs from the underlying system.");
336 ecore_x_icccm_hints_set(pEcoreEvas->GetXWindow(), EINA_FALSE, initial_state, icon_pixmap, icon_mask, icon_window, window_group, is_urgent);
342 _InputMethodImpl::SetInputServiceSignalCallback(void)
344 __pHelperAgent->signal_connect_exit(scim::slot(_InputServiceSignalListener::OnTerminate));
345 __pHelperAgent->signal_connect_get_geometry(scim::slot(_InputServiceSignalListener::GetInputPanelBounds));
346 __pHelperAgent->signal_connect_ise_hide(scim::slot(_InputServiceSignalListener::HideInputPanel));
347 __pHelperAgent->signal_connect_ise_show(scim::slot(_InputServiceSignalListener::ShowInputPanel));
348 __pHelperAgent->signal_connect_update_cursor_position(scim::slot(_InputServiceSignalListener::OnCursorPositionChanged));
349 __pHelperAgent->signal_connect_update_surrounding_text(scim::slot(_InputServiceSignalListener::OnSurroundingTextReceived));
350 __pHelperAgent->signal_connect_set_language(scim::slot(_InputServiceSignalListener::SetLanguage));
351 __pHelperAgent->signal_connect_set_return_key_type(scim::slot(_InputServiceSignalListener::SetEnterKeyAction));
352 __pHelperAgent->signal_connect_get_return_key_type(scim::slot(_InputServiceSignalListener::GetEnterKeyAction));
353 __pHelperAgent->signal_connect_set_return_key_disable(scim::slot(_InputServiceSignalListener::SetEnterKeyActionEnabled));
354 __pHelperAgent->signal_connect_get_return_key_disable(scim::slot(_InputServiceSignalListener::IsEnterKeyActionEnabled));
355 __pHelperAgent->signal_connect_get_layout(scim::slot(_InputServiceSignalListener::GetInputPanelStyle));
356 __pHelperAgent->signal_connect_set_layout(scim::slot(_InputServiceSignalListener::SetInputPanelStyle));
357 __pHelperAgent->signal_connect_set_caps_mode(scim::slot(_InputServiceSignalListener::SetCapsModeEnabled));
359 SysLog(NID_UI_IME, "The signal callback functions of the input service have been set");
365 _InputMethodImpl::HideInputPanel(void)
367 _EcoreEvasMgr* pEcoreEvasMgr = null;
368 pEcoreEvasMgr = GetEcoreEvasMgr();
369 SysTryReturnVoidResult(NID_UI_IME, pEcoreEvasMgr, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] The required instance does not exist.");
371 _EcoreEvas* pEcoreEvas = null;
372 pEcoreEvas = pEcoreEvasMgr->GetEcoreEvas();
373 SysTryReturnVoidResult(NID_UI_IME, pEcoreEvas, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] The required instance does not exist.");
375 Evas_Object* pEvasObject = null;
376 pEvasObject = pEcoreEvas->GetWindowObject();
377 SysTryReturnVoidResult(NID_UI_IME, pEvasObject, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] The required instance does not exist.");
379 if (evas_object_visible_get(pEvasObject))
381 evas_object_hide(pEvasObject);
388 _InputMethodImpl::ShowInputPanel(void)
390 _EcoreEvasMgr* pEcoreEvasMgr = null;
391 pEcoreEvasMgr = GetEcoreEvasMgr();
392 SysTryReturnVoidResult(NID_UI_IME, pEcoreEvasMgr, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] The required instance does not exist.");
394 _EcoreEvas* pEcoreEvas = null;
395 pEcoreEvas = pEcoreEvasMgr->GetEcoreEvas();
396 SysTryReturnVoidResult(NID_UI_IME, pEcoreEvas, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] The required instance does not exist.");
398 Evas_Object* pEvasObject = null;
399 pEvasObject = pEcoreEvas->GetWindowObject();
400 SysTryReturnVoidResult(NID_UI_IME, pEvasObject, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] The required instance does not exist.");
402 if (evas_object_visible_get(pEvasObject) == false)
404 evas_object_show(pEvasObject);
410 }}} // Tizen::Ui::Ime