refactoring text selection module
[framework/osp/web.git] / src / controls / FWebCtrl_WebImpl.cpp
index 2cd3d54..395ec43 100755 (executable)
@@ -1321,6 +1321,91 @@ OnWebPreventDefaultTriggered(void* pUserData, Evas_Object* pView, void* pEventIn
 }
 
 
+result
+FireWebPageBlockSelectedEvent(_WebImpl* pImpl)
+{
+       result r = E_SUCCESS;
+
+       std::unique_ptr<Point> startPoint(new (std::nothrow) Point());
+       std::unique_ptr<Point> endPoint(new (std::nothrow) Point());
+       SysTryReturnResult(NID_WEB_CTRL, startPoint.get() && endPoint.get(), E_OUT_OF_MEMORY, "Memory Allocation failed.");
+
+       pImpl->GetBlockRange(*startPoint.get(), *endPoint.get());
+
+       std::unique_ptr<_WebUiEventArg> pEventArg(new (std::nothrow) _WebUiEventArg(WEB_EVENT_WEBUIEVENTLISTENER_PAGE_BLOCK_SELECTED));
+       SysTryReturnResult(NID_WEB_CTRL, pEventArg.get(), E_OUT_OF_MEMORY, "Memory Allocation failed.");
+
+       r = pEventArg->SetEventInfo(_WebUiEventArg::BLOCK_START, *startPoint.get());
+       SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
+       startPoint.release();
+
+       r = pEventArg->SetEventInfo(_WebUiEventArg::BLOCK_END, *endPoint.get());
+       SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
+       endPoint.release();
+
+       r = pImpl->GetWebEvent()->FireAsync(*pEventArg.get());
+       SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
+       pEventArg.release();
+
+       return E_SUCCESS;
+}
+
+
+result
+FireWebPageBlockSelectedEventF(_WebImpl* pImpl)
+{
+       result r = E_SUCCESS;
+
+       std::unique_ptr<FloatPoint> startPoint(new (std::nothrow) FloatPoint());
+       std::unique_ptr<FloatPoint> endPoint(new (std::nothrow) FloatPoint());
+
+       SysTryReturnResult(NID_WEB_CTRL, startPoint.get() && endPoint.get(), E_OUT_OF_MEMORY, "Memory Allocation failed.");
+
+       pImpl->GetBlockRange(*startPoint.get(), *endPoint.get());
+
+       std::unique_ptr<_WebUiEventArg> pEventArg(new (std::nothrow) _WebUiEventArg(WEB_EVENT_WEBUIEVENTLISTENER_PAGE_BLOCK_SELECTED_FLOAT));
+       SysTryReturnResult(NID_WEB_CTRL, pEventArg.get(), E_OUT_OF_MEMORY, "Memory Allocation failed.");
+
+       r = pEventArg->SetEventInfo(_WebUiEventArg::BLOCK_START, *startPoint.get());
+       SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
+       startPoint.release();
+
+       r = pEventArg->SetEventInfo(_WebUiEventArg::BLOCK_END, *endPoint.get());
+       SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
+       endPoint.release();
+
+       r = pImpl->GetWebEvent()->FireAsync(*pEventArg.get());
+       SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
+       pEventArg.release();
+
+       return E_SUCCESS;
+}
+
+
+void
+OnWebPageBlockSelected(void* pUserData, Evas_Object* pView, void* pEventInfo)
+{
+       _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(pUserData);
+       Ewk_Text_Style* pStyle = reinterpret_cast< Ewk_Text_Style* >(pEventInfo);
+       SysAssertf(pImpl && pStyle, "Failed to request");
+
+       if (pImpl->GetUiEventListener())
+       {
+               result r = E_SUCCESS;
+
+               r = FireWebPageBlockSelectedEvent(pImpl);
+               SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
+       }
+       if (pImpl->GetUiEventListenerF())
+       {
+               result r = E_SUCCESS;
+
+               r = FireWebPageBlockSelectedEventF(pImpl);
+               SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
+       }
+}
+
+
 Eina_Bool
 OnSelectUploadFile(Evas_Object* pView, Eina_Bool multipleFile, Eina_List* pAcceptTypes, const char* pCapture, void* pUserData)
 {
@@ -1833,7 +1918,6 @@ _WebImpl::_WebImpl(Web* pWeb, Tizen::Ui::_Control* pCore)
        , __pUserKeypadEventListener(null)
        , __pTextSearchListener(null)
        , __pKeypad(null)
-       , __pWebSetting(null)
        , __pJsBridgeList(null)
        , __pJsProvider(null)
        , __pJsComparer(null)
@@ -1936,9 +2020,6 @@ _WebImpl::Construct(void)
        r = __textSearch.__searchQueue.Construct();
        SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
 
-       __pWebSetting = std::unique_ptr<WebSetting>(new (std::nothrow) WebSetting());
-       SysTryReturn(NID_WEB_CTRL, __pWebSetting.get(), E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
-
        r = InitJsBridgeList();
        SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
 
@@ -1948,8 +2029,6 @@ _WebImpl::Construct(void)
        __pWebCore = dynamic_cast< _Web* >(&(GetCore()));
        SysTryReturnResult(NID_WEB_CTRL, __pWebCore, E_SYSTEM, "A system error has been occurred. Failed to get web control");
 
-       __pWebCore->SetWebSettingImpl(_WebSettingImpl::GetInstance(__pWebSetting.get()));
-
        return E_SUCCESS;
 }
 
@@ -1959,12 +2038,14 @@ _WebImpl::InitializeSetting(void)
 {
        result r = E_SUCCESS;
 
-       r = SetSetting(*__pWebSetting.get());
+       r = SetSetting(*__pWebCore->GetSetting());
        SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
 
-       SetCookieEnabled(_WebSettingImpl::GetInstance(__pWebSetting.get())->IsCookieEnabled());
-       SetPrivateBrowsingEnabled(_WebSettingImpl::GetInstance(__pWebSetting.get())->IsPrivateBrowsingEnabled());
-       SetZoomLevel(_WebSettingImpl::GetInstance(__pWebSetting.get())->GetZoomLevel());
+       _WebSettingImpl* pWebSettingImpl = _WebSettingImpl::GetInstance(__pWebCore->GetSetting());
+
+       SetCookieEnabled(pWebSettingImpl->IsCookieEnabled());
+       SetPrivateBrowsingEnabled(pWebSettingImpl->IsPrivateBrowsingEnabled());
+       SetZoomLevel(pWebSettingImpl->GetZoomLevel());
 
        SetEventListenerCallback();
 
@@ -2604,19 +2685,21 @@ _WebImpl::SetSetting(const WebSetting& setting)
                ewk_settings_autofill_password_form_enabled_set(pSettings,  static_cast< Eina_Bool >(setting.IsAutoLoginFormFillEnabled()));
        }
 
-       __pWebSetting->SetCertificateErrorHandlingMode(setting.GetCertificateErrorHandlingMode());
-       __pWebSetting->SetDefaultTextEncoding(setting.GetDefaultTextEncoding());
-       __pWebSetting->SetCacheControl(setting.GetCacheControl());
-       __pWebSetting->SetFontSize(setting.GetFontSize());
-       __pWebSetting->SetJavascriptEnabled(setting.IsJavascriptEnabled());
-       __pWebSetting->SetAutoImageLoadEnabled(setting.IsAutoImageLoadEnabled());
-       __pWebSetting->SetInputStyle(setting.GetInputStyle());
-       __pWebSetting->SetUserAgent(setting.GetUserAgent());
-       __pWebSetting->SetAutoFittingEnabled(setting.IsAutoFittingEnabled());
-       __pWebSetting->SetJavaScriptPopupEnabled(setting.IsJavaScriptPopupEnabled());
-       __pWebSetting->SetGeolocationEnabled(setting.IsGeolocationEnabled());
-       __pWebSetting->SetAutoFormDataShowEnabled(setting.IsAutoFormDataShowEnabled());
-       __pWebSetting->SetAutoLoginFormFillEnabled(setting.IsAutoLoginFormFillEnabled());
+       _WebSettingImpl* pWebSettingImpl = _WebSettingImpl::GetInstance(__pWebCore->GetSetting());
+
+       pWebSettingImpl->SetCertificateErrorHandlingMode(setting.GetCertificateErrorHandlingMode());
+       pWebSettingImpl->SetDefaultTextEncoding(setting.GetDefaultTextEncoding());
+       pWebSettingImpl->SetCacheControl(setting.GetCacheControl());
+       pWebSettingImpl->SetFontSize(setting.GetFontSize());
+       pWebSettingImpl->SetJavascriptEnabled(setting.IsJavascriptEnabled());
+       pWebSettingImpl->SetAutoImageLoadEnabled(setting.IsAutoImageLoadEnabled());
+       pWebSettingImpl->SetInputStyle(setting.GetInputStyle());
+       pWebSettingImpl->SetUserAgent(setting.GetUserAgent());
+       pWebSettingImpl->SetAutoFittingEnabled(setting.IsAutoFittingEnabled());
+       pWebSettingImpl->SetJavaScriptPopupEnabled(setting.IsJavaScriptPopupEnabled());
+       pWebSettingImpl->SetGeolocationEnabled(setting.IsGeolocationEnabled());
+       pWebSettingImpl->SetAutoFormDataShowEnabled(setting.IsAutoFormDataShowEnabled());
+       pWebSettingImpl->SetAutoLoginFormFillEnabled(setting.IsAutoLoginFormFillEnabled());
 
        return E_SUCCESS;
 }
