-//
-// 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