modify license, permission and remove ^M char
[platform/framework/native/uifw.git] / src / ui / FUi_DataBindingContext.cpp
1 //
2 // Open Service Platform
3 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
4 //
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
8 //
9 //     http://www.apache.org/licenses/LICENSE-2.0/
10 //
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.
16 //
17 /**
18  * @file        FUi_DataBindingContext.cpp
19  * @brief       This is the implementation for the _DataBindingContext class.
20  */
21
22 #include <FBaseString.h>
23 #include <FUiIDataBindingListener.h>
24 #include <FUiIDataBindingDataTransformer.h>
25 #include <FUiIDataBindingDataValidator.h>
26 #include "FUi_Control.h"
27 #include "FUi_DataBindingContext.h"
28 #include "FUi_DataBinding.h"
29
30 using namespace Tizen::Base;
31 using namespace Tizen::Base::Collection;
32
33 namespace {
34 class _DataBindingHashCodeProvider
35         : public IHashCodeProviderT <String>
36 {
37 public:
38         _DataBindingHashCodeProvider(void) {}
39         virtual ~_DataBindingHashCodeProvider(void) {}
40
41         virtual int GetHashCode(const String& obj) const
42         {
43                 return obj.GetHashCode();
44         }
45 };
46
47 class _DataBindingComparer
48         : public IComparerT <String>
49 {
50 public:
51         _DataBindingComparer(void) {}
52         virtual ~_DataBindingComparer(void) {}
53         virtual result Compare(const String& obj1, const String& obj2, int& cmp) const
54         {
55                 if (obj1 == obj2)
56                 {
57                         cmp = 0;
58                         return E_SUCCESS;
59                 }
60                 else
61                 {
62                         cmp = -1;
63                         return E_INVALID_ARG;
64                 }
65         }
66 };
67 }
68
69 namespace Tizen { namespace Ui
70 {
71
72 _DataBindingContext::_DataBindingContext(const _Control& control)
73         : __pControl(null)
74         , __pProvider(null)
75         , __pComparer(null)
76         , __map()
77 {
78         result r = E_SYSTEM;
79         __pControl = const_cast <_Control*>(&control);
80         __pProvider = new _DataBindingHashCodeProvider;
81         SysTryReturnVoidResult(NID_UI, __pProvider, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation for _DataBinding is failed.");
82
83         __pComparer = new _DataBindingComparer;
84         SysTryReturnVoidResult(NID_UI, __pComparer, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation for _DataBinding is failed.");
85
86         r = __map.Construct(0, 0.0, *__pProvider, *__pComparer);
87         SetLastResult(r);
88 }
89
90 _DataBindingContext::~_DataBindingContext(void)
91 {
92         UnbindAll();
93
94         delete __pProvider;
95         __pProvider = null;
96         delete __pComparer;
97         __pComparer = null;
98 }
99
100 _Control*
101 _DataBindingContext::GetContextOwner(void) const
102 {
103         return __pControl;
104 }
105 result
106 _DataBindingContext::Bind(_Control& control, const String& bindingId, const String& controlName,
107                                                                 const String& propertyName, Object& dataSource,
108                                                                 DataBindingDataType sourceType, DataBindingFlow flow,
109                                                                 DataBindingTrigger trigger, const IDataBindingListener* pListener,
110                                                                 const IDataBindingDataValidator* pValidator,
111                                                                 const IDataBindingDataTransformer* pTransformer)
112 {
113         SysTryReturn(NID_UI,
114                                 propertyName.GetLength() > 0, E_OBJ_NOT_FOUND, E_OBJ_NOT_FOUND,
115                                 "[E_OBJ_NOT_FOUND] propertyName is too short(=0).");
116         SysTryReturn(NID_UI, !((flow == DATA_BINDING_FLOW_ONE_WAY ||
117                                                                          flow == DATA_BINDING_FLOW_TWO_WAY) &&
118                                                                          trigger == DATA_BINDING_TRIGGER_IMMEDIATE),
119                 E_UNSUPPORTED_OPERATION, E_UNSUPPORTED_OPERATION, "[E_UNSUPPORTED_OPERATION] Flow %d and trigger %d is not supported.",
120                 flow, trigger);
121
122         result r = E_SUCCESS;
123
124         _DataBinding* pDataBinding = new (std::nothrow) _DataBinding;
125         SysTryReturn(NID_UI, pDataBinding, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation for _DataBinding is failed.");
126
127         r = pDataBinding->Construct(control, bindingId, propertyName, dataSource, sourceType, flow, trigger, pListener, pValidator,
128                                                                 pTransformer);
129         SysTryCatch(NID_UI, r == E_SUCCESS, r = E_SYSTEM, r, "[E_SYSTEM] adding data binding is failed.");
130
131         r = __map.Add(bindingId, pDataBinding);
132         SysTryCatch(NID_UI, r == E_SUCCESS, r = E_SYSTEM, r, "[E_SYSTEM] adding data binding is failed.");
133
134         return E_SUCCESS;
135
136 CATCH:
137         delete pDataBinding;
138         return r;
139
140 }
141 result
142 _DataBindingContext::SetDataBindingEventListener(const String& bindingId, const IDataBindingListener* pListener)
143 {
144         result r = E_SUCCESS;
145         _DataBinding* pDataBinding = null;
146         r = __map.GetValue(const_cast<String&>(bindingId), pDataBinding);
147         SysTryReturn(NID_UI, r == E_SUCCESS, E_OBJ_NOT_FOUND, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] The given binding ID is not registered.");
148
149         return pDataBinding->SetDataBindingListener(pListener);
150 }
151 result
152 _DataBindingContext::UnbindAll(void)
153 {
154         result r = E_SUCCESS;
155         MapEntryT <String, _DataBinding*> currentEntry;
156         IEnumeratorT <MapEntryT <String, _DataBinding*> >* pMapEnumerator = __map.GetMapEnumeratorN();
157
158         SysTryReturn(NID_UI, pMapEnumerator, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Getting enumerator is failed.");
159
160         while ((pMapEnumerator->MoveNext() == E_SUCCESS))
161         {
162                 r = pMapEnumerator->GetCurrent(currentEntry);
163                 SysTryCatch(NID_UI, r == E_SUCCESS, r = E_SYSTEM, r, "[E_SYSTEM] removing data binding is failed.");
164
165                 _DataBinding* pBinding = currentEntry.GetValue();
166                 SysTryCatch(NID_UI, pBinding, r = E_SYSTEM, r, "[E_SYSTEM] UpdateAllBindings is failed.");
167                 delete pBinding;
168         }
169         delete pMapEnumerator;
170         __map.RemoveAll();
171         return r;
172 CATCH:
173         delete pMapEnumerator;
174         return r;
175 }
176 result
177 _DataBindingContext::Unbind(const String& bindingId)
178 {
179         result r = E_SYSTEM;
180         _DataBinding* pDataBinding = null;
181         r = __map.GetValue(const_cast<String&>(bindingId), pDataBinding);
182         SysTryReturn(NID_UI, r == E_SUCCESS && pDataBinding, E_OBJ_NOT_FOUND, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] The given binding ID is not registered.");
183         delete pDataBinding;
184         __map.Remove(const_cast<String&>(bindingId));
185         return r;
186 }
187 result
188 _DataBindingContext::UpdateAllBindings(DataBindingDestinationType destinationType)
189 {
190         result r = E_SUCCESS;
191         IEnumeratorT <MapEntryT <String, _DataBinding*> >* pMapEnumerator = __map.GetMapEnumeratorN();
192         SysTryReturn(NID_UI, pMapEnumerator, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Getting enumerator is failed.");
193         MapEntryT <String, _DataBinding*> currentEntry;
194
195         while (pMapEnumerator->MoveNext() == E_SUCCESS)
196         {
197                 r = pMapEnumerator->GetCurrent(currentEntry);
198                 SysTryCatch(NID_UI, r == E_SUCCESS, r = E_SYSTEM, r, "[E_SYSTEM] UpdateAllBindings is failed.");
199                 _DataBinding* pBinding = currentEntry.GetValue();
200                 SysTryCatch(NID_UI, pBinding, r = E_SYSTEM, r, "[E_SYSTEM] UpdateAllBindings is failed.");
201                 DataBindingFlow flow = pBinding->GetDataFlow();
202                 if ((destinationType == DATA_BINDING_DESTINATION_TYPE_SOURCE &&
203                         ( flow == DATA_BINDING_FLOW_ONE_WAY_TO_SOURCE ||
204                                 flow == DATA_BINDING_FLOW_TWO_WAY)) ||
205                         (destinationType == DATA_BINDING_DESTINATION_TYPE_TARGET &&
206                         (flow == DATA_BINDING_FLOW_ONE_WAY || flow == DATA_BINDING_FLOW_TWO_WAY)))
207                 {
208                         r = pBinding->Update(destinationType);
209                         SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "[%s] System Error", GetErrorMessage(r));
210                 }
211         }
212         delete pMapEnumerator;
213         return r;
214 CATCH:
215         delete pMapEnumerator;
216         return r;
217 }
218 result
219 _DataBindingContext::UpdateBinding(const String& bindingId, DataBindingDestinationType destinationType)
220 {
221         result r = E_SUCCESS;
222         _DataBinding* pDataBinding = null;
223         r = __map.GetValue(const_cast<String&>(bindingId), pDataBinding);
224         SysTryReturn(NID_UI, r == E_SUCCESS, E_OBJ_NOT_FOUND, E_OBJ_NOT_FOUND,
225                                 "[E_OBJ_NOT_FOUND] The given binding ID is not registered.");
226         DataBindingFlow flow = pDataBinding->GetDataFlow();
227         DataBindingTrigger trigger = pDataBinding->GetTrigger();
228         SysTryReturn(NID_UI, trigger != DATA_BINDING_TRIGGER_IMMEDIATE, E_INVALID_OPERATION, E_INVALID_OPERATION,
229                                 "[E_INVALID_OPERATION] The given binding's trigger is not 'explicit' type.");
230         SysTryReturn(NID_UI, (flow == DATA_BINDING_FLOW_TWO_WAY) ||
231                 (flow == DATA_BINDING_FLOW_ONE_WAY && destinationType == DATA_BINDING_DESTINATION_TYPE_TARGET) ||
232                 (flow == DATA_BINDING_FLOW_ONE_WAY_TO_SOURCE && destinationType == DATA_BINDING_DESTINATION_TYPE_SOURCE), E_INVALID_ARG,
233                 E_INVALID_ARG, "[E_INVALID_ARG] destinationType is not supported in binding ID.");
234
235         r = pDataBinding->Update(destinationType);
236         SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "[%s] binding update is failed.", GetErrorMessage(r));
237
238         return r;
239 }
240
241 }}//Tizen::Ui