Change deleting order of Controls
authorjaewon7.cho <jaewon7.cho@samsung.com>
Tue, 26 Mar 2013 06:26:25 +0000 (15:26 +0900)
committerjaewon7.cho <jaewon7.cho@samsung.com>
Tue, 26 Mar 2013 09:53:01 +0000 (18:53 +0900)
Change-Id: I69e1ec98d0c1ba49d8b829afae199be4634d8726
Signed-off-by: jaewon7.cho <jaewon7.cho@samsung.com>
src/ui/FUi_ContainerImpl.cpp
src/ui/inc/FUi_ContainerImpl.h

index b4c13a0..f7ff60e 100644 (file)
@@ -246,6 +246,54 @@ _ContainerImpl::RemoveChild(int index)
 }
 
 void
+_ContainerImpl::DeleteAllChildren(_ContainerImpl* pChild, bool detachSystemChild)
+{
+       ArrayList* pList = static_cast <ArrayList*>(pChild->GetChildrenPublic());
+       int count = pList->GetCount();
+       for (int index = 0; index < count; 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)
+               {
+                       _ContainerImpl* pContainerImpl = _ContainerImpl::GetInstance(*pContainer);
+                       DeleteAllChildren(pContainerImpl, detachSystemChild);
+                       pContainer->Destroy();
+               }
+               else
+               {
+                       Control* pControl = static_cast <Control*>(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;
+                       }
+                       _ControlImpl* pControlImpl = _ControlImpl::GetInstance(*pControl);
+                       if (pControlImpl)
+                       {
+                               if (detachSystemChild || pControlImpl->GetCore().GetArea() != _CONTROL_AREA_SYSTEM)
+                               {
+                                       pControl->Destroy();
+                               }
+                       }
+               }
+       }
+}
+
+void
 _ContainerImpl::RemoveAllChildren(bool detachSystemChild)
 {
        ClearLastResult();
@@ -253,10 +301,11 @@ _ContainerImpl::RemoveAllChildren(bool detachSystemChild)
 
        GetCore().DetachAllChildren(detachSystemChild);
        SysAssert(GetLastResult() == E_SUCCESS);
+       DeleteAllChildren(this, detachSystemChild);
 
        if (detachSystemChild)
        {
-               __controlPublics.RemoveAll(true);
+               __controlPublics.RemoveAll(false);
        }
        else
        {
@@ -272,7 +321,7 @@ _ContainerImpl::RemoveAllChildren(bool detachSystemChild)
                                continue;
                        }
 
-                       r = __controlPublics.Remove(pControl->GetPublic(), true);
+                       r = __controlPublics.Remove(pControl->GetPublic(), false);
                        SysAssert(r == E_SUCCESS);
                }
        }
index fb82ca1..28d04dc 100644 (file)
@@ -53,6 +53,7 @@ public:
        result AddChild(_ControlImpl* pChild, bool transferOwnership = true);
        result RemoveChild(_ControlImpl* pChild, bool deallocate = true);
        result RemoveChild(int index);
+       void DeleteAllChildren(_ContainerImpl* pChild, bool detachSystemChild = true);
        void RemoveAllChildren(bool detachSystemChild = true);
        result MoveChildToTop(const _ControlImpl& child);
        result MoveChildBefore(const _ControlImpl& targetChild, const _ControlImpl& child);