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_DataBinding.cpp
19 * @brief This is the implementation for the _DataBinding class and default transformer.
23 #include <FBaseInteger.h>
24 #include <FBaseString.h>
25 #include <FGrpColor.h>
26 #include <FGrpDimension.h>
27 #include <FGrpRectangle.h>
28 #include <FUiIDataBindingDataTransformer.h>
29 #include <FUiIDataBindingDataValidator.h>
30 #include <FUiIDataBindingListener.h>
31 #include "FUi_Control.h"
32 #include "FUi_IPropertyChangeEventListener.h"
33 #include "FUi_PropertyBase.h"
34 #include "FUi_DataBinding.h"
36 using namespace Tizen::Base;
37 using namespace Tizen::Graphics;
41 using namespace Tizen::Ui;
43 class _DefaultTransformer
45 , public IDataBindingDataTransformer
48 virtual ~_DefaultTransformer(void);
50 virtual bool TransformSourceToTarget(const Tizen::Base::String& bindingId, DataBindingDataType sourceType, const Tizen::Base::Object& sourceData, DataBindingDataType targetType, Tizen::Base::Object& targetData);
51 virtual bool TransformTargetToSource(const Tizen::Base::String& bindingId, DataBindingDataType targetType, const Tizen::Base::Object& targetData, DataBindingDataType sourceType, Tizen::Base::Object& sourceData);
52 virtual bool IsSourceToTargetTransformable(const Tizen::Base::String& bindingId, DataBindingDataType sourceType, DataBindingDataType targetType);
53 virtual bool IsTargetToSourceTransformable(const Tizen::Base::String& bindingId, DataBindingDataType targetType, DataBindingDataType sourceType);
55 bool Transform(DataBindingDataType sourceType, const Tizen::Base::Object& sourceData, DataBindingDataType targetType, Tizen::Base::Object& destinationData);
56 bool IsTransformable(DataBindingDataType destinationType, DataBindingDataType sourceType);
59 _DefaultTransformer::~_DefaultTransformer(void)
63 _DefaultTransformer::TransformSourceToTarget(const Tizen::Base::String& bindingId, DataBindingDataType sourceType, const Tizen::Base::Object& sourceData, DataBindingDataType targetType, Tizen::Base::Object& targetData)
65 return Transform(sourceType, sourceData, targetType, targetData);
68 _DefaultTransformer::TransformTargetToSource(const Tizen::Base::String& bindingId, DataBindingDataType targetType, const Tizen::Base::Object& targetData, DataBindingDataType sourceType, Tizen::Base::Object& sourceData)
70 return Transform(targetType, targetData, sourceType, sourceData);
73 _DefaultTransformer::IsSourceToTargetTransformable(const Tizen::Base::String& bindingId, DataBindingDataType sourceType, DataBindingDataType targetType)
75 return IsTransformable(sourceType, targetType);
78 _DefaultTransformer::IsTargetToSourceTransformable(const Tizen::Base::String& bindingId, DataBindingDataType targetType, DataBindingDataType sourceType)
80 return IsTransformable(targetType, sourceType);
84 _DefaultTransformer::Transform(DataBindingDataType sourceType, const Tizen::Base::Object& sourceData, DataBindingDataType destinationType, Tizen::Base::Object& destinationData)
88 switch (destinationType)
90 case DATA_BINDING_DATA_TYPE_INTEGER:
91 switch (sourceType) // INTEGER from BOOLEAN, DOUBLE, FLOAT, INTEGER, LONG, STRING
93 case DATA_BINDING_DATA_TYPE_BOOLEAN:
95 Tizen::Base::Integer* pTarget = dynamic_cast<Tizen::Base::Integer*>(&destinationData);
100 pTarget->value = static_cast<Boolean&>(const_cast<Object&>(sourceData)).ToBool()?1:0;
104 case DATA_BINDING_DATA_TYPE_FLOAT:
106 Tizen::Base::Integer* pTarget = dynamic_cast<Tizen::Base::Integer*>(&destinationData);
111 pTarget->value = static_cast<Float&>(const_cast<Object&>(sourceData)).ToInt();
114 case DATA_BINDING_DATA_TYPE_INTEGER:
116 Tizen::Base::Integer* pTarget = dynamic_cast<Tizen::Base::Integer*>(&destinationData);
121 pTarget->value = static_cast<Integer&>(const_cast<Object&>(sourceData)).ToInt();
125 case DATA_BINDING_DATA_TYPE_LONG:
127 Tizen::Base::Integer* pTarget = dynamic_cast<Tizen::Base::Integer*>(&destinationData);
132 pTarget->value = static_cast<Long&>(const_cast<Object&>(sourceData)).ToInt();
136 case DATA_BINDING_DATA_TYPE_COLOR:
138 Tizen::Base::Integer* pTarget = dynamic_cast<Tizen::Base::Integer*>(&destinationData);
143 pTarget->value = static_cast<Color&>(const_cast<Object&>(sourceData)).GetRGB32();
151 case DATA_BINDING_DATA_TYPE_FLOAT:
152 switch (sourceType) // FLOAT from DOUBLE, FLOAT, INTEGER, LONG, STRING
154 case DATA_BINDING_DATA_TYPE_BOOLEAN:
156 Tizen::Base::Float* pTarget = dynamic_cast<Tizen::Base::Float*>(&destinationData);
161 pTarget->value = static_cast<Boolean&>(const_cast<Object&>(sourceData)).ToBool() ? 1.0 : 0.0;
164 case DATA_BINDING_DATA_TYPE_FLOAT:
166 Tizen::Base::Float* pTarget = dynamic_cast<Tizen::Base::Float*>(&destinationData);
171 pTarget->value = static_cast<Float&>(const_cast<Object&>(sourceData)).ToFloat();
175 case DATA_BINDING_DATA_TYPE_INTEGER:
177 Tizen::Base::Float* pTarget = dynamic_cast<Tizen::Base::Float*>(&destinationData);
182 pTarget->value = static_cast<Integer&>(const_cast<Object&>(sourceData)).ToFloat();
185 case DATA_BINDING_DATA_TYPE_LONG:
187 Tizen::Base::Float* pTarget = dynamic_cast<Tizen::Base::Float*>(&destinationData);
192 pTarget->value = static_cast<Long&>(const_cast<Object&>(sourceData)).ToFloat();
199 case DATA_BINDING_DATA_TYPE_DOUBLE:
200 switch (sourceType) // DOUBLE from DOUBLE, FLOAT, INTEGER, LONG, STRING
202 case DATA_BINDING_DATA_TYPE_DOUBLE:
204 Tizen::Base::Double* pTarget = dynamic_cast<Tizen::Base::Double*>(&destinationData);
209 pTarget->value = static_cast<Double&>(const_cast<Object&>(sourceData)).ToDouble();
212 case DATA_BINDING_DATA_TYPE_FLOAT:
214 Tizen::Base::Double* pTarget = dynamic_cast<Tizen::Base::Double*>(&destinationData);
219 pTarget->value = static_cast<Float&>(const_cast<Object&>(sourceData)).ToDouble();
222 case DATA_BINDING_DATA_TYPE_INTEGER:
224 Tizen::Base::Double* pTarget = dynamic_cast<Tizen::Base::Double*>(&destinationData);
229 pTarget->value = static_cast<Integer&>(const_cast<Object&>(sourceData)).ToDouble();
232 case DATA_BINDING_DATA_TYPE_LONG:
234 Tizen::Base::Double* pTarget = dynamic_cast<Tizen::Base::Double*>(&destinationData);
239 pTarget->value = static_cast<Long&>(const_cast<Object&>(sourceData)).ToDouble();
242 case DATA_BINDING_DATA_TYPE_BOOLEAN:
244 Tizen::Base::Double* pTarget = dynamic_cast<Tizen::Base::Double*>(&destinationData);
249 pTarget->value = static_cast<Boolean&>(const_cast<Object&>(sourceData)).ToBool() ? 1.0 : 0.0;
256 case DATA_BINDING_DATA_TYPE_LONG:
257 switch (sourceType) // LONG from DOUBLE, FLOAT, INTEGER, LONG, STRING
259 case DATA_BINDING_DATA_TYPE_FLOAT:
261 Tizen::Base::Long* pTarget = dynamic_cast<Tizen::Base::Long*>(&destinationData);
266 pTarget->value = static_cast<Float&>(const_cast<Object&>(sourceData)).ToLong();
269 case DATA_BINDING_DATA_TYPE_INTEGER:
271 Tizen::Base::Long* pTarget = dynamic_cast<Tizen::Base::Long*>(&destinationData);
276 pTarget->value = static_cast<Integer&>(const_cast<Object&>(sourceData)).ToLong();
279 case DATA_BINDING_DATA_TYPE_LONG:
281 Tizen::Base::Long* pTarget = dynamic_cast<Tizen::Base::Long*>(&destinationData);
286 pTarget->value = static_cast<Long&>(const_cast<Object&>(sourceData)).ToLong();
289 case DATA_BINDING_DATA_TYPE_BOOLEAN:
291 Tizen::Base::Long* pTarget = dynamic_cast<Tizen::Base::Long*>(&destinationData);
296 pTarget->value = static_cast<Boolean&>(const_cast<Object&>(sourceData)).ToBool() ? 1 : 0;
303 case DATA_BINDING_DATA_TYPE_STRING:
304 switch (sourceType) // STRING from DOUBLE, FLOAT, INTEGER, LONG, STRING
306 case DATA_BINDING_DATA_TYPE_DOUBLE:
308 Tizen::Base::String* pTarget = dynamic_cast<Tizen::Base::String*>(&destinationData);
313 *pTarget = static_cast<Double&>(const_cast<Object&>(sourceData)).ToString();
317 case DATA_BINDING_DATA_TYPE_FLOAT:
319 Tizen::Base::String* pTarget = dynamic_cast<Tizen::Base::String*>(&destinationData);
324 *pTarget = static_cast<Float&>(const_cast<Object&>(sourceData)).ToString();
328 case DATA_BINDING_DATA_TYPE_INTEGER:
330 Tizen::Base::String* pTarget = dynamic_cast<Tizen::Base::String*>(&destinationData);
335 *pTarget = static_cast<Integer&>(const_cast<Object&>(sourceData)).ToString();
339 case DATA_BINDING_DATA_TYPE_LONG:
341 Tizen::Base::String* pTarget = dynamic_cast<Tizen::Base::String*>(&destinationData);
346 *pTarget = static_cast<Long&>(const_cast<Object&>(sourceData)).ToString();
350 case DATA_BINDING_DATA_TYPE_STRING:
352 Tizen::Base::String* pTarget = dynamic_cast<Tizen::Base::String*>(&destinationData);
357 *pTarget = static_cast<String&>(const_cast<Object&>(sourceData));
360 case DATA_BINDING_DATA_TYPE_BOOLEAN:
362 Tizen::Base::String* pTarget = dynamic_cast<Tizen::Base::String*>(&destinationData);
367 *pTarget = static_cast<Boolean&>(const_cast<Object&>(sourceData)).ToString();
371 case DATA_BINDING_DATA_TYPE_COLOR:
373 Tizen::Base::String* pTarget = dynamic_cast<Tizen::Base::String*>(&destinationData);
379 r= pTarget->Append(L"#");
384 wchar_t tempString[] = L"XXXXXXXX";
385 swprintf(tempString, (sizeof(tempString) / sizeof(wchar_t)), L"%X",static_cast<Color &>(const_cast<Object&>(sourceData)).GetRGB32());
386 r= pTarget->Append(tempString);
394 case DATA_BINDING_DATA_TYPE_DIMENSION:
396 Tizen::Base::String* pTarget = dynamic_cast<Tizen::Base::String*>(&destinationData);
403 String* pString = new (std::nothrow) String(L"");
404 SysTryReturn(NID_UI, pString, false, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
406 Dimension* pDimension = &static_cast<Dimension&>(const_cast<Object&>(sourceData));
407 r = pString->Append(L"width:");
413 r = pString->Append(pDimension->width);
419 r = pString->Append(L", height:");
425 r = pString->Append(pDimension->height);
436 case DATA_BINDING_DATA_TYPE_POINT:
438 Tizen::Base::String* pTarget = dynamic_cast<Tizen::Base::String*>(&destinationData);
445 String* pString = new (std::nothrow) String(L"");
446 SysTryReturn(NID_UI, pString, false, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
448 Point* pPoint = &static_cast<Point &>(const_cast<Object&>(sourceData));
449 r = pString->Append(L"x:");
455 r = pString->Append(pPoint->x);
461 r = pString->Append(L", y:");
467 r = pString->Append(pPoint->y);
478 case DATA_BINDING_DATA_TYPE_RECTANGLE:
480 Tizen::Base::String* pTarget = dynamic_cast<Tizen::Base::String*>(&destinationData);
487 String* pString = new (std::nothrow) String(L"");
488 SysTryReturn(NID_UI, pString, false, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
490 Rectangle* pRectangle = &static_cast<Rectangle &>(const_cast<Object&>(sourceData));
491 r = pString->Append(L"x:");
497 r = pString->Append(pRectangle->x);
503 r = pString->Append(L", y:");
509 r = pString->Append(pRectangle->y);
516 r = pString->Append(L", width:");
522 r = pString->Append(pRectangle->width);
529 r = pString->Append(L", height:");
535 r = pString->Append(pRectangle->height);
549 case DATA_BINDING_DATA_TYPE_COLOR:
550 if (sourceType == DATA_BINDING_DATA_TYPE_COLOR)
552 Color* pTarget = dynamic_cast<Color*>(&destinationData);
557 *pTarget = static_cast<Color&>(const_cast<Object&>(sourceData));
560 else if (sourceType == DATA_BINDING_DATA_TYPE_INTEGER)
562 Color* pTarget = dynamic_cast<Color*>(&destinationData);
567 *pTarget = static_cast<Integer&>(const_cast<Object&>(sourceData)).ToInt();
575 case DATA_BINDING_DATA_TYPE_POINT:
576 if (sourceType == DATA_BINDING_DATA_TYPE_POINT)
578 Point* pTarget = dynamic_cast<Point*>(&destinationData);
583 pTarget->SetPosition(static_cast<Point&>(const_cast<Object&>(sourceData)).x, static_cast<Point&>(const_cast<Object&>(sourceData)).y);
586 else if (sourceType == DATA_BINDING_DATA_TYPE_RECTANGLE)
588 Point* pTarget = dynamic_cast<Point*>(&destinationData);
593 pTarget->SetPosition(static_cast<Rectangle&>(const_cast<Object&>(sourceData)).x, static_cast<Rectangle&>(const_cast<Object&>(sourceData)).y);
601 case DATA_BINDING_DATA_TYPE_RECTANGLE:
602 if (sourceType == DATA_BINDING_DATA_TYPE_RECTANGLE)
604 Rectangle* pTarget = dynamic_cast<Rectangle*>(&destinationData);
609 pTarget->SetBounds(static_cast<Rectangle&>(const_cast<Object&>(sourceData)).x, static_cast<Rectangle&>(const_cast<Object&>(sourceData)).y, static_cast<Rectangle&>(const_cast<Object&>(sourceData)).width, static_cast<Rectangle&>(const_cast<Object&>(sourceData)).height);
617 case DATA_BINDING_DATA_TYPE_DIMENSION:
618 if (sourceType == DATA_BINDING_DATA_TYPE_DIMENSION)
620 Dimension* pTarget = dynamic_cast<Dimension*>(&destinationData);
625 pTarget->SetSize(static_cast<Dimension&>(const_cast<Object&>(sourceData)).width, static_cast<Dimension&>(const_cast<Object&>(sourceData)).height);
628 else if (sourceType == DATA_BINDING_DATA_TYPE_RECTANGLE)
630 Dimension* pTarget = dynamic_cast<Dimension*>(&destinationData);
635 pTarget->SetSize(static_cast<Rectangle&>(const_cast<Object&>(sourceData)).width, static_cast<Rectangle&>(const_cast<Object&>(sourceData)).height);
648 _DefaultTransformer::IsTransformable(DataBindingDataType sourceType, DataBindingDataType destinationType)
650 bool returnValue = false;
652 switch (destinationType)
654 case DATA_BINDING_DATA_TYPE_INTEGER:
655 switch (sourceType) // INTEGER from BOOLEAN, DOUBLE, FLOAT, INTEGER, LONG, STRING
657 case DATA_BINDING_DATA_TYPE_BOOLEAN:
659 case DATA_BINDING_DATA_TYPE_FLOAT:
661 case DATA_BINDING_DATA_TYPE_INTEGER:
663 case DATA_BINDING_DATA_TYPE_LONG:
665 case DATA_BINDING_DATA_TYPE_COLOR:
673 case DATA_BINDING_DATA_TYPE_FLOAT:
674 switch (sourceType) // FLOAT from DOUBLE, FLOAT, INTEGER, LONG, STRING
676 case DATA_BINDING_DATA_TYPE_BOOLEAN:
678 case DATA_BINDING_DATA_TYPE_FLOAT:
680 case DATA_BINDING_DATA_TYPE_INTEGER:
682 case DATA_BINDING_DATA_TYPE_LONG:
690 case DATA_BINDING_DATA_TYPE_DOUBLE:
691 switch (sourceType) // DOUBLE from DOUBLE, FLOAT, INTEGER, LONG, STRING
693 case DATA_BINDING_DATA_TYPE_DOUBLE:
695 case DATA_BINDING_DATA_TYPE_FLOAT:
697 case DATA_BINDING_DATA_TYPE_INTEGER:
699 case DATA_BINDING_DATA_TYPE_LONG:
701 case DATA_BINDING_DATA_TYPE_BOOLEAN:
709 case DATA_BINDING_DATA_TYPE_LONG:
710 switch (sourceType) // LONG from DOUBLE, FLOAT, INTEGER, LONG, STRING
712 case DATA_BINDING_DATA_TYPE_BOOLEAN:
714 case DATA_BINDING_DATA_TYPE_FLOAT:
716 case DATA_BINDING_DATA_TYPE_INTEGER:
718 case DATA_BINDING_DATA_TYPE_LONG:
726 case DATA_BINDING_DATA_TYPE_STRING:
727 switch (sourceType) // STRING from all type
729 case DATA_BINDING_DATA_TYPE_BOOLEAN:
731 case DATA_BINDING_DATA_TYPE_COLOR:
733 case DATA_BINDING_DATA_TYPE_DIMENSION:
735 case DATA_BINDING_DATA_TYPE_DOUBLE:
737 case DATA_BINDING_DATA_TYPE_FLOAT:
739 case DATA_BINDING_DATA_TYPE_INTEGER:
741 case DATA_BINDING_DATA_TYPE_LONG:
743 case DATA_BINDING_DATA_TYPE_POINT:
745 case DATA_BINDING_DATA_TYPE_RECTANGLE:
747 case DATA_BINDING_DATA_TYPE_STRING:
755 case DATA_BINDING_DATA_TYPE_COLOR:
756 switch (sourceType) // COLOR from INTEGER, COLOR
758 case DATA_BINDING_DATA_TYPE_COLOR:
760 case DATA_BINDING_DATA_TYPE_INTEGER:
768 case DATA_BINDING_DATA_TYPE_POINT:
769 switch (sourceType) // POINT from POINT, RECTANGLE
771 case DATA_BINDING_DATA_TYPE_POINT:
773 case DATA_BINDING_DATA_TYPE_RECTANGLE:
782 case DATA_BINDING_DATA_TYPE_RECTANGLE:
783 if (sourceType == DATA_BINDING_DATA_TYPE_RECTANGLE)
786 case DATA_BINDING_DATA_TYPE_DIMENSION:
787 switch (sourceType) // POINT from POINT, RECTANGLE
789 case DATA_BINDING_DATA_TYPE_DIMENSION:
791 case DATA_BINDING_DATA_TYPE_RECTANGLE:
806 IsTypeSupported(VariantType variantType)
808 bool returnValue = false;
812 case VARIANT_TYPE_INT:
814 case VARIANT_TYPE_BOOL:
816 case VARIANT_TYPE_FLOAT:
818 case VARIANT_TYPE_DOUBLE:
820 case VARIANT_TYPE_LONG:
822 case VARIANT_TYPE_STRING:
824 case VARIANT_TYPE_COLOR:
826 case VARIANT_TYPE_POINT:
828 case VARIANT_TYPE_RECTANGLE:
830 case VARIANT_TYPE_DIMENSION:
839 ConvertVariantTypeToDataBindingDataType(VariantType variantType)
841 DataBindingDataType dataType = DATA_BINDING_DATA_TYPE_BOOLEAN;
845 case VARIANT_TYPE_INT:
846 dataType = DATA_BINDING_DATA_TYPE_INTEGER;
849 case VARIANT_TYPE_BOOL:
850 dataType = DATA_BINDING_DATA_TYPE_BOOLEAN;
853 case VARIANT_TYPE_FLOAT:
854 dataType = DATA_BINDING_DATA_TYPE_FLOAT;
857 case VARIANT_TYPE_DOUBLE:
858 dataType = DATA_BINDING_DATA_TYPE_DOUBLE;
861 case VARIANT_TYPE_LONG:
862 dataType = DATA_BINDING_DATA_TYPE_LONG;
865 case VARIANT_TYPE_STRING:
866 dataType = DATA_BINDING_DATA_TYPE_STRING;
869 case VARIANT_TYPE_COLOR:
870 dataType = DATA_BINDING_DATA_TYPE_COLOR;
873 case VARIANT_TYPE_POINT:
874 dataType = DATA_BINDING_DATA_TYPE_POINT;
877 case VARIANT_TYPE_RECTANGLE:
878 dataType = DATA_BINDING_DATA_TYPE_RECTANGLE;
881 case VARIANT_TYPE_DIMENSION:
882 dataType = DATA_BINDING_DATA_TYPE_DIMENSION;
885 SysAssertf(0, "Not Support Type");
892 ConvertDataBindingDataTypeToVariantType(DataBindingDataType dataType)
894 VariantType variantType = VARIANT_TYPE_NONE;
897 case DATA_BINDING_DATA_TYPE_BOOLEAN:
898 variantType = VARIANT_TYPE_BOOL;
901 case DATA_BINDING_DATA_TYPE_COLOR:
902 variantType = VARIANT_TYPE_COLOR;
905 case DATA_BINDING_DATA_TYPE_DIMENSION:
906 variantType = VARIANT_TYPE_DIMENSION;
909 case DATA_BINDING_DATA_TYPE_DOUBLE:
910 variantType = VARIANT_TYPE_DOUBLE;
913 case DATA_BINDING_DATA_TYPE_FLOAT:
914 variantType = VARIANT_TYPE_FLOAT;
917 case DATA_BINDING_DATA_TYPE_INTEGER:
918 variantType = VARIANT_TYPE_INT;
921 case DATA_BINDING_DATA_TYPE_LONG:
922 variantType = VARIANT_TYPE_LONG;
925 case DATA_BINDING_DATA_TYPE_POINT:
926 variantType = VARIANT_TYPE_POINT;
929 case DATA_BINDING_DATA_TYPE_RECTANGLE:
930 variantType = VARIANT_TYPE_RECTANGLE;
933 case DATA_BINDING_DATA_TYPE_STRING:
934 variantType = VARIANT_TYPE_STRING;
944 class _DataBindingPropertyChangeEventListner
945 : public _IPropertyChangeEventListener
946 , virtual public Tizen::Base::Runtime::IEventListener
949 _DataBindingPropertyChangeEventListner(const _DataBinding& dataBinding)
951 __pDataBinding = &const_cast<_DataBinding&>(dataBinding);
953 virtual ~_DataBindingPropertyChangeEventListner(void){};
954 virtual void OnPropertyChanging(_PropertyBase& source, const String& name, const Variant& oldValue, const Variant& newValue){};
955 virtual void OnPropertyChanged(_PropertyBase& source, const String& name, const Variant& oldValue, const Variant& newValue)
957 const Variant variant = source.GetProperty(name);
958 if (variant.IsEmpty() || oldValue == newValue)
962 if (name == __pDataBinding->GetPropertyName())
964 __pDataBinding->Update(DATA_BINDING_DESTINATION_TYPE_SOURCE);
968 _DataBinding* __pDataBinding;
969 }; //class _DataBindingPropertyChangeEventListner
971 _DefaultTransformer defaultTransformer;
973 namespace Tizen { namespace Ui
975 _DataBinding::_DataBinding(void)
978 , __propertyName(L"")
979 , __pDataSource(null)
980 , __sourceType(DATA_BINDING_DATA_TYPE_BOOLEAN)
981 , __targetType(DATA_BINDING_DATA_TYPE_BOOLEAN)
982 , __flow(DATA_BINDING_FLOW_ONE_WAY)
983 , __trigger(DATA_BINDING_TRIGGER_EXPLICIT)
986 , __pTransformer(null)
987 , __pPropertyChangeEventListener(null)
990 _DataBinding::~_DataBinding(void)
992 delete __pPropertyChangeEventListener;
993 __pPropertyChangeEventListener = null;
997 _DataBinding::Construct(const _Control& control, const String& bindingId, const String& propertyName
998 , Object& dataSource, DataBindingDataType sourceType, DataBindingFlow flow, DataBindingTrigger trigger
999 , const IDataBindingListener* pListener, const IDataBindingDataValidator* pValidator, const IDataBindingDataTransformer* pTransformer)
1001 __controlHandle = control.GetHandle();
1002 _Control* pControl = _ControlManager::GetInstance()->GetObject(__controlHandle);
1003 SysTryReturn(NID_UI, pControl, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] The control that was binded is gone.");
1004 __propertyName = propertyName;
1005 __pDataSource = &dataSource;
1006 __sourceType = sourceType;
1008 __trigger = trigger;
1009 __pListener = const_cast<IDataBindingListener*>(pListener);
1010 __pValidator = const_cast<IDataBindingDataValidator*>(pValidator);
1012 if (pTransformer != null)
1013 __pTransformer = const_cast<IDataBindingDataTransformer*>(pTransformer);
1015 __pTransformer = &::defaultTransformer;
1017 Variant variant = pControl->GetProperty(propertyName);
1019 SysTryReturn(NID_UI, GetLastResult() != E_KEY_NOT_FOUND, E_OBJ_NOT_FOUND, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] Property is not found.");
1021 SysTryReturn(NID_UI, ::IsTypeSupported(variant.GetType()), E_UNSUPPORTED_FORMAT, E_UNSUPPORTED_FORMAT
1022 , "[E_UNSUPPORTED_FORMAT] Property type is unsupported type.");
1024 __targetType = ::ConvertVariantTypeToDataBindingDataType(variant.GetType());
1028 case DATA_BINDING_FLOW_ONE_WAY:
1029 SysTryReturn(NID_UI, __pTransformer->IsSourceToTargetTransformable(bindingId, __sourceType, __targetType)
1030 , E_UNSUPPORTED_FORMAT, E_UNSUPPORTED_FORMAT, "[E_UNSUPPORTED_FORMAT] transformer can not transform source type to target type.");
1032 case DATA_BINDING_FLOW_ONE_WAY_TO_SOURCE:
1033 SysTryReturn(NID_UI, __pTransformer->IsTargetToSourceTransformable(bindingId, __targetType, __sourceType)
1034 , E_UNSUPPORTED_FORMAT, E_UNSUPPORTED_FORMAT, "[E_UNSUPPORTED_FORMAT] transformer can not transform target type to source type.");
1036 case DATA_BINDING_FLOW_TWO_WAY:
1037 SysTryReturn(NID_UI, __pTransformer->IsSourceToTargetTransformable(bindingId, __sourceType, __targetType)
1038 && __pTransformer->IsTargetToSourceTransformable(bindingId, __targetType, __sourceType)
1039 , E_UNSUPPORTED_FORMAT, E_UNSUPPORTED_FORMAT, "[E_UNSUPPORTED_FORMAT] transformer can not transform both target type and source type.");
1045 if (trigger == DATA_BINDING_TRIGGER_IMMEDIATE)
1047 __pPropertyChangeEventListener = new (std::nothrow) ::_DataBindingPropertyChangeEventListner(*this);
1048 SysTryReturn(NID_UI, __pPropertyChangeEventListener, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1049 pControl->AddPropertyChangeEventListener(*__pPropertyChangeEventListener);
1055 _DataBinding::Update(DataBindingDestinationType destinationType)
1058 Object* pTransformedObject = null;
1059 result r = E_SYSTEM;
1060 Object* pOriginObject = null;
1061 _Control* pControl = _ControlManager::GetInstance()->GetObject(__controlHandle);
1062 SysTryCatch(NID_UI, pControl, , E_SYSTEM, "[E_SYSTEM] The control that was binded is gone.");
1064 if (destinationType == DATA_BINDING_DESTINATION_TYPE_SOURCE)
1066 DataBindingDataType originType = __targetType;
1067 Variant variant = pControl->GetProperty(__propertyName);
1068 DataBindingDataType transformedType = __sourceType;
1070 switch (variant.GetType())
1072 case VARIANT_TYPE_INT:
1073 pOriginObject = new (std::nothrow) Integer(variant.ToInt());
1074 SysTryReturn(NID_UI, pOriginObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1077 case VARIANT_TYPE_BOOL:
1078 pOriginObject = new (std::nothrow) Boolean(variant.ToBool());
1079 SysTryReturn(NID_UI, pOriginObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1082 case VARIANT_TYPE_FLOAT:
1083 pOriginObject = new (std::nothrow) Float(variant.ToFloat());
1084 SysTryReturn(NID_UI, pOriginObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1087 case VARIANT_TYPE_DOUBLE:
1088 pOriginObject = new (std::nothrow) Double(variant.ToDouble());
1089 SysTryReturn(NID_UI, pOriginObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1092 case VARIANT_TYPE_LONG:
1093 pOriginObject = new (std::nothrow) Long(variant.ToLong());
1094 SysTryReturn(NID_UI, pOriginObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1097 case VARIANT_TYPE_STRING:
1098 pOriginObject = new (std::nothrow) String(variant.ToString());
1099 SysTryReturn(NID_UI, pOriginObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1102 case VARIANT_TYPE_COLOR:
1103 pOriginObject = new (std::nothrow) Color(variant.ToColor());
1104 SysTryReturn(NID_UI, pOriginObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1107 case VARIANT_TYPE_POINT:
1108 pOriginObject = new (std::nothrow) Point(variant.ToPoint().x, variant.ToPoint().y);
1109 SysTryReturn(NID_UI, pOriginObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1112 case VARIANT_TYPE_RECTANGLE:
1113 pOriginObject = new (std::nothrow) Rectangle(variant.ToRectangle().x, variant.ToRectangle().y, variant.ToRectangle().width, variant.ToRectangle().height);
1114 SysTryReturn(NID_UI, pOriginObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1117 case VARIANT_TYPE_DIMENSION:
1118 pOriginObject = new (std::nothrow) Dimension(variant.ToDimension().width, variant.ToDimension().height);
1119 SysTryReturn(NID_UI, pOriginObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1122 SysTryCatch(NID_UI, pControl, , E_SYSTEM, "[E_SYSTEM] The control that was binded is gone.");
1125 switch(__sourceType)
1127 case DATA_BINDING_DATA_TYPE_BOOLEAN:
1129 pTransformedObject = new (std::nothrow) Boolean(false);
1130 SysTryReturn(NID_UI, pTransformedObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1133 case DATA_BINDING_DATA_TYPE_COLOR:
1135 pTransformedObject = new (std::nothrow) Color;
1136 SysTryReturn(NID_UI, pTransformedObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1139 case DATA_BINDING_DATA_TYPE_DIMENSION:
1141 pTransformedObject = new (std::nothrow) Dimension;
1142 SysTryReturn(NID_UI, pTransformedObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1145 case DATA_BINDING_DATA_TYPE_DOUBLE:
1147 pTransformedObject = new (std::nothrow) Double;
1148 SysTryReturn(NID_UI, pTransformedObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1151 case DATA_BINDING_DATA_TYPE_FLOAT:
1153 pTransformedObject = new (std::nothrow) Float;
1154 SysTryReturn(NID_UI, pTransformedObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1157 case DATA_BINDING_DATA_TYPE_INTEGER:
1159 pTransformedObject = new (std::nothrow) Integer;
1160 SysTryReturn(NID_UI, pTransformedObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1163 case DATA_BINDING_DATA_TYPE_LONG:
1165 pTransformedObject = new (std::nothrow) Long;
1166 SysTryReturn(NID_UI, pTransformedObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1169 case DATA_BINDING_DATA_TYPE_POINT:
1171 pTransformedObject = new (std::nothrow) Point;
1172 SysTryReturn(NID_UI, pTransformedObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1175 case DATA_BINDING_DATA_TYPE_RECTANGLE:
1177 pTransformedObject = new (std::nothrow) Rectangle;
1178 SysTryReturn(NID_UI, pTransformedObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1181 case DATA_BINDING_DATA_TYPE_STRING:
1183 pTransformedObject = new (std::nothrow) String;
1184 SysTryReturn(NID_UI, pTransformedObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1188 SysTryCatch(NID_UI, false, , E_SYSTEM, "[E_SYSTEM] System Error");
1190 SysTryCatch(NID_UI, pTransformedObject, , E_SYSTEM, "[E_SYSTEM] data transfer is failed by memory shortage.");
1191 SysTryCatch(NID_UI, __pTransformer->TransformTargetToSource(__bindingId, originType, *pOriginObject, transformedType, *pTransformedObject) == true, , E_SYSTEM, "[E_SYSTEM] data transfer is failed by transformer.");
1193 if (__pValidator != null)
1195 valid = __pValidator->ValidateDataToSource(__bindingId, *pTransformedObject);
1199 if (__pListener != null)
1201 __pListener->OnDataBindingValidationFailed(__bindingId, pControl->GetName(), __propertyName, destinationType);
1203 SysTryCatch(NID_UI, 0, , E_SYSTEM, "[E_SYSTEM] data transfer is failed by validator.");
1206 switch (variant.GetType())
1209 case VARIANT_TYPE_INT:
1210 static_cast<Integer&>(*__pDataSource) = static_cast<Integer*>(pTransformedObject)->ToInt();
1213 case VARIANT_TYPE_BOOL:
1214 static_cast<Boolean&>(*__pDataSource) = static_cast<Boolean*>(pTransformedObject)->ToBool();
1217 case VARIANT_TYPE_FLOAT:
1218 static_cast<Float&>(*__pDataSource) = static_cast<Float*>(pTransformedObject)->ToFloat();
1221 case VARIANT_TYPE_DOUBLE:
1222 static_cast<Double&>(*__pDataSource) = static_cast<Double*>(pTransformedObject)->ToDouble();
1225 case VARIANT_TYPE_LONG:
1226 static_cast<Long&>(*__pDataSource) = static_cast<Long*>(pTransformedObject)->ToLong();
1229 case VARIANT_TYPE_STRING:
1230 static_cast<String&>(*__pDataSource) = static_cast<String&>(*pTransformedObject);
1233 case VARIANT_TYPE_COLOR:
1234 static_cast<Color&>(*__pDataSource) = static_cast<Color&>(*pTransformedObject);
1237 case VARIANT_TYPE_POINT:
1238 static_cast<Point*>(__pDataSource)->SetPosition(static_cast<Point&>(*pTransformedObject));
1241 case VARIANT_TYPE_RECTANGLE:
1242 static_cast<Rectangle*>(__pDataSource)->SetBounds(static_cast<Rectangle&>(*pTransformedObject).x, static_cast<Rectangle&>(*pTransformedObject).y, static_cast<Rectangle&>(*pTransformedObject).width, static_cast<Rectangle&>(*pTransformedObject).height);
1245 case VARIANT_TYPE_DIMENSION:
1246 static_cast<Dimension*>(__pDataSource)->SetSize(static_cast<Dimension&>(*pTransformedObject).width, static_cast<Dimension&>(*pTransformedObject).height);
1252 if (__pListener != null)
1254 __pListener->OnDataBindingSourceUpdated(__bindingId, pControl->GetName(), __propertyName);
1258 else // DATA_BINDING_DESTINATION_TYPE_TARGET
1260 DataBindingDataType originType = __sourceType;
1261 Object* pOriginObject = __pDataSource;
1262 DataBindingDataType transformedType = __targetType;
1264 switch(__targetType)
1266 case DATA_BINDING_DATA_TYPE_BOOLEAN:
1268 pTransformedObject = new (std::nothrow) Boolean(false);
1269 SysTryReturn(NID_UI, pTransformedObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1272 case DATA_BINDING_DATA_TYPE_COLOR:
1274 pTransformedObject = new (std::nothrow) Color;
1275 SysTryReturn(NID_UI, pTransformedObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1278 case DATA_BINDING_DATA_TYPE_DIMENSION:
1280 pTransformedObject = new (std::nothrow) Dimension;
1281 SysTryReturn(NID_UI, pTransformedObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1284 case DATA_BINDING_DATA_TYPE_DOUBLE:
1286 pTransformedObject = new (std::nothrow) Double;
1287 SysTryReturn(NID_UI, pTransformedObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1290 case DATA_BINDING_DATA_TYPE_FLOAT:
1292 pTransformedObject = new (std::nothrow) Float;
1293 SysTryReturn(NID_UI, pTransformedObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1296 case DATA_BINDING_DATA_TYPE_INTEGER:
1298 pTransformedObject = new (std::nothrow) Integer;
1299 SysTryReturn(NID_UI, pTransformedObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1302 case DATA_BINDING_DATA_TYPE_LONG:
1304 pTransformedObject = new (std::nothrow) Long;
1305 SysTryReturn(NID_UI, pTransformedObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1308 case DATA_BINDING_DATA_TYPE_POINT:
1310 pTransformedObject = new (std::nothrow) Point;
1311 SysTryReturn(NID_UI, pTransformedObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1314 case DATA_BINDING_DATA_TYPE_RECTANGLE:
1316 pTransformedObject = new (std::nothrow) Rectangle;
1317 SysTryReturn(NID_UI, pTransformedObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1320 case DATA_BINDING_DATA_TYPE_STRING:
1322 pTransformedObject = new (std::nothrow) String;
1323 SysTryReturn(NID_UI, pTransformedObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1327 SysTryCatch(NID_UI, false, , E_SYSTEM, "[E_SYSTEM] System Error");
1329 SysTryCatch(NID_UI, pTransformedObject, , E_SYSTEM, "[E_SYSTEM] data transfer is failed by memory shortage.");
1330 SysTryCatch(NID_UI, __pTransformer->TransformSourceToTarget(__bindingId, originType, *pOriginObject, transformedType, *pTransformedObject) == true, , E_SYSTEM, "[E_SYSTEM] data transfer is failed by transformer.");
1332 if (__pValidator != null)
1334 valid = __pValidator->ValidateDataToTarget(__bindingId, *pTransformedObject);
1338 if (__pListener != null)
1340 __pListener->OnDataBindingValidationFailed(__bindingId, pControl->GetName(), __propertyName, destinationType);
1342 SysTryCatch(NID_UI, 0, , E_SYSTEM, "[E_SYSTEM] data transfer is failed by validator.");
1347 switch (transformedType)
1349 case DATA_BINDING_DATA_TYPE_BOOLEAN:
1350 variant = static_cast<Boolean*>(pTransformedObject)->ToBool();
1353 case DATA_BINDING_DATA_TYPE_COLOR:
1354 variant = *static_cast<Color*>(pTransformedObject);
1357 case DATA_BINDING_DATA_TYPE_DIMENSION:
1358 variant = *static_cast<Dimension*>(pTransformedObject);
1361 case DATA_BINDING_DATA_TYPE_DOUBLE:
1362 variant = static_cast<Double*>( pTransformedObject)->ToDouble();
1365 case DATA_BINDING_DATA_TYPE_FLOAT:
1366 variant = static_cast<Float*>(pTransformedObject)->ToFloat();
1369 case DATA_BINDING_DATA_TYPE_INTEGER:
1370 variant = static_cast<Integer*>(pTransformedObject)->ToInt();
1373 case DATA_BINDING_DATA_TYPE_LONG:
1374 variant = static_cast<Long*>(pTransformedObject)->ToLong();
1377 case DATA_BINDING_DATA_TYPE_POINT:
1378 variant = *static_cast<Point*>(pTransformedObject);
1381 case DATA_BINDING_DATA_TYPE_RECTANGLE:
1382 variant = *static_cast<Rectangle*>(pTransformedObject);
1385 case DATA_BINDING_DATA_TYPE_STRING:
1386 variant = *static_cast<String*>(pTransformedObject);
1392 pControl->SetProperty(__propertyName, variant);
1393 if (__pListener != null)
1395 __pListener->OnDataBindingTargetUpdated(__bindingId, pControl->GetName(), __propertyName);
1401 delete pOriginObject;
1402 delete pTransformedObject;
1406 _DataBinding::SetDataBindingListener(const IDataBindingListener* pListener)
1408 __pListener = const_cast<IDataBindingListener*>(pListener);
1412 _DataBinding::Get_ControlHandle(void) const
1414 return __controlHandle;
1417 _DataBinding::GetPropertyName(void) const
1419 return __propertyName;
1422 _DataBinding::GetSourceDataType(void) const
1424 return __sourceType;
1427 _DataBinding::GetTargetDataType(void) const
1429 return __targetType;
1432 _DataBinding::GetDataFlow(void) const
1437 _DataBinding::GetTrigger(void) const