Init Tizen 2.2.1
[framework/osp/web.git] / src / controls / FWebCtrl_UserConfirmPopup.cpp
index e5f6c11..95ea782 100755 (executable)
@@ -25,6 +25,7 @@
 #include <FBaseSysLog.h>
 #include <FBaseUtilUri.h>
 #include <FGrpDimension.h>
+#include <FGrpFont.h>
 #include <FGrpRectangle.h>
 #include <FIoDbEnumerator.h>
 #include <FIoDbStatement.h>
 #include <FUiCtrlButton.h>
 #include <FUiCtrlLabel.h>
 #include <FUiCtrlPanel.h>
+#include <FUiCtrlScrollPanel.h>
 #include <FUiKeyEventInfo.h>
 #include <FUiLayout.h>
 #include <FUiVerticalBoxLayout.h>
+#include <FGrp_TextTextObject.h>
+#include <FGrp_TextTextSimple.h>
 #include <FIo_DatabaseImpl.h>
 #include <FSys_SystemResource.h>
 #include <FUi_ControlManager.h>
 #include <FUi_ResourceManager.h>
-#include "FWebCtrl_EflWebkit.h"
+#include "FWebCtrl_WebManager.h"
 #include "FWebCtrl_UserConfirmPopup.h"
 #include "FWebCtrl_Utility.h"
 #include "FWebCtrl_WebImpl.h"
@@ -49,6 +53,7 @@ using namespace Tizen::Base;
 using namespace Tizen::Base::Collection;
 using namespace Tizen::Base::Utility;
 using namespace Tizen::Graphics;
+using namespace Tizen::Graphics::_Text;
 using namespace Tizen::Io;
 using namespace Tizen::Security::Cert;
 using namespace Tizen::System;
