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_ListViewItemProviderAdaptor.cpp
20 * @brief This is the implementation file for _ListViewItemProviderAdaptor class.
22 * This file contains the implementation of _ListViewItemProviderAdaptor class.
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"
35 #ifdef MEMORY_LEAK_CHECK
36 #include "mem_leak_check.h"
39 using namespace Tizen::Graphics;
40 using namespace Tizen::Base;
42 namespace Tizen { namespace Ui { namespace Controls
45 _ListViewItemProviderAdaptor::_ListViewItemProviderAdaptor(const IListViewItemProvider& provider)
46 : __pListViewProvider(const_cast<IListViewItemProvider*>(&provider))
47 , __pListViewProviderF(null)
48 , __pEventListener(null)
50 , __itemAverageHeight(0.0f)
51 , __itemLoadedCount(0)
52 , __countOfAllItems(0)
53 , __pItemNeedsLazyDeletion(null)
54 , __usingFloatingPoint(false)
58 _ListViewItemProviderAdaptor::_ListViewItemProviderAdaptor(const IListViewItemProviderF& provider)
59 : __pListViewProvider(null)
60 , __pListViewProviderF(const_cast<IListViewItemProviderF*>(&provider))
61 , __pEventListener(null)
63 , __itemAverageHeight(0.0f)
64 , __itemLoadedCount(0)
65 , __countOfAllItems(0)
66 , __pItemNeedsLazyDeletion(null)
67 , __usingFloatingPoint(true)
71 _ListViewItemProviderAdaptor::~_ListViewItemProviderAdaptor(void)
73 __descriptionTextShowItem.clear();
75 SetItemNeedsLazyDeletion(null);
79 _ListViewItemProviderAdaptor::SetItemProvider(const IListViewItemProvider& provider)
81 __pListViewProvider = const_cast<IListViewItemProvider*>(&provider);
82 __pListViewProviderF = null;
84 __usingFloatingPoint = false;
88 _ListViewItemProviderAdaptor::SetItemProvider(const IListViewItemProviderF& provider)
90 __pListViewProvider = null;
91 __pListViewProviderF = const_cast<IListViewItemProviderF*>(&provider);
93 __usingFloatingPoint = true;
97 _ListViewItemProviderAdaptor::LoadItem(int groupIndex, int itemIndex)
99 SysTryReturn(NID_UI_CTRL, (groupIndex == 0), null, E_INVALID_ARG,
100 "[E_INVALID_ARG] parameter not available.");
102 _TableViewItem* pTableViewItem = null;
105 pTableViewItem = GetDefaultItem();
106 pTableViewItem->SetAppInfo(null);
108 return pTableViewItem;
111 ListItemBase* pItemBase = null;
112 if (__usingFloatingPoint)
114 pItemBase = __pListViewProviderF->CreateItem(itemIndex, GetListWidth());
118 pItemBase = __pListViewProvider->CreateItem(itemIndex, _CoordinateSystemUtils::ConvertToInteger(GetListWidth()));
121 if (pItemBase == null)
123 pTableViewItem = GetDefaultItem();
124 pTableViewItem->SetAppInfo(null);
126 return pTableViewItem;
129 _ListItemBaseImpl* pItemBaseImpl = _ListItemBaseImpl::GetInstance(*pItemBase);
130 SysAssert(pItemBaseImpl != null);
132 // add ListViewItem event listener
133 pItemBaseImpl->AddListViewItemEventListener(*__pEventListener);
135 _ListViewItem* pListViewItem = pItemBaseImpl->GetListViewItem();
136 SysAssert(pListViewItem != null);
138 pListViewItem->SetFont(__fontName);
139 pListViewItem->AddRef();
140 pListViewItem->SetAppInfo(pItemBase);
141 pListViewItem->SetItemStyle(static_cast<TableViewAnnexStyle>(pItemBaseImpl->GetListItemAnnexStyle()));
142 pListViewItem->SetItemWidth(GetListWidth());
144 if (IsDescriptionTextShown(itemIndex))
146 pListViewItem->SetDescriptionTextShowState(true);
149 if (__itemLoadedCount < __countOfAllItems)
151 __itemAverageHeight = (__itemAverageHeight * __itemLoadedCount + pListViewItem->GetItemHeight()) / (__itemLoadedCount + 1);
155 return pListViewItem;
159 _ListViewItemProviderAdaptor::UnloadItem(_IListItemCommon* pListItem, int groupIndex, int itemIndex)
161 SysTryReturn(NID_UI_CTRL, pListItem != null, E_INVALID_ARG, E_INVALID_ARG,
162 "[E_INVALID_ARG]pListItem is invalid argument");
164 _ListViewItem* pListViewItem = static_cast<_ListViewItem*>(pListItem);
165 if (pListViewItem->GetParent() != null)
167 pListViewItem->GetParent()->DetachChild(*pListViewItem);
171 if (pListViewItem == GetDefaultItem())
176 if (pListViewItem == __pItemNeedsLazyDeletion)
178 pListViewItem->AddRef();
181 if (pListViewItem->Release() != 0)
183 ListItemBase* pItemBase = static_cast<ListItemBase*>(pListViewItem->GetAppInfo());
185 _ListItemBaseImpl* pItemBaseImpl = _ListItemBaseImpl::GetInstance(*pItemBase);
186 SysAssert(pItemBaseImpl != null);
188 // remove ListViewItem event listener
189 pItemBaseImpl->RemoveListViewItemEventListener(*__pEventListener);
191 if (__usingFloatingPoint)
193 if (!__pListViewProviderF->DeleteItem(itemIndex, pItemBase, GetListWidth()))
200 if (!__pListViewProvider->DeleteItem(itemIndex, pItemBase, _CoordinateSystemUtils::ConvertToInteger(GetListWidth())))
212 _ListViewItemProviderAdaptor::DeleteItem(_IListItemCommon* pListItem, int groupIndex, int itemIndex)
214 SysTryReturn(NID_UI_CTRL, pListItem != null, E_INVALID_ARG, E_INVALID_ARG,
215 "[E_INVALID_ARG] pListItem is invalid argument.");
217 _ListViewItem* pListViewItem = static_cast<_ListViewItem*>(pListItem);
218 if (pListViewItem->GetParent() != null)
220 pListViewItem->GetParent()->DetachChild(*pListViewItem);
224 if (pListViewItem == GetDefaultItem())
229 if (pListViewItem == __pItemNeedsLazyDeletion)
231 pListViewItem->AddRef();
234 if (pListViewItem->Release() != 0)
236 ListItemBase* pItemBase = static_cast<ListItemBase*>(pListViewItem->GetAppInfo());
244 _ListViewItemProviderAdaptor::UpdateItem(_IListItemCommon* pItem, int groupIndex, int itemIndex)
246 _ListViewItem* pListViewItem = static_cast<_ListViewItem*>(pItem);
248 if (pListViewItem != null)
250 pListViewItem->SetDescriptionTextShowState(IsDescriptionTextShown(itemIndex));
257 _ListViewItemProviderAdaptor::GetItemCount(int groupIndex) const
259 _ListViewItemProviderAdaptor* pItemProviderAdaptor = const_cast<_ListViewItemProviderAdaptor*>(this);
261 if (__usingFloatingPoint)
263 pItemProviderAdaptor->__countOfAllItems = __pListViewProviderF->GetItemCount();
267 pItemProviderAdaptor->__countOfAllItems = __pListViewProvider->GetItemCount();
270 return __countOfAllItems;
274 _ListViewItemProviderAdaptor::GetGroupCount(void) const
280 _ListViewItemProviderAdaptor::GetDefaultItemHeight(void)
282 return __itemAverageHeight;
286 _ListViewItemProviderAdaptor::GetDefaultGroupItemHeight(void)
292 _ListViewItemProviderAdaptor::SetDescriptionTextShowState(int itemIndex, bool show)
295 _LinkedList <short>::_Iterator theIter = __descriptionTextShowItem.begin();
297 while (theIter != __descriptionTextShowItem.end())
299 index = (int) (*theIter);
301 if (index == itemIndex)
305 __descriptionTextShowItem.erase(theIter);
310 else if (index > itemIndex)
314 __descriptionTextShowItem.insert(theIter, itemIndex);
325 __descriptionTextShowItem.push_back(itemIndex);
332 _ListViewItemProviderAdaptor::IsDescriptionTextShown(int itemIndex) const
335 _LinkedList <short>::_Iterator theIter = __descriptionTextShowItem.begin();
337 while (theIter != __descriptionTextShowItem.end())
339 index = (int) (*theIter);
341 if (index == itemIndex)
345 else if (index > itemIndex)
358 _ListViewItemProviderAdaptor::SetListViewItemEventListener(_IUiListViewItemEventListener& listener)
360 __pEventListener = &listener;
364 _ListViewItemProviderAdaptor::SetItemFont(const String& fontName)
366 __fontName = fontName;
370 _ListViewItemProviderAdaptor::SetItemNeedsLazyDeletion(_ListViewItem* pItem)
372 if (__pItemNeedsLazyDeletion != pItem)
374 if (__pItemNeedsLazyDeletion != null)
376 __pItemNeedsLazyDeletion->Release();
379 __pItemNeedsLazyDeletion = pItem;
383 }}} // Tizen::Ui::Controls