2 // Open Service Platform
3 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
5 // Licensed under the Flora License, Version 1.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://floralicense.org/license/
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an AS IS BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
19 * @file FUiAnimVisualElement.cpp
20 * @brief This file contains implementation of VisualElement class
22 * This file contains implementation VisualElement class.
25 #include <FBaseString.h>
26 #include <FGrpCanvas.h>
27 #include <FUiAnimVisualElement.h>
28 #include <FUiAnimVisualElementSurface.h>
29 #include <FUiAnimVisualElementAnimation.h>
31 #include "FUiAnim_VisualElementAnimationImpl.h"
32 #include "FUiAnim_VisualElementImpl.h"
34 #include "FUiAnim_Debug.h"
36 #define CHECK_NOT_CONSTRUCTED \
37 SysAssertf(_pVisualElementImpl->__pSharedData == null, "Already constructed! Calling Construct() twice or more on a same instance is not allowed for this class.");
39 #define CHECK_CONSTRUCTED \
40 SysAssertf(_pVisualElementImpl->__pSharedData != null, "Not yet constructed! Construct() should be called before use.");
42 #define CHECK_PARAMETER_CONSTRUCTED(element) \
43 SysAssertf((element)._pVisualElementImpl && (element)._pVisualElementImpl->__pSharedData, "Not yet constructed! Construct() should be called before use.");
45 namespace Tizen { namespace Ui { namespace Animations
48 using namespace Tizen;
49 using namespace Tizen::Base;
50 using namespace Tizen::Base::Collection;
51 using namespace Tizen::Graphics;
53 VisualElement::VisualElement(void)
54 : _pVisualElementImpl(null)
56 _pVisualElementImpl = new (std::nothrow) _VisualElementImpl(*this);
59 VisualElement::VisualElement(const VisualElement& rhs)
60 : _pVisualElementImpl(null)
62 CHECK_PARAMETER_CONSTRUCTED(rhs);
64 _pVisualElementImpl = new (std::nothrow) _VisualElementImpl(*this, *rhs._pVisualElementImpl);
68 VisualElement::CloneN(void) const
72 VisualElement* pCloned = new (std::nothrow) VisualElement(*this);
73 SysTryReturn(NID_UI_ANIM, pCloned, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
78 VisualElement::~VisualElement(void)
80 if (_pVisualElementImpl)
82 SysLogException(NID_UI_ANIM, E_INVALID_STATE, "[E_INVALID_STATE] should be called Destroy() for deallocating the VisualElement.");
83 _pVisualElementImpl->Destroy();
84 _pVisualElementImpl = null;
89 VisualElement::Construct(void)
91 SysTryReturnResult(NID_UI_ANIM, _pVisualElementImpl, E_OUT_OF_MEMORY, "Memory allocation failed.");
93 SysAssertf(_pVisualElementImpl->__pSharedData == null, "Already constructed! Calling Construct() twice or more on a same instance is not allowed for this class.");
96 VisualElement* pClone = null;
98 r = _pVisualElementImpl->Construct();
99 SysTryCatch(NID_UI_ANIM, r == E_SUCCESS, , r, "[%s] Failed to construct VisualElement instance.", GetErrorMessage(r));
102 SysTryReturnResult(NID_UI_ANIM, pClone, E_INVALID_STATE, "Failed to create the presentation.");
103 SysTryCatch(NID_UI_ANIM, pClone->_pVisualElementImpl, r = E_INVALID_STATE, E_INVALID_STATE, "[E_INVALID_STATE] Presentation is invalid.");
105 pClone->_pVisualElementImpl->__pSharedData = _pVisualElementImpl->__pSharedData;
106 pClone->_pVisualElementImpl->__pSharedData->AddRef();
107 _pVisualElementImpl->__pSharedData->invalidatedNativeProps = _VisualElementImpl::HIERARCHY_PROPERTY_MASK;
109 pClone->_pVisualElementImpl->__pModel = _pVisualElementImpl;
110 pClone->_pVisualElementImpl->__pPresentation = pClone->_pVisualElementImpl;
112 _pVisualElementImpl->__pModel = _pVisualElementImpl;
113 _pVisualElementImpl->__pPresentation = pClone->_pVisualElementImpl;
117 // Exceptional case for constructed-callback:
118 // This callback is invoked inside public-class, not inside impl-class because 'Construct' method will not be called for cloned(Presentation) VE
120 // This is model object, not presentation object.
121 _pVisualElementImpl->InvokeOnConstructed();
122 //pClone->_pVisualElementImpl->InvokeOnConstructed();
133 VisualElement::Destroy(void)
135 if (likely(_pVisualElementImpl))
137 if (likely(!_pVisualElementImpl->__isDestroying))
139 _pVisualElementImpl->Destroy();
140 _pVisualElementImpl = null;
152 VisualElement::GetProperty(const Tizen::Base::String& property) const
156 return _pVisualElementImpl->InvokeOnGetPropertyRequested(property);
160 VisualElement::OnGetPropertyRequested(const Tizen::Base::String& property) const
164 return _pVisualElementImpl->GetProperty(property);
168 VisualElement::SetProperty(const Tizen::Base::String& property, const Variant& value)
172 return _pVisualElementImpl->InvokeOnSetPropertyRequested(property, value);
176 VisualElement::OnSetPropertyRequested(const Tizen::Base::String& property, const Variant& value)
179 result r = E_SUCCESS;
181 r =_pVisualElementImpl->SetProperty(property, value);
182 if(r == E_KEY_NOT_FOUND)
184 r = _pVisualElementImpl->UpdatePresentationWhenCustomPropertyChanged(property, value);
190 VisualElement::SetZOrderGroup(int zOrderGroup)
194 SysTryReturnResult(NID_UI_ANIM, zOrderGroup >= Z_ORDER_GROUP_LOWEST, E_OUT_OF_RANGE, "zOrderGroup is less than Z_ORDER_GROUP_LOWEST");
195 SysTryReturnResult(NID_UI_ANIM, zOrderGroup <= Z_ORDER_GROUP_HIGHEST, E_OUT_OF_RANGE, "zOrderGroup is greater than Z_ORDER_GROUP_HIGHEST");
197 return _pVisualElementImpl->SetZOrderGroup(zOrderGroup);
201 VisualElement::GetZOrderGroup(void) const
205 return _pVisualElementImpl->GetZOrderGroup();
209 VisualElement::IsRedrawOnResizeEnabled(void) const
213 return _pVisualElementImpl->GetRedrawOnResizeEnabled();
217 VisualElement::SetRedrawOnResizeEnabled(bool enabled)
221 _pVisualElementImpl->SetRedrawOnResizeEnabled(enabled);
225 VisualElement::GetBounds(void) const
229 return _pVisualElementImpl->GetBounds();
233 VisualElement::SetBounds(const FloatRectangle& bounds)
237 return _pVisualElementImpl->SetBounds(bounds);
241 VisualElement::GetZPosition(void) const
245 return _pVisualElementImpl->GetZPosition();
249 VisualElement::SetZPosition(float zPosition)
253 _pVisualElementImpl->SetZPosition(zPosition);
257 VisualElement::IsVisible(void) const
261 return _pVisualElementImpl->IsVisible();
265 VisualElement::GetShowState(void) const
269 return _pVisualElementImpl->GetShowState();
273 VisualElement::SetShowState(bool show)
277 _pVisualElementImpl->SetShowState(show);
281 VisualElement::GetOpacity(void) const
285 return _pVisualElementImpl->GetOpacity();
289 VisualElement::SetOpacity(float opacity)
293 _pVisualElementImpl->SetOpacity(opacity);
296 Tizen::Graphics::FloatMatrix4
297 VisualElement::GetTransformMatrix(void) const
301 return _pVisualElementImpl->GetTransformMatrix();
305 VisualElement::SetTransformMatrix(const Tizen::Graphics::FloatMatrix4& transform)
309 return _pVisualElementImpl->SetTransformMatrix(transform);
312 Tizen::Graphics::FloatMatrix4
313 VisualElement::GetChildrenTransformMatrix(void) const
317 return _pVisualElementImpl->GetChildrenTransformMatrix();
321 VisualElement::SetChildrenTransformMatrix(const Tizen::Graphics::FloatMatrix4& transform)
325 return _pVisualElementImpl->SetChildrenTransformMatrix(transform);
329 VisualElement::GetAnchor(void) const
333 return _pVisualElementImpl->GetAnchor();
337 VisualElement::SetAnchor(const FloatPoint& anchor)
341 _pVisualElementImpl->SetAnchor(anchor);
345 VisualElement::GetAnchorZ(void) const
349 return _pVisualElementImpl->GetAnchorZ();
353 VisualElement::SetAnchorZ(float anchorZ)
357 _pVisualElementImpl->SetAnchorZ(anchorZ);
362 VisualElement::GetParent(void) const
366 if (_pVisualElementImpl->__isHidingParent)
371 if (_pVisualElementImpl->GetParent() && !_pVisualElementImpl->GetParent()->__isInternal)
373 return _pVisualElementImpl->GetParent()->GetPublic();
381 Tizen::Base::Collection::IList*
382 VisualElement::GetChildrenN(void) const
386 return _pVisualElementImpl->GetPublicChildrenN();
390 VisualElement::GetChildrenCount(void) const
394 return _pVisualElementImpl->GetChildrenCount();
398 VisualElement::IsChildOf(const VisualElement& element) const
401 CHECK_PARAMETER_CONSTRUCTED(element);
403 return _pVisualElementImpl->IsChildOf(*element._pVisualElementImpl);
407 VisualElement::AttachChild(const VisualElement& child)
410 CHECK_PARAMETER_CONSTRUCTED(child);
412 return _pVisualElementImpl->AddChild(*child._pVisualElementImpl);
416 VisualElement::InsertChild(const VisualElement& child, const VisualElement* pReference, bool above)
419 CHECK_PARAMETER_CONSTRUCTED(child);
421 _VisualElementImpl* pRefInternal = null;
424 CHECK_PARAMETER_CONSTRUCTED(*pReference);
425 pRefInternal = pReference->_pVisualElementImpl;
428 return _pVisualElementImpl->InsertChild(*child._pVisualElementImpl, pRefInternal, above);
432 VisualElement::DetachChild(const VisualElement& child)
435 CHECK_PARAMETER_CONSTRUCTED(child);
437 _VisualElementImpl* pInternal = null;
439 pInternal = child._pVisualElementImpl;
441 return _pVisualElementImpl->RemoveChild(*pInternal, false);
445 VisualElement::ChangeZOrder(const VisualElement* pReference, bool above)
449 _VisualElementImpl* pRefInternal = null;
452 CHECK_PARAMETER_CONSTRUCTED(*pReference);
453 pRefInternal = pReference->_pVisualElementImpl;
456 return _pVisualElementImpl->SetZOrder(pRefInternal, above);
460 VisualElement::SetAnimationProvider(IVisualElementAnimationProvider* pProvider)
464 return _pVisualElementImpl->SetAnimationProvider(pProvider);
468 IVisualElementAnimationProvider*
469 VisualElement::GetAnimationProvider(void) const
473 return _pVisualElementImpl->GetAnimationProvider();
477 VisualElement::SetContentProvider(IVisualElementContentProvider* pProvider)
481 return _pVisualElementImpl->SetContentProvider(pProvider);
484 IVisualElementContentProvider*
485 VisualElement::GetContentProvider(void) const
489 return _pVisualElementImpl->GetContentProvider();
494 VisualElement::SetVisualElementEventListener(IVisualElementEventListener* pListener)
498 return _pVisualElementImpl->SetVisualElementEventListener(pListener);
501 IVisualElementEventListener*
502 VisualElement::GetVisualElementEventListener(void) const
506 return _pVisualElementImpl->GetVisualElementEventListener();
511 VisualElement::GetName(void) const
515 return _pVisualElementImpl->GetName();
519 VisualElement::SetName(const Tizen::Base::String& name)
523 _pVisualElementImpl->SetName(name);
527 VisualElement::SetUserData(void* pUserData)
531 _pVisualElementImpl->SetUserData(pUserData);
535 VisualElement::GetUserData(void) const
539 return _pVisualElementImpl->GetUserData();
543 VisualElement::SetSurface(VisualElementSurface* pSurface)
547 return _pVisualElementImpl->SetSurface(pSurface);
550 VisualElementSurface*
551 VisualElement::GetSurfaceN(void) const
555 return _pVisualElementImpl->GetSurfaceN();
559 VisualElement::SetRenderOperation(RenderOperation renderOperation)
563 return _pVisualElementImpl->SetRenderOperation(renderOperation);
566 VisualElement::RenderOperation
567 VisualElement::GetRenderOperation(void) const
571 return _pVisualElementImpl->GetRenderOperation();
575 VisualElement::GetChild(const Tizen::Base::String& name, bool searchDescendants) const
579 _VisualElementImpl* pChild = _pVisualElementImpl->GetChild(name, searchDescendants);
582 return pChild->GetPublic();
589 VisualElement::InvalidateRectangle(const FloatRectangle* pRectangle)
593 return _pVisualElementImpl->InvalidateRectangle(pRectangle);
597 VisualElement::GetUpdateRectangle(void) const
601 return _pVisualElementImpl->GetUpdateRectangle();
605 VisualElement::Draw(void)
609 return _pVisualElementImpl->Draw();
613 VisualElement::GetCanvasN(void) const
617 return _pVisualElementImpl->GetCanvasN();
621 VisualElement::GetCanvasN(const Tizen::Graphics::Rectangle& bounds) const
625 return _pVisualElementImpl->GetCanvasN(bounds);
629 VisualElement::GetChildAt(const FloatPoint& point) const
633 _VisualElementImpl* pChild = _pVisualElementImpl->GetChildAt(point);
636 return pChild->GetPublic();
643 VisualElement::IsClipChildrenEnabled(void) const
647 return _pVisualElementImpl->IsClipChildrenEnabled();
651 VisualElement::SetClipChildrenEnabled(bool clipChildren)
655 _pVisualElementImpl->SetClipChildrenEnabled(clipChildren);
659 VisualElement::ConvertCoordinates(FloatPoint& point, const VisualElement* pFromVisualElement) const
663 _VisualElementImpl* pFrom = null;
665 if (pFromVisualElement)
667 CHECK_PARAMETER_CONSTRUCTED(*pFromVisualElement);
668 pFrom = pFromVisualElement->_pVisualElementImpl;
671 return _pVisualElementImpl->ConvertCoordinates(point, pFrom);
675 VisualElement::ConvertCoordinates(FloatRectangle& rectangle, const VisualElement* pFromVisualElement) const
679 _VisualElementImpl* pFrom = null;
681 if (pFromVisualElement)
683 CHECK_PARAMETER_CONSTRUCTED(*pFromVisualElement);
684 pFrom = pFromVisualElement->_pVisualElementImpl;
687 return _pVisualElementImpl->ConvertCoordinates(rectangle, pFrom);
691 VisualElement::SetContentBounds(const FloatRectangle& contentBounds)
695 return _pVisualElementImpl->SetContentBounds(contentBounds);
699 VisualElement::GetContentBounds(void) const
703 return _pVisualElementImpl->GetContentBounds();
708 VisualElement::AddAnimation(const VisualElementAnimation& animation)
712 return _pVisualElementImpl->AddAnimation(null, const_cast< VisualElementAnimation& >(animation));
716 VisualElement::AddAnimation(const Tizen::Base::String& keyName, const VisualElementAnimation& animation)
720 return _pVisualElementImpl->AddAnimation(&keyName, const_cast< VisualElementAnimation& >(animation));
725 VisualElement::RemoveAnimation(const Tizen::Base::String& keyName)
729 return _pVisualElementImpl->RemoveAnimation(keyName);
732 VisualElementAnimation*
733 VisualElement::GetAnimationN(const Tizen::Base::String& keyName) const
737 return _pVisualElementImpl->GetAnimationN(keyName);
741 VisualElement::RemoveAllAnimations(void)
745 _pVisualElementImpl->RemoveAllAnimations();
749 VisualElement::AcquirePresentationInstance(void)
753 if (likely(_pVisualElementImpl->GetPresentation()))
755 return _pVisualElementImpl->GetPresentation()->GetPublic();
762 VisualElement::ReleasePresentationInstance(void)
768 VisualElement::AcquireModelInstance(void)
772 if (likely(_pVisualElementImpl->GetModel()))
774 return _pVisualElementImpl->GetModel()->GetPublic();
781 VisualElement::ReleaseModelInstance(void)
787 VisualElement::SetImplicitAnimationEnabled(bool enable)
791 _pVisualElementImpl->SetImplicitAnimationEnabled(enable);
795 VisualElement::IsImplicitAnimationEnabled(void) const
799 return _pVisualElementImpl->GetImplicitAnimationEnabled();
804 VisualElement::OnConstructed(void)
810 * This method is invoked before deallocating the VisualElement instance in the Destroy() method.
815 * @see OnConstructed()
818 VisualElement::OnDestructing(void)
823 VisualElement::OnHitTest(const FloatPoint& point)
827 int hitResult = _pVisualElementImpl->HitTestI(point);
829 if (hitResult == _VisualElementImpl::HITTEST_MATCH)
831 return HIT_TEST_MATCH;
834 return HIT_TEST_NOWHERE;
838 VisualElement::OnPrepareDraw(void)
844 VisualElement::SetFlushNeeded(void)
848 return _pVisualElementImpl->SetFlushNeeded();
852 VisualElement::Flush(void)
854 return _VisualElementImpl::FlushI();
858 VisualElement::OnDraw(Canvas& canvas)
862 VisualElementAnimation*
863 VisualElement::OnCreateAnimationForProperty(const Tizen::Base::String& property)
867 return _pVisualElementImpl->CreateAnimationForPropertyI(property);
871 }}} // Tizen::Ui::Animations