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_TableViewPresenter.cpp
20 * @brief This is the header file for the _TableViewPresenter class.
22 * This file contains the declarations of the _TableViewPresenter class.
25 #include <FGrpRectangle.h>
26 #include <FSysSystemTime.h>
27 #include "FUi_ResourceManager.h"
28 #include "FUi_UiTouchEvent.h"
29 #include "FUi_ResourceManager.h"
30 #include "FUiAnim_VisualElement.h"
31 #include "FUiCtrl_FastScroll.h"
32 #include "FUiCtrl_ListViewModel.h"
33 #include "FUiCtrl_Scroll.h"
34 #include "FUiCtrl_TableView.h"
35 #include "FUiCtrl_TableViewItem.h"
36 #include "FUiCtrl_TableViewPresenter.h"
37 #include "FUiCtrl_TableViewItemProviderAdaptor.h"
39 using namespace Tizen::Ui::Animations;
40 using namespace Tizen::Graphics;
41 using namespace Tizen::Base;
42 using namespace Tizen::Base::Runtime;
44 namespace Tizen { namespace Ui { namespace Controls
46 _TableViewPresenter::_TableViewPresenter()
49 , __pProviderAdaptor(null)
53 , __modelInitialized(false)
54 , __firstDrawnFlag(true)
55 , __statusChangedFlag(true)
58 , __pItemDrawingProperty(null)
59 , __pBaseVisualElement(null)
60 , __sweepOccured(false)
61 , __sweptItemPosition()
62 , __reservedScrollItemAlignment(TABLE_VIEW_SCROLL_ITEM_ALIGNMENT_TOP)
63 , __firstTouchMoved(0)
64 , __pReorderScrollTimer(null)
66 , __itemTotalHeight(0)
67 , __pFastScrollTimer(null)
68 , __isFastScrollTimerEnabled(false)
70 __sweptItemTag.itemIndex = -1;
71 __sweptItemTag.groupIndex = -1;
73 __reservedScrollItemIndex.itemIndex = -1;
74 __reservedScrollItemIndex.groupIndex = -1;
77 _TableViewPresenter::~_TableViewPresenter()
83 _TableViewPresenter::GetView() const
89 _TableViewPresenter::GetModel(void) const
95 _TableViewPresenter::Initialize(_TableView* pTableView)
97 _ScrollPanelPresenter::Initialize(*pTableView);
99 __pTableView = pTableView;
100 __pBaseVisualElement = __pTableView->GetVisualElement();
101 __pBaseVisualElement->SetClipChildrenEnabled(true);
102 __pBaseVisualElement->SetSurfaceOpaque(false);
104 result r = __itemHeightList.Construct();
105 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, false, E_OUT_OF_MEMORY, ("[E_OUT_OF_MEMORY] The memory is insufficient."));
108 __pListModel = new (std::nothrow) _ListViewModel();
109 SysTryReturn(NID_UI_CTRL, __pListModel != null, false, E_OUT_OF_MEMORY, ("[E_OUT_OF_MEMORY] The memory is insufficient."));
111 __pItemDrawingProperty = new (std::nothrow) _ItemDrawingProperty();
112 SysTryReturn(NID_UI_CTRL, __pItemDrawingProperty != null, false, E_OUT_OF_MEMORY, ("[E_OUT_OF_MEMORY] The memory is insufficient."));
115 __pFastScrollTimer = new (std::nothrow) Timer();
116 SysTryCatch(NID_UI_CTRL, __pFastScrollTimer != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
118 __pFastScrollTimer->Construct(*this);
119 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
124 if (__isFastScrollTimerEnabled)
126 __pFastScrollTimer->Cancel();
129 delete __pFastScrollTimer;
130 __pFastScrollTimer = null;
136 _TableViewPresenter::Construct(_TableView* pTableView)
138 result r = E_SUCCESS;
141 if (!Initialize(pTableView))
154 _TableViewPresenter::Dispose(void)
156 DeleteItemHeightList();
157 DetachContextItem(__sweptItemTag);
162 delete __pProviderAdaptor;
163 __pProviderAdaptor = null;
165 delete __pItemDrawingProperty;
166 __pItemDrawingProperty = null;
168 delete __pReorderScrollTimer;
169 __pReorderScrollTimer = null;
171 if (__isFastScrollTimerEnabled)
173 __pFastScrollTimer->Cancel();
176 delete __pFastScrollTimer;
177 __pFastScrollTimer = null;
181 _TableViewPresenter::SetItemProvider(const _TableViewItemProvider* pProvider)
183 result r = E_SUCCESS;
185 _TableViewItemProviderAdaptor* pProviderAdaptor = null;
186 pProviderAdaptor = static_cast <_TableViewItemProviderAdaptor*>(__pListModel->GetItemProviderAdaptor());
188 if (pProviderAdaptor == null)
190 pProviderAdaptor = new (std::nothrow) _TableViewItemProviderAdaptor();
191 SysTryReturn(NID_UI_CTRL, pProviderAdaptor != null, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, ("[E_OUT_OF_MEMORY] The memory is insufficient."));
194 r = __pListModel->RegisterItemProviderAdaptor(pProviderAdaptor);
196 pProviderAdaptor->SetItemProvider(const_cast <_TableViewItemProvider*>(pProvider));
197 pProviderAdaptor->SetListWidth(__pTableView->GetBounds().width - (GetLeftMargin() * 2));
198 pProviderAdaptor->SetTableViewStyle(__pTableView->GetTableViewStyle());
200 SetTableViewItemProviderAdaptor(pProviderAdaptor);
206 _TableViewPresenter::GetItemFromPosition(const Tizen::Graphics::Point& position, TableViewItemTag& itemPos) const
208 _TableViewItem* pItem = null;
209 TableViewItemTag lastItemPos = {-1, -1};
211 __pListModel->GetFirstLoadedItemIndex(itemPos.groupIndex, itemPos.itemIndex);
212 __pListModel->GetLastLoadedItemIndex(lastItemPos.groupIndex, lastItemPos.itemIndex);
216 pItem = static_cast <_TableViewItem*>(__pListModel->LoadItem(itemPos.groupIndex, itemPos.itemIndex));
217 SysTryCatch(NID_UI_CTRL, pItem != null, , E_OUT_OF_RANGE, "[E_OUT_OF_RANGE] The index is out of range.");
219 Rectangle itemBounds = pItem->GetBounds();
220 if (itemBounds.Contains(position))
225 if ((itemPos.itemIndex == lastItemPos.itemIndex) && (itemPos.groupIndex == lastItemPos.groupIndex))
230 } while (GetNextItemPosition(itemPos, itemPos) == true);
233 itemPos.itemIndex = -1;
234 itemPos.groupIndex = -1;
236 return E_OUT_OF_RANGE;
240 _TableViewPresenter::GetTopDrawnItemIndex(int& groupIndex, int& itemIndex) const
242 result r = E_SUCCESS;
244 TableViewItemTag itemPos;
245 r = GetTopDrawnItem(itemPos);
247 groupIndex = itemPos.groupIndex;
248 itemIndex = itemPos.itemIndex;
254 _TableViewPresenter::SetTopDrawnItemIndex(int groupIndex, int itemIndex)
258 return E_INVALID_ARG;
261 if ((groupIndex < 0) || (groupIndex >= GetGroupCount()) || (itemIndex < -1) || (itemIndex >= GetItemCountAt(groupIndex)))
263 return E_OUT_OF_RANGE;
266 ScrollToItem(groupIndex, itemIndex, TABLE_VIEW_SCROLL_ITEM_ALIGNMENT_TOP);
272 _TableViewPresenter::GetBottomDrawnItemIndex(int& groupIndex, int& itemIndex) const
274 result r = E_SUCCESS;
276 TableViewItemTag itemPos;
277 r = GetBottomDrawnItem(itemPos);
279 groupIndex = itemPos.groupIndex;
280 itemIndex = itemPos.itemIndex;
286 _TableViewPresenter::SetBottomDrawnItemIndex(int groupIndex, int itemIndex)
290 return E_INVALID_ARG;
293 if ((groupIndex < 0) || (groupIndex >= GetGroupCount()) || (itemIndex < -1) || (itemIndex >= GetItemCountAt(groupIndex)))
295 return E_OUT_OF_RANGE;
298 ScrollToItem(groupIndex, itemIndex, TABLE_VIEW_SCROLL_ITEM_ALIGNMENT_BOTTOM);
304 _TableViewPresenter::GetGroupCount(void) const
306 return __pListModel->GetAllGroupCount();
311 _TableViewPresenter::GetItemCountAt(int groupIndex) const
313 return __pListModel->GetItemCountInGroup(groupIndex);
317 _TableViewPresenter::HasSectionFooter(int groupIndex) const
319 if (__pProviderAdaptor == null)
324 return __pProviderAdaptor->HasSectionFooter(groupIndex);
328 _TableViewPresenter::GetItemCount(void) const
330 return __pListModel->GetAllItemCount();
334 _TableViewPresenter::RefreshTableView(int groupIndex, int itemIndex, TableViewRefreshType type, bool animation)
336 _TableViewItemProviderAdaptor* pProviderAdaptor = __pProviderAdaptor;
338 SysTryReturn(NID_UI_CTRL, pProviderAdaptor != null, E_INVALID_STATE, E_INVALID_STATE,
339 ("[E_INVALID_STATE] This instance isn't constructed."));
341 if ((groupIndex < 0) || (groupIndex > GetGroupCount()) || (itemIndex < -1) || (itemIndex > GetItemCountAt(groupIndex)))
343 SysLogException(NID_UI_CTRL, E_OUT_OF_RANGE, "[E_OUT_OF_RANGE] The index is out of range.");
344 return E_OUT_OF_RANGE;
347 if (groupIndex == GetGroupCount() && itemIndex != -1 && type != TABLE_VIEW_REFRESH_TYPE_ITEM_ADD)
349 SysLogException(NID_UI_CTRL, E_OUT_OF_RANGE, "[E_OUT_OF_RANGE] The index is out of range.");
350 return E_OUT_OF_RANGE;
353 if (IsEmpty() && type == TABLE_VIEW_REFRESH_TYPE_ITEM_ADD && __pTableView->GetTableViewStyle() == TABLE_VIEW_STYLE_SIMPLE)
358 _IListItemCommon* pItem = null;
359 TableViewItemTag topDrawnItemPos = {-1, -1};
360 TableViewItemTag refreshItemPos = {groupIndex, itemIndex};
363 GetTopDrawnItem(topDrawnItemPos);
365 if (__sweptItemTag.groupIndex == groupIndex && __sweptItemTag.itemIndex == itemIndex)
372 case TABLE_VIEW_REFRESH_TYPE_ITEM_ADD:
375 bool emptyState = IsEmpty();
377 int itemCount = pProviderAdaptor->GetItemCount(groupIndex);
378 if (__pListModel->InsertGroup(groupIndex, itemCount, false) != E_SUCCESS)
380 SysLogException(NID_UI_CTRL, E_SYSTEM, "[E_SYSTEM] Unable to add Group item.");
386 GetFirstItem(topDrawnItemPos);
388 else if (groupIndex <= topDrawnItemPos.groupIndex)
390 topDrawnItemPos.groupIndex++;
395 pItem = pProviderAdaptor->LoadItem(groupIndex, itemIndex);
396 SysTryReturn(NID_UI_CTRL, pItem != null, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Unable to load item.");
398 if (__pListModel->InsertItemToGroup(pItem, groupIndex, itemIndex) != E_SUCCESS)
400 pProviderAdaptor->UnloadItem(pItem, groupIndex, itemIndex);
401 SysLogException(NID_UI_CTRL, E_SYSTEM, "[E_SYSTEM] Unable to add item.");
405 itemHeight = pItem->GetItemHeight();
407 if (!IsValidDrawnItem(groupIndex, itemIndex))
409 if (__pListModel->UnloadItem(groupIndex, itemIndex) != E_SUCCESS)
411 SysLogException(NID_UI_CTRL, E_SYSTEM, "[E_SYSTEM] Unable to unload item.");
416 RefreshItemHeightList(groupIndex, itemIndex, TABLE_VIEW_REFRESH_TYPE_ITEM_ADD);
420 SetItemHeight(refreshItemPos, itemHeight);
423 if (__pListModel->GetAllItemCount() == 1)
425 SetStatusChanged(true);
430 case TABLE_VIEW_REFRESH_TYPE_ITEM_REMOVE:
433 if (groupIndex == GetGroupCount())
435 SysLogException(NID_UI_CTRL, E_OUT_OF_RANGE, "[E_OUT_OF_RANGE] The index is out of range.");
436 return E_OUT_OF_RANGE;
439 if (__pListModel->RemoveGroup(groupIndex) != E_SUCCESS)
441 SysLogException(NID_UI_CTRL, E_SYSTEM, "[E_SYSTEM] Unable to remove group.");
445 if (groupIndex < topDrawnItemPos.groupIndex)
447 topDrawnItemPos.groupIndex--;
450 if ((groupIndex == topDrawnItemPos.groupIndex) && (GetItemCountAt(groupIndex) < topDrawnItemPos.itemIndex))
452 topDrawnItemPos.itemIndex = -1;
455 RefreshItemHeightList(groupIndex, itemIndex, TABLE_VIEW_REFRESH_TYPE_ITEM_REMOVE);
459 if (itemIndex == GetItemCountAt(groupIndex))
461 SysLogException(NID_UI_CTRL, E_OUT_OF_RANGE, "[E_OUT_OF_RANGE] The index is out of range.");
462 return E_OUT_OF_RANGE;
465 if (__pListModel->RemoveItemAt(groupIndex, itemIndex) != E_SUCCESS)
467 SysLogException(NID_UI_CTRL, E_SYSTEM, "[E_SYSTEM] Unable to remove item.");
471 if ((groupIndex == topDrawnItemPos.groupIndex) && (itemIndex < topDrawnItemPos.itemIndex))
473 GetPreviousItemPosition(topDrawnItemPos, topDrawnItemPos);
476 RefreshItemHeightList(groupIndex, itemIndex, TABLE_VIEW_REFRESH_TYPE_ITEM_REMOVE);
479 if (GetModel()->IsValidItem(topDrawnItemPos.groupIndex, topDrawnItemPos.itemIndex) == false)
481 GetPreviousItemPosition(topDrawnItemPos, topDrawnItemPos);
484 if (__pListModel->GetAllItemCount() == 0)
486 SetStatusChanged(true);
491 case TABLE_VIEW_REFRESH_TYPE_ITEM_MODIFY:
493 TableViewItemTag itemTag = {groupIndex, itemIndex};
494 _TableViewItem* pTableViewItem = FindItem(itemTag);
496 if (pTableViewItem == null)
501 if (pProviderAdaptor->UpdateItem(pTableViewItem, itemTag.groupIndex, itemTag.itemIndex))
503 CheckItemHeightAndRefreshLayout(itemTag, true);
505 if (__sweptItemTag.groupIndex != itemTag.groupIndex || __sweptItemTag.itemIndex != itemTag.itemIndex)
510 pTableViewItem->SetItemChanged(true);
511 pTableViewItem->Invalidate();
512 pTableViewItem->AdjustContextItemBounds();
520 SysLogException(NID_UI_CTRL, E_SYSTEM, "[E_SYSTEM] Unable to refresh list.");
525 AdjustClientAreaBounds(true);
527 RefreshItemLayout(topDrawnItemPos, refreshItemPos, type, animation);
533 _TableViewPresenter::UpdateTableView(void)
535 if (__modelInitialized == false)
537 SetItemDrawingProperty();
541 __modelInitialized = true;
545 TableViewItemTag topDrawnTag = {-1, -1};
546 int shiftingDistance = 0;
550 GetTopDrawnItem(topDrawnTag);
552 if (__pListModel->IsValidItem(topDrawnTag.groupIndex, topDrawnTag.itemIndex))
554 _TableViewItem* pItem = FindItem(topDrawnTag);
558 shiftingDistance = GetScrollPosition() - pItem->GetBounds().y;
562 __pListModel->RemoveAllItem(false, true);
564 SetScrollPosition(0, false);
566 __statusChangedFlag = true;
570 if (__pListModel->IsValidItem(topDrawnTag.groupIndex, topDrawnTag.itemIndex))
572 ScrollToItem(topDrawnTag.groupIndex, topDrawnTag.itemIndex, TABLE_VIEW_SCROLL_ITEM_ALIGNMENT_TOP, shiftingDistance);
580 _TableViewPresenter::AdjustLayoutItems(int scrollPosition)
582 TableViewItemTag lastLoadedItemPos = {-1, -1};
583 TableViewItemTag firstLoadedItemPos = {-1, -1};
584 TableViewItemTag currentItemPos = {-1, -1};
585 _TableViewItem* pItem = null;
587 __pListModel->GetFirstLoadedItemIndex(firstLoadedItemPos.groupIndex, firstLoadedItemPos.itemIndex);
588 __pListModel->GetLastLoadedItemIndex(lastLoadedItemPos.groupIndex, lastLoadedItemPos.itemIndex);
590 pItem = FindItem(firstLoadedItemPos);
594 int positionY = pItem->GetPosition().y;
596 currentItemPos = firstLoadedItemPos;
598 while (positionY > scrollPosition && GetPreviousItemPosition(currentItemPos, currentItemPos))
600 pItem = LoadItem(currentItemPos.groupIndex, currentItemPos.itemIndex);
607 positionY = pItem->GetPosition().y;
611 pItem = FindItem(lastLoadedItemPos);
615 int positionY = pItem->GetPosition().y;
616 int itemHeight = pItem->GetBounds().height;
617 int limitScreenArea = scrollPosition + __pTableView->GetBounds().height;
618 currentItemPos = lastLoadedItemPos;
620 while (positionY + itemHeight < limitScreenArea && GetNextItemPosition(currentItemPos, currentItemPos))
622 pItem = LoadItem(currentItemPos.groupIndex, currentItemPos.itemIndex);
629 positionY = pItem->GetPosition().y;
630 itemHeight = pItem->GetBounds().height;
636 _TableViewPresenter::ResetItemLayout(TableViewItemTag& topDrawnItemTag)
638 if (__pListModel->IsValidItem(topDrawnItemTag.groupIndex, topDrawnItemTag.itemIndex) == false)
645 _TableViewItem* pItem = LoadItem(topDrawnItemTag.groupIndex, topDrawnItemTag.itemIndex);
652 TableViewItemTag currentItem = topDrawnItemTag;
653 TableViewItemTag itemPos = topDrawnItemTag;
654 int screenAreaHeight = __pTableView->GetBounds().height;
655 int loadedItemTotalHeight = 0;
656 Rectangle itemBounds = pItem->GetBounds();
658 itemBounds.y = CalculateItemPositionY(itemPos.groupIndex, itemPos.itemIndex);
659 pItem->SetBounds(itemBounds);
660 CheckItemHeightAndRefreshLayout(itemPos, true);
662 loadedItemTotalHeight += itemBounds.height;
664 while (loadedItemTotalHeight < screenAreaHeight && GetNextItemPosition(currentItem, itemPos))
666 pItem = LoadItem(itemPos.groupIndex, itemPos.itemIndex);
673 currentItem = itemPos;
674 loadedItemTotalHeight += pItem->GetBounds().height;
677 if (loadedItemTotalHeight < screenAreaHeight)
679 __pListModel->GetFirstLoadedItemIndex(itemPos.groupIndex, itemPos.itemIndex);
680 currentItem = itemPos;
682 while (loadedItemTotalHeight < screenAreaHeight && GetPreviousItemPosition(currentItem, itemPos))
684 pItem = LoadItem(itemPos.groupIndex, itemPos.itemIndex);
691 currentItem = itemPos;
692 loadedItemTotalHeight += pItem->GetBounds().height;
698 _TableViewPresenter::GetFirstLoadedItemIndex(int& groupIndex, int& itemIndex) const
700 __pListModel->GetFirstLoadedItemIndex(groupIndex, itemIndex);
704 _TableViewPresenter::GetLastLoadedItemIndex(int& groupIndex, int& itemIndex) const
706 __pListModel->GetLastLoadedItemIndex(groupIndex, itemIndex);
710 _TableViewPresenter::RefreshItemLayout(int groupIndex, int itemIndex)
712 TableViewItemTag itemTag = {groupIndex, itemIndex};
716 RefreshItemLayout(itemTag, itemTag, TABLE_VIEW_REFRESH_TYPE_ITEM_MODIFY, false);
720 _TableViewPresenter::RefreshItemLayout(TableViewItemTag& topDrawnItemTag, TableViewItemTag& refreshItemTag, TableViewRefreshType type, bool animation)
722 if (!__pListModel->IsValidItem(topDrawnItemTag.groupIndex, topDrawnItemTag.itemIndex))
727 if (refreshItemTag.itemIndex == -1)
732 _TableViewItem* pItem = null;
734 TableViewItemTag itemPos = {-1, -1};
735 TableViewItemTag currentItem = {-1, -1};
737 int loadItemCount = 0;
738 int maxLoadItemCount = GetMaxItemCachingSize();
739 Rectangle itemBounds(0, 0, 0, 0);
741 __pListModel->GetFirstLoadedItemIndex(itemPos.groupIndex, itemPos.itemIndex);
743 currentItem = itemPos;
745 int itemPositionY = CalculateItemPositionY(itemPos.groupIndex, itemPos.itemIndex);
749 pItem = LoadItem(itemPos.groupIndex, itemPos.itemIndex);
756 if (pItem->HasParent())
758 pItem->SetDrawingProperty(__pItemDrawingProperty);
759 SetItemType(pItem, itemPos);
762 itemBounds = pItem->GetBounds();
763 itemBounds.y = itemPositionY;
765 pItem->StopAllAnimation();
769 if (type == TABLE_VIEW_REFRESH_TYPE_ITEM_ADD)
771 if (itemPos.groupIndex == refreshItemTag.groupIndex && itemPos.itemIndex == refreshItemTag.itemIndex)
773 pItem->SetBounds(itemBounds);
774 pItem->FadeInOutItem(false, ADD_ITEM_ANIMATION_DURATION, REFRESH_ITEM_ANIMATION_DELAY);
775 pItem->ZoomInOutItem(false, ADD_ITEM_ANIMATION_DURATION, REFRESH_ITEM_ANIMATION_DELAY);
779 if (!pItem->MoveItem(Point(itemBounds.x, itemBounds.y), ADD_ITEM_ANIMATION_DURATION, 0))
781 pItem->SetBounds(itemBounds);
787 if (!pItem->MoveItem(Point(itemBounds.x, itemBounds.y), REMOVE_ITEM_MOVE_ANIMATION_DURATION, REFRESH_ITEM_ANIMATION_DELAY))
789 pItem->SetBounds(itemBounds);
795 pItem->SetBounds(itemBounds);
798 currentItem = itemPos;
799 itemPositionY = itemBounds.y + itemBounds.height;
803 } while (loadItemCount < maxLoadItemCount && GetNextItemPosition(currentItem, itemPos));
805 if (loadItemCount < maxLoadItemCount)
807 __pListModel->GetFirstLoadedItemIndex(itemPos.groupIndex, itemPos.itemIndex);
808 currentItem = itemPos;
810 while (loadItemCount < maxLoadItemCount && GetPreviousItemPosition(currentItem, itemPos))
812 pItem = LoadItem(itemPos.groupIndex, itemPos.itemIndex);
819 currentItem = itemPos;
825 if (refreshItemTag.itemIndex == -1)
827 ScrollToItem(topDrawnItemTag.groupIndex, topDrawnItemTag.itemIndex, TABLE_VIEW_SCROLL_ITEM_ALIGNMENT_TOP);
832 _TableViewPresenter::RefreshItemBounds(_TableViewItem* pItem, TableViewItemTag& itemPos)
834 Rectangle itemBounds;
841 itemBounds = pItem->GetBounds();
843 itemBounds.y = CalculateItemPositionY(itemPos.groupIndex, itemPos.itemIndex);
845 if (itemPos.itemIndex != -1)
847 int itemMargin = GetLeftMargin();
848 itemBounds.x = itemMargin;
849 itemBounds.width = __pItemDrawingProperty->width - itemBounds.x - itemMargin;
854 itemBounds.width = __pItemDrawingProperty->width;
857 pItem->SetBounds(itemBounds);
861 _TableViewPresenter::GetItemIndexFromPosition(const Point& position, int& groupIndex, int& itemIndex) const
863 result r = E_SUCCESS;
864 TableViewItemTag itemPos;
866 Point targetPosition = position;
867 int scrollPosition = GetScrollPosition();
868 targetPosition.y += scrollPosition;
870 r = GetItemFromPosition(targetPosition, itemPos);
879 groupIndex = itemPos.groupIndex;
880 itemIndex = itemPos.itemIndex;
887 _TableViewPresenter::PreloadItem(void)
889 if (GetModel() == null || __pProviderAdaptor == null)
894 if (__pListModel->GetAllGroupCount() == 0 && (__pProviderAdaptor != null))
897 int groupCount = __pProviderAdaptor->GetGroupCount();
899 for (int i = 0; i < groupCount; i++)
901 itemCount = __pProviderAdaptor->GetItemCount(i);
902 __pListModel->AddGroup(itemCount, false);
906 __pListModel->RestoreItemStatus();
908 CreateItemHeightList();
909 AdjustClientAreaBounds(true);
913 if (GetItemCount() > TABLEVIEW_MAX_ITEM_COUNT)
915 cachingSize = TABLEVIEW_MAX_ITEM_COUNT;
917 else if (__pListModel->GetMaxCachingSize() < TABLEVIEW_MAX_ITEM_COUNT)
919 cachingSize = __pListModel->GetMaxCachingSize();
923 cachingSize = GetItemCount();
926 TableViewItemTag itemPos = {-1, -1};
927 GetFirstItem(itemPos);
929 _TableViewItem* pItem = null;
930 for (int i = 0; i < cachingSize; i++)
932 pItem = LoadItem(itemPos.groupIndex, itemPos.itemIndex);
939 if (GetNextItemPosition(itemPos, itemPos) == false)
945 if (__pTableView->GetScrollStyle() == TABLE_VIEW_SCROLL_BAR_STYLE_FAST_SCROLL)
947 _FastScroll* pFastScroll = __pTableView->GetFastScrollBar();
948 if (pFastScroll != null)
950 pFastScroll->UpdateIndex();
951 pFastScroll->SetScrollVisibility(IsScrollable());
957 _TableViewPresenter::IsItemChecked(int groupIndex, int itemIndex) const
959 if ((groupIndex < 0) || (groupIndex >= GetGroupCount()) || (itemIndex < -1) || (itemIndex >= GetItemCountAt(groupIndex)))
964 return __pListModel->IsItemChecked(groupIndex, itemIndex);
968 _TableViewPresenter::SetItemChecked(int groupIndex, int itemIndex, bool checked)
970 if ((groupIndex < 0) || (groupIndex >= GetGroupCount()) || (itemIndex < -1) || (itemIndex >= GetItemCountAt(groupIndex)))
972 return E_OUT_OF_RANGE;
975 if (__modelInitialized == false)
977 return E_INVALID_STATE;
980 TableViewItemTag itemPos = {groupIndex, itemIndex};
982 bool enabled = __pListModel->IsItemEnabled(itemPos.groupIndex, itemPos.itemIndex);
983 SysTryReturn(NID_UI_CTRL, (enabled == true), E_INVALID_OPERATION, E_INVALID_OPERATION,
984 "[E_INVALID_OPERATION] The item is disabled.");
986 if (__pListModel->IsItemChecked(itemPos.groupIndex, itemPos.itemIndex) == checked)
991 TableViewItemTag itemTag = {groupIndex, itemIndex};
992 _TableViewItem *pItem = FindItem(itemTag);
995 pItem->SetCheckedAnimationEnabled(checked);
998 result r = __pListModel->SetItemChecked(itemPos.groupIndex, itemPos.itemIndex, checked);
1004 _TableViewPresenter::IsItemEnabled(int groupIndex, int itemIndex) const
1006 if ((groupIndex < 0) || (groupIndex >= GetGroupCount()) || (itemIndex < -1) || (itemIndex >= GetItemCountAt(groupIndex)))
1011 return __pListModel->IsItemEnabled(groupIndex, itemIndex);
1015 _TableViewPresenter::SetItemEnabled(int groupIndex, int itemIndex, bool enabled)
1017 if ((groupIndex < 0) || (groupIndex >= GetGroupCount()) || (itemIndex < -1) || (itemIndex >= GetItemCountAt(groupIndex)))
1019 return E_OUT_OF_RANGE;
1022 TableViewItemTag itemPos = {groupIndex, itemIndex};
1024 if (__pListModel->IsItemEnabled(itemPos.groupIndex, itemPos.itemIndex) == enabled)
1029 result r = __pListModel->SetItemEnabled(itemPos.groupIndex, itemPos.itemIndex, enabled);
1035 _TableViewPresenter::SetStatusChanged(bool changed)
1037 __statusChangedFlag = changed;
1039 if (__statusChangedFlag == true)
1041 SetItemDrawingProperty();
1043 if ((__pItemDrawingProperty != null) && (__pItemDrawingProperty->propertyChanged == true))
1045 __pListModel->SetAllLoadedItemStateChanged(true);
1053 _TableViewPresenter::IsStatusChanged(void) const
1055 return __statusChangedFlag;
1059 _TableViewPresenter::GetTopMargin(void) const
1065 _TableViewPresenter::SetTopMargin(int topMargin)
1067 __topMargin = topMargin;
1073 _TableViewPresenter::GetBottomMargin(void) const
1075 return __bottomMargin;
1079 _TableViewPresenter::SetBottomMargin(int bottomMargin)
1081 __bottomMargin = bottomMargin;
1087 _TableViewPresenter::GetLeftMargin(void) const
1089 return __leftMargin;
1093 _TableViewPresenter::SetLeftMargin(int leftMargin)
1095 __leftMargin = leftMargin;
1101 _TableViewPresenter::SetItemType(_TableViewItem* pItem, TableViewItemTag itemPosition)
1103 TableViewStyle style = __pTableView->GetTableViewStyle();
1105 int lastItem = GetItemCountAt(itemPosition.groupIndex) - 1;
1107 if (style == TABLE_VIEW_STYLE_SECTION)
1109 if (HasSectionFooter(itemPosition.groupIndex))
1115 if (itemPosition.itemIndex == -1)
1117 if (style == TABLE_VIEW_STYLE_SECTION)
1119 pItem->SetItemType(TABLE_VIEW_ITEM_TYPE_HEADER);
1123 pItem->SetItemType(TABLE_VIEW_ITEM_TYPE_TITLE);
1126 else if (style == TABLE_VIEW_STYLE_SECTION || (itemPosition.groupIndex != GetGroupCount() - 1))
1130 pItem->SetItemType(TABLE_VIEW_ITEM_TYPE_ONE);
1134 if (itemPosition.itemIndex == 0)
1136 pItem->SetItemType(TABLE_VIEW_ITEM_TYPE_TOP);
1138 else if (itemPosition.itemIndex == lastItem)
1140 pItem->SetItemType(TABLE_VIEW_ITEM_TYPE_BOTTOM);
1142 else if (itemPosition.itemIndex == lastItem + 1)
1143 { // this case is for TABLE_VIEW_STYLE_SECTION only
1144 pItem->SetItemType(TABLE_VIEW_ITEM_TYPE_FOOTER);
1148 pItem->SetItemType(TABLE_VIEW_ITEM_TYPE_MIDDLE);
1155 _TableViewPresenter::SetItemLayout(_TableViewItem* pItem, TableViewItemTag& itemPos)
1157 _TableViewItem* pSeriesItem = null;
1158 TableViewItemTag seriesItemPos = {-1, -1};
1159 Rectangle seriesItemBounds;
1160 Rectangle itemBounds;
1161 bool validBounds = false;
1162 bool downScroll = true;
1164 if (itemPos.itemIndex != -1)
1166 int itemMargin = GetLeftMargin();
1167 itemBounds.x = itemMargin;
1168 itemBounds.width = __pItemDrawingProperty->width - itemBounds.x - itemMargin;
1173 itemBounds.width = __pItemDrawingProperty->width;
1176 //itemBounds.height = pItem->GetItemHeight();
1177 itemBounds.height = pItem->GetSize().height;
1179 if (itemPos.groupIndex == 0 && itemPos.itemIndex == -1)
1181 itemBounds.y = GetTopMargin();
1186 if (GetPreviousItemPosition(itemPos, seriesItemPos))
1188 if (__pListModel->IsLoadedItem(seriesItemPos.groupIndex, seriesItemPos.itemIndex))
1190 pSeriesItem = static_cast<_TableViewItem*>(__pListModel->LoadItem(seriesItemPos.groupIndex, seriesItemPos.itemIndex));
1191 if ((pSeriesItem != null) && pSeriesItem->HasParent())
1193 if (__pTableView->IsReorderModeEnabled() && (__reorderInfo.groupIndex == seriesItemPos.groupIndex && __reorderInfo.itemIndex == seriesItemPos.itemIndex))
1195 seriesItemBounds = __reorderInfo.itemBounds;
1199 seriesItemBounds = pSeriesItem->GetBounds();
1202 itemBounds.y = seriesItemBounds.y + seriesItemBounds.height;
1209 if ((!validBounds) && GetNextItemPosition(itemPos, seriesItemPos))
1211 if (__pListModel->IsLoadedItem(seriesItemPos.groupIndex, seriesItemPos.itemIndex))
1213 pSeriesItem = static_cast<_TableViewItem*>(__pListModel->LoadItem(seriesItemPos.groupIndex, seriesItemPos.itemIndex));
1214 if ((pSeriesItem != null) && pSeriesItem->HasParent())
1216 if (__pTableView->IsReorderModeEnabled() && (__reorderInfo.groupIndex == seriesItemPos.groupIndex && __reorderInfo.itemIndex == seriesItemPos.itemIndex))
1218 seriesItemBounds = __reorderInfo.itemBounds;
1222 seriesItemBounds = pSeriesItem->GetBounds();
1225 itemBounds.y = seriesItemBounds.y - itemBounds.height;
1236 pItem->SetBounds(itemBounds);
1238 CheckItemHeightAndRefreshLayout(itemPos, downScroll);
1243 _TableViewPresenter::LoadItem(int groupIndex, int itemIndex)
1245 _TableViewItem* pItem = static_cast<_TableViewItem*>(__pListModel->LoadItem(groupIndex, itemIndex));
1247 if ((pItem != null) && !pItem->HasParent())
1249 pItem->SetDrawingProperty(__pItemDrawingProperty);
1251 TableViewItemTag itemPosition = {groupIndex, itemIndex};
1252 SetItemType(pItem, itemPosition);
1253 SetItemLayout(pItem, itemPosition);
1254 pItem->SetReorderMode(__pTableView->IsReorderModeEnabled());
1255 pItem->AdjustChildControlMargin();
1257 __pTableView->AttachChild(*pItem);
1264 _TableViewPresenter::FindItem(TableViewItemTag& itemTag)
1266 if (__pListModel->IsLoadedItem(itemTag.groupIndex, itemTag.itemIndex))
1268 return static_cast<_TableViewItem*>(__pListModel->LoadItem(itemTag.groupIndex, itemTag.itemIndex));
1274 _TableViewPresenter::UnloadItem(int groupIndex, int itemIndex)
1276 __pListModel->UnloadItem(groupIndex, itemIndex);
1280 _TableViewPresenter::UnloadItem(TableViewItemTag& itemTag)
1282 __pListModel->UnloadItem(itemTag.groupIndex, itemTag.itemIndex);
1288 _TableViewPresenter::DetachItem(TableViewItemTag& itemTag)
1290 _TableViewItem *pItem = FindItem(itemTag);
1292 if (pItem != null && pItem->HasParent())
1294 pItem->GetParent()->DetachChild(*pItem);
1299 _TableViewPresenter::DetachContextItem(TableViewItemTag& itemTag)
1301 _TableViewItem *pItem = FindItem(itemTag);
1307 _TableViewItem* contextItem = pItem->GetContextItem();
1308 if (contextItem != null && contextItem->HasParent())
1310 contextItem->GetParent()->DetachChild(*pItem);
1315 _TableViewPresenter::DetachAllItem(bool removeItem)
1317 TableViewItemTag itemPos = {-1, -1};
1318 TableViewItemTag lastItemPos = {-1, -1};
1320 __pListModel->GetFirstLoadedItemIndex(itemPos.groupIndex, itemPos.itemIndex);
1321 __pListModel->GetLastLoadedItemIndex(lastItemPos.groupIndex, lastItemPos.itemIndex);
1323 if (itemPos.groupIndex == -1 && itemPos.itemIndex == -1)
1330 DetachItem(itemPos);
1334 UnloadItem(itemPos);
1337 if (itemPos.itemIndex == lastItemPos.itemIndex && itemPos.groupIndex == lastItemPos.groupIndex)
1341 } while (GetNextItemPosition(itemPos, itemPos));
1345 _TableViewPresenter::SetItemDrawingProperty(void)
1347 if (__pItemDrawingProperty != null)
1349 __pItemDrawingProperty->propertyChanged = false;
1351 if (__pItemDrawingProperty->itemDividerEnabled != __pTableView->IsItemDividerEnabled())
1353 __pItemDrawingProperty->itemDividerEnabled = __pTableView->IsItemDividerEnabled();
1354 __pItemDrawingProperty->propertyChanged = true;
1357 if (__pItemDrawingProperty->dividerColor != __pTableView->GetItemDividerColor())
1359 __pItemDrawingProperty->dividerColor = __pTableView->GetItemDividerColor();
1360 __pItemDrawingProperty->propertyChanged = true;
1363 if (__pItemDrawingProperty->sectionStyleEnabled != (__pTableView->GetTableViewStyle() == TABLE_VIEW_STYLE_SECTION))
1365 __pItemDrawingProperty->sectionStyleEnabled = (__pTableView->GetTableViewStyle() == TABLE_VIEW_STYLE_SECTION);
1366 __pItemDrawingProperty->propertyChanged = true;
1369 if (__pItemDrawingProperty->sectionStyleBgColor != __pTableView->GetSectionColor())
1371 __pItemDrawingProperty->sectionStyleBgColor = __pTableView->GetSectionColor();
1372 __pItemDrawingProperty->propertyChanged = true;
1375 if (__pTableView->GetTableViewStyle() != TABLE_VIEW_STYLE_SIMPLE)
1377 if (__pItemDrawingProperty->groupedLookEnabled != __pTableView->IsGroupedLookEnabled())
1379 __pItemDrawingProperty->groupedLookEnabled = __pTableView->IsGroupedLookEnabled();
1380 __pItemDrawingProperty->propertyChanged = true;
1384 if (__pItemDrawingProperty->reorderMode != __pTableView->IsReorderModeEnabled())
1386 __pItemDrawingProperty->reorderMode = __pTableView->IsReorderModeEnabled();
1387 __pItemDrawingProperty->propertyChanged = true;
1390 if (__pItemDrawingProperty->leftMargin != __leftMargin)
1392 __pItemDrawingProperty->leftMargin = __leftMargin;
1393 __pItemDrawingProperty->propertyChanged = true;
1396 if (__pTableView->GetScrollStyle() == TABLE_VIEW_SCROLL_BAR_STYLE_FAST_SCROLL)
1398 GET_SHAPE_CONFIG(TABLEVIEW::FASTSCROLL_INDEX_WIDTH, _CONTROL_ORIENTATION_PORTRAIT, __pItemDrawingProperty->scrollMargin);
1402 __pItemDrawingProperty->scrollMargin = 0;
1405 if (__pItemDrawingProperty->width != __pTableView->GetBounds().width)
1407 __pItemDrawingProperty->width = __pTableView->GetBounds().width;
1408 __pItemDrawingProperty->propertyChanged = true;
1414 _TableViewPresenter::OnBoundsChanged(void)
1416 _ScrollPanelPresenter::OnBoundsChanged();
1418 if (__pProviderAdaptor != null && __modelInitialized)
1420 int listWidth = __pTableView->GetBounds().width - (GetLeftMargin() * 2);
1422 if (listWidth != __pProviderAdaptor->GetListWidth())
1424 __pProviderAdaptor->SetListWidth(listWidth);
1425 SetItemDrawingProperty();
1427 AdjustLoadedItemWidth();
1431 SetClientAreaHeight(__itemTotalHeight);
1433 AdjustLayoutItems(GetScrollPosition());
1438 _TableViewPresenter::Draw(void)
1440 result r = _ScrollPanelPresenter::Draw();
1441 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
1443 if (__modelInitialized == false)
1445 SetItemDrawingProperty();
1449 __modelInitialized = true;
1451 if (__reservedScrollItemIndex.groupIndex != -1 && __reservedScrollItemIndex.itemIndex != -1)
1453 ScrollToItem(__reservedScrollItemIndex.groupIndex, __reservedScrollItemIndex.itemIndex, __reservedScrollItemAlignment);
1455 __reservedScrollItemIndex.groupIndex = -1;
1456 __reservedScrollItemIndex.itemIndex = -1;
1463 __firstDrawnFlag = false;
1466 if (IsEmpty() == true)
1468 return DrawEmptyTableView();
1474 _UiTouchEventDelivery
1475 _TableViewPresenter::OnPreviewTouchPressed(const _Control& source, const _TouchInfo& touchInfo)
1477 _UiTouchEventDelivery response = _ScrollPanelPresenter::OnPreviewTouchPressed(source, touchInfo);
1479 __firstTouchMoved = true;
1480 __sweepOccured = false;
1482 _TableViewItem* pItem = GetTableViewItemFromControl(source);
1488 TableViewItemTag itemPos = {-1, -1};
1490 pItem->GetItemIndex(itemPos.groupIndex, itemPos.itemIndex);
1492 if (itemPos.groupIndex == -1 && itemPos.itemIndex == -1)
1497 if (__pTableView->IsReorderModeEnabled())
1499 if (SelectReorderItem(itemPos.groupIndex, itemPos.itemIndex))
1501 __reorderInfo.touchPressedPositionY = touchInfo.GetCurrentPosition().y;
1503 return _UI_TOUCH_EVENT_DELIVERY_NO;
1509 || pItem->IsContextItem()
1510 || pItem->IsItemEnabled() == false
1511 || pItem->GetItemType() == TABLE_VIEW_ITEM_TYPE_TITLE
1512 || pItem->GetItemType() == TABLE_VIEW_ITEM_TYPE_HEADER
1513 || pItem->GetItemType() == TABLE_VIEW_ITEM_TYPE_FOOTER)
1514 && ((itemPos.groupIndex != __sweptItemTag.groupIndex)
1515 || (itemPos.itemIndex != __sweptItemTag.itemIndex)))
1521 _VisualElement* pVisualElement = __pTableView->GetVisualElement();
1522 String animationName(L"EXPAND_GROUP_ANIMATION");
1523 VisualElementValueAnimation* pExpandGroupAnimation = dynamic_cast<VisualElementValueAnimation*>(pVisualElement->GetAnimationN(animationName));
1524 if (pExpandGroupAnimation != null)
1526 pVisualElement->RemoveAnimation(animationName);
1528 //return _UI_TOUCH_EVENT_DELIVERY_NO;
1531 animationName = L"COLLAPSE_GROUP_ANIMATION";
1532 VisualElementValueAnimation* pCollapseGroupAnimation = dynamic_cast<VisualElementValueAnimation*>(pVisualElement->GetAnimationN(animationName));
1533 if (pCollapseGroupAnimation != null)
1535 pVisualElement->RemoveAnimation(animationName);
1537 //return _UI_TOUCH_EVENT_DELIVERY_NO;
1543 _UiTouchEventDelivery
1544 _TableViewPresenter::OnPreviewTouchMoved(const _Control& source, const _TouchInfo& touchInfo)
1546 if (__pTableView->IsReorderModeEnabled() && __reorderInfo.itemIndex != -1)
1548 if (!DragSelectedItem(touchInfo.GetCurrentPosition().y - __reorderInfo.touchPressedPositionY, true))
1550 ResetReorderItem(__reorderInfo.groupIndex, __reorderInfo.itemIndex);
1553 return _UI_TOUCH_EVENT_DELIVERY_NO;
1556 _TableViewItem* pItem = GetTableViewItemFromControl(source);
1558 _UiTouchEventDelivery response = _ScrollPanelPresenter::OnPreviewTouchMoved(source, touchInfo);
1560 || pItem->IsItemEnabled() == false
1561 || pItem->GetItemType() == TABLE_VIEW_ITEM_TYPE_TITLE
1562 || pItem->GetItemType() == TABLE_VIEW_ITEM_TYPE_HEADER
1563 || pItem->GetItemType() == TABLE_VIEW_ITEM_TYPE_FOOTER)
1568 if (__firstTouchMoved)
1570 Point prevTouchPosition = GetPreviousTouchPosition();
1571 Point currTouchPosition = GetCurrentTouchPosition();
1572 int moveDistanceX = currTouchPosition.x - prevTouchPosition.x;
1573 int moveDistanceY = currTouchPosition.y - prevTouchPosition.y;
1575 if ((pItem->GetContextItem() != null && abs(moveDistanceX) > abs(moveDistanceY * 2)) || pItem->IsContextItem())
1577 if (!pItem->IsContextItem())
1579 pItem->GetItemIndex(__sweptItemTag.groupIndex, __sweptItemTag.itemIndex);
1580 __sweptItemPosition = pItem->GetPosition();
1582 pItem->AdjustContextItemBounds();
1585 __sweepOccured = true;
1587 SweepItem(moveDistanceX);
1595 __firstTouchMoved = false;
1600 _UiTouchEventDelivery
1601 _TableViewPresenter::OnPreviewTouchReleased(const _Control& source, const _TouchInfo& touchInfo)
1603 if (__pTableView->IsReorderModeEnabled() && __reorderInfo.itemIndex != -1)
1605 ResetReorderItem(__reorderInfo.groupIndex, __reorderInfo.itemIndex);
1607 if (__reorderInfo.blockedTouchReleaseState)
1609 __reorderInfo.blockedTouchReleaseState = false;
1611 return _UI_TOUCH_EVENT_DELIVERY_NO;
1615 _UiTouchEventDelivery response = _ScrollPanelPresenter::OnPreviewTouchReleased(source, touchInfo);
1617 _TableViewItem* pItem = GetTableViewItemFromControl(source);
1620 || pItem->GetItemType() == TABLE_VIEW_ITEM_TYPE_TITLE
1621 || pItem->GetItemType() == TABLE_VIEW_ITEM_TYPE_HEADER
1622 || pItem->GetItemType() == TABLE_VIEW_ITEM_TYPE_FOOTER)
1627 if (pItem->IsContextItem())
1629 pItem = static_cast<_TableViewItem*>(__pListModel->LoadItem(__sweptItemTag.groupIndex, __sweptItemTag.itemIndex));
1632 _TableViewItem* pContextItem = pItem->GetContextItem();
1637 if (pContextItem == null && __pTableView->IsSweepEnabled())
1639 Point prevPos = _ScrollPanelPresenter::GetPreviousTouchPosition();
1641 if (prevPos.x > touchInfo.GetCurrentPosition().x)
1643 pItem->FireItemSweepEvent(TABLE_VIEW_SWEEP_DIRECTION_LEFT);
1645 else if (prevPos.x < touchInfo.GetCurrentPosition().x)
1647 pItem->FireItemSweepEvent(TABLE_VIEW_SWEEP_DIRECTION_RIGHT);
1652 else if (pContextItem != null)
1654 AdjustSweptItemPosition(true);
1661 _UiTouchEventDelivery
1662 _TableViewPresenter::OnPreviewTouchCanceled(const _Control& source, const _TouchInfo& touchInfo)
1664 return _ScrollPanelPresenter::OnPreviewTouchCanceled(source, touchInfo);
1668 _TableViewPresenter::OnTouchPressed(const _Control& source, const _TouchInfo& touchInfo)
1670 return _ScrollPanelPresenter::OnTouchPressed(source, touchInfo);
1674 _TableViewPresenter::OnTouchMoved(const _Control& source, const _TouchInfo& touchInfo)
1676 if (!__sweepOccured || __pTableView->IsReorderModeEnabled())
1678 return _ScrollPanelPresenter::OnTouchMoved(source, touchInfo);
1683 Point prevTouchPosition = GetPreviousTouchPosition();
1684 Point currTouchPosition = GetCurrentTouchPosition();
1685 SweepItem(currTouchPosition.x - prevTouchPosition.x);
1692 _TableViewPresenter::OnTouchReleased(const _Control& source, const _TouchInfo& touchInfo)
1694 return _ScrollPanelPresenter::OnTouchReleased(source, touchInfo);
1698 _TableViewPresenter::OnTouchCanceled(const _Control& source, const _TouchInfo& touchInfo)
1700 if (__pTableView->IsReorderModeEnabled() && __reorderInfo.itemIndex != -1)
1702 ResetReorderItem(__reorderInfo.groupIndex, __reorderInfo.itemIndex);
1706 return _ScrollPanelPresenter::OnTouchCanceled(source, touchInfo);
1710 _TableViewPresenter::OnFlickGestureDetected(_TouchFlickGestureDetector& gesture)
1712 if (__pTableView->IsReorderModeEnabled() && __reorderInfo.itemIndex != -1)
1717 _FlickDirection flickDirection = gesture.GetDirection();
1719 if (flickDirection != _FLICK_DIRECTION_RIGHT && flickDirection != _FLICK_DIRECTION_LEFT)
1721 return _ScrollPanelPresenter::OnFlickGestureDetected(gesture);
1724 _Control* gestureControl = gesture.GetControl();
1726 if (gestureControl == null)
1728 return _ScrollPanelPresenter::OnFlickGestureDetected(gesture);
1731 _TableViewItem* pItem = GetTableViewItemFromControl(*gestureControl);
1735 return _ScrollPanelPresenter::OnFlickGestureDetected(gesture);
1738 if (flickDirection == _FLICK_DIRECTION_RIGHT)
1741 if (pItem->GetContextItem() == null && __pTableView->IsSweepEnabled())
1743 pItem->FireItemSweepEvent(TABLE_VIEW_SWEEP_DIRECTION_RIGHT);
1747 if (pItem->GetContextItem() != null)
1749 AdjustSweptItemPosition();
1753 else if (flickDirection == _FLICK_DIRECTION_LEFT)
1756 if (pItem->GetContextItem() == null && __pTableView->IsSweepEnabled())
1758 pItem->FireItemSweepEvent(TABLE_VIEW_SWEEP_DIRECTION_LEFT);
1762 if (pItem->GetContextItem() != null)
1764 AdjustSweptItemPosition();
1773 _TableViewPresenter::OnFlickGestureCanceled(_TouchFlickGestureDetector& gesture)
1775 return _ScrollPanelPresenter::OnFlickGestureCanceled(gesture);
1779 _TableViewPresenter::OnPreviewFlickGestureDetected(_TouchFlickGestureDetector& gesture)
1781 if (__pTableView->IsReorderModeEnabled() && __reorderInfo.itemIndex != -1)
1786 _FlickDirection flickDirection = gesture.GetDirection();
1787 if (flickDirection != _FLICK_DIRECTION_RIGHT && flickDirection != _FLICK_DIRECTION_LEFT)
1789 return _ScrollPanelPresenter::OnFlickGestureDetected(gesture);
1796 _TableViewPresenter::OnTimerExpired(Tizen::Base::Runtime::Timer& timer)
1798 _ScrollPanelPresenter::OnTimerExpired(timer);
1800 if (&timer == __pReorderScrollTimer)
1804 if (__reorderInfo.isScrollDirectionUp)
1806 distance = -REORDER_SCROLL_ANIMATION_DISTANCE;
1810 distance = REORDER_SCROLL_ANIMATION_DISTANCE;
1813 DragSelectedItem(distance, false);
1815 distance = ScrollTo(distance + GetScrollPosition());
1817 StartReorderScrollTimer();
1819 else if (&timer == __pFastScrollTimer)
1821 __isFastScrollTimerEnabled = false;
1823 _FastScroll* pFastScroll = __pTableView->GetFastScrollBar();
1825 if (pFastScroll != null && !_ScrollPanelPresenter::IsScrollAnimationRunning())
1827 pFastScroll->SetScrollVisibility(false);
1833 _TableViewPresenter::StartFastScrollTimer(void)
1835 result r = E_SUCCESS;
1837 SysTryReturn(NID_UI_CTRL, __pFastScrollTimer != null, E_INVALID_STATE, E_INVALID_STATE, "[E_INVALID_STATE] Timer is not created.");
1839 r = __pFastScrollTimer->Start(FAST_SCROLL_FADE_OUT_DURATION);
1840 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
1842 __isFastScrollTimerEnabled = true;
1848 _TableViewPresenter::StopFastScrollTimer(void)
1850 result r = E_SUCCESS;
1852 SysTryReturnVoidResult(NID_UI_CTRL, __pFastScrollTimer != null, E_INVALID_STATE, "[E_INVALID_STATE] Timer is invalid.");
1854 r = __pFastScrollTimer->Cancel();
1855 SysTryReturnVoidResult(NID_UI_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
1857 __isFastScrollTimerEnabled = false;
1863 _TableViewPresenter::IsEmpty(void) const
1865 if (GetItemCount() <= 0)
1874 _TableViewPresenter::DrawEmptyTableView(void)
1880 _TableViewPresenter::GetFirstItem(TableViewItemTag& firstItem) const
1884 firstItem.groupIndex = -1;
1885 firstItem.itemIndex = -1;
1889 firstItem.groupIndex = 0;
1890 firstItem.itemIndex = -1;
1897 _TableViewPresenter::GetTopDrawnItem(TableViewItemTag& itemPos) const
1899 _TableViewItem* pItem = null;
1900 TableViewItemTag lastItemPos = {-1, -1};
1901 int scrollPosition = 0;
1903 scrollPosition = GetScrollPosition();
1905 __pListModel->GetFirstLoadedItemIndex(itemPos.groupIndex, itemPos.itemIndex);
1906 __pListModel->GetLastLoadedItemIndex(lastItemPos.groupIndex, lastItemPos.itemIndex);
1910 pItem = static_cast <_TableViewItem*>(__pListModel->LoadItem(itemPos.groupIndex, itemPos.itemIndex));
1916 Rectangle itemBounds = pItem->GetBounds();
1918 if (scrollPosition < (itemBounds.y + itemBounds.height))
1923 if ((itemPos.itemIndex == lastItemPos.itemIndex) && (itemPos.groupIndex == lastItemPos.groupIndex))
1928 } while (GetNextItemPosition(itemPos, itemPos) == true);
1931 itemPos.itemIndex = -1;
1932 itemPos.groupIndex = -1;
1934 return E_OUT_OF_RANGE;
1938 _TableViewPresenter::GetBottomDrawnItem(TableViewItemTag& itemPos) const
1940 _TableViewItem* pItem = null;
1941 TableViewItemTag lastItemPos = {-1, -1};
1945 itemPos.itemIndex = -1;
1946 itemPos.groupIndex = -1;
1948 return E_INVALID_STATE;
1951 int scrollPosition = GetScrollPosition() + __pTableView->GetBounds().height;
1953 __pListModel->GetFirstLoadedItemIndex(itemPos.groupIndex, itemPos.itemIndex);
1954 __pListModel->GetLastLoadedItemIndex(lastItemPos.groupIndex, lastItemPos.itemIndex);
1958 static bool onProcessingByProvider = true;
1959 pItem = static_cast <_TableViewItem*>(__pListModel->LoadItem(itemPos.groupIndex, itemPos.itemIndex));
1960 onProcessingByProvider = false;
1966 Rectangle itemBounds = pItem->GetBounds();
1968 if (itemBounds.y <= scrollPosition && scrollPosition <= (itemBounds.y + itemBounds.height))
1973 if ((itemPos.itemIndex == lastItemPos.itemIndex) && (itemPos.groupIndex == lastItemPos.groupIndex))
1978 } while (GetNextItemPosition(itemPos, itemPos) == true);
1984 _TableViewPresenter::GetPreviousItemPosition(const TableViewItemTag& currentItemPos, TableViewItemTag& prevItem) const
1991 // check validation of group index
1992 if ((currentItemPos.groupIndex < 0) || (currentItemPos.groupIndex >= __pListModel->GetAllGroupCount()))
1997 // if the current item is the first item
1998 if (currentItemPos.groupIndex == 0 && currentItemPos.itemIndex == -1)
2003 if (currentItemPos.itemIndex == -1)
2005 if (__pListModel->IsGroupExpanded(currentItemPos.groupIndex - 1) == false)
2007 prevItem.groupIndex = currentItemPos.groupIndex - 1;
2008 prevItem.itemIndex = -1;
2014 if (__pListModel->IsGroupExpanded(currentItemPos.groupIndex) == false)
2016 if (currentItemPos.groupIndex == 0 && currentItemPos.itemIndex == -1)
2021 prevItem.groupIndex = currentItemPos.groupIndex - 1;
2022 prevItem.itemIndex = __pListModel->GetItemCountInGroup(prevItem.groupIndex) - 1;
2027 if (currentItemPos.itemIndex == -1) // group title item
2029 prevItem.groupIndex = currentItemPos.groupIndex - 1;
2030 prevItem.itemIndex = __pListModel->GetItemCountInGroup(prevItem.groupIndex) - 1;
2034 prevItem.groupIndex = currentItemPos.groupIndex;
2035 prevItem.itemIndex = currentItemPos.itemIndex - 1;
2042 _TableViewPresenter::GetNextItemPosition(const TableViewItemTag& currentItem, TableViewItemTag& nextItem) const
2049 int lastGroup = __pListModel->GetAllGroupCount() - 1;
2050 int lastItemInCurrentGroup = __pListModel->GetItemCountInGroup(currentItem.groupIndex) - 1;
2051 int lastItem = __pListModel->GetItemCountInGroup(lastGroup) - 1;
2053 // check validation of group index
2054 if ((currentItem.groupIndex < 0) || (currentItem.groupIndex > lastGroup))
2059 // if the current item is the last item.
2060 if ((currentItem.groupIndex == lastGroup) && (currentItem.itemIndex == lastItem))
2065 if (__pListModel->IsGroupExpanded(currentItem.groupIndex) == false)
2067 if (currentItem.groupIndex == lastGroup)
2072 nextItem.groupIndex = currentItem.groupIndex + 1;
2073 nextItem.itemIndex = -1;
2078 if (lastItemInCurrentGroup == currentItem.itemIndex)
2080 nextItem.groupIndex = currentItem.groupIndex + 1;
2081 nextItem.itemIndex = -1;
2085 nextItem.groupIndex = currentItem.groupIndex;
2086 nextItem.itemIndex = currentItem.itemIndex + 1;
2093 _TableViewPresenter::GetHeightOfAllItems(void) const
2095 int groupCount = GetGroupCount();
2096 int totalHeight = 0;
2098 for (int i = 0; i < groupCount; i++)
2100 TableViewItemTag itemTag = {i, -1};
2102 totalHeight += GetItemHeight(itemTag);
2104 if (!IsGroupExpanded(i))
2109 int itemCount = GetItemCountAt(i);
2111 for (int j = 0; j < itemCount; j++)
2113 itemTag.itemIndex = j;
2115 totalHeight += GetItemHeight(itemTag);
2123 _TableViewPresenter::SetTableViewItemProviderAdaptor(_TableViewItemProviderAdaptor* pProviderAdaptor)
2125 __pListModel->RegisterItemProviderAdaptor(pProviderAdaptor);
2127 __pProviderAdaptor = pProviderAdaptor;
2130 _TableViewItemProviderAdaptor*
2131 _TableViewPresenter::GetTableViewItemProviderAdaptor(void) const
2133 return __pProviderAdaptor;
2137 _TableViewPresenter::ExpandGroup(int groupIndex, bool withAnimation)
2139 if ((groupIndex < 0) || (groupIndex >= GetGroupCount()))
2141 return E_OUT_OF_RANGE;
2144 if (__modelInitialized == false)
2146 return E_INVALID_STATE;
2149 if (IsGroupExpanded(groupIndex) == true)
2154 TableViewItemTag topTag;
2155 GetTopDrawnItem(topTag);
2157 TableViewItemTag bottomTag;
2158 GetBottomDrawnItem(bottomTag);
2160 int screenPosition = GetScrollPosition();
2162 __pListModel->SetGroupExpandState(groupIndex, true);
2164 int groupTotalHeight = 0;
2165 int itemCount = GetItemCountAt(groupIndex);
2166 _IListItemCommon* pItem = null;
2167 for (int i = 0; i < itemCount; i++)
2169 pItem = __pListModel->GetItemFromTemporaryBuffer(groupIndex, i);
2170 groupTotalHeight += pItem->GetItemHeight();
2173 AdjustClientAreaBounds(false, groupTotalHeight);
2175 if (groupIndex < topTag.groupIndex || groupIndex > bottomTag.groupIndex)
2177 int firstLoadedGroupIndex = -1;
2178 int firstLoadedItemIndex = -1;
2179 __pListModel->GetFirstLoadedItemIndex(firstLoadedGroupIndex, firstLoadedItemIndex);
2181 TableViewItemTag firstLoadedItemTag = {firstLoadedGroupIndex, firstLoadedItemIndex};
2182 _TableViewItem* pItem = FindItem(firstLoadedItemTag);
2185 int itemPositionY = CalculateItemPositionY(firstLoadedItemTag.groupIndex, firstLoadedItemTag.itemIndex);
2187 Rectangle itemBounds = pItem->GetBounds();
2188 itemBounds.y = itemPositionY;
2189 pItem->SetBounds(itemBounds);
2191 AttachNextItemsToBottom(firstLoadedItemTag);
2192 if (groupIndex < topTag.groupIndex)
2194 _ScrollPanelPresenter::ScrollTo(screenPosition + groupTotalHeight);
2201 TableViewItemTag itemTag;
2202 itemTag.groupIndex = groupIndex;
2203 itemTag.itemIndex = -1;
2207 _VisualElement* pVisualElement = __pTableView->GetVisualElement();
2208 String animationName(L"EXPAND_GROUP_ANIMATION");
2209 VisualElementValueAnimation* pExpandGroupAnimation = dynamic_cast<VisualElementValueAnimation*>(pVisualElement->GetAnimationN(animationName));
2211 if (pExpandGroupAnimation != null)
2213 pVisualElement->RemoveAnimation(animationName);
2216 pExpandGroupAnimation = new (std::nothrow) VisualElementValueAnimation();
2217 SysTryReturn(NID_UI_CTRL, pExpandGroupAnimation != null, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
2219 _TableViewItem *pItem = FindItem(itemTag);
2222 delete pExpandGroupAnimation;
2226 Rectangle itemBounds = pItem->GetBounds();
2227 int startPosition = itemBounds.y + itemBounds.height;
2229 int endPosition = startPosition + groupTotalHeight;
2231 if (endPosition > screenPosition + __pTableView->GetBounds().height)
2233 endPosition = screenPosition + __pTableView->GetBounds().height;
2236 pExpandGroupAnimation->SetStartValue(Variant(startPosition));
2237 pExpandGroupAnimation->SetEndValue(Variant(endPosition));
2238 pExpandGroupAnimation->SetDuration(EXPAND_GROUP_ANIMATION_DURATION);
2239 pExpandGroupAnimation->SetTimingFunction(VisualElementAnimation::GetTimingFunctionByName(L"EaseInOut"));
2240 pExpandGroupAnimation->SetVisualElementAnimationStatusEventListener(this);
2241 pExpandGroupAnimation->SetVisualElementAnimationTickEventListener(this);
2242 __expandableItemTag.groupIndex = groupIndex;
2243 __expandableItemTag.itemIndex = -1;
2244 pVisualElement->AddAnimation(animationName, *pExpandGroupAnimation);
2246 delete pExpandGroupAnimation;
2250 LoadItemsToBeVisible(itemTag);
2251 AttachNextItemsToBottom(itemTag);
2252 SetLoadedItemsVisibleInGroup(groupIndex, true);
2254 int currentGroupIndex = -1;
2255 int currentItemIndex = -1;
2256 GetBottomDrawnItemIndex(currentGroupIndex, currentItemIndex);
2258 int lastLoadedGroupIndex = -1;
2259 int lastLoadedItemIndex = -1;
2260 __pListModel->GetLastLoadedItemIndex(lastLoadedGroupIndex, lastLoadedItemIndex);
2262 for (int j = currentGroupIndex; j <= lastLoadedGroupIndex; j++)
2264 int itemCount = GetItemCountAt(j);
2266 for (int i = -1; i < itemCount; i++)
2268 if (i <= currentItemIndex && j == currentGroupIndex)
2282 _TableViewPresenter::CollapseGroup(int groupIndex, bool withAnimation)
2284 if ((groupIndex < 0) || (groupIndex >= GetGroupCount()))
2286 return E_OUT_OF_RANGE;
2289 if (__modelInitialized == false)
2291 return E_INVALID_STATE;
2294 if (IsGroupExpanded(groupIndex) == false)
2299 TableViewItemTag itemTag;
2300 GetTopDrawnItem(itemTag);
2302 TableViewItemTag bottomTag;
2303 GetBottomDrawnItem(bottomTag);
2304 int screenPosition = GetScrollPosition();
2306 __pListModel->SetGroupExpandState(groupIndex, false);
2310 int groupTotalHeight = 0;
2311 int itemCount = GetItemCountAt(groupIndex);
2312 _IListItemCommon* pItem = null;
2313 for (int i = 0; i < itemCount; i++)
2315 pItem = __pListModel->GetItemFromTemporaryBuffer(groupIndex, i);
2316 groupTotalHeight += pItem->GetItemHeight();
2319 if (groupIndex < itemTag.groupIndex || groupIndex > bottomTag.groupIndex)
2321 TableViewItemTag firstLoadedItemTag;
2322 __pListModel->GetFirstLoadedItemIndex(firstLoadedItemTag.groupIndex, firstLoadedItemTag.itemIndex);
2324 if (firstLoadedItemTag.groupIndex == groupIndex)
2326 SetLoadedItemsVisibleInGroup(groupIndex, false);
2327 firstLoadedItemTag.groupIndex = groupIndex + 1;
2328 firstLoadedItemTag.itemIndex = -1;
2331 _TableViewItem* pItem = FindItem(firstLoadedItemTag);
2334 int itemPositionY = CalculateItemPositionY(firstLoadedItemTag.groupIndex, firstLoadedItemTag.itemIndex);
2336 Rectangle itemBounds = pItem->GetBounds();
2337 itemBounds.y = itemPositionY;
2338 pItem->SetBounds(itemBounds);
2340 AttachNextItemsToBottom(firstLoadedItemTag);
2341 if (groupIndex < itemTag.groupIndex)
2343 _ScrollPanelPresenter::ScrollTo(screenPosition - groupTotalHeight);
2347 for (int i = 0; i < itemCount; i++)
2349 UnloadItem(groupIndex, i);
2351 AdjustClientAreaBounds(false, -groupTotalHeight);
2356 if (itemTag.groupIndex < groupIndex)
2358 itemTag.groupIndex = groupIndex;
2359 itemTag.itemIndex = -1;
2362 if(__firstDrawnFlag)
2364 withAnimation = false;
2369 _TableViewItem *pItem = FindItem(itemTag);
2375 _VisualElement* pVisualElement = __pTableView->GetVisualElement();
2376 String animationName(L"COLLAPSE_GROUP_ANIMATION");
2377 VisualElementValueAnimation* pCollapseGroupAnimation = dynamic_cast<VisualElementValueAnimation*>(pVisualElement->GetAnimationN(animationName));
2379 if (pCollapseGroupAnimation != null)
2381 pVisualElement->RemoveAnimation(animationName);
2384 pCollapseGroupAnimation = new (std::nothrow) VisualElementValueAnimation();
2385 SysTryReturn(NID_UI_CTRL, pCollapseGroupAnimation != null, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
2387 Rectangle itemBounds = pItem->GetBounds();
2388 int startPosition = 0;
2389 if (itemTag.itemIndex == -1)
2391 startPosition = itemBounds.y + itemBounds.height;
2395 startPosition = GetScrollPosition();
2398 if (bottomTag.groupIndex > groupIndex)
2400 bottomTag.groupIndex = groupIndex+1;
2401 bottomTag.itemIndex = -1;
2404 pItem = FindItem(bottomTag);
2407 delete pCollapseGroupAnimation;
2412 itemBounds = pItem->GetBounds();
2413 int endPosition = itemBounds.y;
2414 if (bottomTag.groupIndex != groupIndex +1)
2416 endPosition += itemBounds.height;
2418 if (endPosition > screenPosition + __pTableView->GetBounds().height)
2420 endPosition = screenPosition + __pTableView->GetBounds().height;
2423 pCollapseGroupAnimation->SetStartValue(Variant(endPosition));
2424 pCollapseGroupAnimation->SetEndValue(Variant(startPosition));
2425 pCollapseGroupAnimation->SetDuration(COLLAPSE_GROUP_ANIMATION_DURATION);
2426 pCollapseGroupAnimation->SetTimingFunction(VisualElementAnimation::GetTimingFunctionByName(L"EaseInOut"));
2427 pCollapseGroupAnimation->SetVisualElementAnimationStatusEventListener(this);
2428 pCollapseGroupAnimation->SetVisualElementAnimationTickEventListener(this);
2429 __expandableItemTag.groupIndex = itemTag.groupIndex;
2430 __expandableItemTag.itemIndex = itemTag.itemIndex;
2431 pVisualElement->AddAnimation(animationName, *pCollapseGroupAnimation);
2433 delete pCollapseGroupAnimation;
2437 TableViewItemTag nextTag = {groupIndex + 1, -1};
2439 if (itemTag.itemIndex != -1)
2441 int itemPositionY = CalculateItemPositionY(nextTag.groupIndex, nextTag.itemIndex);
2442 _TableViewItem* pNextItem = LoadItem(nextTag.groupIndex, nextTag.itemIndex);
2444 Rectangle itemBounds = pNextItem->GetBounds();
2445 itemBounds.y = itemPositionY;
2446 pNextItem->SetBounds(itemBounds);
2448 AttachNextItemsToBottom(nextTag);
2450 _ScrollPanelPresenter::ScrollTo(itemPositionY);
2454 AttachNextItemsToBottom(itemTag);
2457 LoadItemsToBeVisible(nextTag);
2458 SetLoadedItemsVisibleInGroup(groupIndex, false);
2461 AdjustClientAreaBounds(false, -groupTotalHeight);
2467 _TableViewPresenter::IsGroupExpanded(int groupIndex) const
2469 return __pListModel->IsGroupExpanded(groupIndex);
2473 _TableViewPresenter::LoadAllItemsInGroup(int groupIndex, bool downward)
2475 int itemCountInGroup = __pListModel->GetItemCountInGroup(groupIndex);
2476 _TableViewItem* pItem = null;
2480 for (int i = 0; i < itemCountInGroup; i++)
2482 pItem = LoadItem(groupIndex, i);
2486 SysLogException(NID_UI_CTRL, E_SYSTEM, "[E_SYSTEM] Unable to load item.");
2492 for (int i = itemCountInGroup-1; i >= 0; i--)
2494 pItem = LoadItem(groupIndex, i);
2498 SysLogException(NID_UI_CTRL, E_SYSTEM, "[E_SYSTEM] Unable to load item.");
2503 return itemCountInGroup;
2507 _TableViewPresenter::SetLoadedItemsVisibleInGroup(int groupIndex, bool visible)
2509 int itemCountInGroup = __pListModel->GetItemCountInGroup(groupIndex);
2510 _TableViewItem* pItem = null;
2511 TableViewItemTag itemTag;
2512 itemTag.groupIndex = groupIndex;
2514 int firstLoadedGroupIndex = -1;
2515 int firstLoadedItemIndex = -1;
2516 __pListModel->GetFirstLoadedItemIndex(firstLoadedGroupIndex, firstLoadedItemIndex);
2518 if (firstLoadedGroupIndex > groupIndex)
2524 if (groupIndex == firstLoadedGroupIndex && firstLoadedItemIndex > 0)
2526 startIndex = firstLoadedItemIndex;
2529 for (int i = startIndex; i < itemCountInGroup; i++)
2531 itemTag.itemIndex = i;
2532 pItem = FindItem(itemTag);
2538 pItem->SetVisibleState(visible);
2543 _TableViewPresenter::LoadItemsToBeVisible(const TableViewItemTag& from)
2545 TableViewItemTag bottomTag = from;
2546 TableViewItemTag current;
2547 TableViewItemTag next;
2549 _TableViewItem *pItem = LoadItem(from.groupIndex, from.itemIndex);
2556 Rectangle itemBounds = pItem->GetBounds();
2557 int viewHeight = __pTableView->GetBounds().height;
2558 int scrollPosition = GetScrollPosition();
2559 int itemPosition = itemBounds.y + itemBounds.height - scrollPosition;
2561 while (viewHeight >= itemPosition)
2563 current.groupIndex = bottomTag.groupIndex;
2564 current.itemIndex = bottomTag.itemIndex;
2565 if (!GetNextItemPosition(current, next))
2570 pItem = LoadItem(next.groupIndex, next.itemIndex);
2571 bottomTag.groupIndex = next.groupIndex;
2572 bottomTag.itemIndex = next.itemIndex;
2573 itemPosition += pItem->GetBounds().height;
2580 _TableViewPresenter::AttachNextItemsToBottom(const TableViewItemTag& anchor)
2582 TableViewItemTag itemTag = anchor;
2583 TableViewItemTag current;
2584 TableViewItemTag next;
2586 _TableViewItem *pItem = FindItem(itemTag);
2592 Rectangle itemBounds = pItem->GetBounds();
2593 int itemPosition = itemBounds.y + itemBounds.height;
2595 current.groupIndex = itemTag.groupIndex;
2596 current.itemIndex = itemTag.itemIndex;
2597 while (GetNextItemPosition(current, next))
2599 pItem = FindItem(next);
2606 itemBounds = pItem->GetBounds();
2607 itemBounds.y = itemPosition;
2608 pItem->SetBounds(itemBounds);
2609 itemPosition += itemBounds.height;
2615 _TableViewPresenter::IsAnyItemInGroupLoaded(int groupIndex) const
2617 int startGroupIndex = 0;
2618 int endGroupIndex = 0;
2621 __pListModel->GetFirstLoadedItemIndex(startGroupIndex, index);
2622 __pListModel->GetLastLoadedItemIndex(endGroupIndex, index);
2624 return groupIndex >= startGroupIndex && groupIndex <= endGroupIndex;
2628 _TableViewPresenter::ScrollToHideNonClientArea(TableViewItemTag& bottomTag)
2630 _TableViewItem* pItem = FindItem(bottomTag);
2636 Rectangle itemBounds = pItem->GetBounds();
2637 int viewHeight = __pTableView->GetBounds().height;
2638 int scrollPosition = GetScrollPosition();
2639 int itemBottom = itemBounds.y + itemBounds.height - scrollPosition;
2641 if (itemBottom < viewHeight)
2643 scrollPosition -= viewHeight - itemBottom;
2644 if (scrollPosition < 0)
2649 SetScrollPosition(scrollPosition, false);
2654 _TableViewPresenter::AdjustClientAreaBounds(bool reset, int dist)
2656 int clientHeight = 0;
2660 __itemTotalHeight = GetHeightOfAllItems();
2661 clientHeight = __itemTotalHeight;
2665 __itemTotalHeight = __itemTotalHeight + dist;
2666 clientHeight = __itemTotalHeight;
2669 SetClientAreaHeight(clientHeight);
2673 _TableViewPresenter::SetClientAreaHeight(int height)
2675 Rectangle screenBounds = __pTableView->GetBounds();
2676 Rectangle clientBounds = screenBounds;
2678 clientBounds.height = height;
2680 if (clientBounds.height < screenBounds.height)
2682 clientBounds.height = screenBounds.height;
2685 SetScrollAreaBounds(clientBounds);
2687 _Scroll* pScroll = __pTableView->GetScrollBar();
2688 if (pScroll != null)
2690 pScroll->SetScrollRange(__pTableView->GetBounds().height, clientBounds.height);
2695 _TableViewPresenter::UnloadInvisibleItems(void)
2697 int scrollPosition = GetScrollPosition();
2698 TableViewItemTag itemTag;
2699 __pListModel->GetFirstLoadedItemIndex(itemTag.groupIndex, itemTag.itemIndex);
2701 _TableViewItem* pItem = null;
2704 while ((pItem = FindItem(itemTag)) != null)
2706 if (itemTag.itemIndex != -1)
2708 bounds = pItem->GetBounds();
2709 if (bounds.y + bounds.height < scrollPosition)
2711 UnloadItem(itemTag);
2718 __pListModel->GetFirstLoadedItemIndex(itemTag.groupIndex, itemTag.itemIndex);
2721 __pListModel->GetLastLoadedItemIndex(itemTag.groupIndex, itemTag.itemIndex);
2722 scrollPosition += __pTableView->GetBounds().height;
2724 while ((pItem = FindItem(itemTag)) != null)
2726 if (itemTag.itemIndex != -1)
2728 bounds = pItem->GetBounds();
2729 if (bounds.y > scrollPosition)
2731 UnloadItem(itemTag);
2738 __pListModel->GetLastLoadedItemIndex(itemTag.groupIndex, itemTag.itemIndex);
2744 _TableViewPresenter::ScrollToInternal(int newPosition)
2746 if (!IsScrollEnabled())
2751 int previousScrollPosition = _ScrollPanelPresenter::GetScrollPosition();
2752 int scrollAreaHeight = _ScrollPanelPresenter::GetScrollAreaBounds().height;
2753 int currentScrollPosition = (newPosition < 0) ? 0 : (newPosition > scrollAreaHeight ? scrollAreaHeight : newPosition);
2755 LoadItemWithScrollPosition(previousScrollPosition, currentScrollPosition);
2757 return _ScrollPanelPresenter::ScrollToInternal(newPosition);
2761 _TableViewPresenter::LoadItemWithScrollPosition(int previousScrollPosition, int currentScrollPos)
2765 TableViewItemTag lastLoadedItemPos = {-1, -1};
2766 TableViewItemTag firstLoadedItemPos = {-1, -1};
2767 __pListModel->GetLastLoadedItemIndex(lastLoadedItemPos.groupIndex, lastLoadedItemPos.itemIndex);
2768 __pListModel->GetFirstLoadedItemIndex(firstLoadedItemPos.groupIndex, firstLoadedItemPos.itemIndex);
2770 if (currentScrollPos > previousScrollPosition && lastLoadedItemPos.groupIndex != -1)
2772 _TableViewItem* lastItem = static_cast<_TableViewItem*>(__pListModel->LoadItem(lastLoadedItemPos.groupIndex, lastLoadedItemPos.itemIndex));
2773 if (lastItem == null)
2778 while (lastItem->GetBounds().y <= currentScrollPos + __pTableView->GetBounds().height)
2780 TableViewItemTag nextItemPos = {-1, -1};
2781 if (GetNextItemPosition(lastLoadedItemPos, nextItemPos))
2783 if (nextItemPos.itemIndex == -1)
2785 LoadItem(nextItemPos.groupIndex, nextItemPos.itemIndex);
2787 if (!GetNextItemPosition(nextItemPos, nextItemPos))
2793 if (nextItemPos.groupIndex != -1)
2795 _TableViewItem* item = LoadItem(nextItemPos.groupIndex, nextItemPos.itemIndex);
2797 Rectangle scrollAreaBounds = _ScrollPanelPresenter::GetScrollAreaBounds();
2798 if (item->GetBounds().y + item->GetBounds().height >= scrollAreaBounds.height)
2800 AdjustClientAreaBounds(true);
2809 lastLoadedItemPos = nextItemPos;
2810 lastItem = static_cast<_TableViewItem*>(__pListModel->LoadItem(lastLoadedItemPos.groupIndex, lastLoadedItemPos.itemIndex));
2814 if (currentScrollPos < previousScrollPosition && firstLoadedItemPos.groupIndex != -1)
2816 _TableViewItem* firstItem = static_cast<_TableViewItem*>(__pListModel->LoadItem(firstLoadedItemPos.groupIndex, firstLoadedItemPos.itemIndex));
2817 if (firstItem == null)
2822 while (firstItem->GetBounds().y + firstItem->GetBounds().height >= currentScrollPos)
2824 TableViewItemTag prevItemPos = {-1, -1};
2825 if (GetPreviousItemPosition(firstLoadedItemPos, prevItemPos))
2827 if (prevItemPos.itemIndex == -1)
2829 LoadItem(prevItemPos.groupIndex, prevItemPos.itemIndex);
2831 if (!GetPreviousItemPosition(prevItemPos, prevItemPos))
2837 if (prevItemPos.groupIndex != -1)
2839 LoadItem(prevItemPos.groupIndex, prevItemPos.itemIndex);
2847 firstLoadedItemPos = prevItemPos;
2848 firstItem = static_cast<_TableViewItem*>(__pListModel->LoadItem(firstLoadedItemPos.groupIndex, firstLoadedItemPos.itemIndex));
2854 _TableViewPresenter::ScrollToItem(int groupIndex, int itemIndex, TableViewScrollItemAlignment itemAlignment, int shiftingDistance)
2856 TableViewItemTag itemPos = {groupIndex, itemIndex};
2858 if (!__pListModel->IsLoadedItem(groupIndex, itemIndex))
2860 ResetItemLayout(itemPos);
2863 _TableViewItem* pItem = FindItem(itemPos);
2870 int scrollPosition = pItem->GetBounds().y;
2872 scrollPosition = scrollPosition + shiftingDistance;
2874 SetScrollPosition(scrollPosition, false);
2876 if (itemAlignment == TABLE_VIEW_SCROLL_ITEM_ALIGNMENT_BOTTOM)
2878 SetScrollPosition(scrollPosition - (__pTableView->GetBounds().height - pItem->GetBounds().height), false);
2883 _TableViewPresenter::ScrollByPixel(int scrollDistance)
2886 result r = GetLastResult();
2887 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
2889 ScrollTo(scrollDistance + GetScrollPosition());
2890 r = GetLastResult();
2891 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
2893 RollbackBouncing(true);
2894 r = GetLastResult();
2895 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
2898 r = GetLastResult();
2899 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
2905 _TableViewPresenter::SetScrollEnabled(bool enable)
2907 __scrolling = enable;
2911 _TableViewPresenter::IsScrollEnabled(void) const
2917 _TableViewPresenter::GetFirstDrawnFlag(void) const
2919 return __firstDrawnFlag;
2923 _TableViewPresenter::GetMaxItemCachingSize(void) const
2925 return __pListModel->GetMaxCachingSize();
2929 _TableViewPresenter::ResetSweepItem(void)
2931 if (__sweptItemTag.groupIndex != -1 && __sweptItemTag.itemIndex != -1)
2938 _TableViewPresenter::GetPressedItemCount(void)
2940 _TableViewItem* pItem = null;
2941 TableViewItemTag itemPos = {-1, -1};
2942 TableViewItemTag lastItemPos = {-1, -1};
2945 __pListModel->GetFirstLoadedItemIndex(itemPos.groupIndex, itemPos.itemIndex);
2946 __pListModel->GetLastLoadedItemIndex(lastItemPos.groupIndex, lastItemPos.itemIndex);
2950 pItem = static_cast <_TableViewItem*>(__pListModel->LoadItem(itemPos.groupIndex, itemPos.itemIndex));
2956 if (pItem->GetDrawingStatus() == TABLE_VIEW_ITEM_DRAWING_STATUS_PRESSED)
2961 if ((itemPos.itemIndex == lastItemPos.itemIndex) && (itemPos.groupIndex == lastItemPos.groupIndex))
2965 } while (GetNextItemPosition(itemPos, itemPos) == true);
2971 _TableViewPresenter::CalculateItemPositionY(int groupIndex, int itemIndex)
2973 TableViewItemTag itemPos = {-1, -1};
2974 TableViewItemTag currentItemPos = {-1, -1};
2977 GetFirstItem(itemPos);
2979 if (itemPos.groupIndex == -1 && itemPos.itemIndex == -1)
2984 if (__pProviderAdaptor == null)
2989 positionY = GetTopMargin();
2991 while ((itemPos.groupIndex < groupIndex) || ((itemPos.groupIndex == groupIndex) && (itemPos.itemIndex < itemIndex)))
2993 currentItemPos = itemPos;
2995 int itemHeight = GetItemHeight(itemPos);
2997 positionY += itemHeight;
2999 if (!GetNextItemPosition(currentItemPos, itemPos))
3009 _TableViewPresenter::FadeInScrollBar(void)
3011 TableViewScrollBarStyle scrollStyle = __pTableView->GetScrollStyle();
3013 if (scrollStyle == TABLE_VIEW_SCROLL_BAR_STYLE_NONE)
3015 _Scroll* pScroll = __pTableView->GetScrollBar();
3017 if (pScroll != null)
3019 pScroll->SetVisibleState(false);
3022 else if (scrollStyle == TABLE_VIEW_SCROLL_BAR_STYLE_FAST_SCROLL)
3024 _Scroll* pScroll = __pTableView->GetScrollBar();
3026 if (pScroll != null)
3028 pScroll->SetVisibleState(false);
3031 _FastScroll* pFastScroll = __pTableView->GetFastScrollBar();
3033 if (pFastScroll != null)
3035 pFastScroll->SetScrollVisibility(true);
3040 _ScrollPanelPresenter::FadeInScrollBar();
3045 _TableViewPresenter::FadeOutScrollBar(void)
3047 TableViewScrollBarStyle scrollStyle = __pTableView->GetScrollStyle();
3048 if (scrollStyle == TABLE_VIEW_SCROLL_BAR_STYLE_FAST_SCROLL)
3050 StopFastScrollTimer();
3052 if (!_ScrollPanelPresenter::IsScrollAnimationRunning())
3054 StartFastScrollTimer();
3057 else if (scrollStyle != TABLE_VIEW_SCROLL_BAR_STYLE_FIXED)
3059 _ScrollPanelPresenter::FadeOutScrollBar();
3064 _TableViewPresenter::SweepItem(int x)
3068 _TableViewItem* pItem = static_cast<_TableViewItem*>(__pListModel->LoadItem(__sweptItemTag.groupIndex, __sweptItemTag.itemIndex));
3072 _TableViewItem* pContextItem = pItem->GetContextItem();
3074 if (pContextItem != null)
3076 int currentPosition = __sweptItemPosition.x + x;
3077 int sweepDistance = __pTableView->GetBounds().width;
3078 int sweepMargin = 0;
3079 int contextItemWidth = pItem->GetBounds().width;
3080 bool activated = pItem->IsContextItemActivated();
3081 bool needToFireEvent = false;
3083 GET_SHAPE_CONFIG(TABLEVIEW::CONTEXTITEM_RIGHT_MARGIN, _CONTROL_ORIENTATION_PORTRAIT, sweepMargin);
3085 if (currentPosition >= (sweepDistance - sweepMargin))
3087 currentPosition = (sweepDistance - sweepMargin);
3088 needToFireEvent = !activated;
3090 else if (currentPosition <= __leftMargin)
3092 currentPosition = __leftMargin;
3093 needToFireEvent = activated;
3096 __sweptItemPosition.x = currentPosition;
3098 // Set TableViewItem bounds
3099 pItem->SetPosition(__sweptItemPosition);
3101 // Set TableViewContextItem bounds
3102 if (!__pTableView->IsAncestorOf(*pContextItem))
3104 pContextItem->SetDrawingProperty(__pItemDrawingProperty);
3105 __pTableView->InsertChildToBottom(*pContextItem);
3108 contextItemWidth = ((contextItemWidth > (__sweptItemPosition.x - __leftMargin)) ? (__sweptItemPosition.x - __leftMargin) : contextItemWidth);
3110 pContextItem->ExposeContextItem(Rectangle(__leftMargin, __sweptItemPosition.y, contextItemWidth, pContextItem->GetSize().height), pItem->GetSize().width);
3112 if (needToFireEvent)
3114 activated = !activated; // ContextItem Activation State Changed
3116 __pTableView->FireTableViewContextItemActivationEvent(__sweptItemTag.groupIndex, __sweptItemTag.itemIndex, pContextItem, activated);
3117 pItem->SetContextItemActivation(activated);
3130 _TableViewPresenter::ResetSweptItem(void)
3132 _TableViewItem* pItem = static_cast<_TableViewItem*>(__pListModel->LoadItem(__sweptItemTag.groupIndex, __sweptItemTag.itemIndex));
3136 pItem->SetPosition(Point(__leftMargin, __sweptItemPosition.y));
3138 _TableViewItem* pContextItem = pItem->GetContextItem();
3139 if (pContextItem != null)
3141 if (__pTableView->IsAncestorOf(*pContextItem))
3143 __pTableView->DetachChild(*pContextItem);
3146 if (pItem->IsContextItemActivated())
3148 __pTableView->FireTableViewContextItemActivationEvent(__sweptItemTag.groupIndex, __sweptItemTag.itemIndex, pContextItem, false);
3149 pItem->SetContextItemActivation(false);
3154 __sweptItemTag.itemIndex = -1;
3155 __sweptItemTag.groupIndex = -1;
3157 __sweptItemPosition.SetPosition(-1, -1);
3158 __sweepOccured = false;
3162 _TableViewPresenter::AdjustSweptItemPosition(bool withAnimation)
3164 int itemWidth = __pTableView->GetBounds().width;
3165 int sweepDistance = 0;
3167 if (__sweptItemPosition.x == __leftMargin)
3173 int sweepMargin = 0;
3174 GET_SHAPE_CONFIG(TABLEVIEW::CONTEXTITEM_RIGHT_MARGIN, _CONTROL_ORIENTATION_PORTRAIT, sweepMargin);
3176 if (__sweptItemPosition.x > (itemWidth - sweepMargin) / 2)
3178 sweepDistance = itemWidth - __sweptItemPosition.x;
3182 sweepDistance = -__sweptItemPosition.x;
3187 SweepItem(sweepDistance);
3191 _TableViewItem* pItem = static_cast<_TableViewItem*>(__pListModel->LoadItem(__sweptItemTag.groupIndex, __sweptItemTag.itemIndex));
3195 VisualElementValueAnimation* pAnimation = null;
3196 _VisualElement* pVisualElement = __pTableView->GetVisualElement();
3198 if (pVisualElement != null)
3200 int startValue = __sweptItemPosition.x;
3201 int endValue = ((sweepDistance > 0) ? (itemWidth - sweepMargin) : __leftMargin);
3203 pVisualElement->SetImplicitAnimationEnabled(false);
3205 String animationName(L"SWEEP_ITEM_ANIMATION");
3206 pAnimation = dynamic_cast<VisualElementValueAnimation*>(pVisualElement->GetAnimationN(animationName));
3208 if (pAnimation != null)
3210 pVisualElement->RemoveAnimation(animationName);
3213 pAnimation = new (std::nothrow) VisualElementValueAnimation();
3214 SysTryReturnVoidResult(NID_UI_CTRL, pAnimation != null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
3216 pAnimation->SetStartValue(Variant(startValue));
3217 pAnimation->SetEndValue(Variant(endValue));
3218 pAnimation->SetTimingFunction(VisualElementAnimation::GetTimingFunctionByName(L"EaseInOut"));
3219 pAnimation->SetDuration(SWEEP_ITEM_ANIMATION_DURATION);
3220 pAnimation->SetVisualElementAnimationStatusEventListener(this);
3221 pAnimation->SetVisualElementAnimationTickEventListener(this);
3223 pVisualElement->AddAnimation(animationName, *pAnimation);
3232 _TableViewPresenter::AdjustLoadedItemWidth(void)
3234 TableViewItemTag lastLoadedItemPos = {-1, -1};
3235 TableViewItemTag firstLoadedItemPos = {-1, -1};
3236 __pListModel->GetLastLoadedItemIndex(lastLoadedItemPos.groupIndex, lastLoadedItemPos.itemIndex);
3237 __pListModel->GetFirstLoadedItemIndex(firstLoadedItemPos.groupIndex, firstLoadedItemPos.itemIndex);
3241 _TableViewItem* pItem = FindItem(firstLoadedItemPos);
3248 Dimension itemSize = pItem->GetSize();
3249 itemSize.width = __pProviderAdaptor->GetListWidth();
3251 pItem->SetItemChanged(true);
3252 pItem->SetSize(itemSize);
3254 if ((firstLoadedItemPos.itemIndex == lastLoadedItemPos.itemIndex) && (firstLoadedItemPos.groupIndex == lastLoadedItemPos.groupIndex))
3258 } while (GetNextItemPosition(firstLoadedItemPos, firstLoadedItemPos));
3262 _TableViewPresenter::IsValidDrawnItem(int groupIndex, int itemIndex)
3264 TableViewItemTag currentItemTag = {groupIndex, itemIndex};
3265 TableViewItemTag itemTag = {-1, -1};
3267 if (GetNextItemPosition(currentItemTag, itemTag))
3269 if (__pListModel->IsLoadedItem(itemTag.groupIndex, itemTag.itemIndex))
3275 if (GetPreviousItemPosition(currentItemTag, itemTag))
3277 if (__pListModel->IsLoadedItem(itemTag.groupIndex, itemTag.itemIndex))
3288 _TableViewPresenter::GetTableViewItemPosition(_TableViewItem& item, TableViewItemTag& itemTag)
3290 TableViewItemTag lastLoadedItemPos = {-1, -1};
3291 TableViewItemTag firstLoadedItemPos = {-1, -1};
3292 __pListModel->GetLastLoadedItemIndex(lastLoadedItemPos.groupIndex, lastLoadedItemPos.itemIndex);
3293 __pListModel->GetFirstLoadedItemIndex(firstLoadedItemPos.groupIndex, firstLoadedItemPos.itemIndex);
3295 _TableViewItem* pCurrentItem = null;
3298 pCurrentItem = static_cast<_TableViewItem*>(__pListModel->LoadItem(firstLoadedItemPos.groupIndex, firstLoadedItemPos.itemIndex));
3299 if (pCurrentItem == &item)
3301 itemTag.groupIndex = firstLoadedItemPos.groupIndex;
3302 itemTag.itemIndex = firstLoadedItemPos.itemIndex;
3306 if ((firstLoadedItemPos.itemIndex == lastLoadedItemPos.itemIndex) && (firstLoadedItemPos.groupIndex == lastLoadedItemPos.groupIndex))
3310 } while (GetNextItemPosition(firstLoadedItemPos, firstLoadedItemPos));
3316 _TableViewPresenter::GetItemHeight(TableViewItemTag itemTag) const
3320 if (__pTableView->GetTableViewStyle() == TABLE_VIEW_STYLE_SECTION && itemTag.itemIndex != -1)
3322 if (HasSectionFooter(itemTag.groupIndex))
3324 if (itemTag.itemIndex == GetItemCountAt(itemTag.groupIndex) - 1)
3326 GET_SHAPE_CONFIG(TABLEVIEW::GROUPITEM_DEFAULT_HEIGHT, _CONTROL_ORIENTATION_PORTRAIT, itemHeight);
3333 if (__pProviderAdaptor == null)
3339 for (int i = 0; i < itemTag.groupIndex; i++)
3341 int itemCount = GetItemCountAt(i);
3343 startIndex = startIndex + itemCount + 1;
3346 itemTag.itemIndex++;
3347 itemTag.itemIndex = startIndex + itemTag.itemIndex;
3349 __itemHeightList.GetAt(itemTag.itemIndex, itemHeight);
3355 _TableViewPresenter::SetItemHeight(TableViewItemTag itemTag, int height)
3359 for (int i = 0; i < itemTag.groupIndex; i++)
3361 int itemCount = GetItemCountAt(i);
3363 startIndex = startIndex + itemCount + 1;
3366 itemTag.itemIndex++;
3367 itemTag.itemIndex = startIndex + itemTag.itemIndex;
3370 __itemHeightList.GetAt(itemTag.itemIndex, oldHeight);
3371 __itemHeightList.SetAt(height, itemTag.itemIndex);
3378 _TableViewPresenter::SetReorderMode(bool enabled)
3382 __reorderInfo.itemIndex = -1;
3383 __reorderInfo.groupIndex = -1;
3385 _TableViewItem* pItem = null;
3386 TableViewItemTag itemPos = {-1, -1};
3387 TableViewItemTag lastItemPos = {-1, -1};
3389 __pListModel->GetFirstLoadedItemIndex(itemPos.groupIndex, itemPos.itemIndex);
3390 __pListModel->GetLastLoadedItemIndex(lastItemPos.groupIndex, lastItemPos.itemIndex);
3394 pItem = FindItem(itemPos);
3398 pItem->SetReorderMode(enabled);
3400 if (pItem->GetDrawingStatus() == TABLE_VIEW_ITEM_DRAWING_STATUS_PRESSED)
3402 if (SelectReorderItem(itemPos.groupIndex, itemPos.itemIndex))
3404 Point itemPosition = pItem->GetPosition();
3405 Point touchPosition = pItem->GetLastTouchPressedPosition();
3407 __reorderInfo.touchPressedPositionY = itemPosition.y + touchPosition.y - GetScrollPosition();
3408 __reorderInfo.blockedTouchReleaseState = true;
3413 if ((itemPos.itemIndex == lastItemPos.itemIndex) && (itemPos.groupIndex == lastItemPos.groupIndex))
3418 } while (GetNextItemPosition(itemPos, itemPos) == true);
3424 _TableViewPresenter::SelectReorderItem(int groupIndex, int itemIndex)
3426 if (itemIndex == -1 || GetPressedItemCount() > 0)
3431 TableViewItemTag itemPos = {groupIndex, itemIndex};
3432 _TableViewItem* pItem = FindItem(itemPos);
3439 pItem->SetDrawingStatus(TABLE_VIEW_ITEM_DRAWING_STATUS_PRESSED);
3440 pItem->SetItemChanged(true);
3441 pItem->Invalidate();
3443 __reorderInfo.itemBounds = pItem->GetBounds();
3444 __reorderInfo.itemIndex = itemIndex;
3445 __reorderInfo.groupIndex = groupIndex;
3446 __reorderInfo.originGroupIndex = groupIndex;
3447 __reorderInfo.originItemIndex = itemIndex;
3448 __reorderInfo.itemBasisPositionY = __reorderInfo.itemBounds.y;
3450 Tizen::System::SystemTime::GetTicks(__reorderInfo.touchPressedTick);
3452 pItem->GetVisualElement()->SetZOrder(null, true);
3454 if (GetScrollAreaBounds().height < __pTableView->GetBounds().height)
3456 int itemHeight = pItem->GetBounds().height;
3458 __pListModel->GetLastLoadedItemIndex(itemPos.groupIndex, itemPos.itemIndex);
3460 pItem = FindItem(itemPos);
3464 Rectangle itemBounds = pItem->GetBounds();
3465 __reorderInfo.nonScrollableLimitArea = itemBounds.y + itemBounds.height - itemHeight;
3470 __reorderInfo.nonScrollableLimitArea = 0;
3477 _TableViewPresenter::ResetReorderItem(int groupIndex, int itemIndex)
3479 TableViewItemTag itemPos = {groupIndex, itemIndex};
3480 _TableViewItem* pItem = FindItem(itemPos);
3487 pItem->SetDrawingStatus(TABLE_VIEW_ITEM_DRAWING_STATUS_NORMAL);
3488 pItem->SetItemChanged(true);
3489 pItem->Invalidate();
3491 Point position = Point(__reorderInfo.itemBounds.x, __reorderInfo.itemBounds.y);
3492 pItem->SetPosition(position);
3494 if (__reorderInfo.originGroupIndex != __reorderInfo.groupIndex || __reorderInfo.originItemIndex != __reorderInfo.itemIndex)
3496 if (__pTableView->GetTableViewStyle() == TABLE_VIEW_STYLE_SIMPLE)
3498 __pTableView->FireTableViewItemReorderEvent(__reorderInfo.originItemIndex, __reorderInfo.itemIndex);
3500 else if (__pTableView->GetTableViewStyle() == TABLE_VIEW_STYLE_GROUPED)
3502 __pTableView->FireTableViewItemReorderEvent(__reorderInfo.originGroupIndex, __reorderInfo.originItemIndex, __reorderInfo.groupIndex, __reorderInfo.itemIndex);
3506 __reorderInfo.groupIndex = -1;
3507 __reorderInfo.itemIndex = -1;
3508 __reorderInfo.originGroupIndex = -1;
3509 __reorderInfo.originItemIndex = -1;
3510 __reorderInfo.nonScrollableLimitArea = 0;
3512 StopReorderScrollTimer();
3518 _TableViewPresenter::CheckReorderItemScrollAnimation(_TableViewItem *pItem)
3520 int currentScrollPosition = GetScrollPosition();
3521 int limitTopPositionY = currentScrollPosition;
3522 int limitBottomPositionY = currentScrollPosition + __pTableView->GetBounds().height - __reorderInfo.itemBounds.height;
3524 int itemPositionY = pItem->GetPosition().y;
3526 if (itemPositionY < limitTopPositionY)
3528 if (__pReorderScrollTimer == null)
3530 __reorderInfo.isScrollDirectionUp = true;
3535 else if (itemPositionY > limitBottomPositionY)
3537 if (__pReorderScrollTimer == null)
3539 __reorderInfo.isScrollDirectionUp = false;
3549 _TableViewPresenter::DragSelectedItem(int distance, bool relativeCoordinate)
3551 TableViewItemTag itemPos = {__reorderInfo.groupIndex, __reorderInfo.itemIndex};
3552 _TableViewItem* pItem = FindItem(itemPos);
3559 if (__firstTouchMoved)
3561 long long currentTick = 0;
3562 Tizen::System::SystemTime::GetTicks(currentTick);
3564 if (currentTick - __reorderInfo.touchPressedTick < REORDER_TOUCH_UIACTIVATE_DURATION)
3569 __firstTouchMoved = false;
3572 Point itemPosition = pItem->GetPosition();
3574 if (relativeCoordinate)
3576 itemPosition.y = __reorderInfo.itemBasisPositionY + distance;
3580 itemPosition.y += distance;
3582 __reorderInfo.itemBasisPositionY += distance;
3585 if (itemPosition.y < 0)
3590 int scrollAreaHeight = GetScrollAreaBounds().height;
3591 int screenHeight = __pTableView->GetBounds().height;
3592 int limitBottomPositionY = 0;
3594 if (scrollAreaHeight < screenHeight)
3596 limitBottomPositionY = __reorderInfo.nonScrollableLimitArea;
3600 limitBottomPositionY = scrollAreaHeight - __reorderInfo.itemBounds.height;
3603 if (itemPosition.y > limitBottomPositionY)
3605 itemPosition.y = limitBottomPositionY;
3608 pItem->SetPosition(itemPosition);
3611 if (CheckReorderItemScrollAnimation(pItem))
3613 if (__pReorderScrollTimer == null)
3615 StartReorderScrollTimer();
3620 if (__pReorderScrollTimer != null)
3622 StopReorderScrollTimer();
3627 TableViewItemTag moveItemTag = {-1, -1};
3629 if (CheckReorderItemPosition(pItem, moveItemTag))
3631 if (moveItemTag.itemIndex == -1)
3633 int destGroupIndex = moveItemTag.groupIndex;
3635 if (destGroupIndex != 0 && destGroupIndex == __reorderInfo.groupIndex)
3640 if (moveItemTag.groupIndex == 0 || !__pProviderAdaptor->IsReorderable(__reorderInfo.groupIndex, destGroupIndex))
3642 // ResetReorderItem(__reorderInfo.groupIndex, __reorderInfo.itemIndex);
3643 // itemPosition = pItem->GetPosition();
3645 // _TableViewItem* pGroupItem = FindItem(moveItemTag);
3647 // if (pGroupItem == null)
3652 // Rectangle groupItemBounds = pGroupItem->GetBounds();
3654 // if (__reorderInfo.groupIndex < moveItemTag.groupIndex)
3656 // itemPosition.y = groupItemBounds.y - pItem->GetItemHeight();
3660 // itemPosition.y = groupItemBounds.y + groupItemBounds.height;
3667 ReorderItem(moveItemTag.groupIndex, moveItemTag.itemIndex);
3674 _TableViewPresenter::CheckReorderItemPosition(_TableViewItem* pItem, TableViewItemTag& reorderItemTag)
3676 TableViewItemTag currentItemTag = {__reorderInfo.groupIndex, __reorderInfo.itemIndex};
3677 TableViewItemTag previousItemTag = {-1, -1};
3678 TableViewItemTag nextItemTag = {-1, -1};
3680 Rectangle itemBounds = pItem->GetBounds();
3682 if (GetPreviousItemPosition(currentItemTag, previousItemTag))
3684 _TableViewItem* pPreviousItem = FindItem(previousItemTag);
3686 if (pPreviousItem != null)
3688 Rectangle previousItemBounds = pPreviousItem->GetBounds();
3690 if (itemBounds.y < previousItemBounds.y + (previousItemBounds.height / 2))
3692 //return previousItemIndex;
3693 reorderItemTag.groupIndex = previousItemTag.groupIndex;
3694 reorderItemTag.itemIndex = previousItemTag.itemIndex;
3701 if (GetNextItemPosition(currentItemTag, nextItemTag))
3703 _TableViewItem* pNextItem = FindItem(nextItemTag);
3705 if (pNextItem != null)
3707 Rectangle nextItemBounds = pNextItem->GetBounds();
3709 if (itemBounds.y + itemBounds.height > nextItemBounds.y + (nextItemBounds.height / 2))
3711 //return nextItemIndex;
3712 reorderItemTag.groupIndex = nextItemTag.groupIndex;
3713 reorderItemTag.itemIndex = nextItemTag.itemIndex;
3720 reorderItemTag.groupIndex = -1;
3721 reorderItemTag.itemIndex = -1;
3727 _TableViewPresenter::ReorderItem(int destinationGroupIndex, int destinationItemIndex)
3729 TableViewItemTag itemPos = {destinationGroupIndex, destinationItemIndex};
3731 _TableViewItem* pItem = FindItem(itemPos);
3738 if (pItem->IsAnimationPlaying())
3743 Rectangle destinationItemBounds = pItem->GetBounds();
3745 Point destinationItemPosition = Point(destinationItemBounds.x, 0);
3747 if ( __reorderInfo.itemIndex > destinationItemIndex && __reorderInfo.groupIndex == destinationGroupIndex)
3749 destinationItemPosition.y = __reorderInfo.itemBounds.y + __reorderInfo.itemBounds.height - destinationItemBounds.height;
3750 __reorderInfo.itemBounds.y = destinationItemBounds.y;
3752 if (destinationItemIndex == -1)
3754 destinationGroupIndex--;
3755 int itemCount = GetItemCountAt(destinationGroupIndex);
3756 destinationItemIndex = itemCount;
3761 destinationItemPosition.y = __reorderInfo.itemBounds.y;
3762 __reorderInfo.itemBounds.y = destinationItemBounds.y + destinationItemBounds.height - __reorderInfo.itemBounds.height;
3764 if (destinationItemIndex == -1)
3766 destinationItemIndex = 0;
3770 _ListItemPos originPosition = {__reorderInfo.groupIndex, __reorderInfo.itemIndex};
3771 _ListItemPos destinationPosition = {destinationGroupIndex, destinationItemIndex};
3773 __pListModel->MoveItem(originPosition, destinationPosition);
3775 if (!pItem->MoveItem(destinationItemPosition, REORDER_ITEM_MOVE_ANIMATION_DURATION, 0))
3777 pItem->SetPosition(destinationItemPosition);
3780 __reorderInfo.itemIndex = destinationItemIndex;
3781 __reorderInfo.groupIndex = destinationGroupIndex;
3787 _TableViewPresenter::StartReorderScrollTimer(void)
3789 StopReorderScrollTimer();
3791 __pReorderScrollTimer = new (std::nothrow) Tizen::Base::Runtime::Timer;
3792 SysTryReturnVoidResult(NID_UI_CTRL, __pReorderScrollTimer != null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
3794 result r = __pReorderScrollTimer->Construct(*this);
3795 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
3797 r = __pReorderScrollTimer->Start(REORDER_SCROLL_ANIMATION_TIMER_DURATION);
3798 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
3803 StopReorderScrollTimer();
3807 _TableViewPresenter::StopReorderScrollTimer(void)
3809 delete __pReorderScrollTimer;
3810 __pReorderScrollTimer = null;
3815 _TableViewPresenter::UpdateLayout(void)
3821 _TableViewPresenter::CheckItemHeightAndRefreshLayout(TableViewItemTag itemTag, bool downScroll)
3823 _TableViewItem* pItem = FindItem(itemTag);
3830 if (pItem->IsAnimationPlaying())
3835 Rectangle itemBounds = pItem->GetBounds();
3837 if (GetItemHeight(itemTag) == itemBounds.height)
3842 int newHeight = itemBounds.height;
3843 int originHeight = SetItemHeight(itemTag, newHeight);
3844 int dist = newHeight - originHeight;
3846 AdjustClientAreaBounds(false, dist);
3850 itemBounds.y += dist;
3851 pItem->SetBounds(itemBounds);
3854 AttachNextItemsToBottom(itemTag);
3860 _TableViewPresenter::CreateItemHeightList(void)
3862 int groupCount = GetGroupCount();
3863 int defaultItemHeight = __pProviderAdaptor->GetDefaultItemHeight();
3864 int defaultGroupItemHeight = __pProviderAdaptor->GetDefaultGroupItemHeight();
3866 result r = __itemHeightList.SetCapacity(GetItemCount());
3867 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");
3869 for (int i = 0; i < groupCount; i++)
3871 int itemCount = GetItemCountAt(i);
3873 if (__pTableView->GetTableViewStyle() == TABLE_VIEW_STYLE_SIMPLE)
3875 __itemHeightList.Add(0);
3879 __itemHeightList.Add(defaultGroupItemHeight);
3882 for (int j = 1; j <= itemCount; j++)
3884 __itemHeightList.Add(defaultItemHeight);
3891 DeleteItemHeightList();
3897 _TableViewPresenter::RefreshItemHeightList(int groupIndex, int itemIndex, TableViewRefreshType refreshType)
3899 int defaultItemHeight = __pProviderAdaptor->GetDefaultItemHeight();
3900 int defaultGroupItemHeight = __pProviderAdaptor->GetDefaultGroupItemHeight();
3903 for (int i = 0; i < groupIndex; i++)
3905 int itemCount = GetItemCountAt(i);
3906 startIndex = startIndex + itemCount + 1;
3909 int targetIndex = startIndex + itemIndex + 1;
3911 if (refreshType == TABLE_VIEW_REFRESH_TYPE_ITEM_ADD)
3913 if (itemIndex == -1)
3915 result r = __itemHeightList.SetCapacity(GetItemCount());
3916 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, false, r, "[%s] Propagating.", GetErrorMessage(r));
3918 int itemCount = GetItemCountAt(groupIndex);
3919 for (int i = 0; i < itemCount; i++)
3921 __itemHeightList.InsertAt(defaultItemHeight, targetIndex);
3924 __itemHeightList.InsertAt(defaultGroupItemHeight, targetIndex);
3929 __itemHeightList.InsertAt(defaultItemHeight, targetIndex);
3932 else if (refreshType == TABLE_VIEW_REFRESH_TYPE_ITEM_REMOVE)
3934 if (itemIndex == -1)
3936 int itemCount = GetItemCountAt(groupIndex) + 1;
3938 for (int i = 0; i < itemCount; i++)
3940 __itemHeightList.RemoveAt(targetIndex);
3945 __itemHeightList.RemoveAt(targetIndex);
3953 _TableViewPresenter::CaptureAndStartRemoveItemAnimation(int groupIndex, int itemIndex)
3955 TableViewItemTag itemTag = {groupIndex, itemIndex};
3956 _TableViewItem* pItem = FindItem(itemTag);
3963 Rectangle itemBounds = pItem->GetBounds();
3964 result r = E_SUCCESS;
3966 _VisualElement* pVisualElement = null;
3967 VisualElementValueAnimation* pAnimation = null;
3968 Canvas* pCanvas = null;
3970 Dimension startValue(100, itemBounds.height);
3971 Dimension endValue(0, 0);
3973 Tizen::Graphics::Bitmap* pBitmap = pItem->GetCapturedBitmapN(true);
3975 if (pBitmap == null)
3981 pVisualElement = new (std::nothrow) _VisualElement();
3982 SysTryCatch(NID_UI_CTRL, pVisualElement != null, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
3984 r = pVisualElement->Construct();
3985 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
3987 pVisualElement->SetImplicitAnimationEnabled(false);
3988 pVisualElement->SetSurfaceOpaque(false);
3989 pVisualElement->SetBounds(FloatRectangle(itemBounds.x, itemBounds.y, itemBounds.width, itemBounds.height));
3990 pVisualElement->SetShowState(true);
3992 GetView()->GetVisualElement()->AttachChild(*pVisualElement);
3994 pCanvas = pVisualElement->GetCanvasN();
3995 SysTryCatch(NID_UI_CTRL, pCanvas != null, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
3998 pCanvas->DrawBitmap(Rectangle(0, 0, itemBounds.width, itemBounds.height), *pBitmap);
4000 pAnimation = new (std::nothrow) VisualElementValueAnimation();
4001 SysTryCatch(NID_UI_CTRL, pAnimation != null, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
4003 pAnimation->SetTimingFunction(VisualElementAnimation::GetTimingFunctionByName(L"EaseIn"));
4004 pAnimation->SetDuration(REMOVE_ITEM_MOVE_ANIMATION_DURATION);
4005 pAnimation->SetDelay(0);
4006 pAnimation->SetStartValue(Variant(startValue));
4007 pAnimation->SetEndValue(Variant(endValue));
4008 pAnimation->SetVisualElementAnimationStatusEventListener(GetView());
4009 pAnimation->SetVisualElementAnimationTickEventListener(GetView());
4011 r = pVisualElement->AddAnimation(L"RemoveTableViewItem", *pAnimation);
4012 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
4023 pVisualElement->Destroy();
4027 _TableViewPresenter::DeleteItemHeightList(void)
4029 __itemHeightList.RemoveAll();
4033 _TableViewPresenter::GetTableViewItemFromControl(const _Control& source)
4035 _Control* currentControl = const_cast<_Control*>(&source);
4036 _TableViewItem* pItem = null;
4038 while (__pTableView != currentControl)
4040 pItem = dynamic_cast<_TableViewItem*>(currentControl);
4042 if ((pItem != null) || (currentControl == null))
4047 currentControl = currentControl->GetParent();
4054 _TableViewPresenter::SetLoadedItemsVisibleFromPosition(int position, bool visible)
4056 _TableViewItem* pItem;
4057 Rectangle itemBounds;
4058 TableViewItemTag current;
4059 current.groupIndex = __expandableItemTag.groupIndex;
4060 current.itemIndex = __expandableItemTag.itemIndex;
4062 int itemCountInGroup = __pListModel->GetItemCountInGroup(__expandableItemTag.groupIndex);
4064 for (int i = 0; i < itemCountInGroup; i++)
4066 current.itemIndex = i;
4070 pItem = LoadItem(current.groupIndex, current.itemIndex);
4074 pItem = FindItem(current);
4082 itemBounds = pItem->GetBounds();
4086 pItem->SetVisibleState(visible);
4087 pItem->GetVisualElement()->SetZOrder(null, false);
4089 if (position < itemBounds.y + itemBounds.height)
4096 if (position < itemBounds.y)
4098 UnloadItem(current);
4105 _TableViewPresenter::MoveLoadedItemsFromPosition(int position)
4107 Rectangle itemBounds;
4108 int itemPosition = position;
4110 TableViewItemTag current;
4111 TableViewItemTag next;
4113 current.groupIndex = __expandableItemTag.groupIndex;
4114 current.itemIndex = __pListModel->GetItemCountInGroup(__expandableItemTag.groupIndex) -1;
4116 int screenPosition = GetScrollPosition();
4117 Rectangle screenBounds = __pTableView->GetBounds();
4118 screenPosition += screenBounds.height;
4120 _TableViewItem* pItem = null;
4121 while (GetNextItemPosition(current, next))
4123 if (screenPosition > itemPosition)
4125 pItem = LoadItem(next.groupIndex, next.itemIndex);
4129 pItem = FindItem(next);
4137 itemBounds = pItem->GetBounds();
4138 itemBounds.y = itemPosition;
4139 pItem->SetBounds(itemBounds);
4140 itemPosition += itemBounds.height;
4147 _TableViewPresenter::OnVisualElementAnimationStarted(const Tizen::Ui::Animations::VisualElementAnimation& animation, const Tizen::Base::String& keyName, Tizen::Ui::Animations::VisualElement& target)
4149 if (keyName == L"RemoveTableViewItem")
4153 _ScrollPanelPresenter::OnVisualElementAnimationStarted(animation, keyName, target);
4157 _TableViewPresenter::OnVisualElementAnimationRepeated(const Tizen::Ui::Animations::VisualElementAnimation& animation, const Tizen::Base::String& keyName, Tizen::Ui::Animations::VisualElement& target, long currentRepeatCount)
4159 if (keyName == L"RemoveTableViewItem")
4163 _ScrollPanelPresenter::OnVisualElementAnimationRepeated(animation, keyName, target, currentRepeatCount);
4167 _TableViewPresenter::OnVisualElementAnimationFinished(const Tizen::Ui::Animations::VisualElementAnimation& animation, const Tizen::Base::String& keyName, Tizen::Ui::Animations::VisualElement& target, bool completedNormally)
4169 if (keyName == L"RemoveTableViewItem")
4171 _VisualElement* pVisualElement = GetView()->GetVisualElement();
4173 pVisualElement->DetachChild(target);
4178 else if (keyName == L"EXPAND_GROUP_ANIMATION")
4180 if (completedNormally == false)
4182 TableViewItemTag current;
4183 TableViewItemTag next;
4185 current.groupIndex = __expandableItemTag.groupIndex;
4186 current.itemIndex = -1;
4188 _TableViewItem* pNextItem = null;
4189 _TableViewItem* pCurrentItem = null;
4190 pCurrentItem = LoadItem(current.groupIndex, current.itemIndex);
4192 Rectangle itemBounds;
4193 Rectangle screenBounds = __pTableView->GetBounds();
4194 int screenPosition = GetScrollPosition() + screenBounds.height;
4195 int nextItemPositionY = pCurrentItem->GetBounds().y + pCurrentItem->GetBounds().height;
4197 while (GetNextItemPosition(current, next))
4199 if (screenPosition >= nextItemPositionY)
4201 pCurrentItem = LoadItem(current.groupIndex, current.itemIndex);
4202 if (pCurrentItem == null)
4206 pNextItem = LoadItem(next.groupIndex, next.itemIndex);
4207 if (pNextItem == null)
4212 itemBounds = pNextItem->GetBounds();
4213 itemBounds.y = pCurrentItem->GetBounds().y + pCurrentItem->GetBounds().height;
4214 pNextItem->SetBounds(itemBounds);
4215 nextItemPositionY = itemBounds.y + itemBounds.height;
4219 UnloadItem(next.groupIndex, next.itemIndex);
4227 int currentGroupIndex = -1;
4228 int currentItemIndex = -1;
4229 GetBottomDrawnItemIndex(currentGroupIndex, currentItemIndex);
4231 int lastLoadedGroupIndex = -1;
4232 int lastLoadedItemIndex = -1;
4233 __pListModel->GetLastLoadedItemIndex(lastLoadedGroupIndex, lastLoadedItemIndex);
4235 for (int j = currentGroupIndex; j <= lastLoadedGroupIndex; j++)
4237 int itemCount = GetItemCountAt(j);
4239 for (int i = -1; i < itemCount; i++)
4241 if (i <= currentItemIndex && j == currentGroupIndex)
4252 else if (keyName == L"COLLAPSE_GROUP_ANIMATION")
4254 if (completedNormally == false)
4256 TableViewItemTag current;
4257 TableViewItemTag next;
4259 current.groupIndex = __expandableItemTag.groupIndex;
4260 current.itemIndex = -1;
4262 _TableViewItem* pCurrentItem = null;
4263 int itemCountInGroup = __pListModel->GetItemCountInGroup(__expandableItemTag.groupIndex);
4265 for (int i = 0; i < itemCountInGroup; i++)
4267 UnloadItem(__expandableItemTag.groupIndex, i);
4270 pCurrentItem = FindItem(current);
4271 if (pCurrentItem == null)
4273 SysTryReturnVoidResult(NID_UI_CTRL, pCurrentItem != null, E_SYSTEM, "[E_SYSTEM] A system error has been occurred.")
4276 Rectangle itemBounds;
4277 int nextItemPositionY = pCurrentItem->GetBounds().y + pCurrentItem->GetBounds().height;
4279 Rectangle screenBounds = __pTableView->GetBounds();
4280 int screenPosition = GetScrollPosition() + screenBounds.height;
4282 while (GetNextItemPosition(current, next))
4285 if (screenPosition >= nextItemPositionY)
4287 pCurrentItem = LoadItem(current.groupIndex, current.itemIndex);
4288 if (pCurrentItem == null)
4293 itemBounds = pCurrentItem->GetBounds();
4294 itemBounds.y = nextItemPositionY;
4295 pCurrentItem->SetBounds(itemBounds);
4297 nextItemPositionY = pCurrentItem->GetBounds().y + pCurrentItem->GetBounds().height;
4301 UnloadItem(current.groupIndex, current.itemIndex);
4307 int scrollPosition = GetScrollPosition();
4309 int groupItemsHeight = 0;
4310 _IListItemCommon* pItem = null;
4311 for (int i = 0; i < __expandableItemTag.itemIndex; i++)
4313 pItem = __pListModel->GetItemFromTemporaryBuffer(__expandableItemTag.groupIndex, i);
4314 groupItemsHeight += pItem->GetItemHeight();
4317 _TableViewItem* pTableViewItem = static_cast<_TableViewItem*>(__pListModel->GetItemFromTemporaryBuffer(__expandableItemTag.groupIndex, __expandableItemTag.itemIndex));
4318 Rectangle itemBounds = pTableViewItem->GetBounds();
4319 groupItemsHeight += (scrollPosition - itemBounds.y);
4321 int currentGroupIndex = -1;
4322 int currentItemIndex = -1;
4323 GetTopDrawnItemIndex(currentGroupIndex, currentItemIndex);
4325 int firstLoadedGroupIndex = -1;
4326 int firstLoadedItemIndex = -1;
4327 __pListModel->GetFirstLoadedItemIndex(firstLoadedGroupIndex, firstLoadedItemIndex);
4329 for (int j = firstLoadedGroupIndex; j <= currentGroupIndex; j++)
4331 int itemCount = GetItemCountAt(j);
4333 for (int i = -1; i < itemCount; i++)
4335 if (i >= currentItemIndex && j == currentGroupIndex)
4344 int itemCount = GetItemCountAt(__expandableItemTag.groupIndex);
4345 for (int i = 0; i < itemCount; i++)
4347 UnloadItem(__expandableItemTag.groupIndex, i);
4354 _ScrollPanelPresenter::OnVisualElementAnimationFinished(animation, keyName, target, completedNormally);
4358 _TableViewPresenter::OnTickOccurred(const Tizen::Ui::Animations::VisualElementAnimation& animation, const Tizen::Base::String& keyName, Tizen::Ui::Animations::VisualElement& target, const Tizen::Ui::Variant& currentValue)
4360 _VisualElement* pVisualElement = __pTableView->GetVisualElement();
4362 if (&target != pVisualElement)
4367 if (keyName == L"RemoveTableViewItem")
4369 Dimension value = currentValue.ToDimension();
4370 target.SetOpacity(value.width);
4372 FloatRectangle bounds = target.GetBounds();
4373 bounds.height = value.height;
4374 target.SetBounds(bounds);
4376 target.SetFlushNeeded();
4380 else if (keyName == L"EXPAND_GROUP_ANIMATION")
4382 int currentPosition = currentValue.ToInt();
4383 SetLoadedItemsVisibleFromPosition(currentPosition, true);
4384 MoveLoadedItemsFromPosition(currentPosition);
4388 else if (keyName == L"COLLAPSE_GROUP_ANIMATION")
4390 int currentPosition = currentValue.ToInt();
4391 SetLoadedItemsVisibleFromPosition(currentPosition, false);
4392 MoveLoadedItemsFromPosition(currentPosition);
4396 else if (keyName == L"SWEEP_ITEM_ANIMATION")
4398 int currentPosition = currentValue.ToInt();
4399 int moveDestance = currentPosition - __sweptItemPosition.x;
4400 SweepItem(moveDestance);
4405 _ScrollPanelPresenter::OnTickOccurred(animation, keyName, target, currentValue);
4408 }}} // Tizen::Ui::Controls