Merge "fixed bug (TapGesture improvement)" 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 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         _TableViewReorderInfo(void)
72                 : groupIndex(-1)
73                 , itemIndex(-1)
74                 , originGroupIndex(-1)
75                 , originItemIndex(-1)
76                 , touchPressedPositionY(0.0f)
77                 , itemBasisPositionY(0.0f)
78                 , isScrollDirectionUp(false)
79                 , nonScrollableLimitArea(0.0f)
80                 , blockedTouchReleaseState(false)
81                 , blockedScroll(false)
82                 , touchPressedTick(0)
83                 , itemBounds()
84         {
85
86         }
87 };
88
89 struct _TableViewSectionStringAlignment
90 {
91         HorizontalAlignment headerHorizontalAlignment;
92         HorizontalAlignment footerHorizontalAlignment;
93
94         _TableViewSectionStringAlignment(void)
95                 : headerHorizontalAlignment(ALIGNMENT_LEFT)
96                 , footerHorizontalAlignment(ALIGNMENT_RIGHT)
97         {
98         }
99
100         bool operator== (const _TableViewSectionStringAlignment& rhs) const;
101         bool operator!= (const _TableViewSectionStringAlignment& rhs) const;
102 };
103
104 struct _TableViewScrollToItemTag
105 {
106         int groupIndex;
107         int itemIndex;
108         TableViewScrollItemAlignment itemAlignment;
109         float shiftingDistance;
110         bool startedAnimation;
111
112         _TableViewScrollToItemTag(void)
113                 : groupIndex(-1)
114                 , itemIndex(-1)
115                 , itemAlignment(TABLE_VIEW_SCROLL_ITEM_ALIGNMENT_TOP)
116                 , shiftingDistance(0)
117                 , startedAnimation(false)
118         {
119
120         }
121 };
122
123 class _TableView;
124 class _ListViewModel;
125 class _TableViewItemProviderAdaptor;
126
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
133 {
134 public:
135         _TableViewPresenter();
136         virtual ~_TableViewPresenter(void);
137
138         virtual result Construct(_TableView* pTableView);
139
140         bool Initialize(_TableView* pTableView);
141
142         _TableView* GetView(void) const;
143
144         _ListViewModel* GetModel(void) const;
145
146         // set ItemProvider
147         result SetItemProvider(const _TableViewItemProvider* pProvider);
148
149         void SetTableViewItemProviderAdaptor(_TableViewItemProviderAdaptor* pProviderAdaptor);
150
151         _TableViewItemProviderAdaptor* GetTableViewItemProviderAdaptor(void) const;
152
153         // event handler for window event
154         virtual void OnBoundsChanged(void);
155         virtual result Draw(void);
156
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);
162
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);
168
169         // gestureListener Callback API
170         virtual bool OnFlickGestureDetected(_TouchFlickGestureDetector& gesture);
171         virtual bool OnFlickGestureCanceled(_TouchFlickGestureDetector& gesture);
172         virtual bool OnPreviewFlickGestureDetected(_TouchFlickGestureDetector& gesture);
173
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);
178
179         // Timer Event
180         virtual void OnTimerExpired(Tizen::Base::Runtime::Timer& timer);
181
182         // accessibility
183         virtual bool OnAccessibilityItemRefreshed(const _AccessibilityContainer& control, const _AccessibilityElement& element, _AccessibilityFocusDirection direction);
184
185         // List model delegate
186         virtual bool OnOcurredOverflowItems(const int currentCashSize, const int overflowCount);
187
188         void Dispose(void);
189
190         result RefreshTableView(int groupIndex, int itemIndex, TableViewRefreshType type, bool animation);
191         result RefreshAllItems(void);
192         result UpdateTableView(void);
193
194         result GetItemIndexFromPosition(const Tizen::Graphics::FloatPoint& position, int& groupIndex, int& itemIndex) const;
195         result GetItemFromPosition(const Tizen::Graphics::FloatPoint& position, TableViewItemTag& itemPos) const;
196
197         result GetTopDrawnItem(TableViewItemTag& itemPos) const;
198         result SetTopDrawnItem(TableViewItemTag& itemPos);
199
200         result GetBottomDrawnItem(TableViewItemTag& itemPos) const;
201
202         result GetTopDrawnItemIndex(int& groupIndex, int& itemIndex) const;
203         result SetTopDrawnItemIndex(int groupIndex, int itemIndex);
204
205         result GetBottomDrawnItemIndex(int& groupIndex, int& itemIndex) const;
206         result SetBottomDrawnItemIndex(int groupIndex, int itemIndex);
207
208         int GetGroupCount(void) const;
209         int GetItemCountAt(int groupIndex) const;
210         bool HasSectionHeader(int groupIndex) const;
211         bool HasSectionFooter(int groupIndex) const;
212
213         float GetTopMargin(void) const;
214         result SetTopMargin(float topMargin);
215
216         float GetBottomMargin(void) const;
217         result SetBottomMargin(float bottomMargin);
218
219         float GetLeftMargin(void) const;
220         result SetLeftMargin(float leftMargin);
221
222         bool IsItemChecked(int groupIndex, int itemIndex) const;
223         result SetItemChecked(int groupIndex, int itemIndex, bool checked);
224
225         bool IsItemEnabled(int groupIndex, int itemIndex) const;
226         result SetItemEnabled(int groupIndex, int itemIndex, bool enabled);
227
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;
234
235         result SetStatusChanged(bool changed);
236         bool IsStatusChanged(void) const;
237
238         result ExpandGroup(int groupIndex, bool withAnimation);
239         result CollapseGroup(int groupIndex, bool withAnimation);
240         bool IsGroupExpanded(int groupIndex) const;
241
242         result SetReorderMode(bool enabled);
243
244         bool CheckItemHeightAndRefreshLayout(TableViewItemTag itemTag, bool downScroll);
245
246         result ScrollByPixel(float scrollDistance);
247         void SetScrollEnabled(bool enable);
248         bool IsScrollEnabled(void) const;
249
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);
255
256         result OpenContextItem(int groupIndex, int itemIndex);
257         result CloseContextItem(int groupIndex, int itemIndex);
258         bool IsContextItemOpened(int groupIndex, int itemIndex) const;
259
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;
264
265         void BlockAnimationCallback(bool blocked);
266
267         void FireItemTouchReleasedEventDuringPressing(int groupIndex, int itemIndex);
268
269 protected:
270         virtual float ScrollToInternal(float targetPosition);
271         virtual void FadeInScrollBar(void);
272         virtual void FadeOutScrollBar(void);
273
274         // Update Layout
275         virtual void UpdateLayout(void);
276
277 private:
278         _TableViewPresenter(const _TableViewPresenter& rhs);
279         _TableViewPresenter& operator =(const _TableViewPresenter& rhs);
280
281         _TableView* __pTableView;
282         _ListViewModel* __pListModel;
283         _TableViewItemProviderAdaptor* __pProviderAdaptor;
284
285         bool PreloadItem(void);
286         bool PreloadItem(int topDrawnGroupIndex, int topDrawnItemIndex, int shiftingDistance);
287
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;
294
295         void SetItemLayout(_TableViewItem* pItem, TableViewItemTag& itemPos);
296         float CalculateItemPositionY(int groupIndex, int itemIndex);
297         void AdjustLayoutItems(float scrollPosition);
298         bool IsCachingItemsTotalHeightLessThanViewHeight(void);
299
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);
304
305
306         _TableViewItem* GetTableViewItemFromControl(const _Control& source);
307
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);
314
315         result StartFastScrollTimer(void);
316         void StopFastScrollTimer(void);
317
318         bool IsEmpty(void) const;
319         result DrawEmptyTableView(void);
320
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);
333
334         // reordering
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);
344
345         // item height
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);
352
353         bool CreateSectionAlignmentList(void);
354         void DeleteSectionAlignmentList(void);
355         bool RefreshSectionAlignmentList(int groupIndex, TableViewRefreshType refreshType);
356
357         void CaptureAndStartRemoveItemAnimation(int groupIndex, int itemIndex);
358
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);
364
365
366         void SweepItem(float x);
367         void ResetSweptItem(void);
368         void AdjustSweptItemPosition(bool withAnimation = false);
369         void AdjustLoadedItemWidth(void);
370
371         bool IsValidDrawnItem(int groupIndex, int itemIndex);
372         void StopAllItemAnimation(void);
373
374         bool GetAccessibilityElementFocusedState(void);
375
376 private:
377         float __topMargin;
378         float __bottomMargin;
379         float __leftMargin;
380
381         bool __modelInitialized;
382         bool __firstDrawnFlag;
383         bool __statusChangedFlag;
384         bool __scrolling;
385
386         _ItemDrawingProperty* __pItemDrawingProperty;
387
388         Tizen::Ui::Animations::_VisualElement* __pBaseVisualElement;
389
390         bool __sweepOccured;
391         Tizen::Graphics::FloatPoint __sweptItemPosition;
392         TableViewItemTag __sweptItemTag;
393
394         TableViewItemTag __reservedScrollItemIndex;
395         TableViewScrollItemAlignment __reservedScrollItemAlignment;
396
397         bool __firstTouchMoved;
398
399         Tizen::Base::Runtime::Timer* __pReorderScrollTimer;
400
401         _TableViewReorderInfo __reorderInfo;
402
403         Tizen::Base::Collection::ArrayListT<float> __itemHeightList;
404         Tizen::Base::Collection::ArrayListT<_TableViewSectionStringAlignment> __sectionAlignmentList;
405         float __itemTotalHeight;
406
407         TableViewItemTag __expandableItemTag;
408         Tizen::Ui::Animations::_VisualElement* __pCapturedItemVisualElement;
409
410         Tizen::Base::Runtime::Timer* __pFastScrollTimer;
411         bool __isFastScrollTimerEnabled;
412
413         float __scrollHeightOnFlickStarted;
414         float __scrollPositionOnFlickStarted;
415
416         bool __isAnimationCallbackBlocked;
417         bool __lockLoadItemWithScroll;
418
419         int __itemTouchReleasedEventState;
420
421         _TableViewScrollToItemTag __scrollToItemTag;
422
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;
429
430         //animation
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;
438 };
439
440 }}} // Tizen::Ui::Controls
441
442 #endif // _FUI_CTRL_INTERNAL_TABLE_VIEW_PRESENTER_H_
443