2 // Open Service Platform
3 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
5 // Licensed under the Apache License, Version 2.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://www.apache.org/licenses/LICENSE-2.0/
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.
24 #include <FBaseInteger.h>
25 #include <FBaseString.h>
26 #include <FGrpColor.h>
27 #include <FGrpDimension.h>
28 #include <FGrpRectangle.h>
29 #include <FUiIDataBindingDataTransformer.h>
30 #include <FUiIDataBindingDataValidator.h>
31 #include <FUiIDataBindingListener.h>
32 #include "FUi_Control.h"
33 #include "FUi_IPropertyChangeEventListener.h"
34 #include "FUi_PropertyBase.h"
35 #include "FUi_DataBinding.h"
37 using namespace Tizen::Base;
38 using namespace Tizen::Graphics;
42 using namespace Tizen::Ui;
44 class _DefaultTransformer
46 , public IDataBindingDataTransformer
49 virtual ~_DefaultTransformer(void);
51 virtual bool TransformSourceToTarget(const Tizen::Base::String& bindingId, DataBindingDataType sourceType, const Tizen::Base::Object& sourceData, DataBindingDataType targetType, Tizen::Base::Object& targetData);
52 virtual bool TransformTargetToSource(const Tizen::Base::String& bindingId, DataBindingDataType targetType, const Tizen::Base::Object& targetData, DataBindingDataType sourceType, Tizen::Base::Object& sourceData);
53 virtual bool IsSourceToTargetTransformable(const Tizen::Base::String& bindingId, DataBindingDataType sourceType, DataBindingDataType targetType);
54 virtual bool IsTargetToSourceTransformable(const Tizen::Base::String& bindingId, DataBindingDataType targetType, DataBindingDataType sourceType);
56 bool Transform(DataBindingDataType sourceType, const Tizen::Base::Object& sourceData, DataBindingDataType targetType, Tizen::Base::Object& destinationData);
57 bool IsTransformable(DataBindingDataType destinationType, DataBindingDataType sourceType);
60 _DefaultTransformer::~_DefaultTransformer(void)
64 _DefaultTransformer::TransformSourceToTarget(const Tizen::Base::String& bindingId, DataBindingDataType sourceType, const Tizen::Base::Object& sourceData, DataBindingDataType targetType, Tizen::Base::Object& targetData)
66 return Transform(sourceType, sourceData, targetType, targetData);
69 _DefaultTransformer::TransformTargetToSource(const Tizen::Base::String& bindingId, DataBindingDataType targetType, const Tizen::Base::Object& targetData, DataBindingDataType sourceType, Tizen::Base::Object& sourceData)
71 return Transform(targetType, targetData, sourceType, sourceData);
74 _DefaultTransformer::IsSourceToTargetTransformable(const Tizen::Base::String& bindingId, DataBindingDataType sourceType, DataBindingDataType targetType)
76 return IsTransformable(sourceType, targetType);
79 _DefaultTransformer::IsTargetToSourceTransformable(const Tizen::Base::String& bindingId, DataBindingDataType targetType, DataBindingDataType sourceType)
81 return IsTransformable(targetType, sourceType);
85 _DefaultTransformer::Transform(DataBindingDataType sourceType, const Tizen::Base::Object& sourceData, DataBindingDataType destinationType, Tizen::Base::Object& destinationData)
89 switch (destinationType)
91 case DATA_BINDING_DATA_TYPE_INTEGER:
92 switch (sourceType) // INTEGER from BOOLEAN, DOUBLE, FLOAT, INTEGER, LONG, STRING
94 case DATA_BINDING_DATA_TYPE_BOOLEAN:
96 Tizen::Base::Integer* pTarget = dynamic_cast<Tizen::Base::Integer*>(&destinationData);
101 pTarget->value = static_cast<Boolean&>(const_cast<Object&>(sourceData)).ToBool()?1:0;
105 case DATA_BINDING_DATA_TYPE_FLOAT:
107 Tizen::Base::Integer* pTarget = dynamic_cast<Tizen::Base::Integer*>(&destinationData);
112 pTarget->value = static_cast<Float&>(const_cast<Object&>(sourceData)).ToInt();
116 case DATA_BINDING_DATA_TYPE_INTEGER:
118 Tizen::Base::Integer* pTarget = dynamic_cast<Tizen::Base::Integer*>(&destinationData);
123 pTarget->value = static_cast<Integer&>(const_cast<Object&>(sourceData)).ToInt();
127 case DATA_BINDING_DATA_TYPE_LONG:
129 Tizen::Base::Integer* pTarget = dynamic_cast<Tizen::Base::Integer*>(&destinationData);
134 pTarget->value = static_cast<Long&>(const_cast<Object&>(sourceData)).ToInt();
138 case DATA_BINDING_DATA_TYPE_COLOR:
140 Tizen::Base::Integer* pTarget = dynamic_cast<Tizen::Base::Integer*>(&destinationData);
145 pTarget->value = static_cast<Color&>(const_cast<Object&>(sourceData)).GetRGB32();
155 case DATA_BINDING_DATA_TYPE_BOOLEAN:
158 case DATA_BINDING_DATA_TYPE_INTEGER:
160 Boolean* pTarget = dynamic_cast<Boolean*>(&destinationData);
165 pTarget->value = static_cast<Integer&>(const_cast<Object&>(sourceData)).CompareTo(0) == 0 ? false:true;
168 case DATA_BINDING_DATA_TYPE_BOOLEAN:
170 Boolean* pTarget = dynamic_cast<Boolean*>(&destinationData);
175 pTarget->value = static_cast<Boolean&>(const_cast<Object&>(sourceData)) == true ?true:false;
178 case DATA_BINDING_DATA_TYPE_FLOAT:
180 Boolean* pTarget = dynamic_cast<Boolean*>(&destinationData);
185 pTarget->value = static_cast<Float&>(const_cast<Object&>(sourceData)).CompareTo(0.0f) == 0 ?false:true;
188 case DATA_BINDING_DATA_TYPE_DOUBLE:
190 Boolean* pTarget = dynamic_cast<Boolean*>(&destinationData);
195 pTarget->value = static_cast<Double&>(const_cast<Object&>(sourceData)).CompareTo(0.0f) == 0 ?false:true;
198 case DATA_BINDING_DATA_TYPE_LONG:
200 Boolean* pTarget = dynamic_cast<Boolean*>(&destinationData);
205 pTarget->value = static_cast<Long&>(const_cast<Object&>(sourceData)).CompareTo(0) == 0 ? false:true;
214 case DATA_BINDING_DATA_TYPE_FLOAT:
215 switch (sourceType) // FLOAT from DOUBLE, FLOAT, INTEGER, LONG, STRING
217 case DATA_BINDING_DATA_TYPE_BOOLEAN:
219 Tizen::Base::Float* pTarget = dynamic_cast<Tizen::Base::Float*>(&destinationData);
224 pTarget->value = static_cast<Boolean&>(const_cast<Object&>(sourceData)).ToBool() ? 1.0 : 0.0;
228 case DATA_BINDING_DATA_TYPE_FLOAT:
230 Tizen::Base::Float* pTarget = dynamic_cast<Tizen::Base::Float*>(&destinationData);
235 pTarget->value = static_cast<Float&>(const_cast<Object&>(sourceData)).ToFloat();
239 case DATA_BINDING_DATA_TYPE_INTEGER:
241 Tizen::Base::Float* pTarget = dynamic_cast<Tizen::Base::Float*>(&destinationData);
246 pTarget->value = static_cast<Integer&>(const_cast<Object&>(sourceData)).ToFloat();
250 case DATA_BINDING_DATA_TYPE_LONG:
252 Tizen::Base::Float* pTarget = dynamic_cast<Tizen::Base::Float*>(&destinationData);
257 pTarget->value = static_cast<Long&>(const_cast<Object&>(sourceData)).ToFloat();
267 case DATA_BINDING_DATA_TYPE_DOUBLE:
268 switch (sourceType) // DOUBLE from DOUBLE, FLOAT, INTEGER, LONG, STRING
270 case DATA_BINDING_DATA_TYPE_DOUBLE:
272 Tizen::Base::Double* pTarget = dynamic_cast<Tizen::Base::Double*>(&destinationData);
277 pTarget->value = static_cast<Double&>(const_cast<Object&>(sourceData)).ToDouble();
281 case DATA_BINDING_DATA_TYPE_FLOAT:
283 Tizen::Base::Double* pTarget = dynamic_cast<Tizen::Base::Double*>(&destinationData);
288 pTarget->value = static_cast<Float&>(const_cast<Object&>(sourceData)).ToDouble();
292 case DATA_BINDING_DATA_TYPE_INTEGER:
294 Tizen::Base::Double* pTarget = dynamic_cast<Tizen::Base::Double*>(&destinationData);
299 pTarget->value = static_cast<Integer&>(const_cast<Object&>(sourceData)).ToDouble();
303 case DATA_BINDING_DATA_TYPE_LONG:
305 Tizen::Base::Double* pTarget = dynamic_cast<Tizen::Base::Double*>(&destinationData);
310 pTarget->value = static_cast<Long&>(const_cast<Object&>(sourceData)).ToDouble();
314 case DATA_BINDING_DATA_TYPE_BOOLEAN:
316 Tizen::Base::Double* pTarget = dynamic_cast<Tizen::Base::Double*>(&destinationData);
321 pTarget->value = static_cast<Boolean&>(const_cast<Object&>(sourceData)).ToBool() ? 1.0 : 0.0;
331 case DATA_BINDING_DATA_TYPE_LONG:
332 switch (sourceType) // LONG from DOUBLE, FLOAT, INTEGER, LONG, STRING
334 case DATA_BINDING_DATA_TYPE_FLOAT:
336 Tizen::Base::Long* pTarget = dynamic_cast<Tizen::Base::Long*>(&destinationData);
341 pTarget->value = static_cast<Float&>(const_cast<Object&>(sourceData)).ToLong();
345 case DATA_BINDING_DATA_TYPE_INTEGER:
347 Tizen::Base::Long* pTarget = dynamic_cast<Tizen::Base::Long*>(&destinationData);
352 pTarget->value = static_cast<Integer&>(const_cast<Object&>(sourceData)).ToLong();
356 case DATA_BINDING_DATA_TYPE_LONG:
358 Tizen::Base::Long* pTarget = dynamic_cast<Tizen::Base::Long*>(&destinationData);
363 pTarget->value = static_cast<Long&>(const_cast<Object&>(sourceData)).ToLong();
367 case DATA_BINDING_DATA_TYPE_BOOLEAN:
369 Tizen::Base::Long* pTarget = dynamic_cast<Tizen::Base::Long*>(&destinationData);
374 pTarget->value = static_cast<Boolean&>(const_cast<Object&>(sourceData)).ToBool() ? 1 : 0;
384 case DATA_BINDING_DATA_TYPE_STRING:
385 switch (sourceType) // STRING from DOUBLE, FLOAT, INTEGER, LONG, STRING
387 case DATA_BINDING_DATA_TYPE_DOUBLE:
389 Tizen::Base::String* pTarget = dynamic_cast<Tizen::Base::String*>(&destinationData);
394 *pTarget = static_cast<Double&>(const_cast<Object&>(sourceData)).ToString();
398 case DATA_BINDING_DATA_TYPE_FLOAT:
400 Tizen::Base::String* pTarget = dynamic_cast<Tizen::Base::String*>(&destinationData);
405 *pTarget = static_cast<Float&>(const_cast<Object&>(sourceData)).ToString();
409 case DATA_BINDING_DATA_TYPE_INTEGER:
411 Tizen::Base::String* pTarget = dynamic_cast<Tizen::Base::String*>(&destinationData);
416 *pTarget = static_cast<Integer&>(const_cast<Object&>(sourceData)).ToString();
420 case DATA_BINDING_DATA_TYPE_LONG:
422 Tizen::Base::String* pTarget = dynamic_cast<Tizen::Base::String*>(&destinationData);
427 *pTarget = static_cast<Long&>(const_cast<Object&>(sourceData)).ToString();
431 case DATA_BINDING_DATA_TYPE_STRING:
433 Tizen::Base::String* pTarget = dynamic_cast<Tizen::Base::String*>(&destinationData);
438 *pTarget = static_cast<String&>(const_cast<Object&>(sourceData));
442 case DATA_BINDING_DATA_TYPE_BOOLEAN:
444 Tizen::Base::String* pTarget = dynamic_cast<Tizen::Base::String*>(&destinationData);
449 *pTarget = static_cast<Boolean&>(const_cast<Object&>(sourceData)).ToString();
453 case DATA_BINDING_DATA_TYPE_COLOR:
455 Tizen::Base::String* pTarget = dynamic_cast<Tizen::Base::String*>(&destinationData);
461 r= pTarget->Append(L"#");
466 wchar_t tempString[] = L"XXXXXXXX";
467 swprintf(tempString, (sizeof(tempString) / sizeof(wchar_t)), L"%X",static_cast<Color &>(const_cast<Object&>(sourceData)).GetRGB32());
468 r= pTarget->Append(tempString);
476 case DATA_BINDING_DATA_TYPE_DIMENSION:
478 Tizen::Base::String* pTarget = dynamic_cast<Tizen::Base::String*>(&destinationData);
485 String* pString = new (std::nothrow) String(L"");
486 SysTryReturn(NID_UI, pString, false, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
488 Dimension* pDimension = &static_cast<Dimension&>(const_cast<Object&>(sourceData));
489 r = pString->Append(L"width:");
495 r = pString->Append(pDimension->width);
501 r = pString->Append(L", height:");
507 r = pString->Append(pDimension->height);
518 case DATA_BINDING_DATA_TYPE_POINT:
520 Tizen::Base::String* pTarget = dynamic_cast<Tizen::Base::String*>(&destinationData);
527 String* pString = new (std::nothrow) String(L"");
528 SysTryReturn(NID_UI, pString, false, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
530 Point* pPoint = &static_cast<Point &>(const_cast<Object&>(sourceData));
531 r = pString->Append(L"x:");
537 r = pString->Append(pPoint->x);
543 r = pString->Append(L", y:");
549 r = pString->Append(pPoint->y);
560 case DATA_BINDING_DATA_TYPE_RECTANGLE:
562 Tizen::Base::String* pTarget = dynamic_cast<Tizen::Base::String*>(&destinationData);
569 String* pString = new (std::nothrow) String(L"");
570 SysTryReturn(NID_UI, pString, false, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
572 Rectangle* pRectangle = &static_cast<Rectangle &>(const_cast<Object&>(sourceData));
573 r = pString->Append(L"x:");
579 r = pString->Append(pRectangle->x);
585 r = pString->Append(L", y:");
591 r = pString->Append(pRectangle->y);
598 r = pString->Append(L", width:");
604 r = pString->Append(pRectangle->width);
611 r = pString->Append(L", height:");
617 r = pString->Append(pRectangle->height);
627 case DATA_BINDING_DATA_TYPE_FLOAT_DIMENSION:
629 Tizen::Base::String* pTarget = dynamic_cast<Tizen::Base::String*>(&destinationData);
636 String* pString = new (std::nothrow) String(L"");
637 SysTryReturn(NID_UI, pString, false, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
639 FloatDimension* pDimension = &static_cast<FloatDimension&>(const_cast<Object&>(sourceData));
640 r = pString->Append(L"width:");
646 r = pString->Append(pDimension->width);
652 r = pString->Append(L", height:");
658 r = pString->Append(pDimension->height);
669 case DATA_BINDING_DATA_TYPE_FLOAT_POINT:
671 Tizen::Base::String* pTarget = dynamic_cast<Tizen::Base::String*>(&destinationData);
678 String* pString = new (std::nothrow) String(L"");
679 SysTryReturn(NID_UI, pString, false, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
681 FloatPoint* pPoint = &static_cast<FloatPoint &>(const_cast<Object&>(sourceData));
682 r = pString->Append(L"x:");
688 r = pString->Append(pPoint->x);
694 r = pString->Append(L", y:");
700 r = pString->Append(pPoint->y);
711 case DATA_BINDING_DATA_TYPE_FLOAT_RECTANGLE:
713 Tizen::Base::String* pTarget = dynamic_cast<Tizen::Base::String*>(&destinationData);
720 String* pString = new (std::nothrow) String(L"");
721 SysTryReturn(NID_UI, pString, false, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
723 FloatRectangle* pRectangle = &static_cast<FloatRectangle &>(const_cast<Object&>(sourceData));
724 r = pString->Append(L"x:");
730 r = pString->Append(pRectangle->x);
736 r = pString->Append(L", y:");
742 r = pString->Append(pRectangle->y);
748 r = pString->Append(L", width:");
754 r = pString->Append(pRectangle->width);
761 r = pString->Append(L", height:");
767 r = pString->Append(pRectangle->height);
783 case DATA_BINDING_DATA_TYPE_COLOR:
784 if (sourceType == DATA_BINDING_DATA_TYPE_COLOR)
786 Color* pTarget = dynamic_cast<Color*>(&destinationData);
791 *pTarget = static_cast<Color&>(const_cast<Object&>(sourceData));
794 else if (sourceType == DATA_BINDING_DATA_TYPE_INTEGER)
796 Color* pTarget = dynamic_cast<Color*>(&destinationData);
801 *pTarget = static_cast<Integer&>(const_cast<Object&>(sourceData)).ToInt();
809 case DATA_BINDING_DATA_TYPE_POINT:
812 case DATA_BINDING_DATA_TYPE_POINT:
814 Point* pTarget = dynamic_cast<Point*>(&destinationData);
819 pTarget->SetPosition(static_cast<Point&>(const_cast<Object&>(sourceData)).x, static_cast<Point&>(const_cast<Object&>(sourceData)).y);
823 case DATA_BINDING_DATA_TYPE_FLOAT_POINT:
825 Point* pTarget = dynamic_cast<Point*>(&destinationData);
830 pTarget->SetPosition(static_cast<FloatPoint&>(const_cast<Object&>(sourceData)).x, static_cast<FloatPoint&>(const_cast<Object&>(sourceData)).y);
834 case DATA_BINDING_DATA_TYPE_RECTANGLE:
836 Point* pTarget = dynamic_cast<Point*>(&destinationData);
841 pTarget->SetPosition(static_cast<Rectangle&>(const_cast<Object&>(sourceData)).x, static_cast<Rectangle&>(const_cast<Object&>(sourceData)).y);
845 case DATA_BINDING_DATA_TYPE_FLOAT_RECTANGLE:
847 Point* pTarget = dynamic_cast<Point*>(&destinationData);
852 pTarget->SetPosition(static_cast<FloatRectangle&>(const_cast<Object&>(sourceData)).x, static_cast<FloatRectangle&>(const_cast<Object&>(sourceData)).y);
860 case DATA_BINDING_DATA_TYPE_RECTANGLE:
861 if (sourceType == DATA_BINDING_DATA_TYPE_RECTANGLE)
863 Rectangle* pTarget = dynamic_cast<Rectangle*>(&destinationData);
868 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);
871 else if (sourceType == DATA_BINDING_DATA_TYPE_FLOAT_RECTANGLE)
873 Rectangle* pTarget = dynamic_cast<Rectangle*>(&destinationData);
878 pTarget->SetBounds(static_cast<FloatRectangle&>(const_cast<Object&>(sourceData)).x, static_cast<FloatRectangle&>(const_cast<Object&>(sourceData)).y, static_cast<FloatRectangle&>(const_cast<Object&>(sourceData)).width, static_cast<FloatRectangle&>(const_cast<Object&>(sourceData)).height);
886 case DATA_BINDING_DATA_TYPE_DIMENSION:
889 case DATA_BINDING_DATA_TYPE_DIMENSION:
891 Dimension* pTarget = dynamic_cast<Dimension*>(&destinationData);
896 pTarget->SetSize(static_cast<Dimension&>(const_cast<Object&>(sourceData)).width, static_cast<Dimension&>(const_cast<Object&>(sourceData)).height);
900 case DATA_BINDING_DATA_TYPE_FLOAT_DIMENSION:
902 Dimension* pTarget = dynamic_cast<Dimension*>(&destinationData);
907 pTarget->SetSize(static_cast<FloatDimension&>(const_cast<Object&>(sourceData)).width, static_cast<FloatDimension&>(const_cast<Object&>(sourceData)).height);
911 case DATA_BINDING_DATA_TYPE_RECTANGLE:
913 Dimension* pTarget = dynamic_cast<Dimension*>(&destinationData);
918 pTarget->SetSize(static_cast<Rectangle&>(const_cast<Object&>(sourceData)).width, static_cast<Rectangle&>(const_cast<Object&>(sourceData)).height);
922 case DATA_BINDING_DATA_TYPE_FLOAT_RECTANGLE:
924 Point* pTarget = dynamic_cast<Point*>(&destinationData);
929 pTarget->SetPosition(static_cast<FloatRectangle&>(const_cast<Object&>(sourceData)).x, static_cast<FloatRectangle&>(const_cast<Object&>(sourceData)).y);
937 case DATA_BINDING_DATA_TYPE_FLOAT_POINT:
940 case DATA_BINDING_DATA_TYPE_POINT:
942 FloatPoint* pTarget = dynamic_cast<FloatPoint*>(&destinationData);
947 pTarget->SetPosition(static_cast<Point&>(const_cast<Object&>(sourceData)).x, static_cast<Point&>(const_cast<Object&>(sourceData)).y);
951 case DATA_BINDING_DATA_TYPE_FLOAT_POINT:
953 FloatPoint* pTarget = dynamic_cast<FloatPoint*>(&destinationData);
958 pTarget->SetPosition(static_cast<FloatPoint&>(const_cast<Object&>(sourceData)).x, static_cast<FloatPoint&>(const_cast<Object&>(sourceData)).y);
962 case DATA_BINDING_DATA_TYPE_RECTANGLE:
964 FloatPoint* pTarget = dynamic_cast<FloatPoint*>(&destinationData);
969 pTarget->SetPosition(static_cast<Rectangle&>(const_cast<Object&>(sourceData)).x, static_cast<Rectangle&>(const_cast<Object&>(sourceData)).y);
973 case DATA_BINDING_DATA_TYPE_FLOAT_RECTANGLE:
975 FloatPoint* pTarget = dynamic_cast<FloatPoint*>(&destinationData);
980 pTarget->SetPosition(static_cast<FloatRectangle&>(const_cast<Object&>(sourceData)).x, static_cast<FloatRectangle&>(const_cast<Object&>(sourceData)).y);
988 case DATA_BINDING_DATA_TYPE_FLOAT_RECTANGLE:
989 if (sourceType == DATA_BINDING_DATA_TYPE_RECTANGLE)
991 FloatRectangle* pTarget = dynamic_cast<FloatRectangle*>(&destinationData);
996 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);
999 else if (sourceType == DATA_BINDING_DATA_TYPE_FLOAT_RECTANGLE)
1001 Rectangle* pTarget = dynamic_cast<Rectangle*>(&destinationData);
1006 pTarget->SetBounds(static_cast<FloatRectangle&>(const_cast<Object&>(sourceData)).x, static_cast<FloatRectangle&>(const_cast<Object&>(sourceData)).y, static_cast<FloatRectangle&>(const_cast<Object&>(sourceData)).width, static_cast<FloatRectangle&>(const_cast<Object&>(sourceData)).height);
1014 case DATA_BINDING_DATA_TYPE_FLOAT_DIMENSION:
1017 case DATA_BINDING_DATA_TYPE_DIMENSION:
1019 FloatDimension* pTarget = dynamic_cast<FloatDimension*>(&destinationData);
1024 pTarget->SetSize(static_cast<Dimension&>(const_cast<Object&>(sourceData)).width, static_cast<Dimension&>(const_cast<Object&>(sourceData)).height);
1028 case DATA_BINDING_DATA_TYPE_FLOAT_DIMENSION:
1030 FloatDimension* pTarget = dynamic_cast<FloatDimension*>(&destinationData);
1035 pTarget->SetSize(static_cast<FloatDimension&>(const_cast<Object&>(sourceData)).width, static_cast<FloatDimension&>(const_cast<Object&>(sourceData)).height);
1039 case DATA_BINDING_DATA_TYPE_RECTANGLE:
1041 FloatDimension* pTarget = dynamic_cast<FloatDimension*>(&destinationData);
1046 pTarget->SetSize(static_cast<Rectangle&>(const_cast<Object&>(sourceData)).width, static_cast<Rectangle&>(const_cast<Object&>(sourceData)).height);
1050 case DATA_BINDING_DATA_TYPE_FLOAT_RECTANGLE:
1052 FloatPoint* pTarget = dynamic_cast<FloatPoint*>(&destinationData);
1057 pTarget->SetPosition(static_cast<FloatRectangle&>(const_cast<Object&>(sourceData)).x, static_cast<FloatRectangle&>(const_cast<Object&>(sourceData)).y);
1071 _DefaultTransformer::IsTransformable(DataBindingDataType sourceType, DataBindingDataType destinationType)
1073 bool returnValue = false;
1075 switch (destinationType)
1077 case DATA_BINDING_DATA_TYPE_INTEGER:
1078 switch (sourceType) // INTEGER from BOOLEAN, DOUBLE, FLOAT, INTEGER, LONG, STRING
1080 case DATA_BINDING_DATA_TYPE_BOOLEAN:
1082 case DATA_BINDING_DATA_TYPE_FLOAT:
1084 case DATA_BINDING_DATA_TYPE_INTEGER:
1086 case DATA_BINDING_DATA_TYPE_LONG:
1088 case DATA_BINDING_DATA_TYPE_COLOR:
1095 case DATA_BINDING_DATA_TYPE_FLOAT:
1096 switch (sourceType) // FLOAT from DOUBLE, FLOAT, INTEGER, LONG, STRING
1098 case DATA_BINDING_DATA_TYPE_BOOLEAN:
1100 case DATA_BINDING_DATA_TYPE_FLOAT:
1102 case DATA_BINDING_DATA_TYPE_INTEGER:
1104 case DATA_BINDING_DATA_TYPE_LONG:
1112 case DATA_BINDING_DATA_TYPE_DOUBLE:
1113 switch (sourceType) // DOUBLE from DOUBLE, FLOAT, INTEGER, LONG, STRING
1115 case DATA_BINDING_DATA_TYPE_DOUBLE:
1117 case DATA_BINDING_DATA_TYPE_FLOAT:
1119 case DATA_BINDING_DATA_TYPE_INTEGER:
1121 case DATA_BINDING_DATA_TYPE_LONG:
1123 case DATA_BINDING_DATA_TYPE_BOOLEAN:
1131 case DATA_BINDING_DATA_TYPE_LONG:
1132 switch (sourceType) // LONG from DOUBLE, FLOAT, INTEGER, LONG, STRING
1134 case DATA_BINDING_DATA_TYPE_BOOLEAN:
1136 case DATA_BINDING_DATA_TYPE_FLOAT:
1138 case DATA_BINDING_DATA_TYPE_INTEGER:
1140 case DATA_BINDING_DATA_TYPE_LONG:
1148 case DATA_BINDING_DATA_TYPE_STRING:
1149 switch (sourceType) // STRING from all type
1151 case DATA_BINDING_DATA_TYPE_BOOLEAN:
1153 case DATA_BINDING_DATA_TYPE_COLOR:
1155 case DATA_BINDING_DATA_TYPE_DIMENSION:
1157 case DATA_BINDING_DATA_TYPE_DOUBLE:
1159 case DATA_BINDING_DATA_TYPE_FLOAT:
1161 case DATA_BINDING_DATA_TYPE_INTEGER:
1163 case DATA_BINDING_DATA_TYPE_LONG:
1165 case DATA_BINDING_DATA_TYPE_POINT:
1167 case DATA_BINDING_DATA_TYPE_RECTANGLE:
1169 case DATA_BINDING_DATA_TYPE_STRING:
1177 case DATA_BINDING_DATA_TYPE_COLOR:
1178 switch (sourceType) // COLOR from INTEGER, COLOR
1180 case DATA_BINDING_DATA_TYPE_COLOR:
1182 case DATA_BINDING_DATA_TYPE_INTEGER:
1190 case DATA_BINDING_DATA_TYPE_POINT:
1191 switch (sourceType) // POINT from POINT, RECTANGLE
1193 case DATA_BINDING_DATA_TYPE_FLOAT_RECTANGLE:
1195 case DATA_BINDING_DATA_TYPE_FLOAT_POINT:
1197 case DATA_BINDING_DATA_TYPE_POINT:
1199 case DATA_BINDING_DATA_TYPE_RECTANGLE:
1207 case DATA_BINDING_DATA_TYPE_RECTANGLE:
1208 switch (sourceType) // RECTANGLE from FLOATRECTANGLE, RECTANGLE
1210 case DATA_BINDING_DATA_TYPE_FLOAT_RECTANGLE:
1212 case DATA_BINDING_DATA_TYPE_RECTANGLE:
1220 case DATA_BINDING_DATA_TYPE_DIMENSION:
1221 switch (sourceType) // POINT from POINT, RECTANGLE
1223 case DATA_BINDING_DATA_TYPE_FLOAT_RECTANGLE:
1225 case DATA_BINDING_DATA_TYPE_FLOAT_DIMENSION:
1227 case DATA_BINDING_DATA_TYPE_DIMENSION:
1229 case DATA_BINDING_DATA_TYPE_RECTANGLE:
1236 case DATA_BINDING_DATA_TYPE_FLOAT_POINT:
1237 switch (sourceType) // POINT from POINT, RECTANGLE
1239 case DATA_BINDING_DATA_TYPE_FLOAT_RECTANGLE:
1241 case DATA_BINDING_DATA_TYPE_FLOAT_POINT:
1243 case DATA_BINDING_DATA_TYPE_POINT:
1245 case DATA_BINDING_DATA_TYPE_RECTANGLE:
1252 case DATA_BINDING_DATA_TYPE_FLOAT_RECTANGLE:
1253 switch (sourceType) // RECTANGLE from FLOATRECTANGLE, RECTANGLE
1255 case DATA_BINDING_DATA_TYPE_FLOAT_RECTANGLE:
1257 case DATA_BINDING_DATA_TYPE_RECTANGLE:
1265 case DATA_BINDING_DATA_TYPE_FLOAT_DIMENSION:
1266 switch (sourceType) // POINT from POINT, RECTANGLE
1268 case DATA_BINDING_DATA_TYPE_FLOAT_RECTANGLE:
1270 case DATA_BINDING_DATA_TYPE_FLOAT_DIMENSION:
1272 case DATA_BINDING_DATA_TYPE_DIMENSION:
1274 case DATA_BINDING_DATA_TYPE_RECTANGLE:
1288 IsTypeSupported(VariantType variantType)
1290 bool returnValue = false;
1292 switch (variantType)
1294 case VARIANT_TYPE_INT:
1296 case VARIANT_TYPE_BOOL:
1298 case VARIANT_TYPE_FLOAT:
1300 case VARIANT_TYPE_DOUBLE:
1302 case VARIANT_TYPE_LONG:
1304 case VARIANT_TYPE_STRING:
1306 case VARIANT_TYPE_COLOR:
1308 case VARIANT_TYPE_POINT:
1310 case VARIANT_TYPE_RECTANGLE:
1312 case VARIANT_TYPE_FLOAT_DIMENSION:
1314 case VARIANT_TYPE_FLOAT_POINT:
1316 case VARIANT_TYPE_FLOAT_RECTANGLE:
1318 case VARIANT_TYPE_DIMENSION:
1327 ConvertVariantTypeToDataBindingDataType(VariantType variantType)
1329 DataBindingDataType dataType = DATA_BINDING_DATA_TYPE_BOOLEAN;
1331 switch (variantType)
1333 case VARIANT_TYPE_INT:
1334 dataType = DATA_BINDING_DATA_TYPE_INTEGER;
1337 case VARIANT_TYPE_BOOL:
1338 dataType = DATA_BINDING_DATA_TYPE_BOOLEAN;
1341 case VARIANT_TYPE_FLOAT:
1342 dataType = DATA_BINDING_DATA_TYPE_FLOAT;
1345 case VARIANT_TYPE_DOUBLE:
1346 dataType = DATA_BINDING_DATA_TYPE_DOUBLE;
1349 case VARIANT_TYPE_LONG:
1350 dataType = DATA_BINDING_DATA_TYPE_LONG;
1353 case VARIANT_TYPE_STRING:
1354 dataType = DATA_BINDING_DATA_TYPE_STRING;
1357 case VARIANT_TYPE_COLOR:
1358 dataType = DATA_BINDING_DATA_TYPE_COLOR;
1361 case VARIANT_TYPE_POINT:
1362 dataType = DATA_BINDING_DATA_TYPE_POINT;
1365 case VARIANT_TYPE_RECTANGLE:
1366 dataType = DATA_BINDING_DATA_TYPE_RECTANGLE;
1369 case VARIANT_TYPE_DIMENSION:
1370 dataType = DATA_BINDING_DATA_TYPE_DIMENSION;
1373 case VARIANT_TYPE_FLOAT_DIMENSION:
1374 dataType = DATA_BINDING_DATA_TYPE_FLOAT_DIMENSION;
1377 case VARIANT_TYPE_FLOAT_POINT:
1378 dataType = DATA_BINDING_DATA_TYPE_FLOAT_POINT;
1381 case VARIANT_TYPE_FLOAT_RECTANGLE:
1382 dataType = DATA_BINDING_DATA_TYPE_FLOAT_RECTANGLE;
1386 SysAssertf(0, "Not Support Type");
1392 class _DataBindingPropertyChangeEventListner
1393 : public _IPropertyChangeEventListener
1394 , virtual public Tizen::Base::Runtime::IEventListener
1397 _DataBindingPropertyChangeEventListner(const _DataBinding& dataBinding)
1399 __pDataBinding = &const_cast<_DataBinding&>(dataBinding);
1401 virtual ~_DataBindingPropertyChangeEventListner(void){};
1402 virtual void OnPropertyChanging(_PropertyBase& source, const String& name, const Variant& oldValue, const Variant& newValue){};
1403 virtual void OnPropertyChanged(_PropertyBase& source, const String& name, const Variant& oldValue, const Variant& newValue)
1405 const Variant variant = source.GetProperty(name);
1406 if (variant.IsEmpty() || oldValue == newValue)
1410 if (name == __pDataBinding->GetPropertyName())
1412 __pDataBinding->Update(DATA_BINDING_DESTINATION_TYPE_SOURCE);
1416 _DataBinding* __pDataBinding;
1417 }; //class _DataBindingPropertyChangeEventListner
1419 _DefaultTransformer defaultTransformer;
1421 namespace Tizen { namespace Ui
1423 _DataBinding::_DataBinding(void)
1426 , __propertyName(L"")
1427 , __pDataSource(null)
1428 , __sourceType(DATA_BINDING_DATA_TYPE_BOOLEAN)
1429 , __targetType(DATA_BINDING_DATA_TYPE_BOOLEAN)
1430 , __flow(DATA_BINDING_FLOW_ONE_WAY)
1431 , __trigger(DATA_BINDING_TRIGGER_EXPLICIT)
1433 , __pValidator(null)
1434 , __pTransformer(null)
1435 , __pPropertyChangeEventListener(null)
1438 _DataBinding::~_DataBinding(void)
1440 if (__pPropertyChangeEventListener)
1442 _Control* pControl = _ControlManager::GetInstance()->GetObject(__controlHandle);
1445 pControl->RemovePropertyChangeEventListener(*__pPropertyChangeEventListener);
1447 delete __pPropertyChangeEventListener;
1448 __pPropertyChangeEventListener = null;
1453 _DataBinding::Construct(const _Control& control, const String& bindingId, const String& propertyName
1454 , Object& dataSource, DataBindingDataType sourceType, DataBindingFlow flow, DataBindingTrigger trigger
1455 , const IDataBindingListener* pListener, const IDataBindingDataValidator* pValidator, const IDataBindingDataTransformer* pTransformer)
1457 __controlHandle = control.GetHandle();
1458 _Control* pControl = _ControlManager::GetInstance()->GetObject(__controlHandle);
1459 SysTryReturn(NID_UI, pControl, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] The control that was binded is gone.");
1460 __propertyName = propertyName;
1461 __pDataSource = &dataSource;
1462 __sourceType = sourceType;
1464 __trigger = trigger;
1465 __pListener = const_cast<IDataBindingListener*>(pListener);
1466 __pValidator = const_cast<IDataBindingDataValidator*>(pValidator);
1468 if (pTransformer != null)
1469 __pTransformer = const_cast<IDataBindingDataTransformer*>(pTransformer);
1471 __pTransformer = &::defaultTransformer;
1473 Variant variant = pControl->GetProperty(propertyName);
1475 SysTryReturn(NID_UI, GetLastResult() != E_KEY_NOT_FOUND, E_OBJ_NOT_FOUND, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] Property is not found.");
1477 SysTryReturn(NID_UI, ::IsTypeSupported(variant.GetType()), E_UNSUPPORTED_FORMAT, E_UNSUPPORTED_FORMAT
1478 , "[E_UNSUPPORTED_FORMAT] Property type is unsupported type.");
1480 __targetType = ::ConvertVariantTypeToDataBindingDataType(variant.GetType());
1484 case DATA_BINDING_FLOW_ONE_WAY:
1485 SysTryReturn(NID_UI, __pTransformer->IsSourceToTargetTransformable(bindingId, __sourceType, __targetType)
1486 , E_UNSUPPORTED_FORMAT, E_UNSUPPORTED_FORMAT, "[E_UNSUPPORTED_FORMAT] transformer can not transform source type to target type.");
1488 case DATA_BINDING_FLOW_ONE_WAY_TO_SOURCE:
1489 SysTryReturn(NID_UI, __pTransformer->IsTargetToSourceTransformable(bindingId, __targetType, __sourceType)
1490 , E_UNSUPPORTED_FORMAT, E_UNSUPPORTED_FORMAT, "[E_UNSUPPORTED_FORMAT] transformer can not transform target type to source type.");
1492 case DATA_BINDING_FLOW_TWO_WAY:
1493 SysTryReturn(NID_UI, __pTransformer->IsSourceToTargetTransformable(bindingId, __sourceType, __targetType)
1494 && __pTransformer->IsTargetToSourceTransformable(bindingId, __targetType, __sourceType)
1495 , E_UNSUPPORTED_FORMAT, E_UNSUPPORTED_FORMAT, "[E_UNSUPPORTED_FORMAT] transformer can not transform both target type and source type.");
1501 if (trigger == DATA_BINDING_TRIGGER_IMMEDIATE)
1503 __pPropertyChangeEventListener = new (std::nothrow) ::_DataBindingPropertyChangeEventListner(*this);
1504 SysTryReturn(NID_UI, __pPropertyChangeEventListener, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1505 pControl->AddPropertyChangeEventListener(*__pPropertyChangeEventListener);
1511 _DataBinding::Update(DataBindingDestinationType destinationType)
1514 Object* pTransformedObject = null;
1515 result r = E_SYSTEM;
1516 Object* pOriginObject = null;
1517 _Control* pControl = _ControlManager::GetInstance()->GetObject(__controlHandle);
1518 SysTryCatch(NID_UI, pControl, , E_SYSTEM, "[E_SYSTEM] The control that was binded is gone.");
1520 if (destinationType == DATA_BINDING_DESTINATION_TYPE_SOURCE)
1522 DataBindingDataType originType = __targetType;
1523 Variant variant = pControl->GetProperty(__propertyName);
1524 DataBindingDataType transformedType = __sourceType;
1526 switch (variant.GetType())
1528 case VARIANT_TYPE_INT:
1529 pOriginObject = new (std::nothrow) Integer(variant.ToInt());
1530 SysTryReturn(NID_UI, pOriginObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1533 case VARIANT_TYPE_BOOL:
1534 pOriginObject = new (std::nothrow) Boolean(variant.ToBool());
1535 SysTryReturn(NID_UI, pOriginObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1538 case VARIANT_TYPE_FLOAT:
1539 pOriginObject = new (std::nothrow) Float(variant.ToFloat());
1540 SysTryReturn(NID_UI, pOriginObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1543 case VARIANT_TYPE_DOUBLE:
1544 pOriginObject = new (std::nothrow) Double(variant.ToDouble());
1545 SysTryReturn(NID_UI, pOriginObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1548 case VARIANT_TYPE_LONG:
1549 pOriginObject = new (std::nothrow) Long(variant.ToLong());
1550 SysTryReturn(NID_UI, pOriginObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1553 case VARIANT_TYPE_STRING:
1554 pOriginObject = new (std::nothrow) String(variant.ToString());
1555 SysTryReturn(NID_UI, pOriginObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1558 case VARIANT_TYPE_COLOR:
1559 pOriginObject = new (std::nothrow) Color(variant.ToColor());
1560 SysTryReturn(NID_UI, pOriginObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1563 case VARIANT_TYPE_POINT:
1564 pOriginObject = new (std::nothrow) Point(variant.ToPoint().x, variant.ToPoint().y);
1565 SysTryReturn(NID_UI, pOriginObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1568 case VARIANT_TYPE_RECTANGLE:
1569 pOriginObject = new (std::nothrow) Rectangle(variant.ToRectangle().x, variant.ToRectangle().y, variant.ToRectangle().width, variant.ToRectangle().height);
1570 SysTryReturn(NID_UI, pOriginObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1573 case VARIANT_TYPE_DIMENSION:
1574 pOriginObject = new (std::nothrow) Dimension(variant.ToDimension().width, variant.ToDimension().height);
1575 SysTryReturn(NID_UI, pOriginObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1577 case VARIANT_TYPE_FLOAT_POINT:
1578 pOriginObject = new (std::nothrow) FloatPoint(variant.ToFloatPoint());
1579 SysTryReturn(NID_UI, pOriginObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1581 case VARIANT_TYPE_FLOAT_RECTANGLE:
1582 pOriginObject = new (std::nothrow) FloatRectangle(variant.ToFloatRectangle());
1583 SysTryReturn(NID_UI, pOriginObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1585 case VARIANT_TYPE_FLOAT_DIMENSION:
1586 pOriginObject = new (std::nothrow) FloatDimension(variant.ToFloatDimension());
1587 SysTryReturn(NID_UI, pOriginObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1593 SysTryCatch(NID_UI, pControl, , E_SYSTEM, "[E_SYSTEM] The control that was binded is gone.");
1596 switch(__sourceType)
1598 case DATA_BINDING_DATA_TYPE_BOOLEAN:
1600 pTransformedObject = new (std::nothrow) Boolean(false);
1601 SysTryReturn(NID_UI, pTransformedObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1604 case DATA_BINDING_DATA_TYPE_COLOR:
1606 pTransformedObject = new (std::nothrow) Color;
1607 SysTryReturn(NID_UI, pTransformedObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1610 case DATA_BINDING_DATA_TYPE_DIMENSION:
1612 pTransformedObject = new (std::nothrow) Dimension;
1613 SysTryReturn(NID_UI, pTransformedObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1616 case DATA_BINDING_DATA_TYPE_DOUBLE:
1618 pTransformedObject = new (std::nothrow) Double;
1619 SysTryReturn(NID_UI, pTransformedObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1622 case DATA_BINDING_DATA_TYPE_FLOAT:
1624 pTransformedObject = new (std::nothrow) Float;
1625 SysTryReturn(NID_UI, pTransformedObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1628 case DATA_BINDING_DATA_TYPE_INTEGER:
1630 pTransformedObject = new (std::nothrow) Integer;
1631 SysTryReturn(NID_UI, pTransformedObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1634 case DATA_BINDING_DATA_TYPE_LONG:
1636 pTransformedObject = new (std::nothrow) Long;
1637 SysTryReturn(NID_UI, pTransformedObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1640 case DATA_BINDING_DATA_TYPE_POINT:
1642 pTransformedObject = new (std::nothrow) Point;
1643 SysTryReturn(NID_UI, pTransformedObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1646 case DATA_BINDING_DATA_TYPE_RECTANGLE:
1648 pTransformedObject = new (std::nothrow) Rectangle;
1649 SysTryReturn(NID_UI, pTransformedObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1652 case DATA_BINDING_DATA_TYPE_STRING:
1654 pTransformedObject = new (std::nothrow) String;
1655 SysTryReturn(NID_UI, pTransformedObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1658 case DATA_BINDING_DATA_TYPE_FLOAT_POINT:
1660 pTransformedObject = new (std::nothrow) FloatPoint;
1661 SysTryReturn(NID_UI, pTransformedObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1664 case DATA_BINDING_DATA_TYPE_FLOAT_RECTANGLE:
1666 pTransformedObject = new (std::nothrow) FloatRectangle;
1667 SysTryReturn(NID_UI, pTransformedObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1670 case DATA_BINDING_DATA_TYPE_FLOAT_DIMENSION:
1672 pTransformedObject = new (std::nothrow) FloatDimension;
1673 SysTryReturn(NID_UI, pTransformedObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1677 SysTryCatch(NID_UI, false, , E_SYSTEM, "[E_SYSTEM] System Error");
1679 SysTryCatch(NID_UI, pTransformedObject, , E_SYSTEM, "[E_SYSTEM] data transfer is failed by memory shortage.");
1680 SysTryCatch(NID_UI, __pTransformer->TransformTargetToSource(__bindingId, originType, *pOriginObject, transformedType, *pTransformedObject) == true, , E_SYSTEM, "[E_SYSTEM] data transfer is failed by transformer.");
1682 if (__pValidator != null)
1684 valid = __pValidator->ValidateDataToSource(__bindingId, *pTransformedObject);
1688 if (__pListener != null)
1690 __pListener->OnDataBindingValidationFailed(__bindingId, pControl->GetName(), __propertyName, destinationType);
1692 SysTryCatch(NID_UI, 0, , E_SYSTEM, "[E_SYSTEM] data transfer is failed by validator.");
1695 switch (variant.GetType())
1698 case VARIANT_TYPE_INT:
1699 static_cast<Integer&>(*__pDataSource) = static_cast<Integer*>(pTransformedObject)->ToInt();
1702 case VARIANT_TYPE_BOOL:
1703 static_cast<Boolean&>(*__pDataSource) = static_cast<Boolean*>(pTransformedObject)->ToBool();
1706 case VARIANT_TYPE_FLOAT:
1707 static_cast<Float&>(*__pDataSource) = static_cast<Float*>(pTransformedObject)->ToFloat();
1710 case VARIANT_TYPE_DOUBLE:
1711 static_cast<Double&>(*__pDataSource) = static_cast<Double*>(pTransformedObject)->ToDouble();
1714 case VARIANT_TYPE_LONG:
1715 static_cast<Long&>(*__pDataSource) = static_cast<Long*>(pTransformedObject)->ToLong();
1718 case VARIANT_TYPE_STRING:
1719 static_cast<String&>(*__pDataSource) = static_cast<String&>(*pTransformedObject);
1722 case VARIANT_TYPE_COLOR:
1723 static_cast<Color&>(*__pDataSource) = static_cast<Color&>(*pTransformedObject);
1726 case VARIANT_TYPE_POINT:
1727 static_cast<Point*>(__pDataSource)->SetPosition(static_cast<Point&>(*pTransformedObject));
1730 case VARIANT_TYPE_RECTANGLE:
1731 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);
1734 case VARIANT_TYPE_DIMENSION:
1735 static_cast<Dimension*>(__pDataSource)->SetSize(static_cast<Dimension&>(*pTransformedObject).width, static_cast<Dimension&>(*pTransformedObject).height);
1738 case VARIANT_TYPE_FLOAT_POINT:
1739 static_cast<FloatPoint*>(__pDataSource)->SetPosition(static_cast<FloatPoint&>(*pTransformedObject).x, static_cast<FloatPoint&>(*pTransformedObject).y);
1742 case VARIANT_TYPE_FLOAT_RECTANGLE:
1743 static_cast<FloatRectangle*>(__pDataSource)->SetBounds(static_cast<FloatRectangle&>(*pTransformedObject).x, static_cast<FloatRectangle&>(*pTransformedObject).y, static_cast<FloatRectangle&>(*pTransformedObject).width, static_cast<FloatRectangle&>(*pTransformedObject).height);
1746 case VARIANT_TYPE_FLOAT_DIMENSION:
1747 static_cast<FloatDimension*>(__pDataSource)->SetSize(static_cast<FloatDimension&>(*pTransformedObject).width, static_cast<FloatDimension&>(*pTransformedObject).height);
1753 if (__pListener != null)
1755 __pListener->OnDataBindingSourceUpdated(__bindingId, pControl->GetName(), __propertyName);
1759 else // DATA_BINDING_DESTINATION_TYPE_TARGET
1761 DataBindingDataType originType = __sourceType;
1762 Object* pOriginObject = __pDataSource;
1763 DataBindingDataType transformedType = __targetType;
1765 switch(__targetType)
1767 case DATA_BINDING_DATA_TYPE_BOOLEAN:
1769 pTransformedObject = new (std::nothrow) Boolean(false);
1770 SysTryReturn(NID_UI, pTransformedObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1773 case DATA_BINDING_DATA_TYPE_COLOR:
1775 pTransformedObject = new (std::nothrow) Color;
1776 SysTryReturn(NID_UI, pTransformedObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1779 case DATA_BINDING_DATA_TYPE_DIMENSION:
1781 pTransformedObject = new (std::nothrow) Dimension;
1782 SysTryReturn(NID_UI, pTransformedObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1785 case DATA_BINDING_DATA_TYPE_DOUBLE:
1787 pTransformedObject = new (std::nothrow) Double;
1788 SysTryReturn(NID_UI, pTransformedObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1791 case DATA_BINDING_DATA_TYPE_FLOAT:
1793 pTransformedObject = new (std::nothrow) Float;
1794 SysTryReturn(NID_UI, pTransformedObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1797 case DATA_BINDING_DATA_TYPE_INTEGER:
1799 pTransformedObject = new (std::nothrow) Integer;
1800 SysTryReturn(NID_UI, pTransformedObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1803 case DATA_BINDING_DATA_TYPE_LONG:
1805 pTransformedObject = new (std::nothrow) Long;
1806 SysTryReturn(NID_UI, pTransformedObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1809 case DATA_BINDING_DATA_TYPE_POINT:
1811 pTransformedObject = new (std::nothrow) Point;
1812 SysTryReturn(NID_UI, pTransformedObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1815 case DATA_BINDING_DATA_TYPE_RECTANGLE:
1817 pTransformedObject = new (std::nothrow) Rectangle;
1818 SysTryReturn(NID_UI, pTransformedObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1821 case DATA_BINDING_DATA_TYPE_STRING:
1823 pTransformedObject = new (std::nothrow) String;
1824 SysTryReturn(NID_UI, pTransformedObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1827 case DATA_BINDING_DATA_TYPE_FLOAT_POINT:
1829 pTransformedObject = new (std::nothrow) FloatPoint;
1830 SysTryReturn(NID_UI, pTransformedObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1833 case DATA_BINDING_DATA_TYPE_FLOAT_RECTANGLE:
1835 pTransformedObject = new (std::nothrow) FloatRectangle;
1836 SysTryReturn(NID_UI, pTransformedObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1839 case DATA_BINDING_DATA_TYPE_FLOAT_DIMENSION:
1841 pTransformedObject = new (std::nothrow) FloatDimension;
1842 SysTryReturn(NID_UI, pTransformedObject, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
1846 SysTryCatch(NID_UI, false, , E_SYSTEM, "[E_SYSTEM] System Error");
1848 SysTryCatch(NID_UI, pTransformedObject, , E_SYSTEM, "[E_SYSTEM] data transfer is failed by memory shortage.");
1849 SysTryCatch(NID_UI, __pTransformer->TransformSourceToTarget(__bindingId, originType, *pOriginObject, transformedType, *pTransformedObject) == true, , E_SYSTEM, "[E_SYSTEM] data transfer is failed by transformer.");
1851 if (__pValidator != null)
1853 valid = __pValidator->ValidateDataToTarget(__bindingId, *pTransformedObject);
1857 if (__pListener != null)
1859 __pListener->OnDataBindingValidationFailed(__bindingId, pControl->GetName(), __propertyName, destinationType);
1861 SysTryCatch(NID_UI, 0, , E_SYSTEM, "[E_SYSTEM] data transfer is failed by validator.");
1866 switch (transformedType)
1868 case DATA_BINDING_DATA_TYPE_BOOLEAN:
1869 variant = static_cast<Boolean*>(pTransformedObject)->ToBool();
1872 case DATA_BINDING_DATA_TYPE_COLOR:
1873 variant = *static_cast<Color*>(pTransformedObject);
1876 case DATA_BINDING_DATA_TYPE_DIMENSION:
1877 variant = *static_cast<Dimension*>(pTransformedObject);
1880 case DATA_BINDING_DATA_TYPE_DOUBLE:
1881 variant = static_cast<Double*>( pTransformedObject)->ToDouble();
1884 case DATA_BINDING_DATA_TYPE_FLOAT:
1885 variant = static_cast<Float*>(pTransformedObject)->ToFloat();
1888 case DATA_BINDING_DATA_TYPE_INTEGER:
1889 variant = static_cast<Integer*>(pTransformedObject)->ToInt();
1892 case DATA_BINDING_DATA_TYPE_LONG:
1893 variant = static_cast<Long*>(pTransformedObject)->ToLong();
1896 case DATA_BINDING_DATA_TYPE_POINT:
1897 variant = *static_cast<Point*>(pTransformedObject);
1900 case DATA_BINDING_DATA_TYPE_RECTANGLE:
1901 variant = *static_cast<Rectangle*>(pTransformedObject);
1904 case DATA_BINDING_DATA_TYPE_STRING:
1905 variant = *static_cast<String*>(pTransformedObject);
1908 case DATA_BINDING_DATA_TYPE_FLOAT_POINT:
1909 variant = *static_cast<FloatPoint*>(pTransformedObject);
1912 case DATA_BINDING_DATA_TYPE_FLOAT_RECTANGLE:
1913 variant = *static_cast<FloatRectangle*>(pTransformedObject);
1916 case DATA_BINDING_DATA_TYPE_FLOAT_DIMENSION:
1917 variant = *static_cast<FloatDimension*>(pTransformedObject);
1922 pControl->SetProperty(__propertyName, variant);
1923 if (__pListener != null)
1925 __pListener->OnDataBindingTargetUpdated(__bindingId, pControl->GetName(), __propertyName);
1931 delete pOriginObject;
1932 delete pTransformedObject;
1936 _DataBinding::SetDataBindingListener(const IDataBindingListener* pListener)
1938 __pListener = const_cast<IDataBindingListener*>(pListener);
1942 _DataBinding::Get_ControlHandle(void) const
1944 return __controlHandle;
1947 _DataBinding::GetPropertyName(void) const
1949 return __propertyName;
1952 _DataBinding::GetSourceDataType(void) const
1954 return __sourceType;
1957 _DataBinding::GetTargetDataType(void) const
1959 return __targetType;
1962 _DataBinding::GetDataFlow(void) const
1967 _DataBinding::GetTrigger(void) const