@@ -60,10 +65,14 @@ namespace Tizen { namespace Web { namespace Controls
 {
 
 
+static const int TEXT_SIZE_ADJUST = 1;
+
+
 _UserConfirmPopup::_UserConfirmPopup(void)
        : __pUserPolicyData(null)
        , __userConfirmMode(USER_CONFIRM_USERMEDIA)
        , __pCheckButton(null)
+       , __isUserActionNeeded(false)
        , __sync(false)
        , __pImpl(null)
 {
@@ -72,10 +81,10 @@ _UserConfirmPopup::_UserConfirmPopup(void)
 
 _UserConfirmPopup::~_UserConfirmPopup(void)
 {
-       
-       if (IsModalPopup())
+       if (__isUserActionNeeded == true)
        {
                HandleUserAction(EINA_FALSE);
+               __isUserActionNeeded = false;
        }
 }
 
@@ -98,8 +107,10 @@ _UserConfirmPopup::Construct(_UserConfirmMode userConfirmMode, void* pEventInfo,
        __userConfirmMode = userConfirmMode;
        __sync = sync;
 
+       __isUserActionNeeded = true;
+
        bool hasTitle = true;
-       int popupMaxHeight = 2*pPopupData->labelDim.height + pPopupData->btnDim.height + 2*pPopupData->sideMargin;
+       int popupMaxHeight = 2*pPopupData->labelDim.height + pPopupData->panelHeight;
 
        __pImpl = pImpl;
        SysAssertf(__pImpl != null, "Failed to get _WebImpl");
@@ -111,7 +122,6 @@ _UserConfirmPopup::Construct(_UserConfirmMode userConfirmMode, void* pEventInfo,
 
        if (__userConfirmMode == USER_SCRIPT_ALERT)
        {
-               popupMaxHeight -=  2*pPopupData->sideMargin;
                hasTitle = false;
        }
 
@@ -123,15 +133,6 @@ _UserConfirmPopup::Construct(_UserConfirmMode userConfirmMode, void* pEventInfo,
                SetTitleText(pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_TPLATFORM_HEADER_SECURITY_WARNING_ABB"));
        }
 
-       Rectangle rect(0, 0, 0, 0);
-
-       //label
-       rect.height = 2*pPopupData->labelDim.height;
-       rect.width = pPopupData->labelDim.width;
-
-       std::unique_ptr<Label> pLabel(new (std::nothrow) Label());
-       SysTryReturnResult(NID_WEB_CTRL, pLabel.get(), E_OUT_OF_MEMORY, "Memory Allocation failed.");
-
        String message = L"";
        if (userConfirmMode >= USER_SCRIPT_ALERT && userConfirmMode <= USER_CONFIRM_INDEXED_DB_QUOTA_EXCEDED)
        {
@@ -141,15 +142,89 @@ _UserConfirmPopup::Construct(_UserConfirmMode userConfirmMode, void* pEventInfo,
        {
                message = GetMessageFromPolicy();
        }
+
+       Rectangle rect(0, 0, 0, 0);
+
+       //label
+       rect.height = 2*pPopupData->labelDim.height;
+       rect.width = pPopupData->labelDim.width;
+
+       //With the font of label and width of label, required height is calculated
+       //      using textobject. TEXT_SIZE_ADJUST is used to increase font size and get bigger height
+       //      as the accurate height is not fitting text in some cases.
+       Font font;
+       r = font.Construct(FONT_STYLE_PLAIN, pPopupData->labelFontSize + TEXT_SIZE_ADJUST);
+       SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
+
+       std::unique_ptr<TextObject> pTextObject(new (std::nothrow) TextObject());
+       SysTryReturnResult(NID_WEB_CTRL, pTextObject.get(), E_OUT_OF_MEMORY, "Memory Allocation failed.");
+
+       r = pTextObject->Construct();
+       SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
+
+       std::unique_ptr<TextSimple> pSimpleText(new (std::nothrow) TextSimple(message.GetPointer(), message.GetLength(), TEXT_ELEMENT_SOURCE_TYPE_EXTERNAL, &font));
+       SysTryReturnResult(NID_WEB_CTRL, pSimpleText.get(), E_OUT_OF_MEMORY, "Memory Allocation failed.");
+
+       r = pTextObject->AppendElement(*pSimpleText);
+       SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
+
+       pSimpleText.release();
+
+       r = pTextObject->SetWrap(TEXT_OBJECT_WRAP_TYPE_WORD);
+       SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
+
+       r = pTextObject->SetBounds(rect);
+       SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
+
+       r = pTextObject->SetFont(&font, 0, message.GetLength());
+       SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
+
+       r = pTextObject->Compose();
+       SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
+
+       int labelHeight = pTextObject->GetTotalHeight();
+
+       std::unique_ptr<Label> pLabel(new (std::nothrow) Label());
+       SysTryReturnResult(NID_WEB_CTRL, pLabel.get(), E_OUT_OF_MEMORY, "Memory Allocation failed.");
+
        r = pLabel->Construct(rect, message);
        SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
 
        pLabel->SetTextConfig(pPopupData->labelFontSize, LABEL_TEXT_STYLE_NORMAL);
 
-       r = AddControl(*pLabel);
-       SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
+       Control* pInfoLabel = null;
+
+       if (rect.height < labelHeight)
+       {
+               //message text is bigger than label, scroll is created to accomodate it.
+               std::unique_ptr<ScrollPanel> pScrollPanel(new (std::nothrow) ScrollPanel());
+               SysTryReturnResult(NID_WEB_CTRL, pScrollPanel.get(), E_OUT_OF_MEMORY, "Memory Allocation failed.");
+
+               r = pScrollPanel->Construct(rect);
+               SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
+
+               r = AddControl(*pScrollPanel);
+               SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
+
+               ScrollPanel* pSPanel = pScrollPanel.release();
+
+               r = pLabel->SetSize(Dimension(rect.width, labelHeight));
+               SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
+
+               r = pSPanel->AddControl(*pLabel);
+               SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
+
+               pLabel.release();
+               pInfoLabel = pSPanel;
+       }
+       else
+       {
+               r = AddControl(*pLabel);
+               SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
+
+               pInfoLabel = pLabel.release();
+       }
 
-       Label* pInfoLabel = pLabel.release();
        //checkbutton
        if (__userConfirmMode == USER_CONFIRM_GEOLOCATION)
        {
@@ -184,6 +259,13 @@ _UserConfirmPopup::Construct(_UserConfirmMode userConfirmMode, void* pEventInfo,
                idList.Add(*(new Integer(ID_BUTTON_USER_ALLOW)));
                titleList.Add(*(new String(pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_TPLATFORM_BUTTON_OK"))));
        }
+       else if (userConfirmMode == USER_BEFORE_UNLOAD_CONFIRM)
+       {
+               idList.Add(*(new Integer(ID_BUTTON_USER_CANCEL)));
+               idList.Add(*(new Integer(ID_BUTTON_USER_ALLOW)));
+               titleList.Add(*(new String(pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_TPLATFORM_BUTTON_LEAVE"))));
+               titleList.Add(*(new String(pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_TPLATFORM_BUTTON_STAY"))));
+       }
        else
        {
                idList.Add(*(new Integer(ID_BUTTON_USER_CANCEL)));
@@ -203,12 +285,6 @@ _UserConfirmPopup::Construct(_UserConfirmMode userConfirmMode, void* pEventInfo,
        {
                pLayout->SetHorizontalAlignment(*__pCheckButton, LAYOUT_HORIZONTAL_ALIGN_CENTER);
        }
-       pLayout->SetHorizontalAlignment(*pButtonPanel, LAYOUT_HORIZONTAL_ALIGN_CENTER);
-
-       if ( __userConfirmMode != USER_SCRIPT_ALERT )
-       {
-               pLayout->SetSpacing(*pButtonPanel, 2*pPopupData->sideMargin);
-       }
 
        SetPropagatedKeyEventListener(this);
        return E_SUCCESS;
@@ -269,6 +345,11 @@ _UserConfirmPopup::OnActionPerformed(const Control& source, int actionId)
                        __pImpl->SendUserEvent(ID_USER_SCRIPT_CONFIRM_CLOSE, null);
                        break;
                }
+               case USER_BEFORE_UNLOAD_CONFIRM:
+               {
+                       __pImpl->SendUserEvent(ID_USER_BEFORE_UNLOAD_CONFIRM_CLOSE, null);
+                       break;
+               }
                default:
                        SysAssert(false);
                }
@@ -389,6 +470,12 @@ CATCH:
                ewk_view_javascript_confirm_reply(pView, allow);
                break;
        }
+       case USER_BEFORE_UNLOAD_CONFIRM:
+       {
+               Evas_Object* pView = reinterpret_cast< Evas_Object* >(__pUserPolicyData);
+               ewk_view_before_unload_confirm_panel_reply(pView, !allow);
+               break;
+       }
        case USER_CONFIRM_APP_CACHE:
        {
                Evas_Object *pObj = reinterpret_cast< Evas_Object* >(__pUserPolicyData);
@@ -416,6 +503,7 @@ CATCH:
        default:
                SysAssert(false);
        }
+       __isUserActionNeeded = false;
 }
 
 
@@ -561,6 +649,11 @@ _UserConfirmPopup::OnKeyReleased(Control& source, const KeyEventInfo& keyEventIn
                        __pImpl->SendUserEvent(ID_USER_SCRIPT_CONFIRM_CLOSE, null);
                        break;
                }
+               case USER_BEFORE_UNLOAD_CONFIRM:
+               {
+                       __pImpl->SendUserEvent(ID_USER_BEFORE_UNLOAD_CONFIRM_CLOSE, null);
+                       break;
+               }
                case USER_PROTOCOL_HANDLER:
                case USER_CONTENT_HANDLER:
                case USER_CONFIRM_APP_CACHE: