From 19db52c14aef5b1964d04a1e4752fc8dca33977e Mon Sep 17 00:00:00 2001 From: "jaewon7.cho" Date: Tue, 26 Mar 2013 15:26:25 +0900 Subject: [PATCH] Change deleting order of Controls Change-Id: I69e1ec98d0c1ba49d8b829afae199be4634d8726 Signed-off-by: jaewon7.cho --- src/ui/FUi_ContainerImpl.cpp | 53 ++++++++++++++++++++++++++++++++++++++++-- src/ui/inc/FUi_ContainerImpl.h | 1 + 2 files changed, 52 insertions(+), 2 deletions(-) diff --git a/src/ui/FUi_ContainerImpl.cpp b/src/ui/FUi_ContainerImpl.cpp index b4c13a0..f7ff60e 100644 --- a/src/ui/FUi_ContainerImpl.cpp +++ b/src/ui/FUi_ContainerImpl.cpp @@ -246,6 +246,54 @@ _ContainerImpl::RemoveChild(int index) } void +_ContainerImpl::DeleteAllChildren(_ContainerImpl* pChild, bool detachSystemChild) +{ + ArrayList* pList = static_cast (pChild->GetChildrenPublic()); + int count = pList->GetCount(); + for (int index = 0; index < count; index++) + { + Container* pContainer = dynamic_cast (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 (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); } } diff --git a/src/ui/inc/FUi_ContainerImpl.h b/src/ui/inc/FUi_ContainerImpl.h index fb82ca1..28d04dc 100644 --- a/src/ui/inc/FUi_ContainerImpl.h +++ b/src/ui/inc/FUi_ContainerImpl.h @@ -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); -- 2.7.4