@@ -2625,7 +2708,7 @@ _WebImpl::SetSetting(const WebSetting& setting)
 WebSetting
 _WebImpl::GetSetting(void) const
 {
-       return *__pWebSetting;
+       return *__pWebCore->GetSetting();
 }
 
 
@@ -2774,7 +2857,7 @@ _WebImpl::IsPrivateBrowsingEnabled(void) const
 {
        if (__pWebCore->GetWebNativeNode() == null)
        {
-               return _WebSettingImpl::GetInstance(__pWebSetting.get())->IsPrivateBrowsingEnabled();
+               return _WebSettingImpl::GetInstance(__pWebCore->GetSetting())->IsPrivateBrowsingEnabled();
        }
 
        Ewk_Settings* pSettings = ewk_view_settings_get(__pWebCore->GetWebNativeNode());
@@ -2789,7 +2872,7 @@ _WebImpl::SetPrivateBrowsingEnabled(bool enable)
 {
        if (__pWebCore->GetWebNativeNode() == null)
        {
-               _WebSettingImpl::GetInstance(__pWebSetting.get())->SetPrivateBrowsingEnabled(enable);
+               _WebSettingImpl::GetInstance(__pWebCore->GetSetting())->SetPrivateBrowsingEnabled(enable);
                return;
        }
 
@@ -2853,7 +2936,7 @@ _WebImpl::IsCookieEnabled(void) const
 {
        if (__pWebCore->GetWebNativeNode() == null)
        {
-               return _WebSettingImpl::GetInstance(__pWebSetting.get())->IsCookieEnabled();
+               return _WebSettingImpl::GetInstance(__pWebCore->GetSetting())->IsCookieEnabled();
        }
 
        Ewk_Context* pContext = ewk_view_context_get(__pWebCore->GetWebNativeNode());
@@ -2877,7 +2960,7 @@ _WebImpl::SetCookieEnabled(bool enable)
 {
        if (__pWebCore->GetWebNativeNode() == null)
        {
-               _WebSettingImpl::GetInstance(__pWebSetting.get())->SetCookiEnabled(enable);
+               _WebSettingImpl::GetInstance(__pWebCore->GetSetting())->SetCookiEnabled(enable);
 
                return;
        }
@@ -3002,14 +3085,14 @@ _WebImpl::SetTextSearchListener(ITextSearchListener* pTextSearchListener)
 void
 _WebImpl::SetScrollEnabled(bool enable)
 {
-       _WebSettingImpl::GetInstance(__pWebSetting.get())->SetScrollEnabled(enable);
+       _WebSettingImpl::GetInstance(__pWebCore->GetSetting())->SetScrollEnabled(enable);
 }
 
 
 bool
 _WebImpl::IsScrollEnabled(void) const
 {
-       return _WebSettingImpl::GetInstance(__pWebSetting.get())->IsScrollEnabled();
+       return _WebSettingImpl::GetInstance(__pWebCore->GetSetting())->IsScrollEnabled();
 }
 
 
@@ -3208,6 +3291,8 @@ _WebImpl::SetEventListenerCallback(void) const
                evas_object_smart_callback_add(pWebNativeNode, "touchmove,handled", OnWebPreventDefaultTriggered, this);
                evas_object_smart_callback_add(pWebNativeNode, "icon,received", OnFaviconReceived, this);
 
+               evas_object_smart_callback_add(pWebNativeNode, "text,style,state", OnWebPageBlockSelected, this);
+
                Ewk_Context* pContext = ewk_view_context_get(pWebNativeNode);
                SysAssertf(pContext, "Failed to get webkit instance.");
                ewk_context_did_start_download_callback_set(pContext, OnDidStartDownloadCallback, const_cast< _WebImpl* >(this));
@@ -3281,6 +3366,8 @@ _WebImpl::RemoveEventListenerCallback(void) const
                evas_object_smart_callback_del(pWebNativeNode, "touchmove,handled", OnWebPreventDefaultTriggered);
                evas_object_smart_callback_del(pWebNativeNode, "icon,received", OnFaviconReceived);
 
+               evas_object_smart_callback_del(pWebNativeNode, "text,style,state", OnWebPageBlockSelected);
+
                ewk_view_open_panel_callback_set(null, null, null);
 
                evas_object_event_callback_del(pWebNativeNode, EVAS_CALLBACK_FOCUS_IN, OnWebNativeNodeFocusGained);
@@ -3305,11 +3392,6 @@ _WebImpl::SetBlockSelectionPosition(const Point& startPoint)
 
        SysTryReturnResult(NID_WEB_CTRL, GetTextFromBlock().GetLength() > 0, E_INVALID_ARG, "Failed to set text selection up.");
 
-       if (__pUserUiListener)
-       {
-               FireWebPageBlockSelectedEvent();
-       }
-
        return E_SUCCESS;
 }
 
@@ -3317,82 +3399,7 @@ _WebImpl::SetBlockSelectionPosition(const Point& startPoint)
 result
 _WebImpl::SetBlockSelectionPosition(const FloatPoint& startPoint)
 {
-       Evas_Object* pWebNativeNode = __pWebCore->GetWebNativeNode();
-
-       Ewk_View_Smart_Data* pSmartData = (Ewk_View_Smart_Data*) evas_object_smart_data_get(pWebNativeNode);
-       SysAssertf(pSmartData, "Failed to request");
-
-       Point absPoint(__pWebCore->GetAbsoluteCoordinate(_CoordinateSystemUtils::ConvertToInteger(startPoint)));
-
-       pSmartData->api->text_selection_down(pSmartData, absPoint.x, absPoint.y);
-       pSmartData->api->text_selection_up(pSmartData, absPoint.x, absPoint.y);
-
-       ewk_view_command_execute(pWebNativeNode, "SelectWord", 0);
-
-       SysTryReturnResult(NID_WEB_CTRL, GetTextFromBlock().GetLength() > 0, E_INVALID_ARG, "Failed to set text selection up.");
-
-       if (__pUserUiListenerF)
-       {
-               FireWebPageBlockSelectedEventF();
-       }
-
-       return E_SUCCESS;
-}
-
-
-void
-_WebImpl::FireWebPageBlockSelectedEvent(void) const
-{
-       result r = E_SUCCESS;
-
-       std::unique_ptr<Point> startPoint(new (std::nothrow) Point());
-       std::unique_ptr<Point> endPoint(new (std::nothrow) Point());
-       SysTryReturnVoidResult(NID_WEB_CTRL, startPoint.get() && endPoint.get(), E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
-
-       GetBlockRange(*startPoint.get(), *endPoint.get());
-
-       std::unique_ptr<_WebUiEventArg> pEventArg(new (std::nothrow) _WebUiEventArg(WEB_EVENT_WEBUIEVENTLISTENER_PAGE_BLOCK_SELECTED));
-       SysTryReturnVoidResult(NID_WEB_CTRL, pEventArg.get(), E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
-
-       r = pEventArg->SetEventInfo(_WebUiEventArg::BLOCK_START, *startPoint.get());
-       SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
-       startPoint.release();
-
-       r = pEventArg->SetEventInfo(_WebUiEventArg::BLOCK_END, *endPoint.get());
-       SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
-       endPoint.release();
-
-       r = __pWebEvent->FireAsync(*pEventArg.get());
-       SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
-       pEventArg.release();
-}
-
-
-void
-_WebImpl::FireWebPageBlockSelectedEventF(void) const
-{
-       result r = E_SUCCESS;
-
-       std::unique_ptr<FloatPoint> startPoint(new (std::nothrow) FloatPoint());
-       std::unique_ptr<FloatPoint> endPoint(new (std::nothrow) FloatPoint());
-       SysTryReturnVoidResult(NID_WEB_CTRL, startPoint.get() && endPoint.get(), E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
-
-       GetBlockRange(*startPoint.get(), *endPoint.get());
-
-       std::unique_ptr<_WebUiEventArg> pEventArg(new (std::nothrow) _WebUiEventArg(WEB_EVENT_WEBUIEVENTLISTENER_PAGE_BLOCK_SELECTED_FLOAT));
-       SysTryReturnVoidResult(NID_WEB_CTRL, pEventArg.get(), E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
-
-       r = pEventArg->SetEventInfo(_WebUiEventArg::BLOCK_START, *startPoint.get());
-       SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
-       startPoint.release();
-
-       r = pEventArg->SetEventInfo(_WebUiEventArg::BLOCK_END, *endPoint.get());
-       SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
-       endPoint.release();
-
-       r = __pWebEvent->FireAsync(*pEventArg.get());
-       SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
-       pEventArg.release();
+       return SetBlockSelectionPosition(_CoordinateSystemUtils::ConvertToInteger(startPoint));
 }
 
 
@@ -3406,21 +3413,13 @@ _WebImpl::ReleaseBlock(void)
 void
 _WebImpl::GetBlockRange(Point& startPoint, Point& endPoint) const
 {
-       Eina_Rectangle leftHandle;
-       Eina_Rectangle rightHandle;
-
-       ewk_view_text_selection_range_get(__pWebCore->GetWebNativeNode(), &leftHandle, &rightHandle);
+       FloatPoint tempStartPoint;
+       FloatPoint tempEndPoint;
 
-       startPoint.x = leftHandle.x;
-       startPoint.y = leftHandle.y;
-       endPoint.x = rightHandle.x + rightHandle.w;
-       endPoint.y = rightHandle.y + rightHandle.h;
+       GetBlockRange(tempStartPoint, tempEndPoint);
 
-       if ((endPoint.x != 0) && (endPoint.y != 0))
-       {
-               startPoint = __pWebCore->GetRelativeCoordinate(startPoint);
-               endPoint = __pWebCore->GetRelativeCoordinate(endPoint);
-       }
+       startPoint = _CoordinateSystemUtils::ConvertToInteger(tempStartPoint);
+       endPoint = _CoordinateSystemUtils::ConvertToInteger(tempEndPoint);
 }
 
 
@@ -3437,7 +3436,7 @@ _WebImpl::GetBlockRange(FloatPoint& startPoint, FloatPoint& endPoint) const
        endPoint.x = _CoordinateSystemUtils::ConvertToFloat(rightHandle.x + rightHandle.w);
        endPoint.y = _CoordinateSystemUtils::ConvertToFloat(rightHandle.y + rightHandle.h);
 
-       if ((endPoint.x != 0) && (endPoint.y != 0))
+       if ((endPoint.x != 0.0f) && (endPoint.y != 0.0f))
        {
                startPoint = __pWebCore->GetRelativeCoordinate(startPoint);
                endPoint = __pWebCore->GetRelativeCoordinate(endPoint);