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 FUiCtrl_ScrollPresenter.cpp
20 * @brief This is the implementation file for the %_ScrollPresenter class.
23 #include <FBaseErrors.h>
24 #include <FBaseSysLog.h>
25 #include <FGrpColor.h>
26 #include <FGrpRectangle.h>
27 #include <FGrpCanvas.h>
28 #include <FGrp_BitmapImpl.h>
29 #include <FUiAnimVisualElementAnimation.h>
30 #include <FUiAnimVisualElementAnimationProvider.h>
31 #include "FUi_ResourceManager.h"
32 #include "FUi_UiTouchEvent.h"
33 #include "FUiAnim_TransformMatrix3Df.h"
34 #include "FUiAnim_MatrixUtil.h"
35 #include "FUiAnim_VisualElement.h"
36 #include "FUiCtrl_ScrollPresenter.h"
37 #include "FUiCtrl_UiScrollEvent.h"
38 #include "FUiCtrl_UiScrollEventArg.h"
40 using namespace Tizen::Base;
41 using namespace Tizen::Base::Collection;
42 using namespace Tizen::Graphics;
43 using namespace Tizen::Ui;
44 using namespace Tizen::Ui::Animations;
48 const float SCROLL_OPACITY_ON = 1.0f;
49 const float SCROLL_OPACITY_DARK_DIM =0.6f;
50 const float SCROLL_OPACITY_LIGHT_DIM = 0.3f;
51 const float SCROLL_OPACITY_OFF = 0.0f;
52 const float SCROLLING_EFFECT_MAX_POSITION = 100.0f;
53 const float SCROLLING_EFFECT_MIN_SCALE_RATE = 0.95f;
56 namespace Tizen { namespace Ui { namespace Controls
60 #define MAX(a, b) ((a) > (b) ? (a) : (b))
61 #define MIN(a, b) ((a) < (b) ? (a) : (b))
64 _ScrollPresenter::_ScrollPresenter(void)
67 , __scrollDirection(SCROLL_DIRECTION_VERTICAL)
68 , __enableFadeEffect(false)
69 , __enableJumpToTop(false)
70 , __enableHandler(false)
71 , __enableScrollingEffect(false)
72 , __enableOverScrollingEffect(false)
73 , __parentUsingViewport(true)
78 , __scrollPositionCurr(0)
79 , __scrollPositionPrev(0)
82 , __scrollVisibility(false)
83 , __scrollingEffectVisibility(false)
84 , __parentBouncingRate(0.0f)
85 , __fadeEffectDuration_ms(5000)
86 , __needUpdateThumb(false)
87 , __needUpdateJumpTopTop(false)
88 , __needUpdateHandler(false)
89 , __needUpdateScrollingEffect(false)
90 , __handlerTouched(false)
91 , __handlerTouchedPosition(0)
92 , __jumpToTopPressed(false)
93 , __pScrollEvent(null)
96 , __pJumpToTopVe(null)
98 , __pFrontScrollingEffectVe(null)
99 , __pReerScrollingEffectVe(null)
100 , __thumbColor(0x00000000)
101 , __jumpToTopBgColor(0x00000000)
102 , __jumpToTopColor(0x00000000)
103 , __jumpToTopColorPressed(0x00000000)
104 , __buttonColor(0x00000000)
105 , __buttonColorPressed(0x00000000)
106 , __pThumbBitmap(null)
107 , __pThumbEffectBitmap(null)
108 , __pJumpToTopBitmap(null)
109 , __pJumpToTopEfBitmap(null)
110 , __pJumpToTopLeftBitmap(null)
111 , __pJumpToTopLeftEfBitmap(null)
112 , __pButtonBitmap(null)
113 , __pButtonEfBitmap(null)
114 , __pButtonPressBitmap(null)
115 , __pHandlerBgBitmap(null)
116 , __pHandlerBgEffectBitmap(null)
117 , __pHandlerBitmap(null)
118 , __pFrontScrollingEffectBitmap(null)
119 , __pReerScrollingEffectBitmap(null)
120 , __thumbSizeMin(0, 0)
122 , __jumpToTopSize(0, 0)
123 , __jumpToTopMarginRight(0)
124 , __jumpToTopMarginTop(0)
125 , __handlerSizeMin(0, 0)
126 , __handlerMarginLeft(0)
127 , __handlerMarginRight(0)
128 , __handlerMarginTop(0)
129 , __handlerMarginBottom(0)
130 , __scrollingEffectWidthLeft(0)
131 , __scrollingEffectWidthRight(0)
132 , __scrollingEffectHeightTop(0)
133 , __scrollingEffectHeightBottom(0)
134 , __beforeBouncingMatrixHash()
138 _ScrollPresenter::~_ScrollPresenter(void)
140 delete __pScrollEvent;
141 __pScrollEvent = null;
143 __beforeBouncingMatrixHash.RemoveAll(true);
145 if (__pThumbVe != null)
147 __pThumbVe->Destroy();
151 if (__pJumpToTopVe != null)
153 __pJumpToTopVe->Destroy();
154 __pJumpToTopVe = null;
157 if (__pHandlerVe != null)
159 __pHandlerVe->Destroy();
163 if (__pFrontScrollingEffectVe != null)
165 __pFrontScrollingEffectVe->RemoveAllAnimations();
166 __pFrontScrollingEffectVe->Destroy();
167 __pFrontScrollingEffectVe = null;
170 if (__pReerScrollingEffectVe != null)
172 __pReerScrollingEffectVe->RemoveAllAnimations();
173 __pReerScrollingEffectVe->Destroy();
174 __pReerScrollingEffectVe = null;
177 if (__pCtrlVe != null)
179 __pCtrlVe->RemoveAllAnimations();
180 __pCtrlVe->SetAnimationProvider(null);
181 __pCtrlVe->Destroy();
185 ReleaseBitmapResources();
189 _ScrollPresenter::CreateScrollPresenterN(_Control& parentCtrl,
191 _ScrollDirection scrollDirection,
192 bool enableFadeEffect,
193 bool enableJumpToTop,
200 SysTryReturn(NID_UI_CTRL, ((scrollRange >= viewRange) && (scrollRange != 0)), null, E_INVALID_ARG, "[E_INVALID_ARG] Invalid arguments");
201 SysTryReturn(NID_UI_CTRL, scrollPosition >= 0, null, E_INVALID_ARG, "[E_INVALID_ARG] Invalid arguments");
203 _ScrollPresenter* pPresenter = new (std::nothrow) _ScrollPresenter();
204 SysTryReturn(NID_UI_CTRL, pPresenter, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
206 result r = pPresenter->Construct(parentCtrl,
217 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
219 SetLastResult(E_SUCCESS);
229 _ScrollPresenter::SetScrollDirection(_ScrollDirection scrollDirection)
231 result r = E_SUCCESS;
233 // load color/shape configuration and bitmap resources
234 r = LoadResources(scrollDirection, _CONTROL_ORIENTATION_PORTRAIT);
235 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Failed to load resources.");
238 __scrollDirection = scrollDirection;
240 // reset the bounds of scroll control
241 Rectangle bounds = GetParentCtrl().GetBounds();
242 bounds.SetPosition(0, 0);
243 r = GetControl().SetBounds(bounds);
244 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Failed to set the bounds of _Scroll.");
246 // relayout scroll children.
247 r = RelayoutScrollChildren(__scrollDirection);
248 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Failed to relayout scroll chilren");
254 _ScrollPresenter::GetScrollDirection(void) const
256 return __scrollDirection;
260 _ScrollPresenter::SetScrollRange(int viewRange, int scrollRange)
262 SysTryReturn(NID_UI_CTRL, ((scrollRange >= viewRange) && (scrollRange != 0)), E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] Invalid arguments");
264 result r = E_SUCCESS;
266 // reset scroll range.
267 __viewRange = viewRange;
268 __scrollRange = scrollRange;
270 // relayout scroll children.
271 r = RelayoutScrollChildren(__scrollDirection);
272 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Failed to relayout scroll chilren");
279 _ScrollPresenter::GetScrollRange(int* pViewRange, int* pScrollRange) const
281 SysTryReturnVoidResult(NID_UI_CTRL,
282 !((pViewRange == null) && (pScrollRange == null)),
283 E_INVALID_ARG,"[E_INVALID_ARG] Input parameter is invalid.");
285 *pViewRange = __viewRange;
286 *pScrollRange = __scrollRange;
292 _ScrollPresenter::SetScrollPosition(int scrollPosition)
294 result r = E_SUCCESS;
296 if (scrollPosition != __scrollPositionCurr)
299 if (!__enableScrollingEffect)
301 if (scrollPosition < 0)
305 else if (scrollPosition > (__scrollRange - __viewRange))
307 scrollPosition = (__scrollRange -__viewRange);
310 __scrollPositionPrev = __scrollPositionCurr;
311 __scrollPositionCurr = scrollPosition;
313 if (__enableJumpToTop)
315 if ((__scrollPositionCurr <= 0) && (__pJumpToTopVe->GetOpacity() > 0.0f))
317 __pCtrlVe->SetImplicitAnimationEnabled(true);
318 __pJumpToTopVe->SetImplicitAnimationEnabled(true);
320 __pJumpToTopVe->SetOpacity(SCROLL_OPACITY_OFF);
322 __pJumpToTopVe->SetImplicitAnimationEnabled(false);
323 __pCtrlVe->SetImplicitAnimationEnabled(false);
325 else if ((__scrollPositionCurr > 0) && (__pJumpToTopVe->GetOpacity() < 1.0f))
327 __pCtrlVe->SetImplicitAnimationEnabled(true);
328 __pJumpToTopVe->SetImplicitAnimationEnabled(true);
330 __pJumpToTopVe->SetOpacity(SCROLL_OPACITY_ON);
332 __pJumpToTopVe->SetImplicitAnimationEnabled(false);
333 __pCtrlVe->SetImplicitAnimationEnabled(false);
335 // else keep up current visibility.
341 Point handlerPosition = CalculateHandlerPosition(__scrollDirection);
342 Rectangle handlerBounds(handlerPosition.x, handlerPosition.y, __pHandlerVe->GetBounds().width, __pHandlerVe->GetBounds().height);
343 FloatRectangle scrollCtrlBounds = __pCtrlVe->GetBounds();
344 if (__scrollDirection == SCROLL_DIRECTION_HORIZONTAL)
346 if (handlerPosition.x < 0)
350 else if (handlerPosition.x > scrollCtrlBounds.width - handlerBounds.width)
352 handlerBounds.x =scrollCtrlBounds.width - handlerBounds.width;
357 if (handlerPosition.y < 0)
361 else if (handlerPosition.y > scrollCtrlBounds.height - handlerBounds.height)
363 handlerBounds.y = scrollCtrlBounds.height - handlerBounds.height;
367 r = SetScrollChildBounds(*__pHandlerVe, handlerBounds);
368 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Failed to set the bounds of the __pHandlerVe");
372 Point thumbPosition = CalculateThumbPosition(__scrollDirection);
373 Rectangle thumbBounds(thumbPosition.x, thumbPosition.y, __pThumbVe->GetBounds().width, __pThumbVe->GetBounds().height);
374 FloatRectangle scrollCtrlBounds = __pCtrlVe->GetBounds();
375 if (__scrollDirection == SCROLL_DIRECTION_HORIZONTAL)
377 if (thumbPosition.x < 0)
381 else if (thumbPosition.x > scrollCtrlBounds.width - thumbBounds.width)
383 thumbBounds.x = scrollCtrlBounds.width - thumbBounds.width;
388 if (thumbPosition.y < 0)
392 else if (thumbPosition.y > scrollCtrlBounds.height - thumbBounds.height)
394 thumbBounds.y = scrollCtrlBounds.height - thumbBounds.height;
398 r = SetScrollChildBounds(*__pThumbVe, thumbBounds);
399 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Failed to set the bounds of the __pThumbVe");
402 if (__enableScrollingEffect || __enableOverScrollingEffect)
405 if (__scrollPositionCurr < 0)
407 ratio = -__scrollPositionCurr / SCROLLING_EFFECT_MAX_POSITION;
408 ratio = ratio > 1.0f ? 1.0f : ratio;
410 if (__enableScrollingEffect)
412 SetScrollingEffectOpacity(*__pFrontScrollingEffectVe, true, ratio);
413 SetScrollingEffectOpacity(*__pReerScrollingEffectVe, false, ratio);
416 __scrollingEffectVisibility = true;
418 else if (__scrollPositionCurr > (__scrollRange - __viewRange))
420 ratio = (__scrollPositionCurr - (__scrollRange - __viewRange)) / SCROLLING_EFFECT_MAX_POSITION;
421 ratio = ratio > 1.0f ? 1.0f : ratio;
423 if (__enableScrollingEffect)
425 SetScrollingEffectOpacity(*__pFrontScrollingEffectVe, false, ratio);
426 SetScrollingEffectOpacity(*__pReerScrollingEffectVe, true, ratio);
429 __scrollingEffectVisibility = true;
432 if (__enableOverScrollingEffect)
434 r = SetParentBouncing(ratio);
435 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Propagating.");
444 _ScrollPresenter::GetScrollPosition(void) const
446 return __scrollPositionCurr;
450 _ScrollPresenter::EnableFadeEffect(bool enable)
452 __enableFadeEffect = enable;
458 _ScrollPresenter::IsEnabledFadeEffect(void) const
460 return __enableFadeEffect;
464 _ScrollPresenter::IsOnFadeEffect(void) const
466 return (__fadeIn || __fadeOut);
470 _ScrollPresenter::EnableScrollingEffect(bool enable)
472 __enableScrollingEffect = enable;
476 _ScrollPresenter::IsEnabledScrollingEffect(void) const
478 return __enableScrollingEffect;
482 _ScrollPresenter::EnableOverScrollingEffect(bool enable)
484 __enableOverScrollingEffect = enable;
488 _ScrollPresenter::IsEnabledOverScrollingEffect(void) const
490 return __enableOverScrollingEffect;
494 _ScrollPresenter::SetParentUsingViewport(bool useViewPort)
496 __parentUsingViewport = useViewPort;
500 _ScrollPresenter::IsParentUsingViewport(void) const
502 return __parentUsingViewport;
506 _ScrollPresenter::SetScrollVisibility(bool visibility)
508 if (GetScrollVisibility() == visibility)
510 // keep up current visibility.
514 __pCtrlVe->RemoveAllAnimations();
517 if (__enableFadeEffect)
522 __pCtrlVe->SetImplicitAnimationEnabled(true);
525 __pCtrlVe->SetOpacity(SCROLL_OPACITY_ON);
527 if (__enableFadeEffect)
529 __pCtrlVe->SetImplicitAnimationEnabled(false);
539 if (__enableFadeEffect)
544 __pCtrlVe->SetImplicitAnimationEnabled(true);
547 __pCtrlVe->SetOpacity(SCROLL_OPACITY_OFF);
549 if (__enableFadeEffect)
551 __pCtrlVe->SetImplicitAnimationEnabled(false);
560 __scrollVisibility = visibility;
566 _ScrollPresenter::GetScrollVisibility(void) const
568 if (__enableFadeEffect)
570 if (__scrollVisibility)
575 else if (__pCtrlVe->GetOpacity() > SCROLL_OPACITY_OFF)
584 _ScrollPresenter::CancelFadeEffect(void)
589 __scrollVisibility = false;
590 __pCtrlVe->SetOpacity(SCROLL_OPACITY_OFF);
595 __scrollVisibility = true;
596 __pCtrlVe->SetOpacity(SCROLL_OPACITY_ON);
603 _ScrollPresenter::EnableJumpToTop(bool enable)
605 result r = E_SUCCESS;
607 if (__enableJumpToTop != enable)
611 if (__enableFadeEffect)
613 __pCtrlVe->SetImplicitAnimationEnabled(true);
616 r = AttachScrollChild(&__pJumpToTopVe, CalculateJumpToTopBounds(__scrollDirection), true);
617 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Failed to attach the __pJumpToTopVe to _Scroll");
619 if (__scrollPositionCurr != 0)
621 __pJumpToTopVe->SetOpacity(SCROLL_OPACITY_ON);
625 __pJumpToTopVe->SetOpacity(SCROLL_OPACITY_OFF);
628 if (__enableFadeEffect)
630 __pCtrlVe->SetImplicitAnimationEnabled(false);
635 DetachScrollChild(&__pJumpToTopVe, true);
638 __enableJumpToTop = enable;
646 _ScrollPresenter::IsEnabledJumpToTop(void) const
648 return __enableJumpToTop;
652 _ScrollPresenter::EnableHandler(bool enable)
654 result r = E_SUCCESS;
656 if (__enableHandler != enable)
658 if (__enableFadeEffect)
660 __pCtrlVe->SetImplicitAnimationEnabled(true);
665 r = AttachScrollChild(&__pHandlerVe, CalculateHandlerBounds(__scrollDirection), true);
666 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Failed to attach the __pHandlerVe to _Scroll");
668 DetachScrollChild(&__pThumbVe, true);
672 r = AttachScrollChild(&__pThumbVe, CalculateThumbBounds(__scrollDirection), true);
673 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Failed to attach the __pThumbVe to _Scroll");
675 DetachScrollChild(&__pHandlerVe, true);
677 __enableHandler = enable;
679 if (__enableFadeEffect)
681 __pCtrlVe->SetImplicitAnimationEnabled(false);
689 _ScrollPresenter::IsEnabledHandler(void) const
691 return __enableHandler;
695 _ScrollPresenter::SetScrollingEffectVisibility(bool visibility)
697 if (!__enableScrollingEffect)
702 if (__scrollingEffectVisibility == visibility)
704 // keep up current visibility.
708 if (__pFrontScrollingEffectVe == null || __pReerScrollingEffectVe == null)
713 __pFrontScrollingEffectVe->RemoveAllAnimations();
714 __pReerScrollingEffectVe->RemoveAllAnimations();
718 if (__enableFadeEffect)
720 __pFrontScrollingEffectVe->SetImplicitAnimationEnabled(true);
721 __pReerScrollingEffectVe->SetImplicitAnimationEnabled(true);
724 SetScrollingEffectOpacity(SCROLL_OPACITY_DARK_DIM);
726 if (__enableFadeEffect)
728 __pFrontScrollingEffectVe->SetImplicitAnimationEnabled(false);
729 __pReerScrollingEffectVe->SetImplicitAnimationEnabled(false);
734 if (__enableFadeEffect)
736 __pFrontScrollingEffectVe->SetImplicitAnimationEnabled(true);
737 __pReerScrollingEffectVe->SetImplicitAnimationEnabled(true);
740 SetScrollingEffectOpacity(SCROLL_OPACITY_OFF);
742 if (__enableFadeEffect)
744 __pFrontScrollingEffectVe->SetImplicitAnimationEnabled(false);
745 __pReerScrollingEffectVe->SetImplicitAnimationEnabled(false);
749 __scrollingEffectVisibility = visibility;
755 _ScrollPresenter::SetScrollingEffectOpacity(float opacity)
757 __pFrontScrollingEffectVe->SetOpacity(opacity);
758 __pReerScrollingEffectVe->SetOpacity(opacity);
762 _ScrollPresenter::SetScrollingEffectOpacity(_VisualElement& Ve, bool isActive, float ratio)
764 float baseOpacity = (isActive) ? SCROLL_OPACITY_ON : SCROLL_OPACITY_LIGHT_DIM;
765 Ve.SetOpacity(SCROLL_OPACITY_DARK_DIM + ((baseOpacity - SCROLL_OPACITY_DARK_DIM) * ratio));
769 _ScrollPresenter::IsScrollVisible(void) const
771 return (__fadeIn || __fadeOut || __scrollVisibility);
775 _ScrollPresenter::AddScrollEventListener(const Controls::_IScrollEventListener& listener)
777 if (__pScrollEvent == null)
779 __pScrollEvent = new (std::nothrow) _UiScrollEvent();
780 SysTryReturnVoidResult(NID_UI_CTRL, __pScrollEvent, E_OUT_OF_MEMORY,
781 "[E_OUT_OF_MEMORY] Memory allocation failed.");
782 __pScrollEvent->Construct(GetControl());
785 __pScrollEvent->AddListener(listener);
791 _ScrollPresenter::RemoveScrollEventListener(const Controls::_IScrollEventListener& listener)
794 SysTryReturnVoidResult(NID_UI_CTRL, __pScrollEvent, E_SYSTEM, "[E_SYSTEM] __pScrollEvent must not be null.");
796 __pScrollEvent->RemoveListener(listener);
802 _ScrollPresenter::OnParentBoundsChanged(void)
804 // reset the bounds of scroll control
805 Rectangle bounds = GetParentCtrl().GetBounds();
806 bounds.SetPosition(0, 0);
807 GetControl().SetBounds(bounds);
809 // relayout scroll children.
810 RelayoutScrollChildren(__scrollDirection);
816 _ScrollPresenter::OnDraw(void)
821 DrawScrollingEffect();
827 _ScrollPresenter::OnTouchPressed(const _Control& source, const _TouchInfo& touchinfo)
831 ret |= OnTouchPressedHandler(source, touchinfo);
832 ret |= OnTouchPressedJumpToTop(source, touchinfo);
838 _ScrollPresenter::OnTouchReleased(const _Control& source, const _TouchInfo& touchinfo)
842 ret |= OnTouchReleasedHandler(source, touchinfo);
843 ret |= OnTouchReleasedJumpToTop(source, touchinfo);
849 _ScrollPresenter::OnTouchMoved(const _Control& source, const _TouchInfo& touchinfo)
853 ret |= OnTouchMovedHandler(source, touchinfo);
854 ret |= OnTouchMovedJumpToTop(source, touchinfo);
860 _ScrollPresenter::HitTest(const FloatPoint& point)
862 FloatRectangle ctrlBounds = __pCtrlVe->GetBounds();
864 if (__enableJumpToTop && IsScrollVisible())
866 Rectangle jumpToTopBounds = GetScrollChildBounds(*__pJumpToTopVe);
867 jumpToTopBounds.x += ctrlBounds.x;
868 jumpToTopBounds.y += ctrlBounds.y;
869 if (jumpToTopBounds.Contains(Point(point.x, point.y)))
871 return HIT_TEST_MATCH;
877 Rectangle handlerBounds = GetScrollChildBounds(*__pHandlerVe);
878 handlerBounds.x += ctrlBounds.x;
879 handlerBounds.y += ctrlBounds.y;
880 if (handlerBounds.Contains(Point(point.x, point.y)))
882 return HIT_TEST_MATCH;
886 return HIT_TEST_NOWHERE;
889 VisualElementAnimation*
890 _ScrollPresenter::CreateAnimationForProperty(VisualElement& target, const String& property)
892 VisualElementAnimation* pAnimation = VisualElementAnimationProvider::CreateAnimationForProperty(target, property);
893 SysTryReturn(NID_UI_CTRL, pAnimation, null, GetLastResult(), "[%s] Failed to create a VisualElementAnimation.", GetErrorMessage(GetLastResult()));
895 pAnimation->SetVisualElementAnimationStatusEventListener(this);
896 SetLastResult(E_SUCCESS);
902 _ScrollPresenter::OnVisualElementAnimationStarted(const VisualElementAnimation& animation, const String& keyName, VisualElement& target)
908 _ScrollPresenter::OnVisualElementAnimationRepeated(const VisualElementAnimation& animation, const String& keyName, VisualElement& target, long currentRepeatCount)
914 _ScrollPresenter::OnVisualElementAnimationFinished(const VisualElementAnimation& animation, const String& keyName, VisualElement& target, bool completedNormally)
916 if (__pCtrlVe == (static_cast <_VisualElement*>(&target)))
926 _ScrollPresenter::Construct(_Control& parentCtrl,
928 _ScrollDirection scrollDirection,
929 bool enableFadeEffect,
930 bool enableJumpToTop,
937 result r = E_SUCCESS;
939 // load color/shape configuration and bitmap resources
940 r = LoadResources(scrollDirection, _CONTROL_ORIENTATION_PORTRAIT);
941 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Failed to load resources.");
944 SetParentCtrl(parentCtrl);
945 SetControl(scrollCtrl);
946 __scrollDirection = scrollDirection;
947 __enableFadeEffect = enableFadeEffect;
948 __enableJumpToTop = enableJumpToTop;
949 __enableHandler = enableHandler;
950 __viewRange = viewRange;
951 __scrollRange = scrollRange;
952 __scrollPositionCurr = scrollPosition;
954 _VisualElement* pVe = null;
956 // initialize the scroll control
957 Rectangle bounds = GetParentCtrl().GetBounds();
958 bounds.SetPosition(0, 0);
959 GetControl().SetBounds(bounds);
960 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Failed to set the bounds of _Scroll.", GetErrorMessage(r));
962 scrollCtrl.SetBackgroundColor(Color(0, 0, 0, 0));
964 // initialize visual elements
965 pVe = scrollCtrl.GetVisualElement();
966 SysTryCatch(NID_UI_CTRL, pVe, , GetLastResult(), "[%s] Failed to get VisualElement of the _Scroll.", GetErrorMessage(GetLastResult()));
968 __pCtrlVe = new (std::nothrow) _VisualElement();
969 SysTryReturnResult(NID_UI_CTRL, __pCtrlVe != null, E_OUT_OF_MEMORY, "Memory allocation failed.");
971 r = __pCtrlVe->Construct();
972 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Failed to construct Visual Element.", GetErrorMessage(r));
974 r = __pCtrlVe->SetSurfaceOpaque(false);
975 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Failed to set surface opaque.", GetErrorMessage(r));
977 __pCtrlVe->SetImplicitAnimationEnabled(false);
979 r = pVe->AttachChild(*__pCtrlVe);
980 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Failed to attach child to the control VisualElement.", GetErrorMessage(r));
982 r = SetScrollChildBounds(*__pCtrlVe, CalculateScrollCtrlBounds(scrollDirection));
983 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Failed to set bounds.", GetErrorMessage(r));
985 __pCtrlVe->SetAnimationProvider(this);
986 __pCtrlVe->SetShowState(true);
990 __pCtrlVe->SetOpacity(SCROLL_OPACITY_ON);
994 __pCtrlVe->SetOpacity(SCROLL_OPACITY_OFF);
997 // initialize jumpToTopVe
1000 r = AttachScrollChild(&__pJumpToTopVe, CalculateJumpToTopBounds(scrollDirection), true);
1001 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Failed to attach the __pJumpToTopVe to _Scroll.", GetErrorMessage(r));
1003 if ((scrollDirection != SCROLL_DIRECTION_VERTICAL) || (scrollPosition == 0))
1005 __pJumpToTopVe->SetOpacity(SCROLL_OPACITY_OFF);
1008 __needUpdateJumpTopTop = true;
1011 // initialize thumbVe and handlerVe
1014 r = AttachScrollChild(&__pHandlerVe, CalculateHandlerBounds(scrollDirection), true);
1015 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Failed to attach the __pHandlerVe to _Scroll.", GetErrorMessage(r));
1017 DetachScrollChild(&__pThumbVe, true);
1019 __needUpdateHandler = true;
1023 r = AttachScrollChild(&__pThumbVe, CalculateThumbBounds(scrollDirection), true);
1024 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Failed to attach the __pThumbVe to _Scroll.", GetErrorMessage(r));
1026 DetachScrollChild(&__pHandlerVe, true);
1028 __needUpdateThumb = true;
1031 // initialize scrolling effect front VE
1032 __pFrontScrollingEffectVe = new (std::nothrow) _VisualElement();
1033 SysTryCatch(NID_UI_CTRL, __pFrontScrollingEffectVe, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
1035 r = __pFrontScrollingEffectVe->Construct();
1036 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Failed to construct pFrontScrollingEffectVe.", GetErrorMessage(r));
1038 r = __pFrontScrollingEffectVe->SetSurfaceOpaque(false);
1039 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Failed to set surface opaque.", GetErrorMessage(r));
1041 __pFrontScrollingEffectVe->SetImplicitAnimationEnabled(false);
1043 r = pVe->AttachChild(*__pFrontScrollingEffectVe);
1044 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Failed to attach child to the control VisualElement.", GetErrorMessage(r));
1046 r = SetScrollChildBounds(*__pFrontScrollingEffectVe, CalculateScrollingEffectFrontBounds(scrollDirection));
1047 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Failed to set bounds.", GetErrorMessage(r));
1049 __pFrontScrollingEffectVe->SetShowState(true);
1050 __pFrontScrollingEffectVe->SetOpacity(SCROLL_OPACITY_OFF);
1052 // initialize scrolling effect reer VE
1053 __pReerScrollingEffectVe = new (std::nothrow) _VisualElement();
1054 SysTryCatch(NID_UI_CTRL, __pReerScrollingEffectVe, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
1056 r = __pReerScrollingEffectVe->Construct();
1057 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Failed to construct pReerScrollingEffectVe.", GetErrorMessage(r));
1059 r = __pReerScrollingEffectVe->SetSurfaceOpaque(false);
1060 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Failed to set surface opaque.", GetErrorMessage(r));
1062 __pReerScrollingEffectVe->SetImplicitAnimationEnabled(false);
1064 r = pVe->AttachChild(*__pReerScrollingEffectVe);
1065 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Failed to attach child to the control VisualElement.", GetErrorMessage(r));
1067 r = SetScrollChildBounds(*__pReerScrollingEffectVe, CalculateScrollCtrlBounds(scrollDirection));
1068 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Failed to set bounds.", GetErrorMessage(r));
1070 __pReerScrollingEffectVe->SetShowState(true);
1071 __pReerScrollingEffectVe->SetOpacity(SCROLL_OPACITY_OFF);
1073 __needUpdateScrollingEffect = true;
1075 __scrollVisibility = visibility;
1077 r = __beforeBouncingMatrixHash.Construct();
1078 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
1084 __pParentCtrl = null;
1085 __pScrollCtrl = null;
1086 __scrollDirection = SCROLL_DIRECTION_VERTICAL;
1087 __enableFadeEffect = false;
1088 __enableJumpToTop = false;
1089 __enableHandler = false;
1090 __enableScrollingEffect = false;
1091 __enableOverScrollingEffect = false;
1098 __scrollPositionCurr = 0;
1099 __needUpdateThumb = false;
1100 __needUpdateJumpTopTop = false;
1101 __needUpdateHandler = false;
1102 __needUpdateScrollingEffect = false;
1103 __jumpToTopPressed = false;
1105 __thumbColor = 0x00000000;
1106 __jumpToTopBgColor = 0x00000000;
1107 __jumpToTopColor = 0x00000000;
1108 __jumpToTopColorPressed = 0x00000000;
1109 __buttonColor= 0x00000000;
1110 __buttonColorPressed = 0x00000000;
1112 ReleaseBitmapResources();
1114 __thumbSizeMin.SetSize(0, 0);
1116 __jumpToTopSize.SetSize(0, 0);
1117 __jumpToTopMarginRight = 0;
1118 __jumpToTopMarginTop = 0;
1119 __handlerSizeMin.SetSize(0, 0);
1120 __handlerMarginLeft = 0;
1121 __handlerMarginRight = 0;
1122 __handlerMarginTop = 0;
1123 __handlerMarginBottom = 0;
1124 __scrollingEffectWidthLeft = 0;
1125 __scrollingEffectWidthRight = 0;
1126 __scrollingEffectHeightTop = 0;
1127 __scrollingEffectHeightBottom = 0;
1129 if (__pThumbVe != null)
1131 __pThumbVe->Destroy();
1135 if (__pJumpToTopVe != null)
1137 __pJumpToTopVe->Destroy();
1138 __pJumpToTopVe = null;
1141 if (__pHandlerVe != null)
1143 __pHandlerVe->Destroy();
1144 __pHandlerVe = null;
1147 if (__pFrontScrollingEffectVe != null)
1149 __pFrontScrollingEffectVe->RemoveAllAnimations();
1150 __pFrontScrollingEffectVe->Destroy();
1151 __pFrontScrollingEffectVe = null;
1154 if (__pReerScrollingEffectVe != null)
1156 __pReerScrollingEffectVe->RemoveAllAnimations();
1157 __pReerScrollingEffectVe->Destroy();
1158 __pReerScrollingEffectVe = null;
1161 if (__pCtrlVe != null)
1163 __pCtrlVe->RemoveAllAnimations();
1164 __pCtrlVe->SetAnimationProvider(null);
1165 __pCtrlVe->Destroy();
1173 _ScrollPresenter::LoadResources(_ScrollDirection scrollDirection, _ControlOrientation orientation)
1175 result r = E_SUCCESS;
1177 r = LoadColorConfig();
1178 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Failed to get resource.", GetErrorMessage(r));
1180 r = LoadBitmapResources(scrollDirection);
1181 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Failed to get resource.", GetErrorMessage(r));
1183 r = LoadShapeConfig(scrollDirection, orientation);
1184 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Failed to get resource.", GetErrorMessage(r));
1189 __thumbColor = 0x00000000;
1190 __jumpToTopBgColor = 0x00000000;
1191 __jumpToTopColor = 0x00000000;
1192 __jumpToTopColorPressed = 0x00000000;
1193 __buttonColor= 0x00000000;
1194 __buttonColorPressed = 0x00000000;
1196 ReleaseBitmapResources();
1198 __thumbSizeMin.SetSize(0, 0);
1200 __jumpToTopSize.SetSize(0, 0);
1201 __jumpToTopMarginRight = 0;
1202 __jumpToTopMarginTop = 0;
1203 __handlerSizeMin.SetSize(0, 0);
1204 __handlerMarginLeft = 0;
1205 __handlerMarginRight = 0;
1206 __handlerMarginTop = 0;
1207 __handlerMarginBottom = 0;
1208 __scrollingEffectWidthLeft = 0;
1209 __scrollingEffectWidthRight = 0;
1210 __scrollingEffectHeightTop = 0;
1211 __scrollingEffectHeightBottom = 0;
1218 _ScrollPresenter::LoadColorConfig(void)
1220 result r = E_SUCCESS;
1222 // load color configuration
1223 r = GET_COLOR_CONFIG(SCROLL::THUMB, __thumbColor);
1224 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] Failed to get resource.");
1226 r = GET_COLOR_CONFIG(SCROLL::JUMP_TO_TOP_BG, __jumpToTopBgColor);
1227 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] Failed to get resource.");
1229 r = GET_COLOR_CONFIG(SCROLL::JUMP_TO_TOP_NORMAL, __jumpToTopColor);
1230 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] Failed to get resource.");
1232 r = GET_COLOR_CONFIG(SCROLL::JUMP_TO_TOP_PRESSED, __jumpToTopColorPressed);
1233 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] Failed to get resource.");
1235 r = GET_COLOR_CONFIG(SCROLL::BUTTON_BG, __buttonColor);
1236 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] Failed to get resource.");
1238 r = GET_COLOR_CONFIG(SCROLL::BUTTON_BG_PRESSED, __buttonColorPressed);
1239 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] Failed to get resource.");
1244 __thumbColor = 0x00000000;
1245 __jumpToTopBgColor = 0x00000000;
1246 __jumpToTopColor = 0x00000000;
1247 __jumpToTopColorPressed = 0x00000000;
1248 __buttonColor= 0x00000000;
1249 __buttonColorPressed = 0x00000000;
1256 _ScrollPresenter::LoadBitmapResources(_ScrollDirection scrollDirection)
1258 result r = E_SUCCESS;
1260 // release allocated resources.
1261 ReleaseBitmapResources();
1263 // load bitmap resources
1264 r = GET_BITMAP_CONFIG_N(SCROLL::THUMB, BITMAP_PIXEL_FORMAT_ARGB8888, __pThumbBitmap);
1265 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] failed to load image.");
1267 r = GET_BITMAP_CONFIG_N(SCROLL::THUMB_EFFECT, BITMAP_PIXEL_FORMAT_ARGB8888, __pThumbEffectBitmap);
1268 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] failed to load image.");
1270 r = GET_BITMAP_CONFIG_N(SCROLL::JUMP_TO_TOP, BITMAP_PIXEL_FORMAT_ARGB8888, __pJumpToTopBitmap);
1271 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] failed to load image.");
1273 GET_BITMAP_CONFIG_N(SCROLL::JUMP_TO_TOP_EFFECT, BITMAP_PIXEL_FORMAT_ARGB8888, __pJumpToTopEfBitmap);
1274 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] failed to load image.");
1276 r = GET_BITMAP_CONFIG_N(SCROLL::JUMP_TO_TOP_LEFT, BITMAP_PIXEL_FORMAT_ARGB8888, __pJumpToTopLeftBitmap);
1277 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] failed to load image.");
1279 GET_BITMAP_CONFIG_N(SCROLL::JUMP_TO_TOP_LEFT_EFFECT, BITMAP_PIXEL_FORMAT_ARGB8888, __pJumpToTopLeftEfBitmap);
1280 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] failed to load image.");
1282 r = GET_BITMAP_CONFIG_N(SCROLL::BUTTON_BG, BITMAP_PIXEL_FORMAT_ARGB8888, __pButtonBitmap);
1283 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] failed to load image.");
1285 r = GET_BITMAP_CONFIG_N(SCROLL::BUTTON_BG_EFFECT, BITMAP_PIXEL_FORMAT_ARGB8888, __pButtonEfBitmap);
1286 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] failed to load image.");
1288 r = GET_BITMAP_CONFIG_N(SCROLL::BUTTON_BG_PRESSED, BITMAP_PIXEL_FORMAT_ARGB8888, __pButtonPressBitmap);
1289 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] failed to load image.");
1291 r = GET_BITMAP_CONFIG_N(SCROLL::HANDLER_BG, BITMAP_PIXEL_FORMAT_ARGB8888, __pHandlerBgBitmap);
1292 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] failed to load image.");
1294 r = GET_BITMAP_CONFIG_N(SCROLL::HANDLER_BG_EFFECT, BITMAP_PIXEL_FORMAT_ARGB8888, __pHandlerBgEffectBitmap);
1295 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] failed to load image.");
1297 if (scrollDirection == SCROLL_DIRECTION_HORIZONTAL)
1299 r = GET_BITMAP_CONFIG_N(SCROLL::HANDLER_HORIZONTAL, BITMAP_PIXEL_FORMAT_ARGB8888, __pHandlerBitmap);
1300 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] failed to load image.");
1302 r = GET_BITMAP_CONFIG_N(SCROLL::OVERSCROLLING_LEFT_BG, BITMAP_PIXEL_FORMAT_ARGB8888, __pFrontScrollingEffectBitmap);
1303 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] failed to load image.");
1305 r = GET_BITMAP_CONFIG_N(SCROLL::OVERSCROLLING_RIGHT_BG, BITMAP_PIXEL_FORMAT_ARGB8888, __pReerScrollingEffectBitmap);
1306 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] failed to load image.");
1308 else // if (__scrollDirection == SCROLL_DIRECTION_VERTICAL)
1310 r = GET_BITMAP_CONFIG_N(SCROLL::HANDLER_VERTICAL, BITMAP_PIXEL_FORMAT_ARGB8888, __pHandlerBitmap);
1311 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] failed to load image.");
1313 r = GET_BITMAP_CONFIG_N(SCROLL::OVERSCROLLING_TOP_BG, BITMAP_PIXEL_FORMAT_ARGB8888, __pFrontScrollingEffectBitmap);
1314 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] failed to load image.");
1316 r = GET_BITMAP_CONFIG_N(SCROLL::OVERSCROLLING_BOTTOM_BG, BITMAP_PIXEL_FORMAT_ARGB8888, __pReerScrollingEffectBitmap);
1317 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] failed to load image.");
1323 ReleaseBitmapResources();
1329 _ScrollPresenter::LoadShapeConfig(_ScrollDirection scrollDirection, _ControlOrientation orientation)
1331 result r = E_SUCCESS;
1333 // load shape configuration
1334 if (scrollDirection == SCROLL_DIRECTION_VERTICAL)
1336 r = GET_SHAPE_CONFIG(SCROLL::VERTICAL_THUMB_MIN_WIDTH, orientation, __thumbSizeMin.width);
1337 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] Failed to get resource.");
1339 r = GET_SHAPE_CONFIG(SCROLL::VERTICAL_THUMB_MIN_HEIGHT, orientation, __thumbSizeMin.height);
1340 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] Failed to get resource.");
1342 r = GET_SHAPE_CONFIG(SCROLL::VERTICAL_THUMB_MARGIN, orientation, __thumbMargin);
1343 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] Failed to get resource.");
1347 r = GET_SHAPE_CONFIG(SCROLL::HORIZONTAL_THUMB_MIN_WIDTH, orientation, __thumbSizeMin.width);
1348 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] Failed to get resource.");
1350 r = GET_SHAPE_CONFIG(SCROLL::HORIZONTAL_THUMB_MIN_HEIGHT, orientation, __thumbSizeMin.height);
1351 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] Failed to get resource.");
1353 r = GET_SHAPE_CONFIG(SCROLL::HORIZONTAL_THUMB_MARGIN, orientation, __thumbMargin);
1354 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] Failed to get resource.");
1357 r = GET_SHAPE_CONFIG(SCROLL::JUMP_TO_TOP_RIGHT_MARGIN, orientation, __jumpToTopMarginRight);
1358 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] Failed to get resource.");
1360 r = GET_SHAPE_CONFIG(SCROLL::JUMP_TO_TOP_TOP_MARGIN, orientation, __jumpToTopMarginTop);
1361 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] Failed to get resource.");
1363 r = GET_FIXED_VALUE_CONFIG(SCROLL::JUMP_TO_TOP_WIDTH, orientation, __jumpToTopSize.width);
1364 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] Failed to get resource.");
1366 r = GET_FIXED_VALUE_CONFIG(SCROLL::JUMP_TO_TOP_HEIGHT, orientation, __jumpToTopSize.height);
1367 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] Failed to get resource.");
1369 r = GET_SHAPE_CONFIG(SCROLL::HANDLER_MARGIN, orientation, __handlerMarginLeft);
1370 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] Failed to get resource.");
1372 r = GET_SHAPE_CONFIG(SCROLL::HANDLER_MIN_WIDTH, orientation, __handlerSizeMin.width);
1373 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] Failed to get resource.");
1375 r = GET_SHAPE_CONFIG(SCROLL::HANDLER_MIN_HEIGHT, orientation, __handlerSizeMin.height);
1376 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] Failed to get resource.");
1378 GET_SHAPE_CONFIG(SCROLL::OVERSCROLLING_LEFT_WIDTH, orientation, __scrollingEffectWidthLeft);
1379 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] Failed to get resource.");
1381 GET_SHAPE_CONFIG(SCROLL::OVERSCROLLING_RIGHT_WIDTH, orientation, __scrollingEffectWidthRight);
1382 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] Failed to get resource.");
1384 GET_SHAPE_CONFIG(SCROLL::OVERSCROLLING_TOP_HEIGHT, orientation, __scrollingEffectHeightTop);
1385 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] Failed to get resource.");
1387 GET_SHAPE_CONFIG(SCROLL::OVERSCROLLING_BOTTOM_HEIGHT, orientation, __scrollingEffectHeightBottom);
1388 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] Failed to get resource.");
1390 __handlerMarginRight = __handlerMarginLeft;
1391 __handlerMarginTop = __handlerMarginLeft;
1392 __handlerMarginBottom = __handlerMarginLeft;
1397 __thumbSizeMin.SetSize(0, 0);
1399 __jumpToTopSize.SetSize(0, 0);
1400 __jumpToTopMarginRight = 0;
1401 __jumpToTopMarginTop = 0;
1402 __handlerSizeMin.SetSize(0, 0);
1403 __handlerMarginLeft = 0;
1404 __handlerMarginRight = 0;
1405 __handlerMarginTop = 0;
1406 __handlerMarginBottom = 0;
1407 __scrollingEffectWidthLeft = 0;
1408 __scrollingEffectWidthRight = 0;
1409 __scrollingEffectHeightTop = 0;
1410 __scrollingEffectHeightBottom = 0;
1417 _ScrollPresenter::ReleaseBitmapResources(void)
1419 delete __pThumbBitmap;
1420 __pThumbBitmap = null;
1422 delete __pThumbEffectBitmap;
1423 __pThumbEffectBitmap = null;
1425 delete __pJumpToTopBitmap;
1426 __pJumpToTopBitmap = null;
1428 delete __pJumpToTopEfBitmap;
1429 __pJumpToTopEfBitmap = null;
1431 delete __pJumpToTopLeftBitmap;
1432 __pJumpToTopLeftBitmap = null;
1434 delete __pJumpToTopLeftEfBitmap;
1435 __pJumpToTopLeftEfBitmap = null;
1437 delete __pButtonBitmap;
1438 __pButtonBitmap = null;
1440 delete __pButtonEfBitmap;
1441 __pButtonEfBitmap = null;
1443 delete __pButtonPressBitmap;
1444 __pButtonPressBitmap = null;
1446 delete __pHandlerBgBitmap;
1447 __pHandlerBgBitmap = null;
1449 delete __pHandlerBgEffectBitmap;
1450 __pHandlerBgEffectBitmap = null;
1452 delete __pHandlerBitmap;
1453 __pHandlerBitmap = null;
1455 delete __pFrontScrollingEffectBitmap;
1456 __pFrontScrollingEffectBitmap = null;
1458 delete __pReerScrollingEffectBitmap;
1459 __pReerScrollingEffectBitmap = null;
1465 _ScrollPresenter::CalculateScrollCtrlBounds(_ScrollDirection scrollDirection)
1467 Rectangle scrollCtrlBounds;
1468 Rectangle parentBounds = GetParentCtrl().GetBounds();
1470 if (scrollDirection == SCROLL_DIRECTION_VERTICAL)
1472 scrollCtrlBounds.width = MAX(scrollCtrlBounds.width, (__thumbSizeMin.width + __thumbMargin));
1473 scrollCtrlBounds.width = MAX(scrollCtrlBounds.width, (__handlerSizeMin.width + __handlerMarginRight + __handlerMarginLeft));
1474 scrollCtrlBounds.width = MAX(scrollCtrlBounds.width, (__jumpToTopSize.width + __jumpToTopMarginRight));
1475 scrollCtrlBounds.width = MIN(scrollCtrlBounds.width, (parentBounds.width));
1476 scrollCtrlBounds.height = parentBounds.height;
1480 scrollCtrlBounds.height = MAX(scrollCtrlBounds.height, (__thumbSizeMin.width + __thumbMargin));
1481 scrollCtrlBounds.height = MAX(scrollCtrlBounds.height, (__handlerSizeMin.width + __handlerMarginRight + __handlerMarginLeft));
1482 scrollCtrlBounds.height = MAX(scrollCtrlBounds.height, (__jumpToTopSize.width + __jumpToTopMarginRight));
1483 scrollCtrlBounds.height = MIN(scrollCtrlBounds.height, (parentBounds.height));
1484 scrollCtrlBounds.width = parentBounds.width;
1487 scrollCtrlBounds.x = parentBounds.width - scrollCtrlBounds.width;
1488 scrollCtrlBounds.y = parentBounds.height - scrollCtrlBounds.height;
1490 return scrollCtrlBounds;
1494 _ScrollPresenter::CalculateThumbBounds(_ScrollDirection scrollDirection)
1496 Dimension thumbSize = CalculateThumbSize(scrollDirection);
1497 Point thumbPosition = CalculateThumbPosition(scrollDirection);
1499 FloatRectangle scrollCtrlBounds = __pCtrlVe->GetBounds();
1500 if (scrollDirection == SCROLL_DIRECTION_HORIZONTAL)
1502 if (thumbPosition.x < 0)
1504 thumbPosition.x = 0;
1506 else if (thumbPosition.x > scrollCtrlBounds.width - thumbSize.width)
1508 thumbPosition.x = scrollCtrlBounds.width - thumbSize.width;
1513 if (thumbPosition.y < 0)
1515 thumbPosition.y = 0;
1517 else if (thumbPosition.y > scrollCtrlBounds.height - thumbSize.height)
1519 thumbPosition.y = scrollCtrlBounds.height - thumbSize.height;
1523 return Rectangle(thumbPosition.x, thumbPosition.y, thumbSize.width, thumbSize.height);
1527 _ScrollPresenter::CalculateThumbPosition(_ScrollDirection scrollDirection)
1529 Point thumbPosition;
1530 FloatRectangle scrollCtrlBounds = __pCtrlVe->GetBounds();
1532 if (scrollDirection == SCROLL_DIRECTION_VERTICAL)
1534 thumbPosition.x = scrollCtrlBounds.width - (__thumbSizeMin.width + __thumbMargin);
1535 if (thumbPosition.x < 0)
1537 thumbPosition.x = 0;
1540 if (__scrollRange > 0)
1542 thumbPosition.y = (int)((scrollCtrlBounds.height * __scrollPositionCurr) / __scrollRange);
1543 if (__scrollPositionCurr < 0)
1545 thumbPosition.y = 0;
1550 thumbPosition.y = 0;
1555 thumbPosition.y = scrollCtrlBounds.height - (__thumbSizeMin.height + __thumbMargin);
1556 if (thumbPosition.y < 0)
1558 thumbPosition.y = 0;
1561 if (__scrollRange > 0)
1563 thumbPosition.x = (int)((scrollCtrlBounds.width * __scrollPositionCurr) / __scrollRange);
1564 if (__scrollPositionCurr < 0)
1566 thumbPosition.x = 0;
1571 thumbPosition.x = 0;
1575 return thumbPosition;
1579 _ScrollPresenter::CalculateThumbSize(_ScrollDirection scrollDirection)
1581 Dimension thumbSize;
1582 FloatRectangle scrollCtrlBounds = __pCtrlVe->GetBounds();
1584 if (scrollDirection == SCROLL_DIRECTION_VERTICAL)
1586 thumbSize.width = MIN(__thumbSizeMin.width, scrollCtrlBounds.width);
1587 if (__scrollRange > 0)
1589 thumbSize.height = (int)((scrollCtrlBounds.height * __viewRange) / __scrollRange);
1590 thumbSize.height = MAX(__thumbSizeMin.height, thumbSize.height);
1591 thumbSize.height = MIN(scrollCtrlBounds.height, thumbSize.height);
1595 thumbSize.height = 0;
1600 thumbSize.height = MIN(__thumbSizeMin.height, scrollCtrlBounds.height);
1601 if (__scrollRange > 0)
1603 thumbSize.width = (int)((scrollCtrlBounds.width * __viewRange) / __scrollRange);
1604 thumbSize.width = MAX(__thumbSizeMin.width, thumbSize.width);
1605 thumbSize.width = MIN(scrollCtrlBounds.width, thumbSize.width);
1609 thumbSize.width = 0;
1617 _ScrollPresenter::CalculateHandlerBounds(_ScrollDirection scrollDirection)
1619 Dimension handlerSize = CalculateHandlerSize(scrollDirection);
1620 Point handlerPosition = CalculateHandlerPosition(scrollDirection);
1622 FloatRectangle scrollCtrlBounds = __pCtrlVe->GetBounds();
1623 if (scrollDirection == SCROLL_DIRECTION_HORIZONTAL)
1625 if (handlerPosition.x < 0)
1627 handlerPosition.x = 0;
1629 else if (handlerPosition.x > scrollCtrlBounds.width - handlerSize.width)
1631 handlerPosition.x =scrollCtrlBounds.width - handlerSize.width;
1636 if (handlerPosition.y < 0)
1638 handlerPosition.y = 0;
1640 else if (handlerPosition.y > scrollCtrlBounds.height - handlerSize.height)
1642 handlerPosition.y = scrollCtrlBounds.height - handlerSize.height;
1646 return Rectangle(handlerPosition.x, handlerPosition.y, handlerSize.width, handlerSize.height);
1650 _ScrollPresenter::CalculateHandlerPosition(_ScrollDirection scrollDirection)
1652 Point handlerPosition;
1653 FloatRectangle scrollCtrlBounds = __pCtrlVe->GetBounds();
1655 if (scrollDirection == SCROLL_DIRECTION_VERTICAL)
1657 handlerPosition.x = scrollCtrlBounds.width - (__handlerSizeMin.width + __handlerMarginRight);
1658 if (handlerPosition.x < 0)
1660 handlerPosition.x = 0;
1662 if (__scrollRange > 0)
1664 handlerPosition.y = (int)((scrollCtrlBounds.height * __scrollPositionCurr) / __scrollRange);
1668 handlerPosition.y = 0;
1673 handlerPosition.y = scrollCtrlBounds.height - (__handlerSizeMin.width + __handlerMarginRight);
1674 if (handlerPosition.y < 0)
1676 handlerPosition.y = 0;
1678 if (__scrollRange > 0)
1680 handlerPosition.x = (int)((scrollCtrlBounds.width * __scrollPositionCurr) / __scrollRange);
1684 handlerPosition.x = 0;
1688 return handlerPosition;
1692 _ScrollPresenter::CalculateHandlerSize(_ScrollDirection scrollDirection)
1694 Dimension handlerSize;
1695 FloatRectangle scrollCtrlBounds = __pCtrlVe->GetBounds();
1697 if (scrollDirection == SCROLL_DIRECTION_VERTICAL)
1699 handlerSize.width = MIN(__handlerSizeMin.width, scrollCtrlBounds.width);
1700 if (__scrollRange > 0)
1702 handlerSize.height = (int)((scrollCtrlBounds.height * __viewRange) / __scrollRange);
1706 handlerSize.height = 0;
1711 handlerSize.height = MIN(__handlerSizeMin.width, scrollCtrlBounds.height);
1712 if (__scrollRange > 0)
1714 handlerSize.width = (int)((scrollCtrlBounds.width * __viewRange) / __scrollRange);
1718 handlerSize.width = 0;
1726 _ScrollPresenter::CalculateJumpToTopBounds(_ScrollDirection scrollDirection)
1728 FloatRectangle scrollCtrlBounds = __pCtrlVe->GetBounds();
1729 Rectangle jumpToTopBounds(0, 0, 0, 0);
1731 if (scrollDirection == SCROLL_DIRECTION_VERTICAL)
1733 jumpToTopBounds.width = MIN(__jumpToTopSize.width, scrollCtrlBounds.width);
1734 jumpToTopBounds.height = MIN(__jumpToTopSize.height, scrollCtrlBounds.height);
1735 jumpToTopBounds.x = scrollCtrlBounds.width - (__jumpToTopSize.width + __jumpToTopMarginRight);
1736 if (jumpToTopBounds.x < 0)
1738 jumpToTopBounds.x = 0;
1740 jumpToTopBounds.y = __jumpToTopMarginTop;
1744 jumpToTopBounds.width = MIN(__jumpToTopSize.width, scrollCtrlBounds.width);
1745 jumpToTopBounds.height = MIN(__jumpToTopSize.height, scrollCtrlBounds.height);
1746 jumpToTopBounds.y = scrollCtrlBounds.height - (__jumpToTopSize.height + __jumpToTopMarginRight);
1747 if (jumpToTopBounds.y < 0)
1749 jumpToTopBounds.y = 0;
1751 jumpToTopBounds.x = __jumpToTopMarginTop;
1754 return jumpToTopBounds;
1758 _ScrollPresenter::CalculateScrollingEffectFrontBounds(_ScrollDirection scrollDirection)
1760 Rectangle scrollCtrlBounds = GetControl().GetBounds();
1761 Rectangle scrollEffectFrontBounds(0, 0, 0, 0);
1763 if (scrollDirection == SCROLL_DIRECTION_HORIZONTAL)
1765 scrollEffectFrontBounds.width = __scrollingEffectWidthLeft;
1766 scrollEffectFrontBounds.height = scrollCtrlBounds.height;
1770 scrollEffectFrontBounds.width = scrollCtrlBounds.width;
1771 scrollEffectFrontBounds.height = __scrollingEffectHeightTop;
1774 return scrollEffectFrontBounds;
1778 _ScrollPresenter::CalculateScrollingEffectReerBounds(_ScrollDirection scrollDirection)
1780 Rectangle scrollCtrlBounds = GetControl().GetBounds();
1781 Rectangle scrollEffectReerBounds(0, 0, 0, 0);
1783 if (scrollDirection == SCROLL_DIRECTION_HORIZONTAL)
1785 scrollEffectReerBounds.x = scrollCtrlBounds.width - __scrollingEffectWidthRight;
1786 scrollEffectReerBounds.width = __scrollingEffectWidthRight;
1787 scrollEffectReerBounds.height = scrollCtrlBounds.height;
1791 scrollEffectReerBounds.y = scrollCtrlBounds.height - __scrollingEffectHeightBottom;
1792 scrollEffectReerBounds.width = scrollCtrlBounds.width;
1793 scrollEffectReerBounds.height = __scrollingEffectHeightBottom;
1796 return scrollEffectReerBounds;
1800 _ScrollPresenter::AttachScrollChild(_VisualElement** ppScrollVe, const Rectangle& bounds, bool visibility)
1802 result r = E_SUCCESS;
1803 _VisualElement* pScrollVe = *ppScrollVe;
1805 if (pScrollVe == null)
1807 pScrollVe = new (std::nothrow) _VisualElement();
1808 SysTryReturnResult(NID_UI_CTRL, pScrollVe, E_OUT_OF_MEMORY, "Memory allocation failed.");
1810 r = pScrollVe->Construct();
1811 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Failed to construct pScrollVe.", GetErrorMessage(r));
1813 r = pScrollVe->SetSurfaceOpaque(false);
1814 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Failed to set surface opaque.", GetErrorMessage(r));
1816 pScrollVe->SetImplicitAnimationEnabled(false);
1818 r = __pCtrlVe->AttachChild(*pScrollVe);
1819 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Failed to attach child to the __pCtrlVe.", GetErrorMessage(r));
1821 *ppScrollVe = pScrollVe;
1824 r = SetScrollChildBounds(*pScrollVe, bounds);
1825 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Failed to set bounds.", GetErrorMessage(r));
1827 pScrollVe->SetShowState(visibility);
1834 pScrollVe->Destroy();
1836 *ppScrollVe = pScrollVe;
1843 _ScrollPresenter::DetachScrollChild(_VisualElement** ppScrollVe, bool destroy)
1845 _VisualElement* pScrollVe = *ppScrollVe;
1851 pScrollVe->Destroy();
1857 pScrollVe->SetShowState(false);
1863 _ScrollPresenter::GetScrollChildBounds(_VisualElement& scrollVe) const
1865 FloatRectangle veBounds = scrollVe.GetBounds();
1866 return Rectangle(veBounds.x, veBounds.y, veBounds.width, veBounds.height);
1870 _ScrollPresenter::SetScrollChildBounds(_VisualElement& scrollVe, const Rectangle& bounds)
1872 FloatRectangle veBounds(bounds.x, bounds.y, bounds.width, bounds.height);
1873 return scrollVe.SetBounds(veBounds);
1877 _ScrollPresenter::RelayoutScrollChildren(_ScrollDirection scrollDirection)
1879 result r = E_SUCCESS;
1881 r = SetScrollChildBounds(*__pCtrlVe, CalculateScrollCtrlBounds(scrollDirection));
1882 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Failed to set bounds the __pCtrlVe.");
1884 if (__enableJumpToTop)
1886 r = SetScrollChildBounds(*__pJumpToTopVe, CalculateJumpToTopBounds(scrollDirection));
1887 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Failed to set bounds the __pJumpToTopVe.");
1889 __needUpdateJumpTopTop = true;
1892 if (__enableHandler)
1894 r = SetScrollChildBounds(*__pHandlerVe, CalculateHandlerBounds(scrollDirection));
1895 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Failed to set bounds the __pHandlerVe.");
1897 __needUpdateHandler = true;
1901 r = SetScrollChildBounds(*__pThumbVe, CalculateThumbBounds(scrollDirection));
1902 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Failed to set bounds the __pThumbVe.");
1904 __needUpdateThumb = true;
1907 r = SetScrollChildBounds(*__pFrontScrollingEffectVe, CalculateScrollingEffectFrontBounds(scrollDirection));
1908 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Failed to set bounds the __pFrontScrollingEffectVe.");
1910 r = SetScrollChildBounds(*__pReerScrollingEffectVe, CalculateScrollingEffectReerBounds(scrollDirection));
1911 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Failed to set bounds the __pReerScrollingEffectVe.");
1913 __needUpdateScrollingEffect = true;
1915 r = (GetControl().GetVisualElement())->InvalidateRectangle(null);
1916 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Failed to invalidate Control Ve.");
1922 _ScrollPresenter::SetParentBouncing(float rate)
1924 if (rate == __parentBouncingRate)
1929 _VisualElement* pParentVe = __pParentCtrl->GetVisualElement();
1930 IList* pChildrenVeList = null;
1931 result r = E_SUCCESS;
1933 if (__parentBouncingRate <= 0.0f)
1935 __beforeBouncingMatrixHash.RemoveAll(true);
1937 pChildrenVeList = pParentVe->GetChildrenN();
1938 r = GetLastResult();
1939 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Propagating.");
1941 for (int i = 0; i < pChildrenVeList->GetCount(); i++)
1943 VisualElement* pChildVe = static_cast<VisualElement*>(pChildrenVeList->GetAt(i));
1944 bool isSystemChild = false;
1945 for (int j = 0; j < __pParentCtrl->GetChildCount(); j++)
1947 _Control* pChild = __pParentCtrl->GetChild(j);
1948 _VisualElement* pChildControlVe = pChild->GetVisualElement();
1950 if (pChildControlVe == pChildVe && pChild->GetArea() == _CONTROL_AREA_SYSTEM)
1952 isSystemChild = true;
1962 Integer* pChildHashCode = new (std::nothrow) Integer(pChildVe->GetHashCode());
1963 SysTryCatch(NID_UI_CTRL, pChildHashCode, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
1965 FloatMatrix4* pOriginChildMatrix = new (std::nothrow) FloatMatrix4;
1966 SysTryCatch(NID_UI_CTRL, pOriginChildMatrix, delete pChildHashCode, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
1968 *pOriginChildMatrix = pChildVe->GetTransformMatrix();
1970 r = __beforeBouncingMatrixHash.Add(*pChildHashCode, *pOriginChildMatrix);
1971 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, (delete pChildHashCode, delete pOriginChildMatrix), r, "[%s] Propagating.",
1972 GetErrorMessage(r));
1974 delete pChildrenVeList;
1975 pChildrenVeList = null;
1978 __parentBouncingRate = rate;
1982 float scaleRate = 1.0f - (rate * (1.0f - SCROLLING_EFFECT_MIN_SCALE_RATE));
1983 float centerX = 0.0f;
1984 float centerY = 0.0f;
1985 Rectangle parentBounds = __pParentCtrl->GetBounds();
1986 int fixedScrollPosition = __scrollPositionCurr;
1988 if (__parentUsingViewport)
1990 if (fixedScrollPosition < 0)
1992 fixedScrollPosition = 0;
1994 else if (fixedScrollPosition > (__scrollRange - __viewRange))
1996 fixedScrollPosition = (__scrollRange -__viewRange);
2001 fixedScrollPosition = 0;
2004 if (__scrollDirection == SCROLL_DIRECTION_HORIZONTAL)
2006 centerX = parentBounds.width / 2.0f + fixedScrollPosition;
2007 centerY = parentBounds.height / 2.0f;
2011 centerX = parentBounds.width / 2.0f;
2012 centerY = parentBounds.height / 2.0f + fixedScrollPosition;
2015 pChildrenVeList = pParentVe->GetChildrenN();
2016 r = GetLastResult();
2017 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
2019 for (int i = 0; i < pChildrenVeList->GetCount(); i++)
2021 VisualElement* pChildVe = static_cast<VisualElement*>(pChildrenVeList->GetAt(i));
2022 bool isSystemChild = false;
2024 for (int j = 0; j < __pParentCtrl->GetChildCount(); j++)
2026 _Control* pChild = __pParentCtrl->GetChild(j);
2027 _VisualElement* pChildControlVe = pChild->GetVisualElement();
2029 if (pChildControlVe == pChildVe && pChild->GetArea() == _CONTROL_AREA_SYSTEM)
2031 isSystemChild = true;
2041 Integer* pChildHashCode = new (std::nothrow) Integer(pChildVe->GetHashCode());
2042 SysTryCatch(NID_UI_CTRL, pChildHashCode, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
2044 Object* pMatrixObject = __beforeBouncingMatrixHash.GetValue(*pChildHashCode);
2045 delete pChildHashCode;
2046 if (pMatrixObject == null)
2050 FloatMatrix4* pOriginChildMatrix = static_cast<FloatMatrix4*>(pMatrixObject);
2052 FloatRectangle childBounds = pChildVe->GetBounds();
2053 _TransformMatrix3Df transformMatrix;
2054 transformMatrix.SetTransformMatrix(*pOriginChildMatrix);
2055 transformMatrix.SetScaleAnchor(centerX - (childBounds.x + (childBounds.width / 2.0f)), centerY - (childBounds.y + (childBounds.height / 2.0f)), 0.0f);
2056 transformMatrix.SetScaleFactors(scaleRate, scaleRate, 1.0f);
2058 pChildVe->SetTransformMatrix(transformMatrix.GetTransformMatrix());
2060 delete pChildrenVeList;
2061 pChildrenVeList = null;
2065 pChildrenVeList = pParentVe->GetChildrenN();
2066 r = GetLastResult();
2067 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
2069 for (int i = 0; i < pChildrenVeList->GetCount(); i++)
2071 VisualElement* pChildVe = static_cast<VisualElement*>(pChildrenVeList->GetAt(i));
2072 bool isSystemChild = false;
2073 for (int j = 0; j < __pParentCtrl->GetChildCount(); j++)
2075 _Control* pChild = __pParentCtrl->GetChild(j);
2076 _VisualElement* pChildControlVe = pChild->GetVisualElement();
2078 if (pChildControlVe == pChildVe && pChild->GetArea() == _CONTROL_AREA_SYSTEM)
2080 isSystemChild = true;
2090 Integer* pChildHashCode = new (std::nothrow) Integer(pChildVe->GetHashCode());
2091 SysTryCatch(NID_UI_CTRL, pChildHashCode != null, , E_OUT_OF_MEMORY, "[%s] Propagating.", GetErrorMessage(E_OUT_OF_MEMORY));
2093 Object* pMatrixObject = __beforeBouncingMatrixHash.GetValue(*pChildHashCode);
2094 delete pChildHashCode;
2095 if (pMatrixObject == null)
2099 FloatMatrix4* pOriginChildMatrix = static_cast<FloatMatrix4*>(pMatrixObject);
2101 pChildVe->SetTransformMatrix(*pOriginChildMatrix);
2103 delete pChildrenVeList;
2104 pChildrenVeList = null;
2110 delete pChildrenVeList;
2116 _ScrollPresenter::DrawThumb(void)
2118 if (__needUpdateThumb != true)
2123 Canvas* pCanvas = null;
2124 Bitmap* pThumbBitmap = null;
2125 result r = E_SUCCESS;
2127 if (__enableHandler != true)
2129 pCanvas = __pThumbVe->GetCanvasN();
2130 SysTryReturnVoidResult(NID_UI_CTRL, pCanvas, GetLastResult(), "Failed to get the canvas of __pThumbVe");
2132 pCanvas->SetBackgroundColor(Color(0, 0, 0, 0));
2135 pThumbBitmap = _BitmapImpl::GetColorReplacedBitmapN(*__pThumbBitmap,
2136 Color::GetColor(COLOR_ID_MAGENTA),
2138 SysTryCatch(NID_UI_CTRL, pThumbBitmap, , GetLastResult(), "[%s] Failed to draw bitmap.",
2139 GetErrorMessage(GetLastResult()));
2141 Rectangle thumbBounds = GetScrollChildBounds(*__pThumbVe);
2142 thumbBounds.SetPosition(0, 0);
2143 r = DrawBitmap(*pCanvas, thumbBounds, *__pThumbEffectBitmap);
2144 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Failed to draw bitmap.", GetErrorMessage(r));
2146 r = DrawBitmap(*pCanvas, thumbBounds, *pThumbBitmap);
2147 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Failed to draw bitmap.", GetErrorMessage(r));
2150 __needUpdateThumb = false;
2154 delete pThumbBitmap;
2160 _ScrollPresenter::DrawJumpToTop(void)
2162 if (__needUpdateJumpTopTop != true)
2167 Canvas* pCanvas = null;
2168 Bitmap* pColorReplacedBitmap = null;
2169 result r = E_SUCCESS;
2171 if (__enableJumpToTop)
2173 Bitmap* pBitmap = __pJumpToTopBitmap;
2174 Bitmap* pEfBitmap = __pJumpToTopEfBitmap;
2175 if (__scrollDirection == SCROLL_DIRECTION_HORIZONTAL)
2177 pBitmap = __pJumpToTopLeftBitmap;
2178 pEfBitmap = __pJumpToTopLeftEfBitmap;
2181 Color jumpToTopColor = (__jumpToTopPressed) ? __jumpToTopColorPressed : __jumpToTopColor;
2182 Color buttonColor = (__jumpToTopPressed) ? __buttonColorPressed : __buttonColor;
2183 Bitmap* pButtonEfBitmap = (__jumpToTopPressed) ? __pButtonPressBitmap : __pButtonEfBitmap;
2185 pCanvas = __pJumpToTopVe->GetCanvasN();
2186 SysTryReturnVoidResult(NID_UI_CTRL, pCanvas, GetLastResult(), "Failed to get the canvas of __pJumpToTopVe");
2188 pCanvas->SetBackgroundColor(Color(0, 0, 0, 0));
2191 Rectangle jumpToTopBounds = GetScrollChildBounds(*__pJumpToTopVe);
2192 jumpToTopBounds.SetPosition(0, 0);
2195 r = DrawBitmap(*pCanvas, jumpToTopBounds, *pButtonEfBitmap);
2196 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Failed to draw bitmap.", GetErrorMessage(r));
2198 pColorReplacedBitmap = _BitmapImpl::GetColorReplacedBitmapN(*__pButtonBitmap,
2199 Color::GetColor(COLOR_ID_MAGENTA),
2201 SysTryCatch(NID_UI_CTRL, pColorReplacedBitmap, , GetLastResult(), "[%s] Failed to draw bitmap.", GetErrorMessage(GetLastResult()));
2203 r = DrawBitmap(*pCanvas, jumpToTopBounds, *pColorReplacedBitmap);
2204 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Failed to draw bitmap.", GetErrorMessage(r));
2206 r = DrawBitmap(*pCanvas, jumpToTopBounds, *pEfBitmap);
2207 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Failed to draw bitmap.", GetErrorMessage(r));
2209 pColorReplacedBitmap = _BitmapImpl::GetColorReplacedBitmapN(*pBitmap,
2210 Color::GetColor(COLOR_ID_MAGENTA),
2212 SysTryCatch(NID_UI_CTRL, pColorReplacedBitmap, , GetLastResult(), "[%s] Failed to draw bitmap.", GetErrorMessage(GetLastResult()));
2214 r = DrawBitmap(*pCanvas, jumpToTopBounds, *pColorReplacedBitmap);
2215 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Failed to draw bitmap.", GetErrorMessage(r));
2218 __needUpdateJumpTopTop = false;
2222 delete pColorReplacedBitmap;
2228 _ScrollPresenter::DrawHandler(void)
2230 if (__needUpdateHandler != true)
2235 Canvas* pCanvas = null;
2236 Bitmap* pHandlerBgBitmap = null;
2237 result r = E_SUCCESS;
2239 if (__enableHandler)
2241 // handler bounds setting
2242 pCanvas = __pHandlerVe->GetCanvasN();
2243 SysTryReturnVoidResult(NID_UI_CTRL, pCanvas, GetLastResult(), "Failed to get the canvas of __pHandlerVe");
2246 pCanvas->SetBackgroundColor(Color(0, 0, 0, 0));
2249 // draw handler bg bitmap
2250 pHandlerBgBitmap = _BitmapImpl::GetColorReplacedBitmapN(*__pHandlerBgBitmap,
2251 Color::GetColor(COLOR_ID_MAGENTA),
2253 SysTryCatch(NID_UI_CTRL, pHandlerBgBitmap, , GetLastResult(), "[%s] Failed to draw bitmap.", GetErrorMessage(GetLastResult()));
2255 Rectangle handlerBounds = GetScrollChildBounds(*__pHandlerVe);
2256 handlerBounds.SetPosition(0, 0);
2258 r = DrawBitmap(*pCanvas, handlerBounds, *__pHandlerBgEffectBitmap);
2259 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Failed to draw bitmap.", GetErrorMessage(r));
2261 r = DrawBitmap(*pCanvas, handlerBounds, *pHandlerBgBitmap);
2262 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Failed to draw bitmap.", GetErrorMessage(r));
2264 r = DrawBitmap(*pCanvas, handlerBounds, *__pHandlerBitmap);
2265 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Failed to draw bitmap.", GetErrorMessage(r));
2268 __needUpdateHandler = false;
2272 delete pHandlerBgBitmap;
2278 _ScrollPresenter::DrawScrollingEffect(void)
2280 if (__needUpdateScrollingEffect != true)
2285 Canvas* pCanvas = null;
2286 result r = E_SUCCESS;
2288 if (__pFrontScrollingEffectBitmap != null)
2290 pCanvas = __pFrontScrollingEffectVe->GetCanvasN();
2291 SysTryReturnVoidResult(NID_UI_CTRL, pCanvas, GetLastResult(), "[%s] Failed to get the canvas of __pFrontScrollingEffectVe", GetErrorMessage(GetLastResult()));
2294 pCanvas->SetBackgroundColor(Color(0, 0, 0, 0));
2297 Rectangle effectBounds = GetScrollChildBounds(*__pFrontScrollingEffectVe);
2298 effectBounds.SetPosition(0, 0);
2299 r = DrawBitmap(*pCanvas, effectBounds, *__pFrontScrollingEffectBitmap);
2300 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Failed to draw bitmap.", GetErrorMessage(r));
2305 if (__pReerScrollingEffectBitmap != null)
2307 pCanvas = __pReerScrollingEffectVe->GetCanvasN();
2308 SysTryReturnVoidResult(NID_UI_CTRL, pCanvas, GetLastResult(), "[%s] Failed to get the canvas of __pReerScrollingEffectVe", GetErrorMessage(GetLastResult()));
2311 pCanvas->SetBackgroundColor(Color(0, 0, 0, 0));
2314 Rectangle effectBounds = GetScrollChildBounds(*__pReerScrollingEffectVe);
2315 effectBounds.SetPosition(0, 0);
2316 r = DrawBitmap(*pCanvas, effectBounds, *__pReerScrollingEffectBitmap);
2317 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Failed to draw bitmap.", GetErrorMessage(r));
2322 __needUpdateScrollingEffect = false;
2331 _ScrollPresenter::DrawBitmap(Canvas& canvas, const Rectangle& bounds, const Bitmap& bitmap)
2333 result r = E_SUCCESS;
2334 if (bitmap.IsNinePatchedBitmap())
2336 r = canvas.DrawNinePatchedBitmap(bounds, bitmap);
2337 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Failed to draw ninepathced bitmap");
2341 Point pos((bounds.width - bitmap.GetWidth()) / 2, (bounds.height - bitmap.GetHeight()) / 2);
2342 r = canvas.DrawBitmap(pos, bitmap);
2343 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Failed to draw bitmap");
2350 _ScrollPresenter::OnTouchPressedJumpToTop(const _Control& source, const _TouchInfo& touchinfo)
2352 if (__enableJumpToTop && IsScrollVisible())
2354 FloatRectangle ctrlBounds = __pCtrlVe->GetBounds();
2355 Rectangle jumpToTopBounds = GetScrollChildBounds(*__pJumpToTopVe);
2356 jumpToTopBounds.x += ctrlBounds.x;
2357 jumpToTopBounds.y += ctrlBounds.y;
2358 if (jumpToTopBounds.Contains(touchinfo.GetCurrentPosition()))
2360 __needUpdateJumpTopTop = true;
2361 __jumpToTopPressed = true;
2362 (GetControl().GetVisualElement())->InvalidateRectangle(null);
2366 _UiScrollEventArg* pEventArg = _UiScrollEventArg::GetScrollEventArgN(*__pScrollCtrl, 0);
2367 SysTryReturn(NID_UI_CTRL, pEventArg, true, GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
2369 __pScrollEvent->Fire(*pEventArg);
2380 _ScrollPresenter::OnTouchReleasedJumpToTop(const _Control& source, const _TouchInfo& touchinfo)
2382 if (__jumpToTopPressed)
2384 __needUpdateJumpTopTop = true;
2387 __jumpToTopPressed = false;
2388 (GetControl().GetVisualElement())->InvalidateRectangle(null);
2393 _ScrollPresenter::OnTouchMovedJumpToTop(const _Control& source, const _TouchInfo& touchinfo)
2395 if (__jumpToTopPressed)
2397 FloatRectangle ctrlBounds = __pCtrlVe->GetBounds();
2398 Rectangle jumpToTopBounds = GetScrollChildBounds(*__pJumpToTopVe);
2399 jumpToTopBounds.x += ctrlBounds.x;
2400 jumpToTopBounds.y += ctrlBounds.y;
2401 if (!(jumpToTopBounds.Contains(touchinfo.GetCurrentPosition())))
2403 __needUpdateJumpTopTop = true;
2404 __jumpToTopPressed = false;
2405 (GetControl().GetVisualElement())->InvalidateRectangle(null);
2413 _ScrollPresenter::OnTouchPressedHandler(const _Control& source, const _TouchInfo& touchinfo)
2415 if (__enableHandler)
2417 FloatRectangle ctrlBounds = __pCtrlVe->GetBounds();
2418 Rectangle handlerBounds = GetScrollChildBounds(*__pHandlerVe);
2419 handlerBounds.x += ctrlBounds.x;
2420 handlerBounds.y += ctrlBounds.y;
2421 if (handlerBounds.Contains(touchinfo.GetCurrentPosition()))
2423 __handlerTouched = true;
2424 if (__scrollDirection == SCROLL_DIRECTION_VERTICAL)
2426 __handlerTouchedPosition = touchinfo.GetCurrentPosition().y;
2430 __handlerTouchedPosition = touchinfo.GetCurrentPosition().x;
2440 _ScrollPresenter::OnTouchReleasedHandler(const _Control& source, const _TouchInfo& touchinfo)
2442 if (__enableHandler)
2444 __handlerTouched = false;
2445 __handlerTouchedPosition = 0;
2450 // forwarding OnTouchReleased event to parent control
2455 _ScrollPresenter::OnTouchMovedHandler(const _Control& source, const _TouchInfo& touchinfo)
2457 if (__enableHandler && __handlerTouched)
2459 int scrollPosition = GetScrollPosition();
2460 Rectangle scrollCtrlBounds = GetControl().GetBounds();
2461 int touchPosition = 0;
2462 int scrollBoundsRange = 0;
2464 if (__scrollDirection == SCROLL_DIRECTION_VERTICAL)
2466 touchPosition = touchinfo.GetCurrentPosition().y;
2467 scrollBoundsRange = scrollCtrlBounds.height;
2471 touchPosition = touchinfo.GetCurrentPosition().x;
2472 scrollBoundsRange = scrollCtrlBounds.width;
2476 int touchDistance = touchPosition - __handlerTouchedPosition;
2477 int scrollDistance = (int)(( __scrollRange * touchDistance) / scrollBoundsRange);
2479 scrollPosition += scrollDistance;
2481 int scrollType = -1;
2482 if (scrollPosition <= 0)
2484 scrollType = (__scrollDirection == SCROLL_DIRECTION_VERTICAL) ? SCROLL_END_EVENT_END_TOP : SCROLL_END_EVENT_END_LEFT;
2487 else if (scrollPosition >= __scrollRange - __viewRange)
2489 scrollType = (__scrollDirection == SCROLL_DIRECTION_VERTICAL) ? SCROLL_END_EVENT_END_BOTTOM :
2490 SCROLL_END_EVENT_END_RIGHT;
2491 scrollPosition = __scrollRange - __viewRange;
2494 result r = SetScrollPosition(scrollPosition);
2495 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, true, r, "[%s] Failed to set scroll position.", GetErrorMessage(r));
2497 __handlerTouchedPosition = touchPosition;
2502 _UiScrollEventArg* pEventArg = null;
2503 if (scrollType >= 0)
2505 pEventArg = _UiScrollEventArg::GetScrollEventArgN(*__pScrollCtrl, (ScrollEndEvent)scrollType);
2506 SysTryReturn(NID_UI_CTRL, pEventArg, true, GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
2510 pEventArg = _UiScrollEventArg::GetScrollEventArgN(*__pScrollCtrl, GetScrollPosition());
2511 SysTryReturn(NID_UI_CTRL, pEventArg, true, GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
2514 __pScrollEvent->Fire(*pEventArg);
2520 // forwarding OnTouchMoved event to parent control
2525 _ScrollPresenter::SetParentCtrl(_Control& parentCtrl)
2527 __pParentCtrl = &parentCtrl;
2531 _ScrollPresenter::GetParentCtrl(void) const
2533 return *__pParentCtrl;
2537 _ScrollPresenter::SetControl(_Scroll& scrollCtrl)
2539 __pScrollCtrl = &scrollCtrl;
2543 _ScrollPresenter::GetControl(void) const
2545 return *__pScrollCtrl;
2548 }}} // Tizen::Ui::Controls