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.h
20 * @brief This is the implementation file for _TableViewPresenter class.
22 * This file contains the implementation of _TableViewPresenter class.
26 #ifndef _FUI_CTRL_INTERNAL_TABLE_VIEW_PRESENTER_H_
27 #define _FUI_CTRL_INTERNAL_TABLE_VIEW_PRESENTER_H_
29 #include <FUiCtrlTableView.h>
30 #include <FBaseColArrayListT.h>
31 #include "FUiCtrl_TableViewItem.h"
32 #include "FUiCtrl_ListViewModel.h"
33 #include "FUiCtrl_ScrollPanelPresenter.h"
35 namespace Tizen { namespace Ui { namespace Animations
40 namespace Tizen { namespace Ui { namespace Controls
45 TABLE_VIEW_ITEM_ALIGNMENT_TOP = 0,
46 TABLE_VIEW_ITEM_ALIGNMENT_BOTTOM
49 enum ItemTouchReleasedEventState
51 TABLE_VIEW_ITEM_TOUCH_RELEASED_EVENT_NORMAL = 0,
52 TABLE_VIEW_ITEM_TOUCH_RELEASED_EVENT_FIRE,
53 TABLE_VIEW_ITEM_TOUCH_RELEASED_EVENT_UPDATE_TABLE_VIEW
56 struct _TableViewReorderInfo
62 float touchPressedPositionY;
63 float itemBasisPositionY;
64 int isScrollDirectionUp;
65 float nonScrollableLimitArea;
66 bool blockedTouchReleaseState;
68 long long touchPressedTick;
69 Tizen::Graphics::FloatRectangle itemBounds;
71 _TableViewReorderInfo(void)
74 , originGroupIndex(-1)
76 , touchPressedPositionY(0.0f)
77 , itemBasisPositionY(0.0f)
78 , isScrollDirectionUp(false)
79 , nonScrollableLimitArea(0.0f)
80 , blockedTouchReleaseState(false)
81 , blockedScroll(false)
89 struct _TableViewSectionStringAlignment
91 HorizontalAlignment headerHorizontalAlignment;
92 HorizontalAlignment footerHorizontalAlignment;
94 _TableViewSectionStringAlignment(void)
95 : headerHorizontalAlignment(ALIGNMENT_LEFT)
96 , footerHorizontalAlignment(ALIGNMENT_RIGHT)
100 bool operator== (const _TableViewSectionStringAlignment& rhs) const;
101 bool operator!= (const _TableViewSectionStringAlignment& rhs) const;
104 struct _TableViewScrollToItemTag
108 TableViewScrollItemAlignment itemAlignment;
109 float shiftingDistance;
110 bool startedAnimation;
112 _TableViewScrollToItemTag(void)
115 , itemAlignment(TABLE_VIEW_SCROLL_ITEM_ALIGNMENT_TOP)
116 , shiftingDistance(0)
117 , startedAnimation(false)
124 class _ListViewModel;
125 class _TableViewItemProviderAdaptor;
127 class _TableViewPresenter
128 : public _ScrollPanelPresenter
129 , public _IListViewModelDelegate
130 , public Tizen::Ui::Animations::IVisualElementAnimationTickEventListener
131 , public Tizen::Ui::Animations::IVisualElementAnimationStatusEventListener
132 , virtual public Tizen::Base::Runtime::IEventListener
135 _TableViewPresenter();
136 virtual ~_TableViewPresenter(void);
138 virtual result Construct(_TableView* pTableView);
140 bool Initialize(_TableView* pTableView);
142 _TableView* GetView(void) const;
144 _ListViewModel* GetModel(void) const;
147 result SetItemProvider(const _TableViewItemProvider* pProvider);
149 void SetTableViewItemProviderAdaptor(_TableViewItemProviderAdaptor* pProviderAdaptor);
151 _TableViewItemProviderAdaptor* GetTableViewItemProviderAdaptor(void) const;
153 // event handler for window event
154 virtual void OnBoundsChanged(void);
155 virtual result Draw(void);
157 // Touch Event Previewer
158 virtual _UiTouchEventDelivery OnPreviewTouchPressed(const _Control& source, const _TouchInfo& touchInfo);
159 virtual _UiTouchEventDelivery OnPreviewTouchMoved(const _Control& source, const _TouchInfo& touchInfo);
160 virtual _UiTouchEventDelivery OnPreviewTouchReleased(const _Control& source, const _TouchInfo& touchInfo);
161 virtual _UiTouchEventDelivery OnPreviewTouchCanceled(const _Control& source, const _TouchInfo& touchInfo);
163 // Touch Event Listener
164 virtual bool OnTouchPressed(const _Control& source, const _TouchInfo& touchInfo);
165 virtual bool OnTouchMoved(const _Control& source, const _TouchInfo& touchInfo);
166 virtual bool OnTouchReleased(const _Control& source, const _TouchInfo& touchInfo);
167 virtual bool OnTouchCanceled(const _Control& source, const _TouchInfo& touchInfo);
169 // gestureListener Callback API
170 virtual bool OnFlickGestureDetected(_TouchFlickGestureDetector& gesture);
171 virtual bool OnFlickGestureCanceled(_TouchFlickGestureDetector& gesture);
172 virtual bool OnPreviewFlickGestureDetected(_TouchFlickGestureDetector& gesture);
174 virtual void OnVisualElementAnimationStarted(const Tizen::Ui::Animations::VisualElementAnimation& animation, const Tizen::Base::String& keyName, Tizen::Ui::Animations::VisualElement& target);
175 virtual void OnVisualElementAnimationRepeated(const Tizen::Ui::Animations::VisualElementAnimation& animation, const Tizen::Base::String& keyName, Tizen::Ui::Animations::VisualElement& target, long currentRepeatCount);
176 virtual void OnVisualElementAnimationFinished(const Tizen::Ui::Animations::VisualElementAnimation& animation, const Tizen::Base::String& keyName, Tizen::Ui::Animations::VisualElement& target, bool completedNormally);
177 virtual void OnTickOccurred(const Tizen::Ui::Animations::VisualElementAnimation& animation, const Tizen::Base::String& keyName, Tizen::Ui::Animations::VisualElement& target, const Tizen::Ui::Variant& currentValue);
180 virtual void OnTimerExpired(Tizen::Base::Runtime::Timer& timer);
183 virtual bool OnAccessibilityItemRefreshed(const _AccessibilityContainer& control, const _AccessibilityElement& element, _AccessibilityFocusDirection direction);
185 // List model delegate
186 virtual bool OnOcurredOverflowItems(const int currentCashSize, const int overflowCount);
190 result RefreshTableView(int groupIndex, int itemIndex, TableViewRefreshType type, bool animation);
191 result RefreshAllItems(void);
192 result UpdateTableView(void);
194 result GetItemIndexFromPosition(const Tizen::Graphics::FloatPoint& position, int& groupIndex, int& itemIndex) const;
195 result GetItemFromPosition(const Tizen::Graphics::FloatPoint& position, TableViewItemTag& itemPos) const;
197 result GetTopDrawnItem(TableViewItemTag& itemPos) const;
198 result SetTopDrawnItem(TableViewItemTag& itemPos);
200 result GetBottomDrawnItem(TableViewItemTag& itemPos) const;
202 result GetTopDrawnItemIndex(int& groupIndex, int& itemIndex) const;
203 result SetTopDrawnItemIndex(int groupIndex, int itemIndex);
205 result GetBottomDrawnItemIndex(int& groupIndex, int& itemIndex) const;
206 result SetBottomDrawnItemIndex(int groupIndex, int itemIndex);
208 int GetGroupCount(void) const;
209 int GetItemCountAt(int groupIndex) const;
210 bool HasSectionHeader(int groupIndex) const;
211 bool HasSectionFooter(int groupIndex) const;
213 float GetTopMargin(void) const;
214 result SetTopMargin(float topMargin);
216 float GetBottomMargin(void) const;
217 result SetBottomMargin(float bottomMargin);
219 float GetLeftMargin(void) const;
220 result SetLeftMargin(float leftMargin);
222 bool IsItemChecked(int groupIndex, int itemIndex) const;
223 result SetItemChecked(int groupIndex, int itemIndex, bool checked);
225 bool IsItemEnabled(int groupIndex, int itemIndex) const;
226 result SetItemEnabled(int groupIndex, int itemIndex, bool enabled);
228 _TableViewItem* FindItem(TableViewItemTag& itemTag);
229 void UnloadItem(int groupIndex, int itemIndex);
230 _TableViewItem* LoadItem(int groupIndex, int itemIndex);
231 void RefreshItemLayout(int groupIndex, int itemIndex);
232 void GetFirstLoadedItemIndex(int& groupIndex, int& itemIndex) const;
233 void GetLastLoadedItemIndex(int& groupIndex, int& itemIndex) const;
235 result SetStatusChanged(bool changed);
236 bool IsStatusChanged(void) const;
238 result ExpandGroup(int groupIndex, bool withAnimation);
239 result CollapseGroup(int groupIndex, bool withAnimation);
240 bool IsGroupExpanded(int groupIndex) const;
242 result SetReorderMode(bool enabled);
244 bool CheckItemHeightAndRefreshLayout(TableViewItemTag itemTag, bool downScroll);
246 result ScrollByPixel(float scrollDistance);
247 void SetScrollEnabled(bool enable);
248 bool IsScrollEnabled(void) const;
250 bool GetFirstDrawnFlag(void) const;
251 int GetMaxItemCachingSize(void) const;
252 void ResetSweepItem(void);
253 void GetSweepItemIndex(int& groupIndex, int& itemIndex) const;
254 int GetPressedItemCount(void);
256 result OpenContextItem(int groupIndex, int itemIndex);
257 result CloseContextItem(int groupIndex, int itemIndex);
258 bool IsContextItemOpened(int groupIndex, int itemIndex) const;
260 result SetSectionHeaderTextHorizontalAlignment(int sectionIndex, HorizontalAlignment alignment);
261 HorizontalAlignment GetSectionHeaderTextHorizontalAlignment(int sectionIndex) const;
262 result SetSectionFooterTextHorizontalAlignment(int sectionIndex, HorizontalAlignment alignment);
263 HorizontalAlignment GetSectionFooterTextHorizontalAlignment(int sectionIndex) const;
265 void BlockAnimationCallback(bool blocked);
267 void FireItemTouchReleasedEventDuringPressing(int groupIndex, int itemIndex);
270 virtual float ScrollToInternal(float targetPosition);
271 virtual void FadeInScrollBar(void);
272 virtual void FadeOutScrollBar(void);
275 virtual void UpdateLayout(void);
278 _TableViewPresenter(const _TableViewPresenter& rhs);
279 _TableViewPresenter& operator =(const _TableViewPresenter& rhs);
281 _TableView* __pTableView;
282 _ListViewModel* __pListModel;
283 _TableViewItemProviderAdaptor* __pProviderAdaptor;
285 bool PreloadItem(void);
286 bool PreloadItem(int topDrawnGroupIndex, int topDrawnItemIndex, int shiftingDistance);
288 bool GetFirstItem(TableViewItemTag& firstItem) const;
289 bool GetLastItem(TableViewItemTag& lastItem) const;
290 bool GetPreviousItemPosition(const TableViewItemTag& currentItem, TableViewItemTag& prevItem) const;
291 bool GetNextItemPosition(const TableViewItemTag& currentItem, TableViewItemTag& nextItem) const;
292 int GetItemCount(void) const;
293 float GetHeightOfAllItems(void) const;
295 void SetItemLayout(_TableViewItem* pItem, TableViewItemTag& itemPos);
296 float CalculateItemPositionY(int groupIndex, int itemIndex);
297 void AdjustLayoutItems(float scrollPosition);
298 bool IsCachingItemsTotalHeightLessThanViewHeight(void);
300 void ResetItemLayout(TableViewItemTag& topDrawnItemTag, float shiftingDistance);
301 void RefreshItemLayout(TableViewItemTag& topDrawnItemTag, TableViewItemTag& refreshItemTag, TableViewRefreshType type, bool animation);
302 void RefreshItemBounds(_TableViewItem* pItem, TableViewItemTag& itemPos);
303 void ScrollToItem(int groupIndex, int itemIndex, TableViewScrollItemAlignment itemAlignment, float shiftingDistance = 0.0f);
306 _TableViewItem* GetTableViewItemFromControl(const _Control& source);
308 void UnloadItem(TableViewItemTag& itemTag);
309 void DetachItem(TableViewItemTag& itemTag);
310 void DetachContextItem(TableViewItemTag& itemTag);
311 void DetachAllItem(bool removeItem);
312 void SetItemDrawingProperty(void);
313 void SetItemType(_TableViewItem* pItem, TableViewItemTag itemPosition);
315 result StartFastScrollTimer(void);
316 void StopFastScrollTimer(void);
318 bool IsEmpty(void) const;
319 result DrawEmptyTableView(void);
321 void LoadItemWithScrollPosition(float previousScrollPosition, float currentScrollPos);
322 bool GetTableViewItemPosition(_TableViewItem& item, TableViewItemTag& itemTag); // item must exist between from tag and end tag
323 int LoadAllItemsInGroup(int groupIndex, bool downward);
324 void SetLoadedItemsVisibleInGroup(int groupIndex, bool visible);
325 TableViewItemTag LoadItemsToBeVisible(const TableViewItemTag& from);
326 void AttachNextItemsToBottom(const TableViewItemTag& anchor);
327 bool IsAnyItemInGroupLoaded(int groupIndex) const;
328 bool IsAnyItemInLoadedIndex(int groupIndex, int itemIndex);
329 void ScrollToHideNonClientArea(TableViewItemTag& bottomTag);
330 void AdjustClientAreaBounds(bool reset, float dist = 0.0f);
331 void SetClientAreaHeight(float height);
332 void UnloadInvisibleItems(void);
335 bool SelectReorderItem(int groupIndex, int itemIndex, bool directSelection);
336 bool ResetReorderItem(int groupIndex, int itemIndex);
337 bool DragSelectedItem(float distance, bool relativeCoordinate);
338 bool CheckReorderItemScrollAnimation(_TableViewItem *pItem);
339 bool CheckReorderItemPosition(_TableViewItem* pItem, TableViewItemTag& reorderItemTag);
340 void AdjustReorderItemLimitPositionY(float& positionY);
341 bool ReorderItem(int destinationGroupIndex, int destinationItemIndex);
342 void StartReorderScrollTimer(void);
343 void StopReorderScrollTimer(void);
346 float GetItemHeight(TableViewItemTag itemTag) const;
347 float SetItemHeight(TableViewItemTag itemTag, float height);
348 bool CreateItemHeightList(float defaultGroupItemHeight, float defaultItemHeight);
349 void DeleteItemHeightList(void);
350 void PresetItemHeightList(void);
351 bool RefreshItemHeightList(int groupIndex, int itemIndex, TableViewRefreshType refreshType);
353 bool CreateSectionAlignmentList(void);
354 void DeleteSectionAlignmentList(void);
355 bool RefreshSectionAlignmentList(int groupIndex, TableViewRefreshType refreshType);
357 void CaptureAndStartRemoveItemAnimation(int groupIndex, int itemIndex);
359 void ShowTableViewCapturedItem(int groupIndex, int itemIndex, float height);
360 void SetLoadedItemsVisibleFromPosition(float position, bool visible);
361 void MoveLoadedItemsFromPosition(float position);
362 void ExpandGroupAnimationFinished(bool completedNormally);
363 void CollapseGroupAnimationFinished(bool completedNormally);
366 void SweepItem(float x);
367 void ResetSweptItem(void);
368 void AdjustSweptItemPosition(bool withAnimation = false);
369 void AdjustLoadedItemWidth(void);
371 bool IsValidDrawnItem(int groupIndex, int itemIndex);
372 void StopAllItemAnimation(void);
374 bool GetAccessibilityElementFocusedState(void);
378 float __bottomMargin;
381 bool __modelInitialized;
382 bool __firstDrawnFlag;
383 bool __statusChangedFlag;
386 _ItemDrawingProperty* __pItemDrawingProperty;
388 Tizen::Ui::Animations::_VisualElement* __pBaseVisualElement;
391 Tizen::Graphics::FloatPoint __sweptItemPosition;
392 TableViewItemTag __sweptItemTag;
394 TableViewItemTag __reservedScrollItemIndex;
395 TableViewScrollItemAlignment __reservedScrollItemAlignment;
397 bool __firstTouchMoved;
399 Tizen::Base::Runtime::Timer* __pReorderScrollTimer;
401 _TableViewReorderInfo __reorderInfo;
403 Tizen::Base::Collection::ArrayListT<float> __itemHeightList;
404 Tizen::Base::Collection::ArrayListT<_TableViewSectionStringAlignment> __sectionAlignmentList;
405 float __itemTotalHeight;
407 TableViewItemTag __expandableItemTag;
408 Tizen::Ui::Animations::_VisualElement* __pCapturedItemVisualElement;
410 Tizen::Base::Runtime::Timer* __pFastScrollTimer;
411 bool __isFastScrollTimerEnabled;
413 float __scrollHeightOnFlickStarted;
414 float __scrollPositionOnFlickStarted;
416 bool __isAnimationCallbackBlocked;
417 bool __lockLoadItemWithScroll;
419 int __itemTouchReleasedEventState;
421 _TableViewScrollToItemTag __scrollToItemTag;
423 static const int TABLEVIEW_MAX_ITEM_COUNT = 30;
424 static const int REORDER_SCROLL_ANIMATION_TIMER_DURATION = 10;
425 static const float REORDER_SCROLL_ANIMATION_DISTANCE = 10.0f;
426 static const int REORDER_TOUCH_UIACTIVATE_DURATION = 100;
427 static const int FAST_SCROLL_FADE_OUT_DURATION = 500;
428 static const float TABLEVIEW_DEFAULT_ITEM_HEIGHT_VALUE = 12.3456f;
431 static const int REORDER_ITEM_MOVE_ANIMATION_DURATION = 113;
432 static const int ADD_ITEM_ANIMATION_DURATION = 333;
433 static const int REMOVE_ITEM_MOVE_ANIMATION_DURATION = 267;
434 static const int REFRESH_ITEM_ANIMATION_DELAY = 100;
435 static const int EXPAND_GROUP_ANIMATION_DURATION = 335;
436 static const int COLLAPSE_GROUP_ANIMATION_DURATION = 329;
437 static const int SWEEP_ITEM_ANIMATION_DURATION = 300;
440 }}} // Tizen::Ui::Controls
442 #endif // _FUI_CTRL_INTERNAL_TABLE_VIEW_PRESENTER_H_