Fix deleting controls order defect
authorjaewon7.cho <jaewon7.cho@samsung.com>
Thu, 28 Mar 2013 08:56:43 +0000 (17:56 +0900)
committerjaewon7.cho <jaewon7.cho@samsung.com>
Fri, 29 Mar 2013 05:51:05 +0000 (14:51 +0900)
Change-Id: I46ac000a7d47f0b9bc5cb3edfca2a46bc438353a
Signed-off-by: jaewon7.cho <jaewon7.cho@samsung.com>
src/ui/FUiContainer.cpp
src/ui/FUi_ContainerImpl.cpp [changed mode: 0644->0755]
src/ui/FUi_Control.cpp
src/ui/FUi_ControlImpl.cpp
src/ui/FUi_WindowImpl.cpp
src/ui/inc/FUi_ContainerImpl.h [changed mode: 0644->0755]
src/ui/inc/FUi_Control.h

index 2f9db8f..29a9149 100644 (file)
@@ -172,7 +172,7 @@ Container::RemoveControl(Control* pControl)
        _ContainerImpl* pImpl = _ContainerImpl::GetInstance(*this);
        SysAssertf(pImpl != null, "Not yet constructed. Construct() should be called before use.");
 
-       result r = pImpl->RemoveChild(const_cast <_ControlImpl*>(_ControlImpl::GetInstance(*pControl)));
+       result r = pImpl->RemoveControl(const_cast <_ControlImpl*>(_ControlImpl::GetInstance(*pControl)));
        SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
 
        return E_SUCCESS;
@@ -184,7 +184,7 @@ Container::RemoveControl(int index)
        _ContainerImpl* pImpl = _ContainerImpl::GetInstance(*this);
        SysAssertf(pImpl != null, "Not yet constructed. Construct() should be called before use.");
 
-       result r = pImpl->RemoveChild(index);
+       result r = pImpl->RemoveControl(index);
        SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
 
        return E_SUCCESS;
old mode 100644 (file)
new mode 100755 (executable)
index f7ff60e..85069b9
@@ -115,7 +115,7 @@ _ContainerImpl::~_ContainerImpl(void)
                return;
        }
 
-       RemoveAllChildren();
+       RemoveAllChildren(true);
 }
 
 const char*
@@ -180,21 +180,51 @@ result
 _ContainerImpl::Destroy(void)
 {
        result r = E_SUCCESS;
+
        _ContainerImpl* pParent = GetParent();
        if (pParent)
        {
-               r = pParent->RemoveChild(this, true);
+               r = pParent->RemoveChild(this, false);
+       }
+       RemoveAllChildren(true);
+       Container* pContainer = &GetPublic();
+       delete pContainer;
+       pContainer = null;
+
+       return r;
+}
+
+result
+_ContainerImpl::RemoveControl(_ControlImpl* pChild, bool deallocate)
+{
+       ClearLastResult();
+       result r = E_SUCCESS;
+
+       _ContainerImpl* pChildContainer = dynamic_cast <_ContainerImpl*>(pChild);
+       if (pChildContainer)
+       {
+               _ContainerImpl* pParent = pChildContainer->GetParent();
+               if (pParent)
+               {
+                       r = pParent->RemoveChild(pChildContainer, false);
+                       SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
+               }
+               pChildContainer->RemoveAllChildren(true);
+               r = GetLastResult();
+               SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
+               Container* pContainer = &pChildContainer->GetPublic();
+               delete pContainer;
+               pContainer = null;
        }
        else
        {
-               RemoveAllChildren(true);
-               delete &GetPublic();
-               return E_SUCCESS;
+               r = RemoveChild(pChild, deallocate);
+               SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
        }
+
        return r;
 }
 
-// E_INVALID_ARG, E_OBJ_NOT_FOUND
 result
 _ContainerImpl::RemoveChild(_ControlImpl* pChild, bool deallocate)
 {
@@ -224,6 +254,38 @@ _ContainerImpl::RemoveChild(_ControlImpl* pChild, bool deallocate)
 }
 
 result
+_ContainerImpl::RemoveControl(int index)
+{
+       ClearLastResult();
+       result r = E_SUCCESS;
+
+       _ControlImpl* pChild = GetChild(index); // Find child control.
+       r = GetLastResult();
+       SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
+       
+       _ContainerImpl* pChildContainer = dynamic_cast <_ContainerImpl*>(pChild);
+       if (pChildContainer)
+       {
+               _ContainerImpl* pParent = pChildContainer->GetParent();
+               if (pParent)
+               {
+                       r = pParent->RemoveChild(pChildContainer, false);
+                       SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
+               }
+               pChildContainer->RemoveAllChildren(true);
+               r = GetLastResult();
+               SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
+               Container* pContainer = &pChildContainer->GetPublic();
+               delete pContainer;
+               pContainer = null;
+       }
+       r = RemoveChild(index);
+       SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
+
+       return r;
+}
+
+result
 _ContainerImpl::RemoveChild(int index)
 {
        ClearLastResult();
@@ -246,32 +308,16 @@ _ContainerImpl::RemoveChild(int index)
 }
 
 void
-_ContainerImpl::DeleteAllChildren(_ContainerImpl* pChild, bool detachSystemChild)
+_ContainerImpl::DeleteAllChildren(_ContainerImpl* pChild, bool detachSystemChild, ArrayList* pChildrenList)
 {
        ArrayList* pList = static_cast <ArrayList*>(pChild->GetChildrenPublic());
        int count = pList->GetCount();
-       for (int index = 0; index < count; index++)
+       for (int index = count; index >= 0; index--)
        {
-               Container* pContainer = dynamic_cast <Container*>(pList->GetAt(index));
-               result r = GetLastResult();
-               if (IsFailed(r))
-               {
-                       SysAssert(r == E_OUT_OF_RANGE);
-                       SysLogException(NID_UI,
-                                        E_OUT_OF_RANGE, "[E_OUT_OF_RANGE] The specified index is out of range (index = %d, count = %d.)",
-                                        index, GetChildCount());
-                       return;
-               }
-
-               if (pContainer)
+               Control* pControl = static_cast <Control*>(pList->GetAt(index));
+               if (pControl)
                {
-                       _ContainerImpl* pContainerImpl = _ContainerImpl::GetInstance(*pContainer);
-                       DeleteAllChildren(pContainerImpl, detachSystemChild);
-                       pContainer->Destroy();
-               }
-               else
-               {
-                       Control* pControl = static_cast <Control*>(pList->GetAt(index));
+                       Container* pContainer = dynamic_cast <Container*>(pControl);
                        result r = GetLastResult();
                        if (IsFailed(r))
                        {
@@ -281,12 +327,30 @@ _ContainerImpl::DeleteAllChildren(_ContainerImpl* pChild, bool detachSystemChild
                                                 index, GetChildCount());
                                return;
                        }
-                       _ControlImpl* pControlImpl = _ControlImpl::GetInstance(*pControl);
-                       if (pControlImpl)
+
+                       if (pContainer)
+                       {
+                               _ContainerImpl* pContainerImpl = _ContainerImpl::GetInstance(*pContainer);
+                               ArrayList* pContainerChildrenList = static_cast <ArrayList*>(pContainerImpl->GetChildrenPublic());
+                               int childrenCount = pContainerChildrenList->GetCount();
+
+                               if (childrenCount > 0)
+                               {
+                                       DeleteAllChildren(pContainerImpl, detachSystemChild, pContainerChildrenList);
+                               }
+                               r = pChildrenList->Remove(*pContainer, true);
+                               SysAssert(r == E_SUCCESS);
+                       }
+                       else
                        {
-                               if (detachSystemChild || pControlImpl->GetCore().GetArea() != _CONTROL_AREA_SYSTEM)
+                               _ControlImpl* pControlImpl = _ControlImpl::GetInstance(*pControl);
+                               if (pControlImpl)
                                {
-                                       pControl->Destroy();
+                                       if (detachSystemChild || pControlImpl->GetCore().GetArea() != _CONTROL_AREA_SYSTEM)
+                                       {
+                                               r = pChildrenList->Remove(*pControl, true);
+                                               SysAssert(r == E_SUCCESS);
+                                       }
                                }
                        }
                }
@@ -296,35 +360,10 @@ _ContainerImpl::DeleteAllChildren(_ContainerImpl* pChild, bool detachSystemChild
 void
 _ContainerImpl::RemoveAllChildren(bool detachSystemChild)
 {
-       ClearLastResult();
-       result r = E_SUCCESS;
-
-       GetCore().DetachAllChildren(detachSystemChild);
+       GetCore().DetachAllChildren(detachSystemChild, true);
        SysAssert(GetLastResult() == E_SUCCESS);
-       DeleteAllChildren(this, detachSystemChild);
-
-       if (detachSystemChild)
-       {
-               __controlPublics.RemoveAll(false);
-       }
-       else
-       {
-               int childCount = __controlPublics.GetCount();
-               int itemIndex = 0;
-
-               while (childCount--)
-               {
-                       _ControlImpl* pControl = GetChild(itemIndex);
-                       if (pControl->GetCore().GetArea() == _CONTROL_AREA_SYSTEM)
-                       {
-                               itemIndex++;
-                               continue;
-                       }
-
-                       r = __controlPublics.Remove(pControl->GetPublic(), false);
-                       SysAssert(r == E_SUCCESS);
-               }
-       }
+       ArrayList* pChildrenList = static_cast <ArrayList*>(GetChildrenPublic());
+       DeleteAllChildren(this, detachSystemChild, pChildrenList);
 }
 
 result
index f8ef9c3..92328a1 100755 (executable)
-//
-// Open Service Platform
-// Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
-//
-// Licensed under the Flora License, Version 1.0 (the License);
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://floralicense.org/license/
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an AS IS BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-
-/**
- * @file               FUi_Control.cpp
- * @brief              This is the implementation file for the _Control class.
- */
-
-#include <new>
-#include <unique_ptr.h>
-#include <FBaseColLinkedListT.h>
-#include <FBaseColArrayListT.h>
-#include <FBaseColHashMapT.h>
-#include <FBaseSysLog.h>
-#include <FGrpFloatRectangle.h>
-#include <FUiAnimVisualElementContentProvider.h>
-#include <FBase_Log.h>
-#include <FGrp_BitmapImpl.h>
-#include <FSys_SystemInfoImpl.h>
-#include "FUi_Control.h"
-#include "FUi_ControlManager.h"
-#include "FUi_CoordinateSystemUtils.h"
-#include "FUi_Window.h"
-#include "FUi_EcoreEvasMgr.h"
-#include "FUi_EcoreEvas.h"
-#include "FUi_LayoutLayoutContainer.h"
-#include "FUi_LayoutAbsoluteLayout.h"
-#include "FUi_LayoutILayoutItemHandler.h"
-#include "FUi_TouchManager.h"
-#include "FUi_DataBindingContext.h"
-#include "FUi_TouchLongPressGestureDetector.h"
-#include "FUi_TouchTapGestureDetector.h"
-#include "FUi_AccessibilityContainer.h"
-#include "FUi_ResourceManager.h"
-#include "FUiAnim_ControlVisualElement.h"
-#include "FUiAnim_Debug.h"
-#include "FUiAnim_VisualElement.h"
-#include "FUiAnim_VisualElementImpl.h"
-#include "FUiCtrl_Form.h"
-#include "FUiCtrl_Frame.h"
-#include "FUi_ContainerImpl.h"
-
-using namespace std;
-using namespace Tizen::Base;
-using namespace Tizen::Base::Collection;
-using namespace Tizen::Base::Runtime;
-using namespace Tizen::Graphics;
-using namespace Tizen::Ui;
-using namespace Tizen::Ui::Animations;
-
-namespace {
-
-int
-GetZOrderGroupOfVisualElement(_ControlLayer layer)
-{
-       switch (layer)
-       {
-       case _CONTROL_LAYER_OVERLAY:
-               return _ControlVisualElement::Z_ORDER_GROUP_CONTROL - 1;
-       case _CONTROL_LAYER_CLIENT_BOTTOM:
-               return _ControlVisualElement::Z_ORDER_GROUP_CONTROL;
-       case _CONTROL_LAYER_NONE:
-               // fall through
-       case _CONTROL_LAYER_CLIENT_MIDDLE:
-               return _ControlVisualElement::Z_ORDER_GROUP_CONTROL + 1;
-       case _CONTROL_LAYER_CLIENT_TOP:
-               return _ControlVisualElement::Z_ORDER_GROUP_CONTROL + 2;
-       case _CONTROL_LAYER_SYSTEM:
-               return _ControlVisualElement::Z_ORDER_GROUP_CONTROL + 3;
-       default:
-               SysAssert(false);
-               return _ControlVisualElement::Z_ORDER_GROUP_CONTROL + 1;
-       }
-}
-
-inline bool
-AdjustSizeToRange(float& width, float& height, const FloatDimension& minDim, const FloatDimension& maxDim)
-{
-       bool changed = false;
-       if (width < minDim.width)
-       {
-               width = minDim.width;
-               changed = true;
-       }
-       if (height < minDim.height)
-       {
-               height = minDim.height;
-               changed = true;
-       }
-
-       if (width > maxDim.width)
-       {
-               width = maxDim.width;
-               changed = true;
-       }
-       if (height > maxDim.height)
-       {
-               height = maxDim.height;
-               changed = true;
-       }
-
-       return changed;
-}
-
-inline bool
-AdjustSizeToRange(FloatDimension& dim, const FloatDimension& minDim, const FloatDimension& maxDim)
-{
-       return AdjustSizeToRange(dim.width, dim.height, minDim, maxDim);
-}
-
-// E_OUT_OF_MEMORY
-// E_SYSTEM
-_ControlVisualElement*
-CreateVisualElementN(void)
-{
-       ClearLastResult();
-
-       _ControlVisualElement* pVisualElement = new (std::nothrow) _ControlVisualElement;
-       SysTryReturn(NID_UI, pVisualElement, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");
-
-       SysTryCatch(NID_UI,
-               pVisualElement->ConstructControlVisualElement() == E_SUCCESS, ,
-               E_SYSTEM, "[E_SYSTEM] System error occurred.");
-
-       pVisualElement->SetImplicitAnimationEnabled(false);
-       pVisualElement->SetShowState(true);
-       pVisualElement->SetBackBufferEnabled(true);
-       pVisualElement->SetRedrawOnResizeEnabled(true);
-       pVisualElement->SetSurfaceOpaque(false);
-
-       return pVisualElement;
-
-CATCH:
-       //delete pVisualElement;
-       pVisualElement->Destroy();
-       return null;
-}
-
-_Control::GestureMap*
-CreateGestureMapN(void)
-{
-       ClearLastResult();
-
-       _Control::GestureMap* pGestureMap = new (std::nothrow) _Control::GestureMap;
-       SysTryReturn(NID_UI, pGestureMap, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");
-
-       SysTryCatch(NID_UI,
-               pGestureMap->Construct() == E_SUCCESS, ,
-               E_SYSTEM, "[E_SYSTEM] System error occurred.");
-
-       return pGestureMap;
-
-CATCH:
-       delete pGestureMap;
-       return null;
-}
-
-// E_OUT_OF_MEMORY
-_Control::ControlList*
-CreateControlListN(void)
-{
-       ClearLastResult();
-
-       _Control::ControlList* pControlList = new (std::nothrow) _Control::ControlList;
-       SysTryReturn(NID_UI, pControlList, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");
-
-       return pControlList;
-}
-
-// E_OUT_OF_MEMORY
-_Control::WindowList*
-CreateWindowListN(void)
-{
-       ClearLastResult();
-
-       _Control::WindowList* pWindowList = new (std::nothrow) _Control::WindowList;
-       SysTryReturn(NID_UI, pWindowList, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");
-
-       return pWindowList;
-}
-
-// E_OUT_OF_MEMORY
-// E_SYSTEM
-_Layout::LayoutContainer*
-CreateLayoutContainerN(_Layout::ILayoutItemHandler* pLayoutItemHandler)
-{
-       ClearLastResult();
-       result r = E_SUCCESS;
-
-       _Layout::LayoutContainer* pLayoutContainer = null;
-       _Layout::AbsoluteLayout* pAbsLayout = null;
-
-       pLayoutContainer = new (std::nothrow) _Layout::LayoutContainer();
-       SysTryReturn(NID_UI, pLayoutContainer, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage");
-       if (IsFailed(GetLastResult()))
-       {
-               goto CATCH;
-       }
-
-       pAbsLayout = new (std::nothrow) _Layout::AbsoluteLayout();
-       SysTryCatch(NID_UI, pAbsLayout, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");
-       if (IsFailed(GetLastResult()))
-       {
-               goto CATCH;
-       }
-
-       pLayoutContainer->SetItemHandler(pLayoutItemHandler);
-
-       r = pLayoutContainer->SetDefaultLayout(*pAbsLayout);
-       SysTryCatch(NID_UI, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] System error occurred.");
-
-       return pLayoutContainer;
-
-CATCH:
-       delete pAbsLayout;
-       delete pLayoutContainer;
-
-       return null;
-}
-
-} // Anonymous namespace
-
-namespace Tizen { namespace Ui
-{
-
-IMPLEMENT_PROPERTY(_Control);
-
-class _Control::ControlVisualElementContentProvider
-       : public VisualElementContentProvider
-{
-
-private:
-       _Control& __control;
-
-public:
-       ControlVisualElementContentProvider(_Control& control)
-               : __control(control)
-       {
-       }
-
-       virtual ~ControlVisualElementContentProvider(void)
-       {
-       }
-
-       virtual bool PrepareDraw(VisualElement& target)
-       {
-               _ControlVisualElement* pCVE = dynamic_cast <_ControlVisualElement*>(&target);
-               if (!pCVE)
-               {
-                       return false;
-               }
-
-               Color bgColor = __control.GetBackgroundColor();
-
-               pCVE->SetBackgroundColor(
-                       _Colorf(
-                               (float) bgColor.GetRed() / 255.0f,
-                               (float) bgColor.GetGreen() / 255.0f,
-                               (float) bgColor.GetBlue() / 255.0f,
-                               (float) bgColor.GetAlpha() / 255.0f
-                               )
-                       );
-
-               __control.GetControlDelegate().OnDraw();
-
-               target.SetFlushNeeded();
-
-               return false;
-       }
-
-       virtual HitTestResult HitTest(VisualElement& target, const FloatPoint& point)
-       {
-               return __control.GetControlDelegate().HitTest(point);
-       }
-
-private:
-       ControlVisualElementContentProvider(const ControlVisualElementContentProvider& rhs);
-       ControlVisualElementContentProvider& operator =(const ControlVisualElementContentProvider& rhs);
-};
-
-class _Control::ControlVisualElementEventListener
-       : public IVisualElementEventListener
-{
-public:
-       ControlVisualElementEventListener(_Control& control)
-               : __control(control)
-       {
-       }
-
-       virtual ~ControlVisualElementEventListener(void)
-       {
-       }
-
-public:
-       virtual void OnChildAttached(Tizen::Ui::Animations::VisualElement& source, Tizen::Ui::Animations::VisualElement& child)
-       {
-       }
-
-       virtual void OnChildDetached(Tizen::Ui::Animations::VisualElement& source, Tizen::Ui::Animations::VisualElement& child)
-       {
-       }
-
-       virtual void OnAttached(Tizen::Ui::Animations::VisualElement& source, Tizen::Ui::Animations::VisualElement& parent)
-       {
-       }
-
-       virtual void OnDetached(Tizen::Ui::Animations::VisualElement& source, Tizen::Ui::Animations::VisualElement& parent)
-       {
-       }
-
-       virtual result OnTransformChanging(Tizen::Ui::Animations::VisualElement& source, FloatMatrix4& newTransform)
-       {
-               return E_SUCCESS;
-       }
-
-       virtual void OnTransformChanged(Tizen::Ui::Animations::VisualElement& source, const FloatMatrix4& previousTransform)
-       {
-       }
-
-       virtual result OnChildrenTransformChanging(Tizen::Ui::Animations::VisualElement& source, FloatMatrix4& newTransform)
-       {
-               for (int i = 0; i < __control.GetChildCount(); ++i)
-               {
-                       _Control* pChild = __control.GetChild(i);
-                       if (!pChild)
-                       {
-                               continue;
-                       }
-
-                       if (pChild->GetArea() == _CONTROL_AREA_SYSTEM)
-                       {
-                               _VisualElement* pVisualElement = pChild->GetVisualElement();
-                               if (pVisualElement)
-                               {
-                                       FloatMatrix4 inverseMatrix(newTransform);
-                                       inverseMatrix.Invert();
-
-                                       result r = pVisualElement->SetTransformMatrix(inverseMatrix);
-                                       if (r != E_SUCCESS)
-                                       {
-                                               continue;
-                                       }
-                               }
-                       }
-               }
-
-               return E_SUCCESS;
-       }
-
-       virtual void OnChildrenTransformChanged(Tizen::Ui::Animations::VisualElement& source, const FloatMatrix4& previousTransform)
-               {
-       }
-
-       virtual result OnBoundsChanging(Tizen::Ui::Animations::VisualElement& source, FloatRectangle& newBounds)
-       {
-               return E_SUCCESS;
-       }
-
-       virtual void OnBoundsChanged(Tizen::Ui::Animations::VisualElement& source, const FloatRectangle& previousBounds)
-       {
-       }
-
-       virtual void OnShowStateChanged(Tizen::Ui::Animations::VisualElement& source, bool previousShowState)
-       {
-       }
-
-private:
-       ControlVisualElementEventListener(const ControlVisualElementEventListener& rhs);
-       ControlVisualElementEventListener& operator =(const ControlVisualElementEventListener& rhs);
-
-private:
-       _Control& __control;
-}; // ControlVisualElementEventListener
-
-// Layout Item Handler
-class _Control::LayoutItemHandler
-       : public _Layout::ILayoutItemHandler
-{
-public:
-       LayoutItemHandler(_Control* pControl)
-               : __pControl(pControl)
-       {
-               SysAssert(__pControl);
-       }
-
-       void SetItemVisibleState(bool visible)
-       {
-               __pControl->SetVisibleState(visible);
-       }
-
-       result SetItemBounds(const FloatRectangle& rect)
-       {
-               SysAssert(__pControl->IsInSizeRange(FloatDimension(rect.width, rect.height)));
-               return __pControl->SetBoundsFinal(rect, false, true);
-       }
-
-       FloatRectangle GetItemBounds(void) const
-       {
-               return __pControl->GetBoundsF();
-       }
-
-       FloatRectangle GetItemClientBoundsFromSize(const FloatDimension& size) const
-       {
-               FloatRectangle clientBounds(0.0f, 0.0f, 0.0f, 0.0f);
-               __pControl->UpdateClientBounds(size, clientBounds);
-               return clientBounds;
-       }
-
-       FloatDimension GetItemContentSize(void) const
-       {
-               return __pControl->GetControlDelegate().GetContentSizeF();
-       }
-
-       FloatDimension GetItemMinimumSize(void) const
-       {
-               return __pControl->GetMinimumSizeF();
-       }
-
-       FloatDimension GetItemMaximumSize(void) const
-       {
-               return __pControl->GetMaximumSizeF();
-       }
-
-       result OnItemMeasure(float& width, float& height)
-       {
-               Dimension evaluatedSize(_CoordinateSystemUtils::ConvertToInteger(width), _CoordinateSystemUtils::ConvertToInteger(height));
-               FloatDimension evaluatedSizeF(width, height);
-
-               bool changed = __pControl->GetControlDelegate().OnEvaluateSize(evaluatedSizeF);
-               if (changed)
-               {
-                       width = evaluatedSizeF.width;
-                       height = evaluatedSizeF.height;
-               }
-               else
-               {
-                       __pControl->GetControlDelegate().OnEvaluateSize(evaluatedSize);
-
-                       if (evaluatedSize.width != (_CoordinateSystemUtils::ConvertToInteger(width)))
-                       {
-                               width = evaluatedSize.width;
-                       }
-                       if (evaluatedSize.height != (_CoordinateSystemUtils::ConvertToInteger(height)))
-                       {
-                               height = evaluatedSize.height;
-                       }
-               }
-
-               return E_SUCCESS;
-       }
-
-private:
-       LayoutItemHandler(const LayoutItemHandler& rhs);
-       LayoutItemHandler& operator =(const LayoutItemHandler& rhs);
-
-private:
-       _Control* __pControl;
-}; // LayoutItemHandler
-
-// E_OUT_OF_MEMORY
-// E_SYSTEM
-_Control*
-_Control::CreateControlN(void)
-{
-       _Control* pControl = new (std::nothrow) _Control;
-       SysTryReturn(NID_UI, pControl, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");
-       if (IsFailed(GetLastResult()))
-       {
-               goto CATCH;
-       }
-
-       pControl->AcquireHandle();
-
-       SysAssert(GetLastResult() == E_SUCCESS);
-       return pControl;
-
-CATCH:
-       delete pControl;
-       return null;
-}
-
-void
-_Control::ResetEventListeners(void)
-{
-       __pFocusEventListener = this;
-       __pNotificationEventListener = this;
-}
-
-void
-_Control::SetControlDelegate(_IControlDelegate& delegate)
-{
-       __pControlDelegate = &delegate;
-}
-
-void
-_Control::ResetControlDelegate(void)
-{
-       __pControlDelegate = this;
-}
-
-_IControlDelegate&
-_Control::GetControlDelegate(void) const
-{
-       if (__destroying)
-       {
-               return const_cast<_Control&>(*this);
-       }
-
-       SysAssert(__pControlDelegate);
-       return *__pControlDelegate;
-}
-
-void
-_Control::SetPropagatedTouchEventListener(_IPropagatedTouchEventListener* pListener)
-{
-       __pPropagatedTouchEventListener = pListener;
-}
-
-_IPropagatedTouchEventListener*
-_Control::GetPropagatedTouchEventListener(void) const
-{
-       if (__destroying)
-       {
-               return const_cast<_Control*>(this);
-       }
-
-       SysAssert(__pPropagatedTouchEventListener);
-       return __pPropagatedTouchEventListener;
-}
-
-void
-_Control::SetPropagatedKeyEventListener(_IPropagatedKeyEventListener* pListener)
-{
-       __pPropagatedKeyEventListener = pListener;
-}
-
-_IPropagatedKeyEventListener*
-_Control::GetPropagatedKeyEventListener(void) const
-{
-       if (__destroying)
-       {
-               return const_cast<_Control*>(this);
-       }
-
-       SysAssert(__pPropagatedKeyEventListener);
-       return __pPropagatedKeyEventListener;
-}
-
-bool
-_Control::OnPreviewKeyPressed(const _Control& source, const _KeyInfo& keyInfo)
-{
-       return false;
-}
-
-bool
-_Control::OnPreviewKeyReleased(const _Control& source, const _KeyInfo& keyInfo)
-{
-       return false;
-}
-
-bool
-_Control::OnKeyPressed(const _Control& source, const _KeyInfo& keyInfo)
-{
-       //SysLog(NID_UI, ">>> [core] OnKeyPressed(%d, %d)", keyInfo.GetKeyCode(), keyInfo.GetKeyModifier());
-       return false;
-}
-
-bool
-_Control::OnKeyReleased(const _Control& source, const _KeyInfo& keyInfo)
-{
-       //SysLog(NID_UI, ">>> [core] OnKeyReleased(%d, %d)", keyInfo.GetKeyCode(), keyInfo.GetKeyModifier());
-       return false;
-}
-
-bool
-_Control::TranslateKeyEventInfo(const _Control& source, _KeyInfo& keyInfo)
-{
-       return false;
-}
-
-_UiTouchEventDelivery
-_Control::OnPreviewTouchPressed(const _Control& source, const _TouchInfo& touchinfo)
-{
-       return _UI_TOUCH_EVENT_DELIVERY_YES;
-}
-
-_UiTouchEventDelivery
-_Control::OnPreviewTouchReleased(const _Control& source, const _TouchInfo& touchinfo)
-{
-       return _UI_TOUCH_EVENT_DELIVERY_YES;
-}
-
-_UiTouchEventDelivery
-_Control::OnPreviewTouchMoved(const _Control& source, const _TouchInfo& touchinfo)
-{
-       return _UI_TOUCH_EVENT_DELIVERY_YES;
-}
-
-_UiTouchEventDelivery
-_Control::OnPreviewTouchCanceled(const _Control& source, const _TouchInfo& touchinfo)
-{
-       return _UI_TOUCH_EVENT_DELIVERY_YES;
-}
-
-bool
-_Control::OnTouchPressed(const _Control& source, const _TouchInfo& touchinfo)
-{
-       return false;
-}
-
-bool
-_Control::OnTouchReleased(const _Control& source, const _TouchInfo& touchinfo)
-{
-       return false;
-}
-
-bool
-_Control::OnTouchMoved(const _Control& source, const _TouchInfo& touchinfo)
-{
-       return false;
-}
-
-bool
-_Control::OnTouchCanceled(const _Control& source, const _TouchInfo& touchinfo)
-{
-       return false;
-}
-
-bool
-_Control::OnFocusGained(const _Control& source)
-{
-       return false;
-}
-
-bool
-_Control::OnFocusLost(const _Control& source)
-{
-    if (__pFocusVisualElement)
-    {
-        __pFocusVisualElement.reset();
-    }
-       return false;
-}
-
-bool
-_Control::OnPreviewNotifiedN(const _Control& source, IList* pArgs)
-{
-       return false;
-}
-
-bool
-_Control::OnNotifiedN(const _Control& source, IList* pArgs)
-{
-       return false;
-}
-
-bool
-_Control::IsMovable(void) const
-{
-       ClearLastResult();
-       return __movable;
-}
-
-bool
-_Control::IsResizable(void) const
-{
-       ClearLastResult();
-       return __resizable;
-}
-
-Dimension
-_Control::GetContentSize(void) const
-{
-       ClearLastResult();
-       return Dimension(0, 0);
-}
-
-FloatDimension
-_Control::GetContentSizeF(void) const
-{
-       ClearLastResult();
-       return FloatDimension(0.0f, 0.0f);
-}
-
-HitTestResult
-_Control::HitTest(const FloatPoint& point)
-{
-       _VisualElementImpl* pVisualElementImpl = _VisualElementImpl::GetInstance(*__pVisualElement);
-
-       if (pVisualElementImpl)
-       {
-               if (pVisualElementImpl->HitTestI(point) == _VisualElementImpl::HITTEST_MATCH)
-               {
-                       return HIT_TEST_MATCH;
-               }
-       }
-
-       return HIT_TEST_NOWHERE;
-}
-
-float
-_Control::GetVerticalScrollPosition(void) const
-{
-       return 0.0f;
-}
-
-float
-_Control::GetHorizontalScrollPosition(void) const
-{
-       return 0.0f;
-}
-
-_ControlOrientation
-_Control::GetOrientation(void) const
-{
-       ClearLastResult();
-       return __orientation;
-}
-
-void
-_Control::OnDraw(void)
-{
-}
-
-Canvas*
-_Control::OnCanvasRequestedN(const Dimension& size)
-{
-
-       return null;
-}
-
-Canvas*
-_Control::OnCanvasRequestedFN(const FloatRectangle& bounds)
-{
-
-       return null;
-}
-
-Bitmap*
-_Control::OnCapturedBitmapRequestedN(void)
-{
-
-       return null;
-}
-
-result
-_Control::OnAttaching(const _Control* pParent)
-{
-       return E_SUCCESS;
-}
-
-result
-_Control::OnAttached(void)
-{
-       return E_SUCCESS;
-}
-
-result
-_Control::OnAttachingToMainTree(const _Control* pParent)
-{
-       return E_SUCCESS;
-}
-
-result
-_Control::OnAttachedToMainTree(void)
-{
-       return E_SUCCESS;
-}
-
-result
-_Control::OnDetachingFromMainTree(void)
-{
-       return E_SUCCESS;
-}
-
-void
-_Control::OnAttachingFailed(const _Control& parent)
-{
-}
-
-result
-_Control::OnDetaching(void)
-{
-       return E_SUCCESS;
-}
-
-result
-_Control::OnBoundsChanging(const Rectangle& bounds)
-{
-       return E_SUCCESS;
-}
-
-result
-_Control::OnBoundsChanging(const FloatRectangle& bounds)
-{
-       return E_SUCCESS;
-}
-
-void
-_Control::OnBoundsChanged(void)
-{
-
-}
-
-void
-_Control::OnEvaluateSize(Dimension& evaluatedSize)
-{
-
-}
-
-bool
-_Control::OnEvaluateSize(FloatDimension& evaluatedSize)
-{
-       return false;
-}
-
-void
-_Control::OnParentBoundsChanged(const _Control& parent)
-{
-}
-
-void
-_Control::OnChildAttached(const _Control& child)
-{
-}
-
-void
-_Control::OnChildDetaching(const _Control& child)
-{
-}
-
-void
-_Control::OnChildDetached(const _Control& child)
-{
-}
-
-void
-_Control::OnChildBoundsChanged(const _Control& child)
-{
-}
-
-void
-_Control::OnChildVisibleStateChanged(const _Control& child)
-{
-}
-
-void
-_Control::OnChangeLayout(_ControlOrientation orientation)
-{
-}
-
-void
-_Control::OnZOrderChanging(_ControlZOrderUpdate zOrderUpdate)
-{
-}
-
-void
-_Control::OnVisibleStateChanging(void)
-{
-}
-
-void
-_Control::OnVisibleStateChanged(void)
-{
-}
-
-void
-_Control::OnAncestorVisibleStateChanged(const _Control& control)
-{
-}
-
-void
-_Control::OnAncestorEnableStateChanged(const _Control& control)
-{
-}
-
-void
-_Control::OnTouchPressHandled(const _Control& control)
-{
-}
-
-void
-_Control::OnTouchReleaseHandled(const _Control& control)
-{
-}
-
-void
-_Control::OnTouchMoveHandled(const _Control& control)
-{
-}
-
-void
-_Control::OnFontChanged(Tizen::Graphics::Font* pFont)
-{
-}
-
-void
-_Control::OnFontInfoRequested(unsigned long& style, int& size)
-{
-}
-
-void
-_Control::OnFontInfoRequested(unsigned long& style, float& size)
-{
-}
-
-void
-_Control::OnBackgroundColorChanged(Color& backgroundColor)
-{
-}
-
-void
-_Control::OnTouchCancelHandled(const _Control& control)
-{
-}
-
-void
-_Control::Accept(Visitor& visitor)
-{
-       ClearLastResult();
-
-       VisitType visitType = visitor.Visit(*this);
-
-       switch (visitType)
-       {
-       case VISIT_STOP:
-               break;
-
-       case VISIT_DOWNWARD:
-               for (int i = 0; i < GetChildCount(); ++i) // [Postpone] Keep handle list before iternation.
-               {
-                       _Control* pChild = GetChild(i);
-                       if (pChild)
-                       {
-                               pChild->Accept(visitor);
-                       }
-               }
-               break;
-
-       case VISIT_UPWARD:
-               {
-                       _Control* pParent = GetParent();
-                       if (pParent)
-                       {
-                               pParent->Accept(visitor);
-                       }
-               }
-               break;
-
-       default:
-               break;
-       }
-}
-
-void
-_Control::Accept(Visitor& visitor) const
-{
-       const_cast <_Control*>(this)->Accept(visitor);
-}
-
-void
-_Control::Draw(bool recursive)
-{
-       ClearLastResult();
-
-       Invalidate(recursive);
-       GetVisualElement()->Draw();
-}
-
-void
-_Control::Show(void)
-{
-       GetVisualElement()->Flush();
-       ClearLastResult();
-
-       SysAssert(GetLastResult() == E_SUCCESS);
-}
-
-void
-_Control::ChangeLayout(_ControlOrientation orientation)
-{
-       ClearLastResult();
-
-       struct _Visitor
-               : public Visitor
-       {
-               _Visitor(_ControlOrientation orientation)
-                       : __orientation(orientation){}
-
-               virtual VisitType Visit(_Control& control)
-               {
-                       if (control.__orientation != __orientation)
-                       {
-                               control.__orientation = __orientation;
-                               control.GetControlDelegate().OnChangeLayout(__orientation);
-                               ClearLastResult();
-                       }
-
-                       return VISIT_DOWNWARD;
-               }
-
-private:
-               _ControlOrientation __orientation;
-       };
-
-       _Visitor visitor(orientation);
-       Accept(visitor);
-
-       SysAssert(GetLastResult() == E_SUCCESS);
-}
-
-bool
-_Control::IsLayoutChangable(void) const
-{
-       return true;
-}
-
-bool
-_Control::IsOrientationRoot(void) const
-{
-       return false;
-}
-
-void
-_Control::Invalidate(void)
-{
-       ClearLastResult();
-       GetVisualElement()->InvalidateRectangle(null);
-}
-
-void
-_Control::Invalidate(bool recursive)
-{
-       ClearLastResult();
-
-       struct _Visitor
-               : public Visitor
-       {
-               virtual VisitType Visit(_Control& control)
-               {
-                       if (control.GetVisibleState() == false)
-                       {
-                               return VISIT_STOP;
-                       }
-
-                       control.Invalidate();
-
-                       // Ownee
-                       int owneeCount = control.GetOwneeCount();
-                       for (int i = 0; i < owneeCount; ++i)
-                       {
-                               _Window* pOwnee = control.GetOwnee(i);
-                               if (pOwnee)
-                               {
-                                       pOwnee->Invalidate(true);
-                               }
-                       }
-
-                       return VISIT_DOWNWARD;
-               }
-       };
-
-       // Update layout
-       _Layout::Layout* pLayout = GetLayout();
-       if (pLayout)
-       {
-               pLayout->UpdateLayout();
-       }
-
-       if (recursive == false)
-       {
-               Invalidate();
-       }
-       else
-       {
-               _Visitor visitor;
-               Accept(visitor);
-       }
-}
-
-void
-_Control::Invalidate(const Rectangle& rect)
-{
-       ClearLastResult();
-       FloatRectangle rectf(rect.x, rect.y, rect.width, rect.height);
-       GetVisualElement()->InvalidateRectangle(&rectf);
-
-       __invalidatedBounds = _CoordinateSystemUtils::ConvertToFloat(rect);
-}
-
-void
-_Control::Invalidate(const FloatRectangle& rect)
-{
-       ClearLastResult();
-       FloatRectangle rectf(rect.x, rect.y, rect.width, rect.height);
-       GetVisualElement()->InvalidateRectangle(&rectf);
-
-       __invalidatedBounds = rect;
-}
-
-bool
-_Control::Contains(const Point& point) const
-{
-       ClearLastResult();
-
-       Rectangle bounds = GetBounds();
-       bounds.x = bounds.y = 0;
-       return bounds.Contains(point);
-}
-
-bool
-_Control::Contains(const FloatPoint& point) const
-{
-       ClearLastResult();
-
-       FloatRectangle bounds = GetBoundsF();
-       bounds.x = bounds.y = 0;
-       return bounds.Contains(point);
-}
-
-
-void
-_Control::PartialUpdateLayout(void)
-{
-       ClearLastResult();
-
-       _Layout::Layout* pLayout = GetLayout();
-       if (pLayout)
-       {
-               pLayout->PartialUpdateLayout();
-       }
-}
-
-void
-_Control::UpdateLayout(void)
-{
-       ClearLastResult();
-
-       _Layout::Layout* pLayout = GetLayout();
-       if (pLayout)
-       {
-               pLayout->UpdateLayout();
-       }
-}
-
-result
-_Control::SetChildAlwaysOnTop(_Control& child)
-{
-       ClearLastResult();
-
-       SysTryReturn(NID_UI,
-                               child.GetParent() == this, E_INVALID_ARG,
-                               E_INVALID_ARG, "[E_INVALID_ARG] Not my child.");
-
-       SysTryReturn(NID_UI,
-                               child.GetArea() == _CONTROL_AREA_CLIENT, E_SYSTEM,
-                               E_SYSTEM, "[E_SYSTEM] The child is not in the client area.");
-
-       if (child.GetLayer() == _CONTROL_LAYER_CLIENT_TOP)
-       {
-               return E_SUCCESS;
-       }
-
-       child.SetLayer(_CONTROL_LAYER_CLIENT_TOP);
-
-       SysAssert(GetLastResult() == E_SUCCESS);
-       return E_SUCCESS;
-}
-
-result
-_Control::SetChildAlwaysAtBottom(_Control& child)
-{
-       ClearLastResult();
-
-       SysTryReturn(NID_UI,
-                               child.GetParent() == this, E_INVALID_ARG,
-                               E_INVALID_ARG, "[E_INVALID_ARG] Not my child.");
-
-       SysTryReturn(NID_UI,
-                               child.GetArea() == _CONTROL_AREA_CLIENT, E_SYSTEM,
-                               E_SYSTEM, "[E_SYSTEM] The child is not in the client area.");
-
-       if (child.GetLayer() == _CONTROL_LAYER_CLIENT_BOTTOM)
-       {
-               return E_SUCCESS;
-       }
-
-       child.SetLayer(_CONTROL_LAYER_CLIENT_BOTTOM);
-
-       SysAssert(GetLastResult() == E_SUCCESS);
-       return E_SUCCESS;
-}
-
-result
-_Control::ResetChildLayer(_Control& child)
-{
-       ClearLastResult();
-
-       SysTryReturn(NID_UI,
-                               child.GetParent() == this, E_INVALID_ARG,
-                               E_INVALID_ARG, "[E_INVALID_ARG] Not my child.");
-
-       SysTryReturn(NID_UI,
-                               child.GetArea() == _CONTROL_AREA_CLIENT, E_SYSTEM,
-                               E_SYSTEM, "[E_SYSTEM] The child is not in the client area.");
-
-       if (child.GetLayer() == _CONTROL_LAYER_CLIENT_MIDDLE)
-       {
-               return E_SUCCESS;
-       }
-
-       child.SetLayer(_CONTROL_LAYER_CLIENT_MIDDLE);
-
-       SysAssert(GetLastResult() == E_SUCCESS);
-       return E_SUCCESS;
-}
-
-
-result
-_Control::AttachSystemChild(_Control& child)
-{
-       ClearLastResult();
-       result r = E_SUCCESS;
-
-       r = StartAttaching(child, _CONTROL_AREA_SYSTEM);
-       if (IsFailed(r))
-       {
-               return r;
-       }
-
-       ControlList& children = GetChildList();
-       r = children.Add(&child);
-       SysAssert(r == E_SUCCESS); // [ToDo] Exception check and rollback.
-
-       r = GetVisualElement()->AttachChild(*child.GetVisualElement());
-       SysAssert(r == E_SUCCESS); // [ToDo] Exception check and rollback.
-
-       r = EndAttaching(child);
-       if (IsFailed(r))
-       {
-               return r;
-       }
-
-       SysAssert(GetLastResult() == E_SUCCESS);
-
-       return E_SUCCESS;
-}
-
-result
-_Control::DetachSystemChild(_Control& child)
-{
-       return DetachChild(child);
-}
-
-bool
-_Control::HasParent(void) const
-{
-       return __pParent != null;
-}
-
-_ControlArea
-_Control::GetArea(void) const
-{
-       ClearLastResult();
-       return __area;
-}
-
-_ControlLayer
-_Control::GetLayer(void) const
-{
-       ClearLastResult();
-       return __layer;
-}
-
-void
-_Control::SetLayer(_ControlLayer layer)
-{
-       ClearLastResult();
-       _VisualElementImpl* pImpl = _VisualElementImpl::GetInstance(*GetVisualElement());
-
-       result r = pImpl->SetZOrderGroup(::GetZOrderGroupOfVisualElement(layer));
-       __layer = layer;
-
-       ClearLastResult(); 
-}
-
-const _Control::ControlList&
-_Control::GetChildList() const
-{
-       return const_cast <_Control*>(this)->GetChildList();
-}
-
-_Control::ControlList&
-_Control::GetChildList()
-{
-       return *__pChildren;
-}
-
-bool
-_Control::IsCalledCallAttachingToMainTree(void)
-{
-       return __isCalledCallOnAttachingToMainTree;
-}
-
-void
-_Control::SetCalledCallAttachingToMainTree(bool isAttaching)
-{
-       __isCalledCallOnAttachingToMainTree = isAttaching;
-}
-
-bool
-_Control::IsCalledCallAttachedToMainTree(void)
-{
-       return __isCalledCallOnAttachedToMainTree;
-}
-
-void
-_Control::SetCalledCallAttachedToMainTree(bool isAttached)
-{
-       __isCalledCallOnAttachedToMainTree = isAttached;
-}
-
-result
-_Control::CallOnAttachingToMainTree(_Control& control)
-{
-       result r = E_SUCCESS;
-
-       ControlList& children = control.GetChildList();
-       _Control* pChild = null;
-
-       int childrenCount = children.GetCount();
-
-       for (int index = 0; index < childrenCount; index++)
-       {
-               r = children.GetAt(index, pChild);
-               if (IsFailed(r))
-               {
-                       SysAssert(r == E_OUT_OF_RANGE);
-                       SysTryReturn(NID_UI,
-                               (r != E_OUT_OF_RANGE), E_OUT_OF_RANGE,
-                               E_OUT_OF_RANGE, "[E_OUT_OF_RANGE] The specified index is out of range.");
-               }
-               if (!pChild->IsCalledCallAttachingToMainTree())
-               {
-                       r = CallOnAttachingToMainTree(*pChild);
-                       pChild->SetCalledCallAttachingToMainTree(true);
-                       SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
-               }
-       }
-
-       if (!control.IsCalledCallAttachingToMainTree())
-       {
-               r = control.GetControlDelegate().OnAttachingToMainTree(this);
-               control.SetCalledCallAttachingToMainTree(true);
-               SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
-       }
-
-       return r;
-}
-
-result
-_Control::CallOnAttachedToMainTree(_Control& control)
-{
-       result r = E_SUCCESS;
-
-       ControlList& children = control.GetChildList();
-       _Control* pChild = null;
-
-       int childrenCount = children.GetCount();
-
-       for (int index = 0; index < childrenCount; index++)
-       {
-               r = children.GetAt(index, pChild);
-               if (IsFailed(r))
-               {
-                       SysAssert(r == E_OUT_OF_RANGE);
-                       SysTryReturn(NID_UI,
-                               (r != E_OUT_OF_RANGE), E_OUT_OF_RANGE,
-                               E_OUT_OF_RANGE, "[E_OUT_OF_RANGE] The specified index is out of range.");
-               }
-
-               if (!pChild->IsCalledCallAttachedToMainTree())
-               {
-                       r = CallOnAttachedToMainTree(*pChild);
-                       pChild->SetCalledCallAttachedToMainTree(true);
-               }
-       }
-
-       if (!control.IsCalledCallAttachedToMainTree())
-       {
-               r = control.GetControlDelegate().OnAttachedToMainTree();
-               control.SetCalledCallAttachedToMainTree(true);
-       }
-
-       return r;
-}
-result
-_Control::CallOnDetachingFromMainTree(_Control& control)
-{
-       result r = E_SUCCESS;
-
-       ControlList& children = control.GetChildList();
-       _Control* pChild = null;
-
-       if (!__isPostOrderTraversal)
-       {
-               r = control.GetControlDelegate().OnDetachingFromMainTree();
-               SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
-       }
-
-       int childrenCount = children.GetCount();
-
-       for (int index = 0; index < childrenCount; index++)
-       {
-               r = children.GetAt(index, pChild);
-               if (IsFailed(r))
-               {
-                       SysAssert(r == E_OUT_OF_RANGE);
-                       SysTryReturn(NID_UI,
-                               (r != E_OUT_OF_RANGE), E_OUT_OF_RANGE,
-                               E_OUT_OF_RANGE, "[E_OUT_OF_RANGE] The specified index is out of range.");
-               }
-               r = CallOnDetachingFromMainTree(*pChild);
-               SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
-       }
-
-       if (__isPostOrderTraversal)
-       {
-               r = control.GetControlDelegate().OnDetachingFromMainTree();
-               SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
-       }
-
-       return r;
-}
-
-void
-_Control::CallOnAncestorVisibleStateChanged(void)
-{
-       struct _Visitor
-               : public Visitor
-       {
-               _Visitor(_Control& parent)
-                       : __parent(parent){}
-
-               virtual VisitType Visit(_Control& control)
-               {
-                       control.GetControlDelegate().OnAncestorVisibleStateChanged(__parent);
-                       return VISIT_DOWNWARD;
-               }
-
-               _Control& __parent;
-       };
-
-       _Visitor visitor(*this);
-       Accept(visitor);
-}
-
-void
-_Control::CallOnAncestorEnableStateChanged(void)
-{
-       struct _Visitor
-               : public Visitor
-       {
-               _Visitor(_Control& parent)
-                       : __parent(parent){}
-
-               virtual VisitType Visit(_Control& control)
-               {
-                       control.GetControlDelegate().OnAncestorEnableStateChanged(__parent);
-                       return VISIT_DOWNWARD;
-               }
-
-               _Control& __parent;
-       };
-
-       _Visitor visitor(*this);
-       Accept(visitor);
-}
-
-// E_INVALID_ARG
-// E_SYSTEM
-// [ToDo] Rollback is difficult.
-result
-_Control::StartAttaching(_Control& child, _ControlArea area)
-{
-       result r = E_SUCCESS;
-
-       _Control* pOldParent = child.GetParent();
-
-       SysTryReturn(NID_UI,
-                               (pOldParent != this), E_INVALID_ARG,
-                               E_INVALID_ARG, "[E_INVALID_ARG] The child control is already attached to this container.");
-
-       SysTryReturn(NID_UI,
-                               pOldParent == null, E_INVALID_ARG,
-                               E_INVALID_ARG, "[E_INVALID_ARG] Unable to add the child which already has another parent.");
-
-       r = child.GetControlDelegate().OnAttaching(this);
-       SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
-
-       if (IsAttachedToMainTree())
-       {
-               r = CallOnAttachingToMainTree(child);
-               SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
-       }
-
-       // [ToDo] Add control to layout
-       // What should we do about non-layoutable controls?
-       if (area == _CONTROL_AREA_CLIENT)
-       {
-               _ControlManager* pMgr = _ControlManager::GetInstance();
-               r = GetLastResult();
-               SysTryReturn(NID_UI, pMgr, r, r, "[%s] Propagating.", GetErrorMessage(r));
-
-               r = __pLayoutContainer->AddItem(child.GetLayoutContainer());
-               if (IsFailed(r))
-               {
-                       child.GetControlDelegate().OnAttachingFailed(*this);
-                       SysLogException(NID_UI, E_SYSTEM, "[E_SYSTEM] Failed to apply layout.");
-                       return E_SYSTEM;
-               }
-       }
-
-       if (IsAttachedToMainTree())
-       {
-               if (!(IsOrientationRoot() && child.IsOrientationRoot()))
-               {
-                       child.ChangeLayout(_ControlManager::GetInstance()->GetOrientation());
-               }
-       }
-
-       child.__area = area;
-
-       if (area == _CONTROL_AREA_CLIENT)
-       {
-               if (child.GetLayer() != _CONTROL_LAYER_CLIENT_TOP && child.GetLayer() != _CONTROL_LAYER_CLIENT_BOTTOM)
-               {
-                       child.SetLayer(_CONTROL_LAYER_CLIENT_MIDDLE);
-               }
-       }
-       else
-       {
-               child.SetLayer(_CONTROL_LAYER_SYSTEM);
-       }
-
-       SysAssert(GetLastResult() == E_SUCCESS);
-       return E_SUCCESS;
-}
-
-result
-_Control::EndAttaching(_Control& child)
-{
-       child.SetParent(this);
-
-       FloatRectangle floatBounds(child.GetBoundsF().x, child.GetBoundsF().y, child.GetBoundsF().width, child.GetBoundsF().height);
-
-       result r = E_SUCCESS;
-       if (child.IsLayoutChangable() == false)
-       {
-               r = child.UpdateBoundsOfVisualElement(FloatRectangle(0.0f, 0.0f, floatBounds.width, floatBounds.height));
-       }
-       else
-       {
-               r = child.UpdateBoundsOfVisualElement(floatBounds);
-       }
-       SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
-
-       r = child.GetControlDelegate().OnAttached();
-       SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
-
-       if (IsAttachedToMainTree())
-       {
-               r = CallOnAttachedToMainTree(child);
-               SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
-       }
-
-       ClearLastResult();
-
-       GetControlDelegate().OnChildAttached(child);
-       ClearLastResult();
-
-       return E_SUCCESS;
-}
-
-// E_INVALID_ARG
-// E_OUT_OF_MEMORY
-// E_SYSTEM
-result
-_Control::AttachChild(_Control& child)
-{
-       ClearLastResult();
-       result r = E_SUCCESS;
-
-       r = StartAttaching(child, _CONTROL_AREA_CLIENT);
-       if (IsFailed(r))
-       {
-               return r;
-       }
-
-       ControlList& children = GetChildList();
-       r = children.Add(&child);
-       SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
-
-       r = GetVisualElement()->AttachChild(*child.GetVisualElement());
-
-       r = EndAttaching(child);
-       if (IsFailed(r))
-       {
-               return r;
-       }
-
-       SysAssert(GetLastResult() == E_SUCCESS);
-       UpdateFocusList();
-       return E_SUCCESS;
-}
-
-void 
-_Control::UpdateFocusList(void)
-{
-       _Window* pTop = GetRootWindow();
-       if (pTop)
-       {
-               pTop->ResetFocusList();
-       }               
-}
-// E_INVALID_ARG
-// E_OUT_OF_MEMORY
-// E_SYSTEM
-result
-_Control::InsertChildToBottom(_Control& child)
-{
-       ClearLastResult();
-       result r = E_SUCCESS;
-
-       r = StartAttaching(child, _CONTROL_AREA_CLIENT);
-       if (IsFailed(r))
-       {
-               return r;
-       }
-
-       ControlList& children = GetChildList();
-       r = children.InsertAt(&child, 0);
-       SysAssert(r == E_SUCCESS); // [ToDo] Exception check and rollback.
-
-       GetVisualElement()->InsertChild(*child.GetVisualElement(), null, false);
-       SysAssert(r == E_SUCCESS); // [ToDo] Exception check and rollback.
-
-       r = EndAttaching(child);
-       if (IsFailed(r))
-       {
-               return r;
-       }
-
-       SysAssert(GetLastResult() == E_SUCCESS);
-       return E_SUCCESS;
-}
-
-// E_INVALID_ARG
-// E_OUT_OF_MEMORY
-// E_SYSTEM
-result
-_Control::InsertChildAfter(const _Control& targetChild, _Control& child)
-{
-       ClearLastResult();
-       result r = E_SUCCESS;
-
-       SysTryReturn(NID_UI,
-                               targetChild.GetParent() == this, E_INVALID_ARG,
-                               E_INVALID_ARG, "[E_INVALID_ARG] The target is not my child.");
-
-       r = StartAttaching(child, _CONTROL_AREA_CLIENT);
-       if (IsFailed(r))
-       {
-               return r;
-       }
-
-       int targetIndex = GetChildIndex(targetChild);
-       SysAssert(targetIndex != -1);
-
-       ControlList& children = GetChildList();
-       r = children.InsertAt(&child, targetIndex + 1);
-       SysAssert(r == E_SUCCESS); // [ToDo] Exception check and rollback.
-
-       GetVisualElement()->InsertChild(*child.GetVisualElement(), targetChild.GetVisualElement(), true);
-       SysAssert(r == E_SUCCESS); // [ToDo] Exception check and rollback.
-
-       r = EndAttaching(child);
-       if (IsFailed(r))
-       {
-               return r;
-       }
-
-       SysAssert(GetLastResult() == E_SUCCESS);
-       return E_SUCCESS;
-}
-
-// E_INVALID_ARG
-// E_OUT_OF_MEMORY
-// E_SYSTEM
-result
-_Control::InsertChildBefore(const _Control& targetChild, _Control& child)
-{
-       ClearLastResult();
-       result r = E_SUCCESS;
-
-       SysTryReturn(NID_UI,
-                               targetChild.GetParent() == this, E_INVALID_ARG,
-                               E_INVALID_ARG, "[E_INVALID_ARG] The target is not my child.");
-
-       r = StartAttaching(child, _CONTROL_AREA_CLIENT);
-       if (IsFailed(r))
-       {
-               return r;
-       }
-
-       int targetIndex = GetChildIndex(targetChild);
-       SysAssert(targetIndex != -1);
-
-       ControlList& children = GetChildList();
-       r = children.InsertAt(&child, targetIndex);
-       SysAssert(r == E_SUCCESS); // [ToDo] Exception check and rollback.
-
-       GetVisualElement()->InsertChild(*child.GetVisualElement(), targetChild.GetVisualElement(), false);
-       SysAssert(r == E_SUCCESS); // [ToDo] Exception check and rollback.
-
-       r = EndAttaching(child);
-       if (IsFailed(r))
-       {
-               return r;
-       }
-
-       SysAssert(GetLastResult() == E_SUCCESS);
-       return E_SUCCESS;
-}
-
-// E_SYSTEM
-result
-_Control::DetachChild(_Control& child)
-{
-       ClearLastResult();
-       result r = E_SUCCESS;
-
-       SysTryReturn(NID_UI,
-                               child.GetParent() == this, E_INVALID_ARG,
-                               E_INVALID_ARG, "[E_INVALID_ARG] Not my child.");
-
-       if (IsAttachedToMainTree())
-       {
-               r = CallOnDetachingFromMainTree(child);
-               SysTryReturn(NID_UI,
-                                       r == E_SUCCESS, E_SYSTEM,
-                                       E_SYSTEM, "[E_SYSTEM] The child cannot detached from parent.");
-
-               SysTryReturn(NID_UI,
-                                       child.GetControlDelegate().OnDetaching() == E_SUCCESS, E_SYSTEM,
-                                       E_SYSTEM, "[E_SYSTEM] The child cannot detached from parent.");
-       }
-
-       GetControlDelegate().OnChildDetaching(child);
-       ClearLastResult();
-
-       r = GetVisualElement()->DetachChild(*child.GetVisualElement());
-       SysAssert(r == E_SUCCESS); // [ToDo] Exception check and rollback.
-
-       ControlList& children = GetChildList();
-       r = children.Remove(&child);
-       SysAssert(r == E_SUCCESS); // [ToDo] Exception check and rollback.
-
-       // Remove control to layout
-       if (child.__area == _CONTROL_AREA_CLIENT)
-       {
-               _ControlManager* pMgr = _ControlManager::GetInstance();
-               r = GetLastResult();
-               SysTryReturn(NID_UI, pMgr, r, r, "[%s] Propagating.", GetErrorMessage(r));
-
-               r = __pLayoutContainer->RemoveItem(child.GetLayoutContainer());
-               SysAssert(r == E_SUCCESS); // [ToDo] Exception check and rollback.
-       }
-
-       child.SetParent(null);
-       child.__area = _CONTROL_AREA_NONE;
-       child.__layer = _CONTROL_LAYER_NONE;
-
-       GetControlDelegate().OnChildDetached(child);
-       ClearLastResult();
-
-       SysAssert(GetLastResult() == E_SUCCESS);
-
-       UpdateFocusList();
-       return E_SUCCESS;
-}
-
-// Always success
-void
-_Control::DetachAllChildren(bool detachSystemChild)
-{
-       ClearLastResult();
-       result r = E_SUCCESS;
-
-       int notDetachedChildCount = 0;
-
-       int childCount = GetChildCount();
-       int itemIndex = 0;
-
-       while (childCount--)
-       {
-               _Control* pChild = GetChild(itemIndex);
-               if (pChild == null)
-               {
-                       continue;
-               }
-
-               if (!detachSystemChild && (pChild->GetArea() == _CONTROL_AREA_SYSTEM))
-               {
-                       itemIndex++;
-                       continue;
-               }
-               r = DetachChild(*pChild);
-
-               if (IsFailed(r))
-               {
-                       ++notDetachedChildCount;
-               }
-       }
-
-       SysLog(NID_UI, "%d children are not detached from this container.", notDetachedChildCount);
-       ClearLastResult();
-}
-
-// E_INVALID_ARG
-result
-_Control::MoveChildToTop(const _Control& child)
-{
-       ClearLastResult();
-       result r = E_SUCCESS;
-
-       SysTryReturn(NID_UI,
-                               child.GetParent() == this, E_INVALID_ARG,
-                               E_INVALID_ARG, "[E_INVALID_ARG] Not my child.");
-
-       // If already on top,
-       ControlList& children = GetChildList();
-       if (GetChildIndex(child) == children.GetCount() - 1)
-       {
-               SysAssert(GetLastResult() == E_SUCCESS);
-               return E_SUCCESS;
-       }
-
-       _Control* pChild = const_cast <_Control*>(&child);
-
-       r = children.Remove(pChild);
-       SysAssert(r == E_SUCCESS);
-
-       r = children.Add(pChild);
-       SysAssert(r == E_SUCCESS);
-
-       r = child.GetVisualElement()->SetZOrder(null, true);
-       SysAssert(r == E_SUCCESS); // [ToDo] Exception check and rollback.
-
-       SysAssert(GetLastResult() == E_SUCCESS);
-       return E_SUCCESS;
-}
-
-// E_INVALID_ARG
-result
-_Control::MoveChildToBottom(const _Control& child)
-{
-       ClearLastResult();
-       result r = E_SUCCESS;
-
-       SysTryReturn(NID_UI,
-                               child.GetParent() == this, E_INVALID_ARG,
-                               E_INVALID_ARG, "[E_INVALID_ARG] Not my child.");
-
-       ControlList& children = GetChildList();
-
-       if (GetChildIndex(child) == 0)
-       {
-               SysAssert(GetLastResult() == E_SUCCESS);
-               return E_SUCCESS;
-       }
-
-       _Control* pChild = const_cast <_Control*>(&child);
-
-       r = children.Remove(pChild);
-       SysAssert(r == E_SUCCESS);
-
-       r = children.InsertAt(pChild, 0);
-       SysAssert(r == E_SUCCESS);
-
-       r = child.GetVisualElement()->SetZOrder(null, false);
-       SysAssert(r == E_SUCCESS); // [ToDo] Exception check and rollback.
-
-       SysAssert(GetLastResult() == E_SUCCESS);
-       return E_SUCCESS;
-}
-
-// E_INVALID_ARG
-result
-_Control::MoveChildAfter(const _Control& targetChild, const _Control& child)
-{
-       ClearLastResult();
-       result r = E_SUCCESS;
-
-       SysTryReturn(NID_UI,
-                               targetChild.GetParent() == this, E_INVALID_ARG,
-                               E_INVALID_ARG, "[E_INVALID_ARG] Target is not my child.");
-
-       SysTryReturn(NID_UI,
-                               child.GetParent() == this, E_INVALID_ARG,
-                               E_INVALID_ARG, "[E_INVALID_ARG] Not my child.");
-
-       SysTryReturn(NID_UI,
-                               &targetChild != &child, E_INVALID_ARG,
-                               E_INVALID_ARG, "[E_INVALID_ARG] Cannot move after self.");
-
-       ControlList& children = GetChildList();
-
-       int targetIndex = GetChildIndex(targetChild);
-       SysAssert(targetIndex != -1);
-
-       if (targetIndex + 1 == GetChildIndex(child))
-       {
-               SysAssert(GetLastResult() == E_SUCCESS);
-               return E_SUCCESS;
-       }
-
-       _Control* pChild = const_cast <_Control*>(&child);
-
-       r = children.Remove(pChild);
-       SysAssert(r == E_SUCCESS);
-
-       r = children.InsertAt(pChild, targetIndex + 1);
-       SysAssert(r == E_SUCCESS);
-
-       r = child.GetVisualElement()->SetZOrder(targetChild.GetVisualElement(), true);
-       SysAssert(r == E_SUCCESS); // [ToDo] Exception check and rollback.
-
-       SysAssert(GetLastResult() == E_SUCCESS);
-       return E_SUCCESS;
-}
-
-// E_INVALID_ARG
-result
-_Control::MoveChildBefore(const _Control& targetChild, const _Control& child)
-{
-       ClearLastResult();
-       result r = E_SUCCESS;
-
-       SysTryReturn(NID_UI,
-                               targetChild.GetParent() == this, E_INVALID_ARG,
-                               E_INVALID_ARG, "[E_INVALID_ARG] Target is not my child.");
-
-       SysTryReturn(NID_UI,
-                               child.GetParent() == this, E_INVALID_ARG,
-                               E_INVALID_ARG, "[E_INVALID_ARG] Not my child.");
-
-       SysTryReturn(NID_UI,
-                               &targetChild != &child, E_INVALID_ARG,
-                               E_INVALID_ARG, "[E_INVALID_ARG] Cannot move before self.");
-
-       ControlList& children = GetChildList();
-
-       int targetIndex = GetChildIndex(targetChild);
-       SysAssert(targetIndex != -1);
-
-       if (targetIndex - 1 == GetChildIndex(child))
-       {
-               SysAssert(GetLastResult() == E_SUCCESS);
-               return E_SUCCESS;
-       }
-
-       _Control* pChild = const_cast <_Control*>(&child);
-
-       r = children.Remove(pChild);
-       SysAssert(r == E_SUCCESS);
-
-       r = children.InsertAt(pChild, targetIndex);
-       SysAssert(r == E_SUCCESS);
-
-       r = child.GetVisualElement()->SetZOrder(targetChild.GetVisualElement(), false);
-       SysAssert(r == E_SUCCESS); // [ToDo] Exception check and rollback.
-
-       SysAssert(GetLastResult() == E_SUCCESS);
-       return E_SUCCESS;
-}
-
-// E_INVALID_ARG
-// E_OBJ_NOT_FOUND
-int
-_Control::GetChildIndex(const _Control& child) const
-{
-       ClearLastResult();
-       result r = E_SUCCESS;
-
-       SysTryReturn(NID_UI,
-                               child.GetParent() == this, -1,
-                               E_INVALID_ARG, "[E_INVALID_ARG] Not my child.");
-
-       const ControlList& children = GetChildList();
-
-       int index = -1;
-       r = children.IndexOf(const_cast<_Control*>(&child), index);
-       if (IsFailed(r))
-       {
-               SysAssert(r == E_OBJ_NOT_FOUND);
-               SysLogException(NID_UI, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] Unable to find the specified child.");
-               return -1;
-       }
-
-       SysAssert(GetLastResult() == E_SUCCESS);
-       return index;
-}
-
-// E_OUT_OF_RANGE
-_Control*
-_Control::GetChild(int index) const
-{
-       ClearLastResult();
-       result r = E_SUCCESS;
-
-       const ControlList& children = GetChildList();
-
-       _Control* pChild = null;
-       r = children.GetAt(index, pChild);
-       if (IsFailed(r))
-       {
-               SysAssert(r == E_OUT_OF_RANGE);
-               SysLogException(NID_UI, E_OUT_OF_RANGE, "[E_OUT_OF_RANGE] The specified index is out of range.");
-               return null;
-       }
-
-       SysAssert(GetLastResult() == E_SUCCESS);
-       return pChild;
-}
-
-int
-_Control::GetChildCount(void) const
-{
-       ClearLastResult();
-       return GetChildList().GetCount();
-}
-
-_ControlHandle
-_Control::GetHandle(void) const
-{
-       return __controlHandle;
-}
-
-void*
-_Control::GetUserData(void) const
-{
-       return __pUserData;
-}
-
-void
-_Control::SetUserData(void* pUserData)
-{
-       __pUserData = pUserData;
-}
-
-Variant
-_Control::GetPropertyName(void) const
-{
-       ClearLastResult();
-       return Tizen::Ui::Variant(__name);
-}
-
-String
-_Control::GetName(void) const
-{
-       Variant name = GetProperty("Name");
-
-       return name.ToString();
-}
-
-result
-_Control::SetPropertyName(const Variant& name)
-{
-       ClearLastResult();
-       __name = name.ToString();
-
-       return E_SUCCESS;
-}
-
-void
-_Control::SetName(const String& name)
-{
-       SetProperty("Name", Variant(name));
-}
-
-_Control*
-_Control::GetParent(void) const
-{
-       return __pParent;
-}
-
-Canvas*
-_Control::GetCanvasN(void) const
-{
-       return GetCanvasN(FloatRectangle(0.0f, 0.0f, __bounds.width, __bounds.height));
-}
-
-Canvas*
-_Control::GetCanvasN(const Rectangle& bounds) const
-{
-       ClearLastResult();
-       Canvas *pCanvas = GetControlDelegate().OnCanvasRequestedFN(FloatRectangle(0.0f, 0.0f, bounds.width, bounds.height));
-       if (pCanvas == null)
-       {
-               GetVisualElement()->SetFlushNeeded();
-               pCanvas = GetVisualElement()->GetCanvasN(bounds);
-               if (IsFailed(GetLastResult()))
-               {
-                       SysLog(NID_UI_CTRL, "[%s] Propagated", GetErrorMessage(GetLastResult()));
-               }
-
-               if (pCanvas && !__isCalledGetCanvasN)
-               {
-                       pCanvas->SetBackgroundColor(GetBackgroundColor());
-                       pCanvas->Clear();
-                       const_cast <_Control*>(this)->__isCalledGetCanvasN = true;
-               }
-       }
-       return pCanvas;
-}
-
-Canvas*
-_Control::GetCanvasN(const FloatRectangle& bounds) const
-{
-       ClearLastResult();
-       Canvas *pCanvas = GetControlDelegate().OnCanvasRequestedFN(FloatRectangle(bounds));
-       if (pCanvas == null)
-       {
-               GetVisualElement()->SetFlushNeeded();
-               pCanvas = GetVisualElement()->GetCanvasN(bounds);
-               if (IsFailed(GetLastResult()))
-               {
-                       SysLog(NID_UI_CTRL, "[%s] Propagated", GetErrorMessage(GetLastResult()));
-               }
-
-               if (pCanvas && !__isCalledGetCanvasN)
-               {
-                       pCanvas->SetBackgroundColor(GetBackgroundColor());
-                       pCanvas->Clear();
-                       const_cast <_Control*>(this)->__isCalledGetCanvasN = true;
-               }
-       }
-       return pCanvas;
-}
-
-bool
-_Control::IsCalledGetCanvasN(void) const
-{
-       return __isCalledGetCanvasN;
-}
-
-Canvas*
-_Control::GetClientCanvasN(void) const
-{
-       return GetCanvasN(GetClientBounds());
-}
-
-bool
-_Control::IsAncestorOf(const _Control& control) const
-{
-       ClearLastResult();
-
-       const _Control* pParent = control.GetParent();
-       if (!pParent)
-       {
-               return false;
-       }
-
-       struct _Visitor
-               : public Visitor
-       {
-private:
-               const _Control& __ancestor;
-
-public:
-               bool yes;
-
-               _Visitor(const _Control& ancestor)
-                       : __ancestor(ancestor)
-                       , yes(false){}
-
-               virtual VisitType Visit(_Control& control)
-               {
-                       if (&__ancestor == &control)
-                       {
-                               yes = true;
-                               return VISIT_STOP;
-                       }
-                       else
-                       {
-                               return VISIT_UPWARD;
-                       }
-               }
-       };
-
-       _Visitor visitor(*this);
-       pParent->Accept(visitor);
-
-       SysAssert(GetLastResult() == E_SUCCESS);
-       return visitor.yes;
-}
-
-_Window*
-_Control::GetRootWindow(void) const
-{
-       ClearLastResult();
-
-       struct _Visitor
-               : public Visitor
-       {
-               _Window* pRoot;
-
-               _Visitor(void)
-                       : pRoot(null){}
-
-               virtual VisitType Visit(_Control& control)
-               {
-                       pRoot = dynamic_cast <_Window*>(&control);
-                       if (pRoot != null)
-                       {
-                               return VISIT_STOP;
-                       }
-
-                       return VISIT_UPWARD;
-               }
-       };
-
-       _Visitor visitor;
-       Accept(visitor);
-
-       SysAssert(GetLastResult() == E_SUCCESS);
-       return visitor.pRoot;
-}
-
-bool
-_Control::IsAttachedToMainTree(void) const
-{
-       ClearLastResult();
-
-       _ControlManager* pMgr = _ControlManager::GetInstance();
-       if (pMgr == null)
-       {
-               return false;
-       }
-
-       _Window* pRootWindow = GetRootWindow();
-       if (pRootWindow == null)
-       {
-               return false;
-       }
-
-       return pRootWindow->IsAttached();
-}
-
-bool
-_Control::IsFocusable(void) const
-{
-       ClearLastResult();
-       return __focusable;
-}
-
-void
-_Control::SetFocusable(bool focusable)
-{
-       ClearLastResult();
-       __focusable = focusable;
-}
-
-bool
-_Control::IsNativeObjectFocusable(void) const
-{
-       ClearLastResult();
-       return __nativeObjectFocusable;
-}
-
-void
-_Control::SetNativeObjectFocusable(bool focusable)
-{
-       ClearLastResult();
-       __nativeObjectFocusable = focusable;
-}
-
-bool
-_Control::IsFocused(void) const
-{
-       ClearLastResult();
-
-       if (!__focusSet)
-       {
-               return false;
-       }
-
-       for (int i = 0; i < GetChildCount(); ++i)
-       {
-               _Control* pChild = GetChild(i);
-
-               SysAssert(pChild);
-               if (pChild == null)
-               {
-                       continue;
-               }
-
-               if (pChild->__focusSet)
-               {
-                       return false;
-               }
-       }
-
-       return true;
-}
-
-_Control*
-_Control::GetFocused(void) const
-{
-       for (int i = GetChildCount() - 1; i >= 0; --i)
-       {
-               _Control* pChild = GetChild(i);
-
-               SysAssert(pChild);
-               if (pChild == null)
-               {
-                       continue;
-               }
-
-               if (pChild->__focusSet == true)
-               {
-                       return pChild->GetFocused();
-               }
-       }
-
-       if (__focusSet == true)
-       {
-               return const_cast <_Control*>(this);
-       }
-       else
-       {
-               return null;
-       }
-
-}
-
-result
-_Control::SetFocused(bool on)
-{
-       ClearLastResult();
-
-       SysTryReturn(NID_UI,
-                               IsAttachedToMainTree(), E_INVALID_OPERATION,
-                               E_INVALID_OPERATION, "[E_INVALID_OPERATION] This control should have a parent or be attached to the main tree.");
-
-       SysTryReturn(NID_UI,
-                               IsFocusable(), E_INVALID_OPERATION,
-                               E_INVALID_OPERATION, "[E_INVALID_OPERATION] This Control isn't focusable control.");
-
-       if (on)
-       {
-               _Window* pTop = GetRootWindow();
-               SysAssert(pTop);
-               pTop->SetFocusedControl(this);
-               pTop->SetFocusState(false);
-
-               _ControlManager* pControlMgr = _ControlManager::GetInstance();
-               SysAssert(pControlMgr);
-
-               if (pTop->IsActivated() && pTop->IsFocusableDescendant(this))
-               {
-                       pControlMgr->SetFocusedControl(*this);
-                       SetFocusState(true);
-               }
-
-               if (IsFailed(GetLastResult()))
-               {
-                       SysLog(NID_UI_CTRL, "[%s] Propagated", GetErrorMessage(GetLastResult()));
-               }
-       }
-       else
-       {
-               _Window* pTop = GetRootWindow();
-               SysAssert(pTop);
-               pTop->SetFocusedControl(null);
-               _ControlManager* pControlMgr = _ControlManager::GetInstance();
-               SysAssert(pControlMgr);
-               pControlMgr->SetFocusedControl(*this, false);
-               SetFocusState(false);
-
-               if (IsFailed(GetLastResult()))
-               {
-                       SysLog(NID_UI_CTRL, "[%s] Propagated", GetErrorMessage(GetLastResult()));
-               }
-       }
-
-       return E_SUCCESS;
-}
-
-// [ToDo] Find the focused descendent and clear flags upwards.
-void
-_Control::SetFocusState(bool on)
-{
-       ClearLastResult();
-
-       if (on)
-       {
-               __focusSet = true;
-               _Control* pParent = GetParent();
-               if (pParent)
-               {
-                       pParent->SetFocusState(true);
-               }
-       }
-       else
-       {
-               __focusSet = false;
-               for (int i = 0; i < GetChildCount(); ++i)
-               {
-                       _Control* pChild = GetChild(i);
-
-                       SysAssert(pChild);
-                       if (pChild == null)
-                       {
-                               continue;
-                       }
-
-                       if (pChild->__focusSet == true)
-                       {
-                               pChild->SetFocusState(false);
-                               return;
-                       }
-               }
-       }
-}
-
-result
-_Control::SetFont(const String& fontName)
-{
-       result r = E_SUCCESS;
-
-       if (__fontName.Equals(fontName))
-       {
-               return E_SUCCESS;
-       }
-
-       __isControlFontChanged = true;
-       __fontName = fontName;
-       __fontFileName.Clear();
-
-       Font* pFont = GetFallbackFont();
-
-       if (pFont == null)
-       {
-               r = GetLastResult();
-               SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
-       }
-       return E_SUCCESS;
-}
-
-Font*
-_Control::GetFallbackFont(void)
-{
-       unsigned long style = 0;
-       int textSize = 0;
-       float floatTextSize = 0.0f;
-       result r = E_SUCCESS;
-       _IControlDelegate& delegate = GetControlDelegate();
-       delegate.OnFontInfoRequested(style, textSize);
-       delegate.OnFontInfoRequested(style, floatTextSize);
-       _ControlManager* pControlManager = _ControlManager::GetInstance();
-       _FontImpl* pFontImpl  = _FontImpl::GetInstance(*__pFont);
-       if (!(__isControlFontChanged || pControlManager->IsDefaultFontChanged())
-               && __pFont != null
-               && ((__pFont->GetSize() == textSize || __pFont->GetSizeF() == floatTextSize))
-               && (pFontImpl->GetStyle() == style))
-       {
-               return __pFont;
-       }
-       unique_ptr<Font>pTempFont(new(std::nothrow)Font());
-       SysTryReturn(NID_UI , pTempFont , null , E_OUT_OF_MEMORY, "[%s] Fails to create a __pFont.", GetErrorMessage(r));
-
-       if (!__fontName.IsEmpty())
-       {
-               __isControlFontChanged = false;
-               _FontImpl* pFontImpl  = _FontImpl::GetInstance(*pTempFont);
-               SysAssertf(pFontImpl != null, "Getting _FontImpl instance failed.");
-
-               if (floatTextSize > 0.0f)
-               {
-                       r = pFontImpl->Construct(__fontName, style, floatTextSize, false);
-               }
-               else
-               {
-                       r = pFontImpl->Construct(__fontName, style, textSize, false);
-               }
-
-               SysTryReturn(NID_UI, r != E_OUT_OF_MEMORY, null, E_OUT_OF_MEMORY, "%s.", GetErrorMessage(r));
-               SysTryReturn(NID_UI, r == E_SUCCESS, null, E_FILE_NOT_FOUND, "%s.", GetErrorMessage(r));
-       }
-       else if (!__fontFileName.IsEmpty())
-       {
-               __isControlFontChanged = false;
-               _FontImpl* pFontImpl  = _FontImpl::GetInstance(*pTempFont);
-               SysAssertf(pFontImpl != null, "Getting _FontImpl instance failed.");
-
-               if (floatTextSize > 0.0f)
-               {
-                       r = pFontImpl->Construct(__fontFileName, style, floatTextSize);
-               }
-               else
-               {
-                       r = pFontImpl->Construct(__fontFileName, style, textSize);
-               }
-               SysTryReturn(NID_UI, r != E_OUT_OF_MEMORY, null, E_OUT_OF_MEMORY, "%s.", GetErrorMessage(r));
-               SysTryReturn(NID_UI, r == E_SUCCESS, null, E_FILE_NOT_FOUND, "%s.", GetErrorMessage(r));
-
-       }
-       else if (!pControlManager->GetDefaultFont().IsEmpty())
-       {
-               _FontImpl* pFontImpl = _FontImpl::GetInstance(*pTempFont);
-               SysAssertf(pFontImpl != null, "Getting _FontImpl instance failed.");
-
-               if (floatTextSize > 0.0f)
-               {
-                       r = pFontImpl->Construct(pControlManager->GetDefaultFont(), style, floatTextSize, false);
-               }
-               else
-               {
-                       r = pFontImpl->Construct(pControlManager->GetDefaultFont(), style, textSize, false);
-               }
-               SysTryReturn(NID_UI, r != E_OUT_OF_MEMORY, null, E_OUT_OF_MEMORY, "%s.", GetErrorMessage(r));
-               SysTryReturn(NID_UI, r == E_SUCCESS, null, E_FILE_NOT_FOUND, "%s.", GetErrorMessage(r));
-       }
-       else if (!pControlManager->GetDefaultFontFile().IsEmpty())
-       {
-               _FontImpl* pFontImpl = _FontImpl::GetInstance(*pTempFont);
-               SysAssertf(pFontImpl != null, "Getting _FontImpl instance failed.");
-
-               if (floatTextSize > 0.0f)
-               {
-                       r = pFontImpl->Construct(pControlManager->GetDefaultFontFile(), style, floatTextSize);
-               }
-               else
-               {
-                       r = pFontImpl->Construct(pControlManager->GetDefaultFontFile(), style, textSize);
-               }
-               SysTryReturn(NID_UI, r != E_OUT_OF_MEMORY, null, E_OUT_OF_MEMORY, "%s.", GetErrorMessage(r));
-               SysTryReturn(NID_UI, r == E_SUCCESS, null, E_FILE_NOT_FOUND, "%s.", GetErrorMessage(r));
-       }
-       else
-       {
-               if (floatTextSize > 0.0f)
-               {
-                       r = pTempFont->Construct(style, floatTextSize);
-               }
-               else
-               {
-                       r = pTempFont->Construct(style, textSize);
-               }
-               SysTryReturn(NID_UI, r != E_OUT_OF_MEMORY, null, E_OUT_OF_MEMORY, "%s.", GetErrorMessage(r));
-               SysTryReturn(NID_UI, r == E_SUCCESS, null, E_FILE_NOT_FOUND, "%s.", GetErrorMessage(r));
-       }
-
-       if (__pFont)
-       {
-               delete __pFont;
-               __pFont = null;
-       }
-       __pFont = pTempFont.release();
-       delegate.OnFontChanged(__pFont);
-       return  __pFont;
-}
-
-String
-_Control::GetFont(void) const
-{
-       return __fontName;
-}
-
-bool
-_Control::IsEnabled(void) const
-{
-       ClearLastResult();
-
-       struct _Visitor
-               : public Visitor
-       {
-               bool enabled;
-
-               _Visitor(void)
-                       : enabled(true){}
-
-               virtual VisitType Visit(_Control& control)
-               {
-                       if (!control.GetEnableState())
-                       {
-                               enabled = false;
-                               return VISIT_STOP;
-                       }
-
-                       return VISIT_UPWARD;
-               }
-       };
-
-       _Visitor visitor;
-       Accept(visitor);
-       return visitor.enabled;
-}
-
-bool
-_Control::GetEnableState(void) const
-{
-       ClearLastResult();
-       return __enabledState;
-}
-
-void
-_Control::SetEnableState(bool enabledState)
-{
-       ClearLastResult();
-       const bool changed = (__enabledState != enabledState);
-       if (changed)
-       {
-               if (!enabledState && GetFocused() == this)
-               {
-                       SetFocused(false);
-               }
-               __enabledState = enabledState;
-               CallOnAncestorEnableStateChanged();
-       }
-       __pAccessibilityContainer->SetEnableState(enabledState);
-}
-
-bool
-_Control::IsInputEventEnabled(void) const
-{
-       ClearLastResult();
-
-       struct _Visitor
-               : public Visitor
-       {
-               bool inputEnabled;
-
-               _Visitor(void)
-                       : inputEnabled(true){}
-
-               virtual VisitType Visit(_Control& control)
-               {
-                       if (!control.GetInputEnableState())
-                       {
-                               inputEnabled = false;
-                               return VISIT_STOP;
-                       }
-
-                       return VISIT_UPWARD;
-               }
-       };
-
-       _Visitor visitor;
-       Accept(visitor);
-       return visitor.inputEnabled;
-}
-
-bool
-_Control::GetInputEnableState(void) const
-{
-       ClearLastResult();
-
-       if (__inputLockRefCount != 0)
-       {
-               return false;
-       }
-       else
-       {
-               return true;
-       }
-}
-
-void
-_Control::LockInputEvent(void)
-{
-       __inputLockRefCount++;
-}
-
-void
-_Control::UnlockInputEvent(void)
-{
-       __inputLockRefCount--;
-       if (__inputLockRefCount < 0)
-       {
-               __inputLockRefCount = 0;
-       }
-}
-
-bool
-_Control::IsVisible(void) const
-{
-       ClearLastResult();
-
-       SysTryReturn(NID_UI, IsAttachedToMainTree(), false, E_SYSTEM, "[E_SYSTEM] This control should be attached to the main tree.");
-
-       struct _Visitor
-               : public Visitor
-       {
-               bool visible;
-
-               _Visitor(void)
-                       : visible(true){}
-
-               virtual VisitType Visit(_Control& control)
-               {
-                       if (!control.GetVisibleState())
-                       {
-                               visible = false;
-                               return VISIT_STOP;
-                       }
-
-                       return VISIT_UPWARD;
-               }
-       };
-
-       _Visitor visitor;
-       Accept(visitor);
-
-       SysAssert(GetLastResult() == E_SUCCESS);
-       return visitor.visible;
-}
-
-bool
-_Control::GetVisibleState(void) const
-{
-       ClearLastResult();
-       return __visibleState;
-}
-
-void
-_Control::SetVisibleState(bool visibleState)
-{
-       ClearLastResult();
-
-       const bool changed = (__visibleState != visibleState) || !__initVisibleState;
-
-       if (changed)
-       {
-               GetControlDelegate().OnVisibleStateChanging();
-       }
-
-       __visibleState = visibleState;
-       GetVisualElement()->SetShowState(visibleState);
-
-       if (visibleState == false)
-       {
-               int owneeCount = GetOwneeCount();
-               for (int i = 0; i < owneeCount; ++i)
-               {
-                       _Window* pWindow = GetOwnee(i);
-                       if (pWindow)
-                       {
-                               pWindow->SetVisibleState(visibleState);
-                       }
-               }
-       }
-
-       if (changed)
-       {
-               GetControlDelegate().OnVisibleStateChanged();
-               CallOnAncestorVisibleStateChanged();
-
-               _Control* pParent = GetParent();
-               if (pParent)
-               {
-                       pParent->GetControlDelegate().OnChildVisibleStateChanged(*this);
-               }
-
-               ClearLastResult();
-       }
-
-       __initVisibleState = true;
-}
-
-bool
-_Control::IsLayoutable(void) const
-{
-       ClearLastResult();
-       return IsMovable();
-}
-
-bool
-_Control::IsClipToParent(void) const
-{
-       ClearLastResult();
-//     SysAssert(GetVisualElement()->IsClipToParent() == __clipToParent);
-       return __clipToParent;
-}
-
-result
-_Control::SetClipToParent(bool clipToParent)
-{
-       ClearLastResult();
-       result r = E_SUCCESS;
-
-       __clipToParent = clipToParent;
-       r =  GetVisualElement()->SetClipToParent(clipToParent);
-       SysTryReturn(NID_UI, r == E_SUCCESS, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] System error occurred.");
-
-       return E_SUCCESS;
-}
-
-result
-_Control::SetClipChildrenEnabled(bool clipChildren)
-{
-       ClearLastResult();
-       //result r = E_SUCCESS;
-
-       GetVisualElement()->SetClipChildrenEnabled(clipChildren);
-       //SysTryReturn(NID_UI, r == E_SUCCESS, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] System error occurred.");
-
-       return E_SUCCESS;
-}
-
-Rectangle
-_Control::GetBounds(void) const
-{
-       ClearLastResult();
-       return _CoordinateSystemUtils::ConvertToInteger(__bounds);
-}
-
-FloatRectangle
-_Control::GetBoundsF(void) const
-{
-       ClearLastResult();
-       return __bounds;
-}
-
-Point
-_Control::GetPosition(void) const
-{
-       ClearLastResult();
-       return Point(_CoordinateSystemUtils::ConvertToInteger(__bounds.x), _CoordinateSystemUtils::ConvertToInteger(__bounds.y));
-}
-
-FloatPoint
-_Control::GetPositionF(void) const
-{
-       ClearLastResult();
-       return FloatPoint(__bounds.x, __bounds.y);
-}
-
-Dimension
-_Control::GetSize(void) const
-{
-       ClearLastResult();
-       return Dimension(_CoordinateSystemUtils::ConvertToInteger(__bounds.width), _CoordinateSystemUtils::ConvertToInteger(__bounds.height));
-}
-
-FloatDimension
-_Control::GetSizeF(void) const
-{
-       ClearLastResult();
-       return FloatDimension(__bounds.width, __bounds.height);
-}
-
-// E_SYSTEM
-result
-_Control::UpdateBoundsOfVisualElement(const FloatRectangle& controlBounds)
-{
-       FloatRectangle rect(controlBounds.x, controlBounds.y, controlBounds.width, controlBounds.height);
-
-       _Control* pParent = GetParent();
-       if (__area == _CONTROL_AREA_CLIENT && pParent)
-       {
-               const FloatRectangle clientBounds = pParent->GetClientBoundsF();
-               rect.x += clientBounds.x;
-               rect.y += clientBounds.y;
-       }
-
-       GetVisualElement()->SetBounds(rect);
-
-       return E_SUCCESS;
-}
-
-result
-_Control::AdjustAbsoluteBounds(void)
-{
-       struct _Visitor
-               : public Visitor
-       {
-               _Visitor(_Control* pControl)
-                       : __pControl(pControl){}
-
-               virtual VisitType Visit(_Control& control)
-               {
-                       result r = E_SUCCESS;
-
-                       if (__pControl == &control)
-                       {
-                               return VISIT_DOWNWARD;
-                       }
-                       FloatRectangle fbounds = control.GetBoundsF();
-                       if (control.IsLayoutChangable() == false)
-                       {
-                               r = control.UpdateBoundsOfVisualElement(FloatRectangle(0.0f, 0.0f, fbounds.width, fbounds.height));
-                       }
-                       else
-                       {
-                               r = control.UpdateBoundsOfVisualElement(fbounds);
-                       }
-
-                       ControlList& children = control.GetChildList();
-
-                       int childrenCount = children.GetCount();
-                       if (childrenCount <= 0)
-                       {
-                               return VISIT_STOP;
-                       }
-                       else
-                       {
-                               return VISIT_DOWNWARD;
-                       }
-               }
-       private :
-               _Control* __pControl;
-       };
-
-       _Visitor visitor(this);
-       Accept(visitor);
-
-       return E_SUCCESS;
-}
-
-bool
-_Control::IsInSizeRange(const Dimension& size) const
-{
-       return (__minSize.width <= size.width) && (size.width <= __maxSize.width) &&
-                  (__minSize.height <= size.height) && (size.height <= __maxSize.height);
-}
-
-bool
-_Control::IsInSizeRange(const FloatDimension& size) const
-{
-       return (__minSize.width <= size.width) && (size.width <= __maxSize.width) &&
-                  (__minSize.height <= size.height) && (size.height <= __maxSize.height);
-}
-
-// Custom Exception: ex) Location::Map
-result
-_Control::SetBoundsFinal(const FloatRectangle& newBounds, bool changeLayoutBaseRect, bool callBoundsChangeCallbacks)
-{
-       result r = E_SUCCESS;
-
-       FloatRectangle bounds(newBounds.x, newBounds.y, newBounds.width, newBounds.height);
-
-       _IControlDelegate& delegate = GetControlDelegate();
-
-       const bool moved   = (__bounds.x != bounds.x) || (__bounds.y != bounds.y);
-       const bool resized = (__bounds.width != bounds.width) || (__bounds.height != bounds.height);
-
-       if ((moved || resized) && callBoundsChangeCallbacks)
-       {
-               r = delegate.OnBoundsChanging(_CoordinateSystemUtils::ConvertToInteger(bounds));
-               if (IsFailed(r))
-               {
-                       SysLogException(NID_UI, r, "[%s] Callback returns exception.", GetErrorMessage(r));
-                       return r; // Relay the result;
-               }
-               r = delegate.OnBoundsChanging(bounds);
-               if (IsFailed(r))
-               {
-                       SysLogException(NID_UI, r, "[%s] Callback returns exception.", GetErrorMessage(r));
-                       return r; // Relay the result;
-               }
-       }
-
-       if (moved || resized)
-       {
-               const FloatRectangle fbounds(bounds.x, bounds.y, bounds.width, bounds.height);
-               if (IsLayoutChangable() == false)
-               {
-                       r = UpdateBoundsOfVisualElement(FloatRectangle(0.0f, 0.0f, fbounds.width, fbounds.height));
-               }
-               else
-               {
-                       r = UpdateBoundsOfVisualElement(fbounds);
-               }
-       }
-
-       SysAssert(r == E_SUCCESS); // [ToDo] Exception check and rollback.
-
-       __bounds = bounds;
-
-       if (changeLayoutBaseRect)
-       {
-               __pLayoutContainer->OnChangeBaseRect();
-       }
-
-       if ((moved || resized) && callBoundsChangeCallbacks)
-       {
-               if (IsMovable() && IsResizable())
-               {
-                       SetClientBounds(FloatRectangle(0.0f, 0.0f, GetSizeF().width, GetSizeF().height));
-               }
-               delegate.OnBoundsChanged();
-
-               _Control* pParent = GetParent();
-               if (pParent)
-               {
-                       pParent->GetControlDelegate().OnChildBoundsChanged(*this);
-               }
-
-               ControlList& children = GetChildList();
-               _Control* pChild = null;
-               int childrenCount = children.GetCount();
-
-               for (int index = 0; index < childrenCount; index++)
-               {
-                       r = children.GetAt(index, pChild);
-                       if (!IsFailed(r))
-                       {
-                               pChild->GetControlDelegate().OnParentBoundsChanged(*this);
-                       }
-               }
-       }
-
-       ClearLastResult();
-       return E_SUCCESS;
-}
-
-// Custom Exception: ex) Location::Map
-result
-_Control::AdjustSizeToRange(void)
-{
-       ClearLastResult();
-       result r = E_SUCCESS;
-
-       SysAssert(IsResizable());
-
-       FloatDimension size = GetSizeF();
-       bool changed = ::AdjustSizeToRange(size, __minSize, __maxSize);
-       if (!changed)
-       {
-               return E_SUCCESS;
-       }
-
-       FloatRectangle newBounds(__bounds.x, __bounds.y, size.width, size.height);
-       r = SetBoundsFinal(newBounds, true, true);
-       if (IsFailed(r))
-       {
-               return r;
-       }
-
-       return E_SUCCESS;
-}
-
-// Custom Exception: ex) Location::Map
-// E_INVALID_ARG
-result
-_Control::SetBoundsInternal(const FloatRectangle& bounds, bool callBoundsChangeCallbacks)
-{
-       SysTryReturn(NID_UI,
-                               IsInSizeRange(Dimension(bounds.width, bounds.height)), E_INVALID_ARG,
-                               E_INVALID_ARG,
-                               "[E_INVALID_ARG] The specified size(%f, %f) is out of range from min size(%d, %d) to max size(%d, %d).",
-                               bounds.width, bounds.height, __minSize.width, __minSize.height, __maxSize.width, __maxSize.height);
-
-       SetUpdateLayoutState(true);
-
-       return SetBoundsFinal(bounds, true, callBoundsChangeCallbacks);
-}
-
-// Custom Exception: ex) Location::Map
-// E_INVALID_ARG
-// E_UNSUPPORTED_OPERATION
-result
-_Control::SetBounds(const Rectangle& bounds, bool callBoundsChangeCallbacks)
-{
-       ClearLastResult();
-
-       if (callBoundsChangeCallbacks)
-       {
-               SysTryReturn(NID_UI,
-                                       IsMovable() && IsResizable(), E_UNSUPPORTED_OPERATION,
-                                       E_UNSUPPORTED_OPERATION, "[E_UNSUPPORTED_OPERATION] Not movable nor resizable.");
-       }
-       FloatRectangle floatBounds(bounds.x, bounds.y, bounds.width, bounds.height);
-
-       return SetBoundsInternal(floatBounds, callBoundsChangeCallbacks);
-}
-
-// Custom Exception: ex) Location::Map
-// E_INVALID_ARG
-// E_UNSUPPORTED_OPERATION
-result
-_Control::SetBounds(const FloatRectangle& bounds, bool callBoundsChangeCallbacks)
-{
-       ClearLastResult();
-
-       if (callBoundsChangeCallbacks)
-       {
-               SysTryReturn(NID_UI,
-                                       IsMovable() && IsResizable(), E_UNSUPPORTED_OPERATION,
-                                       E_UNSUPPORTED_OPERATION, "[E_UNSUPPORTED_OPERATION] Not movable nor resizable.");
-       }
-
-       return SetBoundsInternal(bounds, callBoundsChangeCallbacks);
-}
-
-// A custom Exception can occur. ex) Location::Map
-// E_INVALID_ARG
-// E_UNSUPPORTED_OPERATION
-result
-_Control::SetPosition(const Point& position)
-{
-       ClearLastResult();
-
-       SysTryReturn(NID_UI,
-                               IsMovable(), E_UNSUPPORTED_OPERATION,
-                               E_UNSUPPORTED_OPERATION, "[E_UNSUPPORTED_OPERATION] Not movable.");
-
-       return SetBoundsInternal(FloatRectangle(position.x, position.y, __bounds.width, __bounds.height), true);
-}
-
-result
-_Control::SetPosition(const FloatPoint& position)
-{
-       ClearLastResult();
-
-       SysTryReturn(NID_UI,
-                               IsMovable(), E_UNSUPPORTED_OPERATION,
-                               E_UNSUPPORTED_OPERATION, "[E_UNSUPPORTED_OPERATION] Not movable.");
-
-       return SetBoundsInternal(FloatRectangle(position.x, position.y, __bounds.width, __bounds.height), true);
-}
-
-// Custom Exception: ex) Location::Map
-// E_INVALID_ARG
-// E_UNSUPPORTED_OPERATION
-result
-_Control::SetSize(const Dimension& size)
-{
-       ClearLastResult();
-
-       SysTryReturn(NID_UI,
-                               IsResizable(), E_UNSUPPORTED_OPERATION,
-                               E_UNSUPPORTED_OPERATION, "[E_UNSUPPORTED_OPERATION] Not resizable.");
-
-       return SetBoundsInternal(FloatRectangle(__bounds.x, __bounds.y, size.width, size.height), true);
-}
-
-result
-_Control::SetSize(const FloatDimension& size)
-{
-       ClearLastResult();
-
-       SysTryReturn(NID_UI,
-                               IsResizable(), E_UNSUPPORTED_OPERATION,
-                               E_UNSUPPORTED_OPERATION, "[E_UNSUPPORTED_OPERATION] Not resizable.");
-
-       return SetBoundsInternal(FloatRectangle(__bounds.x, __bounds.y, size.width, size.height), true);
-}
-
-Dimension
-_Control::GetMinimumSize(void) const
-{
-       ClearLastResult();
-
-       return _CoordinateSystemUtils::ConvertToInteger(__minSize);
-}
-
-FloatDimension
-_Control::GetMinimumSizeF(void) const
-{
-       ClearLastResult();
-
-       return __minSize;
-}
-
-Dimension
-_Control::GetMaximumSize(void) const
-{
-       ClearLastResult();
-
-       return _CoordinateSystemUtils::ConvertToInteger(__maxSize);
-}
-
-FloatDimension
-_Control::GetMaximumSizeF(void) const
-{
-       ClearLastResult();
-
-       return __maxSize;
-}
-
-// Custom Exception: ex) Location::Map
-// E_UNSUPPORTED_OPERATION
-// E_INVALID_ARG
-result
-_Control::SetMinimumSize(const Dimension& newMinSize)
-{
-       ClearLastResult();
-
-       SysTryReturn(NID_UI,
-                               IsResizable(), E_UNSUPPORTED_OPERATION,
-                               E_UNSUPPORTED_OPERATION, "[E_UNSUPPORTED_OPERATION] Not resizable.");
-
-       SysTryReturn(NID_UI,
-                               (newMinSize.width >= 0 && newMinSize.height >= 0), E_INVALID_ARG,
-                               E_INVALID_ARG, "[E_INVALID_ARG] The width or height is smaller than 0.");
-
-       SysTryReturn(NID_UI,
-                               (newMinSize.width <= MAX_LENGTH && newMinSize.height <= MAX_LENGTH), E_INVALID_ARG,
-                               E_INVALID_ARG, "[E_INVALID_ARG] The width or height is greater than %d.", MAX_LENGTH);
-
-       if (__maxSize.width < newMinSize.width)
-       {
-               __maxSize.width = newMinSize.width;
-       }
-       if (__maxSize.height < newMinSize.height)
-       {
-               __maxSize.height = newMinSize.height;
-       }
-
-       __minSize = _CoordinateSystemUtils::ConvertToFloat(newMinSize);
-       return AdjustSizeToRange();
-}
-
-result
-_Control::SetMinimumSize(const FloatDimension& newMinSize)
-{
-       ClearLastResult();
-
-       SysTryReturn(NID_UI,
-                               IsResizable(), E_UNSUPPORTED_OPERATION,
-                               E_UNSUPPORTED_OPERATION, "[E_UNSUPPORTED_OPERATION] Not resizable.");
-
-       SysTryReturn(NID_UI,
-                               (newMinSize.width >= 0 && newMinSize.height >= 0), E_INVALID_ARG,
-                               E_INVALID_ARG, "[E_INVALID_ARG] The width or height is smaller than 0.");
-
-       SysTryReturn(NID_UI,
-                               (newMinSize.width <= MAX_LENGTH && newMinSize.height <= MAX_LENGTH), E_INVALID_ARG,
-                               E_INVALID_ARG, "[E_INVALID_ARG] The width or height is greater than %d.", MAX_LENGTH);
-
-       if (__maxSize.width < newMinSize.width)
-       {
-               __maxSize.width = newMinSize.width;
-       }
-       if (__maxSize.height < newMinSize.height)
-       {
-               __maxSize.height = newMinSize.height;
-       }
-
-       __minSize = newMinSize;
-       return AdjustSizeToRange();
-}
-
-// Custom Exception: ex) Location::Map
-// E_UNSUPPORTED_OPERATION
-// E_INVALID_ARG
-result
-_Control::SetMaximumSize(const Dimension& newMaxSize)
-{
-       ClearLastResult();
-
-       SysTryReturn(NID_UI,
-                               IsResizable(), E_UNSUPPORTED_OPERATION,
-                               E_UNSUPPORTED_OPERATION, "[E_UNSUPPORTED_OPERATION] Not resizable.");
-
-       SysTryReturn(NID_UI,
-                               (newMaxSize.width >= 0 && newMaxSize.height >= 0), E_INVALID_ARG,
-                               E_INVALID_ARG, "[E_INVALID_ARG] The width or height is smaller than 0.");
-
-       SysTryReturn(NID_UI,
-                               (newMaxSize.width <= MAX_LENGTH && newMaxSize.height <= MAX_LENGTH), E_INVALID_ARG,
-                               E_INVALID_ARG, "[E_INVALID_ARG] The width or height is greater than %d.", MAX_LENGTH);
-
-       if (newMaxSize.width < __minSize.width)
-       {
-               __minSize.width = newMaxSize.width;
-       }
-       if (newMaxSize.height < __minSize.height)
-       {
-               __minSize.height = newMaxSize.height;
-       }
-
-       __maxSize = _CoordinateSystemUtils::ConvertToFloat(newMaxSize);
-       return AdjustSizeToRange();
-}
-
-result
-_Control::SetMaximumSize(const FloatDimension& newMaxSize)
-{
-       ClearLastResult();
-
-       SysTryReturn(NID_UI,
-                               IsResizable(), E_UNSUPPORTED_OPERATION,
-                               E_UNSUPPORTED_OPERATION, "[E_UNSUPPORTED_OPERATION] Not resizable.");
-
-       SysTryReturn(NID_UI,
-                               (newMaxSize.width >= 0 && newMaxSize.height >= 0), E_INVALID_ARG,
-                               E_INVALID_ARG, "[E_INVALID_ARG] The width or height is smaller than 0.");
-
-       SysTryReturn(NID_UI,
-                               (newMaxSize.width <= MAX_LENGTH && newMaxSize.height <= MAX_LENGTH), E_INVALID_ARG,
-                               E_INVALID_ARG, "[E_INVALID_ARG] The width or height is greater than %d.", MAX_LENGTH);
-
-       if (newMaxSize.width < __minSize.width)
-       {
-               __minSize.width = newMaxSize.width;
-       }
-       if (newMaxSize.height < __minSize.height)
-       {
-               __minSize.height = newMaxSize.height;
-       }
-
-       __maxSize = newMaxSize;
-       return AdjustSizeToRange();
-}
-
-
-Point
-_Control::ConvertToControlPosition(const Point& screenPosition) const
-{
-       Point controlPosition;
-       Rectangle absoluteBounds = GetAbsoluteBounds();
-
-       controlPosition.x = screenPosition.x - absoluteBounds.x;
-       controlPosition.y = screenPosition.y - absoluteBounds.y;
-
-       return controlPosition;
-}
-
-FloatPoint
-_Control::ConvertToControlPosition(const FloatPoint& screenPosition) const
-{
-       FloatPoint controlPosition;
-       FloatRectangle absoluteBounds = GetAbsoluteBoundsF();
-
-       controlPosition.x = screenPosition.x - absoluteBounds.x;
-       controlPosition.y = screenPosition.y - absoluteBounds.y;
-
-       return controlPosition;
-}
-
-Point
-_Control::ConvertToScreenPosition(const Point& controlPosition) const
-{
-       Point screenPosition;
-       Rectangle absoluteBounds = GetAbsoluteBounds();
-
-       screenPosition.x = controlPosition.x + absoluteBounds.x;
-       screenPosition.y = controlPosition.y + absoluteBounds.y;
-
-       return screenPosition;
-}
-
-FloatPoint
-_Control::ConvertToScreenPosition(const FloatPoint& controlPosition) const
-{
-       FloatPoint screenPosition;
-       FloatRectangle absoluteBounds = GetAbsoluteBoundsF();
-
-       screenPosition.x = controlPosition.x + absoluteBounds.x;
-       screenPosition.y = controlPosition.y + absoluteBounds.y;
-
-       return screenPosition;
-}
-
-Rectangle
-_Control::GetClientBounds(void) const
-{
-       if (!__isSetClientBounds)
-       {
-               return Rectangle(0, 0, __bounds.width, __bounds.height);
-       }
-
-       return _CoordinateSystemUtils::ConvertToInteger(__clientBounds);
-}
-
-FloatRectangle
-_Control::GetClientBoundsF(void) const
-{
-       if (!__isSetClientBounds)
-       {
-               return FloatRectangle(0.0f, 0.0f, __bounds.width, __bounds.height);
-       }
-
-       return __clientBounds;
-}
-
-
-Rectangle
-_Control::GetClientBounds(const Tizen::Graphics::Dimension& size) const
-{
-       if (!__isSetClientBounds)
-       {
-               return Rectangle(0, 0, size.width, size.height);
-       }
-
-       return _CoordinateSystemUtils::ConvertToInteger(__clientBounds);
-}
-
-
-FloatRectangle
-_Control::GetClientBoundsF(const Tizen::Graphics::FloatDimension& size) const
-{
-       if (!__isSetClientBounds)
-       {
-               return FloatRectangle(0.0f, 0.0f, size.width, size.height);
-       }
-
-       return __clientBounds;
-}
-
-Rectangle
-_Control::GetAbsoluteBounds(void) const
-{
-       Point accumPoint;
-       Rectangle absoluteBounds;
-       Rectangle clientBounds;
-
-       const _Control* pSelf = this;
-       const _Control* pParent = GetParent();
-
-       while (pParent)
-       {
-               if ((pSelf->GetArea() == _CONTROL_AREA_CLIENT) && pParent)
-               {
-                       clientBounds = pParent->GetClientBounds();
-                       accumPoint += Point(clientBounds.x, clientBounds.y);
-                       accumPoint.x -= pParent->GetHorizontalScrollPosition();
-                       accumPoint.y -= pParent->GetVerticalScrollPosition();
-               }
-
-               accumPoint += pSelf->GetPosition();
-               pSelf = pParent;
-               pParent = pParent->GetParent();
-       }
-
-       _Window* pWindow = GetRootWindow();
-
-       if (pWindow)
-       {
-               Point winPoint = pWindow->GetPosition();
-
-               accumPoint.x += winPoint.x;
-               accumPoint.y += winPoint.y;
-       }
-
-       absoluteBounds.x = accumPoint.x;
-       absoluteBounds.y = accumPoint.y;
-       absoluteBounds.width = __bounds.width;
-       absoluteBounds.height = __bounds.height;
-
-       return absoluteBounds;
-}
-
-FloatRectangle
-_Control::GetAbsoluteBoundsF(void) const
-{
-       FloatPoint accumPoint;
-       FloatRectangle absoluteBounds;
-       FloatRectangle clientBounds;
-
-       const _Control* pSelf = this;
-       const _Control* pParent = GetParent();
-
-       while (pParent)
-       {
-               if ((pSelf->GetArea() == _CONTROL_AREA_CLIENT) && pParent)
-               {
-                       clientBounds = pParent->GetClientBoundsF();
-                       accumPoint += FloatPoint(clientBounds.x, clientBounds.y);
-                       accumPoint.x -= pParent->GetHorizontalScrollPosition();
-                       accumPoint.y -= pParent->GetVerticalScrollPosition();
-               }
-
-               accumPoint += pSelf->GetPositionF();
-               pSelf = pParent;
-               pParent = pParent->GetParent();
-       }
-
-       _Window* pWindow = GetRootWindow();
-
-       if (pWindow)
-       {
-               FloatPoint winPoint = pWindow->GetPositionF();
-
-               accumPoint.x += winPoint.x;
-               accumPoint.y += winPoint.y;
-       }
-
-       absoluteBounds.x = accumPoint.x;
-       absoluteBounds.y = accumPoint.y;
-       absoluteBounds.width = __bounds.width;
-       absoluteBounds.height = __bounds.height;
-
-       return absoluteBounds;
-}
-
-result
-_Control::SetClientBounds(const Rectangle& bounds)
-{
-       ClearLastResult();
-
-       const bool moved   = (__clientBounds.x != _CoordinateSystemUtils::ConvertToFloat(bounds).x) || (__clientBounds.y != _CoordinateSystemUtils::ConvertToFloat(bounds).y);
-       const bool resized = (__clientBounds.width != _CoordinateSystemUtils::ConvertToFloat(bounds).width) || (__clientBounds.height != _CoordinateSystemUtils::ConvertToFloat(bounds).height);
-
-       SysTryReturn(NID_UI,
-                               IsMovable() && IsResizable(), E_UNSUPPORTED_OPERATION,
-                               E_UNSUPPORTED_OPERATION, "[E_UNSUPPORTED_OPERATION] Not movable nor resizable.");
-       __clientBounds = _CoordinateSystemUtils::ConvertToFloat(bounds);
-       __isSetClientBounds = true;
-
-       if (moved || resized)
-       {
-               result r = AdjustAbsoluteBounds();
-               SysTryReturn(NID_UI, r == E_SUCCESS, r,         r, "[%s] Propagating.", GetErrorMessage(r));
-
-               SetUpdateLayoutState(true);
-       }
-       return E_SUCCESS;
-}
-
-result
-_Control::SetClientBounds(const FloatRectangle& bounds)
-{
-       ClearLastResult();
-
-       const bool moved   = (__clientBounds.x != bounds.x) || (__clientBounds.y != bounds.y);
-       const bool resized = (__clientBounds.width != bounds.width) || (__clientBounds.height != bounds.height);
-
-       SysTryReturn(NID_UI,
-                               IsMovable() && IsResizable(), E_UNSUPPORTED_OPERATION,
-                               E_UNSUPPORTED_OPERATION, "[E_UNSUPPORTED_OPERATION] Not movable nor resizable.");
-       __clientBounds = bounds;
-       __isSetClientBounds = true;
-
-       if (moved || resized)
-       {
-               result r = AdjustAbsoluteBounds();
-               SysTryReturn(NID_UI, r == E_SUCCESS, r,         r, "[%s] Propagating.", GetErrorMessage(r));
-
-               SetUpdateLayoutState(true);
-       }
-
-       return E_SUCCESS;
-}
-
-bool
-_Control::IsCalledSetClientBounds(void)
-{
-       return __isSetClientBounds;
-}
-
-void 
-_Control::UpdateClientBounds(const FloatDimension& size, FloatRectangle& clientBounds)
-{
-       clientBounds.width = size.width;
-       clientBounds.height = size.height;
-}
-
-Color
-_Control::GetBackgroundColor(void) const
-{
-       ClearLastResult();
-       return __backgroundColor;
-}
-
-void
-_Control::SetBackgroundColor(const Color& color)
-{
-       ClearLastResult();
-       __backgroundColor = color;
-
-       _ControlVisualElement* pCVE = dynamic_cast <_ControlVisualElement*>(GetVisualElement());
-       if (pCVE)
-       {
-               pCVE->SetBackgroundColor(
-                       _Colorf(
-                               (float)color.GetRed() / 255.0f,
-                               (float)color.GetGreen() / 255.0f,
-                               (float)color.GetBlue() / 255.0f,
-                               (float)color.GetAlpha() / 255.0f
-                       )
-               );
-       }
-
-       GetControlDelegate().OnBackgroundColorChanged(const_cast<Color&>(color));
-       ClearLastResult();
-}
-
-_Control::~_Control(void)
-{
-       __destroying = true;
-
-       DetachAllChildren();
-       DetachAllOwnees();
-       _ControlManager::GetInstance()->TakeFocusFromControl(*this);
-       DisposeControl();
-       ReleaseHandle();
-
-       if (__pFont)
-       {
-               delete __pFont;
-               __pFont = null;
-       }
-
-       _Window* pTop = GetRootWindow();
-       if (pTop)
-       {
-               if (this == pTop->GetFocusedControl())
-               {
-                       pTop->SetFocusedControl(null);
-               }
-       }
-
-//     Dangerous: it clears last result and log in catch block.
-//     ClearLastResult();
-}
-
-void
-_Control::DisposeControl(void)
-{
-       __pControlDelegate = null;
-
-       delete __pLayoutItemHandler;
-       __pLayoutItemHandler = null;
-
-       delete __pLayoutContainer;
-       __pLayoutContainer = null;
-
-       delete __pChildren;
-       __pChildren = null;
-
-       delete __pOwnees;
-       __pOwnees = null;
-
-       if (__pVisualElement)
-       {
-               __pVisualElement->Destroy();
-       }
-       __pVisualElement = null;
-
-       delete __pVisualElementContentProvider;
-       __pVisualElementContentProvider = null;
-
-       delete __pVisualElementEventListener;
-       __pVisualElementEventListener = null;
-
-       delete __pCoreGestureDetectors;
-       __pCoreGestureDetectors = null;
-
-       delete __pDataBindingContext;
-       __pDataBindingContext = null;
-
-       ClearStartedGestureDetectorList();
-       delete __pDetectStartedGestureMap;
-       __pDetectStartedGestureMap = null;
-
-       delete __pDelayedTouchInfoList;
-       __pDelayedTouchInfoList = null;
-
-       delete __pAccessibilityContainer;
-       __pAccessibilityContainer = null;
-
-       if (__pFocusVisualElement)
-       {
-               __pFocusVisualElement.release();
-       }
-}
-
-// E_OUT_OF_MEMORY
-// E_SYSTEM
-_Control::_Control(void)
-       : __name(L"")
-       , __pParent(null)
-       , __pChildren(null)
-       , __pOwnees(null)
-       , __bounds(0.0f, 0.0f, 0.0f, 0.0f)
-       , __contentAreaBounds(0.0f, 0.0f, 0.0f, 0.0f)
-       , __clientBounds(0.0f, 0.0f, 0.0f, 0.0f)
-       , __absoluteBounds(0.0f, 0.0f, 0.0f, 0.0f)
-       , __invalidatedBounds(0.0f, 0.0f, 0.0f, 0.0f)
-       , __minSize(FloatDimension(0.0f, 0.0f))
-       , __maxSize(FloatDimension(MAX_LENGTH, MAX_LENGTH))
-       , __backgroundColor(Color::GetColor(COLOR_ID_BLACK))
-       , __movable(true)
-       , __resizable(true)
-       , __focusable(true)
-       , __nativeObjectFocusable(true)
-       , __enabledState(true)
-       , __visibleState(true)
-       , __initVisibleState(false)
-       , __clipToParent(true)
-       , __focusSet(false)
-       , __multiTouchEnabled(false)
-       , __dragEnabled(false)
-       , __dropEnabled(false)
-       , __drawWhenVisible(true)
-       , __isPostOrderTraversal(false)
-       , __isCalledCallOnAttachingToMainTree(false)
-       , __isCalledCallOnAttachedToMainTree(false)
-       , __isSetClientBounds(false)
-       , __isCalledGetCanvasN(false)
-       , __pVisualElementContentProvider(null)
-       , __pVisualElement(null)
-       , __pVisualElementEventListener(null)
-       , __pLayoutItemHandler(null)
-       , __pPortraitLayout(null)
-       , __pLandscapeLayout(null)
-       , __pLayoutContainer(null)
-       , __area(_CONTROL_AREA_NONE)
-       , __layer(_CONTROL_LAYER_NONE)
-       , __orientation(_CONTROL_ORIENTATION_PORTRAIT)
-       , __pTouchEventPreviewer(null)
-       , __pKeyEventPreviewer(null)
-       , __pNotificationEventPreviewer(null)
-       , __pKeyEventListener(null)
-       , __pFocusEventListener(null)
-       , __pNotificationEventListener(null)
-       , __pCoreGestureDetectors(null)
-       , __pDetectStartedGestureMap(null)
-       , __pDelayedTouchInfoList(null)
-       , __touchMoveAllowance(3)
-       , __isSentDelayedEvent(false)
-       , __isSendingDelayedEvent(false)
-       , __isChangingEventTarget(false)
-       , __pDataBindingContext(null)
-       , __pControlDelegate(null)
-       , __pUserData(null)
-       , __destroying(false)
-       , __isEventEnableState(true)
-       , __isControlFontChanged(false)
-       , __pFont(null)
-       , __fontName(L"")
-       , __fontFileName(L"")
-       , __pPreviousFocus(null)
-       , __pNextFocus(null)
-       , __pFocusVisualElement(null)
-       , __inputLockRefCount(0)
-       , __screenDpi(0)
-{
-       ClearLastResult();
-
-       SetControlDelegate(*this);
-       __pAccessibilityContainer = new (std::nothrow) _AccessibilityContainer(*this);
-       __pAccessibilityContainer->Activate(true);
-
-       __pLayoutItemHandler = new (std::nothrow) LayoutItemHandler(this);
-       if (!__pLayoutItemHandler)
-       {
-               goto CATCH;
-       }
-
-       __pLayoutContainer = CreateLayoutContainerN(__pLayoutItemHandler);
-       if (!__pLayoutContainer)
-       {
-               goto CATCH;
-       }
-
-       __pChildren = ::CreateControlListN();
-       if (!__pChildren)
-       {
-               goto CATCH;
-       }
-
-       __pOwnees = ::CreateWindowListN();
-       if (!__pOwnees)
-       {
-               goto CATCH;
-       }
-
-       __pVisualElement = ::CreateVisualElementN();
-       if (!__pVisualElement)
-       {
-               goto CATCH;
-       }
-
-       __pVisualElement->SetUserData(this);
-       __pVisualElement->SetClipChildrenEnabled(true);
-       __pVisualElement->SetRedrawOnResizeEnabled(true);
-
-       __pVisualElementContentProvider = new (std::nothrow) ControlVisualElementContentProvider(*this);
-       SysTryCatch(NID_UI, __pVisualElementContentProvider, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");
-
-       GetVisualElement()->SetContentProvider(__pVisualElementContentProvider);
-
-       __pVisualElementEventListener = new (std::nothrow) ControlVisualElementEventListener(*this);
-       SysTryCatch(NID_UI, __pVisualElementEventListener, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");
-
-       GetVisualElement()->SetVisualElementEventListener(__pVisualElementEventListener);
-
-       __pDetectStartedGestureMap = ::CreateGestureMapN();
-       if (!__pDetectStartedGestureMap)
-       {
-               goto CATCH;
-       }
-
-       __pCoreGestureDetectors = new (std::nothrow) LinkedListT<_TouchGestureDetector*>;
-       if (!__pCoreGestureDetectors)
-       {
-               goto CATCH;
-       }
-
-       __pDelayedTouchInfoList = new (std::nothrow) LinkedListT<_TouchInfo*>;
-       if (!__pDelayedTouchInfoList)
-       {
-               goto CATCH;
-       }
-
-       SetEventPreviewer<_UI_EVENT_TOUCH>(this);
-       SetEventPreviewer<_UI_EVENT_KEY>(this);
-       SetEventPreviewer<_UI_EVENT_NOTIFICAITON>(this);
-
-       SetEventListener<_UI_EVENT_NOTIFICAITON>(this);
-       SetEventListener<_UI_EVENT_FOCUS>(this);
-
-       SetPropagatedTouchEventListener(this);
-       SetPropagatedKeyEventListener(this);
-       GET_COLOR_CONFIG(BASIC::background, __backgroundColor);
-
-       if (IsFailed(GetLastResult()))
-       {
-               SysLog(NID_UI_CTRL, "[%s] Propagated", GetErrorMessage(GetLastResult()));
-       }
-
-       __screenDpi = _ControlManager::GetInstance()->GetScreenDpi();
-
-       return;
-
-CATCH:
-       DisposeControl();
-       return;
-}
-
-void
-_Control::AcquireHandle(void)
-{
-       __controlHandle = _ControlManager::GetInstance()->Register(this); // [ToDo] exception?
-}
-
-void
-_Control::ReleaseHandle(void)
-{
-       _ControlManager::GetInstance()->Release(__controlHandle); // [ToDo] exception?
-}
-
-void
-_Control::SetDrawWhenVisible(bool draw)
-{
-       __drawWhenVisible = draw;
-}
-
-bool
-_Control::IsDrawWhenVisible(void)
-{
-       return __drawWhenVisible;
-}
-
-void
-_Control::SetTerminatingOrder(bool postOrderTraversal)
-{
-       __isPostOrderTraversal = postOrderTraversal;
-}
-
-void
-_Control::SetParent(_Control* pParent)
-{
-       ClearLastResult();
-       __pParent = pParent;
-}
-
-// E_OUT_OF_MEMORY
-// Only called by _Window::SetOwner(pOwner)
-result
-_Control::AttachOwnee(_Window& window)
-{
-       ClearLastResult();
-       result r = E_SUCCESS;
-
-       _Control* pOldOwner = window.GetOwner();
-       if (pOldOwner)
-       {
-               pOldOwner->DetachOwnee(window);
-       }
-
-       r = __pOwnees->Add(&window);
-       if (IsFailed(r))
-       {
-               SysLogException(NID_UI, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");
-               return E_OUT_OF_MEMORY;
-       }
-
-       return E_SUCCESS;
-}
-
-int
-_Control::GetOwneeCount(void) const
-{
-       ClearLastResult();
-       return __pOwnees->GetCount();
-}
-
-// E_OUT_OF_RANGE
-_Window*
-_Control::GetOwnee(int index) const
-{
-       ClearLastResult();
-       result r = E_SUCCESS;
-
-       _Window* pOwnee = null;
-       r = __pOwnees->GetAt(index, pOwnee);
-       if (IsFailed(r))
-       {
-               SysLogException(NID_UI, E_OUT_OF_RANGE, "[E_OUT_OF_RANGE] The specified index is out of range.");
-               return null;
-       }
-
-       return pOwnee;
-}
-
-// Called by _Window::SetOwner(null)
-void
-_Control::DetachOwnee(_Window& ownee)
-{
-       ClearLastResult();
-       result r = E_SUCCESS;
-
-       _Control* pOwner = ownee.GetOwner();
-       if (pOwner != this)
-       {
-               return;
-       }
-
-       r = __pOwnees->Remove(&ownee);
-       if (IsFailed(r))
-       {
-               SysLogException(NID_UI, E_OUT_OF_RANGE, "[E_OUT_OF_RANGE] The specified index is out of range.");
-       }
-}
-
-void
-_Control::DetachAllOwnees(void)
-{
-       ClearLastResult();
-
-       int owneeCount = GetOwneeCount();
-       while (owneeCount--)
-       {
-               _Window* pOwnee = GetOwnee(0);
-               if (pOwnee == null)
-               {
-                       continue;
-               }
-
-               pOwnee->SetOwner(null);
-       }
-}
-
-_Layout::LayoutContainer&
-_Control::GetLayoutContainer() const
-{
-       return *__pLayoutContainer;
-}
-
-void
-_Control::SetMultiTouchEnabled(bool enabled)
-{
-       ClearLastResult();
-       __multiTouchEnabled = enabled;
-}
-
-bool
-_Control::IsMultiTouchEnabled(void) const
-{
-       ClearLastResult();
-       return __multiTouchEnabled;
-}
-
-void
-_Control::SetMovable(bool movable)
-{
-       ClearLastResult();
-       __movable = movable;
-}
-
-void
-_Control::SetResizable(bool resizable)
-{
-       ClearLastResult();
-
-       if (!resizable)
-       {
-               __minSize = __maxSize = GetSizeF();
-       }
-
-       if (!__resizable && resizable)
-       {
-               __minSize = FloatDimension(0.0f, 0.0f);
-               __maxSize = FloatDimension(MAX_LENGTH, MAX_LENGTH);
-       }
-
-       __resizable = resizable;
-}
-
-_Layout::Layout*
-_Control::GetLayout(void) const
-{
-       ClearLastResult();
-       _Layout::Layout* pLayout = __pLayoutContainer->GetLayout();
-
-       SysAssert(GetLastResult() == E_SUCCESS);
-       return pLayout;
-}
-
-result
-_Control::SetCurrentLayout(_Layout::Layout& layout)
-{
-       ClearLastResult();
-       return __pLayoutContainer->SetCurrentLayout(layout);
-}
-
-result
-_Control::AddLayout(_Layout::Layout& layout)
-{
-       ClearLastResult();
-       return __pLayoutContainer->AddLayout(layout);
-}
-
-void
-_Control::SetUpdateLayoutState(bool state)
-{
-       _Layout::Layout* pLayout = GetLayout();
-       if (pLayout)
-       {
-               pLayout->SetUpdateState(state);
-       }
-}
-
-_DataBindingContext*
-_Control::GetDataBindingContext(void)
-{
-       return __pDataBindingContext;
-}
-_AccessibilityContainer*
-_Control::GetAccessibilityContainer(void)
-{
-       return __pAccessibilityContainer;
-}
-void
-_Control::SetDataBindingContext(_DataBindingContext* pDataBindingContext)
-{
-       __pDataBindingContext = pDataBindingContext;
-}
-
-Tizen::Base::String
-_Control::GetDescription(void) const
-{
-       return String(L"");
-}
-
-void
-_Control::SetTouchCapture(bool allowOutOfBounds, bool allowOwnerBounds)
-{
-       _TouchManager* pTouchManager = _TouchManager::GetInstance();
-       SysTryReturnVoidResult(NID_UI, pTouchManager != null, E_SYSTEM, "[E_SYSTEM] TouchManager Instance is null");
-
-       pTouchManager->SetCapturedControl(this, allowOutOfBounds, allowOwnerBounds);
-}
-
-void
-_Control::ReleaseTouchCapture(void)
-{
-       _TouchManager* pTouchManager = _TouchManager::GetInstance();
-       SysTryReturnVoidResult(NID_UI, pTouchManager != null, E_SYSTEM, "[E_SYSTEM] TouchManager Instance is null");
-
-       pTouchManager->SetCapturedControl(null, false, false);
-}
-
-_Control*
-_Control::GetTopmostChildAt(const Point& point) const
-{
-       _Control* pTouchedControl = null;
-       FloatPoint ptf((float) point.x, (float) point.y);
-       _ControlManager* pControlManager = _ControlManager::GetInstance();
-       SysTryReturn(NID_UI, pControlManager, null, E_SYSTEM, "[E_SYSTEM] _ControlManager does not exist.");
-
-       _Window* pRootWindow = GetRootWindow();
-       SysTryReturn(NID_UI, pRootWindow, null, E_SYSTEM, "[E_SYSTEM] GetRootWindow() is null, this control is detached from the main trree");
-
-       _ControlVisualElement* pRootControlElement = dynamic_cast <_ControlVisualElement*>(pRootWindow->GetVisualElement());
-       SysTryReturn(NID_UI, pRootControlElement, null, E_SYSTEM, "[E_SYSTEM] pRootControlElement is null.");
-
-       _ControlVisualElement* pHitTestElm = pRootControlElement->GetControlChildAtPoint(ptf);
-       SysTryReturn(NID_UI, pHitTestElm, null, E_SYSTEM, "[E_SYSTEM] pHitTestElm is null.");
-
-       pTouchedControl = static_cast <_Control*>(pHitTestElm->GetUserData());
-
-       return pTouchedControl;
-}
-
-void
-_Control::SetContentAreaBounds(const Rectangle& rect)
-{
-       ClearLastResult();
-
-       __contentAreaBounds = _CoordinateSystemUtils::ConvertToFloat(rect);
-}
-
-void
-_Control::SetContentAreaBounds(const FloatRectangle& rect)
-{
-       ClearLastResult();
-
-       __contentAreaBounds = rect;
-}
-
-Rectangle
-_Control::GetContentAreaBounds(void) const
-{
-       return _CoordinateSystemUtils::ConvertToInteger(__contentAreaBounds);
-}
-
-FloatRectangle
-_Control::GetContentAreaBoundsF(void) const
-{
-       return __contentAreaBounds;
-}
-
-Bitmap*
-_Control::GetCapturedBitmapN(bool includeChildren) const
-{
-       result r = E_SUCCESS;
-
-       Canvas* pCanvas = null;
-       Bitmap* pBitmap = null;
-
-       pBitmap = GetControlDelegate().OnCapturedBitmapRequestedN();
-       if (pBitmap == null)
-       {
-               FloatRectangle rect;
-
-               Rectangle boundsInCanvas = GetBounds();
-               boundsInCanvas.x = boundsInCanvas.y = 0;
-
-               pCanvas = new (std::nothrow) Canvas;
-               SysTryReturn(NID_UI, pCanvas, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");
-
-               r = pCanvas->Construct(boundsInCanvas);
-               SysTryCatch(NID_UI, r == E_SUCCESS, , r, "[%s] Propagated.", GetErrorMessage(r));
-
-               GetVisualElement()->Draw();
-               ClearLastResult(); // [ToDo] Temp.
-
-               rect.SetBounds(boundsInCanvas.x, boundsInCanvas.y, boundsInCanvas.width, boundsInCanvas.height);
-
-               r = GetVisualElement()->Capture(*pCanvas, rect, includeChildren);
-               SysTryCatch(NID_UI, r == E_SUCCESS, , r, "[%s] Propagated.", GetErrorMessage(r));
-
-               pBitmap = new (std::nothrow) Bitmap;
-               SysTryCatch(NID_UI, pBitmap != null, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");
-
-               r = pBitmap->Construct(*pCanvas, boundsInCanvas);
-               if (IsFailed(r))
-               {
-                       SysAssert(r == E_OUT_OF_MEMORY);
-                       SysTryCatch(NID_UI, r == E_SUCCESS, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");
-               }
-
-               SysLog(NID_UI, "Bitmap (width:%d, height:%d)", pBitmap->GetWidth(), pBitmap->GetHeight());
-
-               delete pCanvas;
-       }
-       _BitmapImpl::ConvertToNonpremultiplied(*pBitmap, true);
-
-       return pBitmap;
-
-CATCH:
-       delete pCanvas;
-       delete pBitmap;
-       SetLastResult(r);
-
-       return null;
-}
-
-Tizen::Graphics::Rectangle
-_Control::GetInvalidatedBounds(void) const
-{
-       return _CoordinateSystemUtils::ConvertToInteger(__invalidatedBounds);
-}
-
-Tizen::Graphics::FloatRectangle
-_Control::GetInvalidatedBoundsF(void) const
-{
-       return __invalidatedBounds;
-}
-
-result
-_Control::AddGestureDetector(const _TouchGestureDetector& gestureDetector)
-{
-       ClearLastResult();
-
-       bool exist = __pCoreGestureDetectors->Contains(const_cast<_TouchGestureDetector*>(&gestureDetector));
-       SysTryReturnResult(NID_UI, exist == false, E_OBJ_ALREADY_EXIST, "[E_OBJ_ALREADY_EXIST]__pCoreGestureDetectors has gesture already");
-
-       result r = __pCoreGestureDetectors->Add(const_cast<_TouchGestureDetector*>(&gestureDetector));
-       SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
-
-       r = const_cast<_TouchGestureDetector&>(gestureDetector).SetControl(*this);
-       SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "Control handle is not valid.");
-
-       const_cast<_TouchGestureDetector&>(gestureDetector).OnTouchGestureDetectorAdded();
-
-       return r;
-}
-
-result
-_Control::RemoveGestureDetector(const _TouchGestureDetector& gestureDetector)
-{
-       ClearLastResult();
-
-       result r = __pCoreGestureDetectors->Remove(&(const_cast<_TouchGestureDetector&>(gestureDetector)));
-       if (r != E_SUCCESS)
-       {
-               return r;
-       }
-
-       const_cast<_TouchGestureDetector&>(gestureDetector).OnTouchGestureDetectorRemoved();
-
-       return E_SUCCESS;
-}
-
-IListT <_TouchGestureDetector*>*
-_Control::GetGestureDetectorList(void) const
-{
-       return __pCoreGestureDetectors;
-}
-
-IMapEnumeratorT <_TouchGestureDetector*, _TouchGestureDetectorState>*
-_Control::GetStartedGestureDetectorEnumeratorN(void) const
-{
-       return __pDetectStartedGestureMap->GetMapEnumeratorN();
-}
-
-result
-_Control::AddStartedGestureDetector(const _TouchGestureDetector& gestureDetector, _TouchGestureDetectorState state)
-{
-       ClearLastResult();
-
-       result r = E_SUCCESS;
-
-       bool exist = false;
-       __pDetectStartedGestureMap->ContainsKey(const_cast<_TouchGestureDetector*>(&gestureDetector), exist);
-
-       if (exist == false)
-       {
-               r = __pDetectStartedGestureMap->Add(const_cast<_TouchGestureDetector*>(&gestureDetector), state);
-       }
-
-       return r;
-}
-
-result
-_Control::SetStartedGestureDetector(const _TouchGestureDetector& gestureDetector, _TouchGestureDetectorState state)
-{
-       ClearLastResult();
-
-       result r = E_SUCCESS;
-
-       bool exist = false;
-       __pDetectStartedGestureMap->ContainsKey(const_cast<_TouchGestureDetector*>(&gestureDetector), exist);
-
-       if (exist == true)
-       {
-               r = __pDetectStartedGestureMap->SetValue(const_cast<_TouchGestureDetector*>(&gestureDetector), state);
-       }
-
-       return r;
-}
-
-result
-_Control::ClearStartedGestureDetectorList(void)
-{
-       ClearLastResult();
-
-       result r = E_SUCCESS;
-
-       IListT<_TouchGestureDetector*>* pList = __pDetectStartedGestureMap->GetKeysN();
-       if (pList)
-       {
-               IEnumeratorT<_TouchGestureDetector*>* pEnumerator = pList->GetEnumeratorN();
-               if (pEnumerator)
-               {
-                       while(pEnumerator->MoveNext() == E_SUCCESS)
-                       {
-                               _TouchGestureDetector* pGestureDetector = null;
-                               pEnumerator->GetCurrent(pGestureDetector);
-
-                               if (pGestureDetector == null)
-                               {
-                                       continue;
-                               }
-
-                               __pDetectStartedGestureMap->Remove(pGestureDetector);
-                       }
-                       delete pEnumerator;
-               }
-               delete pList;
-       }
-
-       IEnumeratorT<_TouchInfo*>* pEnumerator = __pDelayedTouchInfoList->GetEnumeratorN();
-       if(pEnumerator)
-       {
-               while(pEnumerator->MoveNext() == E_SUCCESS)
-               {
-                       _TouchInfo* pTouchInfo = null;
-                       pEnumerator->GetCurrent(pTouchInfo);
-                       if (pTouchInfo == null)
-                       {
-                               continue;
-                       }
-
-                       delete pTouchInfo;
-               }
-
-               __pDelayedTouchInfoList->RemoveAll();
-               delete pEnumerator;
-       }
-
-       __isSentDelayedEvent = false;
-       __isSendingDelayedEvent = false;
-
-       return r;
-}
-
-bool
-_Control::IsDelayedTouchEventEnabled(void) const
-{
-       bool existDelayTouchEventGesture = false;
-
-       IMapEnumeratorT <_TouchGestureDetector*, _TouchGestureDetectorState>* pMapEnumerator = __pDetectStartedGestureMap->GetMapEnumeratorN();
-       if (pMapEnumerator)
-       {
-               while(pMapEnumerator->MoveNext() == E_SUCCESS)
-               {
-                       _TouchGestureDetector* pGestureDetector = null;
-                       pMapEnumerator->GetKey(pGestureDetector);
-
-                       if (pGestureDetector == null)
-                       {
-                               continue;
-                       }
-
-                       _TouchGestureDetectorState state = _TOUCH_GESTURE_DETECTOR_STATE_READY;
-                       pMapEnumerator->GetValue(state);
-
-                       if (pGestureDetector->IsDelayTouchEventEnabled())
-                       {
-                               existDelayTouchEventGesture = true;
-                       }
-               }
-               delete pMapEnumerator;
-       }
-
-       bool delayTouchEvent = false;
-       if (existDelayTouchEventGesture)
-       {
-               pMapEnumerator = __pDetectStartedGestureMap->GetMapEnumeratorN();
-               if (pMapEnumerator)
-               {
-                       while(pMapEnumerator->MoveNext() == E_SUCCESS)
-                       {
-                               _TouchGestureDetector* pGestureDetector = null;
-                               pMapEnumerator->GetKey(pGestureDetector);
-
-                               if (pGestureDetector == null)
-                               {
-                                       continue;
-                               }
-
-                               _TouchGestureDetectorState state = _TOUCH_GESTURE_DETECTOR_STATE_READY;
-                               pMapEnumerator->GetValue(state);
-
-                               if (state == _TOUCH_GESTURE_DETECTOR_STATE_STARTED)
-                               {
-                                       delayTouchEvent = true;
-                                       break;
-                               }
-                       }
-                       delete pMapEnumerator;
-               }
-
-               return delayTouchEvent;
-       }
-       else
-       {
-               return false;
-       }
-}
-
-bool
-_Control::IsPossibleToSendDelayedTouchEvent(void) const
-{
-       bool existDelayTouchEventGesture = false;
-
-       IMapEnumeratorT <_TouchGestureDetector*, _TouchGestureDetectorState>* pMapEnumerator = __pDetectStartedGestureMap->GetMapEnumeratorN();
-       if (pMapEnumerator)
-       {
-               while(pMapEnumerator->MoveNext() == E_SUCCESS)
-               {
-                       _TouchGestureDetector* pGestureDetector = null;
-                       pMapEnumerator->GetKey(pGestureDetector);
-
-                       if (pGestureDetector == null)
-                       {
-                               continue;
-                       }
-
-                       _TouchGestureDetectorState state = _TOUCH_GESTURE_DETECTOR_STATE_READY;
-                       pMapEnumerator->GetValue(state);
-
-                       if (pGestureDetector->IsDelayTouchEventEnabled())
-                       {
-                               existDelayTouchEventGesture = true;
-                       }
-               }
-               delete pMapEnumerator;
-       }
-
-       bool allFailed = true;
-       if (existDelayTouchEventGesture)
-       {
-               pMapEnumerator = __pDetectStartedGestureMap->GetMapEnumeratorN();
-               if (pMapEnumerator)
-               {
-                       while(pMapEnumerator->MoveNext() == E_SUCCESS)
-                       {
-                               _TouchGestureDetector* pGestureDetector = null;
-                               pMapEnumerator->GetKey(pGestureDetector);
-
-                               if (pGestureDetector == null)
-                               {
-                                       continue;
-                               }
-
-                               _TouchGestureDetectorState state = _TOUCH_GESTURE_DETECTOR_STATE_READY;
-                               pMapEnumerator->GetValue(state);
-
-                               if (state == _TOUCH_GESTURE_DETECTOR_STATE_SUCCESS)
-                               {
-                                       allFailed = false;
-                                       break;
-                               }
-                       }
-                       delete pMapEnumerator;
-               }
-
-               return allFailed;
-       }
-       else
-       {
-               return false;
-       }
-}
-
-bool
-_Control::IsCancelOnGestureSuccess(void) const
-{
-       _TouchManager* pTouchManager = _TouchManager::GetInstance();
-       SysAssert(pTouchManager != null);
-
-       IMapEnumeratorT <_TouchGestureDetector*, _TouchGestureDetectorState>* pMapEnumerator = __pDetectStartedGestureMap->GetMapEnumeratorN();
-       if (pMapEnumerator)
-       {
-               while(pMapEnumerator->MoveNext() == E_SUCCESS)
-               {
-                       _TouchGestureDetector* pGestureDetector = null;
-                       pMapEnumerator->GetKey(pGestureDetector);
-
-                       if (pGestureDetector == null)
-                       {
-                               continue;
-                       }
-
-                       _TouchGestureDetectorState state = _TOUCH_GESTURE_DETECTOR_STATE_READY;
-                       pMapEnumerator->GetValue(state);
-
-                       if (pGestureDetector->IsCancelTouchEventOnSuccessEnabled() && state == _TOUCH_GESTURE_DETECTOR_STATE_SUCCESS && !pTouchManager->IsTouchCanceledOnGestureSuccess())
-                       {
-                               delete pMapEnumerator;
-                               return true;
-                       }
-               }
-               delete pMapEnumerator;
-       }
-
-       return false;
-}
-
-bool
-_Control::IsSentDelayedEvent(void) const
-{
-       return __isSentDelayedEvent;
-}
-
-void
-_Control::SetSentDelayedEvent(bool sent)
-{
-       __isSentDelayedEvent = sent;
-}
-
-void
-_Control::SetSendingDelayedEvent(bool sending)
-{
-       __isSendingDelayedEvent = sending;
-}
-
-bool
-_Control::IsSendingDelayedEvent(void) const
-{
-       return __isSendingDelayedEvent;
-}
-
-void
-_Control::AddTouchInfo(const _TouchInfo& touchInfo)
-{
-       _TouchManager* pTouchManager = _TouchManager::GetInstance();
-       SysTryReturnVoidResult(NID_UI, pTouchManager, E_SYSTEM, "[E_SYSTEM] _TouchManager does not exist.");
-
-       _TouchInfo* pTouchInfo = new (std::nothrow) _TouchInfo;
-       SysTryReturnVoidResult(NID_UI, pTouchInfo, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
-
-       FloatPoint screenPoint = pTouchManager->GetScreenPoint(touchInfo.GetPointId());
-       pTouchInfo->SetTouchInfo(touchInfo.GetPointId(), touchInfo.GetTouchStatus(), screenPoint, false, 0);
-       __pDelayedTouchInfoList->Add(pTouchInfo);
-}
-
-IListT<_TouchInfo*>*
-_Control::GetTouchInfoList(void)
-{
-       return __pDelayedTouchInfoList;
-}
-
-_VisualElement*
-_Control::GetVisualElement(void) const
-{
-       SysAssert(__pVisualElement);
-       return __pVisualElement;
-}
-
-void
-_Control::PrintDescription(bool printChildren, int level)
-{
-       int count = PrintDescription(printChildren, 0, level);
-
-       SysLog(NID_UI, "%d controls were printed.", count);
-}
-
-int
-_Control::PrintDescription(bool printChildren, int depth, int level)
-{
-       const int PRINT_CONTROL_VE = 1;
-       const int PRINT_CONTROL_EVAS = 2;
-       const int PRINT_CONTROL_VE_EVAS = 3;
-
-       String indent(L"");
-       String format(L"");
-
-       format.Format(LOG_LEN_MAX, L"%d", depth);
-
-       for (int i = 0; i < depth; i++)
-       {
-               indent.Append(L"   ");
-       }
-
-       indent.Append(format);
-
-       String delimiter(L"-------------------------------------------------------------------------------------------");
-       SysLog(NID_UI, "%ls", delimiter.GetPointer());
-
-       // Public
-       String publicDescription = GetControlDelegate().GetDescription();
-       if (!publicDescription.IsEmpty())
-       {
-               SysLog(NID_UI, "%ls %ls", indent.GetPointer(), publicDescription.GetPointer());
-       }
-
-       // Core
-       SysLog(NID_UI, "%ls 0x%x(%d %ls) enable(%d) enableState(%d) visible(%d) visibleState(%d) focusable(%d) clip(%d) movable(%d) resizable(%d)",
-               indent.GetPointer(), this, __controlHandle.ToInt(), GetName().GetPointer(), IsEnabled(), GetEnableState(), IsVisible(), GetVisibleState(),
-               IsFocusable(), IsClipToParent(), IsMovable(), IsResizable());
-
-       Rectangle bounds = GetBounds();
-       Dimension min = GetMinimumSize();
-       Dimension max = GetMaximumSize();
-       Rectangle clientBounds = GetClientBounds();
-       Rectangle absoluteBounds = GetAbsoluteBounds();
-
-       SysLog(NID_UI, "%ls bounds(%d %d %d %d) min(%d %d) max(%d %d) scrollPos(%.2f %.2f) cbounds(%d %d %d %d) abounds(%d %d %d %d)",
-               indent.GetPointer(), bounds.x, bounds.y, bounds.width, bounds.height,
-               min.width, min.height, max.width, max.height,
-               GetVerticalScrollPosition(), GetHorizontalScrollPosition(),
-               clientBounds.x, clientBounds.y, clientBounds.width, clientBounds.height,
-               absoluteBounds.x, absoluteBounds.y, absoluteBounds.width, absoluteBounds.height);
-
-       SysLog(NID_UI, "%ls bgColor(0x%x) layoutable(%d) orientation(%d) drag(%d) drop(%d) area(%d) layer(%d)",
-               indent.GetPointer(), __backgroundColor.GetRGB32(), IsLayoutable(), GetOrientation(), IsDragEnabled(), IsDropEnabled(), GetArea(), GetLayer());
-
-       Canvas* pCanvas = GetCanvasN();
-       if (pCanvas)
-       {
-               Rectangle canvasBounds = pCanvas->GetBounds();
-               Color canvasBackgroundColor = pCanvas->GetBackgroundColor();
-               Color canvasForegroundColor = pCanvas->GetForegroundColor();
-
-               SysLog(NID_UI, "%ls canvas.bounds(%d %d %d %d) canvas.bgColor(0x%x) canvas.fgColor(0x%x)",
-                       indent.GetPointer(), canvasBounds.x, canvasBounds.y, canvasBounds.width, canvasBounds.height, canvasBackgroundColor.GetRGB32(), canvasForegroundColor.GetRGB32());
-
-               delete pCanvas;
-       }
-
-       SysLog(NID_UI, "%ls DataBindingContext(0x%x) ControlDelegate(0x%x) UserData(0x%x) destroying(%d)",
-               indent.GetPointer(), __pDataBindingContext, __pControlDelegate, __pUserData, __destroying);
-
-       // Ownees
-       String ownees(L"");
-
-       for (int i = 0; i < GetOwneeCount(); ++i)
-       {
-               String ownee(L"");
-               _Window* pOwnee = GetOwnee(i);
-               if (pOwnee)
-               {
-                       ownee.Format(LOG_LEN_MAX, L"0x%x ", pOwnee);
-                       ownees.Append(ownee);
-               }
-       }
-
-       if (!ownees.IsEmpty())
-       {
-               SysLog(NID_UI, "%ls Ownees(%ls)", indent.GetPointer(), ownees.GetPointer());
-       }
-
-       _VisualElementImpl* pVisualElementImpl = _VisualElementImpl::GetInstance(*__pVisualElement);
-
-       SysLog(NID_UI, "%ls _VisualElement(0x%x) _VisualElementImpl(0x%x) VisualElementContentProvider(0x%x) VisualElementEventListener(0x%x)",
-               indent.GetPointer(), __pVisualElement, pVisualElementImpl, __pVisualElementContentProvider, __pVisualElementEventListener);
-
-       // Layout
-       SysLog(NID_UI, "%ls LayoutItemHandler(0x%x) PortraitLayout(0x%x) LandscapeLayout(0x%x) LayoutContainer(0x%x)",
-               indent.GetPointer(), __pLayoutItemHandler, __pPortraitLayout, __pLandscapeLayout, __pLayoutContainer);
-
-       // Derived class
-       String description = GetDescription();
-       if (!description.IsEmpty())
-       {
-               SysLog(NID_UI, "%ls %ls", indent.GetPointer(), description.GetPointer());
-       }
-
-       // Print Gesture List
-       IListT<_TouchGestureDetector*>* pGestureList = GetGestureDetectorList();
-       SysTryReturn(NID_UI, pGestureList, 0, E_SYSTEM, "[E_SYSTEM] System error occurred.");
-
-       IEnumeratorT<_TouchGestureDetector*>* pEnumerator = pGestureList->GetEnumeratorN();
-       SysTryReturn(NID_UI, pEnumerator, 0, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");
-
-       while (pEnumerator->MoveNext() == E_SUCCESS)
-       {
-               _TouchGestureDetector* pGestureDetector = null;
-               pEnumerator->GetCurrent(pGestureDetector);
-               if (pGestureDetector)
-               {
-                       SysLog(NID_UI, "%ls AddedGesture : %ls", indent.GetPointer(), pGestureDetector->GetDescription().GetPointer());
-               }
-       }
-
-       delete pEnumerator;
-
-       // Print Started Gesture List
-       IMapEnumeratorT <_TouchGestureDetector*, _TouchGestureDetectorState>* pStartedGestureEnumerator = GetStartedGestureDetectorEnumeratorN();
-       SysTryReturn(NID_UI, pStartedGestureEnumerator, 0, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");
-
-       while (pStartedGestureEnumerator->MoveNext() == E_SUCCESS)
-       {
-               _TouchGestureDetector* pStartedGestureDetector = null;
-               pStartedGestureEnumerator->GetKey(pStartedGestureDetector);
-               if (pStartedGestureDetector)
-               {
-                       SysLog(NID_UI, "%ls StartedGesture : %ls", indent.GetPointer(), pStartedGestureDetector->GetDescription().GetPointer());
-               }
-       }
-
-       delete pStartedGestureEnumerator;
-
-       // Print VE and Evas
-       switch (level)
-       {
-       case PRINT_CONTROL_VE:
-               _VeDebug::DumpVeTree(pVisualElementImpl, 0);
-               break;
-
-       case PRINT_CONTROL_EVAS:
-               _VeDebug::DumpEvasTree(pVisualElementImpl, 0);
-               break;
-
-       case PRINT_CONTROL_VE_EVAS:
-               _VeDebug::DumpVeTree(pVisualElementImpl, 0);
-               _VeDebug::DumpEvasTree(pVisualElementImpl, 0);
-               break;
-
-       default:
-               break;
-       }
-
-       static int totalCount = 0;
-
-       if (depth == 0)
-       {
-               totalCount = 0;
-       }
-
-       if (printChildren)
-       {
-               depth ++;
-
-               int count = GetChildCount();
-               totalCount += count;
-
-               for (int i = count - 1; i >= 0; --i)
-               {
-                       _Control* pChild = GetChild(i);
-                       if (pChild)
-                       {
-                               pChild->PrintDescription(printChildren, depth, level);
-                       }
-               }
-       }
-
-       return totalCount;
-}
-
-_ITouchEventPreviewer*
-_Control::GetEventPreviewer(_IntToType<_UI_EVENT_TOUCH>) const
-{
-       return __pTouchEventPreviewer;
-}
-
-_IKeyEventPreviewer*
-_Control::GetEventPreviewer(_IntToType<_UI_EVENT_KEY>) const
-{
-       return __pKeyEventPreviewer;
-}
-
-_INotificationEventPreviewer*
-_Control::GetEventPreviewer(_IntToType<_UI_EVENT_NOTIFICAITON>) const
-{
-       return __pNotificationEventPreviewer;
-}
-
-_IKeyEventListener*
-_Control::GetEventListener(_IntToType<_UI_EVENT_KEY>) const
-{
-       return __pKeyEventListener;
-}
-
-_IFocusEventListener*
-_Control::GetEventListener(_IntToType<_UI_EVENT_FOCUS>) const
-{
-       return __pFocusEventListener;
-}
-
-_INotificationEventListener*
-_Control::GetEventListener(_IntToType<_UI_EVENT_NOTIFICAITON>) const
-{
-       return __pNotificationEventListener;
-}
-
-void
-_Control::SetEventPreviewer(_IntToType<_UI_EVENT_TOUCH>, _ITouchEventPreviewer* pPreviewer)
-{
-       __pTouchEventPreviewer = pPreviewer;
-}
-
-void
-_Control::SetEventPreviewer(_IntToType<_UI_EVENT_KEY>, _IKeyEventPreviewer* pPreviewer)
-{
-       __pKeyEventPreviewer = pPreviewer;
-}
-
-void
-_Control::SetEventPreviewer(_IntToType<_UI_EVENT_NOTIFICAITON>, _INotificationEventPreviewer* pPreviewer)
-{
-       __pNotificationEventPreviewer = pPreviewer;
-}
-
-void
-_Control::SetEventListener(_IntToType<_UI_EVENT_FOCUS>, _IFocusEventListener* pListener)
-{
-       __pFocusEventListener = pListener;
-}
-
-void
-_Control::SetEventListener(_IntToType<_UI_EVENT_NOTIFICAITON>, _INotificationEventListener* pListener)
-{
-       __pNotificationEventListener = pListener;
-}
-
-bool
-_Control::IsDragEnabled(void) const
-{
-       return __dragEnabled;
-}
-
-bool
-_Control::IsDropEnabled(void) const
-{
-       return __dropEnabled;
-}
-
-void
-_Control::SetDragEnabled(bool enabled)
-{
-       __dragEnabled = enabled;
-}
-
-void
-_Control::SetDropEnabled(bool enabled)
-{
-       __dropEnabled = enabled;
-}
-
-void
-_Control::SetTouchPressThreshold(float distance)
-{
-       __touchMoveAllowance = static_cast<int>(distance * __screenDpi);
-}
-
-float
-_Control::GetTouchPressThreshold(void) const
-{
-       return static_cast<int>(__touchMoveAllowance /__screenDpi);
-}
-
-int
-_Control::GetTouchPressThresholdPixel(void) const
-{
-       return __touchMoveAllowance;
-}
-
-void
-_Control::SetChangingEventTarget(bool isChangingEventTarget)
-{
-       __isChangingEventTarget = isChangingEventTarget;
-}
-
-bool
-_Control::GetChangingEventTarget(void) const
-{
-       return __isChangingEventTarget;
-}
-
-void
-_Control::SetEventEnableState(bool enableState)
-{
-        __isEventEnableState = enableState;
-}
-
-bool
-_Control::IsEventEnabled(void) const
-{
-        return __isEventEnableState;
-}
-
-void
-_Control::SetPreviousFocus(_Control* pPreviousFocus)
-{
-       __pPreviousFocus = pPreviousFocus;
-
-}
-void
-_Control::SetNextFocus(_Control* pNextFocus)
-{
-       __pNextFocus = pNextFocus;
-}
-_Control*
-_Control::GetPreviousFocus(void) const
-{
-       return  __pPreviousFocus;
-}
-_Control*
-_Control::GetNextFocus(void) const
-{
-       return __pNextFocus;
-}
-
-void
-_Control::OnDrawFocus(void)
-{
-    unique_ptr<VisualElement, _VisualElementDeleter> pFocusVisualElement (new (std::nothrow) VisualElement, _VisualElementDeleter());
-       SysTryReturn(NID_UI, pFocusVisualElement, , E_SYSTEM, "[E_SYSTEM] System error");
-
-       result r = pFocusVisualElement->Construct();
-       SysTryReturn(NID_UI, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] System error");
-
-       __pFocusVisualElement.reset(pFocusVisualElement.release());
-       __pFocusVisualElement->SetImplicitAnimationEnabled(false);
-       __pFocusVisualElement->SetShowState(true);
-
-    _VisualElement* pControVisualElement = this->GetVisualElement();
-       pControVisualElement->AttachChild(*__pFocusVisualElement);
-
-       if (__pFocusVisualElement)
-       {
-               Rectangle rectangle = this->GetBounds();
-               __pFocusVisualElement->SetBounds(FloatRectangle(0, 0, rectangle.width, rectangle.height));
-               unique_ptr<Canvas>pCanvas(__pFocusVisualElement->GetCanvasN());
-               pCanvas->SetBackgroundColor(0x55555555);
-               pCanvas->Clear();
-               Bitmap* pBitmap = null;
-               result r = GET_BITMAP_CONFIG_N(FOCUSUI::FOCUS, BITMAP_PIXEL_FORMAT_ARGB8888, pBitmap);
-
-               if (r == E_SUCCESS)
-               {
-                       if (_BitmapImpl::CheckNinePatchedBitmapStrictly(*pBitmap))
-                       {
-                               r = pCanvas->DrawNinePatchedBitmap(FloatRectangle(0.0f, 0.0f, rectangle.width, rectangle.height), *pBitmap);
-                       }
-                       else
-                       {
-                               r = pCanvas->DrawBitmap(FloatRectangle(0.0f, 0.0f, rectangle.width, rectangle.height), *pBitmap);
-                       }
-               }
-               __pFocusVisualElement->SetShowState(true);
-       }
-}
-
-void
-_Control::OnChildControlFocusMoved(const _Control& control)
-{
-}
-
-bool
-_Control::IsChildControlFocusManage(void) const
-{
-       return false;
-}
-
-result
-_Control::SetFontFromFile(const String& fileName)
-{
-       result r = E_SUCCESS;
-
-       if (__fontFileName.Equals(fileName))
-       {
-               return E_SUCCESS;
-       }
-
-       __isControlFontChanged = true;
-       __fontFileName = fileName;
-       __fontName.Clear();
-
-       Font* pFont = GetFallbackFont();
-
-       if (pFont == null)
-       {
-               r = GetLastResult();
-               SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
-       }
-       return E_SUCCESS;
-}
-
-Tizen::Base::String
-_Control::GetFontFile(void) const
-{
-       return __fontFileName;
-}
-void
-_Control::DrawFocus(void)
-{
-       _IControlDelegate& delegate = GetControlDelegate();
-       delegate.OnDrawFocus();
-}
-
-void
-_Control::MakeFocusList(const _Control* pControl, IListT<_Control*>*  pFocusControlList) const
-{
-       int childCount = pControl->GetChildCount();
-       for(int i = 0; i < childCount; i++)
-       {
-               _Control* pChildControl = pControl->GetChild(i);
-               Rectangle rect = pChildControl->GetAbsoluteBounds();
-               unique_ptr<IEnumeratorT<_Control*> > pEnum (pFocusControlList->GetEnumeratorN());
-               int index = 0;
-               while (pEnum->MoveNext() == E_SUCCESS)
-               {
-                       _Control* pEnumeratorControl = null;
-                       pEnum->GetCurrent(pEnumeratorControl);
-                       if (pEnumeratorControl != null)
-                       {
-                               Rectangle enumeratorRect = pEnumeratorControl->GetAbsoluteBounds();
-                               if(enumeratorRect.y > rect.y)
-                               {
-                                       break;
-                               }
-                               else if (enumeratorRect.y == rect.y)
-                               {
-                                       if(enumeratorRect.x > rect.x)
-                                       {
-                                               break;
-                                       }
-                               }
-
-                               index ++;
-                       }
-               }
-               pFocusControlList->InsertAt(pChildControl, index);
-       }
-}
-
-void
-_Control::MakeChildContainerFocusList(const _Control* pControl, int startIndex , IListT<_Control*>*  pFocusControlList) const
-{
-       unique_ptr<IListT<_Control*> > pTempList (new (std::nothrow) ArrayListT<_Control*>);
-       SysTryReturnVoidResult(NID_UI_CTRL, pTempList, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory is insufficient.");
-       MakeFocusList(pControl, pTempList.get());
-
-       unique_ptr<IEnumeratorT<_Control*> > pTempEnum(pTempList->GetEnumeratorN());
-       int index = ++startIndex;
-       while (pTempEnum->MoveNext() == E_SUCCESS)
-       {
-               _Control* pEnumeratorControl = null;
-               pTempEnum->GetCurrent(pEnumeratorControl);
-               pFocusControlList->InsertAt(pEnumeratorControl, index);
-               index ++;
-       }
-}
-
-Tizen::Base::Collection::IListT<_Control*>*
-_Control::GetFocusListN(void) const
-{
-       unique_ptr<IListT<_Control*> > pControlFocusList (new (std::nothrow) ArrayListT<_Control*>);
-       SysTryReturn(NID_UI_CTRL, pControlFocusList, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
-       MakeFocusList(this, pControlFocusList.get());
-
-       unique_ptr<IEnumeratorT<_Control*> > pEnum(pControlFocusList->GetEnumeratorN());
-       SysTryReturn(NID_UI_CTRL, pEnum, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
-       int i =0;
-       int nextContainerIndex = -1;
-       while (pEnum->MoveNext() == E_SUCCESS)
-       {
-               _Control* pEnumeratorControl = null;
-               pEnum->GetCurrent(pEnumeratorControl);
-               _ContainerImpl* pTempContainerImpl = dynamic_cast<_ContainerImpl*>(static_cast <_ControlImpl* >(pEnumeratorControl->GetUserData()));
-
-               if (pTempContainerImpl != null && (nextContainerIndex < i))
-               {
-                       if (pEnumeratorControl->IsChildControlFocusManage() == false)
-                       {
-                               MakeChildContainerFocusList(pEnumeratorControl, i, pControlFocusList.get());
-                               nextContainerIndex = i;
-                               pEnum.reset(pControlFocusList->GetEnumeratorN());
-                               i = -1;
-                       }
-               }
-               i++;
-       }
-       return pControlFocusList.release();
-}
-}} // Tizen::Ui
+//\r
+// Open Service Platform\r
+// Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.\r
+//\r
+// Licensed under the Flora License, Version 1.0 (the License);\r
+// you may not use this file except in compliance with the License.\r
+// You may obtain a copy of the License at\r
+//\r
+//     http://floralicense.org/license/\r
+//\r
+// Unless required by applicable law or agreed to in writing, software\r
+// distributed under the License is distributed on an AS IS BASIS,\r
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+// See the License for the specific language governing permissions and\r
+// limitations under the License.\r
+//\r
+\r
+/**\r
+ * @file               FUi_Control.cpp\r
+ * @brief              This is the implementation file for the _Control class.\r
+ */\r
+\r
+#include <new>\r
+#include <unique_ptr.h>\r
+#include <FBaseColLinkedListT.h>\r
+#include <FBaseColArrayListT.h>\r
+#include <FBaseColHashMapT.h>\r
+#include <FBaseSysLog.h>\r
+#include <FGrpFloatRectangle.h>\r
+#include <FUiAnimVisualElementContentProvider.h>\r
+#include <FBase_Log.h>\r
+#include <FGrp_BitmapImpl.h>\r
+#include <FSys_SystemInfoImpl.h>\r
+#include "FUi_Control.h"\r
+#include "FUi_ControlManager.h"\r
+#include "FUi_CoordinateSystemUtils.h"\r
+#include "FUi_Window.h"\r
+#include "FUi_EcoreEvasMgr.h"\r
+#include "FUi_EcoreEvas.h"\r
+#include "FUi_LayoutLayoutContainer.h"\r
+#include "FUi_LayoutAbsoluteLayout.h"\r
+#include "FUi_LayoutILayoutItemHandler.h"\r
+#include "FUi_TouchManager.h"\r
+#include "FUi_DataBindingContext.h"\r
+#include "FUi_TouchLongPressGestureDetector.h"\r
+#include "FUi_TouchTapGestureDetector.h"\r
+#include "FUi_AccessibilityContainer.h"\r
+#include "FUi_ResourceManager.h"\r
+#include "FUiAnim_ControlVisualElement.h"\r
+#include "FUiAnim_Debug.h"\r
+#include "FUiAnim_VisualElement.h"\r
+#include "FUiAnim_VisualElementImpl.h"\r
+#include "FUiCtrl_Form.h"\r
+#include "FUiCtrl_Frame.h"\r
+#include "FUi_ContainerImpl.h"\r
+\r
+using namespace std;\r
+using namespace Tizen::Base;\r
+using namespace Tizen::Base::Collection;\r
+using namespace Tizen::Base::Runtime;\r
+using namespace Tizen::Graphics;\r
+using namespace Tizen::Ui;\r
+using namespace Tizen::Ui::Animations;\r
+\r
+namespace {\r
+\r
+int\r
+GetZOrderGroupOfVisualElement(_ControlLayer layer)\r
+{\r
+       switch (layer)\r
+       {\r
+       case _CONTROL_LAYER_OVERLAY:\r
+               return _ControlVisualElement::Z_ORDER_GROUP_CONTROL - 1;\r
+       case _CONTROL_LAYER_CLIENT_BOTTOM:\r
+               return _ControlVisualElement::Z_ORDER_GROUP_CONTROL;\r
+       case _CONTROL_LAYER_NONE:\r
+               // fall through\r
+       case _CONTROL_LAYER_CLIENT_MIDDLE:\r
+               return _ControlVisualElement::Z_ORDER_GROUP_CONTROL + 1;\r
+       case _CONTROL_LAYER_CLIENT_TOP:\r
+               return _ControlVisualElement::Z_ORDER_GROUP_CONTROL + 2;\r
+       case _CONTROL_LAYER_SYSTEM:\r
+               return _ControlVisualElement::Z_ORDER_GROUP_CONTROL + 3;\r
+       default:\r
+               SysAssert(false);\r
+               return _ControlVisualElement::Z_ORDER_GROUP_CONTROL + 1;\r
+       }\r
+}\r
+\r
+inline bool\r
+AdjustSizeToRange(float& width, float& height, const FloatDimension& minDim, const FloatDimension& maxDim)\r
+{\r
+       bool changed = false;\r
+       if (width < minDim.width)\r
+       {\r
+               width = minDim.width;\r
+               changed = true;\r
+       }\r
+       if (height < minDim.height)\r
+       {\r
+               height = minDim.height;\r
+               changed = true;\r
+       }\r
+\r
+       if (width > maxDim.width)\r
+       {\r
+               width = maxDim.width;\r
+               changed = true;\r
+       }\r
+       if (height > maxDim.height)\r
+       {\r
+               height = maxDim.height;\r
+               changed = true;\r
+       }\r
+\r
+       return changed;\r
+}\r
+\r
+inline bool\r
+AdjustSizeToRange(FloatDimension& dim, const FloatDimension& minDim, const FloatDimension& maxDim)\r
+{\r
+       return AdjustSizeToRange(dim.width, dim.height, minDim, maxDim);\r
+}\r
+\r
+// E_OUT_OF_MEMORY\r
+// E_SYSTEM\r
+_ControlVisualElement*\r
+CreateVisualElementN(void)\r
+{\r
+       ClearLastResult();\r
+\r
+       _ControlVisualElement* pVisualElement = new (std::nothrow) _ControlVisualElement;\r
+       SysTryReturn(NID_UI, pVisualElement, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");\r
+\r
+       SysTryCatch(NID_UI,\r
+               pVisualElement->ConstructControlVisualElement() == E_SUCCESS, ,\r
+               E_SYSTEM, "[E_SYSTEM] System error occurred.");\r
+\r
+       pVisualElement->SetImplicitAnimationEnabled(false);\r
+       pVisualElement->SetShowState(true);\r
+       pVisualElement->SetBackBufferEnabled(true);\r
+       pVisualElement->SetRedrawOnResizeEnabled(true);\r
+       pVisualElement->SetSurfaceOpaque(false);\r
+\r
+       return pVisualElement;\r
+\r
+CATCH:\r
+       //delete pVisualElement;\r
+       pVisualElement->Destroy();\r
+       return null;\r
+}\r
+\r
+_Control::GestureMap*\r
+CreateGestureMapN(void)\r
+{\r
+       ClearLastResult();\r
+\r
+       _Control::GestureMap* pGestureMap = new (std::nothrow) _Control::GestureMap;\r
+       SysTryReturn(NID_UI, pGestureMap, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");\r
+\r
+       SysTryCatch(NID_UI,\r
+               pGestureMap->Construct() == E_SUCCESS, ,\r
+               E_SYSTEM, "[E_SYSTEM] System error occurred.");\r
+\r
+       return pGestureMap;\r
+\r
+CATCH:\r
+       delete pGestureMap;\r
+       return null;\r
+}\r
+\r
+// E_OUT_OF_MEMORY\r
+_Control::ControlList*\r
+CreateControlListN(void)\r
+{\r
+       ClearLastResult();\r
+\r
+       _Control::ControlList* pControlList = new (std::nothrow) _Control::ControlList;\r
+       SysTryReturn(NID_UI, pControlList, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");\r
+\r
+       return pControlList;\r
+}\r
+\r
+// E_OUT_OF_MEMORY\r
+_Control::WindowList*\r
+CreateWindowListN(void)\r
+{\r
+       ClearLastResult();\r
+\r
+       _Control::WindowList* pWindowList = new (std::nothrow) _Control::WindowList;\r
+       SysTryReturn(NID_UI, pWindowList, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");\r
+\r
+       return pWindowList;\r
+}\r
+\r
+// E_OUT_OF_MEMORY\r
+// E_SYSTEM\r
+_Layout::LayoutContainer*\r
+CreateLayoutContainerN(_Layout::ILayoutItemHandler* pLayoutItemHandler)\r
+{\r
+       ClearLastResult();\r
+       result r = E_SUCCESS;\r
+\r
+       _Layout::LayoutContainer* pLayoutContainer = null;\r
+       _Layout::AbsoluteLayout* pAbsLayout = null;\r
+\r
+       pLayoutContainer = new (std::nothrow) _Layout::LayoutContainer();\r
+       SysTryReturn(NID_UI, pLayoutContainer, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage");\r
+       if (IsFailed(GetLastResult()))\r
+       {\r
+               goto CATCH;\r
+       }\r
+\r
+       pAbsLayout = new (std::nothrow) _Layout::AbsoluteLayout();\r
+       SysTryCatch(NID_UI, pAbsLayout, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");\r
+       if (IsFailed(GetLastResult()))\r
+       {\r
+               goto CATCH;\r
+       }\r
+\r
+       pLayoutContainer->SetItemHandler(pLayoutItemHandler);\r
+\r
+       r = pLayoutContainer->SetDefaultLayout(*pAbsLayout);\r
+       SysTryCatch(NID_UI, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] System error occurred.");\r
+\r
+       return pLayoutContainer;\r
+\r
+CATCH:\r
+       delete pAbsLayout;\r
+       delete pLayoutContainer;\r
+\r
+       return null;\r
+}\r
+\r
+} // Anonymous namespace\r
+\r
+namespace Tizen { namespace Ui\r
+{\r
+\r
+IMPLEMENT_PROPERTY(_Control);\r
+\r
+class _Control::ControlVisualElementContentProvider\r
+       : public VisualElementContentProvider\r
+{\r
+\r
+private:\r
+       _Control& __control;\r
+\r
+public:\r
+       ControlVisualElementContentProvider(_Control& control)\r
+               : __control(control)\r
+       {\r
+       }\r
+\r
+       virtual ~ControlVisualElementContentProvider(void)\r
+       {\r
+       }\r
+\r
+       virtual bool PrepareDraw(VisualElement& target)\r
+       {\r
+               _ControlVisualElement* pCVE = dynamic_cast <_ControlVisualElement*>(&target);\r
+               if (!pCVE)\r
+               {\r
+                       return false;\r
+               }\r
+\r
+               Color bgColor = __control.GetBackgroundColor();\r
+\r
+               pCVE->SetBackgroundColor(\r
+                       _Colorf(\r
+                               (float) bgColor.GetRed() / 255.0f,\r
+                               (float) bgColor.GetGreen() / 255.0f,\r
+                               (float) bgColor.GetBlue() / 255.0f,\r
+                               (float) bgColor.GetAlpha() / 255.0f\r
+                               )\r
+                       );\r
+\r
+               __control.GetControlDelegate().OnDraw();\r
+\r
+               target.SetFlushNeeded();\r
+\r
+               return false;\r
+       }\r
+\r
+       virtual HitTestResult HitTest(VisualElement& target, const FloatPoint& point)\r
+       {\r
+               return __control.GetControlDelegate().HitTest(point);\r
+       }\r
+\r
+private:\r
+       ControlVisualElementContentProvider(const ControlVisualElementContentProvider& rhs);\r
+       ControlVisualElementContentProvider& operator =(const ControlVisualElementContentProvider& rhs);\r
+};\r
+\r
+class _Control::ControlVisualElementEventListener\r
+       : public IVisualElementEventListener\r
+{\r
+public:\r
+       ControlVisualElementEventListener(_Control& control)\r
+               : __control(control)\r
+       {\r
+       }\r
+\r
+       virtual ~ControlVisualElementEventListener(void)\r
+       {\r
+       }\r
+\r
+public:\r
+       virtual void OnChildAttached(Tizen::Ui::Animations::VisualElement& source, Tizen::Ui::Animations::VisualElement& child)\r
+       {\r
+       }\r
+\r
+       virtual void OnChildDetached(Tizen::Ui::Animations::VisualElement& source, Tizen::Ui::Animations::VisualElement& child)\r
+       {\r
+       }\r
+\r
+       virtual void OnAttached(Tizen::Ui::Animations::VisualElement& source, Tizen::Ui::Animations::VisualElement& parent)\r
+       {\r
+       }\r
+\r
+       virtual void OnDetached(Tizen::Ui::Animations::VisualElement& source, Tizen::Ui::Animations::VisualElement& parent)\r
+       {\r
+       }\r
+\r
+       virtual result OnTransformChanging(Tizen::Ui::Animations::VisualElement& source, FloatMatrix4& newTransform)\r
+       {\r
+               return E_SUCCESS;\r
+       }\r
+\r
+       virtual void OnTransformChanged(Tizen::Ui::Animations::VisualElement& source, const FloatMatrix4& previousTransform)\r
+       {\r
+       }\r
+\r
+       virtual result OnChildrenTransformChanging(Tizen::Ui::Animations::VisualElement& source, FloatMatrix4& newTransform)\r
+       {\r
+               for (int i = 0; i < __control.GetChildCount(); ++i)\r
+               {\r
+                       _Control* pChild = __control.GetChild(i);\r
+                       if (!pChild)\r
+                       {\r
+                               continue;\r
+                       }\r
+\r
+                       if (pChild->GetArea() == _CONTROL_AREA_SYSTEM)\r
+                       {\r
+                               _VisualElement* pVisualElement = pChild->GetVisualElement();\r
+                               if (pVisualElement)\r
+                               {\r
+                                       FloatMatrix4 inverseMatrix(newTransform);\r
+                                       inverseMatrix.Invert();\r
+\r
+                                       result r = pVisualElement->SetTransformMatrix(inverseMatrix);\r
+                                       if (r != E_SUCCESS)\r
+                                       {\r
+                                               continue;\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+\r
+               return E_SUCCESS;\r
+       }\r
+\r
+       virtual void OnChildrenTransformChanged(Tizen::Ui::Animations::VisualElement& source, const FloatMatrix4& previousTransform)\r
+               {\r
+       }\r
+\r
+       virtual result OnBoundsChanging(Tizen::Ui::Animations::VisualElement& source, FloatRectangle& newBounds)\r
+       {\r
+               return E_SUCCESS;\r
+       }\r
+\r
+       virtual void OnBoundsChanged(Tizen::Ui::Animations::VisualElement& source, const FloatRectangle& previousBounds)\r
+       {\r
+       }\r
+\r
+       virtual void OnShowStateChanged(Tizen::Ui::Animations::VisualElement& source, bool previousShowState)\r
+       {\r
+       }\r
+\r
+private:\r
+       ControlVisualElementEventListener(const ControlVisualElementEventListener& rhs);\r
+       ControlVisualElementEventListener& operator =(const ControlVisualElementEventListener& rhs);\r
+\r
+private:\r
+       _Control& __control;\r
+}; // ControlVisualElementEventListener\r
+\r
+// Layout Item Handler\r
+class _Control::LayoutItemHandler\r
+       : public _Layout::ILayoutItemHandler\r
+{\r
+public:\r
+       LayoutItemHandler(_Control* pControl)\r
+               : __pControl(pControl)\r
+       {\r
+               SysAssert(__pControl);\r
+       }\r
+\r
+       void SetItemVisibleState(bool visible)\r
+       {\r
+               __pControl->SetVisibleState(visible);\r
+       }\r
+\r
+       result SetItemBounds(const FloatRectangle& rect)\r
+       {\r
+               SysAssert(__pControl->IsInSizeRange(FloatDimension(rect.width, rect.height)));\r
+               return __pControl->SetBoundsFinal(rect, false, true);\r
+       }\r
+\r
+       FloatRectangle GetItemBounds(void) const\r
+       {\r
+               return __pControl->GetBoundsF();\r
+       }\r
+\r
+       FloatRectangle GetItemClientBoundsFromSize(const FloatDimension& size) const\r
+       {\r
+               FloatRectangle clientBounds(0.0f, 0.0f, 0.0f, 0.0f);\r
+               __pControl->UpdateClientBounds(size, clientBounds);\r
+               return clientBounds;\r
+       }\r
+\r
+       FloatDimension GetItemContentSize(void) const\r
+       {\r
+               return __pControl->GetControlDelegate().GetContentSizeF();\r
+       }\r
+\r
+       FloatDimension GetItemMinimumSize(void) const\r
+       {\r
+               return __pControl->GetMinimumSizeF();\r
+       }\r
+\r
+       FloatDimension GetItemMaximumSize(void) const\r
+       {\r
+               return __pControl->GetMaximumSizeF();\r
+       }\r
+\r
+       result OnItemMeasure(float& width, float& height)\r
+       {\r
+               Dimension evaluatedSize(_CoordinateSystemUtils::ConvertToInteger(width), _CoordinateSystemUtils::ConvertToInteger(height));\r
+               FloatDimension evaluatedSizeF(width, height);\r
+\r
+               bool changed = __pControl->GetControlDelegate().OnEvaluateSize(evaluatedSizeF);\r
+               if (changed)\r
+               {\r
+                       width = evaluatedSizeF.width;\r
+                       height = evaluatedSizeF.height;\r
+               }\r
+               else\r
+               {\r
+                       __pControl->GetControlDelegate().OnEvaluateSize(evaluatedSize);\r
+\r
+                       if (evaluatedSize.width != (_CoordinateSystemUtils::ConvertToInteger(width)))\r
+                       {\r
+                               width = evaluatedSize.width;\r
+                       }\r
+                       if (evaluatedSize.height != (_CoordinateSystemUtils::ConvertToInteger(height)))\r
+                       {\r
+                               height = evaluatedSize.height;\r
+                       }\r
+               }\r
+\r
+               return E_SUCCESS;\r
+       }\r
+\r
+private:\r
+       LayoutItemHandler(const LayoutItemHandler& rhs);\r
+       LayoutItemHandler& operator =(const LayoutItemHandler& rhs);\r
+\r
+private:\r
+       _Control* __pControl;\r
+}; // LayoutItemHandler\r
+\r
+// E_OUT_OF_MEMORY\r
+// E_SYSTEM\r
+_Control*\r
+_Control::CreateControlN(void)\r
+{\r
+       _Control* pControl = new (std::nothrow) _Control;\r
+       SysTryReturn(NID_UI, pControl, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");\r
+       if (IsFailed(GetLastResult()))\r
+       {\r
+               goto CATCH;\r
+       }\r
+\r
+       pControl->AcquireHandle();\r
+\r
+       SysAssert(GetLastResult() == E_SUCCESS);\r
+       return pControl;\r
+\r
+CATCH:\r
+       delete pControl;\r
+       return null;\r
+}\r
+\r
+void\r
+_Control::ResetEventListeners(void)\r
+{\r
+       __pFocusEventListener = this;\r
+       __pNotificationEventListener = this;\r
+}\r
+\r
+void\r
+_Control::SetControlDelegate(_IControlDelegate& delegate)\r
+{\r
+       __pControlDelegate = &delegate;\r
+}\r
+\r
+void\r
+_Control::ResetControlDelegate(void)\r
+{\r
+       __pControlDelegate = this;\r
+}\r
+\r
+_IControlDelegate&\r
+_Control::GetControlDelegate(void) const\r
+{\r
+       if (__destroying)\r
+       {\r
+               return const_cast<_Control&>(*this);\r
+       }\r
+\r
+       SysAssert(__pControlDelegate);\r
+       return *__pControlDelegate;\r
+}\r
+\r
+void\r
+_Control::SetPropagatedTouchEventListener(_IPropagatedTouchEventListener* pListener)\r
+{\r
+       __pPropagatedTouchEventListener = pListener;\r
+}\r
+\r
+_IPropagatedTouchEventListener*\r
+_Control::GetPropagatedTouchEventListener(void) const\r
+{\r
+       if (__destroying)\r
+       {\r
+               return const_cast<_Control*>(this);\r
+       }\r
+\r
+       SysAssert(__pPropagatedTouchEventListener);\r
+       return __pPropagatedTouchEventListener;\r
+}\r
+\r
+void\r
+_Control::SetPropagatedKeyEventListener(_IPropagatedKeyEventListener* pListener)\r
+{\r
+       __pPropagatedKeyEventListener = pListener;\r
+}\r
+\r
+_IPropagatedKeyEventListener*\r
+_Control::GetPropagatedKeyEventListener(void) const\r
+{\r
+       if (__destroying)\r
+       {\r
+               return const_cast<_Control*>(this);\r
+       }\r
+\r
+       SysAssert(__pPropagatedKeyEventListener);\r
+       return __pPropagatedKeyEventListener;\r
+}\r
+\r
+bool\r
+_Control::OnPreviewKeyPressed(const _Control& source, const _KeyInfo& keyInfo)\r
+{\r
+       return false;\r
+}\r
+\r
+bool\r
+_Control::OnPreviewKeyReleased(const _Control& source, const _KeyInfo& keyInfo)\r
+{\r
+       return false;\r
+}\r
+\r
+bool\r
+_Control::OnKeyPressed(const _Control& source, const _KeyInfo& keyInfo)\r
+{\r
+       //SysLog(NID_UI, ">>> [core] OnKeyPressed(%d, %d)", keyInfo.GetKeyCode(), keyInfo.GetKeyModifier());\r
+       return false;\r
+}\r
+\r
+bool\r
+_Control::OnKeyReleased(const _Control& source, const _KeyInfo& keyInfo)\r
+{\r
+       //SysLog(NID_UI, ">>> [core] OnKeyReleased(%d, %d)", keyInfo.GetKeyCode(), keyInfo.GetKeyModifier());\r
+       return false;\r
+}\r
+\r
+bool\r
+_Control::TranslateKeyEventInfo(const _Control& source, _KeyInfo& keyInfo)\r
+{\r
+       return false;\r
+}\r
+\r
+_UiTouchEventDelivery\r
+_Control::OnPreviewTouchPressed(const _Control& source, const _TouchInfo& touchinfo)\r
+{\r
+       return _UI_TOUCH_EVENT_DELIVERY_YES;\r
+}\r
+\r
+_UiTouchEventDelivery\r
+_Control::OnPreviewTouchReleased(const _Control& source, const _TouchInfo& touchinfo)\r
+{\r
+       return _UI_TOUCH_EVENT_DELIVERY_YES;\r
+}\r
+\r
+_UiTouchEventDelivery\r
+_Control::OnPreviewTouchMoved(const _Control& source, const _TouchInfo& touchinfo)\r
+{\r
+       return _UI_TOUCH_EVENT_DELIVERY_YES;\r
+}\r
+\r
+_UiTouchEventDelivery\r
+_Control::OnPreviewTouchCanceled(const _Control& source, const _TouchInfo& touchinfo)\r
+{\r
+       return _UI_TOUCH_EVENT_DELIVERY_YES;\r
+}\r
+\r
+bool\r
+_Control::OnTouchPressed(const _Control& source, const _TouchInfo& touchinfo)\r
+{\r
+       return false;\r
+}\r
+\r
+bool\r
+_Control::OnTouchReleased(const _Control& source, const _TouchInfo& touchinfo)\r
+{\r
+       return false;\r
+}\r
+\r
+bool\r
+_Control::OnTouchMoved(const _Control& source, const _TouchInfo& touchinfo)\r
+{\r
+       return false;\r
+}\r
+\r
+bool\r
+_Control::OnTouchCanceled(const _Control& source, const _TouchInfo& touchinfo)\r
+{\r
+       return false;\r
+}\r
+\r
+bool\r
+_Control::OnFocusGained(const _Control& source)\r
+{\r
+       return false;\r
+}\r
+\r
+bool\r
+_Control::OnFocusLost(const _Control& source)\r
+{\r
+    if (__pFocusVisualElement)\r
+    {\r
+        __pFocusVisualElement.reset();\r
+    }\r
+       return false;\r
+}\r
+\r
+bool\r
+_Control::OnPreviewNotifiedN(const _Control& source, IList* pArgs)\r
+{\r
+       return false;\r
+}\r
+\r
+bool\r
+_Control::OnNotifiedN(const _Control& source, IList* pArgs)\r
+{\r
+       return false;\r
+}\r
+\r
+bool\r
+_Control::IsMovable(void) const\r
+{\r
+       ClearLastResult();\r
+       return __movable;\r
+}\r
+\r
+bool\r
+_Control::IsResizable(void) const\r
+{\r
+       ClearLastResult();\r
+       return __resizable;\r
+}\r
+\r
+Dimension\r
+_Control::GetContentSize(void) const\r
+{\r
+       ClearLastResult();\r
+       return Dimension(0, 0);\r
+}\r
+\r
+FloatDimension\r
+_Control::GetContentSizeF(void) const\r
+{\r
+       ClearLastResult();\r
+       return FloatDimension(0.0f, 0.0f);\r
+}\r
+\r
+HitTestResult\r
+_Control::HitTest(const FloatPoint& point)\r
+{\r
+       _VisualElementImpl* pVisualElementImpl = _VisualElementImpl::GetInstance(*__pVisualElement);\r
+\r
+       if (pVisualElementImpl)\r
+       {\r
+               if (pVisualElementImpl->HitTestI(point) == _VisualElementImpl::HITTEST_MATCH)\r
+               {\r
+                       return HIT_TEST_MATCH;\r
+               }\r
+       }\r
+\r
+       return HIT_TEST_NOWHERE;\r
+}\r
+\r
+float\r
+_Control::GetVerticalScrollPosition(void) const\r
+{\r
+       return 0.0f;\r
+}\r
+\r
+float\r
+_Control::GetHorizontalScrollPosition(void) const\r
+{\r
+       return 0.0f;\r
+}\r
+\r
+_ControlOrientation\r
+_Control::GetOrientation(void) const\r
+{\r
+       ClearLastResult();\r
+       return __orientation;\r
+}\r
+\r
+void\r
+_Control::OnDraw(void)\r
+{\r
+}\r
+\r
+Canvas*\r
+_Control::OnCanvasRequestedN(const Dimension& size)\r
+{\r
+\r
+       return null;\r
+}\r
+\r
+Canvas*\r
+_Control::OnCanvasRequestedFN(const FloatRectangle& bounds)\r
+{\r
+\r
+       return null;\r
+}\r
+\r
+Bitmap*\r
+_Control::OnCapturedBitmapRequestedN(void)\r
+{\r
+\r
+       return null;\r
+}\r
+\r
+result\r
+_Control::OnAttaching(const _Control* pParent)\r
+{\r
+       return E_SUCCESS;\r
+}\r
+\r
+result\r
+_Control::OnAttached(void)\r
+{\r
+       return E_SUCCESS;\r
+}\r
+\r
+result\r
+_Control::OnAttachingToMainTree(const _Control* pParent)\r
+{\r
+       return E_SUCCESS;\r
+}\r
+\r
+result\r
+_Control::OnAttachedToMainTree(void)\r
+{\r
+       return E_SUCCESS;\r
+}\r
+\r
+result\r
+_Control::OnDetachingFromMainTree(void)\r
+{\r
+       return E_SUCCESS;\r
+}\r
+\r
+void\r
+_Control::OnAttachingFailed(const _Control& parent)\r
+{\r
+}\r
+\r
+result\r
+_Control::OnDetaching(void)\r
+{\r
+       return E_SUCCESS;\r
+}\r
+\r
+result\r
+_Control::OnBoundsChanging(const Rectangle& bounds)\r
+{\r
+       return E_SUCCESS;\r
+}\r
+\r
+result\r
+_Control::OnBoundsChanging(const FloatRectangle& bounds)\r
+{\r
+       return E_SUCCESS;\r
+}\r
+\r
+void\r
+_Control::OnBoundsChanged(void)\r
+{\r
+\r
+}\r
+\r
+void\r
+_Control::OnEvaluateSize(Dimension& evaluatedSize)\r
+{\r
+\r
+}\r
+\r
+bool\r
+_Control::OnEvaluateSize(FloatDimension& evaluatedSize)\r
+{\r
+       return false;\r
+}\r
+\r
+void\r
+_Control::OnParentBoundsChanged(const _Control& parent)\r
+{\r
+}\r
+\r
+void\r
+_Control::OnChildAttached(const _Control& child)\r
+{\r
+}\r
+\r
+void\r
+_Control::OnChildDetaching(const _Control& child)\r
+{\r
+}\r
+\r
+void\r
+_Control::OnChildDetached(const _Control& child)\r
+{\r
+}\r
+\r
+void\r
+_Control::OnChildBoundsChanged(const _Control& child)\r
+{\r
+}\r
+\r
+void\r
+_Control::OnChildVisibleStateChanged(const _Control& child)\r
+{\r
+}\r
+\r
+void\r
+_Control::OnChangeLayout(_ControlOrientation orientation)\r
+{\r
+}\r
+\r
+void\r
+_Control::OnZOrderChanging(_ControlZOrderUpdate zOrderUpdate)\r
+{\r
+}\r
+\r
+void\r
+_Control::OnVisibleStateChanging(void)\r
+{\r
+}\r
+\r
+void\r
+_Control::OnVisibleStateChanged(void)\r
+{\r
+}\r
+\r
+void\r
+_Control::OnAncestorVisibleStateChanged(const _Control& control)\r
+{\r
+}\r
+\r
+void\r
+_Control::OnAncestorEnableStateChanged(const _Control& control)\r
+{\r
+}\r
+\r
+void\r
+_Control::OnTouchPressHandled(const _Control& control)\r
+{\r
+}\r
+\r
+void\r
+_Control::OnTouchReleaseHandled(const _Control& control)\r
+{\r
+}\r
+\r
+void\r
+_Control::OnTouchMoveHandled(const _Control& control)\r
+{\r
+}\r
+\r
+void\r
+_Control::OnFontChanged(Tizen::Graphics::Font* pFont)\r
+{\r
+}\r
+\r
+void\r
+_Control::OnFontInfoRequested(unsigned long& style, int& size)\r
+{\r
+}\r
+\r
+void\r
+_Control::OnFontInfoRequested(unsigned long& style, float& size)\r
+{\r
+}\r
+\r
+void\r
+_Control::OnBackgroundColorChanged(Color& backgroundColor)\r
+{\r
+}\r
+\r
+void\r
+_Control::OnTouchCancelHandled(const _Control& control)\r
+{\r
+}\r
+\r
+void\r
+_Control::Accept(Visitor& visitor)\r
+{\r
+       ClearLastResult();\r
+\r
+       VisitType visitType = visitor.Visit(*this);\r
+\r
+       switch (visitType)\r
+       {\r
+       case VISIT_STOP:\r
+               break;\r
+\r
+       case VISIT_DOWNWARD:\r
+               for (int i = 0; i < GetChildCount(); ++i) // [Postpone] Keep handle list before iternation.\r
+               {\r
+                       _Control* pChild = GetChild(i);\r
+                       if (pChild)\r
+                       {\r
+                               pChild->Accept(visitor);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case VISIT_UPWARD:\r
+               {\r
+                       _Control* pParent = GetParent();\r
+                       if (pParent)\r
+                       {\r
+                               pParent->Accept(visitor);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       default:\r
+               break;\r
+       }\r
+}\r
+\r
+void\r
+_Control::Accept(Visitor& visitor) const\r
+{\r
+       const_cast <_Control*>(this)->Accept(visitor);\r
+}\r
+\r
+void\r
+_Control::Draw(bool recursive)\r
+{\r
+       ClearLastResult();\r
+\r
+       Invalidate(recursive);\r
+       GetVisualElement()->Draw();\r
+}\r
+\r
+void\r
+_Control::Show(void)\r
+{\r
+       GetVisualElement()->Flush();\r
+       ClearLastResult();\r
+\r
+       SysAssert(GetLastResult() == E_SUCCESS);\r
+}\r
+\r
+void\r
+_Control::ChangeLayout(_ControlOrientation orientation)\r
+{\r
+       ClearLastResult();\r
+\r
+       struct _Visitor\r
+               : public Visitor\r
+       {\r
+               _Visitor(_ControlOrientation orientation)\r
+                       : __orientation(orientation){}\r
+\r
+               virtual VisitType Visit(_Control& control)\r
+               {\r
+                       if (control.__orientation != __orientation)\r
+                       {\r
+                               control.__orientation = __orientation;\r
+                               control.GetControlDelegate().OnChangeLayout(__orientation);\r
+                               ClearLastResult();\r
+                       }\r
+\r
+                       return VISIT_DOWNWARD;\r
+               }\r
+\r
+private:\r
+               _ControlOrientation __orientation;\r
+       };\r
+\r
+       _Visitor visitor(orientation);\r
+       Accept(visitor);\r
+\r
+       SysAssert(GetLastResult() == E_SUCCESS);\r
+}\r
+\r
+bool\r
+_Control::IsLayoutChangable(void) const\r
+{\r
+       return true;\r
+}\r
+\r
+bool\r
+_Control::IsOrientationRoot(void) const\r
+{\r
+       return false;\r
+}\r
+\r
+void\r
+_Control::Invalidate(void)\r
+{\r
+       ClearLastResult();\r
+       GetVisualElement()->InvalidateRectangle(null);\r
+}\r
+\r
+void\r
+_Control::Invalidate(bool recursive)\r
+{\r
+       ClearLastResult();\r
+\r
+       struct _Visitor\r
+               : public Visitor\r
+       {\r
+               virtual VisitType Visit(_Control& control)\r
+               {\r
+                       if (control.GetVisibleState() == false)\r
+                       {\r
+                               return VISIT_STOP;\r
+                       }\r
+\r
+                       control.Invalidate();\r
+\r
+                       // Ownee\r
+                       int owneeCount = control.GetOwneeCount();\r
+                       for (int i = 0; i < owneeCount; ++i)\r
+                       {\r
+                               _Window* pOwnee = control.GetOwnee(i);\r
+                               if (pOwnee)\r
+                               {\r
+                                       pOwnee->Invalidate(true);\r
+                               }\r
+                       }\r
+\r
+                       return VISIT_DOWNWARD;\r
+               }\r
+       };\r
+\r
+       // Update layout\r
+       _Layout::Layout* pLayout = GetLayout();\r
+       if (pLayout)\r
+       {\r
+               pLayout->UpdateLayout();\r
+       }\r
+\r
+       if (recursive == false)\r
+       {\r
+               Invalidate();\r
+       }\r
+       else\r
+       {\r
+               _Visitor visitor;\r
+               Accept(visitor);\r
+       }\r
+}\r
+\r
+void\r
+_Control::Invalidate(const Rectangle& rect)\r
+{\r
+       ClearLastResult();\r
+       FloatRectangle rectf(rect.x, rect.y, rect.width, rect.height);\r
+       GetVisualElement()->InvalidateRectangle(&rectf);\r
+\r
+       __invalidatedBounds = _CoordinateSystemUtils::ConvertToFloat(rect);\r
+}\r
+\r
+void\r
+_Control::Invalidate(const FloatRectangle& rect)\r
+{\r
+       ClearLastResult();\r
+       FloatRectangle rectf(rect.x, rect.y, rect.width, rect.height);\r
+       GetVisualElement()->InvalidateRectangle(&rectf);\r
+\r
+       __invalidatedBounds = rect;\r
+}\r
+\r
+bool\r
+_Control::Contains(const Point& point) const\r
+{\r
+       ClearLastResult();\r
+\r
+       Rectangle bounds = GetBounds();\r
+       bounds.x = bounds.y = 0;\r
+       return bounds.Contains(point);\r
+}\r
+\r
+bool\r
+_Control::Contains(const FloatPoint& point) const\r
+{\r
+       ClearLastResult();\r
+\r
+       FloatRectangle bounds = GetBoundsF();\r
+       bounds.x = bounds.y = 0;\r
+       return bounds.Contains(point);\r
+}\r
+\r
+\r
+void\r
+_Control::PartialUpdateLayout(void)\r
+{\r
+       ClearLastResult();\r
+\r
+       _Layout::Layout* pLayout = GetLayout();\r
+       if (pLayout)\r
+       {\r
+               pLayout->PartialUpdateLayout();\r
+       }\r
+}\r
+\r
+void\r
+_Control::UpdateLayout(void)\r
+{\r
+       ClearLastResult();\r
+\r
+       _Layout::Layout* pLayout = GetLayout();\r
+       if (pLayout)\r
+       {\r
+               pLayout->UpdateLayout();\r
+       }\r
+}\r
+\r
+result\r
+_Control::SetChildAlwaysOnTop(_Control& child)\r
+{\r
+       ClearLastResult();\r
+\r
+       SysTryReturn(NID_UI,\r
+                               child.GetParent() == this, E_INVALID_ARG,\r
+                               E_INVALID_ARG, "[E_INVALID_ARG] Not my child.");\r
+\r
+       SysTryReturn(NID_UI,\r
+                               child.GetArea() == _CONTROL_AREA_CLIENT, E_SYSTEM,\r
+                               E_SYSTEM, "[E_SYSTEM] The child is not in the client area.");\r
+\r
+       if (child.GetLayer() == _CONTROL_LAYER_CLIENT_TOP)\r
+       {\r
+               return E_SUCCESS;\r
+       }\r
+\r
+       child.SetLayer(_CONTROL_LAYER_CLIENT_TOP);\r
+\r
+       SysAssert(GetLastResult() == E_SUCCESS);\r
+       return E_SUCCESS;\r
+}\r
+\r
+result\r
+_Control::SetChildAlwaysAtBottom(_Control& child)\r
+{\r
+       ClearLastResult();\r
+\r
+       SysTryReturn(NID_UI,\r
+                               child.GetParent() == this, E_INVALID_ARG,\r
+                               E_INVALID_ARG, "[E_INVALID_ARG] Not my child.");\r
+\r
+       SysTryReturn(NID_UI,\r
+                               child.GetArea() == _CONTROL_AREA_CLIENT, E_SYSTEM,\r
+                               E_SYSTEM, "[E_SYSTEM] The child is not in the client area.");\r
+\r
+       if (child.GetLayer() == _CONTROL_LAYER_CLIENT_BOTTOM)\r
+       {\r
+               return E_SUCCESS;\r
+       }\r
+\r
+       child.SetLayer(_CONTROL_LAYER_CLIENT_BOTTOM);\r
+\r
+       SysAssert(GetLastResult() == E_SUCCESS);\r
+       return E_SUCCESS;\r
+}\r
+\r
+result\r
+_Control::ResetChildLayer(_Control& child)\r
+{\r
+       ClearLastResult();\r
+\r
+       SysTryReturn(NID_UI,\r
+                               child.GetParent() == this, E_INVALID_ARG,\r
+                               E_INVALID_ARG, "[E_INVALID_ARG] Not my child.");\r
+\r
+       SysTryReturn(NID_UI,\r
+                               child.GetArea() == _CONTROL_AREA_CLIENT, E_SYSTEM,\r
+                               E_SYSTEM, "[E_SYSTEM] The child is not in the client area.");\r
+\r
+       if (child.GetLayer() == _CONTROL_LAYER_CLIENT_MIDDLE)\r
+       {\r
+               return E_SUCCESS;\r
+       }\r
+\r
+       child.SetLayer(_CONTROL_LAYER_CLIENT_MIDDLE);\r
+\r
+       SysAssert(GetLastResult() == E_SUCCESS);\r
+       return E_SUCCESS;\r
+}\r
+\r
+\r
+result\r
+_Control::AttachSystemChild(_Control& child)\r
+{\r
+       ClearLastResult();\r
+       result r = E_SUCCESS;\r
+\r
+       r = StartAttaching(child, _CONTROL_AREA_SYSTEM);\r
+       if (IsFailed(r))\r
+       {\r
+               return r;\r
+       }\r
+\r
+       ControlList& children = GetChildList();\r
+       r = children.Add(&child);\r
+       SysAssert(r == E_SUCCESS); // [ToDo] Exception check and rollback.\r
+\r
+       r = GetVisualElement()->AttachChild(*child.GetVisualElement());\r
+       SysAssert(r == E_SUCCESS); // [ToDo] Exception check and rollback.\r
+\r
+       r = EndAttaching(child);\r
+       if (IsFailed(r))\r
+       {\r
+               return r;\r
+       }\r
+\r
+       SysAssert(GetLastResult() == E_SUCCESS);\r
+\r
+       return E_SUCCESS;\r
+}\r
+\r
+result\r
+_Control::DetachSystemChild(_Control& child)\r
+{\r
+       return DetachChild(child);\r
+}\r
+\r
+bool\r
+_Control::HasParent(void) const\r
+{\r
+       return __pParent != null;\r
+}\r
+\r
+_ControlArea\r
+_Control::GetArea(void) const\r
+{\r
+       ClearLastResult();\r
+       return __area;\r
+}\r
+\r
+_ControlLayer\r
+_Control::GetLayer(void) const\r
+{\r
+       ClearLastResult();\r
+       return __layer;\r
+}\r
+\r
+void\r
+_Control::SetLayer(_ControlLayer layer)\r
+{\r
+       ClearLastResult();\r
+       _VisualElementImpl* pImpl = _VisualElementImpl::GetInstance(*GetVisualElement());\r
+\r
+       result r = pImpl->SetZOrderGroup(::GetZOrderGroupOfVisualElement(layer));\r
+       __layer = layer;\r
+\r
+       ClearLastResult(); \r
+}\r
+\r
+const _Control::ControlList&\r
+_Control::GetChildList() const\r
+{\r
+       return const_cast <_Control*>(this)->GetChildList();\r
+}\r
+\r
+_Control::ControlList&\r
+_Control::GetChildList()\r
+{\r
+       return *__pChildren;\r
+}\r
+\r
+bool\r
+_Control::IsCalledCallAttachingToMainTree(void)\r
+{\r
+       return __isCalledCallOnAttachingToMainTree;\r
+}\r
+\r
+void\r
+_Control::SetCalledCallAttachingToMainTree(bool isAttaching)\r
+{\r
+       __isCalledCallOnAttachingToMainTree = isAttaching;\r
+}\r
+\r
+bool\r
+_Control::IsCalledCallAttachedToMainTree(void)\r
+{\r
+       return __isCalledCallOnAttachedToMainTree;\r
+}\r
+\r
+void\r
+_Control::SetCalledCallAttachedToMainTree(bool isAttached)\r
+{\r
+       __isCalledCallOnAttachedToMainTree = isAttached;\r
+}\r
+\r
+result\r
+_Control::CallOnAttachingToMainTree(_Control& control)\r
+{\r
+       result r = E_SUCCESS;\r
+\r
+       ControlList& children = control.GetChildList();\r
+       _Control* pChild = null;\r
+\r
+       int childrenCount = children.GetCount();\r
+\r
+       for (int index = 0; index < childrenCount; index++)\r
+       {\r
+               r = children.GetAt(index, pChild);\r
+               if (IsFailed(r))\r
+               {\r
+                       SysAssert(r == E_OUT_OF_RANGE);\r
+                       SysTryReturn(NID_UI,\r
+                               (r != E_OUT_OF_RANGE), E_OUT_OF_RANGE,\r
+                               E_OUT_OF_RANGE, "[E_OUT_OF_RANGE] The specified index is out of range.");\r
+               }\r
+               if (!pChild->IsCalledCallAttachingToMainTree())\r
+               {\r
+                       r = CallOnAttachingToMainTree(*pChild);\r
+                       pChild->SetCalledCallAttachingToMainTree(true);\r
+                       SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
+               }\r
+       }\r
+\r
+       if (!control.IsCalledCallAttachingToMainTree())\r
+       {\r
+               r = control.GetControlDelegate().OnAttachingToMainTree(this);\r
+               control.SetCalledCallAttachingToMainTree(true);\r
+               SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
+       }\r
+\r
+       return r;\r
+}\r
+\r
+result\r
+_Control::CallOnAttachedToMainTree(_Control& control)\r
+{\r
+       result r = E_SUCCESS;\r
+\r
+       ControlList& children = control.GetChildList();\r
+       _Control* pChild = null;\r
+\r
+       int childrenCount = children.GetCount();\r
+\r
+       for (int index = 0; index < childrenCount; index++)\r
+       {\r
+               r = children.GetAt(index, pChild);\r
+               if (IsFailed(r))\r
+               {\r
+                       SysAssert(r == E_OUT_OF_RANGE);\r
+                       SysTryReturn(NID_UI,\r
+                               (r != E_OUT_OF_RANGE), E_OUT_OF_RANGE,\r
+                               E_OUT_OF_RANGE, "[E_OUT_OF_RANGE] The specified index is out of range.");\r
+               }\r
+\r
+               if (!pChild->IsCalledCallAttachedToMainTree())\r
+               {\r
+                       r = CallOnAttachedToMainTree(*pChild);\r
+                       pChild->SetCalledCallAttachedToMainTree(true);\r
+               }\r
+       }\r
+\r
+       if (!control.IsCalledCallAttachedToMainTree())\r
+       {\r
+               r = control.GetControlDelegate().OnAttachedToMainTree();\r
+               control.SetCalledCallAttachedToMainTree(true);\r
+       }\r
+\r
+       return r;\r
+}\r
+result\r
+_Control::CallOnDetachingFromMainTree(_Control& control)\r
+{\r
+       result r = E_SUCCESS;\r
+\r
+       ControlList& children = control.GetChildList();\r
+       _Control* pChild = null;\r
+\r
+       if (!__isPostOrderTraversal)\r
+       {\r
+               r = control.GetControlDelegate().OnDetachingFromMainTree();\r
+               SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
+       }\r
+\r
+       int childrenCount = children.GetCount();\r
+\r
+       for (int index = 0; index < childrenCount; index++)\r
+       {\r
+               r = children.GetAt(index, pChild);\r
+               if (IsFailed(r))\r
+               {\r
+                       SysAssert(r == E_OUT_OF_RANGE);\r
+                       SysTryReturn(NID_UI,\r
+                               (r != E_OUT_OF_RANGE), E_OUT_OF_RANGE,\r
+                               E_OUT_OF_RANGE, "[E_OUT_OF_RANGE] The specified index is out of range.");\r
+               }\r
+               r = CallOnDetachingFromMainTree(*pChild);\r
+               SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
+       }\r
+\r
+       if (__isPostOrderTraversal)\r
+       {\r
+               r = control.GetControlDelegate().OnDetachingFromMainTree();\r
+               SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
+       }\r
+\r
+       return r;\r
+}\r
+\r
+void\r
+_Control::CallOnAncestorVisibleStateChanged(void)\r
+{\r
+       struct _Visitor\r
+               : public Visitor\r
+       {\r
+               _Visitor(_Control& parent)\r
+                       : __parent(parent){}\r
+\r
+               virtual VisitType Visit(_Control& control)\r
+               {\r
+                       control.GetControlDelegate().OnAncestorVisibleStateChanged(__parent);\r
+                       return VISIT_DOWNWARD;\r
+               }\r
+\r
+               _Control& __parent;\r
+       };\r
+\r
+       _Visitor visitor(*this);\r
+       Accept(visitor);\r
+}\r
+\r
+void\r
+_Control::CallOnAncestorEnableStateChanged(void)\r
+{\r
+       struct _Visitor\r
+               : public Visitor\r
+       {\r
+               _Visitor(_Control& parent)\r
+                       : __parent(parent){}\r
+\r
+               virtual VisitType Visit(_Control& control)\r
+               {\r
+                       control.GetControlDelegate().OnAncestorEnableStateChanged(__parent);\r
+                       return VISIT_DOWNWARD;\r
+               }\r
+\r
+               _Control& __parent;\r
+       };\r
+\r
+       _Visitor visitor(*this);\r
+       Accept(visitor);\r
+}\r
+\r
+// E_INVALID_ARG\r
+// E_SYSTEM\r
+// [ToDo] Rollback is difficult.\r
+result\r
+_Control::StartAttaching(_Control& child, _ControlArea area)\r
+{\r
+       result r = E_SUCCESS;\r
+\r
+       _Control* pOldParent = child.GetParent();\r
+\r
+       SysTryReturn(NID_UI,\r
+                               (pOldParent != this), E_INVALID_ARG,\r
+                               E_INVALID_ARG, "[E_INVALID_ARG] The child control is already attached to this container.");\r
+\r
+       SysTryReturn(NID_UI,\r
+                               pOldParent == null, E_INVALID_ARG,\r
+                               E_INVALID_ARG, "[E_INVALID_ARG] Unable to add the child which already has another parent.");\r
+\r
+       r = child.GetControlDelegate().OnAttaching(this);\r
+       SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
+\r
+       if (IsAttachedToMainTree())\r
+       {\r
+               r = CallOnAttachingToMainTree(child);\r
+               SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
+       }\r
+\r
+       // [ToDo] Add control to layout\r
+       // What should we do about non-layoutable controls?\r
+       if (area == _CONTROL_AREA_CLIENT)\r
+       {\r
+               _ControlManager* pMgr = _ControlManager::GetInstance();\r
+               r = GetLastResult();\r
+               SysTryReturn(NID_UI, pMgr, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
+\r
+               r = __pLayoutContainer->AddItem(child.GetLayoutContainer());\r
+               if (IsFailed(r))\r
+               {\r
+                       child.GetControlDelegate().OnAttachingFailed(*this);\r
+                       SysLogException(NID_UI, E_SYSTEM, "[E_SYSTEM] Failed to apply layout.");\r
+                       return E_SYSTEM;\r
+               }\r
+       }\r
+\r
+       if (IsAttachedToMainTree())\r
+       {\r
+               if (!(IsOrientationRoot() && child.IsOrientationRoot()))\r
+               {\r
+                       child.ChangeLayout(_ControlManager::GetInstance()->GetOrientation());\r
+               }\r
+       }\r
+\r
+       child.__area = area;\r
+\r
+       if (area == _CONTROL_AREA_CLIENT)\r
+       {\r
+               if (child.GetLayer() != _CONTROL_LAYER_CLIENT_TOP && child.GetLayer() != _CONTROL_LAYER_CLIENT_BOTTOM)\r
+               {\r
+                       child.SetLayer(_CONTROL_LAYER_CLIENT_MIDDLE);\r
+               }\r
+       }\r
+       else\r
+       {\r
+               child.SetLayer(_CONTROL_LAYER_SYSTEM);\r
+       }\r
+\r
+       SysAssert(GetLastResult() == E_SUCCESS);\r
+       return E_SUCCESS;\r
+}\r
+\r
+result\r
+_Control::EndAttaching(_Control& child)\r
+{\r
+       child.SetParent(this);\r
+\r
+       FloatRectangle floatBounds(child.GetBoundsF().x, child.GetBoundsF().y, child.GetBoundsF().width, child.GetBoundsF().height);\r
+\r
+       result r = E_SUCCESS;\r
+       if (child.IsLayoutChangable() == false)\r
+       {\r
+               r = child.UpdateBoundsOfVisualElement(FloatRectangle(0.0f, 0.0f, floatBounds.width, floatBounds.height));\r
+       }\r
+       else\r
+       {\r
+               r = child.UpdateBoundsOfVisualElement(floatBounds);\r
+       }\r
+       SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
+\r
+       r = child.GetControlDelegate().OnAttached();\r
+       SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
+\r
+       if (IsAttachedToMainTree())\r
+       {\r
+               r = CallOnAttachedToMainTree(child);\r
+               SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
+       }\r
+\r
+       ClearLastResult();\r
+\r
+       GetControlDelegate().OnChildAttached(child);\r
+       ClearLastResult();\r
+\r
+       return E_SUCCESS;\r
+}\r
+\r
+// E_INVALID_ARG\r
+// E_OUT_OF_MEMORY\r
+// E_SYSTEM\r
+result\r
+_Control::AttachChild(_Control& child)\r
+{\r
+       ClearLastResult();\r
+       result r = E_SUCCESS;\r
+\r
+       r = StartAttaching(child, _CONTROL_AREA_CLIENT);\r
+       if (IsFailed(r))\r
+       {\r
+               return r;\r
+       }\r
+\r
+       ControlList& children = GetChildList();\r
+       r = children.Add(&child);\r
+       SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
+\r
+       r = GetVisualElement()->AttachChild(*child.GetVisualElement());\r
+\r
+       r = EndAttaching(child);\r
+       if (IsFailed(r))\r
+       {\r
+               return r;\r
+       }\r
+\r
+       SysAssert(GetLastResult() == E_SUCCESS);\r
+       UpdateFocusList();\r
+       return E_SUCCESS;\r
+}\r
+\r
+void \r
+_Control::UpdateFocusList(void)\r
+{\r
+       _Window* pTop = GetRootWindow();\r
+       if (pTop)\r
+       {\r
+               pTop->ResetFocusList();\r
+       }               \r
+}\r
+// E_INVALID_ARG\r
+// E_OUT_OF_MEMORY\r
+// E_SYSTEM\r
+result\r
+_Control::InsertChildToBottom(_Control& child)\r
+{\r
+       ClearLastResult();\r
+       result r = E_SUCCESS;\r
+\r
+       r = StartAttaching(child, _CONTROL_AREA_CLIENT);\r
+       if (IsFailed(r))\r
+       {\r
+               return r;\r
+       }\r
+\r
+       ControlList& children = GetChildList();\r
+       r = children.InsertAt(&child, 0);\r
+       SysAssert(r == E_SUCCESS); // [ToDo] Exception check and rollback.\r
+\r
+       GetVisualElement()->InsertChild(*child.GetVisualElement(), null, false);\r
+       SysAssert(r == E_SUCCESS); // [ToDo] Exception check and rollback.\r
+\r
+       r = EndAttaching(child);\r
+       if (IsFailed(r))\r
+       {\r
+               return r;\r
+       }\r
+\r
+       SysAssert(GetLastResult() == E_SUCCESS);\r
+       return E_SUCCESS;\r
+}\r
+\r
+// E_INVALID_ARG\r
+// E_OUT_OF_MEMORY\r
+// E_SYSTEM\r
+result\r
+_Control::InsertChildAfter(const _Control& targetChild, _Control& child)\r
+{\r
+       ClearLastResult();\r
+       result r = E_SUCCESS;\r
+\r
+       SysTryReturn(NID_UI,\r
+                               targetChild.GetParent() == this, E_INVALID_ARG,\r
+                               E_INVALID_ARG, "[E_INVALID_ARG] The target is not my child.");\r
+\r
+       r = StartAttaching(child, _CONTROL_AREA_CLIENT);\r
+       if (IsFailed(r))\r
+       {\r
+               return r;\r
+       }\r
+\r
+       int targetIndex = GetChildIndex(targetChild);\r
+       SysAssert(targetIndex != -1);\r
+\r
+       ControlList& children = GetChildList();\r
+       r = children.InsertAt(&child, targetIndex + 1);\r
+       SysAssert(r == E_SUCCESS); // [ToDo] Exception check and rollback.\r
+\r
+       GetVisualElement()->InsertChild(*child.GetVisualElement(), targetChild.GetVisualElement(), true);\r
+       SysAssert(r == E_SUCCESS); // [ToDo] Exception check and rollback.\r
+\r
+       r = EndAttaching(child);\r
+       if (IsFailed(r))\r
+       {\r
+               return r;\r
+       }\r
+\r
+       SysAssert(GetLastResult() == E_SUCCESS);\r
+       return E_SUCCESS;\r
+}\r
+\r
+// E_INVALID_ARG\r
+// E_OUT_OF_MEMORY\r
+// E_SYSTEM\r
+result\r
+_Control::InsertChildBefore(const _Control& targetChild, _Control& child)\r
+{\r
+       ClearLastResult();\r
+       result r = E_SUCCESS;\r
+\r
+       SysTryReturn(NID_UI,\r
+                               targetChild.GetParent() == this, E_INVALID_ARG,\r
+                               E_INVALID_ARG, "[E_INVALID_ARG] The target is not my child.");\r
+\r
+       r = StartAttaching(child, _CONTROL_AREA_CLIENT);\r
+       if (IsFailed(r))\r
+       {\r
+               return r;\r
+       }\r
+\r
+       int targetIndex = GetChildIndex(targetChild);\r
+       SysAssert(targetIndex != -1);\r
+\r
+       ControlList& children = GetChildList();\r
+       r = children.InsertAt(&child, targetIndex);\r
+       SysAssert(r == E_SUCCESS); // [ToDo] Exception check and rollback.\r
+\r
+       GetVisualElement()->InsertChild(*child.GetVisualElement(), targetChild.GetVisualElement(), false);\r
+       SysAssert(r == E_SUCCESS); // [ToDo] Exception check and rollback.\r
+\r
+       r = EndAttaching(child);\r
+       if (IsFailed(r))\r
+       {\r
+               return r;\r
+       }\r
+\r
+       SysAssert(GetLastResult() == E_SUCCESS);\r
+       return E_SUCCESS;\r
+}\r
+\r
+// E_SYSTEM\r
+result\r
+_Control::DetachChild(_Control& child)\r
+{\r
+       ClearLastResult();\r
+       result r = E_SUCCESS;\r
+\r
+       SysTryReturn(NID_UI,\r
+                               child.GetParent() == this, E_INVALID_ARG,\r
+                               E_INVALID_ARG, "[E_INVALID_ARG] Not my child.");\r
+\r
+       if (IsAttachedToMainTree())\r
+       {\r
+               r = CallOnDetachingFromMainTree(child);\r
+               SysTryReturn(NID_UI,\r
+                                       r == E_SUCCESS, E_SYSTEM,\r
+                                       E_SYSTEM, "[E_SYSTEM] The child cannot detached from parent.");\r
+\r
+               SysTryReturn(NID_UI,\r
+                                       child.GetControlDelegate().OnDetaching() == E_SUCCESS, E_SYSTEM,\r
+                                       E_SYSTEM, "[E_SYSTEM] The child cannot detached from parent.");\r
+       }\r
+\r
+       GetControlDelegate().OnChildDetaching(child);\r
+       ClearLastResult();\r
+\r
+       r = GetVisualElement()->DetachChild(*child.GetVisualElement());\r
+       SysAssert(r == E_SUCCESS); // [ToDo] Exception check and rollback.\r
+\r
+       ControlList& children = GetChildList();\r
+       r = children.Remove(&child);\r
+       SysAssert(r == E_SUCCESS); // [ToDo] Exception check and rollback.\r
+\r
+       // Remove control to layout\r
+       if (child.__area == _CONTROL_AREA_CLIENT)\r
+       {\r
+               _ControlManager* pMgr = _ControlManager::GetInstance();\r
+               r = GetLastResult();\r
+               SysTryReturn(NID_UI, pMgr, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
+\r
+               r = __pLayoutContainer->RemoveItem(child.GetLayoutContainer());\r
+               SysAssert(r == E_SUCCESS); // [ToDo] Exception check and rollback.\r
+       }\r
+\r
+       child.SetParent(null);\r
+       child.__area = _CONTROL_AREA_NONE;\r
+       child.__layer = _CONTROL_LAYER_NONE;\r
+\r
+       GetControlDelegate().OnChildDetached(child);\r
+       ClearLastResult();\r
+\r
+       SysAssert(GetLastResult() == E_SUCCESS);\r
+\r
+       UpdateFocusList();\r
+       return E_SUCCESS;\r
+}\r
+\r
+// Always success\r
+void\r
+_Control::DetachAllChildren(bool detachSystemChild, bool recursive)\r
+{\r
+       ClearLastResult();\r
+       result r = E_SUCCESS;\r
+\r
+       int childCount = GetChildCount();\r
+       int itemIndex = 0;\r
+\r
+       if (recursive)\r
+       {\r
+               while (childCount--)\r
+               {\r
+                       _Control* pChild = GetChild(itemIndex);\r
+                       if (pChild == null)\r
+                       {\r
+                               continue;\r
+                       }\r
+\r
+                       if (!detachSystemChild && (pChild->GetArea() == _CONTROL_AREA_SYSTEM))\r
+                       {\r
+                               itemIndex++;\r
+                               continue;\r
+                       }\r
+\r
+                       int childCount = pChild->GetChildCount();\r
+                       if (childCount == 0)\r
+                       {\r
+                               r = DetachChild(*pChild);\r
+                               if (IsFailed(r))\r
+                               {\r
+                                       SysLog(NID_UI, "child is not detached from this container.");\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               r = DetachChild(*pChild);\r
+                               if (IsFailed(r))\r
+                               {\r
+                                       SysLog(NID_UI, "child is not detached from this container.");\r
+                               }\r
+                               pChild->DetachAllChildren(detachSystemChild, true);\r
+                       }\r
+               }\r
+       }\r
+       else\r
+       {\r
+               int notDetachedChildCount = 0;\r
+               while (childCount--)\r
+               {\r
+                       _Control* pChild = GetChild(itemIndex);\r
+                       if (pChild == null)\r
+                       {\r
+                               continue;\r
+                       }\r
+\r
+                       if (!detachSystemChild && (pChild->GetArea() == _CONTROL_AREA_SYSTEM))\r
+                       {\r
+                               itemIndex++;\r
+                               continue;\r
+                       }\r
+                       r = DetachChild(*pChild);\r
+\r
+                       if (IsFailed(r))\r
+                       {\r
+                               ++notDetachedChildCount;\r
+                       }\r
+               }\r
+\r
+               SysLog(NID_UI, "%d children are not detached from this container.", notDetachedChildCount);\r
+       }\r
+\r
+       ClearLastResult();\r
+}\r
+\r
+// E_INVALID_ARG\r
+result\r
+_Control::MoveChildToTop(const _Control& child)\r
+{\r
+       ClearLastResult();\r
+       result r = E_SUCCESS;\r
+\r
+       SysTryReturn(NID_UI,\r
+                               child.GetParent() == this, E_INVALID_ARG,\r
+                               E_INVALID_ARG, "[E_INVALID_ARG] Not my child.");\r
+\r
+       // If already on top,\r
+       ControlList& children = GetChildList();\r
+       if (GetChildIndex(child) == children.GetCount() - 1)\r
+       {\r
+               SysAssert(GetLastResult() == E_SUCCESS);\r
+               return E_SUCCESS;\r
+       }\r
+\r
+       _Control* pChild = const_cast <_Control*>(&child);\r
+\r
+       r = children.Remove(pChild);\r
+       SysAssert(r == E_SUCCESS);\r
+\r
+       r = children.Add(pChild);\r
+       SysAssert(r == E_SUCCESS);\r
+\r
+       r = child.GetVisualElement()->SetZOrder(null, true);\r
+       SysAssert(r == E_SUCCESS); // [ToDo] Exception check and rollback.\r
+\r
+       SysAssert(GetLastResult() == E_SUCCESS);\r
+       return E_SUCCESS;\r
+}\r
+\r
+// E_INVALID_ARG\r
+result\r
+_Control::MoveChildToBottom(const _Control& child)\r
+{\r
+       ClearLastResult();\r
+       result r = E_SUCCESS;\r
+\r
+       SysTryReturn(NID_UI,\r
+                               child.GetParent() == this, E_INVALID_ARG,\r
+                               E_INVALID_ARG, "[E_INVALID_ARG] Not my child.");\r
+\r
+       ControlList& children = GetChildList();\r
+\r
+       if (GetChildIndex(child) == 0)\r
+       {\r
+               SysAssert(GetLastResult() == E_SUCCESS);\r
+               return E_SUCCESS;\r
+       }\r
+\r
+       _Control* pChild = const_cast <_Control*>(&child);\r
+\r
+       r = children.Remove(pChild);\r
+       SysAssert(r == E_SUCCESS);\r
+\r
+       r = children.InsertAt(pChild, 0);\r
+       SysAssert(r == E_SUCCESS);\r
+\r
+       r = child.GetVisualElement()->SetZOrder(null, false);\r
+       SysAssert(r == E_SUCCESS); // [ToDo] Exception check and rollback.\r
+\r
+       SysAssert(GetLastResult() == E_SUCCESS);\r
+       return E_SUCCESS;\r
+}\r
+\r
+// E_INVALID_ARG\r
+result\r
+_Control::MoveChildAfter(const _Control& targetChild, const _Control& child)\r
+{\r
+       ClearLastResult();\r
+       result r = E_SUCCESS;\r
+\r
+       SysTryReturn(NID_UI,\r
+                               targetChild.GetParent() == this, E_INVALID_ARG,\r
+                               E_INVALID_ARG, "[E_INVALID_ARG] Target is not my child.");\r
+\r
+       SysTryReturn(NID_UI,\r
+                               child.GetParent() == this, E_INVALID_ARG,\r
+                               E_INVALID_ARG, "[E_INVALID_ARG] Not my child.");\r
+\r
+       SysTryReturn(NID_UI,\r
+                               &targetChild != &child, E_INVALID_ARG,\r
+                               E_INVALID_ARG, "[E_INVALID_ARG] Cannot move after self.");\r
+\r
+       ControlList& children = GetChildList();\r
+\r
+       int targetIndex = GetChildIndex(targetChild);\r
+       SysAssert(targetIndex != -1);\r
+\r
+       if (targetIndex + 1 == GetChildIndex(child))\r
+       {\r
+               SysAssert(GetLastResult() == E_SUCCESS);\r
+               return E_SUCCESS;\r
+       }\r
+\r
+       _Control* pChild = const_cast <_Control*>(&child);\r
+\r
+       r = children.Remove(pChild);\r
+       SysAssert(r == E_SUCCESS);\r
+\r
+       r = children.InsertAt(pChild, targetIndex + 1);\r
+       SysAssert(r == E_SUCCESS);\r
+\r
+       r = child.GetVisualElement()->SetZOrder(targetChild.GetVisualElement(), true);\r
+       SysAssert(r == E_SUCCESS); // [ToDo] Exception check and rollback.\r
+\r
+       SysAssert(GetLastResult() == E_SUCCESS);\r
+       return E_SUCCESS;\r
+}\r
+\r
+// E_INVALID_ARG\r
+result\r
+_Control::MoveChildBefore(const _Control& targetChild, const _Control& child)\r
+{\r
+       ClearLastResult();\r
+       result r = E_SUCCESS;\r
+\r
+       SysTryReturn(NID_UI,\r
+                               targetChild.GetParent() == this, E_INVALID_ARG,\r
+                               E_INVALID_ARG, "[E_INVALID_ARG] Target is not my child.");\r
+\r
+       SysTryReturn(NID_UI,\r
+                               child.GetParent() == this, E_INVALID_ARG,\r
+                               E_INVALID_ARG, "[E_INVALID_ARG] Not my child.");\r
+\r
+       SysTryReturn(NID_UI,\r
+                               &targetChild != &child, E_INVALID_ARG,\r
+                               E_INVALID_ARG, "[E_INVALID_ARG] Cannot move before self.");\r
+\r
+       ControlList& children = GetChildList();\r
+\r
+       int targetIndex = GetChildIndex(targetChild);\r
+       SysAssert(targetIndex != -1);\r
+\r
+       if (targetIndex - 1 == GetChildIndex(child))\r
+       {\r
+               SysAssert(GetLastResult() == E_SUCCESS);\r
+               return E_SUCCESS;\r
+       }\r
+\r
+       _Control* pChild = const_cast <_Control*>(&child);\r
+\r
+       r = children.Remove(pChild);\r
+       SysAssert(r == E_SUCCESS);\r
+\r
+       r = children.InsertAt(pChild, targetIndex);\r
+       SysAssert(r == E_SUCCESS);\r
+\r
+       r = child.GetVisualElement()->SetZOrder(targetChild.GetVisualElement(), false);\r
+       SysAssert(r == E_SUCCESS); // [ToDo] Exception check and rollback.\r
+\r
+       SysAssert(GetLastResult() == E_SUCCESS);\r
+       return E_SUCCESS;\r
+}\r
+\r
+// E_INVALID_ARG\r
+// E_OBJ_NOT_FOUND\r
+int\r
+_Control::GetChildIndex(const _Control& child) const\r
+{\r
+       ClearLastResult();\r
+       result r = E_SUCCESS;\r
+\r
+       SysTryReturn(NID_UI,\r
+                               child.GetParent() == this, -1,\r
+                               E_INVALID_ARG, "[E_INVALID_ARG] Not my child.");\r
+\r
+       const ControlList& children = GetChildList();\r
+\r
+       int index = -1;\r
+       r = children.IndexOf(const_cast<_Control*>(&child), index);\r
+       if (IsFailed(r))\r
+       {\r
+               SysAssert(r == E_OBJ_NOT_FOUND);\r
+               SysLogException(NID_UI, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] Unable to find the specified child.");\r
+               return -1;\r
+       }\r
+\r
+       SysAssert(GetLastResult() == E_SUCCESS);\r
+       return index;\r
+}\r
+\r
+// E_OUT_OF_RANGE\r
+_Control*\r
+_Control::GetChild(int index) const\r
+{\r
+       ClearLastResult();\r
+       result r = E_SUCCESS;\r
+\r
+       const ControlList& children = GetChildList();\r
+\r
+       _Control* pChild = null;\r
+       r = children.GetAt(index, pChild);\r
+       if (IsFailed(r))\r
+       {\r
+               SysAssert(r == E_OUT_OF_RANGE);\r
+               SysLogException(NID_UI, E_OUT_OF_RANGE, "[E_OUT_OF_RANGE] The specified index is out of range.");\r
+               return null;\r
+       }\r
+\r
+       SysAssert(GetLastResult() == E_SUCCESS);\r
+       return pChild;\r
+}\r
+\r
+int\r
+_Control::GetChildCount(void) const\r
+{\r
+       ClearLastResult();\r
+       return GetChildList().GetCount();\r
+}\r
+\r
+_ControlHandle\r
+_Control::GetHandle(void) const\r
+{\r
+       return __controlHandle;\r
+}\r
+\r
+void*\r
+_Control::GetUserData(void) const\r
+{\r
+       return __pUserData;\r
+}\r
+\r
+void\r
+_Control::SetUserData(void* pUserData)\r
+{\r
+       __pUserData = pUserData;\r
+}\r
+\r
+Variant\r
+_Control::GetPropertyName(void) const\r
+{\r
+       ClearLastResult();\r
+       return Tizen::Ui::Variant(__name);\r
+}\r
+\r
+String\r
+_Control::GetName(void) const\r
+{\r
+       Variant name = GetProperty("Name");\r
+\r
+       return name.ToString();\r
+}\r
+\r
+result\r
+_Control::SetPropertyName(const Variant& name)\r
+{\r
+       ClearLastResult();\r
+       __name = name.ToString();\r
+\r
+       return E_SUCCESS;\r
+}\r
+\r
+void\r
+_Control::SetName(const String& name)\r
+{\r
+       SetProperty("Name", Variant(name));\r
+}\r
+\r
+_Control*\r
+_Control::GetParent(void) const\r
+{\r
+       return __pParent;\r
+}\r
+\r
+Canvas*\r
+_Control::GetCanvasN(void) const\r
+{\r
+       return GetCanvasN(FloatRectangle(0.0f, 0.0f, __bounds.width, __bounds.height));\r
+}\r
+\r
+Canvas*\r
+_Control::GetCanvasN(const Rectangle& bounds) const\r
+{\r
+       ClearLastResult();\r
+       Canvas *pCanvas = GetControlDelegate().OnCanvasRequestedFN(FloatRectangle(0.0f, 0.0f, bounds.width, bounds.height));\r
+       if (pCanvas == null)\r
+       {\r
+               GetVisualElement()->SetFlushNeeded();\r
+               pCanvas = GetVisualElement()->GetCanvasN(bounds);\r
+               if (IsFailed(GetLastResult()))\r
+               {\r
+                       SysLog(NID_UI_CTRL, "[%s] Propagated", GetErrorMessage(GetLastResult()));\r
+               }\r
+\r
+               if (pCanvas && !__isCalledGetCanvasN)\r
+               {\r
+                       pCanvas->SetBackgroundColor(GetBackgroundColor());\r
+                       pCanvas->Clear();\r
+                       const_cast <_Control*>(this)->__isCalledGetCanvasN = true;\r
+               }\r
+       }\r
+       return pCanvas;\r
+}\r
+\r
+Canvas*\r
+_Control::GetCanvasN(const FloatRectangle& bounds) const\r
+{\r
+       ClearLastResult();\r
+       Canvas *pCanvas = GetControlDelegate().OnCanvasRequestedFN(FloatRectangle(bounds));\r
+       if (pCanvas == null)\r
+       {\r
+               GetVisualElement()->SetFlushNeeded();\r
+               pCanvas = GetVisualElement()->GetCanvasN(bounds);\r
+               if (IsFailed(GetLastResult()))\r
+               {\r
+                       SysLog(NID_UI_CTRL, "[%s] Propagated", GetErrorMessage(GetLastResult()));\r
+               }\r
+\r
+               if (pCanvas && !__isCalledGetCanvasN)\r
+               {\r
+                       pCanvas->SetBackgroundColor(GetBackgroundColor());\r
+                       pCanvas->Clear();\r
+                       const_cast <_Control*>(this)->__isCalledGetCanvasN = true;\r
+               }\r
+       }\r
+       return pCanvas;\r
+}\r
+\r
+bool\r
+_Control::IsCalledGetCanvasN(void) const\r
+{\r
+       return __isCalledGetCanvasN;\r
+}\r
+\r
+Canvas*\r
+_Control::GetClientCanvasN(void) const\r
+{\r
+       return GetCanvasN(GetClientBounds());\r
+}\r
+\r
+bool\r
+_Control::IsAncestorOf(const _Control& control) const\r
+{\r
+       ClearLastResult();\r
+\r
+       const _Control* pParent = control.GetParent();\r
+       if (!pParent)\r
+       {\r
+               return false;\r
+       }\r
+\r
+       struct _Visitor\r
+               : public Visitor\r
+       {\r
+private:\r
+               const _Control& __ancestor;\r
+\r
+public:\r
+               bool yes;\r
+\r
+               _Visitor(const _Control& ancestor)\r
+                       : __ancestor(ancestor)\r
+                       , yes(false){}\r
+\r
+               virtual VisitType Visit(_Control& control)\r
+               {\r
+                       if (&__ancestor == &control)\r
+                       {\r
+                               yes = true;\r
+                               return VISIT_STOP;\r
+                       }\r
+                       else\r
+                       {\r
+                               return VISIT_UPWARD;\r
+                       }\r
+               }\r
+       };\r
+\r
+       _Visitor visitor(*this);\r
+       pParent->Accept(visitor);\r
+\r
+       SysAssert(GetLastResult() == E_SUCCESS);\r
+       return visitor.yes;\r
+}\r
+\r
+_Window*\r
+_Control::GetRootWindow(void) const\r
+{\r
+       ClearLastResult();\r
+\r
+       struct _Visitor\r
+               : public Visitor\r
+       {\r
+               _Window* pRoot;\r
+\r
+               _Visitor(void)\r
+                       : pRoot(null){}\r
+\r
+               virtual VisitType Visit(_Control& control)\r
+               {\r
+                       pRoot = dynamic_cast <_Window*>(&control);\r
+                       if (pRoot != null)\r
+                       {\r
+                               return VISIT_STOP;\r
+                       }\r
+\r
+                       return VISIT_UPWARD;\r
+               }\r
+       };\r
+\r
+       _Visitor visitor;\r
+       Accept(visitor);\r
+\r
+       SysAssert(GetLastResult() == E_SUCCESS);\r
+       return visitor.pRoot;\r
+}\r
+\r
+bool\r
+_Control::IsAttachedToMainTree(void) const\r
+{\r
+       ClearLastResult();\r
+\r
+       _ControlManager* pMgr = _ControlManager::GetInstance();\r
+       if (pMgr == null)\r
+       {\r
+               return false;\r
+       }\r
+\r
+       _Window* pRootWindow = GetRootWindow();\r
+       if (pRootWindow == null)\r
+       {\r
+               return false;\r
+       }\r
+\r
+       return pRootWindow->IsAttached();\r
+}\r
+\r
+bool\r
+_Control::IsFocusable(void) const\r
+{\r
+       ClearLastResult();\r
+       return __focusable;\r
+}\r
+\r
+void\r
+_Control::SetFocusable(bool focusable)\r
+{\r
+       ClearLastResult();\r
+       __focusable = focusable;\r
+}\r
+\r
+bool\r
+_Control::IsNativeObjectFocusable(void) const\r
+{\r
+       ClearLastResult();\r
+       return __nativeObjectFocusable;\r
+}\r
+\r
+void\r
+_Control::SetNativeObjectFocusable(bool focusable)\r
+{\r
+       ClearLastResult();\r
+       __nativeObjectFocusable = focusable;\r
+}\r
+\r
+bool\r
+_Control::IsFocused(void) const\r
+{\r
+       ClearLastResult();\r
+\r
+       if (!__focusSet)\r
+       {\r
+               return false;\r
+       }\r
+\r
+       for (int i = 0; i < GetChildCount(); ++i)\r
+       {\r
+               _Control* pChild = GetChild(i);\r
+\r
+               SysAssert(pChild);\r
+               if (pChild == null)\r
+               {\r
+                       continue;\r
+               }\r
+\r
+               if (pChild->__focusSet)\r
+               {\r
+                       return false;\r
+               }\r
+       }\r
+\r
+       return true;\r
+}\r
+\r
+_Control*\r
+_Control::GetFocused(void) const\r
+{\r
+       for (int i = GetChildCount() - 1; i >= 0; --i)\r
+       {\r
+               _Control* pChild = GetChild(i);\r
+\r
+               SysAssert(pChild);\r
+               if (pChild == null)\r
+               {\r
+                       continue;\r
+               }\r
+\r
+               if (pChild->__focusSet == true)\r
+               {\r
+                       return pChild->GetFocused();\r
+               }\r
+       }\r
+\r
+       if (__focusSet == true)\r
+       {\r
+               return const_cast <_Control*>(this);\r
+       }\r
+       else\r
+       {\r
+               return null;\r
+       }\r
+\r
+}\r
+\r
+result\r
+_Control::SetFocused(bool on)\r
+{\r
+       ClearLastResult();\r
+\r
+       SysTryReturn(NID_UI,\r
+                               IsAttachedToMainTree(), E_INVALID_OPERATION,\r
+                               E_INVALID_OPERATION, "[E_INVALID_OPERATION] This control should have a parent or be attached to the main tree.");\r
+\r
+       SysTryReturn(NID_UI,\r
+                               IsFocusable(), E_INVALID_OPERATION,\r
+                               E_INVALID_OPERATION, "[E_INVALID_OPERATION] This Control isn't focusable control.");\r
+\r
+       if (on)\r
+       {\r
+               _Window* pTop = GetRootWindow();\r
+               SysAssert(pTop);\r
+               pTop->SetFocusedControl(this);\r
+               pTop->SetFocusState(false);\r
+\r
+               _ControlManager* pControlMgr = _ControlManager::GetInstance();\r
+               SysAssert(pControlMgr);\r
+\r
+               if (pTop->IsActivated() && pTop->IsFocusableDescendant(this))\r
+               {\r
+                       pControlMgr->SetFocusedControl(*this);\r
+                       SetFocusState(true);\r
+               }\r
+\r
+               if (IsFailed(GetLastResult()))\r
+               {\r
+                       SysLog(NID_UI_CTRL, "[%s] Propagated", GetErrorMessage(GetLastResult()));\r
+               }\r
+       }\r
+       else\r
+       {\r
+               _Window* pTop = GetRootWindow();\r
+               SysAssert(pTop);\r
+               pTop->SetFocusedControl(null);\r
+               _ControlManager* pControlMgr = _ControlManager::GetInstance();\r
+               SysAssert(pControlMgr);\r
+               pControlMgr->SetFocusedControl(*this, false);\r
+               SetFocusState(false);\r
+\r
+               if (IsFailed(GetLastResult()))\r
+               {\r
+                       SysLog(NID_UI_CTRL, "[%s] Propagated", GetErrorMessage(GetLastResult()));\r
+               }\r
+       }\r
+\r
+       return E_SUCCESS;\r
+}\r
+\r
+// [ToDo] Find the focused descendent and clear flags upwards.\r
+void\r
+_Control::SetFocusState(bool on)\r
+{\r
+       ClearLastResult();\r
+\r
+       if (on)\r
+       {\r
+               __focusSet = true;\r
+               _Control* pParent = GetParent();\r
+               if (pParent)\r
+               {\r
+                       pParent->SetFocusState(true);\r
+               }\r
+       }\r
+       else\r
+       {\r
+               __focusSet = false;\r
+               for (int i = 0; i < GetChildCount(); ++i)\r
+               {\r
+                       _Control* pChild = GetChild(i);\r
+\r
+                       SysAssert(pChild);\r
+                       if (pChild == null)\r
+                       {\r
+                               continue;\r
+                       }\r
+\r
+                       if (pChild->__focusSet == true)\r
+                       {\r
+                               pChild->SetFocusState(false);\r
+                               return;\r
+                       }\r
+               }\r
+       }\r
+}\r
+\r
+result\r
+_Control::SetFont(const String& fontName)\r
+{\r
+       result r = E_SUCCESS;\r
+\r
+       if (__fontName.Equals(fontName))\r
+       {\r
+               return E_SUCCESS;\r
+       }\r
+\r
+       __isControlFontChanged = true;\r
+       __fontName = fontName;\r
+       __fontFileName.Clear();\r
+\r
+       Font* pFont = GetFallbackFont();\r
+\r
+       if (pFont == null)\r
+       {\r
+               r = GetLastResult();\r
+               SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
+       }\r
+       return E_SUCCESS;\r
+}\r
+\r
+Font*\r
+_Control::GetFallbackFont(void)\r
+{\r
+       unsigned long style = 0;\r
+       int textSize = 0;\r
+       float floatTextSize = 0.0f;\r
+       result r = E_SUCCESS;\r
+       _IControlDelegate& delegate = GetControlDelegate();\r
+       delegate.OnFontInfoRequested(style, textSize);\r
+       delegate.OnFontInfoRequested(style, floatTextSize);\r
+       _ControlManager* pControlManager = _ControlManager::GetInstance();\r
+       _FontImpl* pFontImpl  = _FontImpl::GetInstance(*__pFont);\r
+       if (!(__isControlFontChanged || pControlManager->IsDefaultFontChanged())\r
+               && __pFont != null\r
+               && ((__pFont->GetSize() == textSize || __pFont->GetSizeF() == floatTextSize))\r
+               && (pFontImpl->GetStyle() == style))\r
+       {\r
+               return __pFont;\r
+       }\r
+       unique_ptr<Font>pTempFont(new(std::nothrow)Font());\r
+       SysTryReturn(NID_UI , pTempFont , null , E_OUT_OF_MEMORY, "[%s] Fails to create a __pFont.", GetErrorMessage(r));\r
+\r
+       if (!__fontName.IsEmpty())\r
+       {\r
+               __isControlFontChanged = false;\r
+               _FontImpl* pFontImpl  = _FontImpl::GetInstance(*pTempFont);\r
+               SysAssertf(pFontImpl != null, "Getting _FontImpl instance failed.");\r
+\r
+               if (floatTextSize > 0.0f)\r
+               {\r
+                       r = pFontImpl->Construct(__fontName, style, floatTextSize, false);\r
+               }\r
+               else\r
+               {\r
+                       r = pFontImpl->Construct(__fontName, style, textSize, false);\r
+               }\r
+\r
+               SysTryReturn(NID_UI, r != E_OUT_OF_MEMORY, null, E_OUT_OF_MEMORY, "%s.", GetErrorMessage(r));\r
+               SysTryReturn(NID_UI, r == E_SUCCESS, null, E_FILE_NOT_FOUND, "%s.", GetErrorMessage(r));\r
+       }\r
+       else if (!__fontFileName.IsEmpty())\r
+       {\r
+               __isControlFontChanged = false;\r
+               _FontImpl* pFontImpl  = _FontImpl::GetInstance(*pTempFont);\r
+               SysAssertf(pFontImpl != null, "Getting _FontImpl instance failed.");\r
+\r
+               if (floatTextSize > 0.0f)\r
+               {\r
+                       r = pFontImpl->Construct(__fontFileName, style, floatTextSize);\r
+               }\r
+               else\r
+               {\r
+                       r = pFontImpl->Construct(__fontFileName, style, textSize);\r
+               }\r
+               SysTryReturn(NID_UI, r != E_OUT_OF_MEMORY, null, E_OUT_OF_MEMORY, "%s.", GetErrorMessage(r));\r
+               SysTryReturn(NID_UI, r == E_SUCCESS, null, E_FILE_NOT_FOUND, "%s.", GetErrorMessage(r));\r
+\r
+       }\r
+       else if (!pControlManager->GetDefaultFont().IsEmpty())\r
+       {\r
+               _FontImpl* pFontImpl = _FontImpl::GetInstance(*pTempFont);\r
+               SysAssertf(pFontImpl != null, "Getting _FontImpl instance failed.");\r
+\r
+               if (floatTextSize > 0.0f)\r
+               {\r
+                       r = pFontImpl->Construct(pControlManager->GetDefaultFont(), style, floatTextSize, false);\r
+               }\r
+               else\r
+               {\r
+                       r = pFontImpl->Construct(pControlManager->GetDefaultFont(), style, textSize, false);\r
+               }\r
+               SysTryReturn(NID_UI, r != E_OUT_OF_MEMORY, null, E_OUT_OF_MEMORY, "%s.", GetErrorMessage(r));\r
+               SysTryReturn(NID_UI, r == E_SUCCESS, null, E_FILE_NOT_FOUND, "%s.", GetErrorMessage(r));\r
+       }\r
+       else if (!pControlManager->GetDefaultFontFile().IsEmpty())\r
+       {\r
+               _FontImpl* pFontImpl = _FontImpl::GetInstance(*pTempFont);\r
+               SysAssertf(pFontImpl != null, "Getting _FontImpl instance failed.");\r
+\r
+               if (floatTextSize > 0.0f)\r
+               {\r
+                       r = pFontImpl->Construct(pControlManager->GetDefaultFontFile(), style, floatTextSize);\r
+               }\r
+               else\r
+               {\r
+                       r = pFontImpl->Construct(pControlManager->GetDefaultFontFile(), style, textSize);\r
+               }\r
+               SysTryReturn(NID_UI, r != E_OUT_OF_MEMORY, null, E_OUT_OF_MEMORY, "%s.", GetErrorMessage(r));\r
+               SysTryReturn(NID_UI, r == E_SUCCESS, null, E_FILE_NOT_FOUND, "%s.", GetErrorMessage(r));\r
+       }\r
+       else\r
+       {\r
+               if (floatTextSize > 0.0f)\r
+               {\r
+                       r = pTempFont->Construct(style, floatTextSize);\r
+               }\r
+               else\r
+               {\r
+                       r = pTempFont->Construct(style, textSize);\r
+               }\r
+               SysTryReturn(NID_UI, r != E_OUT_OF_MEMORY, null, E_OUT_OF_MEMORY, "%s.", GetErrorMessage(r));\r
+               SysTryReturn(NID_UI, r == E_SUCCESS, null, E_FILE_NOT_FOUND, "%s.", GetErrorMessage(r));\r
+       }\r
+\r
+       if (__pFont)\r
+       {\r
+               delete __pFont;\r
+               __pFont = null;\r
+       }\r
+       __pFont = pTempFont.release();\r
+       delegate.OnFontChanged(__pFont);\r
+       return  __pFont;\r
+}\r
+\r
+String\r
+_Control::GetFont(void) const\r
+{\r
+       return __fontName;\r
+}\r
+\r
+bool\r
+_Control::IsEnabled(void) const\r
+{\r
+       ClearLastResult();\r
+\r
+       struct _Visitor\r
+               : public Visitor\r
+       {\r
+               bool enabled;\r
+\r
+               _Visitor(void)\r
+                       : enabled(true){}\r
+\r
+               virtual VisitType Visit(_Control& control)\r
+               {\r
+                       if (!control.GetEnableState())\r
+                       {\r
+                               enabled = false;\r
+                               return VISIT_STOP;\r
+                       }\r
+\r
+                       return VISIT_UPWARD;\r
+               }\r
+       };\r
+\r
+       _Visitor visitor;\r
+       Accept(visitor);\r
+       return visitor.enabled;\r
+}\r
+\r
+bool\r
+_Control::GetEnableState(void) const\r
+{\r
+       ClearLastResult();\r
+       return __enabledState;\r
+}\r
+\r
+void\r
+_Control::SetEnableState(bool enabledState)\r
+{\r
+       ClearLastResult();\r
+       const bool changed = (__enabledState != enabledState);\r
+       if (changed)\r
+       {\r
+               if (!enabledState && GetFocused() == this)\r
+               {\r
+                       SetFocused(false);\r
+               }\r
+               __enabledState = enabledState;\r
+               CallOnAncestorEnableStateChanged();\r
+       }\r
+       __pAccessibilityContainer->SetEnableState(enabledState);\r
+}\r
+\r
+bool\r
+_Control::IsInputEventEnabled(void) const\r
+{\r
+       ClearLastResult();\r
+\r
+       struct _Visitor\r
+               : public Visitor\r
+       {\r
+               bool inputEnabled;\r
+\r
+               _Visitor(void)\r
+                       : inputEnabled(true){}\r
+\r
+               virtual VisitType Visit(_Control& control)\r
+               {\r
+                       if (!control.GetInputEnableState())\r
+                       {\r
+                               inputEnabled = false;\r
+                               return VISIT_STOP;\r
+                       }\r
+\r
+                       return VISIT_UPWARD;\r
+               }\r
+       };\r
+\r
+       _Visitor visitor;\r
+       Accept(visitor);\r
+       return visitor.inputEnabled;\r
+}\r
+\r
+bool\r
+_Control::GetInputEnableState(void) const\r
+{\r
+       ClearLastResult();\r
+\r
+       if (__inputLockRefCount != 0)\r
+       {\r
+               return false;\r
+       }\r
+       else\r
+       {\r
+               return true;\r
+       }\r
+}\r
+\r
+void\r
+_Control::LockInputEvent(void)\r
+{\r
+       __inputLockRefCount++;\r
+}\r
+\r
+void\r
+_Control::UnlockInputEvent(void)\r
+{\r
+       __inputLockRefCount--;\r
+       if (__inputLockRefCount < 0)\r
+       {\r
+               __inputLockRefCount = 0;\r
+       }\r
+}\r
+\r
+bool\r
+_Control::IsVisible(void) const\r
+{\r
+       ClearLastResult();\r
+\r
+       SysTryReturn(NID_UI, IsAttachedToMainTree(), false, E_SYSTEM, "[E_SYSTEM] This control should be attached to the main tree.");\r
+\r
+       struct _Visitor\r
+               : public Visitor\r
+       {\r
+               bool visible;\r
+\r
+               _Visitor(void)\r
+                       : visible(true){}\r
+\r
+               virtual VisitType Visit(_Control& control)\r
+               {\r
+                       if (!control.GetVisibleState())\r
+                       {\r
+                               visible = false;\r
+                               return VISIT_STOP;\r
+                       }\r
+\r
+                       return VISIT_UPWARD;\r
+               }\r
+       };\r
+\r
+       _Visitor visitor;\r
+       Accept(visitor);\r
+\r
+       SysAssert(GetLastResult() == E_SUCCESS);\r
+       return visitor.visible;\r
+}\r
+\r
+bool\r
+_Control::GetVisibleState(void) const\r
+{\r
+       ClearLastResult();\r
+       return __visibleState;\r
+}\r
+\r
+void\r
+_Control::SetVisibleState(bool visibleState)\r
+{\r
+       ClearLastResult();\r
+\r
+       const bool changed = (__visibleState != visibleState) || !__initVisibleState;\r
+\r
+       if (changed)\r
+       {\r
+               GetControlDelegate().OnVisibleStateChanging();\r
+       }\r
+\r
+       __visibleState = visibleState;\r
+       GetVisualElement()->SetShowState(visibleState);\r
+\r
+       if (visibleState == false)\r
+       {\r
+               int owneeCount = GetOwneeCount();\r
+               for (int i = 0; i < owneeCount; ++i)\r
+               {\r
+                       _Window* pWindow = GetOwnee(i);\r
+                       if (pWindow)\r
+                       {\r
+                               pWindow->SetVisibleState(visibleState);\r
+                       }\r
+               }\r
+       }\r
+\r
+       if (changed)\r
+       {\r
+               GetControlDelegate().OnVisibleStateChanged();\r
+               CallOnAncestorVisibleStateChanged();\r
+\r
+               _Control* pParent = GetParent();\r
+               if (pParent)\r
+               {\r
+                       pParent->GetControlDelegate().OnChildVisibleStateChanged(*this);\r
+               }\r
+\r
+               ClearLastResult();\r
+       }\r
+\r
+       __initVisibleState = true;\r
+}\r
+\r
+bool\r
+_Control::IsLayoutable(void) const\r
+{\r
+       ClearLastResult();\r
+       return IsMovable();\r
+}\r
+\r
+bool\r
+_Control::IsClipToParent(void) const\r
+{\r
+       ClearLastResult();\r
+//     SysAssert(GetVisualElement()->IsClipToParent() == __clipToParent);\r
+       return __clipToParent;\r
+}\r
+\r
+result\r
+_Control::SetClipToParent(bool clipToParent)\r
+{\r
+       ClearLastResult();\r
+       result r = E_SUCCESS;\r
+\r
+       __clipToParent = clipToParent;\r
+       r =  GetVisualElement()->SetClipToParent(clipToParent);\r
+       SysTryReturn(NID_UI, r == E_SUCCESS, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] System error occurred.");\r
+\r
+       return E_SUCCESS;\r
+}\r
+\r
+result\r
+_Control::SetClipChildrenEnabled(bool clipChildren)\r
+{\r
+       ClearLastResult();\r
+       //result r = E_SUCCESS;\r
+\r
+       GetVisualElement()->SetClipChildrenEnabled(clipChildren);\r
+       //SysTryReturn(NID_UI, r == E_SUCCESS, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] System error occurred.");\r
+\r
+       return E_SUCCESS;\r
+}\r
+\r
+Rectangle\r
+_Control::GetBounds(void) const\r
+{\r
+       ClearLastResult();\r
+       return _CoordinateSystemUtils::ConvertToInteger(__bounds);\r
+}\r
+\r
+FloatRectangle\r
+_Control::GetBoundsF(void) const\r
+{\r
+       ClearLastResult();\r
+       return __bounds;\r
+}\r
+\r
+Point\r
+_Control::GetPosition(void) const\r
+{\r
+       ClearLastResult();\r
+       return Point(_CoordinateSystemUtils::ConvertToInteger(__bounds.x), _CoordinateSystemUtils::ConvertToInteger(__bounds.y));\r
+}\r
+\r
+FloatPoint\r
+_Control::GetPositionF(void) const\r
+{\r
+       ClearLastResult();\r
+       return FloatPoint(__bounds.x, __bounds.y);\r
+}\r
+\r
+Dimension\r
+_Control::GetSize(void) const\r
+{\r
+       ClearLastResult();\r
+       return Dimension(_CoordinateSystemUtils::ConvertToInteger(__bounds.width), _CoordinateSystemUtils::ConvertToInteger(__bounds.height));\r
+}\r
+\r
+FloatDimension\r
+_Control::GetSizeF(void) const\r
+{\r
+       ClearLastResult();\r
+       return FloatDimension(__bounds.width, __bounds.height);\r
+}\r
+\r
+// E_SYSTEM\r
+result\r
+_Control::UpdateBoundsOfVisualElement(const FloatRectangle& controlBounds)\r
+{\r
+       FloatRectangle rect(controlBounds.x, controlBounds.y, controlBounds.width, controlBounds.height);\r
+\r
+       _Control* pParent = GetParent();\r
+       if (__area == _CONTROL_AREA_CLIENT && pParent)\r
+       {\r
+               const FloatRectangle clientBounds = pParent->GetClientBoundsF();\r
+               rect.x += clientBounds.x;\r
+               rect.y += clientBounds.y;\r
+       }\r
+\r
+       GetVisualElement()->SetBounds(rect);\r
+\r
+       return E_SUCCESS;\r
+}\r
+\r
+result\r
+_Control::AdjustAbsoluteBounds(void)\r
+{\r
+       struct _Visitor\r
+               : public Visitor\r
+       {\r
+               _Visitor(_Control* pControl)\r
+                       : __pControl(pControl){}\r
+\r
+               virtual VisitType Visit(_Control& control)\r
+               {\r
+                       result r = E_SUCCESS;\r
+\r
+                       if (__pControl == &control)\r
+                       {\r
+                               return VISIT_DOWNWARD;\r
+                       }\r
+                       FloatRectangle fbounds = control.GetBoundsF();\r
+                       if (control.IsLayoutChangable() == false)\r
+                       {\r
+                               r = control.UpdateBoundsOfVisualElement(FloatRectangle(0.0f, 0.0f, fbounds.width, fbounds.height));\r
+                       }\r
+                       else\r
+                       {\r
+                               r = control.UpdateBoundsOfVisualElement(fbounds);\r
+                       }\r
+\r
+                       ControlList& children = control.GetChildList();\r
+\r
+                       int childrenCount = children.GetCount();\r
+                       if (childrenCount <= 0)\r
+                       {\r
+                               return VISIT_STOP;\r
+                       }\r
+                       else\r
+                       {\r
+                               return VISIT_DOWNWARD;\r
+                       }\r
+               }\r
+       private :\r
+               _Control* __pControl;\r
+       };\r
+\r
+       _Visitor visitor(this);\r
+       Accept(visitor);\r
+\r
+       return E_SUCCESS;\r
+}\r
+\r
+bool\r
+_Control::IsInSizeRange(const Dimension& size) const\r
+{\r
+       return (__minSize.width <= size.width) && (size.width <= __maxSize.width) &&\r
+                  (__minSize.height <= size.height) && (size.height <= __maxSize.height);\r
+}\r
+\r
+bool\r
+_Control::IsInSizeRange(const FloatDimension& size) const\r
+{\r
+       return (__minSize.width <= size.width) && (size.width <= __maxSize.width) &&\r
+                  (__minSize.height <= size.height) && (size.height <= __maxSize.height);\r
+}\r
+\r
+// Custom Exception: ex) Location::Map\r
+result\r
+_Control::SetBoundsFinal(const FloatRectangle& newBounds, bool changeLayoutBaseRect, bool callBoundsChangeCallbacks)\r
+{\r
+       result r = E_SUCCESS;\r
+\r
+       FloatRectangle bounds(newBounds.x, newBounds.y, newBounds.width, newBounds.height);\r
+\r
+       _IControlDelegate& delegate = GetControlDelegate();\r
+\r
+       const bool moved   = (__bounds.x != bounds.x) || (__bounds.y != bounds.y);\r
+       const bool resized = (__bounds.width != bounds.width) || (__bounds.height != bounds.height);\r
+\r
+       if ((moved || resized) && callBoundsChangeCallbacks)\r
+       {\r
+               r = delegate.OnBoundsChanging(_CoordinateSystemUtils::ConvertToInteger(bounds));\r
+               if (IsFailed(r))\r
+               {\r
+                       SysLogException(NID_UI, r, "[%s] Callback returns exception.", GetErrorMessage(r));\r
+                       return r; // Relay the result;\r
+               }\r
+               r = delegate.OnBoundsChanging(bounds);\r
+               if (IsFailed(r))\r
+               {\r
+                       SysLogException(NID_UI, r, "[%s] Callback returns exception.", GetErrorMessage(r));\r
+                       return r; // Relay the result;\r
+               }\r
+       }\r
+\r
+       if (moved || resized)\r
+       {\r
+               const FloatRectangle fbounds(bounds.x, bounds.y, bounds.width, bounds.height);\r
+               if (IsLayoutChangable() == false)\r
+               {\r
+                       r = UpdateBoundsOfVisualElement(FloatRectangle(0.0f, 0.0f, fbounds.width, fbounds.height));\r
+               }\r
+               else\r
+               {\r
+                       r = UpdateBoundsOfVisualElement(fbounds);\r
+               }\r
+       }\r
+\r
+       SysAssert(r == E_SUCCESS); // [ToDo] Exception check and rollback.\r
+\r
+       __bounds = bounds;\r
+\r
+       if (changeLayoutBaseRect)\r
+       {\r
+               __pLayoutContainer->OnChangeBaseRect();\r
+       }\r
+\r
+       if ((moved || resized) && callBoundsChangeCallbacks)\r
+       {\r
+               if (IsMovable() && IsResizable())\r
+               {\r
+                       SetClientBounds(FloatRectangle(0.0f, 0.0f, GetSizeF().width, GetSizeF().height));\r
+               }\r
+               delegate.OnBoundsChanged();\r
+\r
+               _Control* pParent = GetParent();\r
+               if (pParent)\r
+               {\r
+                       pParent->GetControlDelegate().OnChildBoundsChanged(*this);\r
+               }\r
+\r
+               ControlList& children = GetChildList();\r
+               _Control* pChild = null;\r
+               int childrenCount = children.GetCount();\r
+\r
+               for (int index = 0; index < childrenCount; index++)\r
+               {\r
+                       r = children.GetAt(index, pChild);\r
+                       if (!IsFailed(r))\r
+                       {\r
+                               pChild->GetControlDelegate().OnParentBoundsChanged(*this);\r
+                       }\r
+               }\r
+       }\r
+\r
+       ClearLastResult();\r
+       return E_SUCCESS;\r
+}\r
+\r
+// Custom Exception: ex) Location::Map\r
+result\r
+_Control::AdjustSizeToRange(void)\r
+{\r
+       ClearLastResult();\r
+       result r = E_SUCCESS;\r
+\r
+       SysAssert(IsResizable());\r
+\r
+       FloatDimension size = GetSizeF();\r
+       bool changed = ::AdjustSizeToRange(size, __minSize, __maxSize);\r
+       if (!changed)\r
+       {\r
+               return E_SUCCESS;\r
+       }\r
+\r
+       FloatRectangle newBounds(__bounds.x, __bounds.y, size.width, size.height);\r
+       r = SetBoundsFinal(newBounds, true, true);\r
+       if (IsFailed(r))\r
+       {\r
+               return r;\r
+       }\r
+\r
+       return E_SUCCESS;\r
+}\r
+\r
+// Custom Exception: ex) Location::Map\r
+// E_INVALID_ARG\r
+result\r
+_Control::SetBoundsInternal(const FloatRectangle& bounds, bool callBoundsChangeCallbacks)\r
+{\r
+       SysTryReturn(NID_UI,\r
+                               IsInSizeRange(Dimension(bounds.width, bounds.height)), E_INVALID_ARG,\r
+                               E_INVALID_ARG,\r
+                               "[E_INVALID_ARG] The specified size(%f, %f) is out of range from min size(%d, %d) to max size(%d, %d).",\r
+                               bounds.width, bounds.height, __minSize.width, __minSize.height, __maxSize.width, __maxSize.height);\r
+\r
+       SetUpdateLayoutState(true);\r
+\r
+       return SetBoundsFinal(bounds, true, callBoundsChangeCallbacks);\r
+}\r
+\r
+// Custom Exception: ex) Location::Map\r
+// E_INVALID_ARG\r
+// E_UNSUPPORTED_OPERATION\r
+result\r
+_Control::SetBounds(const Rectangle& bounds, bool callBoundsChangeCallbacks)\r
+{\r
+       ClearLastResult();\r
+\r
+       if (callBoundsChangeCallbacks)\r
+       {\r
+               SysTryReturn(NID_UI,\r
+                                       IsMovable() && IsResizable(), E_UNSUPPORTED_OPERATION,\r
+                                       E_UNSUPPORTED_OPERATION, "[E_UNSUPPORTED_OPERATION] Not movable nor resizable.");\r
+       }\r
+       FloatRectangle floatBounds(bounds.x, bounds.y, bounds.width, bounds.height);\r
+\r
+       return SetBoundsInternal(floatBounds, callBoundsChangeCallbacks);\r
+}\r
+\r
+// Custom Exception: ex) Location::Map\r
+// E_INVALID_ARG\r
+// E_UNSUPPORTED_OPERATION\r
+result\r
+_Control::SetBounds(const FloatRectangle& bounds, bool callBoundsChangeCallbacks)\r
+{\r
+       ClearLastResult();\r
+\r
+       if (callBoundsChangeCallbacks)\r
+       {\r
+               SysTryReturn(NID_UI,\r
+                                       IsMovable() && IsResizable(), E_UNSUPPORTED_OPERATION,\r
+                                       E_UNSUPPORTED_OPERATION, "[E_UNSUPPORTED_OPERATION] Not movable nor resizable.");\r
+       }\r
+\r
+       return SetBoundsInternal(bounds, callBoundsChangeCallbacks);\r
+}\r
+\r
+// A custom Exception can occur. ex) Location::Map\r
+// E_INVALID_ARG\r
+// E_UNSUPPORTED_OPERATION\r
+result\r
+_Control::SetPosition(const Point& position)\r
+{\r
+       ClearLastResult();\r
+\r
+       SysTryReturn(NID_UI,\r
+                               IsMovable(), E_UNSUPPORTED_OPERATION,\r
+                               E_UNSUPPORTED_OPERATION, "[E_UNSUPPORTED_OPERATION] Not movable.");\r
+\r
+       return SetBoundsInternal(FloatRectangle(position.x, position.y, __bounds.width, __bounds.height), true);\r
+}\r
+\r
+result\r
+_Control::SetPosition(const FloatPoint& position)\r
+{\r
+       ClearLastResult();\r
+\r
+       SysTryReturn(NID_UI,\r
+                               IsMovable(), E_UNSUPPORTED_OPERATION,\r
+                               E_UNSUPPORTED_OPERATION, "[E_UNSUPPORTED_OPERATION] Not movable.");\r
+\r
+       return SetBoundsInternal(FloatRectangle(position.x, position.y, __bounds.width, __bounds.height), true);\r
+}\r
+\r
+// Custom Exception: ex) Location::Map\r
+// E_INVALID_ARG\r
+// E_UNSUPPORTED_OPERATION\r
+result\r
+_Control::SetSize(const Dimension& size)\r
+{\r
+       ClearLastResult();\r
+\r
+       SysTryReturn(NID_UI,\r
+                               IsResizable(), E_UNSUPPORTED_OPERATION,\r
+                               E_UNSUPPORTED_OPERATION, "[E_UNSUPPORTED_OPERATION] Not resizable.");\r
+\r
+       return SetBoundsInternal(FloatRectangle(__bounds.x, __bounds.y, size.width, size.height), true);\r
+}\r
+\r
+result\r
+_Control::SetSize(const FloatDimension& size)\r
+{\r
+       ClearLastResult();\r
+\r
+       SysTryReturn(NID_UI,\r
+                               IsResizable(), E_UNSUPPORTED_OPERATION,\r
+                               E_UNSUPPORTED_OPERATION, "[E_UNSUPPORTED_OPERATION] Not resizable.");\r
+\r
+       return SetBoundsInternal(FloatRectangle(__bounds.x, __bounds.y, size.width, size.height), true);\r
+}\r
+\r
+Dimension\r
+_Control::GetMinimumSize(void) const\r
+{\r
+       ClearLastResult();\r
+\r
+       return _CoordinateSystemUtils::ConvertToInteger(__minSize);\r
+}\r
+\r
+FloatDimension\r
+_Control::GetMinimumSizeF(void) const\r
+{\r
+       ClearLastResult();\r
+\r
+       return __minSize;\r
+}\r
+\r
+Dimension\r
+_Control::GetMaximumSize(void) const\r
+{\r
+       ClearLastResult();\r
+\r
+       return _CoordinateSystemUtils::ConvertToInteger(__maxSize);\r
+}\r
+\r
+FloatDimension\r
+_Control::GetMaximumSizeF(void) const\r
+{\r
+       ClearLastResult();\r
+\r
+       return __maxSize;\r
+}\r
+\r
+// Custom Exception: ex) Location::Map\r
+// E_UNSUPPORTED_OPERATION\r
+// E_INVALID_ARG\r
+result\r
+_Control::SetMinimumSize(const Dimension& newMinSize)\r
+{\r
+       ClearLastResult();\r
+\r
+       SysTryReturn(NID_UI,\r
+                               IsResizable(), E_UNSUPPORTED_OPERATION,\r
+                               E_UNSUPPORTED_OPERATION, "[E_UNSUPPORTED_OPERATION] Not resizable.");\r
+\r
+       SysTryReturn(NID_UI,\r
+                               (newMinSize.width >= 0 && newMinSize.height >= 0), E_INVALID_ARG,\r
+                               E_INVALID_ARG, "[E_INVALID_ARG] The width or height is smaller than 0.");\r
+\r
+       SysTryReturn(NID_UI,\r
+                               (newMinSize.width <= MAX_LENGTH && newMinSize.height <= MAX_LENGTH), E_INVALID_ARG,\r
+                               E_INVALID_ARG, "[E_INVALID_ARG] The width or height is greater than %d.", MAX_LENGTH);\r
+\r
+       if (__maxSize.width < newMinSize.width)\r
+       {\r
+               __maxSize.width = newMinSize.width;\r
+       }\r
+       if (__maxSize.height < newMinSize.height)\r
+       {\r
+               __maxSize.height = newMinSize.height;\r
+       }\r
+\r
+       __minSize = _CoordinateSystemUtils::ConvertToFloat(newMinSize);\r
+       return AdjustSizeToRange();\r
+}\r
+\r
+result\r
+_Control::SetMinimumSize(const FloatDimension& newMinSize)\r
+{\r
+       ClearLastResult();\r
+\r
+       SysTryReturn(NID_UI,\r
+                               IsResizable(), E_UNSUPPORTED_OPERATION,\r
+                               E_UNSUPPORTED_OPERATION, "[E_UNSUPPORTED_OPERATION] Not resizable.");\r
+\r
+       SysTryReturn(NID_UI,\r
+                               (newMinSize.width >= 0 && newMinSize.height >= 0), E_INVALID_ARG,\r
+                               E_INVALID_ARG, "[E_INVALID_ARG] The width or height is smaller than 0.");\r
+\r
+       SysTryReturn(NID_UI,\r
+                               (newMinSize.width <= MAX_LENGTH && newMinSize.height <= MAX_LENGTH), E_INVALID_ARG,\r
+                               E_INVALID_ARG, "[E_INVALID_ARG] The width or height is greater than %d.", MAX_LENGTH);\r
+\r
+       if (__maxSize.width < newMinSize.width)\r
+       {\r
+               __maxSize.width = newMinSize.width;\r
+       }\r
+       if (__maxSize.height < newMinSize.height)\r
+       {\r
+               __maxSize.height = newMinSize.height;\r
+       }\r
+\r
+       __minSize = newMinSize;\r
+       return AdjustSizeToRange();\r
+}\r
+\r
+// Custom Exception: ex) Location::Map\r
+// E_UNSUPPORTED_OPERATION\r
+// E_INVALID_ARG\r
+result\r
+_Control::SetMaximumSize(const Dimension& newMaxSize)\r
+{\r
+       ClearLastResult();\r
+\r
+       SysTryReturn(NID_UI,\r
+                               IsResizable(), E_UNSUPPORTED_OPERATION,\r
+                               E_UNSUPPORTED_OPERATION, "[E_UNSUPPORTED_OPERATION] Not resizable.");\r
+\r
+       SysTryReturn(NID_UI,\r
+                               (newMaxSize.width >= 0 && newMaxSize.height >= 0), E_INVALID_ARG,\r
+                               E_INVALID_ARG, "[E_INVALID_ARG] The width or height is smaller than 0.");\r
+\r
+       SysTryReturn(NID_UI,\r
+                               (newMaxSize.width <= MAX_LENGTH && newMaxSize.height <= MAX_LENGTH), E_INVALID_ARG,\r
+                               E_INVALID_ARG, "[E_INVALID_ARG] The width or height is greater than %d.", MAX_LENGTH);\r
+\r
+       if (newMaxSize.width < __minSize.width)\r
+       {\r
+               __minSize.width = newMaxSize.width;\r
+       }\r
+       if (newMaxSize.height < __minSize.height)\r
+       {\r
+               __minSize.height = newMaxSize.height;\r
+       }\r
+\r
+       __maxSize = _CoordinateSystemUtils::ConvertToFloat(newMaxSize);\r
+       return AdjustSizeToRange();\r
+}\r
+\r
+result\r
+_Control::SetMaximumSize(const FloatDimension& newMaxSize)\r
+{\r
+       ClearLastResult();\r
+\r
+       SysTryReturn(NID_UI,\r
+                               IsResizable(), E_UNSUPPORTED_OPERATION,\r
+                               E_UNSUPPORTED_OPERATION, "[E_UNSUPPORTED_OPERATION] Not resizable.");\r
+\r
+       SysTryReturn(NID_UI,\r
+                               (newMaxSize.width >= 0 && newMaxSize.height >= 0), E_INVALID_ARG,\r
+                               E_INVALID_ARG, "[E_INVALID_ARG] The width or height is smaller than 0.");\r
+\r
+       SysTryReturn(NID_UI,\r
+                               (newMaxSize.width <= MAX_LENGTH && newMaxSize.height <= MAX_LENGTH), E_INVALID_ARG,\r
+                               E_INVALID_ARG, "[E_INVALID_ARG] The width or height is greater than %d.", MAX_LENGTH);\r
+\r
+       if (newMaxSize.width < __minSize.width)\r
+       {\r
+               __minSize.width = newMaxSize.width;\r
+       }\r
+       if (newMaxSize.height < __minSize.height)\r
+       {\r
+               __minSize.height = newMaxSize.height;\r
+       }\r
+\r
+       __maxSize = newMaxSize;\r
+       return AdjustSizeToRange();\r
+}\r
+\r
+\r
+Point\r
+_Control::ConvertToControlPosition(const Point& screenPosition) const\r
+{\r
+       Point controlPosition;\r
+       Rectangle absoluteBounds = GetAbsoluteBounds();\r
+\r
+       controlPosition.x = screenPosition.x - absoluteBounds.x;\r
+       controlPosition.y = screenPosition.y - absoluteBounds.y;\r
+\r
+       return controlPosition;\r
+}\r
+\r
+FloatPoint\r
+_Control::ConvertToControlPosition(const FloatPoint& screenPosition) const\r
+{\r
+       FloatPoint controlPosition;\r
+       FloatRectangle absoluteBounds = GetAbsoluteBoundsF();\r
+\r
+       controlPosition.x = screenPosition.x - absoluteBounds.x;\r
+       controlPosition.y = screenPosition.y - absoluteBounds.y;\r
+\r
+       return controlPosition;\r
+}\r
+\r
+Point\r
+_Control::ConvertToScreenPosition(const Point& controlPosition) const\r
+{\r
+       Point screenPosition;\r
+       Rectangle absoluteBounds = GetAbsoluteBounds();\r
+\r
+       screenPosition.x = controlPosition.x + absoluteBounds.x;\r
+       screenPosition.y = controlPosition.y + absoluteBounds.y;\r
+\r
+       return screenPosition;\r
+}\r
+\r
+FloatPoint\r
+_Control::ConvertToScreenPosition(const FloatPoint& controlPosition) const\r
+{\r
+       FloatPoint screenPosition;\r
+       FloatRectangle absoluteBounds = GetAbsoluteBoundsF();\r
+\r
+       screenPosition.x = controlPosition.x + absoluteBounds.x;\r
+       screenPosition.y = controlPosition.y + absoluteBounds.y;\r
+\r
+       return screenPosition;\r
+}\r
+\r
+Rectangle\r
+_Control::GetClientBounds(void) const\r
+{\r
+       if (!__isSetClientBounds)\r
+       {\r
+               return Rectangle(0, 0, __bounds.width, __bounds.height);\r
+       }\r
+\r
+       return _CoordinateSystemUtils::ConvertToInteger(__clientBounds);\r
+}\r
+\r
+FloatRectangle\r
+_Control::GetClientBoundsF(void) const\r
+{\r
+       if (!__isSetClientBounds)\r
+       {\r
+               return FloatRectangle(0.0f, 0.0f, __bounds.width, __bounds.height);\r
+       }\r
+\r
+       return __clientBounds;\r
+}\r
+\r
+\r
+Rectangle\r
+_Control::GetClientBounds(const Tizen::Graphics::Dimension& size) const\r
+{\r
+       if (!__isSetClientBounds)\r
+       {\r
+               return Rectangle(0, 0, size.width, size.height);\r
+       }\r
+\r
+       return _CoordinateSystemUtils::ConvertToInteger(__clientBounds);\r
+}\r
+\r
+\r
+FloatRectangle\r
+_Control::GetClientBoundsF(const Tizen::Graphics::FloatDimension& size) const\r
+{\r
+       if (!__isSetClientBounds)\r
+       {\r
+               return FloatRectangle(0.0f, 0.0f, size.width, size.height);\r
+       }\r
+\r
+       return __clientBounds;\r
+}\r
+\r
+Rectangle\r
+_Control::GetAbsoluteBounds(void) const\r
+{\r
+       Point accumPoint;\r
+       Rectangle absoluteBounds;\r
+       Rectangle clientBounds;\r
+\r
+       const _Control* pSelf = this;\r
+       const _Control* pParent = GetParent();\r
+\r
+       while (pParent)\r
+       {\r
+               if ((pSelf->GetArea() == _CONTROL_AREA_CLIENT) && pParent)\r
+               {\r
+                       clientBounds = pParent->GetClientBounds();\r
+                       accumPoint += Point(clientBounds.x, clientBounds.y);\r
+                       accumPoint.x -= pParent->GetHorizontalScrollPosition();\r
+                       accumPoint.y -= pParent->GetVerticalScrollPosition();\r
+               }\r
+\r
+               accumPoint += pSelf->GetPosition();\r
+               pSelf = pParent;\r
+               pParent = pParent->GetParent();\r
+       }\r
+\r
+       _Window* pWindow = GetRootWindow();\r
+\r
+       if (pWindow)\r
+       {\r
+               Point winPoint = pWindow->GetPosition();\r
+\r
+               accumPoint.x += winPoint.x;\r
+               accumPoint.y += winPoint.y;\r
+       }\r
+\r
+       absoluteBounds.x = accumPoint.x;\r
+       absoluteBounds.y = accumPoint.y;\r
+       absoluteBounds.width = __bounds.width;\r
+       absoluteBounds.height = __bounds.height;\r
+\r
+       return absoluteBounds;\r
+}\r
+\r
+FloatRectangle\r
+_Control::GetAbsoluteBoundsF(void) const\r
+{\r
+       FloatPoint accumPoint;\r
+       FloatRectangle absoluteBounds;\r
+       FloatRectangle clientBounds;\r
+\r
+       const _Control* pSelf = this;\r
+       const _Control* pParent = GetParent();\r
+\r
+       while (pParent)\r
+       {\r
+               if ((pSelf->GetArea() == _CONTROL_AREA_CLIENT) && pParent)\r
+               {\r
+                       clientBounds = pParent->GetClientBoundsF();\r
+                       accumPoint += FloatPoint(clientBounds.x, clientBounds.y);\r
+                       accumPoint.x -= pParent->GetHorizontalScrollPosition();\r
+                       accumPoint.y -= pParent->GetVerticalScrollPosition();\r
+               }\r
+\r
+               accumPoint += pSelf->GetPositionF();\r
+               pSelf = pParent;\r
+               pParent = pParent->GetParent();\r
+       }\r
+\r
+       _Window* pWindow = GetRootWindow();\r
+\r
+       if (pWindow)\r
+       {\r
+               FloatPoint winPoint = pWindow->GetPositionF();\r
+\r
+               accumPoint.x += winPoint.x;\r
+               accumPoint.y += winPoint.y;\r
+       }\r
+\r
+       absoluteBounds.x = accumPoint.x;\r
+       absoluteBounds.y = accumPoint.y;\r
+       absoluteBounds.width = __bounds.width;\r
+       absoluteBounds.height = __bounds.height;\r
+\r
+       return absoluteBounds;\r
+}\r
+\r
+result\r
+_Control::SetClientBounds(const Rectangle& bounds)\r
+{\r
+       ClearLastResult();\r
+\r
+       const bool moved   = (__clientBounds.x != _CoordinateSystemUtils::ConvertToFloat(bounds).x) || (__clientBounds.y != _CoordinateSystemUtils::ConvertToFloat(bounds).y);\r
+       const bool resized = (__clientBounds.width != _CoordinateSystemUtils::ConvertToFloat(bounds).width) || (__clientBounds.height != _CoordinateSystemUtils::ConvertToFloat(bounds).height);\r
+\r
+       SysTryReturn(NID_UI,\r
+                               IsMovable() && IsResizable(), E_UNSUPPORTED_OPERATION,\r
+                               E_UNSUPPORTED_OPERATION, "[E_UNSUPPORTED_OPERATION] Not movable nor resizable.");\r
+       __clientBounds = _CoordinateSystemUtils::ConvertToFloat(bounds);\r
+       __isSetClientBounds = true;\r
+\r
+       if (moved || resized)\r
+       {\r
+               result r = AdjustAbsoluteBounds();\r
+               SysTryReturn(NID_UI, r == E_SUCCESS, r,         r, "[%s] Propagating.", GetErrorMessage(r));\r
+\r
+               SetUpdateLayoutState(true);\r
+       }\r
+       return E_SUCCESS;\r
+}\r
+\r
+result\r
+_Control::SetClientBounds(const FloatRectangle& bounds)\r
+{\r
+       ClearLastResult();\r
+\r
+       const bool moved   = (__clientBounds.x != bounds.x) || (__clientBounds.y != bounds.y);\r
+       const bool resized = (__clientBounds.width != bounds.width) || (__clientBounds.height != bounds.height);\r
+\r
+       SysTryReturn(NID_UI,\r
+                               IsMovable() && IsResizable(), E_UNSUPPORTED_OPERATION,\r
+                               E_UNSUPPORTED_OPERATION, "[E_UNSUPPORTED_OPERATION] Not movable nor resizable.");\r
+       __clientBounds = bounds;\r
+       __isSetClientBounds = true;\r
+\r
+       if (moved || resized)\r
+       {\r
+               result r = AdjustAbsoluteBounds();\r
+               SysTryReturn(NID_UI, r == E_SUCCESS, r,         r, "[%s] Propagating.", GetErrorMessage(r));\r
+\r
+               SetUpdateLayoutState(true);\r
+       }\r
+\r
+       return E_SUCCESS;\r
+}\r
+\r
+bool\r
+_Control::IsCalledSetClientBounds(void)\r
+{\r
+       return __isSetClientBounds;\r
+}\r
+\r
+void \r
+_Control::UpdateClientBounds(const FloatDimension& size, FloatRectangle& clientBounds)\r
+{\r
+       clientBounds.width = size.width;\r
+       clientBounds.height = size.height;\r
+}\r
+\r
+Color\r
+_Control::GetBackgroundColor(void) const\r
+{\r
+       ClearLastResult();\r
+       return __backgroundColor;\r
+}\r
+\r
+void\r
+_Control::SetBackgroundColor(const Color& color)\r
+{\r
+       ClearLastResult();\r
+       __backgroundColor = color;\r
+\r
+       _ControlVisualElement* pCVE = dynamic_cast <_ControlVisualElement*>(GetVisualElement());\r
+       if (pCVE)\r
+       {\r
+               pCVE->SetBackgroundColor(\r
+                       _Colorf(\r
+                               (float)color.GetRed() / 255.0f,\r
+                               (float)color.GetGreen() / 255.0f,\r
+                               (float)color.GetBlue() / 255.0f,\r
+                               (float)color.GetAlpha() / 255.0f\r
+                       )\r
+               );\r
+       }\r
+\r
+       GetControlDelegate().OnBackgroundColorChanged(const_cast<Color&>(color));\r
+       ClearLastResult();\r
+}\r
+\r
+_Control::~_Control(void)\r
+{\r
+       __destroying = true;\r
+\r
+       DetachAllChildren();\r
+       DetachAllOwnees();\r
+       _ControlManager::GetInstance()->TakeFocusFromControl(*this);\r
+       DisposeControl();\r
+       ReleaseHandle();\r
+\r
+       if (__pFont)\r
+       {\r
+               delete __pFont;\r
+               __pFont = null;\r
+       }\r
+\r
+       _Window* pTop = GetRootWindow();\r
+       if (pTop)\r
+       {\r
+               if (this == pTop->GetFocusedControl())\r
+               {\r
+                       pTop->SetFocusedControl(null);\r
+               }\r
+       }\r
+\r
+//     Dangerous: it clears last result and log in catch block.\r
+//     ClearLastResult();\r
+}\r
+\r
+void\r
+_Control::DisposeControl(void)\r
+{\r
+       __pControlDelegate = null;\r
+\r
+       delete __pLayoutItemHandler;\r
+       __pLayoutItemHandler = null;\r
+\r
+       delete __pLayoutContainer;\r
+       __pLayoutContainer = null;\r
+\r
+       delete __pChildren;\r
+       __pChildren = null;\r
+\r
+       delete __pOwnees;\r
+       __pOwnees = null;\r
+\r
+       if (__pVisualElement)\r
+       {\r
+               __pVisualElement->Destroy();\r
+       }\r
+       __pVisualElement = null;\r
+\r
+       delete __pVisualElementContentProvider;\r
+       __pVisualElementContentProvider = null;\r
+\r
+       delete __pVisualElementEventListener;\r
+       __pVisualElementEventListener = null;\r
+\r
+       delete __pCoreGestureDetectors;\r
+       __pCoreGestureDetectors = null;\r
+\r
+       delete __pDataBindingContext;\r
+       __pDataBindingContext = null;\r
+\r
+       ClearStartedGestureDetectorList();\r
+       delete __pDetectStartedGestureMap;\r
+       __pDetectStartedGestureMap = null;\r
+\r
+       delete __pDelayedTouchInfoList;\r
+       __pDelayedTouchInfoList = null;\r
+\r
+       delete __pAccessibilityContainer;\r
+       __pAccessibilityContainer = null;\r
+\r
+       if (__pFocusVisualElement)\r
+       {\r
+               __pFocusVisualElement.release();\r
+       }\r
+}\r
+\r
+// E_OUT_OF_MEMORY\r
+// E_SYSTEM\r
+_Control::_Control(void)\r
+       : __name(L"")\r
+       , __pParent(null)\r
+       , __pChildren(null)\r
+       , __pOwnees(null)\r
+       , __bounds(0.0f, 0.0f, 0.0f, 0.0f)\r
+       , __contentAreaBounds(0.0f, 0.0f, 0.0f, 0.0f)\r
+       , __clientBounds(0.0f, 0.0f, 0.0f, 0.0f)\r
+       , __absoluteBounds(0.0f, 0.0f, 0.0f, 0.0f)\r
+       , __invalidatedBounds(0.0f, 0.0f, 0.0f, 0.0f)\r
+       , __minSize(FloatDimension(0.0f, 0.0f))\r
+       , __maxSize(FloatDimension(MAX_LENGTH, MAX_LENGTH))\r
+       , __backgroundColor(Color::GetColor(COLOR_ID_BLACK))\r
+       , __movable(true)\r
+       , __resizable(true)\r
+       , __focusable(true)\r
+       , __nativeObjectFocusable(true)\r
+       , __enabledState(true)\r
+       , __visibleState(true)\r
+       , __initVisibleState(false)\r
+       , __clipToParent(true)\r
+       , __focusSet(false)\r
+       , __multiTouchEnabled(false)\r
+       , __dragEnabled(false)\r
+       , __dropEnabled(false)\r
+       , __drawWhenVisible(true)\r
+       , __isPostOrderTraversal(false)\r
+       , __isCalledCallOnAttachingToMainTree(false)\r
+       , __isCalledCallOnAttachedToMainTree(false)\r
+       , __isSetClientBounds(false)\r
+       , __isCalledGetCanvasN(false)\r
+       , __pVisualElementContentProvider(null)\r
+       , __pVisualElement(null)\r
+       , __pVisualElementEventListener(null)\r
+       , __pLayoutItemHandler(null)\r
+       , __pPortraitLayout(null)\r
+       , __pLandscapeLayout(null)\r
+       , __pLayoutContainer(null)\r
+       , __area(_CONTROL_AREA_NONE)\r
+       , __layer(_CONTROL_LAYER_NONE)\r
+       , __orientation(_CONTROL_ORIENTATION_PORTRAIT)\r
+       , __pTouchEventPreviewer(null)\r
+       , __pKeyEventPreviewer(null)\r
+       , __pNotificationEventPreviewer(null)\r
+       , __pKeyEventListener(null)\r
+       , __pFocusEventListener(null)\r
+       , __pNotificationEventListener(null)\r
+       , __pCoreGestureDetectors(null)\r
+       , __pDetectStartedGestureMap(null)\r
+       , __pDelayedTouchInfoList(null)\r
+       , __touchMoveAllowance(3)\r
+       , __isSentDelayedEvent(false)\r
+       , __isSendingDelayedEvent(false)\r
+       , __isChangingEventTarget(false)\r
+       , __pDataBindingContext(null)\r
+       , __pControlDelegate(null)\r
+       , __pUserData(null)\r
+       , __destroying(false)\r
+       , __isEventEnableState(true)\r
+       , __isControlFontChanged(false)\r
+       , __pFont(null)\r
+       , __fontName(L"")\r
+       , __fontFileName(L"")\r
+       , __pPreviousFocus(null)\r
+       , __pNextFocus(null)\r
+       , __pFocusVisualElement(null)\r
+       , __inputLockRefCount(0)\r
+       , __screenDpi(0)\r
+{\r
+       ClearLastResult();\r
+\r
+       SetControlDelegate(*this);\r
+       __pAccessibilityContainer = new (std::nothrow) _AccessibilityContainer(*this);\r
+       __pAccessibilityContainer->Activate(true);\r
+\r
+       __pLayoutItemHandler = new (std::nothrow) LayoutItemHandler(this);\r
+       if (!__pLayoutItemHandler)\r
+       {\r
+               goto CATCH;\r
+       }\r
+\r
+       __pLayoutContainer = CreateLayoutContainerN(__pLayoutItemHandler);\r
+       if (!__pLayoutContainer)\r
+       {\r
+               goto CATCH;\r
+       }\r
+\r
+       __pChildren = ::CreateControlListN();\r
+       if (!__pChildren)\r
+       {\r
+               goto CATCH;\r
+       }\r
+\r
+       __pOwnees = ::CreateWindowListN();\r
+       if (!__pOwnees)\r
+       {\r
+               goto CATCH;\r
+       }\r
+\r
+       __pVisualElement = ::CreateVisualElementN();\r
+       if (!__pVisualElement)\r
+       {\r
+               goto CATCH;\r
+       }\r
+\r
+       __pVisualElement->SetUserData(this);\r
+       __pVisualElement->SetClipChildrenEnabled(true);\r
+       __pVisualElement->SetRedrawOnResizeEnabled(true);\r
+\r
+       __pVisualElementContentProvider = new (std::nothrow) ControlVisualElementContentProvider(*this);\r
+       SysTryCatch(NID_UI, __pVisualElementContentProvider, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");\r
+\r
+       GetVisualElement()->SetContentProvider(__pVisualElementContentProvider);\r
+\r
+       __pVisualElementEventListener = new (std::nothrow) ControlVisualElementEventListener(*this);\r
+       SysTryCatch(NID_UI, __pVisualElementEventListener, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");\r
+\r
+       GetVisualElement()->SetVisualElementEventListener(__pVisualElementEventListener);\r
+\r
+       __pDetectStartedGestureMap = ::CreateGestureMapN();\r
+       if (!__pDetectStartedGestureMap)\r
+       {\r
+               goto CATCH;\r
+       }\r
+\r
+       __pCoreGestureDetectors = new (std::nothrow) LinkedListT<_TouchGestureDetector*>;\r
+       if (!__pCoreGestureDetectors)\r
+       {\r
+               goto CATCH;\r
+       }\r
+\r
+       __pDelayedTouchInfoList = new (std::nothrow) LinkedListT<_TouchInfo*>;\r
+       if (!__pDelayedTouchInfoList)\r
+       {\r
+               goto CATCH;\r
+       }\r
+\r
+       SetEventPreviewer<_UI_EVENT_TOUCH>(this);\r
+       SetEventPreviewer<_UI_EVENT_KEY>(this);\r
+       SetEventPreviewer<_UI_EVENT_NOTIFICAITON>(this);\r
+\r
+       SetEventListener<_UI_EVENT_NOTIFICAITON>(this);\r
+       SetEventListener<_UI_EVENT_FOCUS>(this);\r
+\r
+       SetPropagatedTouchEventListener(this);\r
+       SetPropagatedKeyEventListener(this);\r
+       GET_COLOR_CONFIG(BASIC::background, __backgroundColor);\r
+\r
+       if (IsFailed(GetLastResult()))\r
+       {\r
+               SysLog(NID_UI_CTRL, "[%s] Propagated", GetErrorMessage(GetLastResult()));\r
+       }\r
+\r
+       __screenDpi = _ControlManager::GetInstance()->GetScreenDpi();\r
+\r
+       return;\r
+\r
+CATCH:\r
+       DisposeControl();\r
+       return;\r
+}\r
+\r
+void\r
+_Control::AcquireHandle(void)\r
+{\r
+       __controlHandle = _ControlManager::GetInstance()->Register(this); // [ToDo] exception?\r
+}\r
+\r
+void\r
+_Control::ReleaseHandle(void)\r
+{\r
+       _ControlManager::GetInstance()->Release(__controlHandle); // [ToDo] exception?\r
+}\r
+\r
+void\r
+_Control::SetDrawWhenVisible(bool draw)\r
+{\r
+       __drawWhenVisible = draw;\r
+}\r
+\r
+bool\r
+_Control::IsDrawWhenVisible(void)\r
+{\r
+       return __drawWhenVisible;\r
+}\r
+\r
+void\r
+_Control::SetTerminatingOrder(bool postOrderTraversal)\r
+{\r
+       __isPostOrderTraversal = postOrderTraversal;\r
+}\r
+\r
+void\r
+_Control::SetParent(_Control* pParent)\r
+{\r
+       ClearLastResult();\r
+       __pParent = pParent;\r
+}\r
+\r
+// E_OUT_OF_MEMORY\r
+// Only called by _Window::SetOwner(pOwner)\r
+result\r
+_Control::AttachOwnee(_Window& window)\r
+{\r
+       ClearLastResult();\r
+       result r = E_SUCCESS;\r
+\r
+       _Control* pOldOwner = window.GetOwner();\r
+       if (pOldOwner)\r
+       {\r
+               pOldOwner->DetachOwnee(window);\r
+       }\r
+\r
+       r = __pOwnees->Add(&window);\r
+       if (IsFailed(r))\r
+       {\r
+               SysLogException(NID_UI, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");\r
+               return E_OUT_OF_MEMORY;\r
+       }\r
+\r
+       return E_SUCCESS;\r
+}\r
+\r
+int\r
+_Control::GetOwneeCount(void) const\r
+{\r
+       ClearLastResult();\r
+       return __pOwnees->GetCount();\r
+}\r
+\r
+// E_OUT_OF_RANGE\r
+_Window*\r
+_Control::GetOwnee(int index) const\r
+{\r
+       ClearLastResult();\r
+       result r = E_SUCCESS;\r
+\r
+       _Window* pOwnee = null;\r
+       r = __pOwnees->GetAt(index, pOwnee);\r
+       if (IsFailed(r))\r
+       {\r
+               SysLogException(NID_UI, E_OUT_OF_RANGE, "[E_OUT_OF_RANGE] The specified index is out of range.");\r
+               return null;\r
+       }\r
+\r
+       return pOwnee;\r
+}\r
+\r
+// Called by _Window::SetOwner(null)\r
+void\r
+_Control::DetachOwnee(_Window& ownee)\r
+{\r
+       ClearLastResult();\r
+       result r = E_SUCCESS;\r
+\r
+       _Control* pOwner = ownee.GetOwner();\r
+       if (pOwner != this)\r
+       {\r
+               return;\r
+       }\r
+\r
+       r = __pOwnees->Remove(&ownee);\r
+       if (IsFailed(r))\r
+       {\r
+               SysLogException(NID_UI, E_OUT_OF_RANGE, "[E_OUT_OF_RANGE] The specified index is out of range.");\r
+       }\r
+}\r
+\r
+void\r
+_Control::DetachAllOwnees(void)\r
+{\r
+       ClearLastResult();\r
+\r
+       int owneeCount = GetOwneeCount();\r
+       while (owneeCount--)\r
+       {\r
+               _Window* pOwnee = GetOwnee(0);\r
+               if (pOwnee == null)\r
+               {\r
+                       continue;\r
+               }\r
+\r
+               pOwnee->SetOwner(null);\r
+       }\r
+}\r
+\r
+_Layout::LayoutContainer&\r
+_Control::GetLayoutContainer() const\r
+{\r
+       return *__pLayoutContainer;\r
+}\r
+\r
+void\r
+_Control::SetMultiTouchEnabled(bool enabled)\r
+{\r
+       ClearLastResult();\r
+       __multiTouchEnabled = enabled;\r
+}\r
+\r
+bool\r
+_Control::IsMultiTouchEnabled(void) const\r
+{\r
+       ClearLastResult();\r
+       return __multiTouchEnabled;\r
+}\r
+\r
+void\r
+_Control::SetMovable(bool movable)\r
+{\r
+       ClearLastResult();\r
+       __movable = movable;\r
+}\r
+\r
+void\r
+_Control::SetResizable(bool resizable)\r
+{\r
+       ClearLastResult();\r
+\r
+       if (!resizable)\r
+       {\r
+               __minSize = __maxSize = GetSizeF();\r
+       }\r
+\r
+       if (!__resizable && resizable)\r
+       {\r
+               __minSize = FloatDimension(0.0f, 0.0f);\r
+               __maxSize = FloatDimension(MAX_LENGTH, MAX_LENGTH);\r
+       }\r
+\r
+       __resizable = resizable;\r
+}\r
+\r
+_Layout::Layout*\r
+_Control::GetLayout(void) const\r
+{\r
+       ClearLastResult();\r
+       _Layout::Layout* pLayout = __pLayoutContainer->GetLayout();\r
+\r
+       SysAssert(GetLastResult() == E_SUCCESS);\r
+       return pLayout;\r
+}\r
+\r
+result\r
+_Control::SetCurrentLayout(_Layout::Layout& layout)\r
+{\r
+       ClearLastResult();\r
+       return __pLayoutContainer->SetCurrentLayout(layout);\r
+}\r
+\r
+result\r
+_Control::AddLayout(_Layout::Layout& layout)\r
+{\r
+       ClearLastResult();\r
+       return __pLayoutContainer->AddLayout(layout);\r
+}\r
+\r
+void\r
+_Control::SetUpdateLayoutState(bool state)\r
+{\r
+       _Layout::Layout* pLayout = GetLayout();\r
+       if (pLayout)\r
+       {\r
+               pLayout->SetUpdateState(state);\r
+       }\r
+}\r
+\r
+_DataBindingContext*\r
+_Control::GetDataBindingContext(void)\r
+{\r
+       return __pDataBindingContext;\r
+}\r
+_AccessibilityContainer*\r
+_Control::GetAccessibilityContainer(void)\r
+{\r
+       return __pAccessibilityContainer;\r
+}\r
+void\r
+_Control::SetDataBindingContext(_DataBindingContext* pDataBindingContext)\r
+{\r
+       __pDataBindingContext = pDataBindingContext;\r
+}\r
+\r
+Tizen::Base::String\r
+_Control::GetDescription(void) const\r
+{\r
+       return String(L"");\r
+}\r
+\r
+void\r
+_Control::SetTouchCapture(bool allowOutOfBounds, bool allowOwnerBounds)\r
+{\r
+       _TouchManager* pTouchManager = _TouchManager::GetInstance();\r
+       SysTryReturnVoidResult(NID_UI, pTouchManager != null, E_SYSTEM, "[E_SYSTEM] TouchManager Instance is null");\r
+\r
+       pTouchManager->SetCapturedControl(this, allowOutOfBounds, allowOwnerBounds);\r
+}\r
+\r
+void\r
+_Control::ReleaseTouchCapture(void)\r
+{\r
+       _TouchManager* pTouchManager = _TouchManager::GetInstance();\r
+       SysTryReturnVoidResult(NID_UI, pTouchManager != null, E_SYSTEM, "[E_SYSTEM] TouchManager Instance is null");\r
+\r
+       pTouchManager->SetCapturedControl(null, false, false);\r
+}\r
+\r
+_Control*\r
+_Control::GetTopmostChildAt(const Point& point) const\r
+{\r
+       _Control* pTouchedControl = null;\r
+       FloatPoint ptf((float) point.x, (float) point.y);\r
+       _ControlManager* pControlManager = _ControlManager::GetInstance();\r
+       SysTryReturn(NID_UI, pControlManager, null, E_SYSTEM, "[E_SYSTEM] _ControlManager does not exist.");\r
+\r
+       _Window* pRootWindow = GetRootWindow();\r
+       SysTryReturn(NID_UI, pRootWindow, null, E_SYSTEM, "[E_SYSTEM] GetRootWindow() is null, this control is detached from the main trree");\r
+\r
+       _ControlVisualElement* pRootControlElement = dynamic_cast <_ControlVisualElement*>(pRootWindow->GetVisualElement());\r
+       SysTryReturn(NID_UI, pRootControlElement, null, E_SYSTEM, "[E_SYSTEM] pRootControlElement is null.");\r
+\r
+       _ControlVisualElement* pHitTestElm = pRootControlElement->GetControlChildAtPoint(ptf);\r
+       SysTryReturn(NID_UI, pHitTestElm, null, E_SYSTEM, "[E_SYSTEM] pHitTestElm is null.");\r
+\r
+       pTouchedControl = static_cast <_Control*>(pHitTestElm->GetUserData());\r
+\r
+       return pTouchedControl;\r
+}\r
+\r
+void\r
+_Control::SetContentAreaBounds(const Rectangle& rect)\r
+{\r
+       ClearLastResult();\r
+\r
+       __contentAreaBounds = _CoordinateSystemUtils::ConvertToFloat(rect);\r
+}\r
+\r
+void\r
+_Control::SetContentAreaBounds(const FloatRectangle& rect)\r
+{\r
+       ClearLastResult();\r
+\r
+       __contentAreaBounds = rect;\r
+}\r
+\r
+Rectangle\r
+_Control::GetContentAreaBounds(void) const\r
+{\r
+       return _CoordinateSystemUtils::ConvertToInteger(__contentAreaBounds);\r
+}\r
+\r
+FloatRectangle\r
+_Control::GetContentAreaBoundsF(void) const\r
+{\r
+       return __contentAreaBounds;\r
+}\r
+\r
+Bitmap*\r
+_Control::GetCapturedBitmapN(bool includeChildren) const\r
+{\r
+       result r = E_SUCCESS;\r
+\r
+       Canvas* pCanvas = null;\r
+       Bitmap* pBitmap = null;\r
+\r
+       pBitmap = GetControlDelegate().OnCapturedBitmapRequestedN();\r
+       if (pBitmap == null)\r
+       {\r
+               FloatRectangle rect;\r
+\r
+               Rectangle boundsInCanvas = GetBounds();\r
+               boundsInCanvas.x = boundsInCanvas.y = 0;\r
+\r
+               pCanvas = new (std::nothrow) Canvas;\r
+               SysTryReturn(NID_UI, pCanvas, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");\r
+\r
+               r = pCanvas->Construct(boundsInCanvas);\r
+               SysTryCatch(NID_UI, r == E_SUCCESS, , r, "[%s] Propagated.", GetErrorMessage(r));\r
+\r
+               GetVisualElement()->Draw();\r
+               ClearLastResult(); // [ToDo] Temp.\r
+\r
+               rect.SetBounds(boundsInCanvas.x, boundsInCanvas.y, boundsInCanvas.width, boundsInCanvas.height);\r
+\r
+               r = GetVisualElement()->Capture(*pCanvas, rect, includeChildren);\r
+               SysTryCatch(NID_UI, r == E_SUCCESS, , r, "[%s] Propagated.", GetErrorMessage(r));\r
+\r
+               pBitmap = new (std::nothrow) Bitmap;\r
+               SysTryCatch(NID_UI, pBitmap != null, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");\r
+\r
+               r = pBitmap->Construct(*pCanvas, boundsInCanvas);\r
+               if (IsFailed(r))\r
+               {\r
+                       SysAssert(r == E_OUT_OF_MEMORY);\r
+                       SysTryCatch(NID_UI, r == E_SUCCESS, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");\r
+               }\r
+\r
+               SysLog(NID_UI, "Bitmap (width:%d, height:%d)", pBitmap->GetWidth(), pBitmap->GetHeight());\r
+\r
+               delete pCanvas;\r
+       }\r
+       _BitmapImpl::ConvertToNonpremultiplied(*pBitmap, true);\r
+\r
+       return pBitmap;\r
+\r
+CATCH:\r
+       delete pCanvas;\r
+       delete pBitmap;\r
+       SetLastResult(r);\r
+\r
+       return null;\r
+}\r
+\r
+Tizen::Graphics::Rectangle\r
+_Control::GetInvalidatedBounds(void) const\r
+{\r
+       return _CoordinateSystemUtils::ConvertToInteger(__invalidatedBounds);\r
+}\r
+\r
+Tizen::Graphics::FloatRectangle\r
+_Control::GetInvalidatedBoundsF(void) const\r
+{\r
+       return __invalidatedBounds;\r
+}\r
+\r
+result\r
+_Control::AddGestureDetector(const _TouchGestureDetector& gestureDetector)\r
+{\r
+       ClearLastResult();\r
+\r
+       bool exist = __pCoreGestureDetectors->Contains(const_cast<_TouchGestureDetector*>(&gestureDetector));\r
+       SysTryReturnResult(NID_UI, exist == false, E_OBJ_ALREADY_EXIST, "[E_OBJ_ALREADY_EXIST]__pCoreGestureDetectors has gesture already");\r
+\r
+       result r = __pCoreGestureDetectors->Add(const_cast<_TouchGestureDetector*>(&gestureDetector));\r
+       SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
+\r
+       r = const_cast<_TouchGestureDetector&>(gestureDetector).SetControl(*this);\r
+       SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "Control handle is not valid.");\r
+\r
+       const_cast<_TouchGestureDetector&>(gestureDetector).OnTouchGestureDetectorAdded();\r
+\r
+       return r;\r
+}\r
+\r
+result\r
+_Control::RemoveGestureDetector(const _TouchGestureDetector& gestureDetector)\r
+{\r
+       ClearLastResult();\r
+\r
+       result r = __pCoreGestureDetectors->Remove(&(const_cast<_TouchGestureDetector&>(gestureDetector)));\r
+       if (r != E_SUCCESS)\r
+       {\r
+               return r;\r
+       }\r
+\r
+       const_cast<_TouchGestureDetector&>(gestureDetector).OnTouchGestureDetectorRemoved();\r
+\r
+       return E_SUCCESS;\r
+}\r
+\r
+IListT <_TouchGestureDetector*>*\r
+_Control::GetGestureDetectorList(void) const\r
+{\r
+       return __pCoreGestureDetectors;\r
+}\r
+\r
+IMapEnumeratorT <_TouchGestureDetector*, _TouchGestureDetectorState>*\r
+_Control::GetStartedGestureDetectorEnumeratorN(void) const\r
+{\r
+       return __pDetectStartedGestureMap->GetMapEnumeratorN();\r
+}\r
+\r
+result\r
+_Control::AddStartedGestureDetector(const _TouchGestureDetector& gestureDetector, _TouchGestureDetectorState state)\r
+{\r
+       ClearLastResult();\r
+\r
+       result r = E_SUCCESS;\r
+\r
+       bool exist = false;\r
+       __pDetectStartedGestureMap->ContainsKey(const_cast<_TouchGestureDetector*>(&gestureDetector), exist);\r
+\r
+       if (exist == false)\r
+       {\r
+               r = __pDetectStartedGestureMap->Add(const_cast<_TouchGestureDetector*>(&gestureDetector), state);\r
+       }\r
+\r
+       return r;\r
+}\r
+\r
+result\r
+_Control::SetStartedGestureDetector(const _TouchGestureDetector& gestureDetector, _TouchGestureDetectorState state)\r
+{\r
+       ClearLastResult();\r
+\r
+       result r = E_SUCCESS;\r
+\r
+       bool exist = false;\r
+       __pDetectStartedGestureMap->ContainsKey(const_cast<_TouchGestureDetector*>(&gestureDetector), exist);\r
+\r
+       if (exist == true)\r
+       {\r
+               r = __pDetectStartedGestureMap->SetValue(const_cast<_TouchGestureDetector*>(&gestureDetector), state);\r
+       }\r
+\r
+       return r;\r
+}\r
+\r
+result\r
+_Control::ClearStartedGestureDetectorList(void)\r
+{\r
+       ClearLastResult();\r
+\r
+       result r = E_SUCCESS;\r
+\r
+       IListT<_TouchGestureDetector*>* pList = __pDetectStartedGestureMap->GetKeysN();\r
+       if (pList)\r
+       {\r
+               IEnumeratorT<_TouchGestureDetector*>* pEnumerator = pList->GetEnumeratorN();\r
+               if (pEnumerator)\r
+               {\r
+                       while(pEnumerator->MoveNext() == E_SUCCESS)\r
+                       {\r
+                               _TouchGestureDetector* pGestureDetector = null;\r
+                               pEnumerator->GetCurrent(pGestureDetector);\r
+\r
+                               if (pGestureDetector == null)\r
+                               {\r
+                                       continue;\r
+                               }\r
+\r
+                               __pDetectStartedGestureMap->Remove(pGestureDetector);\r
+                       }\r
+                       delete pEnumerator;\r
+               }\r
+               delete pList;\r
+       }\r
+\r
+       IEnumeratorT<_TouchInfo*>* pEnumerator = __pDelayedTouchInfoList->GetEnumeratorN();\r
+       if(pEnumerator)\r
+       {\r
+               while(pEnumerator->MoveNext() == E_SUCCESS)\r
+               {\r
+                       _TouchInfo* pTouchInfo = null;\r
+                       pEnumerator->GetCurrent(pTouchInfo);\r
+                       if (pTouchInfo == null)\r
+                       {\r
+                               continue;\r
+                       }\r
+\r
+                       delete pTouchInfo;\r
+               }\r
+\r
+               __pDelayedTouchInfoList->RemoveAll();\r
+               delete pEnumerator;\r
+       }\r
+\r
+       __isSentDelayedEvent = false;\r
+       __isSendingDelayedEvent = false;\r
+\r
+       return r;\r
+}\r
+\r
+bool\r
+_Control::IsDelayedTouchEventEnabled(void) const\r
+{\r
+       bool existDelayTouchEventGesture = false;\r
+\r
+       IMapEnumeratorT <_TouchGestureDetector*, _TouchGestureDetectorState>* pMapEnumerator = __pDetectStartedGestureMap->GetMapEnumeratorN();\r
+       if (pMapEnumerator)\r
+       {\r
+               while(pMapEnumerator->MoveNext() == E_SUCCESS)\r
+               {\r
+                       _TouchGestureDetector* pGestureDetector = null;\r
+                       pMapEnumerator->GetKey(pGestureDetector);\r
+\r
+                       if (pGestureDetector == null)\r
+                       {\r
+                               continue;\r
+                       }\r
+\r
+                       _TouchGestureDetectorState state = _TOUCH_GESTURE_DETECTOR_STATE_READY;\r
+                       pMapEnumerator->GetValue(state);\r
+\r
+                       if (pGestureDetector->IsDelayTouchEventEnabled())\r
+                       {\r
+                               existDelayTouchEventGesture = true;\r
+                       }\r
+               }\r
+               delete pMapEnumerator;\r
+       }\r
+\r
+       bool delayTouchEvent = false;\r
+       if (existDelayTouchEventGesture)\r
+       {\r
+               pMapEnumerator = __pDetectStartedGestureMap->GetMapEnumeratorN();\r
+               if (pMapEnumerator)\r
+               {\r
+                       while(pMapEnumerator->MoveNext() == E_SUCCESS)\r
+                       {\r
+                               _TouchGestureDetector* pGestureDetector = null;\r
+                               pMapEnumerator->GetKey(pGestureDetector);\r
+\r
+                               if (pGestureDetector == null)\r
+                               {\r
+                                       continue;\r
+                               }\r
+\r
+                               _TouchGestureDetectorState state = _TOUCH_GESTURE_DETECTOR_STATE_READY;\r
+                               pMapEnumerator->GetValue(state);\r
+\r
+                               if (state == _TOUCH_GESTURE_DETECTOR_STATE_STARTED)\r
+                               {\r
+                                       delayTouchEvent = true;\r
+                                       break;\r
+                               }\r
+                       }\r
+                       delete pMapEnumerator;\r
+               }\r
+\r
+               return delayTouchEvent;\r
+       }\r
+       else\r
+       {\r
+               return false;\r
+       }\r
+}\r
+\r
+bool\r
+_Control::IsPossibleToSendDelayedTouchEvent(void) const\r
+{\r
+       bool existDelayTouchEventGesture = false;\r
+\r
+       IMapEnumeratorT <_TouchGestureDetector*, _TouchGestureDetectorState>* pMapEnumerator = __pDetectStartedGestureMap->GetMapEnumeratorN();\r
+       if (pMapEnumerator)\r
+       {\r
+               while(pMapEnumerator->MoveNext() == E_SUCCESS)\r
+               {\r
+                       _TouchGestureDetector* pGestureDetector = null;\r
+                       pMapEnumerator->GetKey(pGestureDetector);\r
+\r
+                       if (pGestureDetector == null)\r
+                       {\r
+                               continue;\r
+                       }\r
+\r
+                       _TouchGestureDetectorState state = _TOUCH_GESTURE_DETECTOR_STATE_READY;\r
+                       pMapEnumerator->GetValue(state);\r
+\r
+                       if (pGestureDetector->IsDelayTouchEventEnabled())\r
+                       {\r
+                               existDelayTouchEventGesture = true;\r
+                       }\r
+               }\r
+               delete pMapEnumerator;\r
+       }\r
+\r
+       bool allFailed = true;\r
+       if (existDelayTouchEventGesture)\r
+       {\r
+               pMapEnumerator = __pDetectStartedGestureMap->GetMapEnumeratorN();\r
+               if (pMapEnumerator)\r
+               {\r
+                       while(pMapEnumerator->MoveNext() == E_SUCCESS)\r
+                       {\r
+                               _TouchGestureDetector* pGestureDetector = null;\r
+                               pMapEnumerator->GetKey(pGestureDetector);\r
+\r
+                               if (pGestureDetector == null)\r
+                               {\r
+                                       continue;\r
+                               }\r
+\r
+                               _TouchGestureDetectorState state = _TOUCH_GESTURE_DETECTOR_STATE_READY;\r
+                               pMapEnumerator->GetValue(state);\r
+\r
+                               if (state == _TOUCH_GESTURE_DETECTOR_STATE_SUCCESS)\r
+                               {\r
+                                       allFailed = false;\r
+                                       break;\r
+                               }\r
+                       }\r
+                       delete pMapEnumerator;\r
+               }\r
+\r
+               return allFailed;\r
+       }\r
+       else\r
+       {\r
+               return false;\r
+       }\r
+}\r
+\r
+bool\r
+_Control::IsCancelOnGestureSuccess(void) const\r
+{\r
+       _TouchManager* pTouchManager = _TouchManager::GetInstance();\r
+       SysAssert(pTouchManager != null);\r
+\r
+       IMapEnumeratorT <_TouchGestureDetector*, _TouchGestureDetectorState>* pMapEnumerator = __pDetectStartedGestureMap->GetMapEnumeratorN();\r
+       if (pMapEnumerator)\r
+       {\r
+               while(pMapEnumerator->MoveNext() == E_SUCCESS)\r
+               {\r
+                       _TouchGestureDetector* pGestureDetector = null;\r
+                       pMapEnumerator->GetKey(pGestureDetector);\r
+\r
+                       if (pGestureDetector == null)\r
+                       {\r
+                               continue;\r
+                       }\r
+\r
+                       _TouchGestureDetectorState state = _TOUCH_GESTURE_DETECTOR_STATE_READY;\r
+                       pMapEnumerator->GetValue(state);\r
+\r
+                       if (pGestureDetector->IsCancelTouchEventOnSuccessEnabled() && state == _TOUCH_GESTURE_DETECTOR_STATE_SUCCESS && !pTouchManager->IsTouchCanceledOnGestureSuccess())\r
+                       {\r
+                               delete pMapEnumerator;\r
+                               return true;\r
+                       }\r
+               }\r
+               delete pMapEnumerator;\r
+       }\r
+\r
+       return false;\r
+}\r
+\r
+bool\r
+_Control::IsSentDelayedEvent(void) const\r
+{\r
+       return __isSentDelayedEvent;\r
+}\r
+\r
+void\r
+_Control::SetSentDelayedEvent(bool sent)\r
+{\r
+       __isSentDelayedEvent = sent;\r
+}\r
+\r
+void\r
+_Control::SetSendingDelayedEvent(bool sending)\r
+{\r
+       __isSendingDelayedEvent = sending;\r
+}\r
+\r
+bool\r
+_Control::IsSendingDelayedEvent(void) const\r
+{\r
+       return __isSendingDelayedEvent;\r
+}\r
+\r
+void\r
+_Control::AddTouchInfo(const _TouchInfo& touchInfo)\r
+{\r
+       _TouchManager* pTouchManager = _TouchManager::GetInstance();\r
+       SysTryReturnVoidResult(NID_UI, pTouchManager, E_SYSTEM, "[E_SYSTEM] _TouchManager does not exist.");\r
+\r
+       _TouchInfo* pTouchInfo = new (std::nothrow) _TouchInfo;\r
+       SysTryReturnVoidResult(NID_UI, pTouchInfo, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");\r
+\r
+       FloatPoint screenPoint = pTouchManager->GetScreenPoint(touchInfo.GetPointId());\r
+       pTouchInfo->SetTouchInfo(touchInfo.GetPointId(), touchInfo.GetTouchStatus(), screenPoint, false, 0);\r
+       __pDelayedTouchInfoList->Add(pTouchInfo);\r
+}\r
+\r
+IListT<_TouchInfo*>*\r
+_Control::GetTouchInfoList(void)\r
+{\r
+       return __pDelayedTouchInfoList;\r
+}\r
+\r
+_VisualElement*\r
+_Control::GetVisualElement(void) const\r
+{\r
+       SysAssert(__pVisualElement);\r
+       return __pVisualElement;\r
+}\r
+\r
+void\r
+_Control::PrintDescription(bool printChildren, int level)\r
+{\r
+       int count = PrintDescription(printChildren, 0, level);\r
+\r
+       SysLog(NID_UI, "%d controls were printed.", count);\r
+}\r
+\r
+int\r
+_Control::PrintDescription(bool printChildren, int depth, int level)\r
+{\r
+       const int PRINT_CONTROL_VE = 1;\r
+       const int PRINT_CONTROL_EVAS = 2;\r
+       const int PRINT_CONTROL_VE_EVAS = 3;\r
+\r
+       String indent(L"");\r
+       String format(L"");\r
+\r
+       format.Format(LOG_LEN_MAX, L"%d", depth);\r
+\r
+       for (int i = 0; i < depth; i++)\r
+       {\r
+               indent.Append(L"   ");\r
+       }\r
+\r
+       indent.Append(format);\r
+\r
+       String delimiter(L"-------------------------------------------------------------------------------------------");\r
+       SysLog(NID_UI, "%ls", delimiter.GetPointer());\r
+\r
+       // Public\r
+       String publicDescription = GetControlDelegate().GetDescription();\r
+       if (!publicDescription.IsEmpty())\r
+       {\r
+               SysLog(NID_UI, "%ls %ls", indent.GetPointer(), publicDescription.GetPointer());\r
+       }\r
+\r
+       // Core\r
+       SysLog(NID_UI, "%ls 0x%x(%d %ls) enable(%d) enableState(%d) visible(%d) visibleState(%d) focusable(%d) clip(%d) movable(%d) resizable(%d)",\r
+               indent.GetPointer(), this, __controlHandle.ToInt(), GetName().GetPointer(), IsEnabled(), GetEnableState(), IsVisible(), GetVisibleState(),\r
+               IsFocusable(), IsClipToParent(), IsMovable(), IsResizable());\r
+\r
+       Rectangle bounds = GetBounds();\r
+       Dimension min = GetMinimumSize();\r
+       Dimension max = GetMaximumSize();\r
+       Rectangle clientBounds = GetClientBounds();\r
+       Rectangle absoluteBounds = GetAbsoluteBounds();\r
+\r
+       SysLog(NID_UI, "%ls bounds(%d %d %d %d) min(%d %d) max(%d %d) scrollPos(%.2f %.2f) cbounds(%d %d %d %d) abounds(%d %d %d %d)",\r
+               indent.GetPointer(), bounds.x, bounds.y, bounds.width, bounds.height,\r
+               min.width, min.height, max.width, max.height,\r
+               GetVerticalScrollPosition(), GetHorizontalScrollPosition(),\r
+               clientBounds.x, clientBounds.y, clientBounds.width, clientBounds.height,\r
+               absoluteBounds.x, absoluteBounds.y, absoluteBounds.width, absoluteBounds.height);\r
+\r
+       SysLog(NID_UI, "%ls bgColor(0x%x) layoutable(%d) orientation(%d) drag(%d) drop(%d) area(%d) layer(%d)",\r
+               indent.GetPointer(), __backgroundColor.GetRGB32(), IsLayoutable(), GetOrientation(), IsDragEnabled(), IsDropEnabled(), GetArea(), GetLayer());\r
+\r
+       Canvas* pCanvas = GetCanvasN();\r
+       if (pCanvas)\r
+       {\r
+               Rectangle canvasBounds = pCanvas->GetBounds();\r
+               Color canvasBackgroundColor = pCanvas->GetBackgroundColor();\r
+               Color canvasForegroundColor = pCanvas->GetForegroundColor();\r
+\r
+               SysLog(NID_UI, "%ls canvas.bounds(%d %d %d %d) canvas.bgColor(0x%x) canvas.fgColor(0x%x)",\r
+                       indent.GetPointer(), canvasBounds.x, canvasBounds.y, canvasBounds.width, canvasBounds.height, canvasBackgroundColor.GetRGB32(), canvasForegroundColor.GetRGB32());\r
+\r
+               delete pCanvas;\r
+       }\r
+\r
+       SysLog(NID_UI, "%ls DataBindingContext(0x%x) ControlDelegate(0x%x) UserData(0x%x) destroying(%d)",\r
+               indent.GetPointer(), __pDataBindingContext, __pControlDelegate, __pUserData, __destroying);\r
+\r
+       // Ownees\r
+       String ownees(L"");\r
+\r
+       for (int i = 0; i < GetOwneeCount(); ++i)\r
+       {\r
+               String ownee(L"");\r
+               _Window* pOwnee = GetOwnee(i);\r
+               if (pOwnee)\r
+               {\r
+                       ownee.Format(LOG_LEN_MAX, L"0x%x ", pOwnee);\r
+                       ownees.Append(ownee);\r
+               }\r
+       }\r
+\r
+       if (!ownees.IsEmpty())\r
+       {\r
+               SysLog(NID_UI, "%ls Ownees(%ls)", indent.GetPointer(), ownees.GetPointer());\r
+       }\r
+\r
+       _VisualElementImpl* pVisualElementImpl = _VisualElementImpl::GetInstance(*__pVisualElement);\r
+\r
+       SysLog(NID_UI, "%ls _VisualElement(0x%x) _VisualElementImpl(0x%x) VisualElementContentProvider(0x%x) VisualElementEventListener(0x%x)",\r
+               indent.GetPointer(), __pVisualElement, pVisualElementImpl, __pVisualElementContentProvider, __pVisualElementEventListener);\r
+\r
+       // Layout\r
+       SysLog(NID_UI, "%ls LayoutItemHandler(0x%x) PortraitLayout(0x%x) LandscapeLayout(0x%x) LayoutContainer(0x%x)",\r
+               indent.GetPointer(), __pLayoutItemHandler, __pPortraitLayout, __pLandscapeLayout, __pLayoutContainer);\r
+\r
+       // Derived class\r
+       String description = GetDescription();\r
+       if (!description.IsEmpty())\r
+       {\r
+               SysLog(NID_UI, "%ls %ls", indent.GetPointer(), description.GetPointer());\r
+       }\r
+\r
+       // Print Gesture List\r
+       IListT<_TouchGestureDetector*>* pGestureList = GetGestureDetectorList();\r
+       SysTryReturn(NID_UI, pGestureList, 0, E_SYSTEM, "[E_SYSTEM] System error occurred.");\r
+\r
+       IEnumeratorT<_TouchGestureDetector*>* pEnumerator = pGestureList->GetEnumeratorN();\r
+       SysTryReturn(NID_UI, pEnumerator, 0, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");\r
+\r
+       while (pEnumerator->MoveNext() == E_SUCCESS)\r
+       {\r
+               _TouchGestureDetector* pGestureDetector = null;\r
+               pEnumerator->GetCurrent(pGestureDetector);\r
+               if (pGestureDetector)\r
+               {\r
+                       SysLog(NID_UI, "%ls AddedGesture : %ls", indent.GetPointer(), pGestureDetector->GetDescription().GetPointer());\r
+               }\r
+       }\r
+\r
+       delete pEnumerator;\r
+\r
+       // Print Started Gesture List\r
+       IMapEnumeratorT <_TouchGestureDetector*, _TouchGestureDetectorState>* pStartedGestureEnumerator = GetStartedGestureDetectorEnumeratorN();\r
+       SysTryReturn(NID_UI, pStartedGestureEnumerator, 0, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");\r
+\r
+       while (pStartedGestureEnumerator->MoveNext() == E_SUCCESS)\r
+       {\r
+               _TouchGestureDetector* pStartedGestureDetector = null;\r
+               pStartedGestureEnumerator->GetKey(pStartedGestureDetector);\r
+               if (pStartedGestureDetector)\r
+               {\r
+                       SysLog(NID_UI, "%ls StartedGesture : %ls", indent.GetPointer(), pStartedGestureDetector->GetDescription().GetPointer());\r
+               }\r
+       }\r
+\r
+       delete pStartedGestureEnumerator;\r
+\r
+       // Print VE and Evas\r
+       switch (level)\r
+       {\r
+       case PRINT_CONTROL_VE:\r
+               _VeDebug::DumpVeTree(pVisualElementImpl, 0);\r
+               break;\r
+\r
+       case PRINT_CONTROL_EVAS:\r
+               _VeDebug::DumpEvasTree(pVisualElementImpl, 0);\r
+               break;\r
+\r
+       case PRINT_CONTROL_VE_EVAS:\r
+               _VeDebug::DumpVeTree(pVisualElementImpl, 0);\r
+               _VeDebug::DumpEvasTree(pVisualElementImpl, 0);\r
+               break;\r
+\r
+       default:\r
+               break;\r
+       }\r
+\r
+       static int totalCount = 0;\r
+\r
+       if (depth == 0)\r
+       {\r
+               totalCount = 0;\r
+       }\r
+\r
+       if (printChildren)\r
+       {\r
+               depth ++;\r
+\r
+               int count = GetChildCount();\r
+               totalCount += count;\r
+\r
+               for (int i = count - 1; i >= 0; --i)\r
+               {\r
+                       _Control* pChild = GetChild(i);\r
+                       if (pChild)\r
+                       {\r
+                               pChild->PrintDescription(printChildren, depth, level);\r
+                       }\r
+               }\r
+       }\r
+\r
+       return totalCount;\r
+}\r
+\r
+_ITouchEventPreviewer*\r
+_Control::GetEventPreviewer(_IntToType<_UI_EVENT_TOUCH>) const\r
+{\r
+       return __pTouchEventPreviewer;\r
+}\r
+\r
+_IKeyEventPreviewer*\r
+_Control::GetEventPreviewer(_IntToType<_UI_EVENT_KEY>) const\r
+{\r
+       return __pKeyEventPreviewer;\r
+}\r
+\r
+_INotificationEventPreviewer*\r
+_Control::GetEventPreviewer(_IntToType<_UI_EVENT_NOTIFICAITON>) const\r
+{\r
+       return __pNotificationEventPreviewer;\r
+}\r
+\r
+_IKeyEventListener*\r
+_Control::GetEventListener(_IntToType<_UI_EVENT_KEY>) const\r
+{\r
+       return __pKeyEventListener;\r
+}\r
+\r
+_IFocusEventListener*\r
+_Control::GetEventListener(_IntToType<_UI_EVENT_FOCUS>) const\r
+{\r
+       return __pFocusEventListener;\r
+}\r
+\r
+_INotificationEventListener*\r
+_Control::GetEventListener(_IntToType<_UI_EVENT_NOTIFICAITON>) const\r
+{\r
+       return __pNotificationEventListener;\r
+}\r
+\r
+void\r
+_Control::SetEventPreviewer(_IntToType<_UI_EVENT_TOUCH>, _ITouchEventPreviewer* pPreviewer)\r
+{\r
+       __pTouchEventPreviewer = pPreviewer;\r
+}\r
+\r
+void\r
+_Control::SetEventPreviewer(_IntToType<_UI_EVENT_KEY>, _IKeyEventPreviewer* pPreviewer)\r
+{\r
+       __pKeyEventPreviewer = pPreviewer;\r
+}\r
+\r
+void\r
+_Control::SetEventPreviewer(_IntToType<_UI_EVENT_NOTIFICAITON>, _INotificationEventPreviewer* pPreviewer)\r
+{\r
+       __pNotificationEventPreviewer = pPreviewer;\r
+}\r
+\r
+void\r
+_Control::SetEventListener(_IntToType<_UI_EVENT_FOCUS>, _IFocusEventListener* pListener)\r
+{\r
+       __pFocusEventListener = pListener;\r
+}\r
+\r
+void\r
+_Control::SetEventListener(_IntToType<_UI_EVENT_NOTIFICAITON>, _INotificationEventListener* pListener)\r
+{\r
+       __pNotificationEventListener = pListener;\r
+}\r
+\r
+bool\r
+_Control::IsDragEnabled(void) const\r
+{\r
+       return __dragEnabled;\r
+}\r
+\r
+bool\r
+_Control::IsDropEnabled(void) const\r
+{\r
+       return __dropEnabled;\r
+}\r
+\r
+void\r
+_Control::SetDragEnabled(bool enabled)\r
+{\r
+       __dragEnabled = enabled;\r
+}\r
+\r
+void\r
+_Control::SetDropEnabled(bool enabled)\r
+{\r
+       __dropEnabled = enabled;\r
+}\r
+\r
+void\r
+_Control::SetTouchPressThreshold(float distance)\r
+{\r
+       __touchMoveAllowance = static_cast<int>(distance * __screenDpi);\r
+}\r
+\r
+float\r
+_Control::GetTouchPressThreshold(void) const\r
+{\r
+       return static_cast<int>(__touchMoveAllowance /__screenDpi);\r
+}\r
+\r
+int\r
+_Control::GetTouchPressThresholdPixel(void) const\r
+{\r
+       return __touchMoveAllowance;\r
+}\r
+\r
+void\r
+_Control::SetChangingEventTarget(bool isChangingEventTarget)\r
+{\r
+       __isChangingEventTarget = isChangingEventTarget;\r
+}\r
+\r
+bool\r
+_Control::GetChangingEventTarget(void) const\r
+{\r
+       return __isChangingEventTarget;\r
+}\r
+\r
+void\r
+_Control::SetEventEnableState(bool enableState)\r
+{\r
+        __isEventEnableState = enableState;\r
+}\r
+\r
+bool\r
+_Control::IsEventEnabled(void) const\r
+{\r
+        return __isEventEnableState;\r
+}\r
+\r
+void\r
+_Control::SetPreviousFocus(_Control* pPreviousFocus)\r
+{\r
+       __pPreviousFocus = pPreviousFocus;\r
+\r
+}\r
+void\r
+_Control::SetNextFocus(_Control* pNextFocus)\r
+{\r
+       __pNextFocus = pNextFocus;\r
+}\r
+_Control*\r
+_Control::GetPreviousFocus(void) const\r
+{\r
+       return  __pPreviousFocus;\r
+}\r
+_Control*\r
+_Control::GetNextFocus(void) const\r
+{\r
+       return __pNextFocus;\r
+}\r
+\r
+void\r
+_Control::OnDrawFocus(void)\r
+{\r
+    unique_ptr<VisualElement, _VisualElementDeleter> pFocusVisualElement (new (std::nothrow) VisualElement, _VisualElementDeleter());\r
+       SysTryReturn(NID_UI, pFocusVisualElement, , E_SYSTEM, "[E_SYSTEM] System error");\r
+\r
+       result r = pFocusVisualElement->Construct();\r
+       SysTryReturn(NID_UI, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] System error");\r
+\r
+       __pFocusVisualElement.reset(pFocusVisualElement.release());\r
+       __pFocusVisualElement->SetImplicitAnimationEnabled(false);\r
+       __pFocusVisualElement->SetShowState(true);\r
+\r
+    _VisualElement* pControVisualElement = this->GetVisualElement();\r
+       pControVisualElement->AttachChild(*__pFocusVisualElement);\r
+\r
+       if (__pFocusVisualElement)\r
+       {\r
+               Rectangle rectangle = this->GetBounds();\r
+               __pFocusVisualElement->SetBounds(FloatRectangle(0, 0, rectangle.width, rectangle.height));\r
+               unique_ptr<Canvas>pCanvas(__pFocusVisualElement->GetCanvasN());\r
+               pCanvas->SetBackgroundColor(0x55555555);\r
+               pCanvas->Clear();\r
+               Bitmap* pBitmap = null;\r
+               result r = GET_BITMAP_CONFIG_N(FOCUSUI::FOCUS, BITMAP_PIXEL_FORMAT_ARGB8888, pBitmap);\r
+\r
+               if (r == E_SUCCESS)\r
+               {\r
+                       if (_BitmapImpl::CheckNinePatchedBitmapStrictly(*pBitmap))\r
+                       {\r
+                               r = pCanvas->DrawNinePatchedBitmap(FloatRectangle(0.0f, 0.0f, rectangle.width, rectangle.height), *pBitmap);\r
+                       }\r
+                       else\r
+                       {\r
+                               r = pCanvas->DrawBitmap(FloatRectangle(0.0f, 0.0f, rectangle.width, rectangle.height), *pBitmap);\r
+                       }\r
+               }\r
+               __pFocusVisualElement->SetShowState(true);\r
+       }\r
+}\r
+\r
+void\r
+_Control::OnChildControlFocusMoved(const _Control& control)\r
+{\r
+}\r
+\r
+bool\r
+_Control::IsChildControlFocusManage(void) const\r
+{\r
+       return false;\r
+}\r
+\r
+result\r
+_Control::SetFontFromFile(const String& fileName)\r
+{\r
+       result r = E_SUCCESS;\r
+\r
+       if (__fontFileName.Equals(fileName))\r
+       {\r
+               return E_SUCCESS;\r
+       }\r
+\r
+       __isControlFontChanged = true;\r
+       __fontFileName = fileName;\r
+       __fontName.Clear();\r
+\r
+       Font* pFont = GetFallbackFont();\r
+\r
+       if (pFont == null)\r
+       {\r
+               r = GetLastResult();\r
+               SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
+       }\r
+       return E_SUCCESS;\r
+}\r
+\r
+Tizen::Base::String\r
+_Control::GetFontFile(void) const\r
+{\r
+       return __fontFileName;\r
+}\r
+void\r
+_Control::DrawFocus(void)\r
+{\r
+       _IControlDelegate& delegate = GetControlDelegate();\r
+       delegate.OnDrawFocus();\r
+}\r
+\r
+void\r
+_Control::MakeFocusList(const _Control* pControl, IListT<_Control*>*  pFocusControlList) const\r
+{\r
+       int childCount = pControl->GetChildCount();\r
+       for(int i = 0; i < childCount; i++)\r
+       {\r
+               _Control* pChildControl = pControl->GetChild(i);\r
+               Rectangle rect = pChildControl->GetAbsoluteBounds();\r
+               unique_ptr<IEnumeratorT<_Control*> > pEnum (pFocusControlList->GetEnumeratorN());\r
+               int index = 0;\r
+               while (pEnum->MoveNext() == E_SUCCESS)\r
+               {\r
+                       _Control* pEnumeratorControl = null;\r
+                       pEnum->GetCurrent(pEnumeratorControl);\r
+                       if (pEnumeratorControl != null)\r
+                       {\r
+                               Rectangle enumeratorRect = pEnumeratorControl->GetAbsoluteBounds();\r
+                               if(enumeratorRect.y > rect.y)\r
+                               {\r
+                                       break;\r
+                               }\r
+                               else if (enumeratorRect.y == rect.y)\r
+                               {\r
+                                       if(enumeratorRect.x > rect.x)\r
+                                       {\r
+                                               break;\r
+                                       }\r
+                               }\r
+\r
+                               index ++;\r
+                       }\r
+               }\r
+               pFocusControlList->InsertAt(pChildControl, index);\r
+       }\r
+}\r
+\r
+void\r
+_Control::MakeChildContainerFocusList(const _Control* pControl, int startIndex , IListT<_Control*>*  pFocusControlList) const\r
+{\r
+       unique_ptr<IListT<_Control*> > pTempList (new (std::nothrow) ArrayListT<_Control*>);\r
+       SysTryReturnVoidResult(NID_UI_CTRL, pTempList, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory is insufficient.");\r
+       MakeFocusList(pControl, pTempList.get());\r
+\r
+       unique_ptr<IEnumeratorT<_Control*> > pTempEnum(pTempList->GetEnumeratorN());\r
+       int index = ++startIndex;\r
+       while (pTempEnum->MoveNext() == E_SUCCESS)\r
+       {\r
+               _Control* pEnumeratorControl = null;\r
+               pTempEnum->GetCurrent(pEnumeratorControl);\r
+               pFocusControlList->InsertAt(pEnumeratorControl, index);\r
+               index ++;\r
+       }\r
+}\r
+\r
+Tizen::Base::Collection::IListT<_Control*>*\r
+_Control::GetFocusListN(void) const\r
+{\r
+       unique_ptr<IListT<_Control*> > pControlFocusList (new (std::nothrow) ArrayListT<_Control*>);\r
+       SysTryReturn(NID_UI_CTRL, pControlFocusList, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");\r
+       MakeFocusList(this, pControlFocusList.get());\r
+\r
+       unique_ptr<IEnumeratorT<_Control*> > pEnum(pControlFocusList->GetEnumeratorN());\r
+       SysTryReturn(NID_UI_CTRL, pEnum, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");\r
+       int i =0;\r
+       int nextContainerIndex = -1;\r
+       while (pEnum->MoveNext() == E_SUCCESS)\r
+       {\r
+               _Control* pEnumeratorControl = null;\r
+               pEnum->GetCurrent(pEnumeratorControl);\r
+               _ContainerImpl* pTempContainerImpl = dynamic_cast<_ContainerImpl*>(static_cast <_ControlImpl* >(pEnumeratorControl->GetUserData()));\r
+\r
+               if (pTempContainerImpl != null && (nextContainerIndex < i))\r
+               {\r
+                       if (pEnumeratorControl->IsChildControlFocusManage() == false)\r
+                       {\r
+                               MakeChildContainerFocusList(pEnumeratorControl, i, pControlFocusList.get());\r
+                               nextContainerIndex = i;\r
+                               pEnum.reset(pControlFocusList->GetEnumeratorN());\r
+                               i = -1;\r
+                       }\r
+               }\r
+               i++;\r
+       }\r
+       return pControlFocusList.release();\r
+}\r
+}} // Tizen::Ui\r
index 555c213..2a9abea 100755 (executable)
@@ -327,6 +327,7 @@ result
 _ControlImpl::Destroy(void)
 {
        result r = E_SUCCESS;
+
        _ContainerImpl* pParent = GetParent();
        if (pParent)
        {
@@ -335,7 +336,9 @@ _ControlImpl::Destroy(void)
        }
        else
        {
-               Dispose(true);
+               Control* pControl= &GetPublic();
+               delete pControl;
+               pControl = null;
        }
 
        return r;
index 6f69795..afc8919 100644 (file)
@@ -383,12 +383,12 @@ _WindowImpl::Destroy(void)
                _ControlImpl* pImpl = _ControlImpl::GetInstance(*pOwner);
                pImpl->GetCore().DetachOwnee(GetCore());
        }
-       else
-       {
-               GetCore().GetControlDelegate().OnDetachingFromMainTree();
-       }
+       GetCore().GetControlDelegate().OnDetachingFromMainTree();
        RemoveAllChildren(true);
-       delete &GetPublic();
+       Window* pWindow = &GetPublic();
+       delete pWindow;
+       pWindow = null;
+
        return r;
 }
 
old mode 100644 (file)
new mode 100755 (executable)
index 28d04dc..5f4bda2
@@ -25,6 +25,7 @@
 #ifndef _FUI_INTERNAL_CONTAINER_IMPL_H_
 #define _FUI_INTERNAL_CONTAINER_IMPL_H_
 
+#include <FBaseColArrayList.h>
 #include <FUiContainer.h>
 #include "FUi_ControlImpl.h"
 #include "FUi_SharedPtr.h"
@@ -51,9 +52,11 @@ public:
        // [ToDo] Must consider transforOwnership flags.
        virtual result Destroy(void);
        result AddChild(_ControlImpl* pChild, bool transferOwnership = true);
+       result RemoveControl(_ControlImpl* pChild, bool deallocate = true);
        result RemoveChild(_ControlImpl* pChild, bool deallocate = true);
+       result RemoveControl(int index);
        result RemoveChild(int index);
-       void DeleteAllChildren(_ContainerImpl* pChild, bool detachSystemChild = true);
+       void DeleteAllChildren(_ContainerImpl* pChild, bool detachSystemChild = true, Tizen::Base::Collection::ArrayList* pChildrenList = null);
        void RemoveAllChildren(bool detachSystemChild = true);
        result MoveChildToTop(const _ControlImpl& child);
        result MoveChildBefore(const _ControlImpl& targetChild, const _ControlImpl& child);
index b0e7882..03b29bf 100755 (executable)
@@ -286,7 +286,7 @@ public:
        result InsertChildAfter(const _Control& targetChild, _Control& child);
        result InsertChildBefore(const _Control& targetChild, _Control& child);
        result DetachChild(_Control& child);
-       void DetachAllChildren(bool detachSystemChild = true);
+       void DetachAllChildren(bool detachSystemChild = true, bool recursive = false);
        result MoveChildToTop(const _Control& child);
        result MoveChildToBottom(const _Control& child);
        result MoveChildAfter(const _Control& targetChild, const _Control& child);