From: jaewon7.cho Date: Tue, 26 Mar 2013 06:26:25 +0000 (+0900) Subject: Change deleting order of Controls X-Git-Tag: accepted/tizen_2.1/20130425.033138~716 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=19db52c14aef5b1964d04a1e4752fc8dca33977e;p=platform%2Fframework%2Fnative%2Fuifw.git Change deleting order of Controls Change-Id: I69e1ec98d0c1ba49d8b829afae199be4634d8726 Signed-off-by: jaewon7.cho --- 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);