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.
18 * @file FUi_ControlImpl.cpp
19 * @brief This is the implementation file for _ControlImpl class.
22 #include <FBaseColArrayListT.h>
23 #include <FBaseColLinkedListT.h>
24 #include <FBaseRtIEventListener.h>
25 #include <FBaseRtITimerEventListener.h>
26 #include <FUiIDragDropEventListener.h>
27 #include <FUiAccessibilityContainer.h>
28 #include <FUiAnimControlAnimator.h>
29 #include <FUiTouchGestureDetector.h>
30 #include <FApp_AppInfo.h>
31 #include <FBaseSysLog.h>
32 #include <FBase_Log.h>
33 #include "FUi_ControlImpl.h"
34 #include "FUi_ContainerImpl.h"
35 #include "FUi_Control.h"
36 #include "FUi_ControlManager.h"
37 #include "FUi_ControlImplManager.h"
38 #include "FUi_UiEventManager.h"
39 #include "FUi_UiNotificationEvent.h"
40 #include "FUi_UiTouchEvent.h"
41 #include "FUi_TouchManager.h"
42 #include "FUi_TouchEventArg.h"
43 #include "FUi_ITouchLongPressGestureEventListener.h"
44 #include "FUi_TouchFlickGestureDetector.h"
45 #include "FUi_TouchGestureDetectorImpl.h"
46 #include "FUi_AccessibilityContainerImpl.h"
47 #include "FUi_ResourceManager.h"
48 #if defined(MULTI_WINDOW)
49 #include "FUi_WindowImpl.h"
51 #include "FUiAnim_VisualElement.h"
52 #include "FUiAnim_VisualElementImpl.h"
56 using namespace Tizen::Base;
57 using namespace Tizen::Base::Collection;
58 using namespace Tizen::Base::Runtime;
59 using namespace Tizen::Graphics;
60 using namespace Tizen::Ui::Animations;
61 using namespace Tizen::App;
62 using namespace Tizen::Base::Utility;
64 namespace Tizen { namespace Ui {
66 _ControlImpl::SizeInfo::~SizeInfo(void)
71 _ControlImpl::SizeInfo::GetDefaultMinimumSize(_ControlOrientation orientation) const
73 return Dimension(0, 0);
77 _ControlImpl::SizeInfo::GetDefaultMaximumSize(_ControlOrientation orientation) const
79 return Dimension(_Control::MAX_LENGTH, _Control::MAX_LENGTH);
83 _ControlImpl::SizeInfo::GetMinimumSizeLimit(_ControlOrientation orientation) const
85 return Dimension(0, 0);
89 _ControlImpl::SizeInfo::GetMaximumSizeLimit(_ControlOrientation orientation) const
91 return Dimension(_Control::MAX_LENGTH, _Control::MAX_LENGTH);
95 _ControlImpl::SizeInfo::CheckInitialSizeValid(const Dimension& size, _ControlOrientation orientation) const
99 const Dimension minSize = GetDefaultMinimumSize(orientation);
100 const Dimension maxSize = GetDefaultMaximumSize(orientation);
103 (minSize.width <= size.width) && (size.width <= maxSize.width), E_INVALID_ARG,
104 E_INVALID_ARG, "[E_INVALID_ARG] The width %d is out of width range(%d ~ %d).",
105 size.width, minSize.width, maxSize.width);
108 (minSize.height <= size.height) && (size.height <= maxSize.height), E_INVALID_ARG,
109 E_INVALID_ARG, "[E_INVALID_ARG] The height %d is out of height range(%d ~ %d).",
110 size.height, minSize.height, maxSize.height);
115 const _ControlImpl::SizeInfo&
116 _ControlImpl::GetFullScreenSizeInfo(void)
118 class FullScreenSizeInfo : public _ControlImpl::SizeInfo
121 virtual Dimension GetDefaultMinimumSize(_ControlOrientation orientation) const
123 return GetScreenSize();
126 virtual Dimension GetDefaultMaximumSize(_ControlOrientation orientation) const
128 return GetScreenSize();
131 virtual Dimension GetMinimumSizeLimit(_ControlOrientation orientation) const
133 return GetScreenSize();
136 virtual Dimension GetMaximumSizeLimit(_ControlOrientation orientation) const
138 return GetScreenSize();
142 Dimension GetScreenSize(void) const
144 _ControlManager* pMgr = _ControlManager::GetInstance();
145 SysTryReturn(NID_UI, pMgr, Dimension(0, 0), E_SYSTEM, "[E_SYSTEM] Failed to get control manager.");
146 return pMgr->GetScreenSize();
150 static FullScreenSizeInfo sizeInfo;
154 // [ToDo] How to turn-off callback while initializing: Reset/Set delegate?
156 _ControlImpl::InitializeBoundsProperties(const SizeInfo& sizeInfo, _ControlOrientation orientation)
158 result r = E_SUCCESS;
160 bool resizable = IsResizable();
163 r = SetMinimumSize(sizeInfo.GetDefaultMinimumSize(orientation));
165 r == E_SUCCESS, E_SYSTEM,
166 E_SYSTEM, "[E_SYSTEM] Failed to initialize default minimum size.");
168 r = SetMaximumSize(sizeInfo.GetDefaultMaximumSize(orientation));
170 r == E_SUCCESS, E_SYSTEM,
171 E_SYSTEM, "[E_SYSTEM] Failed to initialize default maximum size.");
173 SetResizable(resizable);
179 _ControlImpl::InitializeBoundsProperties(const SizeInfo& sizeInfo, const Tizen::Graphics::Rectangle& bounds, _ControlOrientation orientation)
181 result r = InitializeBoundsProperties(sizeInfo, orientation);
187 bool movable = IsMovable();
188 bool resizable = IsResizable();
192 r = SetBounds(bounds);
195 SetResizable(resizable);
201 _ControlImpl::InitializeBoundsProperties(const SizeInfo& sizeInfo, const Tizen::Graphics::Dimension& size, _ControlOrientation orientation)
203 return InitializeBoundsProperties(sizeInfo, Rectangle(0, 0, size.width, size.height), orientation);
207 _ControlImpl::CreateControlImplN(Control& control)
210 result r = E_SUCCESS;
212 _Control* pCore = _Control::CreateControlN();
214 SysTryReturn(NID_UI, pCore, null, r, "[%s] Propagating.", GetErrorMessage(r));
216 _ControlImpl* pImpl = new (std::nothrow) _ControlImpl(&control, pCore);
217 r = CheckConstruction(pCore, pImpl);
218 SysTryReturn(NID_UI, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
224 _ControlImpl::GetInstance(Control& control)
226 return static_cast <_ControlImpl*> (control._pControlImpl);
230 _ControlImpl::GetInstance(const Control& control)
232 return static_cast <const _ControlImpl*> (control._pControlImpl);
236 _ControlImpl::CheckConstruction(_Control* pCore, _ControlImpl* pImpl)
242 SysLogException(NID_UI, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Insufficient memory.");
243 return E_OUT_OF_MEMORY;
246 result r = GetLastResult();
251 SysLogException(NID_UI, r, "[%s] Propagating.", GetErrorMessage(r));
258 const Tizen::Base::String _USER_EVENT = L"UserEvent";
259 const Tizen::Base::String _REQUEST_REDRAW_EVENT = L"RequestRedrawEvent";
260 const Tizen::Base::String _KEYBOARD_INSERTED_EVENT = L"KeyboardInsertedEvent";
261 const int keyPressTimer = 500;
262 const int doublePressTime = 330;
263 const int doublePressMoveAllowance = 10;
266 : public Tizen::Base::Object
269 _UserEventInfo(RequestId requestId, const IList* pArgs)
270 : __requestId(requestId)
271 , __pArgs(const_cast <IList*>(pArgs))
274 virtual ~_UserEventInfo(void) {}
276 RequestId GetRequestId(void) const
287 _UserEventInfo(const _UserEventInfo& rhs);
288 _UserEventInfo& operator =(const _UserEventInfo& rhs);
291 RequestId __requestId;
295 class _ControlImpl::CoreKeyEvent
298 CoreKeyEvent(_ControlImpl& impl)
300 , __core(impl.GetCore())
301 , __public(impl.GetPublic())
310 bool IsPublicKey(_KeyCode keyCode)
312 bool isPublicKey = false;
314 if (keyCode <= _KEY_HARDWARE_MAX)
322 result FirePublicListener(IKeyEventListener& listener, KeyState keyState, KeyCode keyCode)
324 result r = E_SUCCESS;
329 listener.OnKeyPressed(__public, keyCode);
332 listener.OnKeyReleased(__public, keyCode);
334 case KEY_LONGPRESSED:
335 listener.OnKeyLongPressed(__public, keyCode);
347 bool ProcessListener(KeyState keyState, _KeyCode keyCode)
349 bool filterd = false;
352 if (IsPublicKey(keyCode))
354 IEnumeratorT <IEventListener*>* pEnumerator = __impl.__pPublicKeyEventListeners->GetEnumeratorN();
357 while (pEnumerator->MoveNext() == E_SUCCESS)
359 IEventListener* pListener = null;
360 pEnumerator->GetCurrent(pListener);
362 IKeyEventListener* pKeyEventListener = dynamic_cast <IKeyEventListener*>(pListener);
363 if (pKeyEventListener)
365 FirePublicListener(*pKeyEventListener, keyState, (KeyCode)keyCode);
372 if (__impl.IsInputEventConsumed())
374 __impl.ResetInputEventConsumed();
381 if (IsPublicKey(keyCode))
383 IKeyEventListener* pDefaultListener = __impl.GetDefaultKeyEventListener();
384 if (pDefaultListener)
386 FirePublicListener(*pDefaultListener, keyState, (KeyCode)keyCode);
388 if (__impl.IsInputEventConsumed())
390 __impl.ResetInputEventConsumed();
402 CoreKeyEvent(const CoreKeyEvent& rhs);
403 CoreKeyEvent& operator =(const CoreKeyEvent& rhs);
406 _ControlImpl& __impl;
411 class _ControlImpl::CoreTouchEvent
414 CoreTouchEvent(_ControlImpl& impl)
416 , __core(impl.GetCore())
417 , __public(impl.GetPublic())
418 , __oldPreviousPressedTime(0)
419 , __previousPressedTime(0)
420 , __currentPressedTime(0)
421 , __previousPressedPoint(0, 0)
422 , __currentPressedPoint(0, 0)
425 __pTouchManager = _TouchManager::GetInstance();
426 SysTryReturnVoidResult(NID_UI, __pTouchManager, E_SYSTEM, "[E_SYSTEM] System error occurred.");
429 ~CoreTouchEvent(void)
435 _TouchEventArg* GetTouchEventArgN(const _TouchInfo& touchInfo)
437 _TouchEventArg* pEventArg = new (std::nothrow) _TouchEventArg(__public, touchInfo.GetTouchStatus());
438 SysTryReturn(NID_UI, pEventArg, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");
440 Point startPoint(__pTouchManager->GetStartPoint(touchInfo.GetPointId()).x - __core.GetAbsoluteBounds().x,
441 __pTouchManager->GetStartPoint(touchInfo.GetPointId()).y - __core.GetAbsoluteBounds().y);
443 pEventArg->SetTouchPosition(touchInfo.GetPointId(), startPoint.x, startPoint.y,
444 touchInfo.GetCurrentPosition().x, touchInfo.GetCurrentPosition().y);
448 __impl.__pFlickGestureDetector->GetDistance(xDistance, yDistance);
450 if (xDistance != 0 || yDistance != 0)
452 pEventArg->SetFlickedStatus(true);
456 pEventArg->SetFlickedStatus(false);
462 result FirePublicListener(ITouchEventListener& listener, const TouchEventInfo& touchEventInfo)
464 result r = E_SUCCESS;
466 switch (touchEventInfo.GetTouchStatus())
469 listener.OnTouchPressed(__public, touchEventInfo.GetCurrentPosition(), touchEventInfo);
471 case TOUCH_LONG_PRESSED:
472 listener.OnTouchLongPressed(__public, touchEventInfo.GetCurrentPosition(), touchEventInfo);
475 listener.OnTouchReleased(__public, touchEventInfo.GetCurrentPosition(), touchEventInfo);
478 listener.OnTouchMoved(__public, touchEventInfo.GetCurrentPosition(), touchEventInfo);
480 case TOUCH_DOUBLE_PRESSED:
481 listener.OnTouchDoublePressed(__public, touchEventInfo.GetCurrentPosition(), touchEventInfo);
484 listener.OnTouchFocusIn(__public, touchEventInfo.GetCurrentPosition(), touchEventInfo);
486 case TOUCH_FOCUS_OUT:
487 listener.OnTouchFocusOut(__public, touchEventInfo.GetCurrentPosition(), touchEventInfo);
490 listener.OnTouchCanceled(__public, touchEventInfo.GetCurrentPosition(), touchEventInfo);
501 result FireFocusListener(ITouchEventListener& listener, const TouchEventInfo& touchEventInfo)
503 result r = E_SUCCESS;
505 _ControlManager* pControlManager = _ControlManager::GetInstance();
506 SysTryReturn(NID_UI, pControlManager, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] System error occurred.");
508 _TouchManager* pTouchManager = _TouchManager::GetInstance();
509 SysTryReturn(NID_UI, pTouchManager, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] System error occurred.");
511 Point screenPoint(pTouchManager->GetScreenPoint(touchEventInfo.GetPointId()).x, pTouchManager->GetScreenPoint(touchEventInfo.GetPointId()).y);
513 _Control* pTouchedControl = pControlManager->GetTopmostTouchedControl(screenPoint);
514 SysTryReturn(NID_UI, pTouchedControl, E_INVALID_CONDITION, E_INVALID_CONDITION, "[E_INVALID_CONDITION] pTouchedControl is null.");
516 if (__pTouchManager->GetFocusedControlSource() != pTouchedControl)
518 if (&(__core) != pTouchedControl)
520 if (__pTouchManager->GetFocusedControlSource() == &(__core))
522 listener.OnTouchFocusOut(__public, touchEventInfo.GetCurrentPosition(), touchEventInfo);
527 listener.OnTouchFocusIn(__public, touchEventInfo.GetCurrentPosition(), touchEventInfo);
530 __pTouchManager->SetFocusedControlSource(*pTouchedControl);
537 result ProcessDragListener(const _TouchInfo& touchInfo)
539 if (!__core.IsDragEnabled())
541 return E_INVALID_CONDITION;
544 result r = E_SUCCESS;
546 IEnumeratorT <IEventListener*>* pDragEnumerator = __impl.__pPublicDragDropEventListeners->GetEnumeratorN();
549 while (pDragEnumerator->MoveNext() == E_SUCCESS)
551 IEventListener* pDragListener = null;
552 pDragEnumerator->GetCurrent(pDragListener);
554 if (pDragListener != null)
556 IDragDropEventListener* pDragDropEventListener = dynamic_cast <IDragDropEventListener*>(pDragListener);
557 if (pDragDropEventListener != null)
559 pDragDropEventListener->OnTouchDragged(__public, touchInfo.GetCurrentPosition(), touchInfo.GetCurrentPosition());
563 delete pDragEnumerator;
569 result ProcessDropListener(const _TouchInfo& touchInfo)
571 if (!__core.IsDropEnabled())
573 return E_INVALID_CONDITION;
576 result r = E_SUCCESS;
578 _Control* pDraggedControl = __pTouchManager->GetTouchControlSource();
579 if (pDraggedControl != null)
581 IEnumeratorT<IEventListener*>* pDropEnumerator = __impl.__pPublicDragDropEventListeners->GetEnumeratorN();
584 while (pDropEnumerator->MoveNext() == E_SUCCESS)
586 IEventListener* pDropListener = null;
587 pDropEnumerator->GetCurrent(pDropListener);
589 if (pDropListener != null)
591 IDragDropEventListener* pDropEventListener = dynamic_cast <IDragDropEventListener*>(pDropListener);
592 if (pDropEventListener != null)
594 pDropEventListener->OnTouchDropped(__public, __pTouchManager->GetStartPoint(touchInfo.GetPointId()), touchInfo.GetCurrentPosition());
599 delete pDropEnumerator;
606 result ProcessDropListenerToTopControl(const _TouchInfo& touchInfo)
608 result r = E_SUCCESS;
609 Point pt(__pTouchManager->GetScreenPoint(touchInfo.GetPointId()).x, __pTouchManager->GetScreenPoint(touchInfo.GetPointId()).y);
611 _Control* pCapturedControl = __pTouchManager->GetCapturedControl();
612 _Control* pDraggedControl = __pTouchManager->GetTouchControlSource();
613 if (!pDraggedControl || pCapturedControl)
619 _Control* pTopmostTouchedSource = __core.GetTopmostChildAt(pt);
620 if (!pTopmostTouchedSource)
626 if (!pTopmostTouchedSource->IsDragEnabled())
628 return E_INVALID_CONDITION;
631 TouchEventInfo publicTouchInfo;
633 _TouchEventArg* pEventArg = GetTouchEventArgN(touchInfo);
634 SysTryReturn(NID_UI, pEventArg, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");
636 publicTouchInfo.Construct(*pEventArg);
638 if (pTopmostTouchedSource != pDraggedControl)
640 _ControlImpl* pTopmostTouchedTarget = static_cast <_ControlImpl*>(pTopmostTouchedSource->GetUserData());
641 SysTryCatch(NID_UI, pTopmostTouchedTarget, , E_SYSTEM, "[E_SYSTEM] System error occurred.");
643 IEnumeratorT <Runtime::IEventListener*>* pDropEnumerator =
644 pTopmostTouchedTarget->GetDragDropEventListener()->GetEnumeratorN();
648 while (pDropEnumerator->MoveNext() == E_SUCCESS)
650 IEventListener* pDropListener = null;
651 pDropEnumerator->GetCurrent(pDropListener);
653 if (pDropListener != null)
655 IDragDropEventListener* pDropEventListener = dynamic_cast <IDragDropEventListener*>(pDropListener);
656 if (pDropEventListener != null)
658 pDropEventListener->OnTouchDropped(pTopmostTouchedTarget->GetPublic(),
659 publicTouchInfo.GetStartPosition(), touchInfo.GetCurrentPosition());
663 delete pDropEnumerator;
666 IEnumeratorT <Runtime::IEventListener*>* pEnumerator =
667 pTopmostTouchedTarget->GetTouchEventListener()->GetEnumeratorN();
671 while (pEnumerator->MoveNext() == E_SUCCESS)
673 Runtime::IEventListener* pListener = null;
674 pEnumerator->GetCurrent(pListener);
676 if (pListener != null)
678 ITouchEventListener* pPublicListener = dynamic_cast <ITouchEventListener*>(pListener);
679 SysAssert(pPublicListener);
681 pPublicListener->OnTouchReleased(pTopmostTouchedTarget->GetPublic(), touchInfo.GetCurrentPosition(), publicTouchInfo);
687 if (pTopmostTouchedTarget->IsInputEventConsumed())
689 pTopmostTouchedTarget->ResetInputEventConsumed();
693 ITouchEventListener* pDefaultListener = pTopmostTouchedTarget->GetDefaultTouchEventListener();
694 if (pDefaultListener)
696 pDefaultListener->OnTouchReleased(pTopmostTouchedTarget->GetPublic(), touchInfo.GetCurrentPosition(), publicTouchInfo);
698 if (pTopmostTouchedTarget->IsInputEventConsumed())
700 pTopmostTouchedTarget->ResetInputEventConsumed();
705 if (pTopmostTouchedTarget->OnTouchReleased(*pTopmostTouchedTarget, touchInfo))
717 pTopmostTouchedSource->OnTouchReleased(*pTopmostTouchedSource, touchInfo);
738 bool ProcessListener(const _TouchInfo& touchInfo)
740 bool filterd = false;
742 TouchEventInfo publicTouchInfo;
744 _TouchEventArg* pEventArg = GetTouchEventArgN(touchInfo);
745 SysTryReturn(NID_UI, pEventArg, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");
747 publicTouchInfo.Construct(*pEventArg);
749 _Control* pDraggedControl = __pTouchManager->GetTouchControlSource();
752 IEnumeratorT<IEventListener*>* pEnumerator = __impl.__pPublicTouchEventListeners->GetEnumeratorN();
755 while (pEnumerator->MoveNext() == E_SUCCESS)
757 IEventListener* pListener = null;
758 pEnumerator->GetCurrent(pListener);
760 ITouchEventListener* pTouchEventListener = dynamic_cast <ITouchEventListener*>(pListener);
761 if (pTouchEventListener)
763 FirePublicListener(*pTouchEventListener, publicTouchInfo);
765 if (touchInfo.GetTouchStatus() == _TOUCH_RELEASED)
767 if (pDraggedControl == null) //if exist dragged control, don't send focus event
769 FireFocusListener(*pTouchEventListener, publicTouchInfo);
772 else if (touchInfo.GetTouchStatus() == _TOUCH_MOVED)
774 FireFocusListener(*pTouchEventListener, publicTouchInfo);
779 SysAssert(pTouchEventListener);
785 if (__impl.IsInputEventConsumed())
787 __impl.ResetInputEventConsumed();
800 ITouchEventListener* pDefaultListener = __impl.GetDefaultTouchEventListener();
801 if (pDefaultListener)
803 FirePublicListener(*pDefaultListener, publicTouchInfo);
805 if (__impl.IsInputEventConsumed())
807 __impl.ResetInputEventConsumed();
825 bool ProcessDoublePress(const _TouchInfo& touchinfo, bool& isFiltered)
827 if (__pTouchManager->GetPointCount() == 1)
829 __oldPreviousPressedTime = __previousPressedTime;
830 __previousPressedTime = __currentPressedTime;
831 __currentPressedTime = touchinfo.GetTimeStamp();
832 __previousPressedPoint.x = __currentPressedPoint.x;
833 __previousPressedPoint.y = __currentPressedPoint.y;
834 __currentPressedPoint.x = touchinfo.GetCurrentPosition().x;
835 __currentPressedPoint.y = touchinfo.GetCurrentPosition().y;
837 if (Math::Abs(__previousPressedTime - __currentPressedTime) < doublePressTime)
839 if (Math::Abs(__previousPressedTime - __oldPreviousPressedTime) > doublePressTime)
841 if (Math::Abs(__previousPressedPoint.x - __currentPressedPoint.x) < doublePressMoveAllowance
842 && Math::Abs(__previousPressedPoint.y - __currentPressedPoint.y) < doublePressMoveAllowance )
844 _TouchInfo touchInfo(0, _TOUCH_DOUBLE_PRESSED, __pTouchManager->GetPosition(0), false, 0);
846 SysTryReturn(NID_UI, __impl.__pCoreTouchEvent, false, E_SYSTEM, "[E_SYSTEM] System error occurred.");
847 isFiltered = __impl.__pCoreTouchEvent->ProcessListener(touchInfo);
859 CoreTouchEvent(const CoreTouchEvent& rhs);
860 CoreTouchEvent& operator =(const CoreTouchEvent& rhs);
863 _ControlImpl& __impl;
866 _TouchManager* __pTouchManager;
867 unsigned int __oldPreviousPressedTime;
868 unsigned int __previousPressedTime;
869 unsigned int __currentPressedTime;
870 Point __previousPressedPoint;
871 Point __currentPressedPoint;
874 class _ControlImpl::CoreFocusEvent
877 CoreFocusEvent(_ControlImpl& impl)
879 , __core(impl.GetCore())
880 , __public(impl.GetPublic())
884 ~CoreFocusEvent(void)
889 result FirePublicListener(IFocusEventListener& listener, FocusStatus focusState)
891 result r = E_SUCCESS;
896 listener.OnFocusGained(__public);
899 listener.OnFocusLost(__public);
911 bool ProcessListener(FocusStatus focusState)
913 bool filterd = false;
916 IEnumeratorT <IEventListener*>* pEnumerator = __impl.__pPublicFocusEventListeners->GetEnumeratorN();
919 while (pEnumerator->MoveNext() == E_SUCCESS)
921 Runtime::IEventListener* pListener = null;
922 pEnumerator->GetCurrent(pListener);
923 IFocusEventListener* pFocusEventListener = dynamic_cast <IFocusEventListener*>(pListener);
924 if (pFocusEventListener)
926 FirePublicListener(*pFocusEventListener, focusState);
937 CoreFocusEvent(const CoreFocusEvent& rhs);
938 CoreFocusEvent& operator =(const CoreFocusEvent& rhs);
941 _ControlImpl& __impl;
946 class _ControlImpl::CoreGestureEvent
949 CoreGestureEvent(_ControlImpl& impl)
951 , __core(impl.GetCore())
952 , __public(impl.GetPublic())
956 ~CoreGestureEvent(void)
961 bool ProcessListener(_TouchGestureDetectorType gestureType)
963 bool filterd = false;
965 _TouchManager* pTouchManager = _TouchManager::GetInstance();
966 SysTryReturn(NID_UI, pTouchManager, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] System error occurred.");
970 case _TOUCH_GESTURE_DETECTOR_TYPE_TAP:
972 _TouchInfo touchInfo(0, _TOUCH_DOUBLE_PRESSED, pTouchManager->GetPosition(0), false, 0);
974 SysTryReturn(NID_UI, __impl.__pCoreTouchEvent, false, E_SYSTEM, "[E_SYSTEM] System error occurred.");
975 filterd = __impl.__pCoreTouchEvent->ProcessListener(touchInfo);
978 case _TOUCH_GESTURE_DETECTOR_TYPE_LONG_PRESS:
980 _TouchInfo touchInfo(0, _TOUCH_LONG_PRESSED, pTouchManager->GetPosition(0), false, 0);
982 SysTryReturn(NID_UI, __impl.__pCoreTouchEvent, false, E_SYSTEM, "[E_SYSTEM] System error occurred.");
983 filterd = __impl.__pCoreTouchEvent->ProcessListener(touchInfo);
995 CoreGestureEvent(const CoreGestureEvent& rhs);
996 CoreGestureEvent& operator =(const CoreGestureEvent& rhs);
999 _ControlImpl& __impl;
1004 class _ControlImpl::CoreEventListener
1005 : public _IFocusEventListener
1006 , public _INotificationEventListener
1007 , public _ITouchLongPressGestureEventListener
1008 , virtual public Tizen::Base::Runtime::IEventListener
1009 , virtual public _IUiEventListener
1010 , virtual public _ITouchGestureEventListener
1013 CoreEventListener(_ControlImpl& impl)
1015 , __core(impl.GetCore())
1016 , __public(impl.GetPublic())
1017 , __isKeyPressed(false)
1020 __pTouchManager = _TouchManager::GetInstance();
1021 SysTryReturnVoidResult(NID_UI, __pTouchManager, E_SYSTEM, "[E_SYSTEM] System error occurred.");
1026 virtual ~CoreEventListener(void)
1030 virtual bool OnFocusGained(const _Control& source)
1032 SysTryReturn(NID_UI, __impl.__pCoreFocusEvent, false, E_SYSTEM, "[E_SYSTEM] System error occurred.");
1034 bool isFiltered = false;
1036 isFiltered = __impl.__pCoreFocusEvent->ProcessListener(FOCUS_GAINED);
1043 isFiltered = __impl.OnFocusGained(__impl);
1050 isFiltered = __core.OnFocusGained(source);
1055 virtual bool OnFocusLost(const _Control& source)
1057 SysTryReturn(NID_UI, __impl.__pCoreFocusEvent, false, E_SYSTEM, "[E_SYSTEM] System error occurred.");
1059 bool isFiltered = false;
1061 isFiltered = __impl.__pCoreFocusEvent->ProcessListener(FOCUS_LOST);
1068 isFiltered = __impl.OnFocusLost(__impl);
1075 isFiltered = __core.OnFocusLost(source);
1080 virtual bool OnNotifiedN(const _Control& source, Tizen::Base::Collection::IList* pArgs)
1082 if (__impl.SendNotification(__impl, pArgs))
1087 if (&source == &__core)
1089 if (ProcessTouchModeChangedListener(source, pArgs))
1091 pArgs->RemoveAll(true);
1098 if (__impl.OnNotifiedN(__impl, pArgs))
1104 return __core.OnNotifiedN(source, pArgs);
1107 virtual bool OnLongPressGestureDetected(_TouchLongPressGestureDetector& gesture)
1109 SysTryReturn(NID_UI, __impl.__pCoreGestureEvent, false, E_SYSTEM, "[E_SYSTEM] System error occurred.");
1110 bool isFiltered = false;
1112 isFiltered = __impl.__pCoreGestureEvent->ProcessListener(_TOUCH_GESTURE_DETECTOR_TYPE_LONG_PRESS);
1117 virtual bool OnLongPressGestureCanceled(_TouchLongPressGestureDetector& gesture)
1122 bool ProcessTouchModeChangedListener(const _Control& source, Tizen::Base::Collection::IList* pArgs)
1124 IEnumeratorT<IEventListener*>* pEnumerator = __impl.__pPublicTouchModeChangedEventListeners->GetEnumeratorN();
1125 bool isFiltered = false;
1129 while(pEnumerator->MoveNext() == E_SUCCESS)
1131 IEventListener* pEventListener = null;
1132 pEnumerator->GetCurrent(pEventListener);
1134 if (!pEventListener)
1139 String* pString = dynamic_cast<String*>(pArgs->GetAt(0));
1140 if (pString && (*pString == _KEYBOARD_INSERTED_EVENT))
1142 Boolean* pIsTouchMode = dynamic_cast<Boolean*>(pArgs->GetAt(1));
1143 ITouchModeChangedEventListener* pTouchModeListener = dynamic_cast<ITouchModeChangedEventListener*>(pEventListener);
1144 if (pTouchModeListener && pIsTouchMode)
1146 pTouchModeListener->OnTouchModeChanged(__impl.GetPublic(), pIsTouchMode->ToBool()) ;
1158 CoreEventListener(const CoreEventListener& rhs);
1159 CoreEventListener& operator =(const CoreEventListener& rhs);
1162 _ControlImpl& __impl;
1165 _TouchManager* __pTouchManager;
1166 bool __isKeyPressed;
1167 _KeyInfo* __pKeyInfo;
1170 class _ControlImpl::_PropagatedTouchEventListener
1171 : public _IPropagatedTouchEventListener
1174 _PropagatedTouchEventListener(_ControlImpl& impl)
1176 , __core(impl.GetCore())
1177 , __public(impl.GetPublic())
1181 virtual ~_PropagatedTouchEventListener()
1185 _TouchEventArg* GetTouchEventArgN(const _TouchInfo& touchInfo)
1187 _TouchEventArg* pEventArg = new (std::nothrow) _TouchEventArg(__public, touchInfo.GetTouchStatus());
1188 SysTryReturn(NID_UI, pEventArg, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");
1190 _TouchManager* __pTouchManager = _TouchManager::GetInstance();
1191 SysTryReturn(NID_UI, __pTouchManager, null, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] __pTouchManager == null.");
1193 Point startPoint(__pTouchManager->GetStartPoint(touchInfo.GetPointId()).x - __core.GetAbsoluteBounds().x,
1194 __pTouchManager->GetStartPoint(touchInfo.GetPointId()).y - __core.GetAbsoluteBounds().y);
1196 pEventArg->SetTouchPosition(touchInfo.GetPointId(), startPoint.x, startPoint.y,
1197 touchInfo.GetCurrentPosition().x, touchInfo.GetCurrentPosition().y);
1201 __impl.__pFlickGestureDetector->GetDistance(xDistance, yDistance);
1203 if (xDistance != 0 || yDistance != 0)
1205 pEventArg->SetFlickedStatus(true);
1209 pEventArg->SetFlickedStatus(false);
1215 virtual bool OnTouchPressed(const _Control& source, const _TouchInfo& touchInfo)
1217 return __impl.CallOnTouchPressed(source, touchInfo);
1220 virtual bool OnTouchReleased(const _Control& source, const _TouchInfo& touchInfo)
1222 return __impl.CallOnTouchReleased(source, touchInfo);
1225 virtual bool OnTouchMoved(const _Control& source, const _TouchInfo& touchInfo)
1227 return __impl.CallOnTouchMoved(source, touchInfo);
1230 virtual bool OnTouchCanceled(const _Control& source, const _TouchInfo& touchInfo)
1232 return __impl.CallOnTouchCanceled(source, touchInfo);
1235 virtual void OnTouchPressHandled(const _Control& source)
1237 __impl.OnTouchPressHandled(source);
1240 virtual void OnTouchReleaseHandled(const _Control& source)
1242 __impl.OnTouchReleaseHandled(source);
1245 virtual void OnTouchMoveHandled(const _Control& source)
1247 __impl.OnTouchMoveHandled(source);
1250 virtual void OnTouchCancelHandled(const _Control& source)
1252 __impl.OnTouchCancelHandled(source);
1256 _ControlImpl& __impl;
1261 class _ControlImpl::_PropagatedKeyEventListener
1262 : public _IPropagatedKeyEventListener
1263 , public ITimerEventListener
1266 _PropagatedKeyEventListener(_ControlImpl& impl)
1268 , __core(impl.GetCore())
1269 , __public(impl.GetPublic())
1271 , __isKeyPressed(false)
1276 virtual ~_PropagatedKeyEventListener()
1278 if (__pTimer != null)
1287 void OnTimerExpired(Timer& timer)
1291 SysTryReturnVoidResult(NID_UI, __impl.__pCoreKeyEvent, E_SYSTEM, "[E_SYSTEM] System error occurred.");
1293 __impl.__pCoreKeyEvent->ProcessListener(KEY_LONGPRESSED, __pKeyInfo->GetKeyCode());
1297 virtual bool OnKeyPressed(const _Control& source, const _KeyInfo& keyInfo)
1299 SysTryReturn(NID_UI, __impl.__pCoreKeyEvent, false, E_SYSTEM, "[E_SYSTEM] System error occurred.");
1301 bool isFiltered = false;
1303 if (&source == &__core)
1305 if (!__isKeyPressed)
1307 __pTimer = new (std::nothrow) Timer;
1308 SysTryReturn(NID_UI, __pTimer, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
1310 result r = __pTimer->Construct(*this);
1311 SysTryReturn(NID_UI, r == E_SUCCESS, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] System error occurred.");
1313 r = __pTimer->Start(keyPressTimer);
1316 __isKeyPressed = true;
1317 __pKeyInfo = const_cast<_KeyInfo*>(&keyInfo);
1321 isFiltered = __impl.__pCoreKeyEvent->ProcessListener(KEY_PRESSED, keyInfo.GetKeyCode());
1329 isFiltered = __impl.OnKeyPressed(__impl, keyInfo);
1336 isFiltered = __core.OnKeyPressed(source, keyInfo);
1341 virtual bool OnKeyReleased(const _Control& source, const _KeyInfo& keyInfo)
1343 SysTryReturn(NID_UI, __impl.__pCoreKeyEvent, false, E_SYSTEM, "[E_SYSTEM] System error occurred.");
1345 bool isFiltered = false;
1347 if (&source == &__core)
1349 __isKeyPressed = false;
1352 if (__pTimer != null)
1360 isFiltered = __impl.__pCoreKeyEvent->ProcessListener(KEY_RELEASED, keyInfo.GetKeyCode());
1368 isFiltered = __impl.OnKeyReleased(__impl, keyInfo);
1375 isFiltered = __core.OnKeyReleased(source, keyInfo);
1381 _ControlImpl& __impl;
1385 Tizen::Base::Runtime::Timer* __pTimer;
1386 bool __isKeyPressed;
1387 _KeyInfo* __pKeyInfo;
1391 _ControlImpl::GetErrorBounds(void)
1393 return Rectangle(0, 0, -1, -1);
1397 _ControlImpl::GetErrorCompositeMode(void)
1399 return COMPOSITE_MODE_ALPHA_BLENDING;
1403 _ControlImpl::GetErrorChromaKeyColor(void)
1405 return Color::GetColor(COLOR_ID_MAGENTA);
1409 _ControlImpl::GetErrorMinimumSize(void)
1411 return Dimension(-1, -1);
1415 _ControlImpl::GetErrorMaximumSize(void)
1417 return Dimension(-1, -1);
1421 _ControlImpl::GetPublicClassName(void) const
1423 return "Tizen::Ui::Control";
1427 _ControlImpl::GetPublic(void) const
1429 return *__pControlPublic;
1433 _ControlImpl::GetPublic(void)
1435 return *__pControlPublic;
1439 _ControlImpl::GetCore(void) const
1441 return *__pControlCore;
1445 _ControlImpl::GetCore(void)
1447 return *__pControlCore;
1451 _ControlImpl::AddFocusEventListener(IFocusEventListener& listener)
1454 SysTryReturn(NID_UI,
1455 __pPublicFocusEventListeners->Add(const_cast <IFocusEventListener*>(&listener)) == E_SUCCESS, E_SYSTEM,
1456 E_SYSTEM, "[E_SYSTEM] System error occurred.");
1462 _ControlImpl::AddKeyEventListener(IKeyEventListener& listener)
1465 SysTryReturn(NID_UI,
1466 __pPublicKeyEventListeners->Add(const_cast <IKeyEventListener*>(&listener)) == E_SUCCESS, E_SYSTEM,
1467 E_SYSTEM, "[E_SYSTEM] System error occurred.");
1473 _ControlImpl::AddTouchEventListener(ITouchEventListener& listener)
1475 SysAssert(__pControlCore && __pCoreEventListener && __pLongPressGestureDetector && __pFlickGestureDetector);
1478 SysTryReturn(NID_UI,
1479 __pPublicTouchEventListeners->Add(const_cast <ITouchEventListener*>(&listener)) == E_SUCCESS, E_SYSTEM,
1480 E_SYSTEM, "[E_SYSTEM] System error occurred.");
1482 // Firt time, enable gesture.
1483 if (__pPublicTouchEventListeners->GetCount() == 1)
1485 result r = E_SUCCESS;
1487 r = __pControlCore->AddGestureDetector(*__pLongPressGestureDetector);
1488 SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
1490 r = __pLongPressGestureDetector->AddGestureListener(*__pCoreEventListener);
1491 SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
1493 r = __pControlCore->AddGestureDetector(*__pFlickGestureDetector);
1494 SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
1496 r = __pFlickGestureDetector->AddGestureListener(*__pCoreEventListener);
1497 SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
1503 Tizen::Base::Collection::LinkedListT <Tizen::Base::Runtime::IEventListener*>*
1504 _ControlImpl::GetTouchEventListener(void) const
1506 return __pPublicTouchEventListeners;
1510 _ControlImpl::AddDragDropEventListener(IDragDropEventListener& listener)
1513 SysTryReturn(NID_UI,
1514 __pPublicDragDropEventListeners->Add(const_cast <IDragDropEventListener*>(&listener)) == E_SUCCESS, E_SYSTEM,
1515 E_SYSTEM, "[E_SYSTEM] System error occurred.");
1520 Tizen::Base::Collection::LinkedListT <Tizen::Base::Runtime::IEventListener*>*
1521 _ControlImpl::GetDragDropEventListener(void) const
1523 return __pPublicDragDropEventListeners;
1527 _ControlImpl::AddTouchModeChangedEventListener(ITouchModeChangedEventListener& listener)
1530 SysTryReturn(NID_UI,
1531 __pPublicTouchModeChangedEventListeners->Add(
1532 const_cast <ITouchModeChangedEventListener*>(&listener)) == E_SUCCESS, E_SYSTEM,
1533 E_SYSTEM, "[E_SYSTEM] System error occurred.");
1539 _ControlImpl::RemoveFocusEventListener(IFocusEventListener& listener)
1542 SysTryReturn(NID_UI,
1543 __pPublicFocusEventListeners->Remove(&listener) == E_SUCCESS, E_SYSTEM,
1544 E_SYSTEM, "[E_SYSTEM] System error occurred.");
1550 _ControlImpl::RemoveKeyEventListener(IKeyEventListener& listener)
1553 SysTryReturn(NID_UI,
1554 __pPublicKeyEventListeners->Remove(&listener) == E_SUCCESS, E_SYSTEM,
1555 E_SYSTEM, "[E_SYSTEM] System error occurred.");
1561 _ControlImpl::RemoveTouchEventListener(ITouchEventListener& listener)
1564 SysTryReturn(NID_UI,
1565 __pPublicTouchEventListeners->Remove(&listener) == E_SUCCESS, E_SYSTEM,
1566 E_SYSTEM, "[E_SYSTEM] System error occurred.");
1568 // [ToDo] if the number of touch event listers becomes 0, disable gesture recognition.
1574 _ControlImpl::RemoveDragDropEventListener(IDragDropEventListener& listener)
1577 SysTryReturn(NID_UI,
1578 __pPublicDragDropEventListeners->Remove(&listener) == E_SUCCESS, E_SYSTEM,
1579 E_SYSTEM, "[E_SYSTEM] System error occurred.");
1585 _ControlImpl::RemoveTouchModeChangedEventListener(ITouchModeChangedEventListener& listener)
1588 SysTryReturn(NID_UI,
1589 __pPublicTouchModeChangedEventListeners->Remove(&listener) == E_SUCCESS, E_SYSTEM,
1590 E_SYSTEM, "[E_SYSTEM] System error occurred.");
1596 _ControlImpl::AddGestureDetector(const TouchGestureDetector& gestureDetector)
1598 SysTryReturn(NID_UI,
1599 __pPublicGestureDetectors->Add(
1600 const_cast <TouchGestureDetector*>(&gestureDetector)) == E_SUCCESS, E_SYSTEM,
1601 E_SYSTEM, "[E_SYSTEM] System error occurred.");
1603 const _TouchGestureDetectorImpl* pImpl = _TouchGestureDetectorImpl::GetInstance(gestureDetector);
1604 SysTryReturn(NID_UI, pImpl, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] System error occurred.");
1606 result r = GetCore().AddGestureDetector(pImpl->GetCore());
1607 SysTryReturn(NID_UI, r == E_SUCCESS, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] System error occurred.");
1613 _ControlImpl::RemoveGestureDetector(const TouchGestureDetector& gestureDetector)
1615 SysTryReturn(NID_UI,
1616 __pPublicGestureDetectors->Remove(
1617 const_cast <TouchGestureDetector*>(&gestureDetector)) == E_SUCCESS, E_SYSTEM,
1618 E_SYSTEM, "[E_SYSTEM] System error occurred.");
1620 const _TouchGestureDetectorImpl* pImpl = _TouchGestureDetectorImpl::GetInstance(gestureDetector);
1621 SysTryReturn(NID_UI, pImpl, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] System error occurred.");
1623 result r = GetCore().RemoveGestureDetector(pImpl->GetCore());
1624 SysTryReturn(NID_UI, r == E_SUCCESS, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] System error occurred.");
1629 IListT<TouchGestureDetector*>*
1630 _ControlImpl::GetGestureDetectorList(void) const
1632 return __pPublicGestureDetectors;
1636 _ControlImpl::IsMovable(void) const
1638 return GetCore().IsMovable();
1642 _ControlImpl::IsResizable(void) const
1644 return GetCore().IsResizable();
1648 _ControlImpl::GetContentSize(void) const
1650 return GetCore().GetContentSize();
1654 _ControlImpl::HitTest(const Tizen::Graphics::FloatPoint& point)
1656 return GetCore().HitTest(point);
1660 _ControlImpl::GetDescription(void) const
1662 String description(L"");
1664 description.Format(LOG_LEN_MAX, L"0x%x(0x%x, %s) fgColor(0x%x) fontSize(%d) ", this, __pControlPublic, GetPublicClassName(), __foregroundColor.GetRGB32(), __fontSize);
1666 if (__pControlAnimator)
1668 description.Append(L"ControlAnimator(");
1669 description.Append((int)__pControlAnimator);
1670 description.Append(L") ");
1673 if (__pCustomVisualElement)
1675 description.Append(L"CustomVisualElement(");
1676 description.Append((int)__pCustomVisualElement);
1677 description.Append(L") ");
1680 if (__pBuilderPortraitBounds)
1682 description.Append(L"PortraitBounds(");
1683 description.Append(__pBuilderPortraitBounds->x);
1684 description.Append(L" ");
1685 description.Append(__pBuilderPortraitBounds->y);
1686 description.Append(L" ");
1687 description.Append(__pBuilderPortraitBounds->width);
1688 description.Append(L" ");
1689 description.Append(__pBuilderPortraitBounds->height);
1690 description.Append(L") ");
1693 if (__pBuilderLandscapeBounds)
1695 description.Append(L"LandscapeBounds(");
1696 description.Append(__pBuilderLandscapeBounds->x);
1697 description.Append(L" ");
1698 description.Append(__pBuilderLandscapeBounds->y);
1699 description.Append(L" ");
1700 description.Append(__pBuilderLandscapeBounds->width);
1701 description.Append(L" ");
1702 description.Append(__pBuilderLandscapeBounds->height);
1703 description.Append(L") ");
1706 if (__pPublicGestureDetectors->GetCount() > 0 )
1708 IEnumeratorT<TouchGestureDetector*>* pEnumerator = __pPublicGestureDetectors->GetEnumeratorN();
1711 description.Append(L"TouchGestureDetector(");
1713 while (pEnumerator->MoveNext() == E_SUCCESS)
1715 TouchGestureDetector* pTouchGestureDetector = null;
1716 pEnumerator->GetCurrent(pTouchGestureDetector);
1717 if (pTouchGestureDetector)
1719 description.Append((int)pTouchGestureDetector);
1720 description.Append(L" ");
1724 description.Append(L") ");
1730 if (__pPublicFocusEventListeners->GetCount() > 0 )
1732 IEnumeratorT<IEventListener*>* pEnumerator = __pPublicFocusEventListeners->GetEnumeratorN();
1735 description.Append(L"FocusListener(");
1737 while (pEnumerator->MoveNext() == E_SUCCESS)
1739 IEventListener* pListener = null;
1740 pEnumerator->GetCurrent(pListener);
1743 description.Append((int)pListener);
1744 description.Append(L" ");
1748 description.Append(L") ");
1754 if (__pPublicKeyEventListeners->GetCount() > 0 )
1756 IEnumeratorT<IEventListener*>* pEnumerator = __pPublicKeyEventListeners->GetEnumeratorN();
1759 description.Append(L"KeyListener(");
1761 while (pEnumerator->MoveNext() == E_SUCCESS)
1763 IEventListener* pListener = null;
1764 pEnumerator->GetCurrent(pListener);
1767 description.Append((int)pListener);
1768 description.Append(L" ");
1772 description.Append(L") ");
1778 if (__pPublicTouchEventListeners->GetCount() > 0 )
1780 IEnumeratorT<IEventListener*>* pEnumerator = __pPublicTouchEventListeners->GetEnumeratorN();
1783 description.Append(L"TouchListener(");
1785 while (pEnumerator->MoveNext() == E_SUCCESS)
1787 IEventListener* pListener = null;
1788 pEnumerator->GetCurrent(pListener);
1791 description.Append((int)pListener);
1792 description.Append(L" ");
1796 description.Append(L") ");
1802 if (__pPublicDragDropEventListeners->GetCount() > 0 )
1804 IEnumeratorT<IEventListener*>* pEnumerator = __pPublicDragDropEventListeners->GetEnumeratorN();
1807 description.Append(L"DragDropListener(");
1809 while (pEnumerator->MoveNext() == E_SUCCESS)
1811 IEventListener* pListener = null;
1812 pEnumerator->GetCurrent(pListener);
1815 description.Append((int)pListener);
1816 description.Append(L" ");
1820 description.Append(L") ");
1826 if (__pPublicTouchModeChangedEventListeners->GetCount() > 0 )
1828 IEnumeratorT<IEventListener*>* pEnumerator = __pPublicTouchModeChangedEventListeners->GetEnumeratorN();
1831 description.Append(L"TouchModeListener(");
1833 while (pEnumerator->MoveNext() == E_SUCCESS)
1835 IEventListener* pListener = null;
1836 pEnumerator->GetCurrent(pListener);
1839 description.Append((int)pListener);
1840 description.Append(L" ");
1844 description.Append(L") ");
1854 _ControlImpl::OnDraw(void)
1859 Tizen::Graphics::Canvas*
1860 _ControlImpl::OnCanvasRequestedN(const Tizen::Graphics::Dimension& size)
1862 return GetCore().OnCanvasRequestedN(size);
1865 Tizen::Graphics::Bitmap*
1866 _ControlImpl::OnCapturedBitmapRequestedN(void)
1869 return GetCore().OnCapturedBitmapRequestedN();
1873 _ControlImpl::OnAttaching(const _Control* pParent)
1875 return GetCore().OnAttaching(pParent);
1879 _ControlImpl::OnAttached(void)
1881 return GetCore().OnAttached();
1885 _ControlImpl::OnAttachingToMainTree(const _Control* pParent)
1887 return GetCore().OnAttachingToMainTree(pParent);
1891 _ControlImpl::OnAttachedToMainTree(void)
1893 result r = E_SUCCESS;
1894 result returnResultPublic = E_SUCCESS;
1895 result returnResultCore = E_SUCCESS;
1897 if (_AppInfo::GetApiVersion() == _API_VERSION_2_0 && _AppInfo::IsOspCompat())
1899 GetCore().SetDrawWhenVisible(false);
1900 GetCore().SetTerminatingOrder(true);
1903 returnResultPublic = GetPublic().OnInitializing();
1904 returnResultCore = GetCore().OnAttachedToMainTree();
1906 if (IsFailed(returnResultPublic) || IsFailed(returnResultCore))
1908 _ContainerImpl* pParent = GetParent();
1909 SysTryReturn(NID_UI, pParent, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] System error occurred.");
1911 r = pParent->RemoveChild(this, false);
1912 SysAssert(r == E_SUCCESS);
1914 SysTryReturn(NID_UI, returnResultPublic == E_SUCCESS, returnResultPublic, returnResultPublic, "[%s] propagated.", GetErrorMessage(returnResultPublic));
1915 SysTryReturn(NID_UI, returnResultCore == E_SUCCESS, returnResultCore, returnResultCore, "[%s] propagated.", GetErrorMessage(returnResultCore));
1918 return returnResultPublic;
1922 _ControlImpl::OnDetachingFromMainTree(void)
1924 GetPublic().OnTerminating();
1925 return GetCore().OnDetachingFromMainTree();
1929 _ControlImpl::OnAttachingFailed(const _Control& parent)
1931 GetCore().OnAttachingFailed(parent);
1935 _ControlImpl::OnDetaching(void)
1941 _ControlImpl::OnBoundsChanging(const Rectangle& bounds)
1943 __oldBounds = GetBounds();
1945 return GetCore().OnBoundsChanging(bounds);
1949 _ControlImpl::OnBoundsChanged(void)
1951 GetCore().OnBoundsChanged();
1955 _ControlImpl::OnEvaluateSize(Dimension& evaluatedSize)
1957 GetCore().OnEvaluateSize(evaluatedSize);
1961 _ControlImpl::OnParentBoundsChanged(const _Control& parent)
1963 GetCore().OnParentBoundsChanged(parent);
1967 _ControlImpl::OnChildAttached(const _Control& child)
1969 GetCore().OnChildAttached(child);
1973 _ControlImpl::OnChildDetaching(const _Control& child)
1975 GetCore().OnChildDetaching(child);
1979 _ControlImpl::OnChildDetached(const _Control& child)
1981 GetCore().OnChildDetached(child);
1985 _ControlImpl::OnChildBoundsChanged(const _Control& child)
1987 GetCore().OnChildBoundsChanged(child);
1991 _ControlImpl::OnChildVisibleStateChanged(const _Control& child)
1993 GetCore().OnChildVisibleStateChanged(child);
1997 _ControlImpl::OnChangeLayout(_ControlOrientation orientation)
1999 result r = E_SUCCESS;
2001 if (IsAttachedToMainTree())
2003 Rectangle builderBounds;
2004 bool exist = GetBuilderBounds(orientation, builderBounds);
2007 bool movable = IsMovable();
2008 bool resizable = IsResizable();
2013 r = SetBounds(builderBounds);
2014 SysTryReturnVoidResult(NID_UI, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] Failed to set bounds of %s.", GetPublicClassName());
2015 builderBounds.x = 0;
2016 builderBounds.y = 0;
2017 SetClientBounds(builderBounds);
2019 SetMovable(movable);
2020 SetResizable(resizable);
2025 GetCore().OnChangeLayout(orientation);
2029 _ControlImpl::OnZOrderChanging(_ControlZOrderUpdate zOrderUpdate)
2031 GetCore().OnZOrderChanging(zOrderUpdate);
2035 _ControlImpl::OnVisibleStateChanging(void)
2037 GetCore().OnVisibleStateChanging();
2041 _ControlImpl::OnVisibleStateChanged(void)
2043 _TouchManager* pTouchManager = _TouchManager::GetInstance();
2046 if ((_TouchManager::GetInstance()->IsTouchAllowed() == true) && (GetPublic().GetShowState() == false))
2048 _ControlManager* pControlManager = _ControlManager::GetInstance();
2049 SysTryReturnVoidResult(NID_UI, pControlManager, E_SYSTEM, "[E_SYSTEM] _ControlManager does not exist.");
2051 bool gestureDetecting = false;
2053 IListT<_TouchGestureDetector*>* pGestureList = GetCore().GetGestureDetectorList();
2056 IEnumeratorT<_TouchGestureDetector*>* pEnumerator = pGestureList->GetEnumeratorN();
2057 SysTryReturnVoidResult(NID_UI, pEnumerator, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");
2059 while (pEnumerator->MoveNext() == E_SUCCESS)
2061 _TouchGestureDetector* pGestureDetector = null;
2062 pEnumerator->GetCurrent(pGestureDetector);
2063 if (pGestureDetector)
2065 gestureDetecting = true;
2073 if (!gestureDetecting)
2075 pTouchManager->SetTouchCanceled(true);
2080 GetCore().OnVisibleStateChanged();
2084 _ControlImpl::OnAncestorVisibleStateChanged(const _Control& control)
2086 GetCore().OnAncestorVisibleStateChanged(control);
2090 _ControlImpl::OnAncestorEnableStateChanged(const _Control& control)
2092 GetCore().OnAncestorEnableStateChanged(control);
2096 _ControlImpl::OnTouchPressHandled(const _Control& control)
2098 GetCore().OnTouchPressHandled(control);
2102 _ControlImpl::OnTouchReleaseHandled(const _Control& control)
2104 GetCore().OnTouchReleaseHandled(control);
2108 _ControlImpl::OnTouchMoveHandled(const _Control& control)
2110 GetCore().OnTouchMoveHandled(control);
2114 _ControlImpl::OnFontChanged(Font* pFont)
2116 GetCore().OnFontChanged(pFont);
2120 _ControlImpl::OnFontInfoRequested(unsigned long& style, int& size)
2122 GetCore().OnFontInfoRequested(style, size);
2125 _ControlImpl::OnTouchCancelHandled(const _Control& control)
2127 GetCore().OnTouchCancelHandled(control);
2131 _ControlImpl::OnKeyPressed(const _ControlImpl& source, const _KeyInfo& keyInfo)
2137 _ControlImpl::OnKeyReleased(const _ControlImpl& source, const _KeyInfo& keyInfo)
2143 _ControlImpl::CallOnTouchPressed(const _Control& source, const _TouchInfo& touchinfo)
2145 bool isFiltered = false;
2147 if (source.IsDelayedTouchEventEnabled())
2149 if (&source == &GetCore())
2151 const_cast<_Control&>(source).AddTouchInfo(touchinfo);
2157 GetCore().SetEventReceivable(true);
2159 LinkedListT <Tizen::Base::Runtime::IEventListener*>* pList = GetTouchEventListener();
2160 if (pList && pList->GetCount() > 0)
2162 bool returnValue = __pCoreTouchEvent->ProcessDoublePress(touchinfo, isFiltered);
2169 if (&source == &GetCore())
2171 isFiltered = __pCoreTouchEvent->ProcessListener(touchinfo);
2177 __pCoreTouchEvent->ProcessDragListener(touchinfo);
2180 _TouchManager* __pTouchManager = _TouchManager::GetInstance();
2181 SysTryReturn(NID_UI, __pTouchManager, false, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] __pTouchManager == null.");
2183 if (!GetCore().IsEventReceivable())
2185 __pTouchManager->ResetTouchInfo();
2190 if (!__pTouchManager->IsTouchAllowed())
2196 isFiltered = OnTouchPressed(*this, touchinfo);
2203 isFiltered = GetCore().OnTouchPressed(source, touchinfo);
2210 _ControlImpl::CallOnTouchReleased(const _Control& source, const _TouchInfo& touchinfo)
2212 bool isFiltered = false;
2214 if (source.IsDelayedTouchEventEnabled())
2216 if (&source == &GetCore())
2218 const_cast<_Control&>(source).AddTouchInfo(touchinfo);
2224 if (&source == &GetCore())
2226 isFiltered = __pCoreTouchEvent->ProcessListener(touchinfo);
2232 __pCoreTouchEvent->ProcessDropListener(touchinfo);
2235 _TouchManager* __pTouchManager = _TouchManager::GetInstance();
2236 SysTryReturn(NID_UI, __pTouchManager, false, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] __pTouchManager == null.");
2238 if (!__pTouchManager->IsTouchAllowed())
2244 isFiltered = OnTouchReleased(*this, touchinfo);
2250 //send drop event to topmost touched control
2251 __pCoreTouchEvent->ProcessDropListenerToTopControl(touchinfo);
2254 isFiltered = GetCore().OnTouchReleased(source, touchinfo);
2260 _ControlImpl::CallOnTouchMoved(const _Control& source, const _TouchInfo& touchinfo)
2262 bool isFiltered = false;
2264 if (source.IsDelayedTouchEventEnabled())
2266 if (&source == &GetCore())
2268 const_cast<_Control&>(source).AddTouchInfo(touchinfo);
2274 if (&source == &GetCore())
2276 isFiltered = __pCoreTouchEvent->ProcessListener(touchinfo);
2283 _TouchManager* __pTouchManager = _TouchManager::GetInstance();
2284 SysTryReturn(NID_UI, __pTouchManager, false, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] __pTouchManager == null.");
2286 if (!__pTouchManager->IsTouchAllowed())
2292 isFiltered = OnTouchMoved(*this, touchinfo);
2299 isFiltered = GetCore().OnTouchMoved(source, touchinfo);
2305 _ControlImpl::CallOnTouchCanceled(const _Control& source, const _TouchInfo& touchinfo)
2307 bool isFiltered = false;
2309 __pCoreTouchEvent->ProcessDropListener(touchinfo);
2310 __pCoreTouchEvent->ProcessDropListenerToTopControl(touchinfo);
2312 if (&source == &GetCore())
2314 isFiltered = __pCoreTouchEvent->ProcessListener(touchinfo);
2322 isFiltered = OnTouchCanceled(*this, touchinfo);
2329 isFiltered = GetCore().OnTouchCanceled(source, touchinfo);
2335 _ControlImpl::OnTouchPressed(const _ControlImpl& source, const _TouchInfo& touchinfo)
2341 _ControlImpl::OnTouchCanceled(const _ControlImpl& source, const _TouchInfo& touchinfo)
2347 _ControlImpl::OnTouchReleased(const _ControlImpl& source, const _TouchInfo& touchinfo)
2353 _ControlImpl::OnTouchMoved(const _ControlImpl& source, const _TouchInfo& touchinfo)
2359 _ControlImpl::OnFocusGained(const _ControlImpl& source)
2365 _ControlImpl::OnFocusLost(const _ControlImpl& source)
2371 _ControlImpl::OnNotifiedN(const _ControlImpl& source, Tizen::Base::Collection::IList* pArgs)
2377 _ControlImpl::OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::IList* pArgs)
2379 GetPublic().OnUserEventReceivedN(requestId, pArgs);
2383 _ControlImpl::SendNotification(const _ControlImpl& source, Tizen::Base::Collection::IList* pArgs)
2385 _ControlImpl& impl = const_cast <_ControlImpl&>(source);
2387 Tizen::Base::String* pString = dynamic_cast <Tizen::Base::String*>(pArgs->GetAt(0));
2390 if (*pString == _USER_EVENT)
2392 _UserEventInfo* pUserEventInfo = dynamic_cast <_UserEventInfo*>(pArgs->GetAt(1));
2395 impl.OnUserEventReceivedN(pUserEventInfo->GetRequestId(), pUserEventInfo->GetArgs());
2397 pArgs->RemoveAll(true);
2402 else if (*pString == _REQUEST_REDRAW_EVENT)
2406 Boolean* pBoolean = dynamic_cast <Boolean*>(pArgs->GetAt(1));
2407 if (pBoolean && pBoolean->ToBool())
2411 pArgs->RemoveAll(true);
2422 _ControlImpl::Draw(bool recursive)
2424 SysTryReturn(NID_UI,
2425 IsAttachedToMainTree(), E_INVALID_OPERATION,
2426 E_INVALID_OPERATION, "[E_INVALID_OPERATION] The control should be attached to the main tree.");
2428 GetCore().Draw(recursive);
2434 _ControlImpl::Show(void)
2436 SysTryReturn(NID_UI,
2437 GetParent() || IsAttachedToMainTree(), E_INVALID_OPERATION,
2438 E_INVALID_OPERATION, "[E_INVALID_OPERATION] This control should have a parent or be attached to the main tree.");
2446 _ControlImpl::Invalidate(bool recursive)
2448 SysTryReturnVoidResult(NID_UI,
2449 IsAttachedToMainTree(),
2450 E_INVALID_OPERATION, "[E_INVALID_OPERATION] The control should be attached to the main tree.");
2452 GetCore().Invalidate(recursive);
2456 _ControlImpl::Invalidate(const Rectangle& rect)
2458 SysTryReturnVoidResult(NID_UI,
2459 IsAttachedToMainTree(),
2460 E_INVALID_OPERATION, "[E_INVALID_OPERATION] The control should be attached to the main tree.");
2462 GetCore().Invalidate(rect);
2466 _ControlImpl::RequestRedraw(bool show) const
2470 ArrayList* pEventArgs = new (std::nothrow) ArrayList;
2471 SysTryReturnVoidResult(NID_UI, pEventArgs, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");
2473 pEventArgs->Construct();
2475 Tizen::Base::String* pString = new (std::nothrow) Tizen::Base::String(_REQUEST_REDRAW_EVENT);
2476 SysTryReturnVoidResult(NID_UI, pString, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");
2479 pEventArgs->Add(*pString);
2481 Boolean* pBoolean = new (std::nothrow) Boolean(show);
2482 SysTryReturnVoidResult(NID_UI, pBoolean, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");
2484 // Index 1 : User Data
2485 pEventArgs->Add(*pBoolean);
2487 _UiEventManager* pEventManager = _UiEventManager::GetInstance();
2488 SysTryReturnVoidResult(NID_UI, pEventManager, E_SYSTEM, "[E_SYSTEM] System error occurred.");
2490 _UiNotificationEvent event(GetCore().GetHandle(), pEventArgs);
2492 result r = pEventManager->PostEvent(event);
2493 SysTryReturnVoidResult(NID_UI, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] System error occurred.");
2497 _ControlImpl::SendUserEvent(RequestId requestId, const IList* pArgs) const
2501 ArrayList* pEventArgs = new (std::nothrow) ArrayList;
2502 SysTryReturnVoidResult(NID_UI, pEventArgs, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");
2504 pEventArgs->Construct();
2506 Tizen::Base::String* pString = new (std::nothrow) Tizen::Base::String(_USER_EVENT);
2507 SysTryReturnVoidResult(NID_UI, pString, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");
2510 pEventArgs->Add(*pString);
2512 _UserEventInfo* pUserEventInfo = new (std::nothrow) _UserEventInfo(requestId, pArgs);
2513 SysTryReturnVoidResult(NID_UI, pUserEventInfo, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");
2515 // Index 1 : User Data
2516 pEventArgs->Add(*pUserEventInfo);
2518 _UiEventManager* pEventManager = _UiEventManager::GetInstance();
2519 SysTryReturnVoidResult(NID_UI, pEventManager, E_SYSTEM, "[E_SYSTEM] System error occurred.");
2521 _UiNotificationEvent event(GetCore().GetHandle(), pEventArgs);
2523 result r = pEventManager->PostEvent(event);
2524 SysTryReturnVoidResult(NID_UI, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] System error occurred.");
2528 _ControlImpl::Contains(const Point& point) const
2530 return GetCore().Contains(point);
2534 _ControlImpl::ConsumeInputEvent(void)
2537 __inputEventConsumed = true;
2541 _ControlImpl::IsInputEventConsumed(void) const
2544 return __inputEventConsumed;
2548 _ControlImpl::ResetInputEventConsumed(void)
2551 __inputEventConsumed = false;
2555 _ControlImpl::GetName(void) const
2557 return GetCore().GetName();
2561 _ControlImpl::SetName(const Tizen::Base::String& name)
2563 GetCore().SetName(name);
2567 _ControlImpl::GetParent(void) const
2571 _Control* pParent = GetCore().GetParent();
2572 if (pParent == null)
2577 void* pData = pParent->GetUserData();
2580 return null; // This is for the _ControlManager::__pRoot.
2583 _ContainerImpl* pParentImpl = static_cast <_ContainerImpl*>(pData);
2588 _ControlImpl::GetCanvasN(void) const
2590 SysTryReturn(NID_UI,
2591 GetParent() || IsAttachedToMainTree(), null,
2592 E_INVALID_OPERATION, "[E_INVALID_OPERATION] This control should have a parent or be attached to the main tree.");
2594 Canvas* pCanvas = GetCore().GetCanvasN();
2595 result r = GetLastResult();
2598 if (r == E_OPERATION_FAILED)
2600 SetLastResult(E_INVALID_OPERATION);
2602 SysLog(NID_UI_CTRL, "[%s] Propagated", GetErrorMessage(GetLastResult()));
2608 pCanvas->SetBackgroundColor(GetBackgroundColor());
2609 pCanvas->SetForegroundColor(GetForegroundColor());
2617 _ControlImpl::GetCanvasN(const Rectangle& bounds) const
2619 SysTryReturn(NID_UI,
2620 GetParent() || IsAttachedToMainTree(), null,
2621 E_INVALID_OPERATION, "[E_INVALID_OPERATION] This control should have a parent or be attached to the main tree.");
2623 Canvas* pCanvas = GetCore().GetCanvasN(bounds);
2624 result r = GetLastResult();
2627 if (r == E_OPERATION_FAILED)
2629 SetLastResult(E_INVALID_OPERATION);
2631 SysLog(NID_UI_CTRL, "[%s] Propagated", GetErrorMessage(GetLastResult()));
2637 pCanvas->SetBackgroundColor(GetBackgroundColor());
2638 pCanvas->SetForegroundColor(GetForegroundColor());
2646 _ControlImpl::GetClientCanvasN(void) const
2648 SysTryReturn(NID_UI,
2649 GetParent() || IsAttachedToMainTree(), null,
2650 E_INVALID_OPERATION, "[E_INVALID_OPERATION] This control should have a parent or be attached to the main tree.");
2652 Canvas* pCanvas = GetCore().GetClientCanvasN();
2653 result r = GetLastResult();
2656 if (r == E_OPERATION_FAILED)
2658 SetLastResult(E_INVALID_OPERATION);
2660 SysLog(NID_UI_CTRL, "[%s] Propagated", GetErrorMessage(GetLastResult()));
2666 pCanvas->SetBackgroundColor(GetBackgroundColor());
2667 pCanvas->SetForegroundColor(GetForegroundColor());
2675 _ControlImpl::IsAttachedToMainTree(void) const
2677 return GetCore().IsAttachedToMainTree();
2681 _ControlImpl::IsInTouchMode(void) const
2689 _ControlImpl::IsFocusable(void) const
2691 return GetCore().IsFocusable();
2695 _ControlImpl::SetFocusable(bool focusable)
2697 // [ToDo] Focusable is simple flag. Make this method do not check belows.
2698 SysTryReturn(NID_UI,
2699 __focusableChangable, E_INVALID_OPERATION,
2700 E_INVALID_OPERATION, "[E_INVALID_OPERATION] The control can't chage it's focusable property.");
2702 SysTryReturn(NID_UI,
2703 IsAttachedToMainTree(), E_SYSTEM,
2704 E_SYSTEM, "[E_SYSTEM] This control should be attached to the main tree.");
2706 SysTryReturn(NID_UI,
2707 focusable || GetCore().GetFocused() != &this->GetCore(), E_INVALID_OPERATION,
2708 E_INVALID_OPERATION, "[E_INVALID_OPERATION] This already focused control cannot be unfocusable.");
2710 GetCore().SetFocusable(focusable);
2715 _ControlImpl::IsFocused(void) const
2717 return GetCore().IsFocused();
2721 _ControlImpl::SetFocused(void)
2723 return GetCore().SetFocused();
2727 _ControlImpl::SetFocusableChangable(bool focusableChangable)
2729 __focusableChangable = focusableChangable;
2733 _ControlImpl::SetFont(const String& fontName)
2735 result r = GetCore().SetFont(fontName);
2736 SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
2741 _ControlImpl::GetFont(void) const
2743 return GetCore().GetFont();
2747 _ControlImpl::IsEnabled(void) const
2749 return GetCore().IsEnabled();
2753 _ControlImpl::GetEnableState(void) const
2755 return GetCore().GetEnableState();
2759 _ControlImpl::SetEnableState(bool enableState)
2761 GetCore().SetEnableState(enableState);
2765 _ControlImpl::IsInputEnabled(void) const
2767 return GetCore().IsInputEnabled();
2771 _ControlImpl::GetInputEnableState(void) const
2773 return GetCore().GetInputEnableState();
2777 _ControlImpl::SetInputEnableState(bool inputEnableState)
2779 GetCore().SetInputEnableState(inputEnableState);
2783 _ControlImpl::IsVisible(void) const
2785 // [ToDo] Change the default visible state to false and test.
2786 return GetCore().IsVisible();
2790 _ControlImpl::GetVisibleState(void) const
2792 return GetCore().GetVisibleState();
2796 _ControlImpl::SetVisibleState(bool visibleState)
2799 SysTryReturn(NID_UI,
2800 GetParent() || IsAttachedToMainTree(), E_INVALID_OPERATION,
2801 E_INVALID_OPERATION, "[E_INVALID_OPERATION] This control should have a parent or be attached to the main tree.");
2803 GetCore().SetVisibleState(visibleState);
2809 _ControlImpl::IsLayoutable(void) const
2811 return GetCore().IsLayoutable();
2815 _ControlImpl::IsClipToParent(void) const
2817 return GetCore().IsClipToParent();
2821 _ControlImpl::SetClipToParent(bool clipToParent)
2823 result r = GetCore().SetClipToParent(clipToParent);
2824 SysTryReturn(NID_UI, r == E_SUCCESS, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] System error occurred.");
2830 _ControlImpl::IsDragEnabled(void) const
2832 return GetCore().IsDragEnabled();
2836 _ControlImpl::IsDropEnabled(void) const
2838 return GetCore().IsDropEnabled();
2842 _ControlImpl::SetDragEnabled(bool enabled)
2845 GetCore().SetDragEnabled(enabled);
2849 _ControlImpl::SetDropEnabled(bool enabled)
2852 GetCore().SetDropEnabled(enabled);
2856 _ControlImpl::GetBounds(void) const
2858 return GetCore().GetBounds();
2862 _ControlImpl::GetPosition(void) const
2864 return GetCore().GetPosition();
2868 _ControlImpl::GetSize(void) const
2870 return GetCore().GetSize();
2874 _ControlImpl::SetBounds(const Rectangle& bounds, bool callBoundsChangeCallbacks)
2876 Rectangle builderBounds;
2877 _ControlOrientation controlOrientation = _CONTROL_ORIENTATION_PORTRAIT;
2878 bool exist = GetBuilderBounds(controlOrientation, builderBounds);
2881 if (IsAttachedToMainTree())
2883 _ControlImplManager* pControlImplManager = _ControlImplManager::GetInstance();
2884 OrientationStatus orientation = pControlImplManager->GetFormOrientationStatus(this);
2886 if (orientation == ORIENTATION_STATUS_LANDSCAPE
2887 || orientation == ORIENTATION_STATUS_LANDSCAPE_REVERSE)
2889 SetBuilderBounds(_CONTROL_ORIENTATION_LANDSCAPE, bounds);
2893 SetBuilderBounds(_CONTROL_ORIENTATION_PORTRAIT, bounds);
2898 SetBuilderBounds(_CONTROL_ORIENTATION_PORTRAIT, bounds);
2899 SetBuilderBounds(_CONTROL_ORIENTATION_LANDSCAPE, bounds);
2902 return GetCore().SetBounds(bounds, callBoundsChangeCallbacks);
2906 _ControlImpl::SetBoundsAndUpdateLayout(const Tizen::Graphics::Rectangle& bounds)
2908 result r = E_SUCCESS;
2909 r = GetCore().SetBounds(bounds);
2911 GetCore().UpdateLayout();
2917 _ControlImpl::SetPosition(const Point& position)
2919 return GetCore().SetPosition(position);
2923 _ControlImpl::SetSize(const Dimension& size)
2925 return GetCore().SetSize(size);
2929 _ControlImpl::GetMinimumSize(void) const
2931 return GetCore().GetMinimumSize();
2935 _ControlImpl::GetMaximumSize(void) const
2937 return GetCore().GetMaximumSize();
2941 _ControlImpl::SetMinimumSize(const Dimension& newMinSize)
2943 return GetCore().SetMinimumSize(newMinSize);
2947 _ControlImpl::SetMaximumSize(const Dimension& newMaxSize)
2949 return GetCore().SetMaximumSize(newMaxSize);
2953 _ControlImpl::ConvertToControlPosition(const Point& screenPosition) const
2955 return GetCore().ConvertToControlPosition(screenPosition);
2959 _ControlImpl::ConvertToScreenPosition(const Point& controlPosition) const
2961 return GetCore().ConvertToScreenPosition(controlPosition);
2964 // [ToDo] Must provide a static method.
2966 _ControlImpl::GetMinimumSizeLimit(void) const
2969 return Dimension(0, 0);
2972 // [ToDo] Must provide a static method.
2974 _ControlImpl::GetMaximumSizeLimit(void) const
2977 return Dimension(_Control::MAX_LENGTH, _Control::MAX_LENGTH);
2981 _ControlImpl::GetClientBounds(void) const
2983 return GetCore().GetClientBounds();
2987 _ControlImpl::GetAbsoluteBounds(void) const
2989 return GetCore().GetAbsoluteBounds();
2993 _ControlImpl::SetClientBounds(const Rectangle& bounds)
2995 return GetCore().SetClientBounds(bounds);
2999 _ControlImpl::GetBackgroundColor(void) const
3001 return GetCore().GetBackgroundColor();
3005 _ControlImpl::IsOpaque(void) const
3011 _ControlImpl::SetBackgroundColor(const Color& color)
3015 GetCore().SetBackgroundColor(color);
3020 color.GetColorComponents(r, g, b, a);
3021 GetCore().SetBackgroundColor(Color(r*a/ 255, g*a/255, b*a/ 255, 255));
3026 _ControlImpl::GetForegroundColor(void) const
3029 return __foregroundColor;
3033 _ControlImpl::SetForegroundColor(const Color& color)
3036 __foregroundColor = color;
3040 _ControlImpl::GetFontSize(void) const
3047 _ControlImpl::SetFontSize(int fontSize)
3050 __fontSize = fontSize;
3053 ITouchEventListener*
3054 _ControlImpl::GetDefaultTouchEventListener(void) const
3057 return __pDefaultTouchEventListener;
3061 _ControlImpl::GetDefaultKeyEventListener(void) const
3064 return __pDefaultKeyEventListener;
3068 _ControlImpl::SetDefaultKeyEventListener(IKeyEventListener* pDefaultListener)
3071 __pDefaultKeyEventListener = pDefaultListener;
3075 _ControlImpl::SetDefaultTouchEventListener(ITouchEventListener* pDefaultListener)
3078 __pDefaultTouchEventListener = pDefaultListener;
3082 _ControlImpl::GetCompositeMode(void) const
3085 return COMPOSITE_MODE_ALPHA_BLENDING;
3089 _ControlImpl::SetCompositeMode(CompositeMode compositeMode)
3093 if (compositeMode == COMPOSITE_MODE_ALPHA_BLENDING)
3098 SysLogException(NID_UI, E_UNSUPPORTED_OPERATION, "[E_UNSUPPORTED_OPERATION] This operation is not supported.");
3099 return E_UNSUPPORTED_OPERATION;
3103 _ControlImpl::SetChromaKeyColor(Color chromaKeyColor)
3105 SysLogException(NID_UI, E_UNSUPPORTED_OPERATION, "[E_UNSUPPORTED_OPERATION] This operation is not supported.");
3106 return E_UNSUPPORTED_OPERATION;
3110 _ControlImpl::GetChromaKeyColor(void) const
3112 static const Color errorColor(0, 0, 0, 0);
3113 SysLogException(NID_UI, E_UNSUPPORTED_OPERATION, "[E_UNSUPPORTED_OPERATION] This operation is not supported.");
3117 Animations::ControlAnimator*
3118 _ControlImpl::GetControlAnimator(void) const
3122 if ((IsMovable() == false) && (IsResizable() == false))
3124 SysLog(NID_UI, "Control is not animatable.\n");
3128 if (__pControlAnimator == null)
3130 ControlAnimator* pControlAnimator = new (std::nothrow) ControlAnimator();
3131 SysTryReturn(NID_UI, (pControlAnimator != null), null, E_OUT_OF_MEMORY, "Unable to create ControlAnimator instance.\n");
3133 // [ToDo] Check if the Open API can return E_SYSTEM.
3134 result r = pControlAnimator->Construct(*__pControlPublic);
3137 delete pControlAnimator;
3138 SysLogException(NID_UI, E_SYSTEM, "[E_SYSTEM] Failed to create control animator.");
3142 (const_cast <_ControlImpl*>(this))->__pControlAnimator = pControlAnimator;
3145 return __pControlAnimator;
3149 _ControlImpl::GetVisualElement(void) const
3151 return GetCore().GetVisualElement();
3155 _ControlImpl::SetMultiTouchEnabled(bool enabled)
3157 GetCore().SetMultiTouchEnabled(enabled);
3161 _ControlImpl::IsMultiTouchEnabled(void) const
3163 return GetCore().IsMultiTouchEnabled();
3166 _ControlImpl::PublicEventListenerList*
3167 _ControlImpl::CreatePublicEventListenerListN(void) const
3169 PublicEventListenerList* pListenerList = new (std::nothrow) PublicEventListenerList;
3170 SysTryReturn(NID_UI, pListenerList, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");
3172 return pListenerList;
3176 _ControlImpl::HasCore(void) const
3178 return __pControlCore != null;
3182 _ControlImpl::SetCore(_Control& core)
3184 result r = E_SUCCESS;
3186 __pControlCore = &core;
3187 __pControlCore->SetControlDelegate(*this);
3188 __pControlCore->SetUserData(this);
3190 __pCoreEventListener = new (std::nothrow) CoreEventListener(*this);
3191 SysTryCatch(NID_UI, __pCoreEventListener, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");
3193 __pControlCore->SetEventListener<_UI_EVENT_FOCUS>(__pCoreEventListener);
3194 __pControlCore->SetEventListener<_UI_EVENT_NOTIFICAITON>(__pCoreEventListener);
3196 __pPropagatedTouchEventListener = new (std::nothrow) _PropagatedTouchEventListener(*this);
3197 SysTryCatch(NID_UI, __pPropagatedTouchEventListener, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");
3199 __pControlCore->SetPropagatedTouchEventListener(__pPropagatedTouchEventListener);
3201 __pPropagatedKeyEventListener = new (std::nothrow) _PropagatedKeyEventListener(*this);
3202 SysTryCatch(NID_UI, __pPropagatedKeyEventListener, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");
3204 __pControlCore->SetPropagatedKeyEventListener(__pPropagatedKeyEventListener);
3210 SysLogException(NID_UI, r, "[%s] Propagating.", GetErrorMessage(r));
3215 _ControlImpl::ResetCore(bool deallocate)
3217 if (__pControlCore == null)
3222 __pControlCore->ResetEventListeners();
3223 __pControlCore->SetUserData(null);
3224 __pControlCore->ResetControlDelegate();
3226 __pFlickGestureDetector->RemoveGestureListener(*__pCoreEventListener);
3227 __pControlCore->RemoveGestureDetector(*__pFlickGestureDetector);
3229 __pLongPressGestureDetector->RemoveGestureListener(*__pCoreEventListener);
3230 __pControlCore->RemoveGestureDetector(*__pLongPressGestureDetector);
3232 __pControlCore->SetPropagatedTouchEventListener(null);
3233 __pControlCore->SetPropagatedKeyEventListener(null);
3237 delete __pControlCore;
3239 __pControlCore = null;
3241 delete __pCoreEventListener;
3242 __pCoreEventListener = null;
3244 delete __pPropagatedTouchEventListener;
3245 __pPropagatedTouchEventListener = null;
3247 delete __pPropagatedKeyEventListener;
3248 __pPropagatedKeyEventListener = null;
3252 _ControlImpl::Dispose(bool deallocateCore)
3254 if(GetVisualElement() && __pCustomVisualElement)
3256 GetVisualElement()->DetachChild( *__pCustomVisualElement);
3258 __pCustomVisualElement = null;
3260 ResetCore(deallocateCore);
3262 // Release core events
3263 delete __pCoreKeyEvent;
3264 __pCoreKeyEvent = null;
3265 delete __pCoreTouchEvent;
3266 __pCoreTouchEvent = null;
3267 delete __pCoreFocusEvent;
3268 __pCoreFocusEvent = null;
3269 delete __pCoreGestureEvent;
3270 __pCoreGestureEvent = null;
3272 // Relese public event listeners
3273 delete __pPublicFocusEventListeners;
3274 __pPublicFocusEventListeners = null;
3275 delete __pPublicKeyEventListeners;
3276 __pPublicKeyEventListeners = null;
3277 delete __pPublicTouchEventListeners;
3278 __pPublicTouchEventListeners = null;
3279 delete __pPublicDragDropEventListeners;
3280 __pPublicDragDropEventListeners = null;
3281 delete __pPublicTouchModeChangedEventListeners;
3282 __pPublicTouchModeChangedEventListeners = null;
3284 // Release builder bounds
3285 delete __pBuilderPortraitBounds;
3286 __pBuilderPortraitBounds = null;
3287 delete __pBuilderLandscapeBounds;
3288 __pBuilderLandscapeBounds = null;
3291 delete __pControlAnimator;
3292 __pControlAnimator = null;
3294 delete __pPublicGestureDetectors;
3295 __pPublicGestureDetectors = null;
3297 delete __pFlickGestureDetector;
3298 __pFlickGestureDetector = null;
3300 delete __pLongPressGestureDetector;
3301 __pLongPressGestureDetector = null;
3303 delete __pAccessibilityContainerImpl;
3304 __pAccessibilityContainerImpl = null;
3307 _ControlImpl::~_ControlImpl(void)
3312 _ControlImpl::_ControlImpl(Control* pPublic, _Control* pCore)
3313 : __pControlPublic(pPublic)
3314 , __pControlCore(null)
3315 , __pControlAnimator(null)
3316 , __pCustomVisualElement(null)
3317 , __pPublicFocusEventListeners(null)
3318 , __pPublicKeyEventListeners(null)
3319 , __pPublicTouchEventListeners(null)
3320 , __pPublicDragDropEventListeners(null)
3321 , __pPublicTouchModeChangedEventListeners(null)
3322 , __pDefaultKeyEventListener(null)
3323 , __pDefaultTouchEventListener(null)
3324 , __foregroundColor(Color(0, 0, 0, 0))
3326 , __inputEventConsumed(false)
3327 , __focusableChangable(true)
3328 , __pCoreEventListener(null)
3329 , __pCoreKeyEvent(null)
3330 , __pCoreTouchEvent(null)
3331 , __pCoreFocusEvent(null)
3332 , __pCoreGestureEvent(null)
3333 , __pBuilderPortraitBounds(null)
3334 , __pBuilderLandscapeBounds(null)
3335 , __pFlickGestureDetector(null)
3336 , __pLongPressGestureDetector(null)
3337 , __pPublicGestureDetectors(null)
3338 , __pAccessibilityContainerImpl(null)
3341 result r = E_SUCCESS;
3343 SysAssert(__pControlPublic);
3347 r = SetCore(*pCore);
3348 SysTryReturnVoidResult(NID_UI, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
3350 // Core event listeners: [ToDo: mklove.kang] Check exceptions because the constructors can fail.
3351 __pCoreKeyEvent = new (std::nothrow) CoreKeyEvent(*this);
3352 SysTryCatch(NID_UI, __pCoreKeyEvent, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");
3354 __pCoreTouchEvent = new (std::nothrow) CoreTouchEvent(*this);
3355 SysTryCatch(NID_UI, __pCoreTouchEvent, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");
3357 __pCoreFocusEvent = new (std::nothrow) CoreFocusEvent(*this);
3358 SysTryCatch(NID_UI, __pCoreFocusEvent, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");
3360 __pCoreGestureEvent = new (std::nothrow) CoreGestureEvent(*this);
3361 SysTryCatch(NID_UI, __pCoreGestureEvent, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");
3363 __pFlickGestureDetector = new (std::nothrow) _TouchFlickGestureDetector;
3364 SysTryCatch(NID_UI, __pFlickGestureDetector, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");
3366 __pLongPressGestureDetector = new (std::nothrow) _TouchLongPressGestureDetector;
3367 SysTryCatch(NID_UI, __pLongPressGestureDetector, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");
3370 __pPublicFocusEventListeners = CreatePublicEventListenerListN();
3371 r = GetLastResult();
3372 SysTryCatch(NID_UI, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
3374 __pPublicKeyEventListeners = CreatePublicEventListenerListN();
3375 r = GetLastResult();
3376 SysTryCatch(NID_UI, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
3378 __pPublicTouchEventListeners = CreatePublicEventListenerListN();
3379 r = GetLastResult();
3380 SysTryCatch(NID_UI, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
3382 __pPublicDragDropEventListeners = CreatePublicEventListenerListN();
3383 r = GetLastResult();
3384 SysTryCatch(NID_UI, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
3386 __pPublicTouchModeChangedEventListeners = CreatePublicEventListenerListN();
3387 r = GetLastResult();
3388 SysTryCatch(NID_UI, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
3390 __pPublicGestureDetectors = new (std::nothrow) LinkedListT<TouchGestureDetector*>;
3391 r = GetLastResult();
3392 SysTryCatch(NID_UI, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
3394 r = _ResourceManager::GetInstance()->GetColor(L"DEFAULTCOLORTABLE::foreground", __foregroundColor);
3395 SysTryReturnVoidResult(NID_UI, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
3398 SysAssert(r == E_SUCCESS);
3403 Dispose(true); // [ToDo] Is it OK?
3406 _Layout::LayoutContainer&
3407 _ControlImpl::GetLayoutContainer(void) const
3409 return GetCore().GetLayoutContainer();
3413 _ControlImpl::SetBuilderBounds(_ControlOrientation orientation, const Rectangle& bounds)
3417 if (orientation == _CONTROL_ORIENTATION_PORTRAIT)
3419 if (__pBuilderPortraitBounds == null)
3421 __pBuilderPortraitBounds = new (std::nothrow) Rectangle(0, 0, 0, 0);
3423 SysTryReturn(NID_UI,
3424 __pBuilderPortraitBounds, E_OUT_OF_MEMORY,
3425 E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");
3428 *__pBuilderPortraitBounds = bounds;
3431 else if (orientation == _CONTROL_ORIENTATION_LANDSCAPE)
3433 if (__pBuilderLandscapeBounds == null)
3435 __pBuilderLandscapeBounds = new (std::nothrow) Rectangle(0, 0, 0, 0);
3437 SysTryReturn(NID_UI,
3438 __pBuilderLandscapeBounds, E_OUT_OF_MEMORY,
3439 E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");
3442 *__pBuilderLandscapeBounds = bounds;
3451 _ControlImpl::GetBuilderBounds(_ControlOrientation orientation, Rectangle& bounds) const
3455 if (orientation == _CONTROL_ORIENTATION_PORTRAIT && __pBuilderPortraitBounds)
3457 bounds = *__pBuilderPortraitBounds;
3460 else if (orientation == _CONTROL_ORIENTATION_LANDSCAPE && __pBuilderLandscapeBounds)
3462 bounds = *__pBuilderLandscapeBounds;
3470 _ControlImpl::GetCapturedBitmapN(void) const
3472 return GetCore().GetCapturedBitmapN(true);
3476 _ControlImpl::GetInvalidatedBounds(void) const
3478 return GetCore().GetInvalidatedBounds();
3482 _ControlImpl::GenerateKeyEvent(KeyState keyState, _KeyCode keyCode)
3484 result r = E_SUCCESS;
3486 SysTryReturn(NID_UI, keyState == KEY_LONGPRESSED,
3487 E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] keyState is invalid.\n");
3489 SysTryReturn(NID_UI, __pCoreKeyEvent, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] System error occurred.");
3491 __pCoreKeyEvent->ProcessListener(keyState, keyCode);
3497 _ControlImpl::GenerateTouchEvent(const _TouchInfo& touchInfo)
3499 result r = E_SUCCESS;
3501 _TouchStatus touchStatus = touchInfo.GetTouchStatus();
3503 SysTryReturn(NID_UI, (touchStatus == _TOUCH_LONG_PRESSED) || (touchStatus == _TOUCH_DOUBLE_PRESSED),
3504 E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] touchStatus is invalid.\n");
3506 SysTryReturn(NID_UI, __pCoreTouchEvent, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] System error occurred.");
3508 __pCoreTouchEvent->ProcessListener(touchInfo);
3514 _ControlImpl::SetMovable(bool movable)
3516 GetCore().SetMovable(movable);
3520 _ControlImpl::SetResizable(bool resizable)
3522 GetCore().SetResizable(resizable);
3525 AccessibilityContainer*
3526 _ControlImpl::GetAccessibilityContainer(void)
3528 if(__pAccessibilityContainerImpl == null)
3530 AccessibilityContainer* pContainer = _AccessibilityContainerImpl::CreateAccessibilityContainerN(*this);
3533 __pAccessibilityContainerImpl = _AccessibilityContainerImpl::GetInstance(*pContainer);
3541 return &(__pAccessibilityContainerImpl->GetPublic());