2 // Open Service Platform
3 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://www.apache.org/licenses/LICENSE-2.0/
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
19 * @file FUiCtrl_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_Scroll.h"
33 #include "FUiCtrl_TableView.h"
34 #include "FUiCtrl_TableViewItem.h"
35 #include "FUiCtrl_TableViewPresenter.h"
36 #include "FUiCtrl_TableViewItemProviderAdaptor.h"
37 #include "FUi_CoordinateSystemUtils.h"
38 #include "FUi_FocusManagerImpl.h"
40 #include "FUi_Window.h"
42 using namespace Tizen::Ui::Animations;
43 using namespace Tizen::Graphics;
44 using namespace Tizen::Base;
45 using namespace Tizen::Base::Runtime;
46 using namespace Tizen::Ui::Controls;
48 namespace Tizen { namespace Ui { namespace Controls
50 const float _TableViewPresenter::REORDER_SCROLL_ANIMATION_DISTANCE = 10.0f;
51 const float _TableViewPresenter::TABLEVIEW_DEFAULT_ITEM_HEIGHT_VALUE = 12.3456f;
53 _TableViewPresenter::_TableViewPresenter()
56 , __pProviderAdaptor(null)
58 , __bottomMargin(0.0f)
60 , __modelInitialized(false)
61 , __firstDrawnFlag(true)
62 , __statusChangedFlag(true)
64 , __pItemDrawingProperty(null)
65 , __pBaseVisualElement(null)
66 , __sweepOccured(false)
67 , __sweptItemPosition()
68 , __reservedScrollItemAlignment(TABLE_VIEW_SCROLL_ITEM_ALIGNMENT_TOP)
69 , __firstTouchMoved(false)
70 , __pReorderScrollTimer(null)
72 , __itemTotalHeight(0.0f)
73 , __pCapturedItemVisualElement(null)
74 , __pFastScrollTimer(null)
75 , __isFastScrollTimerEnabled(false)
76 , __scrollHeightOnFlickStarted(0)
77 , __scrollPositionOnFlickStarted(0)
78 , __isAnimationCallbackBlocked(false)
79 , __lockLoadItemWithScroll(false)
80 , __isRestoreFocus(false)
81 , __isAnnexFocused(false)
82 , __isTableViewFocused(false)
83 , __itemTouchReleasedEventState(TABLE_VIEW_ITEM_TOUCH_RELEASED_EVENT_NORMAL)
86 __sweptItemTag.itemIndex = -1;
87 __sweptItemTag.groupIndex = -1;
89 __reservedScrollItemIndex.itemIndex = -1;
90 __reservedScrollItemIndex.groupIndex = -1;
92 __expandableItemTag.groupIndex = -1;
93 __expandableItemTag.itemIndex = -1;
95 __focusItemTag.groupIndex = -1;
96 __focusItemTag.itemIndex = -1;
99 _TableViewPresenter::~_TableViewPresenter()
105 _TableViewPresenter::GetView() const
111 _TableViewPresenter::GetModel(void) const
117 _TableViewPresenter::Initialize(_TableView* pTableView)
119 _ScrollPanelPresenter::Initialize(*pTableView);
121 __pTableView = pTableView;
122 __pBaseVisualElement = __pTableView->GetVisualElement();
123 __pBaseVisualElement->SetClipChildrenEnabled(true);
124 __pBaseVisualElement->SetSurfaceOpaque(false);
126 result r = __itemHeightList.Construct();
127 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, false, E_OUT_OF_MEMORY, ("[E_OUT_OF_MEMORY] The memory is insufficient."));
129 r = __sectionAlignmentList.Construct();
130 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, false, E_OUT_OF_MEMORY, ("[E_OUT_OF_MEMORY] The memory is insufficient."));
133 __pListModel = new (std::nothrow) _ListViewModel();
134 SysTryReturn(NID_UI_CTRL, __pListModel != null, false, E_OUT_OF_MEMORY, ("[E_OUT_OF_MEMORY] The memory is insufficient."));
135 __pListModel->SetListViewModelDelegate(this);
137 __pItemDrawingProperty = new (std::nothrow) _ItemDrawingProperty();
138 SysTryReturn(NID_UI_CTRL, __pItemDrawingProperty != null, false, E_OUT_OF_MEMORY, ("[E_OUT_OF_MEMORY] The memory is insufficient."));
141 __pFastScrollTimer = new (std::nothrow) Timer();
142 SysTryCatch(NID_UI_CTRL, __pFastScrollTimer != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
144 r = __pFastScrollTimer->Construct(*this);
145 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
150 if (__isFastScrollTimerEnabled)
152 __pFastScrollTimer->Cancel();
155 delete __pFastScrollTimer;
156 __pFastScrollTimer = null;
162 _TableViewPresenter::Construct(_TableView* pTableView)
164 result r = E_SUCCESS;
168 init = Initialize(pTableView);
169 SysTryCatch(NID_UI_CTRL, init == true, , r = GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
179 _TableViewPresenter::Dispose(void)
181 DeleteItemHeightList();
182 DeleteSectionAlignmentList();
183 DetachContextItem(__sweptItemTag);
188 delete __pProviderAdaptor;
189 __pProviderAdaptor = null;
191 delete __pItemDrawingProperty;
192 __pItemDrawingProperty = null;
194 delete __pReorderScrollTimer;
195 __pReorderScrollTimer = null;
197 if (__isFastScrollTimerEnabled)
199 __pFastScrollTimer->Cancel();
202 delete __pFastScrollTimer;
203 __pFastScrollTimer = null;
205 if (__pCapturedItemVisualElement)
207 GetView()->GetVisualElement()->DetachChild(*__pCapturedItemVisualElement);
208 __pCapturedItemVisualElement->Destroy();
210 __pCapturedItemVisualElement = null;
214 _TableViewPresenter::SetItemProvider(const _TableViewItemProvider* pProvider)
216 result r = E_SUCCESS;
218 _TableViewItemProviderAdaptor* pProviderAdaptor = static_cast <_TableViewItemProviderAdaptor*>(__pListModel->GetItemProviderAdaptor());
219 if(pProviderAdaptor != null)
221 _TableViewItemProvider* provider = pProviderAdaptor->GetItemProvider();
222 if(provider != null && provider == pProvider)
228 if (pProviderAdaptor == null)
230 pProviderAdaptor = new (std::nothrow) _TableViewItemProviderAdaptor();
231 SysTryReturn(NID_UI_CTRL, pProviderAdaptor != null, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, ("[E_OUT_OF_MEMORY] The memory is insufficient."));
233 SetTableViewItemProviderAdaptor(pProviderAdaptor);
236 _TableViewItemProvider* pNewProvider = null;
238 if (pProvider != null)
240 pNewProvider = const_cast <_TableViewItemProvider*>(pProvider);
244 __pListModel->RemoveAllItem(false);
247 pProviderAdaptor->SetItemProvider(pNewProvider);
248 pProviderAdaptor->SetListWidth(__pTableView->GetBoundsF().width - (GetLeftMargin() * 2));
249 pProviderAdaptor->SetTableViewStyle(__pTableView->GetTableViewStyle());
255 _TableViewPresenter::GetItemFromPosition(const Tizen::Graphics::FloatPoint& position, TableViewItemTag& itemPos) const
257 _TableViewItem* pItem = null;
258 TableViewItemTag lastItemPos = {-1, -1};
260 __pListModel->GetFirstLoadedItemIndex(itemPos.groupIndex, itemPos.itemIndex);
261 __pListModel->GetLastLoadedItemIndex(lastItemPos.groupIndex, lastItemPos.itemIndex);
265 pItem = static_cast <_TableViewItem*>(__pListModel->LoadItem(itemPos.groupIndex, itemPos.itemIndex));
266 SysTryCatch(NID_UI_CTRL, pItem != null, , E_OUT_OF_RANGE, "[E_OUT_OF_RANGE] The index is out of range.");
268 FloatRectangle itemBounds = pItem->GetBoundsF();
269 if (itemBounds.Contains(position))
274 if ((itemPos.itemIndex == lastItemPos.itemIndex) && (itemPos.groupIndex == lastItemPos.groupIndex))
279 } while (GetNextItemPosition(itemPos, itemPos));
282 itemPos.itemIndex = -1;
283 itemPos.groupIndex = -1;
285 return E_OUT_OF_RANGE;
289 _TableViewPresenter::GetTopDrawnItemIndex(int& groupIndex, int& itemIndex) const
291 result r = E_SUCCESS;
293 TableViewItemTag itemPos;
294 r = GetTopDrawnItem(itemPos);
296 groupIndex = itemPos.groupIndex;
297 itemIndex = itemPos.itemIndex;
303 _TableViewPresenter::SetTopDrawnItemIndex(int groupIndex, int itemIndex)
307 return E_INVALID_ARG;
310 if ((groupIndex < 0) || (groupIndex >= GetGroupCount()) || (itemIndex < -1) || (itemIndex >= GetItemCountAt(groupIndex)))
312 return E_OUT_OF_RANGE;
315 ScrollToItem(groupIndex, itemIndex, TABLE_VIEW_SCROLL_ITEM_ALIGNMENT_TOP);
321 _TableViewPresenter::GetBottomDrawnItemIndex(int& groupIndex, int& itemIndex) const
323 result r = E_SUCCESS;
325 TableViewItemTag itemPos;
326 r = GetBottomDrawnItem(itemPos);
328 groupIndex = itemPos.groupIndex;
329 itemIndex = itemPos.itemIndex;
335 _TableViewPresenter::SetBottomDrawnItemIndex(int groupIndex, int itemIndex)
339 return E_INVALID_ARG;
342 if ((groupIndex < 0) || (groupIndex >= GetGroupCount()) || (itemIndex < -1) || (itemIndex >= GetItemCountAt(groupIndex)))
344 return E_OUT_OF_RANGE;
347 ScrollToItem(groupIndex, itemIndex, TABLE_VIEW_SCROLL_ITEM_ALIGNMENT_BOTTOM);
353 _TableViewPresenter::GetGroupCount(void) const
355 return __pListModel->GetAllGroupCount();
360 _TableViewPresenter::GetItemCountAt(int groupIndex) const
362 return __pListModel->GetItemCountInGroup(groupIndex);
366 _TableViewPresenter::HasSectionHeader(int groupIndex) const
368 if (__pProviderAdaptor == null || __pTableView->GetTableViewStyle() != TABLE_VIEW_STYLE_SECTION)
373 return __pProviderAdaptor->HasSectionHeader(groupIndex);
377 _TableViewPresenter::HasSectionFooter(int groupIndex) const
379 if (__pProviderAdaptor == null || __pTableView->GetTableViewStyle() != TABLE_VIEW_STYLE_SECTION)
384 return __pProviderAdaptor->HasSectionFooter(groupIndex);
388 _TableViewPresenter::GetItemCount(void) const
390 return __pListModel->GetAllItemCount();
394 _TableViewPresenter::RefreshTableView(int groupIndex, int itemIndex, TableViewRefreshType type, bool animation)
396 _TableViewItemProviderAdaptor* pProviderAdaptor = __pProviderAdaptor;
398 SysTryReturn(NID_UI_CTRL, pProviderAdaptor != null, E_INVALID_STATE, E_INVALID_STATE,
399 ("[E_INVALID_STATE] This instance isn't constructed."));
401 if ((groupIndex < 0) || (groupIndex > GetGroupCount()) || (itemIndex < -1) || (itemIndex > GetItemCountAt(groupIndex)))
403 SysLogException(NID_UI_CTRL, E_OUT_OF_RANGE, "[E_OUT_OF_RANGE] The index is out of range.");
404 return E_OUT_OF_RANGE;
407 if (groupIndex == GetGroupCount() && itemIndex != -1 && type != TABLE_VIEW_REFRESH_TYPE_ITEM_ADD)
409 SysLogException(NID_UI_CTRL, E_OUT_OF_RANGE, "[E_OUT_OF_RANGE] The index is out of range.");
410 return E_OUT_OF_RANGE;
413 TableViewItemTag topDrawnItemPos = {-1, -1};
414 TableViewItemTag refreshItemPos = {groupIndex, itemIndex};
415 float prevScrollAreaHeight = GetScrollAreaBounds().height;
416 float prevScrollPosition = GetScrollPosition();
418 GetTopDrawnItem(topDrawnItemPos);
424 case TABLE_VIEW_REFRESH_TYPE_ITEM_ADD:
427 bool emptyState = IsEmpty();
429 int itemCount = pProviderAdaptor->GetItemCount(groupIndex);
430 if (__pListModel->InsertGroup(groupIndex, itemCount, false) != E_SUCCESS)
432 SysLogException(NID_UI_CTRL, E_SYSTEM, "[E_SYSTEM] Unable to add Group item.");
438 GetFirstItem(topDrawnItemPos);
440 else if (groupIndex <= topDrawnItemPos.groupIndex)
442 topDrawnItemPos.groupIndex++;
447 bool emptyState = IsEmpty();
449 if (__pListModel->InsertItemToGroup(null, groupIndex, itemIndex) != E_SUCCESS)
451 SysLogException(NID_UI_CTRL, E_SYSTEM, "[E_SYSTEM] Unable to add item.");
457 GetFirstItem(topDrawnItemPos);
461 RefreshItemHeightList(groupIndex, itemIndex, TABLE_VIEW_REFRESH_TYPE_ITEM_ADD);
462 RefreshSectionAlignmentList(groupIndex, TABLE_VIEW_REFRESH_TYPE_ITEM_ADD);
464 if (__pListModel->GetAllItemCount() == 1)
466 SetStatusChanged(true);
471 case TABLE_VIEW_REFRESH_TYPE_ITEM_REMOVE:
474 if (groupIndex == GetGroupCount())
476 SysLogException(NID_UI_CTRL, E_OUT_OF_RANGE, "[E_OUT_OF_RANGE] The index is out of range.");
477 return E_OUT_OF_RANGE;
480 RefreshItemHeightList(groupIndex, itemIndex, TABLE_VIEW_REFRESH_TYPE_ITEM_REMOVE);
481 RefreshSectionAlignmentList(groupIndex, TABLE_VIEW_REFRESH_TYPE_ITEM_REMOVE);
483 if (__pListModel->RemoveGroup(groupIndex) != E_SUCCESS)
485 SysLogException(NID_UI_CTRL, E_SYSTEM, "[E_SYSTEM] Unable to remove group.");
489 if (groupIndex == topDrawnItemPos.groupIndex)
491 topDrawnItemPos.itemIndex = -1;
494 if (groupIndex < topDrawnItemPos.groupIndex)
496 topDrawnItemPos.groupIndex--;
499 if ((groupIndex == GetGroupCount()) && (GetGroupCount() > 0))
501 topDrawnItemPos.groupIndex--;
502 topDrawnItemPos.itemIndex = GetItemCountAt(GetGroupCount() - 1) - 1;
507 if (itemIndex == GetItemCountAt(groupIndex))
509 SysLogException(NID_UI_CTRL, E_OUT_OF_RANGE, "[E_OUT_OF_RANGE] The index is out of range.");
510 return E_OUT_OF_RANGE;
513 if (__pListModel->RemoveItemAt(groupIndex, itemIndex) != E_SUCCESS)
515 SysLogException(NID_UI_CTRL, E_SYSTEM, "[E_SYSTEM] Unable to remove item.");
519 if ((groupIndex == topDrawnItemPos.groupIndex) && (itemIndex < topDrawnItemPos.itemIndex))
521 GetPreviousItemPosition(topDrawnItemPos, topDrawnItemPos);
524 RefreshItemHeightList(groupIndex, itemIndex, TABLE_VIEW_REFRESH_TYPE_ITEM_REMOVE);
527 if (GetModel()->IsValidItem(topDrawnItemPos.groupIndex, topDrawnItemPos.itemIndex) == false)
529 GetPreviousItemPosition(topDrawnItemPos, topDrawnItemPos);
532 if (__pListModel->GetAllItemCount() == 0)
534 SetStatusChanged(true);
539 case TABLE_VIEW_REFRESH_TYPE_ITEM_MODIFY:
541 TableViewItemTag itemTag = {groupIndex, itemIndex};
542 _TableViewItem* pTableViewItem = FindItem(itemTag);
544 if (pTableViewItem == null)
549 if (pProviderAdaptor->UpdateItem(pTableViewItem, itemTag.groupIndex, itemTag.itemIndex))
551 FloatRectangle itemBounds = pTableViewItem->GetBoundsF();
552 FloatDimension itemDim = Tizen::Graphics::CoordinateSystem::AlignToDevice(FloatDimension(itemBounds.width, itemBounds.height));
553 itemBounds.height = itemDim.height;
554 pTableViewItem->SetBounds(itemBounds);
556 CheckItemHeightAndRefreshLayout(itemTag, true);
558 if (__sweptItemTag.groupIndex != itemTag.groupIndex || __sweptItemTag.itemIndex != itemTag.itemIndex)
563 pTableViewItem->SetPublicLabelUpdate(false);
564 pTableViewItem->SetItemChanged(true);
565 pTableViewItem->Invalidate();
566 pTableViewItem->AdjustContextItemBounds();
574 SysLogException(NID_UI_CTRL, E_SYSTEM, "[E_SYSTEM] Unable to refresh list.");
579 __lockLoadItemWithScroll = true;
581 AdjustClientAreaBounds(true);
583 __lockLoadItemWithScroll = false;
585 if ((topDrawnItemPos.groupIndex > refreshItemPos.groupIndex)
586 ||((topDrawnItemPos.groupIndex == refreshItemPos.groupIndex)&&(topDrawnItemPos.itemIndex > refreshItemPos.itemIndex)))
588 RefreshItemLayout(topDrawnItemPos, refreshItemPos, type, false);
590 float newScrollPosition = prevScrollPosition - (prevScrollAreaHeight - GetScrollAreaBounds().height);
592 __lockLoadItemWithScroll = true;
594 SetScrollPosition(newScrollPosition, false);
596 __lockLoadItemWithScroll = false;
600 RefreshItemLayout(topDrawnItemPos, refreshItemPos, type, animation);
607 _TableViewPresenter::RefreshAllItems(void)
609 result r = E_SUCCESS;
610 TableViewItemTag itemTag = {-1, -1};
611 TableViewItemTag lastLoadedItemTag = {-1, -1};
613 __pListModel->GetLastLoadedItemIndex(lastLoadedItemTag.groupIndex, lastLoadedItemTag.itemIndex);
614 __pListModel->GetFirstLoadedItemIndex(itemTag.groupIndex, itemTag.itemIndex);
618 _TableViewItem* pItem = FindItem(itemTag);
625 r = RefreshTableView(itemTag.groupIndex, itemTag.itemIndex, TABLE_VIEW_REFRESH_TYPE_ITEM_MODIFY, false);
626 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
628 if ((itemTag.itemIndex == lastLoadedItemTag.itemIndex) && (itemTag.groupIndex == lastLoadedItemTag.groupIndex))
632 } while (GetNextItemPosition(itemTag, itemTag));
638 _TableViewPresenter::UpdateTableView(void)
640 _VisualElement* pVisualElement = __pTableView->GetVisualElement();
642 if (pVisualElement != null)
644 __pTableView->GetVisualElement()->RemoveAllAnimations();
648 if (__modelInitialized == false)
650 SetItemDrawingProperty();
652 if(PreloadItem() == false)
661 __pListModel->RemoveAllItem(false, false);
667 TableViewItemTag topDrawnTag = {-1, -1};
668 float shiftingDistance = 0;
672 GetTopDrawnItem(topDrawnTag);
674 if (__pListModel->IsValidItem(topDrawnTag.groupIndex, topDrawnTag.itemIndex))
676 _TableViewItem* pItem = FindItem(topDrawnTag);
680 shiftingDistance = GetScrollPosition() - pItem->GetBoundsF().y;
684 __pListModel->RemoveAllItem(false, true);
686 PreloadItem(topDrawnTag.groupIndex, topDrawnTag.itemIndex, shiftingDistance);
688 if (__isRestoreFocus)
690 __pTableView->SetFocused(true);
691 __pTableView->DrawFocus();
692 __isRestoreFocus = false;
695 __statusChangedFlag = true;
697 if (__itemTouchReleasedEventState == TABLE_VIEW_ITEM_TOUCH_RELEASED_EVENT_FIRE)
699 __itemTouchReleasedEventState = TABLE_VIEW_ITEM_TOUCH_RELEASED_EVENT_UPDATE_TABLE_VIEW;
708 _TableViewPresenter::AdjustLayoutItems(float scrollPosition)
710 TableViewItemTag lastLoadedItemPos = {-1, -1};
711 TableViewItemTag firstLoadedItemPos = {-1, -1};
712 TableViewItemTag currentItemPos = {-1, -1};
713 _TableViewItem* pItem = null;
715 __pListModel->GetFirstLoadedItemIndex(firstLoadedItemPos.groupIndex, firstLoadedItemPos.itemIndex);
716 __pListModel->GetLastLoadedItemIndex(lastLoadedItemPos.groupIndex, lastLoadedItemPos.itemIndex);
718 pItem = FindItem(firstLoadedItemPos);
722 float positionY = pItem->GetPositionF().y;
724 currentItemPos = firstLoadedItemPos;
726 while (!_FloatCompareLE(positionY, scrollPosition) && GetPreviousItemPosition(currentItemPos, currentItemPos))
728 pItem = LoadItem(currentItemPos.groupIndex, currentItemPos.itemIndex);
735 positionY = pItem->GetPositionF().y;
739 pItem = FindItem(lastLoadedItemPos);
743 float positionY = pItem->GetPositionF().y;
744 float itemHeight = pItem->GetBoundsF().height;
745 float limitScreenArea = scrollPosition + __pTableView->GetBoundsF().height;
746 currentItemPos = lastLoadedItemPos;
748 while ((positionY + itemHeight < limitScreenArea) && GetNextItemPosition(currentItemPos, currentItemPos))
750 pItem = LoadItem(currentItemPos.groupIndex, currentItemPos.itemIndex);
757 positionY = pItem->GetPositionF().y;
758 itemHeight = pItem->GetBoundsF().height;
764 _TableViewPresenter::ResetItemLayout(TableViewItemTag& topDrawnItemTag, float shiftingDistance)
766 if (__pListModel->IsValidItem(topDrawnItemTag.groupIndex, topDrawnItemTag.itemIndex) == false)
773 _TableViewItem* pItem = LoadItem(topDrawnItemTag.groupIndex, topDrawnItemTag.itemIndex);
780 TableViewItemTag currentItem = topDrawnItemTag;
781 TableViewItemTag itemPos = topDrawnItemTag;
782 float screenAreaHeight = __pTableView->GetBoundsF().height + shiftingDistance;
783 float loadedItemTotalHeight = 0.0f;
784 FloatRectangle itemBounds = pItem->GetBoundsF();
786 itemBounds.y = CalculateItemPositionY(itemPos.groupIndex, itemPos.itemIndex);
787 pItem->SetBounds(itemBounds);
788 CheckItemHeightAndRefreshLayout(itemPos, true);
790 loadedItemTotalHeight += itemBounds.height;
792 while (loadedItemTotalHeight < screenAreaHeight && GetNextItemPosition(currentItem, itemPos))
794 pItem = LoadItem(itemPos.groupIndex, itemPos.itemIndex);
801 currentItem = itemPos;
802 loadedItemTotalHeight += pItem->GetBoundsF().height;
805 if (loadedItemTotalHeight < screenAreaHeight)
807 __pListModel->GetFirstLoadedItemIndex(itemPos.groupIndex, itemPos.itemIndex);
808 currentItem = itemPos;
810 while (loadedItemTotalHeight < screenAreaHeight && GetPreviousItemPosition(currentItem, itemPos))
812 pItem = LoadItem(itemPos.groupIndex, itemPos.itemIndex);
819 currentItem = itemPos;
820 loadedItemTotalHeight += pItem->GetBoundsF().height;
826 _TableViewPresenter::IsCachingItemsTotalHeightLessThanViewHeight(void)
828 int currentCachingsize = GetMaxItemCachingSize();
829 int loadedItemCount = 0;
830 float itemTotalHeight = 0.0f;
831 float viewHeight = __pTableView->GetBoundsF().height;
832 float lastItemHeight = 0.0f;
834 TableViewItemTag lastLoadedItemPos = {-1, -1};
835 TableViewItemTag firstLoadedItemPos = {-1, -1};
837 __pListModel->GetFirstLoadedItemIndex(firstLoadedItemPos.groupIndex, firstLoadedItemPos.itemIndex);
838 __pListModel->GetLastLoadedItemIndex(lastLoadedItemPos.groupIndex, lastLoadedItemPos.itemIndex);
842 _TableViewItem* pItem = FindItem(firstLoadedItemPos);
846 itemTotalHeight = itemTotalHeight + pItem->GetSizeF().height;
847 lastItemHeight = pItem->GetSizeF().height;
851 if ((firstLoadedItemPos.itemIndex == lastLoadedItemPos.itemIndex) && (firstLoadedItemPos.groupIndex == lastLoadedItemPos.groupIndex))
855 } while (GetNextItemPosition(firstLoadedItemPos, firstLoadedItemPos));
857 if (loadedItemCount < currentCachingsize || viewHeight < (itemTotalHeight - lastItemHeight))
866 _TableViewPresenter::GetFirstLoadedItemIndex(int& groupIndex, int& itemIndex) const
868 __pListModel->GetFirstLoadedItemIndex(groupIndex, itemIndex);
872 _TableViewPresenter::GetLastLoadedItemIndex(int& groupIndex, int& itemIndex) const
874 __pListModel->GetLastLoadedItemIndex(groupIndex, itemIndex);
878 _TableViewPresenter::RefreshItemLayout(int groupIndex, int itemIndex)
880 TableViewItemTag itemTag = {groupIndex, itemIndex};
884 RefreshItemLayout(itemTag, itemTag, TABLE_VIEW_REFRESH_TYPE_ITEM_MODIFY, false);
888 _TableViewPresenter::RefreshItemLayout(TableViewItemTag& topDrawnItemTag, TableViewItemTag& refreshItemTag, TableViewRefreshType type, bool animation)
890 if (!__pListModel->IsValidItem(topDrawnItemTag.groupIndex, topDrawnItemTag.itemIndex))
895 if (refreshItemTag.itemIndex == -1)
900 _TableViewItem* pItem = null;
902 TableViewItemTag itemPos = {-1, -1};
903 TableViewItemTag currentItem = {-1, -1};
905 int loadItemCount = 0;
906 int maxLoadItemCount = GetMaxItemCachingSize();
907 FloatRectangle itemBounds(0.0f, 0.0f, 0.0f, 0.0f);
909 StopAllItemAnimation();
911 __pListModel->GetFirstLoadedItemIndex(itemPos.groupIndex, itemPos.itemIndex);
913 if (itemPos.groupIndex == -1 && itemPos.itemIndex == -1)
915 itemPos = topDrawnItemTag;
918 currentItem = itemPos;
920 float itemPositionY = CalculateItemPositionY(itemPos.groupIndex, itemPos.itemIndex);
924 pItem = LoadItem(itemPos.groupIndex, itemPos.itemIndex);
931 if (pItem->HasParent())
933 pItem->SetDrawingProperty(__pItemDrawingProperty);
934 SetItemType(pItem, itemPos);
937 itemBounds = pItem->GetBoundsF();
938 itemBounds.y = itemPositionY;
942 if (type == TABLE_VIEW_REFRESH_TYPE_ITEM_ADD)
944 if (itemPos.groupIndex == refreshItemTag.groupIndex && itemPos.itemIndex == refreshItemTag.itemIndex)
946 pItem->SetBounds(itemBounds);
947 pItem->FadeInOutItem(false, ADD_ITEM_ANIMATION_DURATION, REFRESH_ITEM_ANIMATION_DELAY);
948 pItem->ZoomInOutItem(false, ADD_ITEM_ANIMATION_DURATION, REFRESH_ITEM_ANIMATION_DELAY);
952 if (!pItem->MoveItem(FloatPoint(itemBounds.x, itemBounds.y), ADD_ITEM_ANIMATION_DURATION, 0))
954 pItem->SetBounds(itemBounds);
960 if (!pItem->MoveItem(FloatPoint(itemBounds.x, itemBounds.y), REMOVE_ITEM_MOVE_ANIMATION_DURATION, REFRESH_ITEM_ANIMATION_DELAY))
962 pItem->SetBounds(itemBounds);
968 pItem->SetBounds(itemBounds);
971 currentItem = itemPos;
972 itemPositionY = itemBounds.y + itemBounds.height;
976 } while (loadItemCount < maxLoadItemCount && GetNextItemPosition(currentItem, itemPos));
978 if (loadItemCount < maxLoadItemCount)
980 __pListModel->GetFirstLoadedItemIndex(itemPos.groupIndex, itemPos.itemIndex);
981 currentItem = itemPos;
983 while (loadItemCount < maxLoadItemCount && GetPreviousItemPosition(currentItem, itemPos))
985 pItem = LoadItem(itemPos.groupIndex, itemPos.itemIndex);
992 currentItem = itemPos;
998 if (refreshItemTag.itemIndex == -1)
1000 ScrollToItem(topDrawnItemTag.groupIndex, topDrawnItemTag.itemIndex, TABLE_VIEW_SCROLL_ITEM_ALIGNMENT_TOP);
1005 _TableViewPresenter::RefreshItemBounds(_TableViewItem* pItem, TableViewItemTag& itemPos)
1007 FloatRectangle itemBounds;
1014 itemBounds = pItem->GetBoundsF();
1016 itemBounds.y = CalculateItemPositionY(itemPos.groupIndex, itemPos.itemIndex);
1018 if (itemPos.itemIndex != -1)
1020 float itemMargin = GetLeftMargin();
1021 itemBounds.x = itemMargin;
1022 itemBounds.width = __pItemDrawingProperty->width - itemBounds.x - itemMargin;
1026 itemBounds.x = 0.0f;
1027 itemBounds.width = __pItemDrawingProperty->width;
1030 pItem->SetBounds(itemBounds);
1034 _TableViewPresenter::GetItemIndexFromPosition(const FloatPoint& position, int& groupIndex, int& itemIndex) const
1036 result r = E_SUCCESS;
1037 TableViewItemTag itemPos;
1039 FloatPoint targetPosition = position;
1040 float scrollPosition = GetScrollPosition();
1041 targetPosition.y += scrollPosition;
1043 r = GetItemFromPosition(targetPosition, itemPos);
1052 groupIndex = itemPos.groupIndex;
1053 itemIndex = itemPos.itemIndex;
1060 _TableViewPresenter::PreloadItem(void)
1062 if (GetModel() == null || __pProviderAdaptor == null)
1067 __modelInitialized = true;
1069 if (__pListModel->GetAllGroupCount() == 0 && (__pProviderAdaptor != null))
1072 int groupCount = __pProviderAdaptor->GetGroupCount();
1074 for (int i = 0; i < groupCount; i++)
1076 itemCount = __pProviderAdaptor->GetItemCount(i);
1077 __pListModel->AddGroup(itemCount, false);
1081 __pListModel->RestoreItemStatus();
1083 CreateItemHeightList(TABLEVIEW_DEFAULT_ITEM_HEIGHT_VALUE, TABLEVIEW_DEFAULT_ITEM_HEIGHT_VALUE);
1084 CreateSectionAlignmentList();
1086 int cachingSize = 0;
1088 if (GetItemCount() > TABLEVIEW_MAX_ITEM_COUNT)
1090 cachingSize = TABLEVIEW_MAX_ITEM_COUNT;
1092 else if (__pListModel->GetMaxCachingSize() < TABLEVIEW_MAX_ITEM_COUNT)
1094 cachingSize = __pListModel->GetMaxCachingSize();
1098 cachingSize = GetItemCount();
1101 TableViewItemTag itemPos = {-1, -1};
1102 GetFirstItem(itemPos);
1104 _TableViewItem* pItem = null;
1105 for (int i = 0; i < cachingSize; i++)
1107 pItem = LoadItem(itemPos.groupIndex, itemPos.itemIndex);
1114 if (GetNextItemPosition(itemPos, itemPos) == false)
1120 if (IsCachingItemsTotalHeightLessThanViewHeight())
1122 AdjustLayoutItems(0.0f);
1125 PresetItemHeightList();
1126 AdjustClientAreaBounds(true);
1128 TableViewScrollBarStyle scrollStyle = __pTableView->GetScrollStyle();
1130 if (scrollStyle == TABLE_VIEW_SCROLL_BAR_STYLE_FAST_SCROLL
1131 || scrollStyle == TABLE_VIEW_SCROLL_BAR_STYLE_FAST_SCROLL_FIXED)
1133 _FastScroll* pFastScroll = __pTableView->GetFastScrollBar();
1134 if (pFastScroll != null)
1136 pFastScroll->UpdateIndex();
1137 pFastScroll->SetScrollVisibility(IsScrollable());
1140 else if (scrollStyle != TABLE_VIEW_SCROLL_BAR_STYLE_NONE)
1152 _TableViewPresenter::PreloadItem(int topDrawnGroupIndex, int topDrawnItemIndex, float shiftingDistance)
1154 if (GetModel() == null || __pProviderAdaptor == null)
1159 __modelInitialized = true;
1161 if (__pListModel->GetAllGroupCount() == 0 && (__pProviderAdaptor != null))
1164 int groupCount = __pProviderAdaptor->GetGroupCount();
1166 for (int i = 0; i < groupCount; i++)
1168 itemCount = __pProviderAdaptor->GetItemCount(i);
1169 __pListModel->AddGroup(itemCount, false);
1173 float defaultGroupHeight = __pProviderAdaptor->GetDefaultGroupItemHeight();
1174 float defaultItemHeight = __pProviderAdaptor->GetDefaultItemHeight();
1176 if (_FloatCompareLE(defaultGroupHeight, 0.0f))
1178 defaultGroupHeight = TABLEVIEW_DEFAULT_ITEM_HEIGHT_VALUE;
1181 if (_FloatCompareLE(defaultItemHeight, 0.0f))
1183 defaultItemHeight = TABLEVIEW_DEFAULT_ITEM_HEIGHT_VALUE;
1186 __pListModel->RestoreItemStatus();
1188 DeleteItemHeightList();
1189 CreateItemHeightList(defaultGroupHeight, defaultItemHeight);
1191 DeleteSectionAlignmentList();
1192 CreateSectionAlignmentList();
1194 if (!__pListModel->IsValidItem(topDrawnGroupIndex, topDrawnItemIndex))
1196 TableViewItemTag firstItemTag = {-1, -1};
1198 GetFirstItem(firstItemTag);
1200 topDrawnGroupIndex = firstItemTag.groupIndex;
1201 topDrawnItemIndex = firstItemTag.itemIndex;
1203 shiftingDistance = 0.0f;
1206 AdjustClientAreaBounds(true);
1208 ScrollToItem(topDrawnGroupIndex, topDrawnItemIndex, TABLE_VIEW_SCROLL_ITEM_ALIGNMENT_TOP, shiftingDistance);
1210 if (IsCachingItemsTotalHeightLessThanViewHeight())
1212 AdjustLayoutItems(GetScrollPosition());
1215 if (__pTableView->GetScrollStyle() == TABLE_VIEW_SCROLL_BAR_STYLE_FAST_SCROLL
1216 || __pTableView->GetScrollStyle() == TABLE_VIEW_SCROLL_BAR_STYLE_FAST_SCROLL_FIXED)
1218 _FastScroll* pFastScroll = __pTableView->GetFastScrollBar();
1219 if (pFastScroll != null)
1221 pFastScroll->UpdateIndex();
1222 pFastScroll->SetScrollVisibility(IsScrollable());
1230 _TableViewPresenter::IsItemChecked(int groupIndex, int itemIndex) const
1232 if ((groupIndex < 0) || (groupIndex >= GetGroupCount()) || (itemIndex < -1) || (itemIndex >= GetItemCountAt(groupIndex)))
1237 return __pListModel->IsItemChecked(groupIndex, itemIndex);
1241 _TableViewPresenter::SetItemChecked(int groupIndex, int itemIndex, bool checked)
1243 if ((groupIndex < 0) || (groupIndex >= GetGroupCount()) || (itemIndex < -1) || (itemIndex >= GetItemCountAt(groupIndex)))
1245 return E_OUT_OF_RANGE;
1248 if (__modelInitialized == false)
1250 return E_INVALID_STATE;
1253 bool enabled = __pListModel->IsItemEnabled(groupIndex, itemIndex);
1254 SysTryReturn(NID_UI_CTRL, (enabled == true), E_INVALID_OPERATION, E_INVALID_OPERATION,
1255 "[E_INVALID_OPERATION] The item is disabled.");
1257 if (__pListModel->IsItemChecked(groupIndex, itemIndex) == checked)
1262 TableViewItemTag itemTag = {groupIndex, itemIndex};
1263 _TableViewItem *pItem = FindItem(itemTag);
1265 TableViewItemTag topDrawnItemTag = {-1, -1};
1266 GetTopDrawnItem(topDrawnItemTag);
1268 TableViewItemTag bottomDrawnItemTag = {-1, -1};
1269 GetBottomDrawnItem(bottomDrawnItemTag);
1273 if (((itemTag.groupIndex == topDrawnItemTag.groupIndex && itemTag.itemIndex >= topDrawnItemTag.itemIndex)
1274 || itemTag.groupIndex > topDrawnItemTag.groupIndex) &&
1275 ((itemTag.groupIndex == bottomDrawnItemTag.groupIndex && itemTag.itemIndex <= bottomDrawnItemTag.itemIndex)
1276 || itemTag.groupIndex < bottomDrawnItemTag.groupIndex))
1278 pItem->SetCheckedAnimationEnabled(checked);
1282 result r = __pListModel->SetItemChecked(groupIndex, itemIndex, checked);
1288 _TableViewPresenter::IsItemEnabled(int groupIndex, int itemIndex) const
1290 if ((groupIndex < 0) || (groupIndex >= GetGroupCount()) || (itemIndex < -1) || (itemIndex >= GetItemCountAt(groupIndex)))
1295 return __pListModel->IsItemEnabled(groupIndex, itemIndex);
1299 _TableViewPresenter::SetItemEnabled(int groupIndex, int itemIndex, bool enabled)
1301 if ((groupIndex < 0) || (groupIndex >= GetGroupCount()) || (itemIndex < -1) || (itemIndex >= GetItemCountAt(groupIndex)))
1303 return E_OUT_OF_RANGE;
1306 if (__pListModel->IsItemEnabled(groupIndex, itemIndex) == enabled)
1311 result r = __pListModel->SetItemEnabled(groupIndex, itemIndex, enabled);
1317 _TableViewPresenter::SetStatusChanged(bool changed)
1319 __statusChangedFlag = changed;
1321 if (__statusChangedFlag == true)
1323 SetItemDrawingProperty();
1325 if ((__pItemDrawingProperty != null) && (__pItemDrawingProperty->propertyChanged == true))
1327 __pListModel->SetAllLoadedItemStateChanged(true);
1335 _TableViewPresenter::IsStatusChanged(void) const
1337 return __statusChangedFlag;
1341 _TableViewPresenter::GetTopMargin(void) const
1347 _TableViewPresenter::SetTopMargin(float topMargin)
1349 __topMargin = topMargin;
1355 _TableViewPresenter::GetBottomMargin(void) const
1357 return __bottomMargin;
1361 _TableViewPresenter::SetBottomMargin(float bottomMargin)
1363 __bottomMargin = bottomMargin;
1369 _TableViewPresenter::GetLeftMargin(void) const
1371 return __leftMargin;
1375 _TableViewPresenter::SetLeftMargin(float leftMargin)
1377 __leftMargin = leftMargin;
1383 _TableViewPresenter::RestoreFocus(bool isRestoreFocus)
1385 __isRestoreFocus = isRestoreFocus;
1389 _TableViewPresenter::SetAnnexFocused(bool isAnnexFocused)
1391 __isAnnexFocused = isAnnexFocused;
1395 _TableViewPresenter::SetTableViewFocused(bool focusStatus)
1397 if (focusStatus == false)
1399 __focusItemTag.groupIndex = -1;
1400 __focusItemTag.itemIndex = -1;
1401 __isRestoreFocus = false;
1402 __isAnnexFocused = false;
1404 __isTableViewFocused = focusStatus;
1408 _TableViewPresenter::IsTableViewFocused(void)
1410 return __isTableViewFocused;
1414 _TableViewPresenter::SetItemType(_TableViewItem* pItem, TableViewItemTag itemPosition)
1416 TableViewStyle style = __pTableView->GetTableViewStyle();
1418 if (itemPosition.itemIndex == -1)
1420 if (style == TABLE_VIEW_STYLE_SECTION)
1422 pItem->SetItemType(TABLE_VIEW_ITEM_TYPE_HEADER);
1426 pItem->SetItemType(TABLE_VIEW_ITEM_TYPE_TITLE);
1431 int itemCount = GetItemCountAt(itemPosition.groupIndex);
1432 if (style == TABLE_VIEW_STYLE_SIMPLE)
1434 if (itemCount == 1 || (itemCount > 1 && (itemPosition.itemIndex == itemCount - 1)))
1436 pItem->SetSimpleLastItemEnabled(true);
1440 pItem->SetSimpleLastItemEnabled(false);
1444 if (itemPosition.itemIndex == 0)
1446 if (HasSectionFooter(itemPosition.groupIndex))
1450 pItem->SetItemType(TABLE_VIEW_ITEM_TYPE_FOOTER);
1452 else if (itemCount == 2)
1454 pItem->SetItemType(TABLE_VIEW_ITEM_TYPE_ONE);
1458 pItem->SetItemType(TABLE_VIEW_ITEM_TYPE_TOP);
1465 pItem->SetItemType(TABLE_VIEW_ITEM_TYPE_ONE);
1469 pItem->SetItemType(TABLE_VIEW_ITEM_TYPE_TOP);
1475 int lastItemIndex = itemCount - 1;
1477 if (HasSectionFooter(itemPosition.groupIndex))
1479 if (itemPosition.itemIndex == lastItemIndex)
1481 pItem->SetItemType(TABLE_VIEW_ITEM_TYPE_FOOTER);
1483 else if (itemPosition.itemIndex == lastItemIndex - 1)
1485 pItem->SetItemType(TABLE_VIEW_ITEM_TYPE_BOTTOM);
1489 pItem->SetItemType(TABLE_VIEW_ITEM_TYPE_MIDDLE);
1494 if (itemPosition.itemIndex == lastItemIndex)
1496 pItem->SetItemType(TABLE_VIEW_ITEM_TYPE_BOTTOM);
1500 pItem->SetItemType(TABLE_VIEW_ITEM_TYPE_MIDDLE);
1508 _TableViewPresenter::SetItemLayout(_TableViewItem* pItem, TableViewItemTag& itemPos)
1510 _TableViewItem* pSeriesItem = null;
1511 TableViewItemTag seriesItemPos = {-1, -1};
1512 FloatRectangle seriesItemBounds;
1513 FloatRectangle itemBounds;
1514 bool validBounds = false;
1515 bool downScroll = true;
1517 if (itemPos.itemIndex == -1 && __pTableView->GetTableViewStyle() != TABLE_VIEW_STYLE_SECTION)
1520 itemBounds.width = __pItemDrawingProperty->width;
1524 float itemMargin = GetLeftMargin();
1525 itemBounds.x = itemMargin;
1526 itemBounds.width = __pItemDrawingProperty->width - itemBounds.x - itemMargin;
1529 FloatDimension itemDimension = Tizen::Graphics::CoordinateSystem::AlignToDevice(FloatDimension(pItem->GetSizeF().width, pItem->GetSizeF().height));
1530 itemBounds.height = itemDimension.height;
1532 if (itemPos.groupIndex == 0 && itemPos.itemIndex == -1)
1534 itemBounds.y = GetTopMargin();
1539 if (GetPreviousItemPosition(itemPos, seriesItemPos))
1541 if (__pListModel->IsLoadedItem(seriesItemPos.groupIndex, seriesItemPos.itemIndex))
1543 pSeriesItem = static_cast<_TableViewItem*>(__pListModel->LoadItem(seriesItemPos.groupIndex, seriesItemPos.itemIndex));
1544 if ((pSeriesItem != null) && pSeriesItem->HasParent())
1546 if (__pTableView->IsReorderModeEnabled() && (__reorderInfo.groupIndex == seriesItemPos.groupIndex && __reorderInfo.itemIndex == seriesItemPos.itemIndex))
1548 seriesItemBounds = __reorderInfo.itemBounds;
1552 seriesItemBounds = pSeriesItem->GetBoundsF();
1555 itemBounds.y = seriesItemBounds.y + seriesItemBounds.height;
1562 if ((!validBounds) && GetNextItemPosition(itemPos, seriesItemPos))
1564 if (__pListModel->IsLoadedItem(seriesItemPos.groupIndex, seriesItemPos.itemIndex))
1566 pSeriesItem = static_cast<_TableViewItem*>(__pListModel->LoadItem(seriesItemPos.groupIndex, seriesItemPos.itemIndex));
1567 if ((pSeriesItem != null) && pSeriesItem->HasParent())
1569 if (__pTableView->IsReorderModeEnabled() && (__reorderInfo.groupIndex == seriesItemPos.groupIndex && __reorderInfo.itemIndex == seriesItemPos.itemIndex))
1571 seriesItemBounds = __reorderInfo.itemBounds;
1575 seriesItemBounds = pSeriesItem->GetBoundsF();
1578 itemBounds.y = seriesItemBounds.y - itemBounds.height;
1589 pItem->SetBounds(itemBounds);
1591 CheckItemHeightAndRefreshLayout(itemPos, downScroll);
1595 itemBounds.y = CalculateItemPositionY(itemPos.groupIndex, itemPos.itemIndex);
1596 pItem->SetBounds(itemBounds);
1598 CheckItemHeightAndRefreshLayout(itemPos, true);
1601 if (__pTableView->IsReorderModeEnabled() && __reorderInfo.itemIndex != -1)
1603 TableViewItemTag reorderSelectedItemTag = {__reorderInfo.groupIndex, __reorderInfo.itemIndex};
1604 _TableViewItem* pReorderSelectedItem = FindItem(reorderSelectedItemTag);
1606 if (pReorderSelectedItem != null)
1608 pReorderSelectedItem->GetVisualElement()->SetZOrder(null, true);
1612 if (pItem->GetItemLayoutEnabled())
1614 pItem->PartialUpdateLayout();
1619 _TableViewPresenter::LoadItem(int groupIndex, int itemIndex)
1621 _TableViewItem* pItem = static_cast<_TableViewItem*>(__pListModel->LoadItem(groupIndex, itemIndex));
1623 if ((pItem != null) && !pItem->HasParent())
1625 __lockLoadItemWithScroll = true;
1627 __pTableView->AttachChild(*pItem);
1629 pItem->SetDrawingProperty(__pItemDrawingProperty);
1631 TableViewItemTag itemPosition = {groupIndex, itemIndex};
1632 SetItemType(pItem, itemPosition);
1633 SetItemLayout(pItem, itemPosition);
1634 pItem->SetReorderMode(__pTableView->IsReorderModeEnabled());
1636 __lockLoadItemWithScroll = false;
1643 _TableViewPresenter::FindItem(TableViewItemTag& itemTag)
1645 if (__pListModel->IsLoadedItem(itemTag.groupIndex, itemTag.itemIndex))
1647 return static_cast<_TableViewItem*>(__pListModel->LoadItem(itemTag.groupIndex, itemTag.itemIndex));
1653 _TableViewPresenter::UnloadItem(int groupIndex, int itemIndex)
1655 __pListModel->UnloadItem(groupIndex, itemIndex);
1659 _TableViewPresenter::UnloadItem(TableViewItemTag& itemTag)
1661 __pListModel->UnloadItem(itemTag.groupIndex, itemTag.itemIndex);
1667 _TableViewPresenter::DetachItem(TableViewItemTag& itemTag)
1669 _TableViewItem *pItem = FindItem(itemTag);
1671 if (pItem != null && pItem->HasParent())
1673 pItem->GetParent()->DetachChild(*pItem);
1678 _TableViewPresenter::DetachContextItem(TableViewItemTag& itemTag)
1680 _TableViewItem *pItem = FindItem(itemTag);
1686 _TableViewItem* contextItem = pItem->GetContextItem();
1687 if (contextItem != null && contextItem->HasParent())
1689 contextItem->GetParent()->DetachChild(*pItem);
1694 _TableViewPresenter::DetachAllItem(bool removeItem)
1696 TableViewItemTag itemPos = {-1, -1};
1697 TableViewItemTag lastItemPos = {-1, -1};
1699 __pListModel->GetFirstLoadedItemIndex(itemPos.groupIndex, itemPos.itemIndex);
1700 __pListModel->GetLastLoadedItemIndex(lastItemPos.groupIndex, lastItemPos.itemIndex);
1702 if (itemPos.groupIndex == -1 && itemPos.itemIndex == -1)
1709 DetachItem(itemPos);
1713 UnloadItem(itemPos);
1716 if (itemPos.itemIndex == lastItemPos.itemIndex && itemPos.groupIndex == lastItemPos.groupIndex)
1720 } while (GetNextItemPosition(itemPos, itemPos));
1724 _TableViewPresenter::SetItemDrawingProperty(void)
1726 if (__pItemDrawingProperty != null)
1728 __pItemDrawingProperty->propertyChanged = false;
1730 if (__pItemDrawingProperty->itemDividerEnabled != __pTableView->IsItemDividerEnabled())
1732 __pItemDrawingProperty->itemDividerEnabled = __pTableView->IsItemDividerEnabled();
1733 __pItemDrawingProperty->propertyChanged = true;
1736 if (__pItemDrawingProperty->dividerColor != __pTableView->GetItemDividerColor())
1738 __pItemDrawingProperty->dividerColor = __pTableView->GetItemDividerColor();
1739 __pItemDrawingProperty->propertyChanged = true;
1742 if (__pItemDrawingProperty->sectionStyleEnabled != (__pTableView->GetTableViewStyle() == TABLE_VIEW_STYLE_SECTION))
1744 __pItemDrawingProperty->sectionStyleEnabled = (__pTableView->GetTableViewStyle() == TABLE_VIEW_STYLE_SECTION);
1745 __pItemDrawingProperty->propertyChanged = true;
1748 if (__pItemDrawingProperty->sectionStyleBgColor != __pTableView->GetSectionColor())
1750 __pItemDrawingProperty->sectionStyleBgColor = __pTableView->GetSectionColor();
1751 __pItemDrawingProperty->propertyChanged = true;
1754 if (__pTableView->GetTableViewStyle() != TABLE_VIEW_STYLE_SIMPLE)
1756 if (__pItemDrawingProperty->groupedLookEnabled != __pTableView->IsGroupedLookEnabled())
1758 __pItemDrawingProperty->groupedLookEnabled = __pTableView->IsGroupedLookEnabled();
1759 __pItemDrawingProperty->propertyChanged = true;
1763 if (__pItemDrawingProperty->reorderMode != __pTableView->IsReorderModeEnabled())
1765 __pItemDrawingProperty->reorderMode = __pTableView->IsReorderModeEnabled();
1766 __pItemDrawingProperty->propertyChanged = true;
1769 if (!_FloatCompare(__pItemDrawingProperty->leftMargin, __leftMargin))
1771 __pItemDrawingProperty->leftMargin = __leftMargin;
1772 __pItemDrawingProperty->propertyChanged = true;
1775 if (__pTableView->GetScrollStyle() == TABLE_VIEW_SCROLL_BAR_STYLE_FAST_SCROLL_FIXED)
1777 GET_SHAPE_CONFIG(TABLEVIEW::FASTSCROLL_INDEX_WIDTH, _CONTROL_ORIENTATION_PORTRAIT,
1778 __pItemDrawingProperty->scrollMargin);
1782 __pItemDrawingProperty->scrollMargin = 0;
1785 if (!_FloatCompare(__pItemDrawingProperty->width, __pTableView->GetBoundsF().width))
1787 __pItemDrawingProperty->width = __pTableView->GetBoundsF().width;
1788 __pItemDrawingProperty->propertyChanged = true;
1794 _TableViewPresenter::OnBoundsChanged(void)
1796 float listWidth = __pTableView->GetBoundsF().width - (GetLeftMargin() * 2);
1798 if (__pProviderAdaptor != null && __modelInitialized)
1800 StopExpandCollapseAnimation();
1802 if (__pTableView->IsReorderModeEnabled() && __reorderInfo.itemIndex != -1)
1804 ResetReorderItem(__reorderInfo.groupIndex, __reorderInfo.itemIndex);
1807 if (!_FloatCompare(listWidth, __pProviderAdaptor->GetListWidth()))
1809 __pProviderAdaptor->SetListWidth(listWidth);
1811 SetItemDrawingProperty();
1813 AdjustLoadedItemWidth();
1815 __pTableView->UpdateLayout();
1818 SetClientAreaHeight(__itemTotalHeight);
1821 AdjustLayoutItems(GetScrollPosition());
1825 if (__pProviderAdaptor != null)
1827 __pProviderAdaptor->SetListWidth(listWidth);
1830 SetClientAreaHeight(__pTableView->GetBoundsF().height);
1831 _ScrollPanelPresenter::OnBoundsChanged();
1836 _TableViewPresenter::Draw(void)
1838 result r = _ScrollPanelPresenter::Draw();
1839 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
1841 if (__modelInitialized == false)
1843 SetItemDrawingProperty();
1845 if(PreloadItem() == false)
1847 __pTableView->SetFocusNavigateEnabled(false);
1851 if (__reservedScrollItemIndex.groupIndex != -1 && __reservedScrollItemIndex.itemIndex != -1)
1853 ScrollToItem(__reservedScrollItemIndex.groupIndex, __reservedScrollItemIndex.itemIndex, __reservedScrollItemAlignment);
1855 __reservedScrollItemIndex.groupIndex = -1;
1856 __reservedScrollItemIndex.itemIndex = -1;
1862 __firstDrawnFlag = false;
1865 if (IsEmpty() == true)
1867 __pTableView->SetFocusNavigateEnabled(false);
1868 return DrawEmptyTableView();
1872 __pTableView->SetFocusNavigateEnabled(true);
1878 _UiTouchEventDelivery
1879 _TableViewPresenter::OnPreviewTouchPressed(const _Control& source, const _TouchInfo& touchInfo)
1881 _UiTouchEventDelivery response = _ScrollPanelPresenter::OnPreviewTouchPressed(source, touchInfo);
1883 _TableViewItem* pItem = GetTableViewItemFromControl(source);
1889 TableViewItemTag itemPos = {-1, -1};
1891 pItem->GetItemIndex(itemPos.groupIndex, itemPos.itemIndex);
1893 if (itemPos.groupIndex == -1 && itemPos.itemIndex == -1)
1898 if (IsScrollAnimationRunning() && (GetScrollPosition() == GetScrollPositionInternal()))
1900 pItem->SetTouchPressOnScroll(true);
1904 if (__pTableView->IsReorderModeEnabled())
1906 __firstTouchMoved = true;
1908 if (SelectReorderItem(itemPos.groupIndex, itemPos.itemIndex, false))
1910 __reorderInfo.touchPressedPositionY = touchInfo.GetCurrentPosition().y;
1917 _UiTouchEventDelivery
1918 _TableViewPresenter::OnPreviewTouchMoved(const _Control& source, const _TouchInfo& touchInfo)
1920 if (__pTableView->IsReorderModeEnabled())
1922 if (__reorderInfo.itemIndex != -1)
1924 if (!DragSelectedItem(touchInfo.GetCurrentPosition().y - __reorderInfo.touchPressedPositionY, true))
1926 __firstTouchMoved = false;
1928 ResetReorderItem(__reorderInfo.groupIndex, __reorderInfo.itemIndex);
1931 return _UI_TOUCH_EVENT_DELIVERY_NO;
1935 return _ScrollPanelPresenter::OnPreviewTouchMoved(source, touchInfo);
1938 _UiTouchEventDelivery
1939 _TableViewPresenter::OnPreviewTouchReleased(const _Control& source, const _TouchInfo& touchInfo)
1941 if (__pTableView->IsReorderModeEnabled() && __reorderInfo.itemIndex != -1)
1943 ResetReorderItem(__reorderInfo.groupIndex, __reorderInfo.itemIndex);
1945 if (__reorderInfo.blockedTouchReleaseState)
1947 __reorderInfo.blockedTouchReleaseState = false;
1949 return _UI_TOUCH_EVENT_DELIVERY_NO;
1953 return _ScrollPanelPresenter::OnPreviewTouchReleased(source, touchInfo);
1956 _UiTouchEventDelivery
1957 _TableViewPresenter::OnPreviewTouchCanceled(const _Control& source, const _TouchInfo& touchInfo)
1959 return _ScrollPanelPresenter::OnPreviewTouchCanceled(source, touchInfo);
1963 _TableViewPresenter::OnTouchPressed(const _Control& source, const _TouchInfo& touchInfo)
1965 __firstTouchMoved = true;
1967 _TableViewItem* pItem = GetTableViewItemFromControl(source);
1971 StopExpandCollapseAnimation();
1972 return _ScrollPanelPresenter::OnTouchPressed(source, touchInfo);
1975 TableViewItemTag itemPos = {-1, -1};
1976 pItem->GetItemIndex(itemPos.groupIndex, itemPos.itemIndex);
1978 if (!(pItem->IsContextItem()
1979 || pItem->IsItemEnabled() == false
1980 || pItem->GetItemType() == TABLE_VIEW_ITEM_TYPE_TITLE
1981 || pItem->GetItemType() == TABLE_VIEW_ITEM_TYPE_HEADER
1982 || pItem->GetItemType() == TABLE_VIEW_ITEM_TYPE_FOOTER)
1983 && ((itemPos.groupIndex != __sweptItemTag.groupIndex)
1984 || (itemPos.itemIndex != __sweptItemTag.itemIndex)))
1989 __sweepOccured = false;
1991 StopExpandCollapseAnimation();
1993 return _ScrollPanelPresenter::OnTouchPressed(source, touchInfo);
1997 _TableViewPresenter::OnTouchMoved(const _Control& source, const _TouchInfo& touchInfo)
1999 if (__pTableView->IsReorderModeEnabled())
2001 if (__reorderInfo.blockedScroll)
2006 return _ScrollPanelPresenter::OnTouchMoved(source, touchInfo);
2009 _TableViewItem* pItem = GetTableViewItemFromControl(source);
2011 || pItem->IsItemEnabled() == false
2012 || pItem->GetItemType() == TABLE_VIEW_ITEM_TYPE_TITLE
2013 || pItem->GetItemType() == TABLE_VIEW_ITEM_TYPE_HEADER
2014 || pItem->GetItemType() == TABLE_VIEW_ITEM_TYPE_FOOTER
2015 || pItem->IsAnnexOnOffSliding())
2017 return _ScrollPanelPresenter::OnTouchMoved(source, touchInfo);;
2020 if (__firstTouchMoved)
2022 FloatPoint prevTouchPosition = GetPreviousTouchPosition();
2023 FloatPoint currTouchPosition = GetCurrentTouchPosition();
2024 float moveDistanceX = currTouchPosition.x - prevTouchPosition.x;
2025 float moveDistanceY = currTouchPosition.y - prevTouchPosition.y;
2027 if ((pItem->GetContextItem() != null && abs(moveDistanceX) > abs(moveDistanceY * 2)) || pItem->IsContextItem())
2029 if (!pItem->IsContextItem() && !pItem->IsAnimationPlaying())
2031 pItem->GetItemIndex(__sweptItemTag.groupIndex, __sweptItemTag.itemIndex);
2032 __sweptItemPosition = pItem->GetPositionF();
2034 pItem->AdjustContextItemBounds();
2037 __sweepOccured = true;
2039 else if (pItem->GetContextItem() == null && __pTableView->IsSweepEnabled())
2041 __sweepOccured = true;
2049 __firstTouchMoved = false;
2053 FloatPoint prevTouchPosition = GetPreviousTouchPosition();
2054 FloatPoint currTouchPosition = GetCurrentTouchPosition();
2056 SweepItem(currTouchPosition.x - prevTouchPosition.x);
2061 return _ScrollPanelPresenter::OnTouchMoved(source, touchInfo);
2065 _TableViewPresenter::OnTouchReleased(const _Control& source, const _TouchInfo& touchInfo)
2067 _TableViewItem* pItem = GetTableViewItemFromControl(source);
2070 || pItem->GetItemType() == TABLE_VIEW_ITEM_TYPE_TITLE
2071 || pItem->GetItemType() == TABLE_VIEW_ITEM_TYPE_HEADER
2072 || pItem->GetItemType() == TABLE_VIEW_ITEM_TYPE_FOOTER)
2074 return _ScrollPanelPresenter::OnTouchReleased(source, touchInfo);
2079 if (pItem->IsContextItem())
2081 pItem = static_cast<_TableViewItem*>(__pListModel->LoadItem(__sweptItemTag.groupIndex, __sweptItemTag.itemIndex));
2083 _TableViewItem* pContextItem = pItem->GetContextItem();
2086 if (pContextItem == null && __pTableView->IsSweepEnabled())
2088 FloatPoint prevPos = _ScrollPanelPresenter::GetPreviousTouchPosition();
2090 if (prevPos.x > touchInfo.GetCurrentPosition().x)
2092 pItem->FireItemSweepEvent(TABLE_VIEW_SWEEP_DIRECTION_LEFT);
2094 else if (prevPos.x < touchInfo.GetCurrentPosition().x)
2096 pItem->FireItemSweepEvent(TABLE_VIEW_SWEEP_DIRECTION_RIGHT);
2101 else if (pContextItem != null)
2103 AdjustSweptItemPosition(true);
2107 return _ScrollPanelPresenter::OnTouchReleased(source, touchInfo);
2111 _TableViewPresenter::OnTouchCanceled(const _Control& source, const _TouchInfo& touchInfo)
2118 if (__pTableView->IsReorderModeEnabled() && __reorderInfo.itemIndex != -1)
2120 ResetReorderItem(__reorderInfo.groupIndex, __reorderInfo.itemIndex);
2124 return _ScrollPanelPresenter::OnTouchCanceled(source, touchInfo);
2128 _TableViewPresenter::OnFlickGestureDetected(_TouchFlickGestureDetector& gesture)
2130 if (__pTableView->IsReorderModeEnabled() && __reorderInfo.itemIndex != -1)
2135 _FlickDirection flickDirection = gesture.GetDirection();
2137 if (flickDirection != _FLICK_DIRECTION_RIGHT && flickDirection != _FLICK_DIRECTION_LEFT)
2139 return _ScrollPanelPresenter::OnFlickGestureDetected(gesture);
2142 _Control* gestureControl = gesture.GetControl();
2144 if (gestureControl == null)
2146 return _ScrollPanelPresenter::OnFlickGestureDetected(gesture);
2149 _TableViewItem* pItem = GetTableViewItemFromControl(*gestureControl);
2153 return _ScrollPanelPresenter::OnFlickGestureDetected(gesture);
2156 if (flickDirection == _FLICK_DIRECTION_RIGHT)
2159 if (pItem->GetContextItem() == null && __pTableView->IsSweepEnabled())
2161 pItem->FireItemSweepEvent(TABLE_VIEW_SWEEP_DIRECTION_RIGHT);
2165 if (pItem->GetContextItem() != null)
2167 AdjustSweptItemPosition();
2171 else if (flickDirection == _FLICK_DIRECTION_LEFT)
2174 if (pItem->GetContextItem() == null && __pTableView->IsSweepEnabled())
2176 pItem->FireItemSweepEvent(TABLE_VIEW_SWEEP_DIRECTION_LEFT);
2180 if (pItem->GetContextItem() != null)
2182 AdjustSweptItemPosition();
2191 _TableViewPresenter::OnFlickGestureCanceled(_TouchFlickGestureDetector& gesture)
2193 return _ScrollPanelPresenter::OnFlickGestureCanceled(gesture);
2197 _TableViewPresenter::OnPreviewFlickGestureDetected(_TouchFlickGestureDetector& gesture)
2199 if (__pTableView->IsReorderModeEnabled() && __reorderInfo.itemIndex != -1)
2204 _FlickDirection flickDirection = gesture.GetDirection();
2205 if (flickDirection != _FLICK_DIRECTION_RIGHT && flickDirection != _FLICK_DIRECTION_LEFT)
2207 return _ScrollPanelPresenter::OnFlickGestureDetected(gesture);
2214 _TableViewPresenter::OnTimerExpired(Tizen::Base::Runtime::Timer& timer)
2216 _ScrollPanelPresenter::OnTimerExpired(timer);
2218 if (&timer == __pReorderScrollTimer)
2220 float distance = 0.0f;
2222 if (__reorderInfo.isScrollDirectionUp)
2224 distance = -REORDER_SCROLL_ANIMATION_DISTANCE;
2228 distance = REORDER_SCROLL_ANIMATION_DISTANCE;
2231 DragSelectedItem(distance, false);
2233 distance = ScrollTo(distance + GetScrollPosition());
2235 StartReorderScrollTimer();
2237 else if (&timer == __pFastScrollTimer)
2239 __isFastScrollTimerEnabled = false;
2241 _FastScroll* pFastScroll = __pTableView->GetFastScrollBar();
2243 if (pFastScroll != null && !_ScrollPanelPresenter::IsScrollAnimationRunning())
2245 pFastScroll->SetScrollVisibility(false);
2251 _TableViewPresenter::StartFastScrollTimer(void)
2253 result r = E_SUCCESS;
2255 SysTryReturn(NID_UI_CTRL,
2256 __pTableView->GetScrollStyle() == TABLE_VIEW_SCROLL_BAR_STYLE_FAST_SCROLL,
2257 E_INVALID_OPERATION, E_INVALID_OPERATION, "[E_INVALID_OPERATION] The style of TableView scroll is not TABLE_VIEW_SCROLL_BAR_STYLE_FAST_SCROLL");
2258 SysTryReturn(NID_UI_CTRL, __pFastScrollTimer != null, E_INVALID_STATE, E_INVALID_STATE, "[E_INVALID_STATE] Timer is not created.");
2260 r = __pFastScrollTimer->Start(FAST_SCROLL_FADE_OUT_DURATION);
2261 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
2263 __isFastScrollTimerEnabled = true;
2269 _TableViewPresenter::StopFastScrollTimer(void)
2271 result r = E_SUCCESS;
2273 SysTryReturnVoidResult(NID_UI_CTRL, __pFastScrollTimer != null, E_INVALID_STATE, "[E_INVALID_STATE] Timer is invalid.");
2275 r = __pFastScrollTimer->Cancel();
2276 SysTryReturnVoidResult(NID_UI_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
2278 __isFastScrollTimerEnabled = false;
2284 _TableViewPresenter::IsEmpty(void) const
2286 if (__pTableView->GetTableViewStyle() == TABLE_VIEW_STYLE_SIMPLE)
2288 if (GetItemCountAt(0) <= 0)
2295 if (GetGroupCount() <= 0 )
2305 _TableViewPresenter::DrawEmptyTableView(void)
2311 _TableViewPresenter::GetFirstItem(TableViewItemTag& firstItem) const
2315 firstItem.groupIndex = -1;
2316 firstItem.itemIndex = -1;
2320 firstItem.groupIndex = 0;
2321 firstItem.itemIndex = -1;
2328 _TableViewPresenter::GetLastItem(TableViewItemTag& lastItem) const
2332 lastItem.groupIndex = -1;
2333 lastItem.itemIndex = -1;
2337 lastItem.groupIndex = GetGroupCount() - 1;
2338 lastItem.itemIndex = GetItemCountAt(lastItem.groupIndex) - 1;
2345 _TableViewPresenter::GetTopDrawnItem(TableViewItemTag& itemPos) const
2347 _TableViewItem* pItem = null;
2348 TableViewItemTag lastItemPos = {-1, -1};
2349 float scrollPosition = 0.0f;
2351 scrollPosition = GetScrollPosition();
2353 __pListModel->GetFirstLoadedItemIndex(itemPos.groupIndex, itemPos.itemIndex);
2354 __pListModel->GetLastLoadedItemIndex(lastItemPos.groupIndex, lastItemPos.itemIndex);
2358 pItem = static_cast <_TableViewItem*>(__pListModel->LoadItem(itemPos.groupIndex, itemPos.itemIndex));
2364 FloatRectangle itemBounds = pItem->GetBoundsF();
2366 if (scrollPosition < (itemBounds.y + itemBounds.height))
2371 if ((itemPos.itemIndex == lastItemPos.itemIndex) && (itemPos.groupIndex == lastItemPos.groupIndex))
2376 } while (GetNextItemPosition(itemPos, itemPos) == true);
2379 itemPos.itemIndex = -1;
2380 itemPos.groupIndex = -1;
2382 return E_OUT_OF_RANGE;
2386 _TableViewPresenter::GetBottomDrawnItem(TableViewItemTag& itemPos) const
2388 _TableViewItem* pItem = null;
2389 TableViewItemTag lastItemPos = {-1, -1};
2393 itemPos.itemIndex = -1;
2394 itemPos.groupIndex = -1;
2396 return E_INVALID_STATE;
2399 float scrollPosition = GetScrollPosition() + __pTableView->GetBoundsF().height;
2401 __pListModel->GetFirstLoadedItemIndex(itemPos.groupIndex, itemPos.itemIndex);
2402 __pListModel->GetLastLoadedItemIndex(lastItemPos.groupIndex, lastItemPos.itemIndex);
2406 static bool onProcessingByProvider = true;
2407 pItem = static_cast <_TableViewItem*>(__pListModel->LoadItem(itemPos.groupIndex, itemPos.itemIndex));
2408 onProcessingByProvider = false;
2414 FloatRectangle itemBounds = pItem->GetBoundsF();
2416 if (itemBounds.y <= scrollPosition && scrollPosition <= (itemBounds.y + itemBounds.height))
2421 if ((itemPos.itemIndex == lastItemPos.itemIndex) && (itemPos.groupIndex == lastItemPos.groupIndex))
2426 } while (GetNextItemPosition(itemPos, itemPos) == true);
2432 _TableViewPresenter::GetPreviousItemPosition(const TableViewItemTag& currentItemPos, TableViewItemTag& prevItem) const
2439 // check validation of group index
2440 if ((currentItemPos.groupIndex < 0) || (currentItemPos.groupIndex >= __pListModel->GetAllGroupCount()))
2445 // if the current item is the first item
2446 if (currentItemPos.groupIndex == 0 && currentItemPos.itemIndex == -1)
2451 if (currentItemPos.itemIndex == -1)
2453 if (__pListModel->IsGroupExpanded(currentItemPos.groupIndex - 1) == false)
2455 prevItem.groupIndex = currentItemPos.groupIndex - 1;
2456 prevItem.itemIndex = -1;
2462 if (__pListModel->IsGroupExpanded(currentItemPos.groupIndex) == false)
2464 if (currentItemPos.groupIndex == 0 && currentItemPos.itemIndex == -1)
2469 prevItem.groupIndex = currentItemPos.groupIndex - 1;
2470 prevItem.itemIndex = __pListModel->GetItemCountInGroup(prevItem.groupIndex) - 1;
2475 if (currentItemPos.itemIndex == -1) // group title item
2477 prevItem.groupIndex = currentItemPos.groupIndex - 1;
2478 prevItem.itemIndex = __pListModel->GetItemCountInGroup(prevItem.groupIndex) - 1;
2482 prevItem.groupIndex = currentItemPos.groupIndex;
2483 prevItem.itemIndex = currentItemPos.itemIndex - 1;
2490 _TableViewPresenter::GetNextItemPosition(const TableViewItemTag& currentItem, TableViewItemTag& nextItem) const
2497 int lastGroup = __pListModel->GetAllGroupCount() - 1;
2498 int lastItemInCurrentGroup = __pListModel->GetItemCountInGroup(currentItem.groupIndex) - 1;
2499 int lastItem = __pListModel->GetItemCountInGroup(lastGroup) - 1;
2501 // check validation of group index
2502 if ((currentItem.groupIndex < 0) || (currentItem.groupIndex > lastGroup))
2507 // if the current item is the last item.
2508 if ((currentItem.groupIndex == lastGroup) && (currentItem.itemIndex == lastItem))
2513 if (__pListModel->IsGroupExpanded(currentItem.groupIndex) == false)
2515 if (currentItem.groupIndex == lastGroup)
2520 nextItem.groupIndex = currentItem.groupIndex + 1;
2521 nextItem.itemIndex = -1;
2526 if (lastItemInCurrentGroup == currentItem.itemIndex)
2528 nextItem.groupIndex = currentItem.groupIndex + 1;
2529 nextItem.itemIndex = -1;
2533 nextItem.groupIndex = currentItem.groupIndex;
2534 nextItem.itemIndex = currentItem.itemIndex + 1;
2541 _TableViewPresenter::GetHeightOfAllItems(void) const
2543 int groupCount = GetGroupCount();
2544 float totalHeight = 0;
2546 for (int i = 0; i < groupCount; i++)
2548 TableViewItemTag itemTag = {i, -1};
2550 totalHeight += GetItemHeight(itemTag);
2552 if (!IsGroupExpanded(i))
2557 int itemCount = GetItemCountAt(i);
2559 for (int j = 0; j < itemCount; j++)
2561 itemTag.itemIndex = j;
2563 totalHeight += GetItemHeight(itemTag);
2571 _TableViewPresenter::SetTableViewItemProviderAdaptor(_TableViewItemProviderAdaptor* pProviderAdaptor)
2573 __pListModel->RegisterItemProviderAdaptor(pProviderAdaptor);
2575 __pProviderAdaptor = pProviderAdaptor;
2577 if (__pProviderAdaptor != null)
2579 __pProviderAdaptor->SetTableViewPresenter(this);
2583 _TableViewItemProviderAdaptor*
2584 _TableViewPresenter::GetTableViewItemProviderAdaptor(void) const
2586 return __pProviderAdaptor;
2590 _TableViewPresenter::ExpandGroup(int groupIndex, bool withAnimation)
2592 if ((groupIndex < 0) || (groupIndex >= GetGroupCount()))
2594 return E_OUT_OF_RANGE;
2597 if (__modelInitialized == false)
2599 return E_INVALID_STATE;
2602 if (IsGroupExpanded(groupIndex) == true)
2607 TableViewItemTag topTag;
2608 GetTopDrawnItem(topTag);
2610 TableViewItemTag bottomTag;
2611 GetBottomDrawnItem(bottomTag);
2613 float screenPosition = GetScrollPosition();
2615 __pListModel->SetGroupExpandState(groupIndex, true);
2619 _TableViewItem* pItem = null;
2620 TableViewItemTag itemTag = {-1, -1};
2621 float groupTotalHeight = 0.0f;
2622 int itemCount = GetItemCountAt(groupIndex);
2623 for (int i = 0; i < itemCount; i++)
2625 pItem = static_cast<_TableViewItem*>(__pListModel->GetItemFromTemporaryBuffer(groupIndex, i));
2626 groupTotalHeight += pItem->GetItemHeight();
2627 itemTag.groupIndex = groupIndex;
2628 itemTag.itemIndex = i;
2629 SetItemHeight(itemTag, pItem->GetItemHeight());
2631 AdjustClientAreaBounds(false, groupTotalHeight);
2633 if (groupIndex < topTag.groupIndex || groupIndex > bottomTag.groupIndex)
2635 _TableViewItem* pItem = FindItem(topTag);
2638 FloatRectangle itemBounds = pItem->GetBoundsF();
2639 itemBounds.y = CalculateItemPositionY(topTag.groupIndex, topTag.itemIndex);
2640 pItem->SetBounds(itemBounds);
2641 AttachNextItemsToBottom(topTag);
2642 if (groupIndex < topTag.groupIndex)
2644 ScrollTo(screenPosition + groupTotalHeight);
2648 int firstLoadedGroupIndex = -1;
2649 int firstLoadedItemIndex = -1;
2650 __pListModel->GetFirstLoadedItemIndex(firstLoadedGroupIndex, firstLoadedItemIndex);
2652 for (int j = firstLoadedGroupIndex; j <= topTag.groupIndex; j++)
2654 int itemCount = GetItemCountAt(j);
2656 for (int i = -1; i < itemCount; i++)
2658 if (i >= topTag.itemIndex && j == topTag.groupIndex)
2669 itemTag.groupIndex = groupIndex;
2670 itemTag.itemIndex = -1;
2672 __expandableItemTag.groupIndex = groupIndex;
2673 __expandableItemTag.itemIndex = -1;
2677 _TableViewItem *pItem = FindItem(itemTag);
2683 FloatRectangle itemBounds = pItem->GetBoundsF();
2684 float startPosition = itemBounds.y + itemBounds.height;
2686 float endPosition = startPosition + groupTotalHeight;
2687 if (endPosition > screenPosition + __pTableView->GetBoundsF().height)
2689 endPosition = screenPosition + __pTableView->GetBoundsF().height;
2692 _VisualElement* pVisualElement = __pTableView->GetVisualElement();
2693 String animationName(L"EXPAND_GROUP_ANIMATION");
2695 VisualElementValueAnimation* pAnimation = __pTableView->GetVisualElementValueAnimation(animationName);
2696 pAnimation->SetStartValue(Variant(startPosition));
2697 pAnimation->SetEndValue(Variant(endPosition));
2698 pAnimation->SetDuration(EXPAND_GROUP_ANIMATION_DURATION);
2699 pVisualElement->AddAnimation(animationName, *pAnimation);
2703 ExpandGroupAnimationFinished(false);
2710 _TableViewPresenter::CollapseGroup(int groupIndex, bool withAnimation)
2712 if ((groupIndex < 0) || (groupIndex >= GetGroupCount()))
2714 return E_OUT_OF_RANGE;
2717 if (__modelInitialized == false)
2719 return E_INVALID_STATE;
2722 if (IsGroupExpanded(groupIndex) == false)
2727 TableViewItemTag itemTag;
2728 GetTopDrawnItem(itemTag);
2730 TableViewItemTag bottomTag;
2731 GetBottomDrawnItem(bottomTag);
2732 float screenPosition = GetScrollPosition();
2734 __pListModel->SetGroupExpandState(groupIndex, false);
2738 if (groupIndex < itemTag.groupIndex || groupIndex > bottomTag.groupIndex)
2740 _TableViewItem* pItem = null;
2741 TableViewItemTag itemTag = {-1, -1};
2742 float groupTotalHeight = 0;
2743 int itemCount = GetItemCountAt(groupIndex);
2744 for (int i = 0; i < itemCount; i++)
2746 _TableViewItem* pItem = static_cast<_TableViewItem*>(__pListModel->GetItemFromTemporaryBuffer(groupIndex, i));
2747 groupTotalHeight += pItem->GetItemHeight();
2748 itemTag.groupIndex = groupIndex;
2749 itemTag.itemIndex = i;
2750 SetItemHeight(itemTag, pItem->GetItemHeight());
2753 TableViewItemTag firstLoadedItemTag;
2754 __pListModel->GetFirstLoadedItemIndex(firstLoadedItemTag.groupIndex, firstLoadedItemTag.itemIndex);
2756 if (firstLoadedItemTag.groupIndex == groupIndex)
2758 SetLoadedItemsVisibleInGroup(groupIndex, false);
2759 firstLoadedItemTag.groupIndex = groupIndex + 1;
2760 firstLoadedItemTag.itemIndex = -1;
2763 for (int i = 0; i < itemCount; i++)
2765 UnloadItem(groupIndex, i);
2768 __pListModel->GetFirstLoadedItemIndex(firstLoadedItemTag.groupIndex, firstLoadedItemTag.itemIndex);
2769 pItem = FindItem(firstLoadedItemTag);
2772 FloatRectangle itemBounds = pItem->GetBoundsF();
2773 itemBounds.y = CalculateItemPositionY(firstLoadedItemTag.groupIndex, firstLoadedItemTag.itemIndex);
2774 pItem->SetBounds(itemBounds);
2775 AttachNextItemsToBottom(firstLoadedItemTag);
2776 if (groupIndex < itemTag.groupIndex)
2778 ScrollTo(screenPosition - groupTotalHeight);
2782 AdjustClientAreaBounds(false, -groupTotalHeight);
2787 if (itemTag.groupIndex < groupIndex)
2789 itemTag.groupIndex = groupIndex;
2790 itemTag.itemIndex = -1;
2792 __expandableItemTag.groupIndex = itemTag.groupIndex;
2793 __expandableItemTag.itemIndex = itemTag.itemIndex;
2795 if(__firstDrawnFlag)
2797 withAnimation = false;
2802 _TableViewItem *pItem = FindItem(itemTag);
2808 FloatRectangle itemBounds = pItem->GetBoundsF();
2809 float startPosition = 0;
2810 if (itemTag.itemIndex == -1)
2812 startPosition = itemBounds.y + itemBounds.height;
2816 startPosition = GetScrollPosition();
2819 if (bottomTag.groupIndex > groupIndex)
2821 bottomTag.groupIndex = groupIndex+1;
2822 bottomTag.itemIndex = -1;
2825 pItem = FindItem(bottomTag);
2831 itemBounds = pItem->GetBoundsF();
2832 float endPosition = itemBounds.y;
2833 if (bottomTag.groupIndex != groupIndex +1)
2835 endPosition += itemBounds.height;
2838 if (endPosition > screenPosition + __pTableView->GetBoundsF().height)
2840 endPosition = screenPosition + __pTableView->GetBoundsF().height;
2843 _VisualElement* pVisualElement = __pTableView->GetVisualElement();
2844 String animationName(L"COLLAPSE_GROUP_ANIMATION");
2846 VisualElementValueAnimation* pAnimation = __pTableView->GetVisualElementValueAnimation(animationName);
2847 pAnimation->SetStartValue(Variant(endPosition));
2848 pAnimation->SetEndValue(Variant(startPosition));
2849 pAnimation->SetDuration(COLLAPSE_GROUP_ANIMATION_DURATION);
2850 pVisualElement->AddAnimation(animationName, *pAnimation);
2854 CollapseGroupAnimationFinished(false);
2861 _TableViewPresenter::IsGroupExpanded(int groupIndex) const
2863 return __pListModel->IsGroupExpanded(groupIndex);
2867 _TableViewPresenter::StopExpandCollapseAnimation(void)
2869 _VisualElement* pVisualElement = __pTableView->GetVisualElement();
2870 String animationName(L"EXPAND_GROUP_ANIMATION");
2871 VisualElementValueAnimation* pExpandGroupAnimation = dynamic_cast<VisualElementValueAnimation*>(pVisualElement->GetAnimationN(animationName));
2872 if (pExpandGroupAnimation != null)
2874 pVisualElement->RemoveAnimation(animationName);
2875 delete pExpandGroupAnimation;
2878 animationName = L"COLLAPSE_GROUP_ANIMATION";
2879 VisualElementValueAnimation* pCollapseGroupAnimation = dynamic_cast<VisualElementValueAnimation*>(pVisualElement->GetAnimationN(animationName));
2880 if (pCollapseGroupAnimation != null)
2882 pVisualElement->RemoveAnimation(animationName);
2883 delete pCollapseGroupAnimation;
2888 _TableViewPresenter::LoadAllItemsInGroup(int groupIndex, bool downward)
2890 int itemCountInGroup = __pListModel->GetItemCountInGroup(groupIndex);
2891 _TableViewItem* pItem = null;
2895 for (int i = 0; i < itemCountInGroup; i++)
2897 pItem = LoadItem(groupIndex, i);
2901 SysLogException(NID_UI_CTRL, E_SYSTEM, "[E_SYSTEM] Unable to load item.");
2907 for (int i = itemCountInGroup-1; i >= 0; i--)
2909 pItem = LoadItem(groupIndex, i);
2913 SysLogException(NID_UI_CTRL, E_SYSTEM, "[E_SYSTEM] Unable to load item.");
2918 return itemCountInGroup;
2922 _TableViewPresenter::SetLoadedItemsVisibleInGroup(int groupIndex, bool visible)
2924 int itemCountInGroup = __pListModel->GetItemCountInGroup(groupIndex);
2925 _TableViewItem* pItem = null;
2926 TableViewItemTag itemTag;
2927 itemTag.groupIndex = groupIndex;
2929 int firstLoadedGroupIndex = -1;
2930 int firstLoadedItemIndex = -1;
2931 __pListModel->GetFirstLoadedItemIndex(firstLoadedGroupIndex, firstLoadedItemIndex);
2933 if (firstLoadedGroupIndex > groupIndex)
2939 if (groupIndex == firstLoadedGroupIndex && firstLoadedItemIndex > 0)
2941 startIndex = firstLoadedItemIndex;
2944 for (int i = startIndex; i < itemCountInGroup; i++)
2946 itemTag.itemIndex = i;
2947 pItem = FindItem(itemTag);
2953 pItem->SetVisibleState(visible);
2958 _TableViewPresenter::LoadItemsToBeVisible(const TableViewItemTag& from)
2960 TableViewItemTag bottomTag = from;
2961 TableViewItemTag current;
2962 TableViewItemTag next;
2964 _TableViewItem *pItem = LoadItem(from.groupIndex, from.itemIndex);
2971 FloatRectangle itemBounds = pItem->GetBoundsF();
2972 float viewHeight = __pTableView->GetBoundsF().height;
2973 float scrollPosition = GetScrollPosition();
2974 float itemPosition = itemBounds.y + itemBounds.height - scrollPosition;
2976 while (viewHeight >= itemPosition)
2978 current.groupIndex = bottomTag.groupIndex;
2979 current.itemIndex = bottomTag.itemIndex;
2980 if (!GetNextItemPosition(current, next))
2985 pItem = LoadItem(next.groupIndex, next.itemIndex);
2986 bottomTag.groupIndex = next.groupIndex;
2987 bottomTag.itemIndex = next.itemIndex;
2988 itemPosition += pItem->GetBoundsF().height;
2995 _TableViewPresenter::AttachNextItemsToBottom(const TableViewItemTag& anchor)
2997 TableViewItemTag itemTag = anchor;
2998 TableViewItemTag current;
2999 TableViewItemTag next;
3001 _TableViewItem *pItem = FindItem(itemTag);
3007 FloatRectangle itemBounds = pItem->GetBoundsF();
3008 float itemPosition = itemBounds.y + itemBounds.height;
3010 current.groupIndex = itemTag.groupIndex;
3011 current.itemIndex = itemTag.itemIndex;
3012 while (GetNextItemPosition(current, next))
3014 pItem = FindItem(next);
3021 itemBounds = pItem->GetBoundsF();
3022 itemBounds.y = itemPosition;
3023 pItem->SetBounds(itemBounds);
3024 itemPosition += itemBounds.height;
3030 _TableViewPresenter::IsAnyItemInGroupLoaded(int groupIndex) const
3032 int startGroupIndex = 0;
3033 int endGroupIndex = 0;
3036 __pListModel->GetFirstLoadedItemIndex(startGroupIndex, index);
3037 __pListModel->GetLastLoadedItemIndex(endGroupIndex, index);
3039 return groupIndex >= startGroupIndex && groupIndex <= endGroupIndex;
3043 _TableViewPresenter::ScrollToHideNonClientArea(TableViewItemTag& bottomTag)
3045 _TableViewItem* pItem = FindItem(bottomTag);
3051 FloatRectangle itemBounds = pItem->GetBoundsF();
3052 float viewHeight = __pTableView->GetBoundsF().height;
3053 float scrollPosition = GetScrollPosition();
3054 float itemBottom = itemBounds.y + itemBounds.height - scrollPosition;
3056 if (itemBottom < viewHeight)
3058 scrollPosition -= viewHeight - itemBottom;
3059 if (scrollPosition < 0)
3064 SetScrollPosition(scrollPosition, false);
3069 _TableViewPresenter::AdjustClientAreaBounds(bool reset, float dist)
3071 float clientHeight = 0;
3075 __itemTotalHeight = GetHeightOfAllItems();
3076 clientHeight = __itemTotalHeight;
3080 __itemTotalHeight = __itemTotalHeight + dist;
3081 clientHeight = __itemTotalHeight;
3084 SetClientAreaHeight(clientHeight);
3088 _TableViewPresenter::SetClientAreaHeight(float height)
3090 FloatRectangle screenBounds = __pTableView->GetBoundsF();
3091 FloatRectangle clientBounds = screenBounds;
3093 clientBounds.height = height;
3095 if (clientBounds.height < screenBounds.height)
3097 clientBounds.height = screenBounds.height;
3100 SetScrollAreaBounds(clientBounds);
3102 _Scroll* pScroll = __pTableView->GetScrollBar();
3103 if (pScroll != null)
3105 pScroll->SetScrollRange(__pTableView->GetBoundsF().height, clientBounds.height);
3110 _TableViewPresenter::UnloadInvisibleItems(void)
3112 float scrollPosition = GetScrollPosition();
3113 TableViewItemTag itemTag;
3114 __pListModel->GetFirstLoadedItemIndex(itemTag.groupIndex, itemTag.itemIndex);
3116 _TableViewItem* pItem = null;
3117 FloatRectangle bounds;
3119 while ((pItem = FindItem(itemTag)) != null)
3121 if (itemTag.itemIndex != -1)
3123 bounds = pItem->GetBoundsF();
3124 if (bounds.y + bounds.height < scrollPosition)
3126 UnloadItem(itemTag);
3133 __pListModel->GetFirstLoadedItemIndex(itemTag.groupIndex, itemTag.itemIndex);
3136 __pListModel->GetLastLoadedItemIndex(itemTag.groupIndex, itemTag.itemIndex);
3137 scrollPosition += __pTableView->GetBoundsF().height;
3139 while ((pItem = FindItem(itemTag)) != null)
3141 if (itemTag.itemIndex != -1)
3143 bounds = pItem->GetBoundsF();
3144 if (bounds.y > scrollPosition)
3146 UnloadItem(itemTag);
3153 __pListModel->GetLastLoadedItemIndex(itemTag.groupIndex, itemTag.itemIndex);
3159 _TableViewPresenter::ScrollToInternal(float newPosition)
3161 if (!IsScrollEnabled())
3166 if (IsScrollAnimationRunning())
3168 if (__scrollPositionOnFlickStarted > newPosition)
3170 newPosition += GetScrollAreaBounds().height - __scrollHeightOnFlickStarted;
3174 float currentScrollPosition = GetScrollPosition();
3175 float currentscrollAreaHeight = GetScrollAreaBounds().height;
3176 float newScrollPosition = (newPosition < 0) ? 0 : (newPosition > currentscrollAreaHeight ? currentscrollAreaHeight : newPosition);
3177 float newScrollAreaHeight = 0;
3179 if (IsModelUpdating())
3181 currentScrollPosition = GetScrollPositionInternal();
3184 if (!__lockLoadItemWithScroll)
3186 LoadItemWithScrollPosition(currentScrollPosition, newScrollPosition);
3188 if (currentScrollPosition > newScrollPosition)
3190 newScrollAreaHeight = GetScrollAreaBounds().height;
3191 newScrollPosition += newScrollAreaHeight - currentscrollAreaHeight;
3195 //scroll effect for _ScrollPanel
3196 if (newPosition < 0.0f || newPosition > currentscrollAreaHeight - __pTableView->GetBoundsF().height)
3198 newScrollPosition = newPosition;
3201 return _ScrollPanelPresenter::ScrollToInternal(newScrollPosition);
3205 _TableViewPresenter::LoadItemWithScrollPosition(float previousScrollPosition, float currentScrollPos)
3209 TableViewItemTag lastLoadedItemPos = {-1, -1};
3210 TableViewItemTag firstLoadedItemPos = {-1, -1};
3211 __pListModel->GetLastLoadedItemIndex(lastLoadedItemPos.groupIndex, lastLoadedItemPos.itemIndex);
3212 __pListModel->GetFirstLoadedItemIndex(firstLoadedItemPos.groupIndex, firstLoadedItemPos.itemIndex);
3214 if (currentScrollPos > previousScrollPosition && lastLoadedItemPos.groupIndex != -1)
3216 _TableViewItem* pLastItem = FindItem(lastLoadedItemPos);
3217 if (pLastItem == null)
3222 while (pLastItem && (pLastItem->GetBoundsF().y <= currentScrollPos + __pTableView->GetBoundsF().height))
3224 TableViewItemTag nextItemPos = {-1, -1};
3225 if (GetNextItemPosition(lastLoadedItemPos, nextItemPos))
3227 if (nextItemPos.itemIndex == -1)
3229 LoadItem(nextItemPos.groupIndex, nextItemPos.itemIndex);
3231 if (!GetNextItemPosition(nextItemPos, nextItemPos))
3237 if (nextItemPos.groupIndex != -1)
3239 _TableViewItem* pItem = LoadItem(nextItemPos.groupIndex, nextItemPos.itemIndex);
3245 FloatRectangle scrollAreaBounds = GetScrollAreaBounds();
3246 if (pItem->GetBoundsF().y + pItem->GetBoundsF().height >= scrollAreaBounds.height)
3248 AdjustClientAreaBounds(true);
3257 lastLoadedItemPos = nextItemPos;
3258 pLastItem = static_cast<_TableViewItem*>(__pListModel->LoadItem(lastLoadedItemPos.groupIndex, lastLoadedItemPos.itemIndex));
3262 if (currentScrollPos < previousScrollPosition && firstLoadedItemPos.groupIndex != -1)
3264 _TableViewItem* pFirstItem = FindItem(firstLoadedItemPos);
3265 if (pFirstItem == null)
3270 float scrollOffsetFromBottom = GetScrollAreaBounds().height - currentScrollPos;
3274 FloatRectangle scrollAreaBounds = GetScrollAreaBounds();
3275 float itemOffsetFromBottom = scrollAreaBounds.height - (pFirstItem->GetBoundsF().y + pFirstItem->GetBoundsF().height);
3277 if (scrollOffsetFromBottom < itemOffsetFromBottom)
3282 TableViewItemTag prevItemPos = {-1, -1};
3283 if (GetPreviousItemPosition(firstLoadedItemPos, prevItemPos))
3285 if (prevItemPos.itemIndex == -1)
3287 LoadItem(prevItemPos.groupIndex, prevItemPos.itemIndex);
3289 if (!GetPreviousItemPosition(prevItemPos, prevItemPos))
3295 if (prevItemPos.groupIndex != -1)
3297 LoadItem(prevItemPos.groupIndex, prevItemPos.itemIndex);
3305 firstLoadedItemPos = prevItemPos;
3306 pFirstItem = FindItem(firstLoadedItemPos);
3312 _TableViewPresenter::ScrollToItem(int groupIndex, int itemIndex, TableViewScrollItemAlignment itemAlignment, float shiftingDistance)
3314 _VisualElement* pVisualElement = __pTableView->GetVisualElement();
3315 String animationName(L"EXPAND_GROUP_ANIMATION");
3316 VisualElementValueAnimation* pExpandGroupAnimation = dynamic_cast<VisualElementValueAnimation*>(pVisualElement->GetAnimationN(animationName));
3317 if (pExpandGroupAnimation != null)
3319 __scrollToItemTag.groupIndex = groupIndex;
3320 __scrollToItemTag.itemIndex = itemIndex;
3321 __scrollToItemTag.itemAlignment = itemAlignment;
3322 __scrollToItemTag.shiftingDistance = shiftingDistance;
3323 __scrollToItemTag.startedAnimation = true;
3324 delete pExpandGroupAnimation;
3328 animationName = L"COLLAPSE_GROUP_ANIMATION";
3329 VisualElementValueAnimation* pCollapseGroupAnimation = dynamic_cast<VisualElementValueAnimation*>(pVisualElement->GetAnimationN(animationName));
3330 if (pCollapseGroupAnimation != null)
3332 __scrollToItemTag.groupIndex = groupIndex;
3333 __scrollToItemTag.itemIndex = itemIndex;
3334 __scrollToItemTag.itemAlignment = itemAlignment;
3335 __scrollToItemTag.shiftingDistance = shiftingDistance;
3336 __scrollToItemTag.startedAnimation = true;
3337 delete pCollapseGroupAnimation;
3341 if (IsGroupExpanded(groupIndex) == false)
3346 TableViewItemTag itemPos = {groupIndex, itemIndex};
3348 StopAllItemAnimation();
3351 if (!__pListModel->IsLoadedItem(groupIndex, itemIndex))
3353 ResetItemLayout(itemPos, shiftingDistance);
3356 _TableViewItem* pItem = FindItem(itemPos);
3363 float scrollPosition = pItem->GetBoundsF().y;
3365 scrollPosition = scrollPosition + shiftingDistance;
3367 SetScrollPosition(scrollPosition, false);
3369 if (itemAlignment == TABLE_VIEW_SCROLL_ITEM_ALIGNMENT_BOTTOM)
3371 SetScrollPosition(scrollPosition - (__pTableView->GetBoundsF().height - pItem->GetBoundsF().height), false);
3376 _TableViewPresenter::ScrollByPixel(float scrollDistance)
3379 result r = GetLastResult();
3380 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
3384 ScrollTo(scrollDistance + GetScrollPosition());
3385 r = GetLastResult();
3386 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
3388 RollbackBouncing(true);
3389 r = GetLastResult();
3390 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
3393 r = GetLastResult();
3394 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
3400 _TableViewPresenter::SetScrollEnabled(bool enable)
3402 __scrolling = enable;
3406 _TableViewPresenter::IsScrollEnabled(void) const
3412 _TableViewPresenter::GetFirstDrawnFlag(void) const
3414 return __firstDrawnFlag;
3418 _TableViewPresenter::GetMaxItemCachingSize(void) const
3420 return __pListModel->GetMaxCachingSize();
3424 _TableViewPresenter::ResetSweepItem(void)
3426 if (__sweptItemTag.groupIndex != -1 && __sweptItemTag.itemIndex != -1)
3433 _TableViewPresenter::GetSweepItemIndex(int& groupIndex, int& itemIndex) const
3435 groupIndex = __sweptItemTag.groupIndex;
3436 itemIndex = __sweptItemTag.itemIndex;
3440 _TableViewPresenter::GetPressedItemCount(void)
3442 _TableViewItem* pItem = null;
3443 TableViewItemTag itemPos = {-1, -1};
3444 TableViewItemTag lastItemPos = {-1, -1};
3447 __pListModel->GetFirstLoadedItemIndex(itemPos.groupIndex, itemPos.itemIndex);
3448 __pListModel->GetLastLoadedItemIndex(lastItemPos.groupIndex, lastItemPos.itemIndex);
3452 pItem = static_cast <_TableViewItem*>(__pListModel->LoadItem(itemPos.groupIndex, itemPos.itemIndex));
3458 if (pItem->GetDrawingStatus() == TABLE_VIEW_ITEM_DRAWING_STATUS_PRESSED)
3463 if ((itemPos.itemIndex == lastItemPos.itemIndex) && (itemPos.groupIndex == lastItemPos.groupIndex))
3467 } while (GetNextItemPosition(itemPos, itemPos) == true);
3473 _TableViewPresenter::BlockAnimationCallback(bool blocked)
3475 __isAnimationCallbackBlocked = blocked;
3479 _TableViewPresenter::CalculateItemPositionY(int groupIndex, int itemIndex)
3481 TableViewItemTag itemPos = {-1, -1};
3482 TableViewItemTag currentItemPos = {-1, -1};
3483 float positionY = 0.0f;
3485 GetFirstItem(itemPos);
3487 if (itemPos.groupIndex == -1 && itemPos.itemIndex == -1)
3492 if (__pProviderAdaptor == null)
3497 positionY = GetTopMargin();
3499 while ((itemPos.groupIndex < groupIndex) || ((itemPos.groupIndex == groupIndex) && (itemPos.itemIndex < itemIndex)))
3501 currentItemPos = itemPos;
3503 float itemHeight = GetItemHeight(itemPos);
3505 positionY += itemHeight;
3507 if (!GetNextItemPosition(currentItemPos, itemPos))
3517 _TableViewPresenter::FadeInScrollBar(void)
3519 TableViewScrollBarStyle scrollStyle = __pTableView->GetScrollStyle();
3521 if (scrollStyle == TABLE_VIEW_SCROLL_BAR_STYLE_NONE)
3523 _Scroll* pScroll = __pTableView->GetScrollBar();
3525 if (pScroll != null)
3527 pScroll->SetVisibleState(false);
3530 else if (scrollStyle == TABLE_VIEW_SCROLL_BAR_STYLE_FAST_SCROLL)
3532 _Scroll* pScroll = __pTableView->GetScrollBar();
3534 if (pScroll != null)
3536 pScroll->SetVisibleState(false);
3539 _FastScroll* pFastScroll = __pTableView->GetFastScrollBar();
3541 if (pFastScroll != null)
3543 pFastScroll->SetScrollVisibility(true);
3548 _ScrollPanelPresenter::FadeInScrollBar();
3553 _TableViewPresenter::FadeOutScrollBar(void)
3555 TableViewScrollBarStyle scrollStyle = __pTableView->GetScrollStyle();
3556 if (scrollStyle == TABLE_VIEW_SCROLL_BAR_STYLE_FAST_SCROLL)
3558 StopFastScrollTimer();
3560 if (!_ScrollPanelPresenter::IsScrollAnimationRunning())
3562 StartFastScrollTimer();
3565 else if (scrollStyle == TABLE_VIEW_SCROLL_BAR_STYLE_FIXED)
3567 _Scroll* pScroll = __pTableView->GetScrollBar();
3569 if (pScroll != null)
3571 pScroll->SetScrollingEffectVisibility(false);
3576 _ScrollPanelPresenter::FadeOutScrollBar();
3581 _TableViewPresenter::SweepItem(float x)
3583 if (!_FloatCompare(x, 0.0f))
3585 _TableViewItem* pItem = static_cast<_TableViewItem*>(__pListModel->LoadItem(__sweptItemTag.groupIndex, __sweptItemTag.itemIndex));
3589 _TableViewItem* pContextItem = pItem->GetContextItem();
3591 if (pContextItem != null)
3593 float currentPosition = __sweptItemPosition.x + x;
3594 float sweepDistance = __pTableView->GetBoundsF().width;
3595 float sweepMargin = 0.0f;
3596 float contextItemWidth = pItem->GetBoundsF().width;
3597 bool activated = pItem->IsContextItemActivated();
3598 bool needToFireEvent = false;
3600 GET_SHAPE_CONFIG(TABLEVIEW::CONTEXTITEM_RIGHT_MARGIN, _CONTROL_ORIENTATION_PORTRAIT, sweepMargin);
3602 if (currentPosition >= (sweepDistance - sweepMargin))
3604 currentPosition = (sweepDistance - sweepMargin);
3605 needToFireEvent = !activated;
3607 else if (currentPosition <= __leftMargin)
3609 currentPosition = __leftMargin;
3610 needToFireEvent = activated;
3613 __sweptItemPosition.x = currentPosition;
3615 // Set TableViewItem bounds
3616 pItem->SetPosition(__sweptItemPosition);
3618 // Set TableViewContextItem bounds
3619 if (!__pTableView->IsAncestorOf(*pContextItem))
3621 pContextItem->SetDrawingProperty(__pItemDrawingProperty);
3622 __pTableView->InsertChildToBottom(*pContextItem);
3623 __pTableView->UpdateLayout();
3626 contextItemWidth = ((contextItemWidth > (__sweptItemPosition.x - __leftMargin)) ? (__sweptItemPosition.x - __leftMargin) : contextItemWidth);
3628 pContextItem->ExposeContextItem(FloatRectangle(__leftMargin, __sweptItemPosition.y, contextItemWidth, pContextItem->GetSizeF().height), pItem->GetSize().width);
3630 if (needToFireEvent)
3632 PLAY_FEEDBACK(_RESOURCE_FEEDBACK_PATTERN_SLIDER_SWEEP, pItem);
3634 activated = !activated; // ContextItem Activation State Changed
3636 __pTableView->FireTableViewContextItemActivationEvent(__sweptItemTag.groupIndex, __sweptItemTag.itemIndex, pContextItem, activated);
3637 pItem->SetContextItemActivation(activated);
3650 _TableViewPresenter::ResetSweptItem(void)
3652 _TableViewItem* pItem = static_cast<_TableViewItem*>(__pListModel->LoadItem(__sweptItemTag.groupIndex, __sweptItemTag.itemIndex));
3656 _VisualElement* pVisualElement = __pTableView->GetVisualElement();
3658 if (pVisualElement != null)
3660 String animationName(L"SWEEP_ITEM_ANIMATION");
3661 VisualElementAnimation* pContextItemAnimation = pVisualElement->GetAnimationN(animationName);
3662 if (pContextItemAnimation != null)
3664 pVisualElement->RemoveAnimation(animationName);
3666 delete pContextItemAnimation;
3670 pItem->SetPosition(FloatPoint(__leftMargin, __sweptItemPosition.y));
3672 _TableViewItem* pContextItem = pItem->GetContextItem();
3673 if (pContextItem != null)
3675 if (__pTableView->IsAncestorOf(*pContextItem))
3677 __pTableView->DetachChild(*pContextItem);
3680 if (pItem->IsContextItemActivated())
3682 __pTableView->FireTableViewContextItemActivationEvent(__sweptItemTag.groupIndex, __sweptItemTag.itemIndex, pContextItem, false);
3683 pItem->SetContextItemActivation(false);
3688 __sweptItemTag.itemIndex = -1;
3689 __sweptItemTag.groupIndex = -1;
3691 __sweptItemPosition.SetPosition(-1.0f, -1.0f);
3692 __sweepOccured = false;
3696 _TableViewPresenter::AdjustSweptItemPosition(bool withAnimation)
3698 float itemWidth = __pTableView->GetBoundsF().width;
3699 float sweepDistance = 0.0f;
3701 if (_FloatCompare(__sweptItemPosition.x, __leftMargin))
3707 float sweepMargin = 0.0f;
3708 GET_SHAPE_CONFIG(TABLEVIEW::CONTEXTITEM_RIGHT_MARGIN, _CONTROL_ORIENTATION_PORTRAIT, sweepMargin);
3710 if (__sweptItemPosition.x > (itemWidth - sweepMargin) / 2)
3712 sweepDistance = itemWidth - __sweptItemPosition.x;
3716 sweepDistance = -__sweptItemPosition.x;
3721 SweepItem(sweepDistance);
3725 _TableViewItem* pItem = static_cast<_TableViewItem*>(__pListModel->LoadItem(__sweptItemTag.groupIndex, __sweptItemTag.itemIndex));
3729 _VisualElement* pVisualElement = __pTableView->GetVisualElement();
3731 if (pVisualElement != null)
3733 String animationName(L"SWEEP_ITEM_ANIMATION");
3734 float startValue = __sweptItemPosition.x;
3735 float endValue = 0.0f;
3737 if(sweepDistance > 0)
3739 endValue = itemWidth - sweepMargin;
3743 if(_FloatCompare(itemWidth, __sweptItemPosition.x))
3745 endValue = itemWidth - sweepMargin;
3749 endValue = __leftMargin;
3753 pVisualElement->SetImplicitAnimationEnabled(false);
3755 VisualElementValueAnimation* pAnimation = __pTableView->GetVisualElementValueAnimation(animationName);
3756 pAnimation->SetStartValue(Variant(startValue));
3757 pAnimation->SetEndValue(Variant(endValue));
3758 pAnimation->SetDuration(SWEEP_ITEM_ANIMATION_DURATION);
3759 pVisualElement->AddAnimation(animationName, *pAnimation);
3766 _TableViewPresenter::AdjustLoadedItemWidth(void)
3768 TableViewItemTag lastLoadedItemPos = {-1, -1};
3769 TableViewItemTag firstLoadedItemPos = {-1, -1};
3770 __pListModel->GetLastLoadedItemIndex(lastLoadedItemPos.groupIndex, lastLoadedItemPos.itemIndex);
3771 __pListModel->GetFirstLoadedItemIndex(firstLoadedItemPos.groupIndex, firstLoadedItemPos.itemIndex);
3775 _TableViewItem* pItem = FindItem(firstLoadedItemPos);
3782 FloatDimension itemSize = pItem->GetSizeF();
3783 itemSize.width = __pProviderAdaptor->GetListWidth();
3785 pItem->SetItemChanged(true);
3786 pItem->SetSize(itemSize);
3788 if ((firstLoadedItemPos.itemIndex == lastLoadedItemPos.itemIndex) && (firstLoadedItemPos.groupIndex == lastLoadedItemPos.groupIndex))
3792 } while (GetNextItemPosition(firstLoadedItemPos, firstLoadedItemPos));
3796 _TableViewPresenter::OpenContextItem(int groupIndex, int itemIndex)
3798 SysTryReturn(NID_UI_CTRL, groupIndex >= 0 && groupIndex < GetGroupCount(), E_OUT_OF_RANGE, E_OUT_OF_RANGE, "[E_INVALID_ARG] Invalid group index.");
3800 TableViewItemTag itemTag = {groupIndex, itemIndex};
3801 _TableViewItem* pItem = FindItem(itemTag);
3803 SysTryReturn(NID_UI_CTRL, pItem != null, E_INVALID_OPERATION, E_INVALID_OPERATION, "[E_INVALID_OPERATION] Item was not loaded.");
3804 SysTryReturn(NID_UI_CTRL, pItem->GetContextItem() != null, E_INVALID_OPERATION, E_INVALID_OPERATION, "[E_INVALID_OPERATION] ContextItem is not set to the item.");
3805 SysTryReturn(NID_UI_CTRL,__sweptItemTag.groupIndex != groupIndex || __sweptItemTag.itemIndex != itemIndex, E_INVALID_OPERATION, E_INVALID_OPERATION, "[E_INVALID_OPERATION] ContextItem already opened.");
3809 __sweptItemTag.groupIndex = groupIndex;
3810 __sweptItemTag.itemIndex = itemIndex;
3811 __sweptItemPosition = pItem->GetPositionF();
3813 pItem->AdjustContextItemBounds();
3814 __sweepOccured = true;
3816 _VisualElement* pVisualElement = __pTableView->GetVisualElement();
3818 if (pVisualElement != null)
3820 float itemWidth = __pTableView->GetBoundsF().width;
3821 float sweepMargin = 0.0f;
3822 GET_SHAPE_CONFIG(TABLEVIEW::CONTEXTITEM_RIGHT_MARGIN, _CONTROL_ORIENTATION_PORTRAIT, sweepMargin);
3824 String animationName(L"SWEEP_ITEM_ANIMATION");
3825 float startValue = __sweptItemPosition.x;
3826 float endValue = itemWidth - sweepMargin;
3828 pVisualElement->SetImplicitAnimationEnabled(false);
3830 VisualElementValueAnimation* pAnimation = __pTableView->GetVisualElementValueAnimation(animationName);
3831 pAnimation->SetStartValue(Variant(startValue));
3832 pAnimation->SetEndValue(Variant(endValue));
3833 pAnimation->SetDuration(SWEEP_ITEM_ANIMATION_DURATION);
3834 pVisualElement->AddAnimation(animationName, *pAnimation);
3841 _TableViewPresenter::CloseContextItem(int groupIndex, int itemIndex)
3843 SysTryReturn(NID_UI_CTRL, groupIndex >= 0 && groupIndex < GetGroupCount(), E_OUT_OF_RANGE, E_OUT_OF_RANGE, "[E_INVALID_ARG] Invalid group index.");
3845 TableViewItemTag itemTag = {groupIndex, itemIndex};
3846 _TableViewItem* pItem = FindItem(itemTag);
3848 SysTryReturn(NID_UI_CTRL, pItem != null, E_INVALID_OPERATION, E_INVALID_OPERATION, "[E_INVALID_OPERATION] Item was not loaded.");
3849 SysTryReturn(NID_UI_CTRL, pItem->GetContextItem() != null, E_INVALID_OPERATION, E_INVALID_OPERATION, "[E_INVALID_OPERATION] ContextItem is not set to the item.");
3850 SysTryReturn(NID_UI_CTRL, __sweptItemTag.groupIndex == groupIndex && __sweptItemTag.itemIndex == itemIndex, E_INVALID_OPERATION, E_INVALID_OPERATION, "[E_INVALID_OPERATION] ContextItem was not opened.");
3858 _TableViewPresenter::IsContextItemOpened(int groupIndex, int itemIndex) const
3860 SysTryReturn(NID_UI_CTRL, groupIndex >= 0 && groupIndex < GetGroupCount(), false, E_OUT_OF_RANGE, "[E_INVALID_ARG] Invalid group index.");
3862 if ( __sweptItemTag.groupIndex == -1 && __sweptItemTag.itemIndex == -1)
3867 if (__sweptItemTag.groupIndex == groupIndex && __sweptItemTag.itemIndex == itemIndex)
3876 _TableViewPresenter::SetSectionHeaderTextHorizontalAlignment(int sectionIndex, HorizontalAlignment alignment)
3878 SysTryReturn(NID_UI_CTRL, __pTableView->GetTableViewStyle() == TABLE_VIEW_STYLE_SECTION, E_INVALID_OPERATION, E_INVALID_OPERATION, "[E_INVALID_OPERATION] The style of TableView is TABLE_VIEW_STYLE_SECTION");
3879 SysTryReturn(NID_UI_CTRL, HasSectionHeader(sectionIndex), E_INVALID_OPERATION, E_INVALID_OPERATION, "[E_INVALID_OPERATION] Header is not set to the section.");
3880 SysTryReturn(NID_UI_CTRL, sectionIndex >= 0 && sectionIndex < GetGroupCount(), E_OUT_OF_RANGE, E_OUT_OF_RANGE, "[E_INVALID_ARG] Invalid section index.");
3882 _TableViewSectionStringAlignment newAlignment;
3884 __sectionAlignmentList.GetAt(sectionIndex, newAlignment);
3885 newAlignment.headerHorizontalAlignment = alignment;
3886 __sectionAlignmentList.SetAt(newAlignment, sectionIndex);
3888 TableViewItemTag itemTag = {sectionIndex, -1};
3889 _TableViewItem* pItem = FindItem(itemTag);
3893 pItem->SetSectionHeaderFooterAlignment(alignment);
3900 _TableViewPresenter::GetSectionHeaderTextHorizontalAlignment(int sectionIndex) const
3902 SysTryReturn(NID_UI_CTRL, __pTableView->GetTableViewStyle() == TABLE_VIEW_STYLE_SECTION, ALIGNMENT_LEFT, E_INVALID_OPERATION, "[E_INVALID_OPERATION] The style of TableView is TABLE_VIEW_STYLE_SECTION");
3903 SysTryReturn(NID_UI_CTRL, HasSectionHeader(sectionIndex), ALIGNMENT_LEFT, E_INVALID_OPERATION, "[E_INVALID_OPERATION] Header is not set to the section.");
3904 SysTryReturn(NID_UI_CTRL, sectionIndex >= 0 && sectionIndex < GetGroupCount(), ALIGNMENT_LEFT, E_OUT_OF_RANGE, "[E_INVALID_ARG] Invalid section index.");
3906 _TableViewSectionStringAlignment alignment;
3907 __sectionAlignmentList.GetAt(sectionIndex, alignment);
3909 return alignment.headerHorizontalAlignment;
3913 _TableViewPresenter::SetSectionFooterTextHorizontalAlignment(int sectionIndex, HorizontalAlignment alignment)
3915 SysTryReturn(NID_UI_CTRL, __pTableView->GetTableViewStyle() == TABLE_VIEW_STYLE_SECTION, E_INVALID_OPERATION, E_INVALID_OPERATION, "[E_INVALID_OPERATION] The style of TableView is TABLE_VIEW_STYLE_SECTION");
3916 SysTryReturn(NID_UI_CTRL, HasSectionFooter(sectionIndex), E_INVALID_OPERATION, E_INVALID_OPERATION, "[E_INVALID_OPERATION] Footer is not set to the section.");
3917 SysTryReturn(NID_UI_CTRL, sectionIndex >= 0 && sectionIndex < GetGroupCount(), E_OUT_OF_RANGE, E_OUT_OF_RANGE, "[E_INVALID_ARG] Invalid section index.");
3919 _TableViewSectionStringAlignment newAlignment;
3921 __sectionAlignmentList.GetAt(sectionIndex, newAlignment);
3922 newAlignment.footerHorizontalAlignment= alignment;
3923 __sectionAlignmentList.SetAt(newAlignment, sectionIndex);
3925 TableViewItemTag itemTag = {sectionIndex, GetItemCountAt(sectionIndex) - 1};
3926 _TableViewItem* pItem = FindItem(itemTag);
3930 pItem->SetSectionHeaderFooterAlignment(alignment);
3937 _TableViewPresenter::GetSectionFooterTextHorizontalAlignment(int sectionIndex) const
3939 SysTryReturn(NID_UI_CTRL, __pTableView->GetTableViewStyle() == TABLE_VIEW_STYLE_SECTION, ALIGNMENT_RIGHT, E_INVALID_OPERATION, "[E_INVALID_OPERATION] The style of TableView is TABLE_VIEW_STYLE_SECTION");
3940 SysTryReturn(NID_UI_CTRL, HasSectionFooter(sectionIndex), ALIGNMENT_RIGHT, E_INVALID_OPERATION, "[E_INVALID_OPERATION] Footer is not set to the section.");
3941 SysTryReturn(NID_UI_CTRL, sectionIndex >= 0 && sectionIndex < GetGroupCount(), ALIGNMENT_RIGHT, E_OUT_OF_RANGE, "[E_INVALID_ARG] Invalid section index.");
3943 _TableViewSectionStringAlignment alignment;
3944 __sectionAlignmentList.GetAt(sectionIndex, alignment);
3946 return alignment.footerHorizontalAlignment;
3950 _TableViewPresenter::IsValidDrawnItem(int groupIndex, int itemIndex)
3952 TableViewItemTag currentItemTag = {groupIndex, itemIndex};
3953 TableViewItemTag itemTag = {-1, -1};
3955 if (GetNextItemPosition(currentItemTag, itemTag))
3957 if (__pListModel->IsLoadedItem(itemTag.groupIndex, itemTag.itemIndex))
3963 if (GetPreviousItemPosition(currentItemTag, itemTag))
3965 if (__pListModel->IsLoadedItem(itemTag.groupIndex, itemTag.itemIndex))
3975 _TableViewPresenter::StopAllItemAnimation(void)
3977 TableViewItemTag currentItemTag = {-1, -1};
3978 TableViewItemTag lastItemTag = {-1, -1};
3980 __pListModel->GetFirstLoadedItemIndex(currentItemTag.groupIndex, currentItemTag.itemIndex);
3981 __pListModel->GetLastLoadedItemIndex(lastItemTag.groupIndex, lastItemTag.itemIndex);
3985 _TableViewItem *pItem = FindItem(currentItemTag);
3988 pItem->StopAllAnimation();
3991 if (currentItemTag.groupIndex == lastItemTag.groupIndex && currentItemTag.itemIndex == lastItemTag.itemIndex)
3996 }while (GetNextItemPosition(currentItemTag, currentItemTag));
4000 _TableViewPresenter::GetTableViewItemPosition(_TableViewItem& item, TableViewItemTag& itemTag)
4002 TableViewItemTag lastLoadedItemPos = {-1, -1};
4003 TableViewItemTag firstLoadedItemPos = {-1, -1};
4004 __pListModel->GetLastLoadedItemIndex(lastLoadedItemPos.groupIndex, lastLoadedItemPos.itemIndex);
4005 __pListModel->GetFirstLoadedItemIndex(firstLoadedItemPos.groupIndex, firstLoadedItemPos.itemIndex);
4007 _TableViewItem* pCurrentItem = null;
4010 pCurrentItem = static_cast<_TableViewItem*>(__pListModel->LoadItem(firstLoadedItemPos.groupIndex, firstLoadedItemPos.itemIndex));
4011 if (pCurrentItem == &item)
4013 itemTag.groupIndex = firstLoadedItemPos.groupIndex;
4014 itemTag.itemIndex = firstLoadedItemPos.itemIndex;
4018 if ((firstLoadedItemPos.itemIndex == lastLoadedItemPos.itemIndex) && (firstLoadedItemPos.groupIndex == lastLoadedItemPos.groupIndex))
4022 } while (GetNextItemPosition(firstLoadedItemPos, firstLoadedItemPos));
4028 _TableViewPresenter::GetItemHeight(TableViewItemTag itemTag) const
4030 float itemHeight = 0.0f;
4032 if (__pTableView->GetTableViewStyle() == TABLE_VIEW_STYLE_SECTION && itemTag.itemIndex != -1)
4034 if (HasSectionFooter(itemTag.groupIndex))
4036 if (itemTag.itemIndex == GetItemCountAt(itemTag.groupIndex) - 1)
4038 GET_SHAPE_CONFIG(TABLEVIEW::GROUPITEM_DEFAULT_HEIGHT, _CONTROL_ORIENTATION_PORTRAIT, itemHeight);
4044 if (__pProviderAdaptor == null)
4050 for (int i = 0; i < itemTag.groupIndex; i++)
4052 int itemCount = GetItemCountAt(i);
4054 startIndex = startIndex + itemCount + 1;
4057 itemTag.itemIndex++;
4058 itemTag.itemIndex = startIndex + itemTag.itemIndex;
4060 __itemHeightList.GetAt(itemTag.itemIndex, itemHeight);
4066 _TableViewPresenter::SetItemHeight(TableViewItemTag itemTag, float height)
4070 for (int i = 0; i < itemTag.groupIndex; i++)
4072 int itemCount = GetItemCountAt(i);
4074 startIndex = startIndex + itemCount + 1;
4077 itemTag.itemIndex++;
4078 itemTag.itemIndex = startIndex + itemTag.itemIndex;
4080 float oldHeight = 0.0f;
4081 __itemHeightList.GetAt(itemTag.itemIndex, oldHeight);
4082 __itemHeightList.SetAt(height, itemTag.itemIndex);
4089 _TableViewPresenter::SetReorderMode(bool enabled)
4093 __reorderInfo.itemIndex = -1;
4094 __reorderInfo.groupIndex = -1;
4096 _TableViewItem* pItem = null;
4097 TableViewItemTag itemPos = {-1, -1};
4098 TableViewItemTag lastItemPos = {-1, -1};
4100 __pListModel->GetFirstLoadedItemIndex(itemPos.groupIndex, itemPos.itemIndex);
4101 __pListModel->GetLastLoadedItemIndex(lastItemPos.groupIndex, lastItemPos.itemIndex);
4105 pItem = FindItem(itemPos);
4109 if(pItem->IsReorderMode() == enabled)
4114 pItem->SetReorderMode(enabled);
4116 if (enabled && itemPos.itemIndex != -1)
4118 if (pItem->GetDrawingStatus() == TABLE_VIEW_ITEM_DRAWING_STATUS_PRESSED)
4120 if (SelectReorderItem(itemPos.groupIndex, itemPos.itemIndex, true))
4122 FloatPoint itemPosition = pItem->GetPositionF();
4123 FloatPoint touchPosition = pItem->GetLastTouchPressedPositionF();
4125 __reorderInfo.touchPressedPositionY = itemPosition.y + touchPosition.y - GetScrollPosition();
4126 __reorderInfo.blockedTouchReleaseState = true;
4132 if ((itemPos.itemIndex == lastItemPos.itemIndex) && (itemPos.groupIndex == lastItemPos.groupIndex))
4137 } while (GetNextItemPosition(itemPos, itemPos) == true);
4143 _TableViewPresenter::SelectReorderItem(int groupIndex, int itemIndex, bool directSelection)
4145 if (itemIndex == -1 || (!directSelection && GetPressedItemCount() > 0))
4150 TableViewItemTag itemPos = {groupIndex, itemIndex};
4151 _TableViewItem* pItem = FindItem(itemPos);
4158 pItem->SetDrawingStatus(TABLE_VIEW_ITEM_DRAWING_STATUS_PRESSED);
4159 pItem->SetItemChanged(true);
4160 pItem->Invalidate();
4162 __reorderInfo.blockedScroll = false;
4163 __reorderInfo.itemBounds = pItem->GetBoundsF();
4164 __reorderInfo.itemIndex = itemIndex;
4165 __reorderInfo.groupIndex = groupIndex;
4166 __reorderInfo.originGroupIndex = groupIndex;
4167 __reorderInfo.originItemIndex = itemIndex;
4168 __reorderInfo.itemBasisPositionY = __reorderInfo.itemBounds.y;
4170 Tizen::System::SystemTime::GetTicks(__reorderInfo.touchPressedTick);
4172 pItem->GetVisualElement()->SetZOrder(null, true);
4174 if (GetScrollAreaBounds().height < __pTableView->GetBoundsF().height)
4176 float itemHeight = pItem->GetBoundsF().height;
4178 __pListModel->GetLastLoadedItemIndex(itemPos.groupIndex, itemPos.itemIndex);
4180 pItem = FindItem(itemPos);
4184 FloatRectangle itemBounds = pItem->GetBoundsF();
4185 __reorderInfo.nonScrollableLimitArea = itemBounds.y + itemBounds.height - itemHeight;
4190 __reorderInfo.nonScrollableLimitArea = 0;
4197 _TableViewPresenter::ResetReorderItem(int groupIndex, int itemIndex)
4199 TableViewItemTag itemPos = {groupIndex, itemIndex};
4200 _TableViewItem* pItem = FindItem(itemPos);
4207 pItem->SetDrawingStatus(TABLE_VIEW_ITEM_DRAWING_STATUS_NORMAL);
4208 pItem->SetItemChanged(true);
4209 pItem->Invalidate();
4211 PLAY_FEEDBACK(_RESOURCE_FEEDBACK_PATTERN_LIST_REORDER, pItem);
4213 FloatPoint position = FloatPoint(__reorderInfo.itemBounds.x, __reorderInfo.itemBounds.y);
4214 pItem->SetPosition(position);
4216 if (__reorderInfo.originGroupIndex != __reorderInfo.groupIndex || __reorderInfo.originItemIndex != __reorderInfo.itemIndex)
4218 if (__pTableView->GetTableViewStyle() == TABLE_VIEW_STYLE_SIMPLE)
4220 __pTableView->FireTableViewItemReorderEvent(__reorderInfo.originItemIndex, __reorderInfo.itemIndex);
4222 else if (__pTableView->GetTableViewStyle() == TABLE_VIEW_STYLE_GROUPED)
4224 __pTableView->FireTableViewItemReorderEvent(__reorderInfo.originGroupIndex, __reorderInfo.originItemIndex, __reorderInfo.groupIndex, __reorderInfo.itemIndex);
4228 __reorderInfo.groupIndex = -1;
4229 __reorderInfo.itemIndex = -1;
4230 __reorderInfo.originGroupIndex = -1;
4231 __reorderInfo.originItemIndex = -1;
4232 __reorderInfo.nonScrollableLimitArea = 0;
4234 StopReorderScrollTimer();
4240 _TableViewPresenter::CheckReorderItemScrollAnimation(_TableViewItem *pItem)
4242 float currentScrollPosition = GetScrollPosition();
4243 float limitTopPositionY = currentScrollPosition;
4244 float limitBottomPositionY = currentScrollPosition + __pTableView->GetBoundsF().height - __reorderInfo.itemBounds.height;
4246 float itemPositionY = pItem->GetPositionF().y;
4248 if (itemPositionY < limitTopPositionY)
4250 if (__pReorderScrollTimer == null)
4252 __reorderInfo.isScrollDirectionUp = true;
4257 else if (itemPositionY > limitBottomPositionY)
4259 if (__pReorderScrollTimer == null)
4261 __reorderInfo.isScrollDirectionUp = false;
4271 _TableViewPresenter::DragSelectedItem(float distance, bool relativeCoordinate)
4273 TableViewItemTag itemPos = {__reorderInfo.groupIndex, __reorderInfo.itemIndex};
4274 _TableViewItem* pItem = FindItem(itemPos);
4281 if (__firstTouchMoved)
4283 long long currentTick = 0;
4284 Tizen::System::SystemTime::GetTicks(currentTick);
4286 if (currentTick - __reorderInfo.touchPressedTick < REORDER_TOUCH_UIACTIVATE_DURATION)
4291 __firstTouchMoved = false;
4294 FloatPoint itemPosition = pItem->GetPositionF();
4296 if (relativeCoordinate)
4298 itemPosition.y = __reorderInfo.itemBasisPositionY + distance;
4302 itemPosition.y += distance;
4304 __reorderInfo.itemBasisPositionY += distance;
4307 if (itemPosition.y < 0)
4312 float scrollAreaHeight = GetScrollAreaBounds().height;
4313 float screenHeight = __pTableView->GetBoundsF().height;
4314 float limitBottomPositionY = 0.0f;
4316 if (scrollAreaHeight < screenHeight)
4318 limitBottomPositionY = __reorderInfo.nonScrollableLimitArea;
4322 limitBottomPositionY = scrollAreaHeight - __reorderInfo.itemBounds.height;
4325 if (itemPosition.y > limitBottomPositionY)
4327 itemPosition.y = limitBottomPositionY;
4330 pItem->SetPosition(itemPosition);
4333 if (CheckReorderItemScrollAnimation(pItem))
4335 if (__pReorderScrollTimer == null)
4337 StartReorderScrollTimer();
4342 if (__pReorderScrollTimer != null)
4344 StopReorderScrollTimer();
4349 TableViewItemTag moveItemTag = {-1, -1};
4351 if (CheckReorderItemPosition(pItem, moveItemTag))
4353 if (moveItemTag.itemIndex == -1)
4355 int destGroupIndex = moveItemTag.groupIndex;
4357 if (destGroupIndex != 0 && destGroupIndex == __reorderInfo.groupIndex)
4362 if (moveItemTag.groupIndex == 0 || !__pProviderAdaptor->IsReorderable(__reorderInfo.groupIndex, destGroupIndex))
4364 __reorderInfo.blockedScroll = true;
4370 ReorderItem(moveItemTag.groupIndex, moveItemTag.itemIndex);
4377 _TableViewPresenter::CheckReorderItemPosition(_TableViewItem* pItem, TableViewItemTag& reorderItemTag)
4379 TableViewItemTag currentItemTag = {__reorderInfo.groupIndex, __reorderInfo.itemIndex};
4380 TableViewItemTag previousItemTag = {-1, -1};
4381 TableViewItemTag nextItemTag = {-1, -1};
4383 FloatRectangle itemBounds = pItem->GetBoundsF();
4385 if (GetPreviousItemPosition(currentItemTag, previousItemTag))
4387 _TableViewItem* pPreviousItem = LoadItem(previousItemTag.groupIndex, previousItemTag.itemIndex);
4389 if (pPreviousItem != null)
4391 FloatRectangle previousItemBounds = pPreviousItem->GetBoundsF();
4393 if (itemBounds.y < previousItemBounds.y + (previousItemBounds.height / 2))
4395 //return previousItemIndex;
4396 reorderItemTag.groupIndex = previousItemTag.groupIndex;
4397 reorderItemTag.itemIndex = previousItemTag.itemIndex;
4404 if (GetNextItemPosition(currentItemTag, nextItemTag))
4406 _TableViewItem* pNextItem = LoadItem(nextItemTag.groupIndex, nextItemTag.itemIndex);
4408 if (pNextItem != null)
4410 FloatRectangle nextItemBounds = pNextItem->GetBoundsF();
4412 if (itemBounds.y + itemBounds.height > nextItemBounds.y + (nextItemBounds.height / 2))
4414 //return nextItemIndex;
4415 reorderItemTag.groupIndex = nextItemTag.groupIndex;
4416 reorderItemTag.itemIndex = nextItemTag.itemIndex;
4423 reorderItemTag.groupIndex = -1;
4424 reorderItemTag.itemIndex = -1;
4430 _TableViewPresenter::ReorderItem(int destinationGroupIndex, int destinationItemIndex)
4432 TableViewItemTag itemPos = {destinationGroupIndex, destinationItemIndex};
4434 _TableViewItem* pItem = FindItem(itemPos);
4441 if (pItem->IsAnimationPlaying())
4446 FloatRectangle destinationItemBounds = pItem->GetBoundsF();
4448 FloatPoint destinationItemPosition = FloatPoint(destinationItemBounds.x, 0.0f);
4450 if ( __reorderInfo.itemIndex > destinationItemIndex && __reorderInfo.groupIndex == destinationGroupIndex)
4452 destinationItemPosition.y = __reorderInfo.itemBounds.y + __reorderInfo.itemBounds.height - destinationItemBounds.height;
4453 __reorderInfo.itemBounds.y = destinationItemBounds.y;
4455 if (destinationItemIndex == -1)
4457 destinationGroupIndex--;
4458 int itemCount = GetItemCountAt(destinationGroupIndex);
4459 destinationItemIndex = itemCount;
4464 destinationItemPosition.y = __reorderInfo.itemBounds.y;
4465 __reorderInfo.itemBounds.y = destinationItemBounds.y + destinationItemBounds.height - __reorderInfo.itemBounds.height;
4467 if (destinationItemIndex == -1)
4469 destinationItemIndex = 0;
4473 __pListModel->MoveItem(__reorderInfo.groupIndex, __reorderInfo.itemIndex, destinationGroupIndex, destinationItemIndex);
4475 if (!pItem->MoveItem(destinationItemPosition, REORDER_ITEM_MOVE_ANIMATION_DURATION, 0))
4477 pItem->SetPosition(destinationItemPosition);
4480 __reorderInfo.itemIndex = destinationItemIndex;
4481 __reorderInfo.groupIndex = destinationGroupIndex;
4487 _TableViewPresenter::StartReorderScrollTimer(void)
4489 StopReorderScrollTimer();
4491 __pReorderScrollTimer = new (std::nothrow) Tizen::Base::Runtime::Timer;
4492 SysTryReturnVoidResult(NID_UI_CTRL, __pReorderScrollTimer != null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
4494 result r = __pReorderScrollTimer->Construct(*this);
4495 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
4497 r = __pReorderScrollTimer->Start(REORDER_SCROLL_ANIMATION_TIMER_DURATION);
4498 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
4503 StopReorderScrollTimer();
4507 _TableViewPresenter::StopReorderScrollTimer(void)
4509 delete __pReorderScrollTimer;
4510 __pReorderScrollTimer = null;
4515 _TableViewPresenter::UpdateLayout(void)
4521 _TableViewPresenter::CheckItemHeightAndRefreshLayout(TableViewItemTag itemTag, bool downScroll)
4523 _TableViewItem* pItem = FindItem(itemTag);
4530 if (pItem->IsAnimationPlaying())
4535 FloatRectangle itemBounds = pItem->GetBoundsF();
4537 if (_FloatCompare(GetItemHeight(itemTag), itemBounds.height))
4542 float newHeight = itemBounds.height;
4543 float originHeight = SetItemHeight(itemTag, newHeight);
4544 float dist = newHeight - originHeight;
4546 AdjustClientAreaBounds(false, dist);
4550 itemBounds.y += dist;
4551 pItem->SetBounds(itemBounds);
4554 AttachNextItemsToBottom(itemTag);
4560 _TableViewPresenter::CreateItemHeightList(float defaultGroupItemHeight, float defaultItemHeight)
4562 int groupCount = GetGroupCount();
4564 result r = __itemHeightList.SetCapacity(GetItemCount());
4565 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
4567 for (int i = 0; i < groupCount; i++)
4569 int itemCount = GetItemCountAt(i);
4571 if (__pTableView->GetTableViewStyle() == TABLE_VIEW_STYLE_SIMPLE)
4573 __itemHeightList.Add(0.0f);
4577 __itemHeightList.Add(defaultGroupItemHeight);
4580 for (int j = 0; j < itemCount; j++)
4582 __itemHeightList.Add(defaultItemHeight);
4589 DeleteItemHeightList();
4595 _TableViewPresenter::DeleteItemHeightList(void)
4597 __itemHeightList.RemoveAll();
4601 _TableViewPresenter::RefreshItemHeightList(int groupIndex, int itemIndex, TableViewRefreshType refreshType)
4603 float defaultItemHeight = __pProviderAdaptor->GetDefaultItemHeight();
4604 float defaultGroupItemHeight = __pProviderAdaptor->GetDefaultGroupItemHeight();
4607 for (int i = 0; i < groupIndex; i++)
4609 int itemCount = GetItemCountAt(i);
4610 startIndex = startIndex + itemCount + 1;
4613 int targetIndex = startIndex + itemIndex + 1;
4615 if (refreshType == TABLE_VIEW_REFRESH_TYPE_ITEM_ADD)
4617 if (itemIndex == -1)
4619 result r = __itemHeightList.SetCapacity(GetItemCount());
4620 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, false, r, "[%s] Propagating.", GetErrorMessage(r));
4622 int itemCount = GetItemCountAt(groupIndex);
4623 for (int i = 0; i < itemCount; i++)
4625 __itemHeightList.InsertAt(defaultItemHeight, targetIndex);
4628 __itemHeightList.InsertAt(defaultGroupItemHeight, targetIndex);
4633 __itemHeightList.InsertAt(defaultItemHeight, targetIndex);
4636 else if (refreshType == TABLE_VIEW_REFRESH_TYPE_ITEM_REMOVE)
4638 if (itemIndex == -1)
4640 int itemCount = GetItemCountAt(groupIndex) + 1;
4642 for (int i = 0; i < itemCount; i++)
4644 __itemHeightList.RemoveAt(targetIndex);
4649 __itemHeightList.RemoveAt(targetIndex);
4657 _TableViewPresenter::CreateSectionAlignmentList(void)
4659 if (__pTableView->GetTableViewStyle() != TABLE_VIEW_STYLE_SECTION)
4664 int groupCount = GetGroupCount();
4666 result r = __sectionAlignmentList.SetCapacity(GetGroupCount());
4667 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, false, r, "[%s] Propagating.", GetErrorMessage(r));
4669 _TableViewSectionStringAlignment alignment;
4670 alignment.headerHorizontalAlignment = ALIGNMENT_LEFT;
4671 alignment.footerHorizontalAlignment = ALIGNMENT_RIGHT;
4673 for (int i = 0; i < groupCount; i++)
4676 __sectionAlignmentList.Add(alignment);
4683 _TableViewPresenter::DeleteSectionAlignmentList(void)
4685 __sectionAlignmentList.RemoveAll();
4689 _TableViewPresenter::RefreshSectionAlignmentList(int groupIndex, TableViewRefreshType refreshType)
4691 if (__pTableView->GetTableViewStyle() != TABLE_VIEW_STYLE_SECTION)
4696 if (refreshType == TABLE_VIEW_REFRESH_TYPE_ITEM_ADD)
4698 _TableViewSectionStringAlignment alignment;
4699 alignment.headerHorizontalAlignment = ALIGNMENT_LEFT;
4700 alignment.footerHorizontalAlignment = ALIGNMENT_RIGHT;
4702 __sectionAlignmentList.InsertAt(alignment, groupIndex);
4704 else if (refreshType == TABLE_VIEW_REFRESH_TYPE_ITEM_REMOVE)
4706 __sectionAlignmentList.RemoveAt(groupIndex);
4713 _TableViewPresenter::CaptureAndStartRemoveItemAnimation(int groupIndex, int itemIndex)
4715 TableViewItemTag itemTag = {groupIndex, itemIndex};
4716 _TableViewItem* pItem = FindItem(itemTag);
4723 FloatRectangle itemBounds = pItem->GetBoundsF();
4724 result r = E_SUCCESS;
4726 _VisualElement* pVisualElement = null;
4727 String animationName(L"REMOVE_ITEM_ANIMATION");
4728 Canvas* pCanvas = null;
4729 VisualElementValueAnimation* pAnimation = __pTableView->GetVisualElementValueAnimation(animationName);
4731 FloatDimension startValue(100.0f, itemBounds.height);
4732 FloatDimension endValue(0.0f, 0.0f);
4734 Tizen::Graphics::Bitmap* pBitmap = pItem->GetCapturedBitmapN(true);
4736 if (pBitmap == null)
4742 pVisualElement = new (std::nothrow) _VisualElement();
4743 SysTryCatch(NID_UI_CTRL, pVisualElement != null, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
4745 r = pVisualElement->Construct();
4746 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
4748 pVisualElement->SetImplicitAnimationEnabled(false);
4749 pVisualElement->SetSurfaceOpaque(false);
4750 pVisualElement->SetBounds(FloatRectangle(itemBounds.x, itemBounds.y, itemBounds.width, itemBounds.height));
4751 pVisualElement->SetShowState(true);
4753 pCanvas = pVisualElement->GetCanvasN();
4754 SysTryCatch(NID_UI_CTRL, pCanvas != null, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
4757 pCanvas->DrawBitmap(FloatRectangle(0, 0, itemBounds.width, itemBounds.height), *pBitmap);
4759 pAnimation->SetDelay(0);
4760 pAnimation->SetStartValue(Variant(startValue));
4761 pAnimation->SetEndValue(Variant(endValue));
4762 pAnimation->SetDuration(REMOVE_ITEM_MOVE_ANIMATION_DURATION);
4764 r = pVisualElement->AddAnimation(animationName, *pAnimation);
4765 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
4776 pVisualElement->Destroy();
4780 _TableViewPresenter::PresetItemHeightList(void)
4782 int groupCount = GetGroupCount();
4783 float defaultGroupItemHeight = __pProviderAdaptor->GetDefaultGroupItemHeight();
4784 float defaultItemHeight = __pProviderAdaptor->GetDefaultItemHeight();
4786 for (int i = 0; i < groupCount; i++)
4788 TableViewItemTag itemTag = {i, -1};
4789 int itemCount = GetItemCountAt(i);
4791 if (_FloatCompare(GetItemHeight(itemTag), TABLEVIEW_DEFAULT_ITEM_HEIGHT_VALUE))
4793 SetItemHeight(itemTag, defaultGroupItemHeight);
4796 for (int j = 0; j < itemCount; j++)
4798 itemTag.itemIndex = j;
4800 if (_FloatCompare(GetItemHeight(itemTag), TABLEVIEW_DEFAULT_ITEM_HEIGHT_VALUE))
4802 SetItemHeight(itemTag, defaultItemHeight);
4809 _TableViewPresenter::GetTableViewItemFromControl(const _Control& source)
4811 _Control* currentControl = const_cast<_Control*>(&source);
4812 _TableViewItem* pItem = null;
4814 while (__pTableView != currentControl)
4816 pItem = dynamic_cast<_TableViewItem*>(currentControl);
4818 if ((pItem != null) || (currentControl == null))
4823 currentControl = currentControl->GetParent();
4830 _TableViewPresenter::ShowTableViewCapturedItem(int groupIndex, int itemIndex, float height)
4832 TableViewItemTag itemTag = {groupIndex, itemIndex};
4833 _TableViewItem* pItem = FindItem(itemTag);
4835 if ((pItem == null) || _FloatCompare(height, 0.0f))
4840 result r = E_SUCCESS;
4841 Canvas* pCanvas = null;
4842 FloatRectangle itemBounds = pItem->GetBoundsF();
4844 bool visibleState = pItem->GetVisibleState();
4845 pItem->SetVisibleState(true);
4846 Bitmap* pBitmap = pItem->GetCapturedBitmapN(true);
4847 pItem->SetVisibleState(visibleState);
4849 if (pBitmap == null)
4854 if (__pCapturedItemVisualElement == null)
4856 __pCapturedItemVisualElement = new (std::nothrow) _VisualElement();
4857 SysTryCatch(NID_UI_CTRL, __pCapturedItemVisualElement != null, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
4859 r = __pCapturedItemVisualElement->Construct();
4860 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
4862 r = GetView()->GetVisualElement()->AttachChild(*__pCapturedItemVisualElement);
4863 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Failed to attach child to the control VisualElement.", GetErrorMessage(r));
4865 __pCapturedItemVisualElement->SetSurfaceOpaque(false);
4866 __pCapturedItemVisualElement->SetImplicitAnimationEnabled(false);
4869 __pCapturedItemVisualElement->SetShowState(true);
4870 __pCapturedItemVisualElement->SetBounds(FloatRectangle(itemBounds.x, itemBounds.y, itemBounds.width, height));
4872 pCanvas = __pCapturedItemVisualElement->GetCanvasN();
4873 SysTryCatch(NID_UI_CTRL, pCanvas != null, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
4875 pCanvas->SetBackgroundColor(Color(0, 0, 0, 0));
4877 pCanvas->DrawBitmap(FloatPoint(0.0f, 0.0f), *pBitmap);
4887 __pCapturedItemVisualElement->Destroy();
4891 _TableViewPresenter::SetLoadedItemsVisibleFromPosition(float position, bool visible)
4893 _TableViewItem* pItem;
4894 FloatRectangle itemBounds;
4895 TableViewItemTag current;
4896 current.groupIndex = __expandableItemTag.groupIndex;
4897 current.itemIndex = __expandableItemTag.itemIndex;
4899 int itemCountInGroup = __pListModel->GetItemCountInGroup(__expandableItemTag.groupIndex);
4901 for (int i = 0; i < itemCountInGroup; i++)
4903 current.itemIndex = i;
4907 pItem = LoadItem(current.groupIndex, current.itemIndex);
4915 pItem = FindItem(current);
4922 itemBounds = pItem->GetBoundsF();
4926 if ((position >= itemBounds.y) && (position < itemBounds.y + itemBounds.height))
4928 ShowTableViewCapturedItem(current.groupIndex, current.itemIndex, position - itemBounds.y);
4929 pItem->SetVisibleState(false);
4934 pItem->SetVisibleState(true);
4939 if (position < itemBounds.y)
4941 UnloadItem(current);
4943 else if ((position >= itemBounds.y) && (position < itemBounds.y + itemBounds.height))
4945 pItem->SetVisibleState(false);
4946 ShowTableViewCapturedItem(current.groupIndex, current.itemIndex, position - itemBounds.y);
4950 pItem->SetVisibleState(true);
4957 _TableViewPresenter::MoveLoadedItemsFromPosition(float position)
4959 FloatRectangle itemBounds;
4960 float itemPosition = position;
4962 TableViewItemTag current;
4963 TableViewItemTag next;
4965 current.groupIndex = __expandableItemTag.groupIndex;
4966 current.itemIndex = __pListModel->GetItemCountInGroup(__expandableItemTag.groupIndex) -1;
4968 float screenPosition = GetScrollPosition();
4969 FloatRectangle screenBounds = __pTableView->GetBoundsF();
4970 screenPosition += screenBounds.height;
4972 _TableViewItem* pItem = null;
4973 while (GetNextItemPosition(current, next))
4975 if (screenPosition > itemPosition)
4977 pItem = LoadItem(next.groupIndex, next.itemIndex);
4981 pItem = FindItem(next);
4989 itemBounds = pItem->GetBoundsF();
4990 itemBounds.y = itemPosition;
4991 pItem->SetBounds(itemBounds);
4992 itemPosition += itemBounds.height;
4999 _TableViewPresenter::ExpandGroupAnimationFinished(bool completedNormally)
5001 if (completedNormally == false)
5003 TableViewItemTag current;
5004 TableViewItemTag next;
5006 current.groupIndex = __expandableItemTag.groupIndex;
5007 current.itemIndex = -1;
5009 _TableViewItem* pNextItem = null;
5010 _TableViewItem* pCurrentItem = null;
5011 pCurrentItem = LoadItem(current.groupIndex, current.itemIndex);
5013 if (pCurrentItem == null)
5018 FloatRectangle itemBounds;
5019 FloatRectangle screenBounds = __pTableView->GetBoundsF();
5020 float screenPosition = GetScrollPosition() + screenBounds.height;
5021 float nextItemPositionY = pCurrentItem->GetBoundsF().y + pCurrentItem->GetBoundsF().height;
5023 while (GetNextItemPosition(current, next))
5025 if (screenPosition >= nextItemPositionY)
5027 pCurrentItem = LoadItem(current.groupIndex, current.itemIndex);
5028 if (pCurrentItem == null)
5032 pNextItem = LoadItem(next.groupIndex, next.itemIndex);
5033 if (pNextItem == null)
5037 pNextItem->SetVisibleState(true);
5038 itemBounds = pNextItem->GetBoundsF();
5039 itemBounds.y = pCurrentItem->GetBoundsF().y + pCurrentItem->GetBoundsF().height;
5040 pNextItem->SetBounds(itemBounds);
5041 nextItemPositionY = itemBounds.y + itemBounds.height;
5045 UnloadItem(next.groupIndex, next.itemIndex);
5053 int currentGroupIndex = -1;
5054 int currentItemIndex = -1;
5055 GetBottomDrawnItemIndex(currentGroupIndex, currentItemIndex);
5057 int lastLoadedGroupIndex = -1;
5058 int lastLoadedItemIndex = -1;
5059 __pListModel->GetLastLoadedItemIndex(lastLoadedGroupIndex, lastLoadedItemIndex);
5061 TableViewItemTag current;
5062 current.groupIndex = currentGroupIndex;
5063 current.itemIndex = currentItemIndex;
5065 _TableViewItem* pCurrentItem;
5066 pCurrentItem = FindItem(current);
5067 if (pCurrentItem != null)
5069 pCurrentItem->SetVisibleState(true);
5072 for (int j = currentGroupIndex; j <= lastLoadedGroupIndex; j++)
5074 int itemCount = GetItemCountAt(j);
5076 for (int i = -1; i < itemCount; i++)
5078 if (i <= currentItemIndex && j == currentGroupIndex)
5090 _TableViewPresenter::CollapseGroupAnimationFinished(bool completedNormally)
5092 _TableViewItem* pItem = null;
5093 TableViewItemTag itemTag = {-1, -1};
5094 float groupTotalHeight = 0;
5095 int itemCountInGroup = __pListModel->GetItemCountInGroup(__expandableItemTag.groupIndex);
5096 for (int i = 0; i < itemCountInGroup; i++)
5098 pItem = static_cast<_TableViewItem*>(__pListModel->GetItemFromTemporaryBuffer(__expandableItemTag.groupIndex, i));
5099 groupTotalHeight += pItem->GetItemHeight();
5100 itemTag.groupIndex = __expandableItemTag.groupIndex;
5101 itemTag.itemIndex = i;
5102 SetItemHeight(itemTag, pItem->GetItemHeight());
5105 if (completedNormally == false)
5107 TableViewItemTag current;
5108 TableViewItemTag next;
5110 current.groupIndex = __expandableItemTag.groupIndex;
5111 current.itemIndex = -1;
5113 for (int i = 0; i < itemCountInGroup; i++)
5115 UnloadItem(__expandableItemTag.groupIndex, i);
5118 _TableViewItem* pCurrentItem = LoadItem(current.groupIndex, current.itemIndex);
5119 FloatRectangle itemBounds = pCurrentItem->GetBoundsF();
5120 itemBounds.y = CalculateItemPositionY(current.groupIndex, current.itemIndex);
5121 pCurrentItem->SetBounds(itemBounds);
5123 float nextItemPositionY = pCurrentItem->GetBoundsF().y + pCurrentItem->GetBoundsF().height;
5125 FloatRectangle screenBounds = __pTableView->GetBoundsF();
5126 float screenPosition = GetScrollPosition() + screenBounds.height;
5128 while (GetNextItemPosition(current, next))
5131 if (screenPosition >= nextItemPositionY)
5133 pCurrentItem = LoadItem(current.groupIndex, current.itemIndex);
5134 if (pCurrentItem == null)
5139 pCurrentItem->SetVisibleState(true);
5140 itemBounds = pCurrentItem->GetBoundsF();
5141 itemBounds.y = nextItemPositionY;
5142 pCurrentItem->SetBounds(itemBounds);
5143 nextItemPositionY = pCurrentItem->GetBoundsF().y + pCurrentItem->GetBoundsF().height;
5147 UnloadItem(current.groupIndex, current.itemIndex);
5151 int currentGroupIndex = -1;
5152 int currentItemIndex = -1;
5153 GetTopDrawnItemIndex(currentGroupIndex, currentItemIndex);
5154 if (__expandableItemTag.groupIndex < currentGroupIndex)
5156 SetScrollPosition(GetScrollPosition() - groupTotalHeight, false);
5161 int currentGroupIndex = -1;
5162 int currentItemIndex = -1;
5163 GetTopDrawnItemIndex(currentGroupIndex, currentItemIndex);
5165 int firstLoadedGroupIndex = -1;
5166 int firstLoadedItemIndex = -1;
5167 __pListModel->GetFirstLoadedItemIndex(firstLoadedGroupIndex, firstLoadedItemIndex);
5169 for (int j = firstLoadedGroupIndex; j <= currentGroupIndex; j++)
5171 int itemCount = GetItemCountAt(j);
5173 for (int i = -1; i < itemCount; i++)
5175 if (i >= currentItemIndex && j == currentGroupIndex)
5184 for (int i = 0; i < itemCountInGroup; i++)
5186 UnloadItem(__expandableItemTag.groupIndex, i);
5189 GetTopDrawnItemIndex(currentGroupIndex, currentItemIndex);
5190 TableViewItemTag currentItemTag;
5191 currentItemTag.groupIndex = currentGroupIndex;
5192 currentItemTag.itemIndex = currentItemIndex;
5194 _TableViewItem* pItem = FindItem(currentItemTag);
5197 FloatRectangle itemBounds = pItem->GetBoundsF();
5198 itemBounds.y = CalculateItemPositionY(currentGroupIndex, currentItemIndex);
5199 pItem->SetBounds(itemBounds);
5200 AttachNextItemsToBottom(currentItemTag);
5201 if (__expandableItemTag.groupIndex < currentGroupIndex)
5203 SetScrollPosition(itemBounds.y, false);
5208 AdjustClientAreaBounds(false, -groupTotalHeight);
5212 _TableViewPresenter::OnVisualElementAnimationStarted(const Tizen::Ui::Animations::VisualElementAnimation& animation, const Tizen::Base::String& keyName, Tizen::Ui::Animations::VisualElement& target)
5214 if (keyName == L"REMOVE_ITEM_ANIMATION")
5219 if (keyName == L"SCROLL_PANEL_SCROLLING_ANIMATION")
5221 __scrollHeightOnFlickStarted = GetScrollAreaBounds().height;
5222 __scrollPositionOnFlickStarted = GetScrollPosition();
5225 _ScrollPanelPresenter::OnVisualElementAnimationStarted(animation, keyName, target);
5229 _TableViewPresenter::OnVisualElementAnimationRepeated(const Tizen::Ui::Animations::VisualElementAnimation& animation, const Tizen::Base::String& keyName, Tizen::Ui::Animations::VisualElement& target, long currentRepeatCount)
5231 if (keyName == L"REMOVE_ITEM_ANIMATION")
5235 _ScrollPanelPresenter::OnVisualElementAnimationRepeated(animation, keyName, target, currentRepeatCount);
5239 _TableViewPresenter::OnVisualElementAnimationFinished(const Tizen::Ui::Animations::VisualElementAnimation& animation, const Tizen::Base::String& keyName, Tizen::Ui::Animations::VisualElement& target, bool completedNormally)
5241 if (__isAnimationCallbackBlocked)
5246 if (keyName == L"REMOVE_ITEM_ANIMATION")
5248 _VisualElement* pVisualElement = GetView()->GetVisualElement();
5250 pVisualElement->DetachChild(target);
5255 else if (keyName == L"EXPAND_GROUP_ANIMATION")
5257 if (__pCapturedItemVisualElement)
5259 __pCapturedItemVisualElement->SetShowState(false);
5261 ExpandGroupAnimationFinished(completedNormally);
5263 if (__scrollToItemTag.startedAnimation)
5265 __scrollToItemTag.startedAnimation = false;
5266 ScrollToItem(__scrollToItemTag.groupIndex, __scrollToItemTag.itemIndex, __scrollToItemTag.itemAlignment, __scrollToItemTag.shiftingDistance);
5270 else if (keyName == L"COLLAPSE_GROUP_ANIMATION")
5272 if (__pCapturedItemVisualElement)
5274 __pCapturedItemVisualElement->SetShowState(false);
5276 CollapseGroupAnimationFinished(completedNormally);
5278 if (__scrollToItemTag.startedAnimation)
5280 __scrollToItemTag.startedAnimation = false;
5281 ScrollToItem(__scrollToItemTag.groupIndex, __scrollToItemTag.itemIndex, __scrollToItemTag.itemAlignment, __scrollToItemTag.shiftingDistance);
5286 _ScrollPanelPresenter::OnVisualElementAnimationFinished(animation, keyName, target, completedNormally);
5290 _TableViewPresenter::OnTickOccurred(const Tizen::Ui::Animations::VisualElementAnimation& animation, const Tizen::Base::String& keyName, Tizen::Ui::Animations::VisualElement& target, const Tizen::Ui::Variant& currentValue)
5292 _VisualElement* pVisualElement = __pTableView->GetVisualElement();
5294 if (&target != pVisualElement)
5299 if (keyName == L"REMOVE_ITEM_ANIMATION")
5301 Dimension value = currentValue.ToDimension();
5302 target.SetOpacity(value.width);
5304 FloatRectangle bounds = target.GetBounds();
5305 bounds.height = value.height;
5306 target.SetBounds(bounds);
5308 target.SetFlushNeeded();
5312 else if (keyName == L"EXPAND_GROUP_ANIMATION")
5314 float currentPosition = currentValue.ToFloat();
5315 SetLoadedItemsVisibleFromPosition(currentPosition, true);
5316 MoveLoadedItemsFromPosition(currentPosition);
5320 else if (keyName == L"COLLAPSE_GROUP_ANIMATION")
5322 float currentPosition = currentValue.ToFloat();
5323 SetLoadedItemsVisibleFromPosition(currentPosition, false);
5324 MoveLoadedItemsFromPosition(currentPosition);
5328 else if (keyName == L"SWEEP_ITEM_ANIMATION")
5330 float currentPosition = currentValue.ToFloat();
5331 float moveDestance = currentPosition - __sweptItemPosition.x;
5332 SweepItem(moveDestance);
5337 _ScrollPanelPresenter::OnTickOccurred(animation, keyName, target, currentValue);
5341 _TableViewPresenter::OnAccessibilityItemRefreshed(const _AccessibilityContainer& control, const _AccessibilityElement& element, _AccessibilityFocusDirection direction)
5343 TableViewItemTag itemPos = {-1, -1};
5345 if (direction == _ACCESSIBILITY_FOCUS_DIRECTION_NEXT)
5347 GetFirstItem(itemPos);
5348 if (GetAccessibilityElementFocusedState() == false && FindItem(itemPos) == null)
5350 ScrollToItem(itemPos.groupIndex, itemPos.itemIndex, TABLE_VIEW_SCROLL_ITEM_ALIGNMENT_TOP);
5355 else if (direction == _ACCESSIBILITY_FOCUS_DIRECTION_PREVIOUS)
5357 GetLastItem(itemPos);
5359 if (IsGroupExpanded(itemPos.groupIndex) == false)
5361 itemPos.itemIndex = -1;
5364 if (GetAccessibilityElementFocusedState() == false && FindItem(itemPos) == null)
5366 ScrollToItem(itemPos.groupIndex, itemPos.itemIndex, TABLE_VIEW_SCROLL_ITEM_ALIGNMENT_BOTTOM);
5376 _TableViewPresenter::OnOcurredOverflowItems(const int currentCashSize, const int overflowCount)
5378 return IsCachingItemsTotalHeightLessThanViewHeight();
5382 _TableViewPresenter::OnKeyPressed(const _Control& source, const _KeyInfo& keyInfo)
5384 if (!__pTableView->IsFocusModeStateEnabled())
5389 _KeyCode keyCode = keyInfo.GetKeyCode();
5390 _Control* pFocusedControl = null;
5391 _Window* pTop = source.GetRootWindow();
5394 pFocusedControl = pTop->GetCurrentFocusControl();
5397 _TableViewItem* pItem = null;
5398 TableViewItemTag itemPos = {-1, -1};
5403 if (pFocusedControl != null)
5405 pItem = dynamic_cast<_TableViewItem*>(pFocusedControl);
5408 _Control* pParentControl = pFocusedControl->GetParent();
5409 pItem = dynamic_cast<_TableViewItem*>(pParentControl);
5414 pItem->GetItemIndex(itemPos.groupIndex, itemPos.itemIndex);
5415 TableViewItemTag firstItemPos = {-1, -1};
5416 GetFirstItem(firstItemPos);
5417 if (itemPos.groupIndex == firstItemPos.groupIndex && itemPos.itemIndex == firstItemPos.itemIndex)
5419 SetTableViewFocused(false);
5423 while (GetPreviousItemPosition(itemPos, itemPos))
5425 if (__pTableView->GetTableViewStyle() == TABLE_VIEW_STYLE_SIMPLE)
5427 TableViewItemTag firstItemPos = {-1, -1};
5428 GetFirstItem(firstItemPos);
5429 if (itemPos.groupIndex == firstItemPos.groupIndex && itemPos.itemIndex == firstItemPos.itemIndex)
5431 SetTableViewFocused(false);
5436 if (IsGroupExpanded(itemPos.groupIndex) == false)
5438 itemPos.itemIndex = -1;
5441 pItem = LoadItem(itemPos.groupIndex, itemPos.itemIndex);
5444 SetTableViewFocused(false);
5448 if (!pItem->GetVisibleState() || !pItem->GetEnableState()
5449 || !pItem->IsFocusable())
5451 TableViewItemTag firstItemPos = {-1, -1};
5452 GetFirstItem(firstItemPos);
5453 if (itemPos.groupIndex == firstItemPos.groupIndex && itemPos.itemIndex == firstItemPos.itemIndex)
5455 SetTableViewFocused(false);
5462 if (pItem->GetBoundsF().y < GetScrollPosition())
5464 ScrollToItem(itemPos.groupIndex, itemPos.itemIndex, TABLE_VIEW_SCROLL_ITEM_ALIGNMENT_BOTTOM);
5467 if (pItem->GetEnableState() && pItem->GetVisibleState()
5468 && pItem->IsFocusable())
5470 pItem->SetFocused(true);
5471 __focusItemTag.groupIndex = itemPos.groupIndex;
5472 __focusItemTag.itemIndex = itemPos.itemIndex;
5473 __isAnnexFocused = false;
5481 SetTableViewFocused(false);
5488 if (pFocusedControl != null)
5490 pItem = dynamic_cast<_TableViewItem*>(pFocusedControl);
5493 _Control* pParentControl = pFocusedControl->GetParent();
5494 pItem = dynamic_cast<_TableViewItem*>(pParentControl);
5499 pItem->GetItemIndex(itemPos.groupIndex, itemPos.itemIndex);
5500 TableViewItemTag lastItemPos = {-1, -1};
5501 GetLastItem(lastItemPos);
5502 if (itemPos.groupIndex == lastItemPos.groupIndex && itemPos.itemIndex == lastItemPos.itemIndex)
5504 SetTableViewFocused(false);
5508 while (GetNextItemPosition(itemPos, itemPos))
5510 if (__pTableView->GetTableViewStyle() == TABLE_VIEW_STYLE_SIMPLE && itemPos.itemIndex == -1)
5512 itemPos.itemIndex = 0;
5515 pItem = LoadItem(itemPos.groupIndex, itemPos.itemIndex);
5518 SetTableViewFocused(false);
5522 if (!pItem->GetVisibleState() || !pItem->GetEnableState()
5523 || !pItem->IsFocusable())
5525 TableViewItemTag lastItemPos = {-1, -1};
5526 GetLastItem(lastItemPos);
5528 if (itemPos.groupIndex == lastItemPos.groupIndex && itemPos.itemIndex == lastItemPos.itemIndex)
5530 SetTableViewFocused(false);
5536 if (pItem->GetBoundsF().y + pItem->GetBoundsF().height > GetScrollPosition() + __pTableView->GetBoundsF().height)
5538 ScrollToItem(itemPos.groupIndex, itemPos.itemIndex, TABLE_VIEW_SCROLL_ITEM_ALIGNMENT_TOP);
5541 if (pItem->GetEnableState() && pItem->GetVisibleState()
5542 && pItem->IsFocusable())
5544 pItem->SetFocused(true);
5546 __focusItemTag.groupIndex = itemPos.groupIndex;
5547 __focusItemTag.itemIndex = itemPos.itemIndex;
5548 __isAnnexFocused = false;
5555 SetTableViewFocused(false);
5562 SetTableViewFocused(false);
5573 _TableViewPresenter::OnKeyReleased(const _Control& source, const _KeyInfo& keyInfo)
5575 if (!__pTableView->IsFocusModeStateEnabled())
5580 _KeyCode keyCode = keyInfo.GetKeyCode();
5582 if (keyCode == _KEY_UP || keyCode == _KEY_DOWN)
5591 _TableViewPresenter::OnDrawFocus(void)
5593 if (!__pTableView->IsFocusModeStateEnabled())
5598 _Control* pFocusedControl = null;
5599 _Window* pTop = __pTableView->GetRootWindow();
5602 pFocusedControl = pTop->GetCurrentFocusControl();
5605 _TableView* pTableView = null;
5606 _TableViewItem* pItem = null;
5607 TableViewItemTag itemPos = {-1, -1};
5609 pItem = FindItem(__focusItemTag);
5611 if (__isRestoreFocus && pItem != null)
5613 if (pItem->GetEnableState() && pItem->GetVisibleState() && pItem->IsFocusable())
5615 if (__isAnnexFocused)
5617 pItem->DrawAnnexFocus();
5621 pItem->SetFocused(true);
5626 __isRestoreFocus = false;
5630 if (pFocusedControl != null)
5632 pTableView = dynamic_cast<_TableView*>(pFocusedControl);
5633 if (pTableView != null)
5635 if (_FocusManagerImpl::GetInstance()->IsForwardDirection() == true)
5637 GetFirstItem(itemPos);
5638 if (__pTableView->GetTableViewStyle() == TABLE_VIEW_STYLE_SIMPLE)
5640 itemPos.itemIndex = 0;
5643 ScrollToItem(itemPos.groupIndex, itemPos.itemIndex, TABLE_VIEW_SCROLL_ITEM_ALIGNMENT_TOP);
5644 pItem = FindItem(itemPos);
5647 if (pItem->GetEnableState() && pItem->GetVisibleState()
5648 && pItem->IsFocusable())
5650 __focusItemTag.groupIndex = itemPos.groupIndex;
5651 __focusItemTag.itemIndex = itemPos.itemIndex;
5652 __isAnnexFocused = false;
5653 pItem->SetFocused(true);
5658 while (GetNextItemPosition(itemPos, itemPos))
5660 TableViewItemTag topDrawnItemIndex = {-1, -1};
5661 GetTopDrawnItem(topDrawnItemIndex);
5662 if (topDrawnItemIndex.groupIndex <= itemPos.groupIndex && topDrawnItemIndex.itemIndex <= itemPos.itemIndex)
5664 TableViewItemTag bottomDrawnItemIndex = {-1, -1};
5665 GetBottomDrawnItem(bottomDrawnItemIndex);
5666 if (bottomDrawnItemIndex.groupIndex >= itemPos.groupIndex && bottomDrawnItemIndex.itemIndex >= itemPos.itemIndex)
5668 pItem = FindItem(itemPos);
5672 ScrollToItem(itemPos.groupIndex, itemPos.itemIndex, TABLE_VIEW_SCROLL_ITEM_ALIGNMENT_TOP);
5673 pItem = FindItem(itemPos);
5678 ScrollToItem(itemPos.groupIndex, itemPos.itemIndex, TABLE_VIEW_SCROLL_ITEM_ALIGNMENT_TOP);
5679 pItem = FindItem(itemPos);
5684 if (!pItem->GetVisibleState() || !pItem->GetEnableState()
5685 || !pItem->IsFocusable())
5687 TableViewItemTag lastItemPos = {-1, -1};
5688 GetLastItem(lastItemPos);
5690 if (itemPos.groupIndex == lastItemPos.groupIndex && itemPos.itemIndex == lastItemPos.itemIndex)
5699 __focusItemTag.groupIndex = itemPos.groupIndex;
5700 __focusItemTag.itemIndex = itemPos.itemIndex;
5701 __isAnnexFocused = false;
5702 pItem->SetFocused(true);
5713 GetLastItem(itemPos);
5714 ScrollToItem(itemPos.groupIndex, itemPos.itemIndex, TABLE_VIEW_SCROLL_ITEM_ALIGNMENT_BOTTOM);
5715 pItem = FindItem(itemPos);
5719 if (pItem->GetEnableState() && pItem->GetVisibleState()
5720 && pItem->IsFocusable())
5722 __focusItemTag.groupIndex = itemPos.groupIndex;
5723 __focusItemTag.itemIndex = itemPos.itemIndex;
5724 __isAnnexFocused = false;
5725 pItem->SetFocused(true);
5730 while (GetPreviousItemPosition(itemPos, itemPos))
5732 TableViewItemTag bottomDrawnItemIndex = {-1, -1};
5733 GetBottomDrawnItem(bottomDrawnItemIndex);
5735 if (bottomDrawnItemIndex.groupIndex >= itemPos.groupIndex && bottomDrawnItemIndex.itemIndex >= itemPos.itemIndex)
5737 TableViewItemTag topDrawnItemIndex = {-1, -1};
5738 GetTopDrawnItem(topDrawnItemIndex);
5739 if (topDrawnItemIndex.groupIndex <= itemPos.groupIndex && topDrawnItemIndex.itemIndex <= itemPos.itemIndex)
5741 pItem = FindItem(itemPos);
5745 ScrollToItem(itemPos.groupIndex, itemPos.itemIndex, TABLE_VIEW_SCROLL_ITEM_ALIGNMENT_BOTTOM);
5746 pItem = FindItem(itemPos);
5751 ScrollToItem(itemPos.groupIndex, itemPos.itemIndex, TABLE_VIEW_SCROLL_ITEM_ALIGNMENT_BOTTOM);
5752 pItem = FindItem(itemPos);
5757 if (!pItem->GetVisibleState() || !pItem->GetEnableState()
5758 || !pItem->IsFocusable())
5760 TableViewItemTag firstItemPos = {-1, -1};
5761 GetFirstItem(firstItemPos);
5762 if (itemPos.groupIndex == firstItemPos.groupIndex && itemPos.itemIndex == firstItemPos.itemIndex)
5771 __focusItemTag.groupIndex = itemPos.groupIndex;
5772 __focusItemTag.itemIndex = itemPos.itemIndex;
5773 __isAnnexFocused = false;
5774 pItem->SetFocused(true);
5788 _TableViewPresenter::OnFocusModeStateChanged(void)
5790 __focusItemTag.groupIndex = -1;
5791 __focusItemTag.itemIndex = -1;
5792 __isRestoreFocus = false;
5793 __isAnnexFocused = false;
5795 _Window* pTop = __pTableView->GetRootWindow();
5799 _Control* pFocusedControl = pTop->GetCurrentFocusControl();
5801 if (pFocusedControl != null)
5803 pFocusedControl->RemoveFocusRing();
5809 _TableViewPresenter::OnVisibleStateChanged(void)
5812 if (__pTableView->IsFocused())
5814 __pTableView->RemoveFocusRing();
5819 _TableViewPresenter::OnAncestorEnableStateChanged(const _Control& control)
5822 if (__pTableView->IsFocused())
5824 __pTableView->RemoveFocusRing();
5829 _TableViewPresenter::OnAncestorVisibleStateChanged(const _Control& control)
5832 if (__pTableView->IsFocused())
5834 __pTableView->RemoveFocusRing();
5839 _TableViewPresenter::OnFocusableStateChanged(bool focusableState)
5841 if (!focusableState)
5844 if (__pTableView->IsFocused())
5846 __pTableView->RemoveFocusRing();
5852 _TableViewPresenter::GetAccessibilityElementFocusedState(void)
5854 _TableViewItem* pItem = null;
5855 TableViewItemTag itemPos = {-1, -1};
5856 TableViewItemTag lastItemPos = {-1, -1};
5858 __pListModel->GetFirstLoadedItemIndex(itemPos.groupIndex, itemPos.itemIndex);
5859 __pListModel->GetLastLoadedItemIndex(lastItemPos.groupIndex, lastItemPos.itemIndex);
5863 pItem = static_cast <_TableViewItem*>(__pListModel->LoadItem(itemPos.groupIndex, itemPos.itemIndex));
5864 SysTryReturn(NID_UI_CTRL, pItem != null, false, E_OUT_OF_RANGE, "[E_OUT_OF_RANGE] The index is out of range.");
5866 _AccessibilityContainer* pContainer = pItem->GetAccessibilityContainer();
5867 _AccessibilityElement* pElement = null;
5869 if (pContainer != null)
5871 pElement = pContainer->GetCurrentFocusedElement();
5872 if (pElement != null)
5878 if ((itemPos.itemIndex == lastItemPos.itemIndex) && (itemPos.groupIndex == lastItemPos.groupIndex))
5883 } while (GetNextItemPosition(itemPos, itemPos) == true);
5889 _TableViewPresenter::FireItemTouchReleasedEventDuringPressing(int groupIndex, int itemIndex)
5891 TableViewItemTag fireItemPos;
5892 fireItemPos.groupIndex = groupIndex;
5893 fireItemPos.itemIndex = itemIndex;
5895 __itemTouchReleasedEventState = TABLE_VIEW_ITEM_TOUCH_RELEASED_EVENT_FIRE;
5896 _TableViewItem* pItem = FindItem(fireItemPos);
5899 pItem->FireItemTouchReleased();
5902 // for new item after UpdateTableView.
5903 pItem = FindItem(fireItemPos);
5906 if (__itemTouchReleasedEventState == TABLE_VIEW_ITEM_TOUCH_RELEASED_EVENT_UPDATE_TABLE_VIEW)
5908 __itemTouchReleasedEventState = TABLE_VIEW_ITEM_TOUCH_RELEASED_EVENT_NORMAL;
5912 pItem->SetSelectionState(true);
5913 pItem->FireItemTouchPressed();
5919 _TableViewSectionStringAlignment::operator== (const _TableViewSectionStringAlignment& rhs) const
5921 if (headerHorizontalAlignment == rhs.headerHorizontalAlignment && footerHorizontalAlignment == rhs.footerHorizontalAlignment)
5930 _TableViewSectionStringAlignment::operator!= (const _TableViewSectionStringAlignment& rhs) const
5932 if (headerHorizontalAlignment == rhs.headerHorizontalAlignment && footerHorizontalAlignment == rhs.footerHorizontalAlignment)
5940 }}} // Tizen::Ui::Controls