2 // Open Service Platform
3 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
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
9 // http://floralicense.org/license/
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_ResourceManager.h"
28 #include "FUiCtrl_GroupedListViewItemProviderAdaptor.h"
29 #include "FUiCtrl_GroupItemImpl.h"
30 #include "FUiCtrl_IListItemCommon.h"
31 #include "FUiCtrl_ListItemBaseImpl.h"
32 #include "FUiCtrl_ListViewItem.h"
34 #ifdef MEMORY_LEAK_CHECK
35 #include "mem_leak_check.h"
38 using namespace Tizen::Base;
40 namespace Tizen { namespace Ui { namespace Controls
43 _GroupedListViewItemProviderAdaptor::_GroupedListViewItemProviderAdaptor(const IGroupedListViewItemProvider& provider)
44 : __pGroupedListViewProvider(const_cast<IGroupedListViewItemProvider*>(&provider))
45 , __pEventListener(null)
47 , __groupItemAverageHeight(0)
48 , __itemAverageHeight(0)
49 , __groupItemLoadedCount(0)
50 , __itemLoadedCount(0)
51 , __countOfAllGroups(0)
52 , __countOfAllItems(0)
53 , __pItemNeedsLazyDeletion(null)
57 _GroupedListViewItemProviderAdaptor::~_GroupedListViewItemProviderAdaptor()
59 __descriptionTextShowItem.clear();
61 SetItemNeedsLazyDeletion(null);
65 _GroupedListViewItemProviderAdaptor::SetItemProvider(const IGroupedListViewItemProvider& provider)
67 __pGroupedListViewProvider = const_cast<IGroupedListViewItemProvider*>(&provider);
71 _GroupedListViewItemProviderAdaptor::LoadItem(int groupIndex, int itemIndex)
73 ListItemBase* pItemBase = null;
74 GroupItem* pGroupItem = null;
75 _TableViewItem* pTableViewItem = null;
79 pGroupItem = __pGroupedListViewProvider->CreateGroupItem(groupIndex, GetListWidth());
80 if (pGroupItem == null)
82 pTableViewItem = GetDefaultItem();
83 pTableViewItem->SetAppInfo(null);
85 return pTableViewItem;
90 pItemBase = __pGroupedListViewProvider->CreateItem(groupIndex, itemIndex, GetListWidth());
91 if (pItemBase == null)
93 pTableViewItem = GetDefaultItem();
94 pTableViewItem->SetAppInfo(null);
96 return pTableViewItem;
100 _ListItemBaseImpl* pItemBaseImpl = null;
103 pItemBaseImpl = static_cast<_ListItemBaseImpl*>(_GroupItemImpl::GetInstance(*pGroupItem));
107 pItemBaseImpl = _ListItemBaseImpl::GetInstance(*pItemBase);
109 SysAssert(pItemBaseImpl != null);
111 // add ListViewItem event listener
112 pItemBaseImpl->AddListViewItemEventListener(*__pEventListener);
114 _ListViewItem* pListViewItem = pItemBaseImpl->GetListViewItem();
115 SysAssert(pListViewItem != null);
117 pListViewItem->SetFont(__fontName);
118 pListViewItem->AddRef();
119 pListViewItem->SetItemStyle(static_cast<TableViewAnnexStyle>(pItemBaseImpl->GetListItemAnnexStyle()));
120 pListViewItem->SetItemWidth(GetListWidth());
124 pListViewItem->SetAppInfo(pGroupItem);
126 if (__groupItemLoadedCount < __countOfAllGroups)
128 __groupItemAverageHeight = (__groupItemAverageHeight * __groupItemLoadedCount + pListViewItem->GetItemHeight()) / (__groupItemLoadedCount + 1);
129 __groupItemLoadedCount++;
134 pListViewItem->SetAppInfo(pItemBase);
136 if (__itemLoadedCount < __countOfAllItems)
138 __itemAverageHeight = (__itemAverageHeight * __itemLoadedCount + pListViewItem->GetItemHeight()) / (__itemLoadedCount + 1);
143 if (IsDescriptionTextShown(groupIndex, itemIndex) == true)
145 pListViewItem->SetDescriptionTextShowState(true);
148 return pListViewItem;
152 _GroupedListViewItemProviderAdaptor::UnloadItem(_IListItemCommon* pListItem, int groupIndex, int itemIndex)
154 SysTryReturn(NID_UI_CTRL, pListItem != null, E_INVALID_ARG, E_INVALID_ARG,
155 "[E_INVALID_ARG] pListItem is invalid argument.");
157 _ListViewItem* pListViewItem = static_cast<_ListViewItem*>(pListItem);
158 if (pListViewItem->GetParent() != null)
160 pListViewItem->GetParent()->DetachChild(*pListViewItem);
164 if (pListViewItem == GetDefaultItem())
169 if (pListViewItem == __pItemNeedsLazyDeletion)
171 pListViewItem->AddRef();
174 if (pListViewItem->Release() != 0)
178 GroupItem* pGroupItem = static_cast<GroupItem*>(pListViewItem->GetAppInfo());
179 if (__pGroupedListViewProvider->DeleteGroupItem(groupIndex, pGroupItem, GetListWidth()) == false)
186 ListItemBase* pItemBase = static_cast<ListItemBase*>(pListViewItem->GetAppInfo());
187 if (__pGroupedListViewProvider->DeleteItem(groupIndex, itemIndex, pItemBase, GetListWidth()) == false)
198 _GroupedListViewItemProviderAdaptor::DeleteItem(_IListItemCommon* pListItem, int groupIndex, int itemIndex)
200 SysTryReturn(NID_UI_CTRL, pListItem != null, E_INVALID_ARG, E_INVALID_ARG,
201 "[E_INVALID_ARG] pListItem is invalid argument.");
203 _ListViewItem* pListViewItem = static_cast<_ListViewItem*>(pListItem);
204 if (pListViewItem->GetParent() != null)
206 pListViewItem->GetParent()->DetachChild(*pListViewItem);
210 if (pListViewItem == GetDefaultItem())
215 if (pListViewItem == __pItemNeedsLazyDeletion)
217 pListViewItem->AddRef();
220 if (pListViewItem->Release() != 0)
224 GroupItem* pGroupItem = static_cast<GroupItem*>(pListViewItem->GetAppInfo());
229 ListItemBase* pItemBase = static_cast<ListItemBase*>(pListViewItem->GetAppInfo());
238 _GroupedListViewItemProviderAdaptor::UpdateItem(_IListItemCommon* pItem, int groupIndex, int itemIndex)
240 _ListViewItem* pListViewItem = static_cast<_ListViewItem*>(pItem);
242 if (pListViewItem != null)
244 pListViewItem->SetDescriptionTextShowState(IsDescriptionTextShown(groupIndex, itemIndex));
251 _GroupedListViewItemProviderAdaptor::GetItemCount(int groupIndex) const
253 _GroupedListViewItemProviderAdaptor* pItemProviderAdaptor = const_cast<_GroupedListViewItemProviderAdaptor*>(this);
254 int itemCount = __pGroupedListViewProvider->GetItemCount(groupIndex);
256 if (__groupItemLoadedCount <= groupIndex)
258 pItemProviderAdaptor->__countOfAllItems += itemCount;
265 _GroupedListViewItemProviderAdaptor::GetGroupCount(void) const
267 _GroupedListViewItemProviderAdaptor* pItemProviderAdaptor = const_cast<_GroupedListViewItemProviderAdaptor*>(this);
268 pItemProviderAdaptor->__countOfAllGroups = __pGroupedListViewProvider->GetGroupCount();
270 return __countOfAllGroups;
274 _GroupedListViewItemProviderAdaptor::GetDefaultItemHeight(void)
276 return __itemAverageHeight;
280 _GroupedListViewItemProviderAdaptor::GetDefaultGroupItemHeight(void)
282 return __groupItemAverageHeight;
286 _GroupedListViewItemProviderAdaptor::IsReorderable(int groupIndexFrom, int groupIndexTo)
288 return __pGroupedListViewProvider->IsReorderable(groupIndexFrom, groupIndexTo);
292 _GroupedListViewItemProviderAdaptor::HasSectionHeader(int groupIndex) const
298 _GroupedListViewItemProviderAdaptor::HasSectionFooter(int groupIndex) const
304 _GroupedListViewItemProviderAdaptor::SetDescriptionTextShowState(int groupIndex, int itemIndex, bool show)
306 _ListItemPos descriptionTextPos = {groupIndex, itemIndex};
307 int idxDescriptionTextGroup = -1;
308 int idxDescriptionTextItem = -1;
310 _LinkedList <_ListItemPos>::_Iterator theIter = __descriptionTextShowItem.begin();
311 while (theIter != __descriptionTextShowItem.end())
313 idxDescriptionTextGroup = theIter->groupIndex;
314 idxDescriptionTextItem = theIter->itemIndex;
316 if (idxDescriptionTextGroup == groupIndex)
318 if (idxDescriptionTextItem == itemIndex)
322 __descriptionTextShowItem.erase(theIter);
326 else if (idxDescriptionTextItem > itemIndex)
330 __descriptionTextShowItem.insert(theIter, descriptionTextPos);
336 if (idxDescriptionTextGroup > groupIndex)
340 __descriptionTextShowItem.insert(theIter, descriptionTextPos);
350 __descriptionTextShowItem.push_back(descriptionTextPos);
357 _GroupedListViewItemProviderAdaptor::IsDescriptionTextShown(int groupIndex, int itemIndex) const
359 int idxDescriptionTextGroup = -1;
360 int idxDescriptionTextItem = -1;
362 _LinkedList <_ListItemPos>::_Iterator theIter = __descriptionTextShowItem.begin();
363 while (theIter != __descriptionTextShowItem.end())
365 idxDescriptionTextGroup = theIter->groupIndex;
366 idxDescriptionTextItem = theIter->itemIndex;
368 if (idxDescriptionTextGroup == groupIndex)
370 if (idxDescriptionTextItem == itemIndex)
374 else if (idxDescriptionTextItem > itemIndex)
379 else if (idxDescriptionTextGroup > groupIndex)
391 _GroupedListViewItemProviderAdaptor::SetListViewItemEventListener(_IUiListViewItemEventListener& listener)
393 __pEventListener = &listener;
397 _GroupedListViewItemProviderAdaptor::SetItemFont(const String& fontName)
399 __fontName = fontName;
403 _GroupedListViewItemProviderAdaptor::SetItemNeedsLazyDeletion(_ListViewItem* pItem)
405 if (__pItemNeedsLazyDeletion != pItem)
407 if (__pItemNeedsLazyDeletion != null)
409 __pItemNeedsLazyDeletion->Release();
412 __pItemNeedsLazyDeletion = pItem;
415 }}} // Tizen::Ui::Controls