Revert " modify license, permission and remove ^M char"
[framework/osp/uifw.git] / src / ui / controls / FUiCtrl_ListViewItemProviderAdaptor.cpp
1 //
2 // Open Service Platform
3 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
4 //
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
8 //
9 //     http://floralicense.org/license/
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 /**
19  * @file        FUiCtrl_ListViewItemProviderAdaptor.cpp
20  * @brief       This is the implementation file for _ListViewItemProviderAdaptor class.
21  *
22  * This file contains the implementation of _ListViewItemProviderAdaptor class.
23  */
24
25 #include <FUiCtrlListItemBase.h>
26 #include "FUi_CoordinateSystemUtils.h"
27 #include "FUi_ResourceManager.h"
28 #include "FUiCtrl_IListItemCommon.h"
29 #include "FUiCtrl_ListItemBaseImpl.h"
30 #include "FUiCtrl_ListViewContextItem.h"
31 #include "FUiCtrl_ListViewImpl.h"
32 #include "FUiCtrl_ListViewItem.h"
33 #include "FUiCtrl_ListViewItemProviderAdaptor.h"
34
35 #ifdef MEMORY_LEAK_CHECK
36 #include "mem_leak_check.h"
37 #endif
38
39 using namespace Tizen::Graphics;
40 using namespace Tizen::Base;
41
42 namespace Tizen { namespace Ui { namespace Controls
43 {
44
45 _ListViewItemProviderAdaptor::_ListViewItemProviderAdaptor(const IListViewItemProvider& provider)
46         : __pListViewProvider(const_cast<IListViewItemProvider*>(&provider))
47         , __pListViewProviderF(null)
48         , __pEventListener(null)
49         , __fontName(L"")
50         , __itemAverageHeight(0.0f)
51         , __itemLoadedCount(0)
52         , __countOfAllItems(0)
53         , __pItemNeedsLazyDeletion(null)
54         , __usingFloatingPoint(false)
55 {
56 }
57
58 _ListViewItemProviderAdaptor::_ListViewItemProviderAdaptor(const IListViewItemProviderF& provider)
59         : __pListViewProvider(null)
60         , __pListViewProviderF(const_cast<IListViewItemProviderF*>(&provider))
61         , __pEventListener(null)
62         , __fontName(L"")
63         , __itemAverageHeight(0.0f)
64         , __itemLoadedCount(0)
65         , __countOfAllItems(0)
66         , __pItemNeedsLazyDeletion(null)
67         , __usingFloatingPoint(true)
68 {
69 }
70
71 _ListViewItemProviderAdaptor::~_ListViewItemProviderAdaptor(void)
72 {
73         __descriptionTextShowItem.clear();
74
75         SetItemNeedsLazyDeletion(null);
76 }
77
78 void
79 _ListViewItemProviderAdaptor::SetItemProvider(const IListViewItemProvider& provider)
80 {
81         __pListViewProvider = const_cast<IListViewItemProvider*>(&provider);
82         __pListViewProviderF = null;
83
84         __usingFloatingPoint = false;
85 }
86
87 void
88 _ListViewItemProviderAdaptor::SetItemProvider(const IListViewItemProviderF& provider)
89 {
90         __pListViewProvider = null;
91         __pListViewProviderF = const_cast<IListViewItemProviderF*>(&provider);
92
93         __usingFloatingPoint = true;
94 }
95
96 _IListItemCommon*
97 _ListViewItemProviderAdaptor::LoadItem(int groupIndex, int itemIndex)
98 {
99         SysTryReturn(NID_UI_CTRL, (groupIndex == 0), null, E_INVALID_ARG,
100                                 "[E_INVALID_ARG] parameter not available.");
101
102         _TableViewItem* pTableViewItem = null;
103         if (itemIndex == -1)
104         {
105                 pTableViewItem = GetDefaultItem();
106                 pTableViewItem->SetAppInfo(null);
107
108                 return pTableViewItem;
109         }
110
111         ListItemBase* pItemBase = null;
112         if (__usingFloatingPoint)
113         {
114                 pItemBase = __pListViewProviderF->CreateItem(itemIndex, GetListWidth());
115         }
116         else
117         {
118                 pItemBase = __pListViewProvider->CreateItem(itemIndex, _CoordinateSystemUtils::ConvertToInteger(GetListWidth()));
119         }
120
121         if (pItemBase == null)
122         {
123                 pTableViewItem = GetDefaultItem();
124                 pTableViewItem->SetAppInfo(null);
125
126                 return pTableViewItem;
127         }
128
129         _ListItemBaseImpl* pItemBaseImpl = _ListItemBaseImpl::GetInstance(*pItemBase);
130         SysAssert(pItemBaseImpl != null);
131
132         // add ListViewItem event listener
133         pItemBaseImpl->AddListViewItemEventListener(*__pEventListener);
134
135         _ListViewItem* pListViewItem = pItemBaseImpl->GetListViewItem();
136         SysAssert(pListViewItem != null);
137
138         pListViewItem->SetFont(__fontName);
139         pListViewItem->AddRef();
140         pListViewItem->SetAppInfo(pItemBase);
141         pListViewItem->SetItemStyle(static_cast<TableViewAnnexStyle>(pItemBaseImpl->GetListItemAnnexStyle()));
142         pListViewItem->SetItemWidth(GetListWidth());
143
144         if (IsDescriptionTextShown(itemIndex))
145         {
146                 pListViewItem->SetDescriptionTextShowState(true);
147         }
148
149         if (__itemLoadedCount < __countOfAllItems)
150         {
151                 __itemAverageHeight = (__itemAverageHeight * __itemLoadedCount + pListViewItem->GetItemHeight()) / (__itemLoadedCount + 1);
152                 __itemLoadedCount++;
153         }
154
155         return pListViewItem;
156 }
157
158 result
159 _ListViewItemProviderAdaptor::UnloadItem(_IListItemCommon* pListItem, int groupIndex, int itemIndex)
160 {
161         SysTryReturn(NID_UI_CTRL, pListItem != null, E_INVALID_ARG, E_INVALID_ARG,
162                                 "[E_INVALID_ARG]pListItem is invalid argument");
163
164         _ListViewItem* pListViewItem = static_cast<_ListViewItem*>(pListItem);
165         if (pListViewItem->GetParent() != null)
166         {
167                 pListViewItem->GetParent()->DetachChild(*pListViewItem);
168         }
169
170         // default item case
171         if (pListViewItem == GetDefaultItem())
172         {
173                 return E_SUCCESS;
174         }
175
176         if (pListViewItem == __pItemNeedsLazyDeletion)
177         {
178                 pListViewItem->AddRef();
179         }
180
181         if (pListViewItem->Release() != 0)
182         {
183                 ListItemBase* pItemBase = static_cast<ListItemBase*>(pListViewItem->GetAppInfo());
184
185                 _ListItemBaseImpl* pItemBaseImpl = _ListItemBaseImpl::GetInstance(*pItemBase);
186                 SysAssert(pItemBaseImpl != null);
187
188                 // remove ListViewItem event listener
189                 pItemBaseImpl->RemoveListViewItemEventListener(*__pEventListener);
190
191                 if (__usingFloatingPoint)
192                 {
193                         if (!__pListViewProviderF->DeleteItem(itemIndex, pItemBase, GetListWidth()))
194                         {
195                                 delete pItemBase;
196                         }
197                 }
198                 else
199                 {
200                         if (!__pListViewProvider->DeleteItem(itemIndex, pItemBase, _CoordinateSystemUtils::ConvertToInteger(GetListWidth())))
201                         {
202                                 delete pItemBase;
203                         }
204
205                 }
206         }
207
208         return E_SUCCESS;
209 }
210
211 result
212 _ListViewItemProviderAdaptor::DeleteItem(_IListItemCommon* pListItem, int groupIndex, int itemIndex)
213 {
214         SysTryReturn(NID_UI_CTRL, pListItem != null, E_INVALID_ARG, E_INVALID_ARG,
215                                 "[E_INVALID_ARG] pListItem is invalid argument.");
216
217         _ListViewItem* pListViewItem = static_cast<_ListViewItem*>(pListItem);
218         if (pListViewItem->GetParent() != null)
219         {
220                 pListViewItem->GetParent()->DetachChild(*pListViewItem);
221         }
222
223         // default item case
224         if (pListViewItem == GetDefaultItem())
225         {
226                 return E_SUCCESS;
227         }
228
229         if (pListViewItem == __pItemNeedsLazyDeletion)
230         {
231                 pListViewItem->AddRef();
232         }
233
234         if (pListViewItem->Release() != 0)
235         {
236                 ListItemBase* pItemBase = static_cast<ListItemBase*>(pListViewItem->GetAppInfo());
237                 delete pItemBase;
238         }
239
240         return E_SUCCESS;
241 }
242
243 bool
244 _ListViewItemProviderAdaptor::UpdateItem(_IListItemCommon* pItem, int groupIndex, int itemIndex)
245 {
246         _ListViewItem* pListViewItem = static_cast<_ListViewItem*>(pItem);
247
248         if (pListViewItem != null)
249         {
250                 pListViewItem->SetDescriptionTextShowState(IsDescriptionTextShown(itemIndex));
251         }
252
253         return true;
254 }
255
256 int
257 _ListViewItemProviderAdaptor::GetItemCount(int groupIndex) const
258 {
259         _ListViewItemProviderAdaptor* pItemProviderAdaptor = const_cast<_ListViewItemProviderAdaptor*>(this);
260
261         if (__usingFloatingPoint)
262         {
263                 pItemProviderAdaptor->__countOfAllItems = __pListViewProviderF->GetItemCount();
264         }
265         else
266         {
267                 pItemProviderAdaptor->__countOfAllItems = __pListViewProvider->GetItemCount();
268         }
269
270         return __countOfAllItems;
271 }
272
273 int
274 _ListViewItemProviderAdaptor::GetGroupCount(void) const
275 {
276         return 1;
277 }
278
279 float
280 _ListViewItemProviderAdaptor::GetDefaultItemHeight(void)
281 {
282         return __itemAverageHeight;
283 }
284
285 float
286 _ListViewItemProviderAdaptor::GetDefaultGroupItemHeight(void)
287 {
288         return 0.0f;
289 }
290
291 bool
292 _ListViewItemProviderAdaptor::SetDescriptionTextShowState(int itemIndex, bool show)
293 {
294         int index = -1;
295         _LinkedList <short>::_Iterator theIter = __descriptionTextShowItem.begin();
296
297         while (theIter != __descriptionTextShowItem.end())
298         {
299                 index = (int) (*theIter);
300
301                 if (index == itemIndex)
302                 {
303                         if (show == false)
304                         {
305                                 __descriptionTextShowItem.erase(theIter);
306                         }
307
308                         return true;
309                 }
310                 else if (index > itemIndex)
311                 {
312                         if (show == true)
313                         {
314                                 __descriptionTextShowItem.insert(theIter, itemIndex);
315                         }
316
317                         return true;
318                 }
319
320                 theIter++;
321         }
322
323         if (show == true)
324         {
325                 __descriptionTextShowItem.push_back(itemIndex);
326         }
327
328         return true;
329 }
330
331 bool
332 _ListViewItemProviderAdaptor::IsDescriptionTextShown(int itemIndex) const
333 {
334         int index = -1;
335         _LinkedList <short>::_Iterator theIter = __descriptionTextShowItem.begin();
336
337         while (theIter != __descriptionTextShowItem.end())
338         {
339                 index = (int) (*theIter);
340
341                 if (index == itemIndex)
342                 {
343                         return true;
344                 }
345                 else if (index > itemIndex)
346                 {
347                         return false;
348
349                 }
350
351                 theIter++;
352         }
353
354         return false;
355 }
356
357 void
358 _ListViewItemProviderAdaptor::SetListViewItemEventListener(_IUiListViewItemEventListener& listener)
359 {
360         __pEventListener = &listener;
361 }
362
363 void
364 _ListViewItemProviderAdaptor::SetItemFont(const String& fontName)
365 {
366         __fontName = fontName;
367 }
368
369 void
370 _ListViewItemProviderAdaptor::SetItemNeedsLazyDeletion(_ListViewItem* pItem)
371 {
372         if (__pItemNeedsLazyDeletion != pItem)
373         {
374                 if (__pItemNeedsLazyDeletion != null)
375                 {
376                         __pItemNeedsLazyDeletion->Release();
377                 }
378
379                 __pItemNeedsLazyDeletion = pItem;
380         }
381 }
382
383 }}} // Tizen::Ui::Controls