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