Changed indicator bg color.
[platform/framework/native/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 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 /**
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         , __pLazyDeletionItem(null)
55         , __usingFloatingPoint(false)
56 {
57 }
58
59 _ListViewItemProviderAdaptor::_ListViewItemProviderAdaptor(const IListViewItemProviderF& provider)
60         : __pListViewProvider(null)
61         , __pListViewProviderF(const_cast<IListViewItemProviderF*>(&provider))
62         , __pEventListener(null)
63         , __fontName(L"")
64         , __itemAverageHeight(0.0f)
65         , __itemLoadedCount(0)
66         , __countOfAllItems(0)
67         , __pItemNeedsLazyDeletion(null)
68         , __pLazyDeletionItem(null)
69         , __usingFloatingPoint(true)
70 {
71 }
72
73 _ListViewItemProviderAdaptor::~_ListViewItemProviderAdaptor(void)
74 {
75         __descriptionTextShowItem.clear();
76
77         SetItemLazyDeletion(null);
78 }
79
80 void
81 _ListViewItemProviderAdaptor::SetItemProvider(const IListViewItemProvider& provider)
82 {
83         __pListViewProvider = const_cast<IListViewItemProvider*>(&provider);
84         __pListViewProviderF = null;
85
86         __usingFloatingPoint = false;
87 }
88
89 void
90 _ListViewItemProviderAdaptor::SetItemProvider(const IListViewItemProviderF& provider)
91 {
92         __pListViewProvider = null;
93         __pListViewProviderF = const_cast<IListViewItemProviderF*>(&provider);
94
95         __usingFloatingPoint = true;
96 }
97
98 IListViewItemProvider*
99 _ListViewItemProviderAdaptor::GetItemProvider(void) const
100 {
101         return __pListViewProvider;
102 }
103
104 IListViewItemProviderF*
105 _ListViewItemProviderAdaptor::GetItemProviderF(void) const
106 {
107         return __pListViewProviderF;
108 }
109
110 _IListItemCommon*
111 _ListViewItemProviderAdaptor::LoadItem(int groupIndex, int itemIndex)
112 {
113         SysTryReturn(NID_UI_CTRL, (groupIndex == 0), null, E_INVALID_ARG,
114                                 "[E_INVALID_ARG] parameter not available.");
115
116         _TableViewItem* pTableViewItem = null;
117         if (itemIndex == -1)
118         {
119                 pTableViewItem = GetDefaultItem();
120                 pTableViewItem->SetAppInfo(null);
121
122                 return pTableViewItem;
123         }
124
125         ListItemBase* pItemBase = null;
126         if (__usingFloatingPoint)
127         {
128                 pItemBase = __pListViewProviderF->CreateItem(itemIndex, GetListWidth());
129         }
130         else
131         {
132                 pItemBase = __pListViewProvider->CreateItem(itemIndex, _CoordinateSystemUtils::ConvertToInteger(GetListWidth()));
133         }
134
135         if (pItemBase == null)
136         {
137                 pTableViewItem = GetDefaultItem();
138                 pTableViewItem->SetAppInfo(null);
139
140                 return pTableViewItem;
141         }
142
143         _ListItemBaseImpl* pItemBaseImpl = _ListItemBaseImpl::GetInstance(*pItemBase);
144         SysAssert(pItemBaseImpl != null);
145
146         // add ListViewItem event listener
147         pItemBaseImpl->AddListViewItemEventListener(*__pEventListener);
148
149         _ListViewItem* pListViewItem = pItemBaseImpl->GetListViewItem();
150         SysAssert(pListViewItem != null);
151
152         pListViewItem->AddRef();
153         pListViewItem->SetAppInfo(pItemBase);
154         pListViewItem->SetItemStyle(static_cast<TableViewAnnexStyle>(pItemBaseImpl->GetListItemAnnexStyle()));
155         pListViewItem->SetItemWidth(GetListWidth());
156         pListViewItem->SetFont(__fontName);
157
158         if (IsDescriptionTextShown(itemIndex))
159         {
160                 pListViewItem->SetDescriptionTextShowState(true);
161         }
162
163         if (__itemLoadedCount < __countOfAllItems)
164         {
165                 __itemAverageHeight = (__itemAverageHeight * __itemLoadedCount + pListViewItem->GetItemHeight()) / (__itemLoadedCount + 1);
166                 __itemLoadedCount++;
167         }
168
169         return pListViewItem;
170 }
171
172 result
173 _ListViewItemProviderAdaptor::UnloadItem(_IListItemCommon* pListItem, int groupIndex, int itemIndex)
174 {
175         SysTryReturn(NID_UI_CTRL, pListItem != null, E_INVALID_ARG, E_INVALID_ARG,
176                                 "[E_INVALID_ARG]pListItem is invalid argument");
177
178         _ListViewItem* pListViewItem = static_cast<_ListViewItem*>(pListItem);
179         if (pListViewItem->GetParent() != null)
180         {
181                 pListViewItem->GetParent()->DetachChild(*pListViewItem);
182         }
183
184         // default item case
185         if (pListViewItem == GetDefaultItem())
186         {
187                 return E_SUCCESS;
188         }
189
190         if (pListViewItem == __pItemNeedsLazyDeletion)
191         {
192                 SetItemLazyDeletion(pListViewItem);
193         }
194
195         if (pListViewItem->Release() != 0)
196         {
197                 ListItemBase* pItemBase = static_cast<ListItemBase*>(pListViewItem->GetAppInfo());
198
199                 _ListItemBaseImpl* pItemBaseImpl = _ListItemBaseImpl::GetInstance(*pItemBase);
200                 SysAssert(pItemBaseImpl != null);
201
202                 // remove ListViewItem event listener
203                 pItemBaseImpl->RemoveListViewItemEventListener(*__pEventListener);
204
205                 if (__usingFloatingPoint)
206                 {
207                         if (!__pListViewProviderF->DeleteItem(itemIndex, pItemBase, GetListWidth()))
208                         {
209                                 delete pItemBase;
210                         }
211                 }
212                 else
213                 {
214                         if (!__pListViewProvider->DeleteItem(itemIndex, pItemBase, _CoordinateSystemUtils::ConvertToInteger(GetListWidth())))
215                         {
216                                 delete pItemBase;
217                         }
218                 }
219         }
220
221         return E_SUCCESS;
222 }
223
224 result
225 _ListViewItemProviderAdaptor::DeleteItem(_IListItemCommon* pListItem, int groupIndex, int itemIndex)
226 {
227         SysTryReturn(NID_UI_CTRL, pListItem != null, E_INVALID_ARG, E_INVALID_ARG,
228                                 "[E_INVALID_ARG] pListItem is invalid argument.");
229
230         _ListViewItem* pListViewItem = static_cast<_ListViewItem*>(pListItem);
231         if (pListViewItem->GetParent() != null)
232         {
233                 pListViewItem->GetParent()->DetachChild(*pListViewItem);
234         }
235
236         // default item case
237         if (pListViewItem == GetDefaultItem())
238         {
239                 return E_SUCCESS;
240         }
241
242         if (pListViewItem == __pItemNeedsLazyDeletion)
243         {
244                 SetItemLazyDeletion(pListViewItem);
245         }
246
247         if (pListViewItem->Release() != 0)
248         {
249                 ListItemBase* pItemBase = static_cast<ListItemBase*>(pListViewItem->GetAppInfo());
250                 delete pItemBase;
251         }
252
253         return E_SUCCESS;
254 }
255
256 bool
257 _ListViewItemProviderAdaptor::UpdateItem(_IListItemCommon* pItem, int groupIndex, int itemIndex)
258 {
259         _ListViewItem* pListViewItem = static_cast<_ListViewItem*>(pItem);
260
261         if (pListViewItem != null)
262         {
263                 pListViewItem->SetDescriptionTextShowState(IsDescriptionTextShown(itemIndex));
264         }
265
266         return true;
267 }
268
269 int
270 _ListViewItemProviderAdaptor::GetItemCount(int groupIndex) const
271 {
272         _ListViewItemProviderAdaptor* pItemProviderAdaptor = const_cast<_ListViewItemProviderAdaptor*>(this);
273
274         if (__usingFloatingPoint)
275         {
276                 pItemProviderAdaptor->__countOfAllItems = __pListViewProviderF->GetItemCount();
277         }
278         else
279         {
280                 pItemProviderAdaptor->__countOfAllItems = __pListViewProvider->GetItemCount();
281         }
282
283         return __countOfAllItems;
284 }
285
286 int
287 _ListViewItemProviderAdaptor::GetGroupCount(void) const
288 {
289         return 1;
290 }
291
292 float
293 _ListViewItemProviderAdaptor::GetDefaultItemHeight(void)
294 {
295         return __itemAverageHeight;
296 }
297
298 float
299 _ListViewItemProviderAdaptor::GetDefaultGroupItemHeight(void)
300 {
301         return 0.0f;
302 }
303
304 bool
305 _ListViewItemProviderAdaptor::SetDescriptionTextShowState(int itemIndex, bool show)
306 {
307         int index = -1;
308         _LinkedList <short>::_Iterator theIter = __descriptionTextShowItem.begin();
309
310         while (theIter != __descriptionTextShowItem.end())
311         {
312                 index = (int) (*theIter);
313
314                 if (index == itemIndex)
315                 {
316                         if (show == false)
317                         {
318                                 __descriptionTextShowItem.erase(theIter);
319                         }
320
321                         return true;
322                 }
323                 else if (index > itemIndex)
324                 {
325                         if (show == true)
326                         {
327                                 __descriptionTextShowItem.insert(theIter, itemIndex);
328                         }
329
330                         return true;
331                 }
332
333                 theIter++;
334         }
335
336         if (show == true)
337         {
338                 __descriptionTextShowItem.push_back(itemIndex);
339         }
340
341         return true;
342 }
343
344 bool
345 _ListViewItemProviderAdaptor::IsDescriptionTextShown(int itemIndex) const
346 {
347         int index = -1;
348         _LinkedList <short>::_Iterator theIter = __descriptionTextShowItem.begin();
349
350         while (theIter != __descriptionTextShowItem.end())
351         {
352                 index = (int) (*theIter);
353
354                 if (index == itemIndex)
355                 {
356                         return true;
357                 }
358                 else if (index > itemIndex)
359                 {
360                         return false;
361
362                 }
363
364                 theIter++;
365         }
366
367         return false;
368 }
369
370 void
371 _ListViewItemProviderAdaptor::SetListViewItemEventListener(_IUiListViewItemEventListener& listener)
372 {
373         __pEventListener = &listener;
374 }
375
376 void
377 _ListViewItemProviderAdaptor::SetItemFont(const String& fontName)
378 {
379         __fontName = fontName;
380 }
381
382 void
383 _ListViewItemProviderAdaptor::SetItemNeedsLazyDeletion(_ListViewItem* pItem)
384 {
385         __pItemNeedsLazyDeletion = pItem;
386 }
387
388 void
389 _ListViewItemProviderAdaptor::SetItemLazyDeletion(_ListViewItem* pItem)
390 {
391         if (__pLazyDeletionItem != pItem)
392         {
393                 if (__pLazyDeletionItem != null)
394                 {
395                         __pLazyDeletionItem->Release();
396                 }
397                 if (pItem != null)
398                 {
399                         pItem->AddRef();
400                 }
401
402                 __pLazyDeletionItem = pItem;
403         }
404 }
405
406 }}} // Tizen::Ui::Controls