Tizen 2.1 base
[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_ResourceManager.h"
27 #include "FUiCtrl_IListItemCommon.h"
28 #include "FUiCtrl_ListItemBaseImpl.h"
29 #include "FUiCtrl_ListViewContextItem.h"
30 #include "FUiCtrl_ListViewImpl.h"
31 #include "FUiCtrl_ListViewItem.h"
32 #include "FUiCtrl_ListViewItemProviderAdaptor.h"
33
34 #ifdef MEMORY_LEAK_CHECK
35 #include "mem_leak_check.h"
36 #endif
37
38 using namespace Tizen::Graphics;
39 using namespace Tizen::Base;
40
41 namespace Tizen { namespace Ui { namespace Controls
42 {
43
44 _ListViewItemProviderAdaptor::_ListViewItemProviderAdaptor(const IListViewItemProvider& provider)
45         : __pListViewProvider(const_cast<IListViewItemProvider*>(&provider))
46         , __pEventListener(null)
47         , __fontName(L"")
48         , __itemAverageHeight(0)
49         , __itemLoadedCount(0)
50         , __countOfAllItems(0)
51         , __pItemNeedsLazyDeletion(null)
52 {
53 }
54
55 _ListViewItemProviderAdaptor::~_ListViewItemProviderAdaptor(void)
56 {
57         __descriptionTextShowItem.clear();
58
59         SetItemNeedsLazyDeletion(null);
60 }
61
62 void
63 _ListViewItemProviderAdaptor::SetItemProvider(const IListViewItemProvider& provider)
64 {
65         __pListViewProvider = const_cast<IListViewItemProvider*>(&provider);
66 }
67
68 _IListItemCommon*
69 _ListViewItemProviderAdaptor::LoadItem(int groupIndex, int itemIndex)
70 {
71         SysTryReturn(NID_UI_CTRL, (groupIndex == 0), null, E_INVALID_ARG,
72                                 "[E_INVALID_ARG] parameter not available.");
73
74         _TableViewItem* pTableViewItem = null;
75         if (itemIndex == -1)
76         {
77                 pTableViewItem = GetDefaultItem();
78                 pTableViewItem->SetAppInfo(null);
79
80                 return pTableViewItem;
81         }
82
83         ListItemBase* pItemBase = __pListViewProvider->CreateItem(itemIndex, GetListWidth());
84
85         if (pItemBase == null)
86         {
87                 pTableViewItem = GetDefaultItem();
88                 pTableViewItem->SetAppInfo(null);
89
90                 return pTableViewItem;
91         }
92
93         _ListItemBaseImpl* pItemBaseImpl = _ListItemBaseImpl::GetInstance(*pItemBase);
94         SysAssert(pItemBaseImpl != null);
95
96         // add ListViewItem event listener
97         pItemBaseImpl->AddListViewItemEventListener(*__pEventListener);
98
99         _ListViewItem* pListViewItem = pItemBaseImpl->GetListViewItem();
100         SysAssert(pListViewItem != null);
101
102         pListViewItem->SetFont(__fontName);
103         pListViewItem->AddRef();
104         pListViewItem->SetAppInfo(pItemBase);
105         pListViewItem->SetItemStyle(static_cast<TableViewAnnexStyle>(pItemBaseImpl->GetListItemAnnexStyle()));
106         pListViewItem->SetItemWidth(GetListWidth());
107
108         if (IsDescriptionTextShown(itemIndex) == true)
109         {
110                 pListViewItem->SetDescriptionTextShowState(true);
111         }
112
113         if (__itemLoadedCount < __countOfAllItems)
114         {
115                 __itemAverageHeight = (__itemAverageHeight * __itemLoadedCount + pListViewItem->GetItemHeight()) / (__itemLoadedCount + 1);
116                 __itemLoadedCount++;
117         }
118
119         return pListViewItem;
120 }
121
122 result
123 _ListViewItemProviderAdaptor::UnloadItem(_IListItemCommon* pListItem, int groupIndex, int itemIndex)
124 {
125         SysTryReturn(NID_UI_CTRL, pListItem != null, E_INVALID_ARG, E_INVALID_ARG,
126                                 "[E_INVALID_ARG]pListItem is invalid argument");
127
128         _ListViewItem* pListViewItem = static_cast<_ListViewItem*>(pListItem);
129         if (pListViewItem->GetParent() != null)
130         {
131                 pListViewItem->GetParent()->DetachChild(*pListViewItem);
132         }
133
134         // default item case
135         if (pListViewItem == GetDefaultItem())
136         {
137                 return E_SUCCESS;
138         }
139
140         if (pListViewItem == __pItemNeedsLazyDeletion)
141         {
142                 pListViewItem->AddRef();
143         }
144
145         if (pListViewItem->Release() != 0)
146         {
147                 ListItemBase* pItemBase = static_cast<ListItemBase*>(pListViewItem->GetAppInfo());
148
149                 _ListItemBaseImpl* pItemBaseImpl = _ListItemBaseImpl::GetInstance(*pItemBase);
150                 SysAssert(pItemBaseImpl != null);
151
152                 // add ListViewItem event listener
153                 //pItemBaseImpl->RemoveListViewItemEventListener(*__pEventListener);
154
155                 if (__pListViewProvider->DeleteItem(itemIndex, pItemBase, GetListWidth()) == false)
156                 {
157                         delete pItemBase;
158                 }
159         }
160
161         return E_SUCCESS;
162 }
163
164 result
165 _ListViewItemProviderAdaptor::DeleteItem(_IListItemCommon* pListItem, int groupIndex, int itemIndex)
166 {
167         SysTryReturn(NID_UI_CTRL, pListItem != null, E_INVALID_ARG, E_INVALID_ARG,
168                                 "[E_INVALID_ARG] pListItem is invalid argument.");
169
170         _ListViewItem* pListViewItem = static_cast<_ListViewItem*>(pListItem);
171         if (pListViewItem->GetParent() != null)
172         {
173                 pListViewItem->GetParent()->DetachChild(*pListViewItem);
174         }
175
176         // default item case
177         if (pListViewItem == GetDefaultItem())
178         {
179                 return E_SUCCESS;
180         }
181
182         if (pListViewItem == __pItemNeedsLazyDeletion)
183         {
184                 pListViewItem->AddRef();
185         }
186
187         if (pListViewItem->Release() != 0)
188         {
189                 ListItemBase* pItemBase = static_cast<ListItemBase*>(pListViewItem->GetAppInfo());
190                 delete pItemBase;
191         }
192
193         return E_SUCCESS;
194 }
195
196 bool
197 _ListViewItemProviderAdaptor::UpdateItem(_IListItemCommon* pItem, int groupIndex, int itemIndex)
198 {
199         _ListViewItem* pListViewItem = static_cast<_ListViewItem*>(pItem);
200
201         if (pListViewItem != null)
202         {
203                 pListViewItem->SetDescriptionTextShowState(IsDescriptionTextShown(itemIndex));
204         }
205
206         return true;
207 }
208
209 int
210 _ListViewItemProviderAdaptor::GetItemCount(int groupIndex) const
211 {
212         _ListViewItemProviderAdaptor* pItemProviderAdaptor = const_cast<_ListViewItemProviderAdaptor*>(this);
213
214         pItemProviderAdaptor->__countOfAllItems = __pListViewProvider->GetItemCount();
215
216         return __countOfAllItems;
217 }
218
219 int
220 _ListViewItemProviderAdaptor::GetGroupCount(void) const
221 {
222         return 1;
223 }
224
225 int
226 _ListViewItemProviderAdaptor::GetDefaultItemHeight(void)
227 {
228         return __itemAverageHeight;
229 }
230
231 int
232 _ListViewItemProviderAdaptor::GetDefaultGroupItemHeight(void)
233 {
234         return 0;
235 }
236
237 bool
238 _ListViewItemProviderAdaptor::SetDescriptionTextShowState(int itemIndex, bool show)
239 {
240         int index = -1;
241         _LinkedList <short>::_Iterator theIter = __descriptionTextShowItem.begin();
242
243         while (theIter != __descriptionTextShowItem.end())
244         {
245                 index = (int) (*theIter);
246
247                 if (index == itemIndex)
248                 {
249                         if (show == false)
250                         {
251                                 __descriptionTextShowItem.erase(theIter);
252                         }
253
254                         return true;
255                 }
256                 else if (index > itemIndex)
257                 {
258                         if (show == true)
259                         {
260                                 __descriptionTextShowItem.insert(theIter, itemIndex);
261                         }
262
263                         return true;
264                 }
265
266                 theIter++;
267         }
268
269         if (show == true)
270         {
271                 __descriptionTextShowItem.push_back(itemIndex);
272         }
273
274         return true;
275 }
276
277 bool
278 _ListViewItemProviderAdaptor::IsDescriptionTextShown(int itemIndex) const
279 {
280         int index = -1;
281         _LinkedList <short>::_Iterator theIter = __descriptionTextShowItem.begin();
282
283         while (theIter != __descriptionTextShowItem.end())
284         {
285                 index = (int) (*theIter);
286
287                 if (index == itemIndex)
288                 {
289                         return true;
290                 }
291                 else if (index > itemIndex)
292                 {
293                         return false;
294
295                 }
296
297                 theIter++;
298         }
299
300         return false;
301 }
302
303 void
304 _ListViewItemProviderAdaptor::SetListViewItemEventListener(_IUiListViewItemEventListener& listener)
305 {
306         __pEventListener = &listener;
307 }
308
309 void
310 _ListViewItemProviderAdaptor::SetItemFont(const String& fontName)
311 {
312         __fontName = fontName;
313 }
314
315 void
316 _ListViewItemProviderAdaptor::SetItemNeedsLazyDeletion(_ListViewItem* pItem)
317 {
318         if (__pItemNeedsLazyDeletion != pItem)
319         {
320                 if (__pItemNeedsLazyDeletion != null)
321                 {
322                         __pItemNeedsLazyDeletion->Release();
323                 }
324
325                 __pItemNeedsLazyDeletion = pItem;
326         }
327 }
328
329 }}} // Tizen::Ui::Controls