Fixed N_SE-36095 - Support for dynamically expand the size of item cache
[platform/framework/native/uifw.git] / src / ui / inc / FUiCtrl_TableViewPresenter.h
1 //
2 // Open Service Platform
3 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
4 //
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
8 //
9 //     http://www.apache.org/licenses/LICENSE-2.0/
10 //
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.
16 //
17
18 /**
19  * @file        FUiCtrl_TableViewPresenter.h
20  * @brief       This is the implementation file for _TableViewPresenter class.
21  *
22  * This file contains the implementation of _TableViewPresenter class.
23  */
24
25
26 #ifndef _FUI_CTRL_INTERNAL_TABLE_VIEW_PRESENTER_H_
27 #define _FUI_CTRL_INTERNAL_TABLE_VIEW_PRESENTER_H_
28
29 #include <FUiCtrlTableView.h>
30 #include <FBaseColArrayListT.h>
31 #include "FUiCtrl_TableViewItem.h"
32 #include "FUiCtrl_ListViewModel.h"
33 #include "FUiCtrl_ScrollPanelPresenter.h"
34
35 namespace Tizen { namespace Ui { namespace Animations
36 {
37 class _VisualElement;
38 }}}
39
40 namespace Tizen { namespace Ui { namespace Controls
41 {
42
43 enum ItemAlignment
44 {
45         TABLE_VIEW_ITEM_ALIGNMENT_TOP = 0,
46         TABLE_VIEW_ITEM_ALIGNMENT_BOTTOM
47 };
48
49 enum ItemTouchReleasedEventState
50 {
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
54 };
55
56 struct _TableViewReorderInfo
57 {
58         int groupIndex;
59         int itemIndex;
60         int originGroupIndex;
61         int originItemIndex;
62         float touchPressedPositionY;
63         float itemBasisPositionY;
64         int isScrollDirectionUp;
65         float nonScrollableLimitArea;
66         bool blockedTouchReleaseState;
67         bool blockedScroll;
68         long long touchPressedTick;
69         Tizen::Graphics::FloatRectangle itemBounds;
70
71
72         _TableViewReorderInfo(void)
73                 : groupIndex(-1)
74                 , itemIndex(-1)
75                 , originGroupIndex(-1)
76                 , originItemIndex(-1)
77                 , touchPressedPositionY(0.0f)
78                 , itemBasisPositionY(0.0f)
79                 , isScrollDirectionUp(false)
80                 , nonScrollableLimitArea(0.0f)
81                 , blockedTouchReleaseState(false)
82                 , blockedScroll(false)
83                 , touchPressedTick(0)
84                 , itemBounds()
85         {
86
87         }
88 };
89
90 struct _TableViewSectionStringAlignment
91 {
92         HorizontalAlignment headerHorizontalAlignment;
93         HorizontalAlignment footerHorizontalAlignment;
94
95         _TableViewSectionStringAlignment(void)
96                 : headerHorizontalAlignment(ALIGNMENT_LEFT)
97                 , footerHorizontalAlignment(ALIGNMENT_RIGHT)
98         {
99         }
100
101         bool operator== (const _TableViewSectionStringAlignment& rhs) const;
102         bool operator!= (const _TableViewSectionStringAlignment& rhs) const;
103 };
104
105
106 class _TableView;
107 class _ListViewModel;
108 class _TableViewItemProviderAdaptor;
109
110 class _TableViewPresenter
111         : public _ScrollPanelPresenter
112         , public _IListViewModelDelegate
113         , public Tizen::Ui::Animations::IVisualElementAnimationTickEventListener
114         , public Tizen::Ui::Animations::IVisualElementAnimationStatusEventListener
115         , virtual public Tizen::Base::Runtime::IEventListener
116 {
117 public:
118         _TableViewPresenter();
119         virtual ~_TableViewPresenter(void);
120
121         virtual result Construct(_TableView* pTableView);
122
123         bool Initialize(_TableView* pTableView);
124
125         _TableView* GetView(void) const;
126
127         _ListViewModel* GetModel(void) const;
128
129         // set ItemProvider
130         result SetItemProvider(const _TableViewItemProvider* pProvider);
131
132         void SetTableViewItemProviderAdaptor(_TableViewItemProviderAdaptor* pProviderAdaptor);
133
134         _TableViewItemProviderAdaptor* GetTableViewItemProviderAdaptor(void) const;
135
136         // event handler for window event
137         virtual void OnBoundsChanged(void);
138         virtual result Draw(void);
139
140         // Touch Event Previewer
141         virtual _UiTouchEventDelivery OnPreviewTouchPressed(const _Control& source, const _TouchInfo& touchInfo);
142         virtual _UiTouchEventDelivery OnPreviewTouchMoved(const _Control& source, const _TouchInfo& touchInfo);
143         virtual _UiTouchEventDelivery OnPreviewTouchReleased(const _Control& source, const _TouchInfo& touchInfo);
144         virtual _UiTouchEventDelivery OnPreviewTouchCanceled(const _Control& source, const _TouchInfo& touchInfo);
145
146         // Touch Event Listener
147         virtual bool OnTouchPressed(const _Control& source, const _TouchInfo& touchInfo);
148         virtual bool OnTouchMoved(const _Control& source, const _TouchInfo& touchInfo);
149         virtual bool OnTouchReleased(const _Control& source, const _TouchInfo& touchInfo);
150         virtual bool OnTouchCanceled(const _Control& source, const _TouchInfo& touchInfo);
151
152         // gestureListener Callback API
153         virtual bool OnFlickGestureDetected(_TouchFlickGestureDetector& gesture);
154         virtual bool OnFlickGestureCanceled(_TouchFlickGestureDetector& gesture);
155         virtual bool OnPreviewFlickGestureDetected(_TouchFlickGestureDetector& gesture);
156
157         virtual void OnVisualElementAnimationStarted(const Tizen::Ui::Animations::VisualElementAnimation& animation, const Tizen::Base::String& keyName, Tizen::Ui::Animations::VisualElement& target);
158         virtual void OnVisualElementAnimationRepeated(const Tizen::Ui::Animations::VisualElementAnimation& animation, const Tizen::Base::String& keyName, Tizen::Ui::Animations::VisualElement& target, long currentRepeatCount);
159         virtual void OnVisualElementAnimationFinished(const Tizen::Ui::Animations::VisualElementAnimation& animation, const Tizen::Base::String& keyName, Tizen::Ui::Animations::VisualElement& target, bool completedNormally);
160         virtual void OnTickOccurred(const Tizen::Ui::Animations::VisualElementAnimation& animation, const Tizen::Base::String& keyName, Tizen::Ui::Animations::VisualElement& target, const Tizen::Ui::Variant& currentValue);
161
162         // Timer Event
163         virtual void OnTimerExpired(Tizen::Base::Runtime::Timer& timer);
164
165         // accessibility
166         virtual bool OnAccessibilityItemRefreshed(const _AccessibilityContainer& control, const _AccessibilityElement& element, _AccessibilityFocusDirection direction);
167
168         // List model delegate
169         virtual bool OnOcurredOverflowItems(const int currentCashSize, const int overflowCount);
170
171         void Dispose(void);
172
173         result RefreshTableView(int groupIndex, int itemIndex, TableViewRefreshType type, bool animation);
174         result RefreshAllItems(void);
175         result UpdateTableView(void);
176
177         result GetItemIndexFromPosition(const Tizen::Graphics::FloatPoint& position, int& groupIndex, int& itemIndex) const;
178         result GetItemFromPosition(const Tizen::Graphics::FloatPoint& position, TableViewItemTag& itemPos) const;
179
180         result GetTopDrawnItem(TableViewItemTag& itemPos) const;
181         result SetTopDrawnItem(TableViewItemTag& itemPos);
182
183         result GetBottomDrawnItem(TableViewItemTag& itemPos) const;
184
185         result GetTopDrawnItemIndex(int& groupIndex, int& itemIndex) const;
186         result SetTopDrawnItemIndex(int groupIndex, int itemIndex);
187
188         result GetBottomDrawnItemIndex(int& groupIndex, int& itemIndex) const;
189         result SetBottomDrawnItemIndex(int groupIndex, int itemIndex);
190
191         int GetGroupCount(void) const;
192         int GetItemCountAt(int groupIndex) const;
193         bool HasSectionHeader(int groupIndex) const;
194         bool HasSectionFooter(int groupIndex) const;
195
196         float GetTopMargin(void) const;
197         result SetTopMargin(float topMargin);
198
199         float GetBottomMargin(void) const;
200         result SetBottomMargin(float bottomMargin);
201
202         float GetLeftMargin(void) const;
203         result SetLeftMargin(float leftMargin);
204
205         bool IsItemChecked(int groupIndex, int itemIndex) const;
206         result SetItemChecked(int groupIndex, int itemIndex, bool checked);
207
208         bool IsItemEnabled(int groupIndex, int itemIndex) const;
209         result SetItemEnabled(int groupIndex, int itemIndex, bool enabled);
210
211         _TableViewItem* FindItem(TableViewItemTag& itemTag);
212         void UnloadItem(int groupIndex, int itemIndex);
213         _TableViewItem* LoadItem(int groupIndex, int itemIndex);
214         void RefreshItemLayout(int groupIndex, int itemIndex);
215         void GetFirstLoadedItemIndex(int& groupIndex, int& itemIndex) const;
216         void GetLastLoadedItemIndex(int& groupIndex, int& itemIndex) const;
217
218         result SetStatusChanged(bool changed);
219         bool IsStatusChanged(void) const;
220
221         result ExpandGroup(int groupIndex, bool withAnimation);
222         result CollapseGroup(int groupIndex, bool withAnimation);
223         bool IsGroupExpanded(int groupIndex) const;
224
225         result SetReorderMode(bool enabled);
226
227         bool CheckItemHeightAndRefreshLayout(TableViewItemTag itemTag, bool downScroll);
228
229         result ScrollByPixel(float scrollDistance);
230         void SetScrollEnabled(bool enable);
231         bool IsScrollEnabled(void) const;
232
233         bool GetFirstDrawnFlag(void) const;
234         int GetMaxItemCachingSize(void) const;
235         void ResetSweepItem(void);
236         void GetSweepItemIndex(int& groupIndex, int& itemIndex) const;
237         int GetPressedItemCount(void);
238
239         result OpenContextItem(int groupIndex, int itemIndex);
240         result CloseContextItem(int groupIndex, int itemIndex);
241         bool IsContextItemOpened(int groupIndex, int itemIndex) const;
242
243         result SetSectionHeaderTextHorizontalAlignment(int sectionIndex, HorizontalAlignment alignment);
244         HorizontalAlignment GetSectionHeaderTextHorizontalAlignment(int sectionIndex) const;
245         result SetSectionFooterTextHorizontalAlignment(int sectionIndex, HorizontalAlignment alignment);
246         HorizontalAlignment GetSectionFooterTextHorizontalAlignment(int sectionIndex) const;
247
248         void BlockAnimationCallback(bool blocked);
249
250         void FireItemTouchReleasedEventDuringPressing(int groupIndex, int itemIndex);
251
252 protected:
253         virtual float ScrollToInternal(float targetPosition);
254         virtual void FadeInScrollBar(void);
255         virtual void FadeOutScrollBar(void);
256
257         // Update Layout
258         virtual void UpdateLayout(void);
259
260 private:
261         _TableViewPresenter(const _TableViewPresenter& rhs);
262         _TableViewPresenter& operator =(const _TableViewPresenter& rhs);
263
264         _TableView* __pTableView;
265         _ListViewModel* __pListModel;
266         _TableViewItemProviderAdaptor* __pProviderAdaptor;
267
268         bool PreloadItem(void);
269         bool PreloadItem(int topDrawnGroupIndex, int topDrawnItemIndex, int shiftingDistance);
270
271         bool GetFirstItem(TableViewItemTag& firstItem) const;
272         bool GetLastItem(TableViewItemTag& lastItem) const;
273         bool GetPreviousItemPosition(const TableViewItemTag& currentItem, TableViewItemTag& prevItem) const;
274         bool GetNextItemPosition(const TableViewItemTag& currentItem, TableViewItemTag& nextItem) const;
275         int GetItemCount(void) const;
276         float GetHeightOfAllItems(void) const;
277
278         void SetItemLayout(_TableViewItem* pItem, TableViewItemTag& itemPos);
279         float CalculateItemPositionY(int groupIndex, int itemIndex);
280         void AdjustLayoutItems(float scrollPosition);
281         bool IsCachingItemsTotalHeightLessThanViewHeight(void);
282
283         void ResetItemLayout(TableViewItemTag& topDrawnItemTag, float shiftingDistance);
284         void RefreshItemLayout(TableViewItemTag& topDrawnItemTag, TableViewItemTag& refreshItemTag, TableViewRefreshType type, bool animation);
285         void RefreshItemBounds(_TableViewItem* pItem, TableViewItemTag& itemPos);
286         void ScrollToItem(int groupIndex, int itemIndex, TableViewScrollItemAlignment itemAlignment, float shiftingDistance = 0.0f);
287
288
289         _TableViewItem* GetTableViewItemFromControl(const _Control& source);
290
291         void UnloadItem(TableViewItemTag& itemTag);
292         void DetachItem(TableViewItemTag& itemTag);
293         void DetachContextItem(TableViewItemTag& itemTag);
294         void DetachAllItem(bool removeItem);
295         void SetItemDrawingProperty(void);
296         void SetItemType(_TableViewItem* pItem, TableViewItemTag itemPosition);
297
298         result StartFastScrollTimer(void);
299         void StopFastScrollTimer(void);
300
301         bool IsEmpty(void) const;
302         result DrawEmptyTableView(void);
303
304         void LoadItemWithScrollPosition(float previousScrollPosition, float currentScrollPos);
305         bool GetTableViewItemPosition(_TableViewItem& item, TableViewItemTag& itemTag); // item must exist between from tag and end tag
306         int LoadAllItemsInGroup(int groupIndex, bool downward);
307         void SetLoadedItemsVisibleInGroup(int groupIndex, bool visible);
308         TableViewItemTag LoadItemsToBeVisible(const TableViewItemTag& from);
309         void AttachNextItemsToBottom(const TableViewItemTag& anchor);
310         bool IsAnyItemInGroupLoaded(int groupIndex) const;
311         bool IsAnyItemInLoadedIndex(int groupIndex, int itemIndex);
312         void ScrollToHideNonClientArea(TableViewItemTag& bottomTag);
313         void AdjustClientAreaBounds(bool reset, float dist = 0.0f);
314         void SetClientAreaHeight(float height);
315         void UnloadInvisibleItems(void);
316
317         // reordering
318         bool SelectReorderItem(int groupIndex, int itemIndex, bool directSelection);
319         bool ResetReorderItem(int groupIndex, int itemIndex);
320         bool DragSelectedItem(float distance, bool relativeCoordinate);
321         bool CheckReorderItemScrollAnimation(_TableViewItem *pItem);
322         bool CheckReorderItemPosition(_TableViewItem* pItem, TableViewItemTag& reorderItemTag);
323         void AdjustReorderItemLimitPositionY(float& positionY);
324         bool ReorderItem(int destinationGroupIndex, int destinationItemIndex);
325         void StartReorderScrollTimer(void);
326         void StopReorderScrollTimer(void);
327
328         // item height
329         float GetItemHeight(TableViewItemTag itemTag) const;
330         float SetItemHeight(TableViewItemTag itemTag, float height);
331         bool CreateItemHeightList(float defaultGroupItemHeight, float defaultItemHeight);
332         void DeleteItemHeightList(void);
333         void PresetItemHeightList(void);
334         bool RefreshItemHeightList(int groupIndex, int itemIndex, TableViewRefreshType refreshType);
335
336         bool CreateSectionAlignmentList(void);
337         void DeleteSectionAlignmentList(void);
338         bool RefreshSectionAlignmentList(int groupIndex, TableViewRefreshType refreshType);
339
340         void CaptureAndStartRemoveItemAnimation(int groupIndex, int itemIndex);
341
342         void ShowTableViewCapturedItem(int groupIndex, int itemIndex, float height);
343         void SetLoadedItemsVisibleFromPosition(float position, bool visible);
344         void MoveLoadedItemsFromPosition(float position);
345         void ExpandGroupAnimationFinished(bool completedNormally);
346         void CollapseGroupAnimationFinished(bool completedNormally);
347
348
349         void SweepItem(float x);
350         void ResetSweptItem(void);
351         void AdjustSweptItemPosition(bool withAnimation = false);
352         void AdjustLoadedItemWidth(void);
353
354         bool IsValidDrawnItem(int groupIndex, int itemIndex);
355         void StopAllItemAnimation(void);
356
357         bool GetAccessibilityElementFocusedState(void);
358
359 private:
360         float __topMargin;
361         float __bottomMargin;
362         float __leftMargin;
363
364         bool __modelInitialized;
365         bool __firstDrawnFlag;
366         bool __statusChangedFlag;
367         bool __scrolling;
368
369         _ItemDrawingProperty* __pItemDrawingProperty;
370
371         Tizen::Ui::Animations::_VisualElement* __pBaseVisualElement;
372
373         bool __sweepOccured;
374         Tizen::Graphics::FloatPoint __sweptItemPosition;
375         TableViewItemTag __sweptItemTag;
376
377         TableViewItemTag __reservedScrollItemIndex;
378         TableViewScrollItemAlignment __reservedScrollItemAlignment;
379
380         bool __firstTouchMoved;
381
382         Tizen::Base::Runtime::Timer* __pReorderScrollTimer;
383
384         _TableViewReorderInfo __reorderInfo;
385
386         Tizen::Base::Collection::ArrayListT<float> __itemHeightList;
387         Tizen::Base::Collection::ArrayListT<_TableViewSectionStringAlignment> __sectionAlignmentList;
388         float __itemTotalHeight;
389
390         TableViewItemTag __expandableItemTag;
391         Tizen::Ui::Animations::_VisualElement* __pCapturedItemVisualElement;
392
393         Tizen::Base::Runtime::Timer* __pFastScrollTimer;
394         bool __isFastScrollTimerEnabled;
395
396         float __scrollHeightOnFlickStarted;
397         float __scrollPositionOnFlickStarted;
398
399         bool __isAnimationCallbackBlocked;
400         bool __lockLoadItemWithScroll;
401
402         int __itemTouchReleasedEventState;
403
404         static const int TABLEVIEW_MAX_ITEM_COUNT = 30;
405         static const int REORDER_SCROLL_ANIMATION_TIMER_DURATION = 10;
406         static const float REORDER_SCROLL_ANIMATION_DISTANCE = 10.0f;
407         static const int REORDER_TOUCH_UIACTIVATE_DURATION = 100;
408         static const int FAST_SCROLL_FADE_OUT_DURATION = 500;
409         static const float TABLEVIEW_DEFAULT_ITEM_HEIGHT_VALUE = 12.3456f;
410
411         //animation
412         static const int REORDER_ITEM_MOVE_ANIMATION_DURATION = 113;
413         static const int ADD_ITEM_ANIMATION_DURATION = 333;
414         static const int REMOVE_ITEM_MOVE_ANIMATION_DURATION = 267;
415         static const int REFRESH_ITEM_ANIMATION_DELAY = 100;
416         static const int EXPAND_GROUP_ANIMATION_DURATION = 335;
417         static const int COLLAPSE_GROUP_ANIMATION_DURATION = 329;
418         static const int SWEEP_ITEM_ANIMATION_DURATION = 300;
419 };
420
421 }}} // Tizen::Ui::Controls
422
423 #endif // _FUI_CTRL_INTERNAL_TABLE_VIEW_PRESENTER_H_
424