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_DataBindingContext.cpp
19 * @brief This is the implementation for the _DataBindingContext class.
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"
30 using namespace Tizen::Base;
31 using namespace Tizen::Base::Collection;
34 class _DataBindingHashCodeProvider
35 : public IHashCodeProviderT <String>
38 _DataBindingHashCodeProvider(void) {}
39 virtual ~_DataBindingHashCodeProvider(void) {}
41 virtual int GetHashCode(const String& obj) const
43 return obj.GetHashCode();
47 class _DataBindingComparer
48 : public IComparerT <String>
51 _DataBindingComparer(void) {}
52 virtual ~_DataBindingComparer(void) {}
53 virtual result Compare(const String& obj1, const String& obj2, int& cmp) const
69 namespace Tizen { namespace Ui
72 _DataBindingContext::_DataBindingContext(const _Control& control)
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.");
83 __pComparer = new _DataBindingComparer;
84 SysTryReturnVoidResult(NID_UI, __pComparer, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation for _DataBinding is failed.");
86 r = __map.Construct(0, 0.0, *__pProvider, *__pComparer);
90 _DataBindingContext::~_DataBindingContext(void)
101 _DataBindingContext::GetContextOwner(void) const
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)
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.",
122 result r = E_SUCCESS;
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.");
127 r = pDataBinding->Construct(control, bindingId, propertyName, dataSource, sourceType, flow, trigger, pListener, pValidator,
129 SysTryCatch(NID_UI, r == E_SUCCESS, r = E_SYSTEM, r, "[E_SYSTEM] adding data binding is failed.");
131 r = __map.Add(bindingId, pDataBinding);
132 SysTryCatch(NID_UI, r == E_SUCCESS, r = E_SYSTEM, r, "[E_SYSTEM] adding data binding is failed.");
142 _DataBindingContext::SetDataBindingEventListener(const String& bindingId, const IDataBindingListener* pListener)
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.");
149 return pDataBinding->SetDataBindingListener(pListener);
152 _DataBindingContext::UnbindAll(void)
154 result r = E_SUCCESS;
155 MapEntryT <String, _DataBinding*> currentEntry;
156 IEnumeratorT <MapEntryT <String, _DataBinding*> >* pMapEnumerator = __map.GetMapEnumeratorN();
158 SysTryReturn(NID_UI, pMapEnumerator, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Getting enumerator is failed.");
160 while ((pMapEnumerator->MoveNext() == E_SUCCESS))
162 r = pMapEnumerator->GetCurrent(currentEntry);
163 SysTryCatch(NID_UI, r == E_SUCCESS, r = E_SYSTEM, r, "[E_SYSTEM] removing data binding is failed.");
165 _DataBinding* pBinding = currentEntry.GetValue();
166 SysTryCatch(NID_UI, pBinding, r = E_SYSTEM, r, "[E_SYSTEM] UpdateAllBindings is failed.");
169 delete pMapEnumerator;
173 delete pMapEnumerator;
177 _DataBindingContext::Unbind(const String& bindingId)
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.");
184 __map.Remove(const_cast<String&>(bindingId));
188 _DataBindingContext::UpdateAllBindings(DataBindingDestinationType destinationType)
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;
195 while (pMapEnumerator->MoveNext() == E_SUCCESS)
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)))
208 r = pBinding->Update(destinationType);
209 SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "[%s] System Error", GetErrorMessage(r));
212 delete pMapEnumerator;
215 delete pMapEnumerator;
219 _DataBindingContext::UpdateBinding(const String& bindingId, DataBindingDestinationType destinationType)
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.");
235 r = pDataBinding->Update(destinationType);
236 SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "[%s] binding update is failed.", GetErrorMessage(r));