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.
19 * @file FUiCtrl_GroupedListViewItemProviderAdaptor.cpp
20 * @brief This is the implementation file for _GroupedListViewItemProviderAdaptor class.
22 * This file contains the implementation of _GroupedListViewItemProviderAdaptor class.
25 #include <FUiCtrlGroupItem.h>
26 #include <FUiCtrlListItemBase.h>
27 #include "FUi_CoordinateSystemUtils.h"
28 #include "FUi_ResourceManager.h"
29 #include "FUiCtrl_GroupedListViewItemProviderAdaptor.h"
30 #include "FUiCtrl_GroupItemImpl.h"
31 #include "FUiCtrl_IListItemCommon.h"
32 #include "FUiCtrl_ListItemBaseImpl.h"
33 #include "FUiCtrl_ListViewItem.h"
35 #ifdef MEMORY_LEAK_CHECK
36 #include "mem_leak_check.h"
39 using namespace Tizen::Base;
41 namespace Tizen { namespace Ui { namespace Controls
44 _GroupedListViewItemProviderAdaptor::_GroupedListViewItemProviderAdaptor(const IGroupedListViewItemProvider& provider)
45 : __pGroupedListViewProvider(const_cast<IGroupedListViewItemProvider*>(&provider))
46 , __pGroupedListViewProviderF(null)
47 , __pEventListener(null)
49 , __groupItemAverageHeight(0.0f)
50 , __itemAverageHeight(0.0f)
51 , __groupItemLoadedCount(0)
52 , __itemLoadedCount(0)
53 , __countOfAllGroups(0)
54 , __countOfAllItems(0)
55 , __pItemNeedsLazyDeletion(null)
56 , __pLazyDeletionItem(null)
57 , __usingFloatingPoint(false)
61 _GroupedListViewItemProviderAdaptor::_GroupedListViewItemProviderAdaptor(const IGroupedListViewItemProviderF& provider)
62 : __pGroupedListViewProvider(null)
63 , __pGroupedListViewProviderF(const_cast<IGroupedListViewItemProviderF*>(&provider))
64 , __pEventListener(null)
66 , __groupItemAverageHeight(0.0f)
67 , __itemAverageHeight(0.0f)
68 , __groupItemLoadedCount(0)
69 , __itemLoadedCount(0)
70 , __countOfAllGroups(0)
71 , __countOfAllItems(0)
72 , __pItemNeedsLazyDeletion(null)
73 , __pLazyDeletionItem(null)
74 , __usingFloatingPoint(true)
78 _GroupedListViewItemProviderAdaptor::~_GroupedListViewItemProviderAdaptor()
80 __descriptionTextShowItem.clear();
82 SetItemLazyDeletion(null);
86 _GroupedListViewItemProviderAdaptor::SetItemProvider(const IGroupedListViewItemProvider& provider)
88 __pGroupedListViewProvider = const_cast<IGroupedListViewItemProvider*>(&provider);
89 __pGroupedListViewProviderF = null;
91 __usingFloatingPoint = false;
95 _GroupedListViewItemProviderAdaptor::SetItemProvider(const IGroupedListViewItemProviderF& provider)
97 __pGroupedListViewProvider = null;
98 __pGroupedListViewProviderF = const_cast<IGroupedListViewItemProviderF*>(&provider);
100 __usingFloatingPoint = true;
103 IGroupedListViewItemProvider*
104 _GroupedListViewItemProviderAdaptor::GetItemProvider(void) const
106 return __pGroupedListViewProvider;
109 IGroupedListViewItemProviderF*
110 _GroupedListViewItemProviderAdaptor::GetItemProviderF(void) const
112 return __pGroupedListViewProviderF;
116 _GroupedListViewItemProviderAdaptor::LoadItem(int groupIndex, int itemIndex)
118 ListItemBase* pItemBase = null;
119 GroupItem* pGroupItem = null;
120 _TableViewItem* pTableViewItem = null;
124 if (__usingFloatingPoint)
126 pGroupItem = __pGroupedListViewProviderF->CreateGroupItem(groupIndex, GetListWidth());
130 pGroupItem = __pGroupedListViewProvider->CreateGroupItem(groupIndex, _CoordinateSystemUtils::ConvertToInteger(GetListWidth()));
133 if (pGroupItem == null)
135 pTableViewItem = GetDefaultItem();
136 pTableViewItem->SetAppInfo(null);
138 return pTableViewItem;
143 if (__usingFloatingPoint)
145 pItemBase = __pGroupedListViewProviderF->CreateItem(groupIndex, itemIndex, GetListWidth());
149 pItemBase = __pGroupedListViewProvider->CreateItem(groupIndex, itemIndex, _CoordinateSystemUtils::ConvertToInteger(GetListWidth()));
152 if (pItemBase == null)
154 pTableViewItem = GetDefaultItem();
155 pTableViewItem->SetAppInfo(null);
157 return pTableViewItem;
161 _ListItemBaseImpl* pItemBaseImpl = null;
164 pItemBaseImpl = static_cast<_ListItemBaseImpl*>(_GroupItemImpl::GetInstance(*pGroupItem));
168 pItemBaseImpl = _ListItemBaseImpl::GetInstance(*pItemBase);
170 SysAssert(pItemBaseImpl != null);
172 // add ListViewItem event listener
173 pItemBaseImpl->AddListViewItemEventListener(*__pEventListener);
175 _ListViewItem* pListViewItem = pItemBaseImpl->GetListViewItem();
176 SysAssert(pListViewItem != null);
178 pListViewItem->AddRef();
179 pListViewItem->SetItemStyle(static_cast<TableViewAnnexStyle>(pItemBaseImpl->GetListItemAnnexStyle()));
180 pListViewItem->SetItemWidth(GetListWidth());
181 pListViewItem->SetFont(__fontName);
185 pListViewItem->SetAppInfo(pGroupItem);
187 if (__groupItemLoadedCount < __countOfAllGroups)
189 __groupItemAverageHeight = (__groupItemAverageHeight * __groupItemLoadedCount + pListViewItem->GetItemHeight()) / (__groupItemLoadedCount + 1);
190 __groupItemLoadedCount++;
195 pListViewItem->SetAppInfo(pItemBase);
197 if (__itemLoadedCount < __countOfAllItems)
199 __itemAverageHeight = (__itemAverageHeight * __itemLoadedCount + pListViewItem->GetItemHeight()) / (__itemLoadedCount + 1);
204 if (IsDescriptionTextShown(groupIndex, itemIndex))
206 pListViewItem->SetDescriptionTextShowState(true);
209 return pListViewItem;
213 _GroupedListViewItemProviderAdaptor::UnloadItem(_IListItemCommon* pListItem, int groupIndex, int itemIndex)
215 SysTryReturn(NID_UI_CTRL, pListItem != null, E_INVALID_ARG, E_INVALID_ARG,
216 "[E_INVALID_ARG] pListItem is invalid argument.");
218 _ListViewItem* pListViewItem = static_cast<_ListViewItem*>(pListItem);
219 if (pListViewItem->GetParent() != null)
221 pListViewItem->GetParent()->DetachChild(*pListViewItem);
225 if (pListViewItem == GetDefaultItem())
230 if (pListViewItem == __pItemNeedsLazyDeletion)
232 SetItemLazyDeletion(pListViewItem);
235 if (pListViewItem->Release() != 0)
239 GroupItem* pGroupItem = static_cast<GroupItem*>(pListViewItem->GetAppInfo());
241 _GroupItemImpl* pItemBaseImpl = _GroupItemImpl::GetInstance(*pGroupItem);
242 SysAssert(pItemBaseImpl != null);
244 // remove ListViewItem event listener
245 pItemBaseImpl->RemoveListViewItemEventListener(*__pEventListener);
247 if (__usingFloatingPoint)
249 if (!__pGroupedListViewProviderF->DeleteGroupItem(groupIndex, pGroupItem, GetListWidth()))
256 if (!__pGroupedListViewProvider->DeleteGroupItem(groupIndex, pGroupItem, _CoordinateSystemUtils::ConvertToInteger(GetListWidth())))
264 ListItemBase* pItemBase = static_cast<ListItemBase*>(pListViewItem->GetAppInfo());
266 _ListItemBaseImpl* pItemBaseImpl = _ListItemBaseImpl::GetInstance(*pItemBase);
267 SysAssert(pItemBaseImpl != null);
269 // remove ListViewItem event listener
270 pItemBaseImpl->RemoveListViewItemEventListener(*__pEventListener);
272 if (__usingFloatingPoint)
274 if (!__pGroupedListViewProviderF->DeleteItem(groupIndex, itemIndex, pItemBase, GetListWidth()))
281 if (!__pGroupedListViewProvider->DeleteItem(groupIndex, itemIndex, pItemBase, _CoordinateSystemUtils::ConvertToInteger(GetListWidth())))
293 _GroupedListViewItemProviderAdaptor::DeleteItem(_IListItemCommon* pListItem, int groupIndex, int itemIndex)
295 SysTryReturn(NID_UI_CTRL, pListItem != null, E_INVALID_ARG, E_INVALID_ARG,
296 "[E_INVALID_ARG] pListItem is invalid argument.");
298 _ListViewItem* pListViewItem = static_cast<_ListViewItem*>(pListItem);
299 if (pListViewItem->GetParent() != null)
301 pListViewItem->GetParent()->DetachChild(*pListViewItem);
305 if (pListViewItem == GetDefaultItem())
310 if (pListViewItem == __pItemNeedsLazyDeletion)
312 SetItemLazyDeletion(pListViewItem);
315 if (pListViewItem->Release() != 0)
319 GroupItem* pGroupItem = static_cast<GroupItem*>(pListViewItem->GetAppInfo());
324 ListItemBase* pItemBase = static_cast<ListItemBase*>(pListViewItem->GetAppInfo());
333 _GroupedListViewItemProviderAdaptor::UpdateItem(_IListItemCommon* pItem, int groupIndex, int itemIndex)
335 _ListViewItem* pListViewItem = static_cast<_ListViewItem*>(pItem);
337 if (pListViewItem != null)
339 pListViewItem->SetDescriptionTextShowState(IsDescriptionTextShown(groupIndex, itemIndex));
346 _GroupedListViewItemProviderAdaptor::GetItemCount(int groupIndex) const
348 _GroupedListViewItemProviderAdaptor* pItemProviderAdaptor = const_cast<_GroupedListViewItemProviderAdaptor*>(this);
351 if (__usingFloatingPoint)
353 itemCount = __pGroupedListViewProviderF->GetItemCount(groupIndex);
357 itemCount = __pGroupedListViewProvider->GetItemCount(groupIndex);
360 if (__groupItemLoadedCount <= groupIndex)
362 pItemProviderAdaptor->__countOfAllItems += itemCount;
369 _GroupedListViewItemProviderAdaptor::GetGroupCount(void) const
371 _GroupedListViewItemProviderAdaptor* pItemProviderAdaptor = const_cast<_GroupedListViewItemProviderAdaptor*>(this);
373 if (__usingFloatingPoint)
375 pItemProviderAdaptor->__countOfAllGroups = __pGroupedListViewProviderF->GetGroupCount();
379 pItemProviderAdaptor->__countOfAllGroups = __pGroupedListViewProvider->GetGroupCount();
382 return __countOfAllGroups;
386 _GroupedListViewItemProviderAdaptor::GetDefaultItemHeight(void)
388 return __itemAverageHeight;
392 _GroupedListViewItemProviderAdaptor::GetDefaultGroupItemHeight(void)
394 return __groupItemAverageHeight;
398 _GroupedListViewItemProviderAdaptor::IsReorderable(int groupIndexFrom, int groupIndexTo)
400 if (__usingFloatingPoint)
402 return __pGroupedListViewProviderF->IsReorderable(groupIndexFrom, groupIndexTo);
405 return __pGroupedListViewProvider->IsReorderable(groupIndexFrom, groupIndexTo);
409 _GroupedListViewItemProviderAdaptor::HasSectionHeader(int groupIndex) const
415 _GroupedListViewItemProviderAdaptor::HasSectionFooter(int groupIndex) const
421 _GroupedListViewItemProviderAdaptor::SetDescriptionTextShowState(int groupIndex, int itemIndex, bool show)
423 _ListItemPos descriptionTextPos = {groupIndex, itemIndex};
424 int idxDescriptionTextGroup = -1;
425 int idxDescriptionTextItem = -1;
427 _LinkedList <_ListItemPos>::_Iterator theIter = __descriptionTextShowItem.begin();
428 while (theIter != __descriptionTextShowItem.end())
430 idxDescriptionTextGroup = theIter->groupIndex;
431 idxDescriptionTextItem = theIter->itemIndex;
433 if (idxDescriptionTextGroup == groupIndex)
435 if (idxDescriptionTextItem == itemIndex)
439 __descriptionTextShowItem.erase(theIter);
443 else if (idxDescriptionTextItem > itemIndex)
447 __descriptionTextShowItem.insert(theIter, descriptionTextPos);
453 if (idxDescriptionTextGroup > groupIndex)
457 __descriptionTextShowItem.insert(theIter, descriptionTextPos);
467 __descriptionTextShowItem.push_back(descriptionTextPos);
474 _GroupedListViewItemProviderAdaptor::IsDescriptionTextShown(int groupIndex, int itemIndex) const
476 int idxDescriptionTextGroup = -1;
477 int idxDescriptionTextItem = -1;
479 _LinkedList <_ListItemPos>::_Iterator theIter = __descriptionTextShowItem.begin();
480 while (theIter != __descriptionTextShowItem.end())
482 idxDescriptionTextGroup = theIter->groupIndex;
483 idxDescriptionTextItem = theIter->itemIndex;
485 if (idxDescriptionTextGroup == groupIndex)
487 if (idxDescriptionTextItem == itemIndex)
491 else if (idxDescriptionTextItem > itemIndex)
496 else if (idxDescriptionTextGroup > groupIndex)
508 _GroupedListViewItemProviderAdaptor::SetListViewItemEventListener(_IUiListViewItemEventListener& listener)
510 __pEventListener = &listener;
514 _GroupedListViewItemProviderAdaptor::SetItemFont(const String& fontName)
516 __fontName = fontName;
520 _GroupedListViewItemProviderAdaptor::SetItemNeedsLazyDeletion(_ListViewItem* pItem)
522 __pItemNeedsLazyDeletion = pItem;
526 _GroupedListViewItemProviderAdaptor::SetItemLazyDeletion(_ListViewItem* pItem)
528 if (__pLazyDeletionItem != pItem)
530 if (__pLazyDeletionItem != null)
532 __pLazyDeletionItem->Release();
539 __pLazyDeletionItem = pItem;
543 }}} // Tizen::Ui::Controls